.TITLE SMMACP - STAGING MEMORY MANAGER ACP .SBTTL SMMACP - TITLE PAGE .IDENT /V01.00/ ; ; VERSION: V01.00 ; ; AUTHOR: C.T. MICKELSON ; GOODYEAR AEROSPACE CORPORATION ; AKRON, OHIO 44315 ; ; MODIFICATION HISTORY: ; ; V01.00 CTM 01-DEC-82 ORIGINAL VERSION .PAGE .SBTTL SMMACP - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLS ; .MCALL ABODF$,DCBDF$,DRERR$,FILIO$,HDRDF$,HWDDF$ .MCALL IOERR$,PKTDF$,SCBDF$,TCBDF$,UCBDF$ ABODF$ ;DEFINE TASK ABORT CODE SYMBOLICS DCBDF$ ;DEFINE DEVICE CONTROL BLOCK SYMBOLICS DRERR$ ;DEFINE DIRECTIVE ERROR CODE SYMBOLICS FILIO$ ;DEFINE STANDARD IO FUNCTION CODE SYMBOLICS HDRDF$ ;DEFINE TASK HEADER SYMBOLICS HWDDF$ ;DEFINE HARDWARE SYMBOLICS IOERR$ ;DEFINE IO ERROR CODE SYMBOLICS PKTDF$ ;DEFINE IO PACKET SYMBOLICS SCBDF$ ;DEFINE STATUS CONTROL BLOCK SYMBOLICS TCBDF$ ;DEFINE TASK CONTROL BLOCK SYMBOLICS UCBDF$ ;DEFINE UNIT CONTROL BLOCK SYMBOLICS ; ; DIRECTIVES ; .MCALL QIOW$S ;ISSUE IO AND WAIT ; ; OTHER MACROS ; .MCALL CALL ;CALL SUBROUTINE .MCALL CALLR ;CALL SUBROUTINE AND EXIT CALLER ; ; PSECT DEFINITIONS ; .PSECT $CODE1,RO,I,REL,CON,LCL .PSECT $PDATA,RO,D,REL,CON,LCL .PSECT $VARS,RW,D,REL,CON,LCL .PSECT LSTWIN,RW,D,REL,OVR,GBL ; ; GLOBAL DECLARATIONS ; ; SMMACP MODULE ENTRY POINTS ; .GLOBL SMMACP ;TASK ENTRY POINT .GLOBL GETBLK ;GET A DATA BLOCK FROM USER .GLOBL RTNBLK ;RETURN DATA BLOCK TO USER .GLOBL ACPDON ;FINISH IO PACKET .GLOBL ACPALT ;FINISH IO PACKET (ALTERNATE) .GLOBL NBNKS ;BANKS IN MAIN STAGER .GLOBL IOPCKT ;TRANSFER FUNCTION IO PACKET ADDRESS ; ; GLOBAL REFERENCES ; ; SMMACP SUBROUTINES ; .GLOBL ACPOPN ;OPEN VIRTUAL CHANNEL ROUTINE .GLOBL ACPFST ;FAST OPEN VIRTUAL CHANNEL ROUTINE .GLOBL BITMAP ;BASE ADDRESS OF MEMORY ALLOCATION BITMAP .GLOBL DEALST ;STAGER MEMORY DEALLOCATION ROUTINE .GLOBL ERRSET ;FORTRAN ERROR HANDLING ROUTINE .GLOBL VIRTIO ;PERFORM VIRTUAL IO FUNCTION ; ; EXECUTIVE REFERENCES ; .GLOBL $ALOCB ;(CORAL) ALLOCATE CORE BLOCK .GLOBL $BLXIO ;(BFCTL) TRANSFER BLOCK .GLOBL $DEACB ;(CORAL) DEALLOCATE CORE BLOCK .GLOBL $IOFIN ;(IOSUB) FINISH IO REQUESTS .GLOBL $QINSF ;(QUEUE) INSERT ENTRY IN QUEUE .GLOBL $QRMVF ;(QUEUE) REMOVE ENTRY FROM QUEUE .GLOBL $RELOC ;(IOSUB) RELOCATE BUFFER .GLOBL $STPCT ;(REQSB) STOP CURRENT TASK .GLOBL $TKTCB ;(SYSCM) CURRENT TASK TCB .GLOBL $HEADR ;(SYSCM) CURRENT TASK HEADER ; ; DEVICE DRIVER SYMBOL TABLE REFERENCES ; .GLOBL IQ.OPN ;VIRTUAL CHANNEL OPEN FUNCTION .GLOBL SF.HTA ;HOST TO ARRAY SUBFUNCTION .GLOBL SF.ATH ;ARRAY TO HOST SUBFUNCTION .GLOBL SF.HTH ;HOST TO HOST SUBFUNCTION .GLOBL SF.ATA ;ARRAY TO ARRAY SUBFUNCTION .GLOBL SF.FST ;FAST OPEN SUBFUNCTION BIT .GLOBL IQ.CLS ;VIRTUAL CHANNEL CLOSE FUNCTION .GLOBL IQ.WVB ;WRITE VIRTUAL CHANNEL FUNCTION .GLOBL IQ.RVB ;READ VIRTUAL CHANNEL FUNCTION .GLOBL SF.HST ;HOST IO SUBFUNCTION .GLOBL SF.ARU ;ARRAY IO SUBFUNCTION .GLOBL IQ.CLN ;CLOSE IO PROCESS FUNCTION .GLOBL IQ.MOU ;MOUNT ACP FUNCTION .GLOBL IQ.DMO ;DISMOUNT ACP FUNCTION ; ; OTHER REFERENCES ; .GLOBL $OTSVA ;FORTRAN OTS REFERENCES .GLOBL ORGSQ$ .GLOBL OTI$ .GLOBL EXIT$ ; ; LOCAL SYMBOLS: ; AC0LUN=1 ;AC0 LUN AC1LUN=2 ;AC1 LUN AC0EFN=1 ;AC0 EVENT FLAG AC1EFN=2 ;AC1 EVENT FLAG .PAGE ; ; FORTRAN COMMON TO STORE ADDRESS OF LAST WINDOW BLOCK USED TO SET UP HARDWARE ; .PSECT LSTWIN NBNKS:: .BLKW 1 ;NUMBER OF BANKS IN MAIN STAGER ; LASTWB AND LASTMV FOLLOWING, MUST REMAIN CONTIGUOUS LASTWB: .BLKW 2 ;ADDRESSES OF LAST SUBSTAGER WINDOW BLOCKS LASTMV: .BLKW 2 ;LAST MOVE USED TO SETUP SUBSTAGER IOPCKT::.WORD 0 ;CURRENT TRANSFER FUNCTION IO PACKET ADDRESS ; ; LOCAL (RO) DATA: ; ; FUNCTION DISPATCH TABLE ; .PSECT $PDATA DSPLEN=4 ;LENGTH OF A DISPATCH TABLE ENTRY DSPADR=2 ;OFFSET TO DISPATCH ROUTINE ADDRESS DSPTBL: .WORD IQ.CLN,ACPABO ;ABORT PROCESS .WORD IQ.MOU,ACPMOU ;MOUNT DEVICE .WORD IQ.DMO,ACPDMO ;DISMOUNT DEVICE .WORD IQ.OPN!SF.HTA,ACPOPN ;OPEN CHANNEL HOST TO ARRAY .WORD IQ.OPN!SF.ATH,ACPOPN ;OPEN CHANNEL ARRAY TO HOST .WORD IQ.OPN!SF.HTH,ACPOPN ;OPEN CHANNEL HOST TO HOST .WORD IQ.OPN!SF.ATA,ACPOPN ;OPEN CHANNEL ARRAY TO ARRAY .WORD IQ.OPN!SF.HTA!SF.FST,ACPFST ;FAST OPEN CHANNEL HOST TO ARRAY .WORD IQ.OPN!SF.ATH!SF.FST,ACPFST ;FAST OPEN CHANNEL ARRAY TO HOST .WORD IQ.OPN!SF.HTH!SF.FST,ACPFST ;FAST OPEN CHANNEL HOST TO HOST .WORD IQ.OPN!SF.ATA!SF.FST,ACPFST ;FAST OPEN CHANNEL ARRAY TO ARRAY .WORD IQ.CLS,ACPCLS ;CLOSE CHANNEL .WORD IQ.WVB!SF.HST,WVBHST ;WRITE HOST .WORD IQ.RVB!SF.HST,RVBHST ;READ HOST .WORD IQ.WVB!SF.ARU,WVBARU ;WRITE ARRAY UNIT .WORD IQ.RVB!SF.ARU,RVBARU ;READ ARRAY UNIT .WORD 0,ACPDON ;END OF TABLE BITLEN: .WORD BTLENG ;LENGTH OF STAGER ALLOCATION BITMAP (WORDS) BITGRN: .WORD BTGRAN ;BITMAP GRANULARITY IN STAGER WORDS ; ; FORTRAN LIBRARY ERRSET CALLING SEQUENCE TO MODIFY HANDLING OF ERROR 93 ; FOR VARIABLE LENGTH DUMMY ARRAYS PASSED TO VIRTIO. ; ; FOR CERTAIN VIRTUAL CHANNEL CONFIGURATIONS, THE VDIM PARAMETER IS ZERO ; AND THREE PARAMETER ARRAYS TO VIRTIO ARE NOT USED. ; WHEN VIRTIO TRIES TO COMPUTE THE ARRAY DESCRIPTORS FOR THESE ARRAYS, ; THE FORTRAN LIBRARY PRODUCES ERROR 93, AND IF DONE FREQUENTLY ENOUGH, ; CAUSES THE SMMACP TO EXIT VERY TRAUMATICALLY! ; THE EFFECTS ON THE SYSTEM COULD BE PERMANENT LOSS OF POOL, A PERMANENTLY ; MOUNTED AC1: WITH NO ACTIVE ACP, AND AN IO SUPPORT TASK HUNG, WAITING FOR ; A VIRTUAL QIO THAT WILL NEVER COMPLETE! ; THEREFORE ERRSET IS CALLED TO CHANGE HOW ERROR 93 IS HANDLED BY THE ; LIBRARY SO THAT SMMACP DOES NOT ABORT. ; THERE ARE PROTECTIONS DESIGNED INTO SMMACP TO PREVENT ACCESSING ANY ; OF THE UNNECESSARY ARRAYS WHEN VDIM IS ZERO. ; ERRSLS: .WORD 6 ;ERRSET PARAMETER COUNT .WORD ERNUM .WORD TRUE .WORD FALSE .WORD FALSE .WORD FALSE .WORD ERLIM ERNUM: .WORD 93. TRUE: .WORD -1. FALSE: .WORD 0 ERLIM: .WORD 15. ; ; LOCAL (RW) DATA: ; .PSECT $VARS ENABLE: .WORD 0 ;MOUNTED VOLUME COUNT DEAPAR: .WORD 6 ;CALLING SEQUENCE FOR DEALST .WORD BITMAP .WORD BITLEN .WORD BITGRN .WORD 0 ;STAGER ADDRESS ADDRESS FILLED IN PRIOR TO CALL .WORD 0 ;BUFFER LENGTH ADDRESS FILLED IN PRIOR TO CALL .WORD 0 ;NBUFF ADDRESS FILLED IN PRIOR TO CALL .PAGE .SBTTL SMMACP - TASK ENTRY ; ;+ ; THIS ROUTINE IS THE MAIN LOOP FOR THE ACP. THE RECEIVE QUEUE IS ; CHECKED. IF AN ENTRY IS FOUND, THE APPROPRIATE SERVICE ROUTINE IS ; CALLED, OTHERWISE, THE TASK IS PUT TO SLEEP. ; ; INPUT: ; ; STARTED AT TASK ENTRY. THE LOOP IS REPEATED WHENEVER THE ACP ; IS WOKEN FROM THE 'STOP' STATE OR AN INTERNAL PROCESS REACHES ; A STOPPING POINT. ; ; OUTPUT: ; ; WHEN WORK IS DEQUEUED, THE CORRECT PROCESSING ROUTINE IS CALLED ; WITH THE FOLLOWING REGISTERS: ; ; R3 = ADDRESS OF DEQUEUED IO PACKET ; R5 = UCB ADDRESS ; ; NOTES: ; ; WHEN THE ACP TASK IS STARTED, THE INITIALIZATION ROUTINE IS ; CALLED. THIS ROUTINE RETURNS ONLY IF INITIALIZATION SUCCEEDS, ; OTHERWISE IT EXITS THE TASK. ; ; WHEN A PROCESS FINISHES, A CHECK IS MADE TO SEE IF THE UNIT IS ; BEING DISMOUNTED. IF SO, THE DISMOUNT PROCESSOR IS CALLED. ; ; REGISTERS: USES N.A. SAVES N.A. ; ; CALLS: ACPINI,$QRMVF,$STPCT,ACPMDM,PROCESSING ROUTINE ;- ; .PSECT $CODE1 .ENABL LSB SMMACP:: ;ENTRY POINT CALL OTI$ ;INITIALIZE FORTRAN OTS MOV #ERRSLS,R5 ;CALL ERRSET FOR ERROR 93. CALL ERRSET ; ; GO PERFORM THE INITIALZATION PROCESS. ; CALL ACPINI ;INITIALIZE ACP ; ; ENTER SYSTEM STATE AND CHECK RECEIVE QUEUE. ; 1000$: CLR R1 ;MARK NOTHING DEQUED SYSTEM 2000$ ;;ENTER SYSTEM STATE MOV $TKTCB,R0 ;;GET OUR TCB ADDRESS ADD #T.RCVL,R0 ;;POINT TO RECEIVE QUEUE LISTHEAD CALL $QRMVF ;;REMOVE QUEUE ENTRY BCS 1100$ ;;IF CS - NO ENTRY, STOP MOV R1,S.R1(SP) ;;RETURN PACKET ADDRESS RETURN ;;RETURN TO TASK STATE ; ; STOP TASK. WHEN WOKE, RETURN TO TASK STATE. ; 1100$: CALLR $STPCT ;;STOP CURRENT TASK (US) ; ; IF NO ENTRY DEQUED, CHECK FOR DISMOUNT. ; 2000$: MOV R1,R3 ;WAS ENTRY FOUND? BEQ 1000$ ;IF EQ - NO, CONTINUE LOOP ; ; DISPATCH ON IO FUNCTION AND CALL PROCESSING ROUTINE. ; MOV I.UCB(R3),R5 ;GET UCB ADDRESS MOV #IE.IFC&377,R0 ;PRESET IE.IFC ERROR MOV #DSPTBL,R1 ;GET PROCESSING TABLE 3000$: TST (R1) ;ARE WE AT END OF TABLE? BEQ 3100$ ;IF EQ - YES, ILLEGAL FUNCTION CMP (R1),I.FCN(R3) ;IS THIS CORRECT ENTRY? BEQ 3100$ ;IF EQ - YES, PROCESS FUNCTION ADD #DSPLEN,R1 ;BUMP TABLE ADDRESS BR 3000$ ;CHECK NEXT ENTRY 3100$: MOV R5,-(SP) ;SAVE R5 CALL @DSPADR(R1) ;CALL PROCESSING ROUTINE MOV (SP)+,R5 ;RESTORE R5 ; ; WHEN FINISHED, CHECK FOR DISMOUNT PENDING. ; 4000$: BITB #US.MDM,U.STS(R5) ;IS A DISMOUNT PENDING? BEQ 1000$ ;IF EQ - NO, LOOP THROUGH QUEUES CALL ACPMDM ;TRY TO COMPLETE DISMOUNT BR 1000$ ;NO LUCK - LOOP THROUGH QUEUE .DSABL LSB .PAGE .SBTTL ACPDON - FINISH IO PACKET ; ;+ ; THIS ROUTINE COMPLETES IO PACKET PROCESSING. THE IO FUNCTION IS ; RETURNED, THE TRANSACTION COUNT DECREMENTED, AND THE WINDOW UNLOCKED. ; ; INPUT: ; ; R0 = IO STATUS CODE ; R1 = SECONDARY STATUS (IF ACPALT) ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; PACKET RETURNED. ; ; REGISTERS: USES R0-R5 SAVES R5 ; ; CALLS: $IOFIN ;- ; .ENABL LSB ACPDON:: CLR R1 ;CLEAR SECONDARY STATUS ACPALT:: SYSTEM 1000$ ;;ENTER SYSTEM STATE CLR I.PRM+16(R3) ;;MAKE SURE 8TH PARMETER ZERO BIC #1,@I.LN2(R3) ;;CLEAR LOCK BIT DEC @U.VCB(R5) ;;DECREMENT TRANSACTION COUNT CALL $IOFIN ;;FINISH IO PACKET 1000$: RETURN ;;RETURN FROM SYSTEM AND ROUTINE .DSABL LSB .PAGE .SBTTL ACPINI - ACP INITIALIZATION ; ;+ ; THIS ROUTINE INITIALIZES THE ACP. ; ; INPUT: ; ; CALLED AT TASK ENTRY. ; ; OUTPUT: ; ; REGISTERS: USES R0,R1 SAVES R2-R5 ; ; CALLS: ;- ; .ENABL LSB ACPINI: CLR ENABLE ;CLEAR ENABLED COUNT CLR LASTWB ;CLEAR LAST WINDOW BLOCK ADDRESSES CLR LASTWB+2 CLR LASTMV ;CLEAR LAST MOVE NUMBERS CLR LASTMV+2 MOV #BITMAP,R0 ;POINT TO ALLOCATION BITMAP MOV #BTLENG-2,R1 ;SET COUNT FOR INNER WORDS MOV #1,(R0)+ ;RESERVE FIRST PAGE OF STAGER 10$: CLR (R0)+ ;CLEAR A BITMAP WORD SOB R1,10$ ;COUNT AND DO NEXT MOV #100000,(R0) ;RESERVE LAST PAGE OF STAGER RETURN ;RETURN TO CALLER .DSABL LSB .PAGE .SBTTL ACPABO - IQ.CLN PROCESSING ; ;+ ; THIS ROUTINE PROCESSES THE IQ.CLN FUNCTION. ; ALL WINDOWS LINKED TO THE LUN ARE DESTROYED, ; THE PROCESS COUNT IS DECREMENTED, AND THE FUNCTION RETURNED. ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; WINDOW DESTROYED AND PACKET RETURNED. ; ; REGISTERS: USES R0-2,R4 SAVES R3,R5 ; ; CALLS: ACPDON,DELWIN ;- ; .ENABL LSB ACPABO: MOV @I.LN2(R3),R4 ;GET FIRST WINDOW ADDRESS BIC #1,R4 ;CLEAR LOCK BIT 10$: BEQ 20$ ;IF LAST, FINISH UP MOV (R4),-(SP) ;SAVE LINK TO NEXT WINDOW CALL DELWIN ;DELETE WINDOW AND ITS STRUCTURES DEC @U.VCB(R5) ;DECREMENT PROCESS COUNT MOV (SP)+,R4 ;MOVE TO NEXT WINDOW BR 10$ ;LOOP FOR NEXT WINDOW 20$: BIC #^C<1>,@I.LN2(R3) ;CLEAR WINDOW ADDRESS MOV #IS.SUC&377,R0 ;SET SUCCESS CALLR ACPDON ;FINISH PACKET AND RETURN .DSABL LSB .PAGE .SBTTL ACPMOU - IQ.MOU PROCESSING ; ;+ ; THIS ROUTINE PROCESSES THE IQ.MOU FUNCTION. THE ROUTINE EXPECTS THE ; FUNCTION TO BE ISSUED BY THE SAMPLE ...ENA TASK. ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; UNIT ENABLED FOR ACP IO. ; ; NOTES: ; ; AN IQ.MOU FUNCTION IS CONSTRUCTED BY THE ...ENA TASK. THE ; FOLLOWING IO PARAMETERS ARE ASSUMED. ; ; I.PRM(R3) - ADDRESS OF SYSTEM BUFFER WITH OPTION STRING ; +02 - SIZE OF SYSTEM BUFFER ; ; REGISTERS: USES R0,R1 SAVES R3,R5 ; ; CALLS: $IOFIN,$DEACB,ACPDON ;- ; .ENABL LSB ACPMOU: ;REF. LABEL ; ; CHECK THAT ACP IS BEING STARTED PROPERLY, I.E. BY ...ENA ; TST R5 ;WAS UCB SPECIFIED? BEQ 2998$ ;IF EQ - NO UCB, ERROR TST U.VCB(R5) ;IS A VCB SPECIFIED? BNE 3000$ ;IF NE - OK, CONTINUE ; ; DECLARE FATAL ACP ERROR AND EXIT. ; 2998$: MOV #IE.ABO&377,R0 ;SET ERROR CODE CLR R1 ;CLEAR SECONDARY CODE SYSTEM 2999$ ;;ENTER SYSTEM STATE CALL $IOFIN ;;RETURN IO PACKET 2999$: RETURN ;;EXIT SYSTEM STATE AND ROUTINE ; ; ENABLE DEVICE. ; 3000$: MOV I.PRM+0(R3),R0 ;IS THERE A PARAMETER BUFFER BEQ 3100$ ;IF EQ - NO, SKIP MOV I.PRM+2(R3),R1 ;GET SIZE OF BUFFER SYSTEM 3100$ ;;ENTER SYSTEM STATE CALLR $DEACB ;;DEALLOCATE BUFFER 3100$: BICB #US.MNT,U.STS(R5) ;MARK VOLUME MOUNTED INC ENABLE ;COUNT VOLUME MOUNTED MOV #IS.SUC&377,R0 ;SET SUCCESS CALLR ACPDON ;FINISH FUNCTION AND RETURN .DSABL LSB .PAGE .SBTTL ACPDMO - IQ.DMO PROCESSING ; ;+ ; THIS ROUTINE PROCESSES THE IQ.DMO REQUEST. IT RETURNS THE FUNCTION TO ; ...DIS AND FALLS INTO ACPMDM. ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; IO PACKET RETURNED WITH SUCCESS CODE. ; NOTES: ; ; THE IQ.DMO USES A SYSTEM BUFFER FOR PARAMETER PASSING LIKE IQ.MOU. ; ; CODE FALLS INTO ROUTINE ON NEXT PAGE. ; ; REGISTERS: USES R0,R1 SAVES R3,R5 ; ; CALLS: $DEACB,ACPDON ;- ; .ENABL LSB ACPDMO: MOV I.PRM+0(R3),R0 ;IS THERE A PARAMETER BUFFER BEQ 1000$ ;IF EQ - NO, SKIP MOV I.PRM+2(R3),R1 ;GET SIZE OF BUFFER SYSTEM 1000$ ;;ENTER SYSTEM STATE CALLR $DEACB ;;DEALLOCATE BUFFER ; ; RETURN DISMOUNT PACKET TO ...DIS. ; 1000$: MOV #IS.SUC&377,R0 ;SET FUNCTION RETURN CODE CALL ACPDON ;RETURN IO FUNCTION ; ; FALL INTO ACPMDM CODE. CHECK IF DISMOUNT AND ACP EXIT ARE ALLOWED. ; .DSABL LSB .PAGE .SBTTL ACPMDM - CHECK IF DISMOUNT LEGAL ; ;+ ; THIS ROUTINE CHECKS IF ALL ACTIVITY ON THE DEVICE IS ENDED AND ; COMPLETES THE DISMOUNT. WHEN ALL UNITS ARE DISMOUNTED, THE TASK ; EXITS ; ; INPUT: ; ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; IF UNIT ACTIVITY COMPLETED, UNIT DISMOUNTED ; ; IF ALL DISMOUNTS COMPLETED, TASK EXITS ; ; NOTES: ; ; THE ROUTINE ASSUMES THE CALLER DESIRES DISMOUNTING, I.E., US.MDM IS ; SET IN THE UCB. ; ; REGISTERS: USES R0,R1 SAVES R5 ; ; CALLS: $DEACB ;- ; .ENABL LSB ACPMDM: TST @U.VCB(R5) ;ARE ANY TRANSACTIONS IN PROGRESS? BEQ 1000$ ;IF EQ - NO, DO DISMOUNT RETURN ;RETURN TO CALLER 1000$: MOV U.VCB(R5),R0 ;GET VCB ADDRESS MOV #V$SIZE,R1 ;GET LENGTH SYSTEM 2000$ ;;ENTER SYSTEM STATE CALL $DEACB ;;DEALLOCATE VCB CLR U.VCB(R5) ;;MARK NO VCB CLR U.ACP(R5) ;;MARK NO ACP BICB #US.MDM,U.STS(R5) ;;CLEAR MARKED FOR DISMOUNT BISB #US.MNT,U.STS(R5) ;;SET VOLUME NOT MOUNTED DEC ENABLE ;;COUNT VOLUME DISMOUNTED RETURN ;;EXIT SYSTEM STATE ; ; CHECK IF ALL UNITS DISMOUNTED. ; 2000$: TST ENABLE ;ARE ALL UNITS DISABLED? BEQ 3000$ ;IF EQ - YES, EXIT RETURN ;RETURN TO CALLER 3000$: CALL EXIT$ ;EXIT TASK .DSABL LSB .PAGE .SBTTL ACPCLS - IQ.CLS PROCESSING ; ;+ ; THIS ROUTINE PROCESSES THE IQ.CLS FUNCTION. ; THE WINDOW FOR THE SELECTED VIRTUAL CHANNEL IS DESTROYED, ; THE PROCESS COUNT IS DECREMENTED, AND THE FUNCTION RETURNED. ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; WINDOW DESTROYED AND PACKET RETURNED. ; ; NOTES: ; ; AN IQ.CLS FUNCTION HAS THE FOLLOWING IO PARAMETERS. ; ; P1 - VIRTUAL CHANNEL NUMBER ; P2 - UNUSED ; P3 - UNUSED ; P4 - UNUSED ; P5 - UNUSED ; P6 - UNUSED ; ; THE FORMAT OF THE IQ.CLS PARAMETERS WHEN THE PACKET IS DEQUEUED ; BY THE ACP IS AS FOLLOWS (THE REFORMATTING IS DONE BY THE MPP ; DEVICE DRIVER): ; ; I.PRM(R3) - VIRTUAL CHANNEL NUMBER ; +02 - UNUSED ; +04 - UNUSED ; +06 - UNUSED ; +10 - UNUSED ; +12 - UNUSED ; +14 - UNUSED ; +16 - UNUSED ; ; REGISTERS: USES R0,R2,R4 SAVES R3,R5 ; ; CALLS: ACPDON,DELWIN ;- ; .ENABL LSB ACPCLS: MOV I.LN2(R3),R2 ;GET ADDRESS OF POINTER TO WINDOW MOV (R2),R4 ;GET ADDRESS OF FIRST WINDOW BIC #1,R4 ;CLEAR LOCK BIT 10$: BEQ 50$ ;IF NO MORE WINDOWS, EXIT CMP I.PRM(R3),W$VCN(R4) ;IS WINDOW FOR REQUESTED VIRTUAL CHANNEL BEQ 20$ ;IF EQ - YES, DELETE IT MOV R4,R2 ;ELSE, MOVE TO NEXT WINDOW MOV (R4),R4 BR 10$ ;LOOP TO DO NEXT WINDOW 20$: MOV (R2),R0 ;LINK PRECEEDING WINDOW BIC #^C<1>,R0 ;TO SUCCEEDING WINDOW BIS (R4),R0 MOV R0,(R2) MOV #LASTWB,R0 ;POINT AT LAST WINDOW ADDRESSES MOV #/2,R2 ;SET LOOP COUNTER 30$: CMP R4,(R0) ;TEST LAST USED WINDOW BLOCK BNE 40$ ;IF NOT SAME, CONTINUE CLR (R0) ;ELSE, CLEAR CLOSED CHANNEL LAST MOVE NUMBER CLR (R0) ;AND LAST WINDOW BLOCK ADDRESS 40$: TST (R0)+ ;POINT TO NEXT LAST WINDOW ADDRESS SOB R2,30$ ;LOOP AND TEST NEXT LAST WINDOW ADDRESS CALL DELWIN ;DELETE UNLINKED WINDOW DEC @U.VCB(R5) ;DECREMENT PROCESS COUNT 50$: MOV #IS.SUC&377,R0 ;SET SUCCESS CALLR ACPDON ;FINISH PACKET AND RETURN .DSABL LSB .PAGE .SBTTL ACPVRW - IQ.RVB/IQ.WVB PROCESSING ; ;+ ; THIS ROUTINE PROCESSES THE IQ.RVB AND IQ.WVB FUNCTIONS ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; USER DATA BUFFER OUTPUT. ; ; NOTES: ; ; AN IQ.RVB OR IQ.WVB FUNCTION HAS THE FOLLOWING IO PARAMETERS. ; ; P1 - PDP-11 DATA BUFFER VIRTUAL ADDRESS (OR) ; IOCU SUBROUTINE ADDRESS FOR ARRAY DATA TRANSFER ; P2 - TRANSFER LENGTH IN BYTES ; P3 - VIRTUAL CHANNEL NUMBER, BUFFER NUMBER, MOVE NUMBER ; P4 - PDP-11 AST DATA BUFFER VIRTUAL ADDRESS (OR) 0 ; P5 - AST BUFFER LENGTH IN BYTES ; P6 - UNUSED ; ; THE FORMAT OF THESE PARAMETERS WHEN THE PACKET IS DEQUEUED ; BY THE ACP IS AS FOLLOWS (THE REFORMATTING IS DONE BY THE MPP ; DEVICE DRIVER): ; ; I.PRM(R3) - DATA BUFFER RELOCATION BIAS (OR) ; 0 ; +02 - DATA BUFFER KAPR 6 VIRTUAL ADDRESS (OR) ; IOCU SUBROUTINE ADDRESS FOR ARRAY DATA TRANSFER ; +04 - TRANSFER LENGTH IN BYTES ; +06 - VIRTUAL CHANNEL NUMBER, BUFFER NMUBER, MOVE NUMBER ; +10 - AST BUFFER RELOCATION BIAS (OR) 0 ; +12 - AST BUFFER KAPR 6 VIRTUAL ADDRESS ; +14 - AST BUFFER LENGTH IN BYTES ; +16 - UNUSED ; ; REGISTERS: USES R0,R4 SAVES R3,R5 ; ; CALLS: ACPALT,ACPDON,VIRTIO ;- ; .ENABL LSB RVBHST: RVBARU: WVBHST: WVBARU: SYSTEM 5$ ;;ENTER SYSTEM STATE MOV $HEADR,R0 ;;GET OUR HEADER ADDRESS MOV I.TCB(R3),R1 ;;GET TCB ADDRESS OF ISSUING TASK MOV T.UCB(R1),H.LUN+<4*>(R0) ;;ASSIGN ACP'S TILUN TO USER TI: RETURN ;;EXIT SYSTEM STATE 5$: MOV R3,IOPCKT ;SAVE IO PACKET ADDRESS MOV @I.LN2(R3),R4 ;GET ADDRESS OF FIRST WINDOW BLOCK BIC #1,R4 ;CLEAR LOCK BIT 10$: BEQ 20$ ;IF ZERO, WINDOW FOR CHANNEL NOT FOUND CMPB I.PRM+6(R3),W$VCN(R4) ;TEST FOR CORRECT CHANNEL NUMBER BEQ 30$ ;IF EQUAL, FOUND IT, CONTINUE MOV (R4),R4 ;ELSE, LINK TO NEXT CHANNEL BR 10$ ;TRY NEXT CHANNEL 20$: MOV #IE.NLN&377,R0 ;SET NO CHANNEL OPEN ERROR CALLR ACPDON ;FINISH IO PACKET AND RETURN 30$: MOV R3,W$APKT(R4) ;SET IO PACKET ADDRESS INTO SUBR CALL MOV R3,-(SP) ;SAVE IO PACKET ADDRESS MOV R4,-(SP) ;SAVE WINDOW BLOCK ADDRESS MOV R5,-(SP) ;SAVE UCB ADDRESS MOV R4,R5 ;CALCULATE ADDRESS OF ADD #W$NPAR,R5 ;CALLING SEQUENCE IN WINDOW BLOCK CALL VIRTIO ;CALL VIRTUAL IO FUNCTION MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV #-1,W$APKT(R4) ;CLEAR IO PACKET ADDRESSES CLR IOPCKT ; ; FINAL IO STATUS RETURNED IN R0, R1 BY VIRTIO ; CALLR ACPALT ;FINISH IO PACKET AND RETURN .DSABL LSB .PAGE .SBTTL DELWIN - DELETE A PROCESS WINDOW ; ;+ ; THIS ROUTINE RELEASES THE STAGING MEMORY BUFFER RESERVED FOR THE CHANNEL, ; AND THE POOL BLOCKS USED IN THE PROCESS WINDOW STRUCTURES ; ; INPUT: ; ; R3 = IO PACKET ADDRESS ; R4 = WINDOW BLOCK ADDRESS ; R5 = UCB ADDRESS ; ; OUTPUT: ; ; WINDOW BLOCK AND ASSOCIATED POOL STRUCTURES ARE RETURNED TO POOL ; ; REGISTERS: USES R0-R1 SAVES R2-R5 ; ; CALLS: $DEACB ;- ; .ENABL LSB DELWIN: MOV W$ASBA(R4),DEAPAR+10 ;SET UP STAGER ADDRESS PARAMETER MOV W$ASBL(R4),DEAPAR+12 ;SET UP BUFFER LENGTH PARAMETER MOV W$ANBF(R4),DEAPAR+14 ;SET UP NBUFF PARAMETER MOV R3,-(SP) ;SAVE IO PACKET ADDRESS MOV R4,-(SP) ;SAVE WINDOW BLOCK ADDRESS MOV R5,-(SP) ;SAVE UCB ADDRESS MOV #DEAPAR,R5 ;SET CALLING SEQUENCE ADDRESS CALL DEALST ;DEALLOCATE VIRTUAL CHANNEL BUFFER MOV (SP)+,R5 ;RESTORE UCB ADDRESS MOV (SP)+,R4 ;RESTORE WINDOW BLOCK ADDRESS MOV (SP)+,R3 ;RESTORE IO PACKET ADDRESS MOV W$AREC(R4),R0 ;GET SUPPLEMENTARY POOL BLOCK ADDRESS MOV W$SUPP(R4),R1 ;GET BLOCK LENGTH SYSTEM 10$ ;;ENTER SYSTEM STATE CALLR $DEACB ;;DEALLOCATE CORE BLOCK 10$: MOV W$AOUT(R4),R0 ;GET HARDWARE CONTROL BLOCK ADDRESS MOV W$OUTP(R4),R1 ;GET BLOCK LENGTH SYSTEM 20$ ;;ENTER SYSTEM STATE CALLR $DEACB ;;DEALLOCATE CORE BLOCK 20$: MOV R4,R0 ;SET ADDRESS OF WINDOW BLOCK MOV #W$SIZE,R1 ;SET WINDOW BLOCK SIZE SYSTEM 30$ ;;ENTER SYSTEM STATE CALLR $DEACB ;;DEALLOCATE CORE BLOCK 30$: RETURN .DSABL LSB .PAGE .SBTTL GETBLK - MOVE BLOCK OF DATA FROM TASK ; ;+ ; THIS ROUTINE MOVES THE SPECIFIED DATA BLOCK FROM THE SPECIFY USER ; DATA BUFFER (USING APR6 RELOCATED ADDRESS) TO SMMACP. ; ; INPUT: ; ; R0 = SIZE OF DATA BLOCK (IN BYTES) ; R1 = DESTINATION DATA ADDRESS ; R2 = POINTER TO DOUBLEWORD APR6 BIAS, ; SOURCE DISPLACEMENT ; ; OUTPUT: ; ; DATA MOVED TO SPECIFIED DESTINATION AT SYSTEM STATE. ; ; REGISTERS: USES R0-R5 SAVES R0-R5 ; ; CALLS: $BLXIO,$RELOC ;- ; .ENABL LSB GETBLK:: SYSTEM 1000$ ;;ENTER SYSTEM STATE MOV R0,-(SP) ;;SAVE MOVE SIZE MOV R2,-(SP) ;;SAVE SOURCE DOUBLEWORD ADDRESS MOV R1,R0 ;;COPY DESTINATION ADDRESS CALL $RELOC ;;RELOCATE DESINATION ADDRESS MOV R1,R3 ;;COPY DESTINATION APR6 BIAS MOV R2,R4 ;;COPY DESTINATION DISPLACEMENT MOV (SP)+,R0 ;;GET SOURCE DOUBLEWORD MOV (R0)+,R1 ;;GET SOURCE APR6 BIAS MOV (R0)+,R2 ;;GET SOURCE DISPLACEMENT SUB #20000,R2 ;;CONVERT TO APR5 DISPLACEMENT MOV (SP)+,R0 ;;GET MOVE SIZE CALL $BLXIO ;;MOVE DATA AND RETURN TO USER STATE 1000$: RETURN ;;RETURN TO USER STATE AND CALLER .DSABL LSB .PAGE .SBTTL RTNBLK - MOVE BLOCK OF DATA TO TASK ; ;+ ; THIS ROUTINE MOVES THE SPECIFIED DATA BLOCK TO THE SPECIFY USER ; DATA BUFFER (USING APR6 RELOCATED ADDRESS). ; ; INPUT: ; ; R0 = SIZE OF DATA BLOCK (IN BYTES) ; R1 = SOURCE DATA ADDRESS ; R2 = POINTER TO DOUBLEWORD APR6 BIAS, ; DESTINATION DISPLACEMENT ; ; OUTPUT: ; ; DATA MOVED TO SPECIFIED DESTINATION AT SYSTEM STATE. ; ; REGISTERS: USES R0-R5 SAVES R0-R5 ; ; CALLS: $BLXIO,$RELOC ;- ; .ENABL LSB RTNBLK:: SYSTEM 1000$ ;;ENTER SYSTEM STATE MOV (R2)+,R3 ;;GET APR6 BIAS MOV (R2)+,R4 ;;GET DESTINATION DISPLACEMENT MOV R0,-(SP) ;;SAVE MOVE SIZE MOV R1,R0 ;;COPY SOURCE ADDRESS CALL $RELOC ;;RELOCATE SOURCE ADDRESS SUB #20000,R2 ;;CONVERT TO APR5 DISPLACEMENT MOV (SP)+,R0 ;;GET MOVE SIZE CALL $BLXIO ;;MOVE DATA AND RETURN TO USER STATE 1000$: RETURN ;;RETURN TO USER STATE AND CALLER .DSABL LSB .END SMMACP