; UPDATE 6/22/72 DISCIO.S35 ; UPDATE 5/5/72 DISCIO.S34 ; UPDATE 5/4/72 DISCIO.S33 ; UPDATE 5/2/72 DISCIO.S32 ; UPDATE 4/10/72 DISCIO.S31 ; UPDATE 4/5/72 DISCIO.S30 ; UPDATE 3/31/72 DISCIO.S29 ; UPDATE 3/24/72 DISCIO.S28 ; UPDATE 3/23/72 DISCIO.S27 ; UPDATE 3/17/72 DISCIO.S26 ; UPDATE 3/13/72 DISCIO.S25 ; UPDATE 2/24/72 ; UPDATE 4/12/72 ALLOC.S04 ; UPDATE 2/16/72 ALLOC.S03 ; UPDATE 1/27/72 ALLOC.S02 ; UPDATE 1/26/72 ALLOC.S01 .TITLE ALLOC .IFNZ $DEBUG&OVRLAY ; ; RPOM DUMMY ALLOCATOR-RUN UNDER LOCKOUT ; .DEF SEARCH,ALLOC,DALLOC .DEF B3FR,B3AR,B3RR,BITTBL .REF PUSHR,POPR ; ; ; TBLSIZ = 16.+16. ; BIT MAP TABLE SIZE BITTBL = . .WORD 0,0,0,0,0,0,0,; UPDATE 6/27/72 RPOM.S24 ; UPDATE 6/26/72 RPOM.S23 ; UPDATE 6/22/72 RPOM.S22 ; UPDATE 5/5/72 RPOM.S21 ; UPDATE 5/2/72 RPOM.S20 ; UPDATE 4/14/72 RPOM.S19 ; UPDATE 4/12/72 RPOM.S18 ; UPDATE 3/31/72 RPOM.S17 ; UPDATE 3/13/72 RPOM.S16 ; UPDATE 2/24/72 RPOM.S15 ; UPDATE 2/17/72 RPOM.S14 ; UPDATE 2/16/72 RPOM.S13 ; ; UPDATE 1/18/72 SGLOAD.S02 ; UPDATE 1/14/72 SGLOAD.S01 .TITLE SGLOAD .IFNZ $SGMNT ; DO NOT ASSEMBLE IF SEGMENT SWITCH ZERO ; ;*********************************************************************** ;* * ;* SGLOAD * ;* * ;* PROGRAM IDENTIFI DISCIO.S24 ; ; UPDATE 2/16/72 DISCIO.S23 ; UPDATE 2/16/72 DISCIO.S22 ; UPDATE 1/27/72 DISCIO.S21 ; UPDATE 1/24/72 DISCIO.S20 ; UPDATE 1/20/72 DISCIO.S19 ; UPDATE 1/19/72 DISCIO.S18 ; UPDATE 1/18/72 DISCIO.S17 ; UPDATE 1/12/72 DISCIO.S16 ; UPDATE 12/15/71 DISCIO.S15 ; UPDATE 12/17/71 DISCIO.S14 ; UPDATE 11/30/71 DISCIO.S13 ; 0 ; ALLOCATION .WORD 0,0,0,0,0,0,0,0 ; TABLE ; TMP1: .WORD 0 ; B3RR: .WORD 0 B3AR: .WORD 0 B3FR: .WORD 0 ; ; ; SEARCH = . BIC #170000,X060 BIS #30000,X060 ; CONSTRUCT BIT #1.,R4 BIC #177400,X061 BIS #1400,X061 ; CONSTRUCT BEQ X070 BR X000 ; ALLOC = . BIC #170000,X060 BIS #50000,X060 ; CONSTRUCT BIS #1.,R4 BIC #1 UPDATE 2/3/72 RPOM.S12 ; UPDATE 1/28/72 RPOM.S11 ; UPDATE 1/27/72 RPOM.S10 ; UPDATE 1/24/72 RPOM.S09 ; UPDATE 1/20/72 RPOM.S08 ; UPDATE 1/19/72 RPOM.S07 ; UPDATE 1/18/72 RPOM.S06 ; UPDATE 1/12/72 RPOM.S05 ; UPDATE 1/11/72 RPOM.S04 ; UPDATE 1/11/72 RPOM.S03 ; UPDATE 12/7/71 RPOM.S02 ; UPDATE 11/10/71 RPOM.S01 .TIT CATION. SGLOAD; ROS OVERLAY SEGMENT * ;* LOADER. * ;* * ;* PURPOSE. THIS SUBROUTINE READS THE SPECIFIED OVERLAY SEGMENT * ;* (PART OF AN OVERLAY TASK) INTO THE TASK'S SEGMENT AREA. * ;* THE SEGMENT LOAD CONCEPT PROVIDES A "VIRTUAL" EXTENSION OF AN * ;* OVERLAY TASK (DYNAMIC, FIXED OR TIME-SLICED), THEREBY * ;* PERMITTI UPDATE 11/20/71 DISCIO.S12 ; UPDATE 11/18/71 DISCIO.S11 ; UPDATE 11/15/71 DISCIO.S10 ; UPDATE 11/2/71 DISCIO.S09 ; UPDATE 11/1/71 DISCIO.S08 ; UPDATE 10/8/71 DISCIO.S07 ; UPDATE 9/21/71 DISCIO.S06 ; UPDATE 9/16/71 DISCIO.S05 ; UPDATE 9/14/71 DISCIO.S04 ; UPDATE 9/8/71 DISCIO.S03 ; UPDATE 9/3/71-DISCIO ; UPDATE 9/2/71-DISCIO .TIT77400,X061 BIS #102000,X061 ; CONSTRUCT BVC X070-MUST BRANCH BR X000 ; DALLOC = . BIC #170000,X060 BIS #40000,X060 ; CONSTRUCT BIC #1.,R4 BIC #177400,X061 BIS #102000,X061 ; CONSTRUCT BVC X070-MUST BRANCH ; X000 = . JSR R5,PUSHR ; SAVE REGISTERS MOV B3RR,R0 ; GET START BLOCK/NOB REQUESTED CLR TMP1 BISB R0,TMP1 ; SAVELE RPOM TABLES .IFNZ NDISCS&OVRLAY ; DO NOT ASSEMBLE RPOM IF ZERO. ; ;*********************************************************************** ;* RPOM TABLES * ;* * ;* PROGRAM IDENTIFICATION. OVYTBL * ;* * ;* PURPOSE. OVYTBL CONTAINS ALL TABLES, DATA ANNG LARGER PROGRAMS TO FIT INTO SMALLER MEMORY * ;* SPACES. A SEGMENT LOAD REQUEST MAY ORIGINATE FROM THE * ;* MAIN OVERLAY TASK OR THE SEGMENT ITSELF. THE REQUEST * ;* CONTAINS THE NUMBER OF THE SEGMENT ASSOCIATED WITH THE TASK * ;* AND THE TYPE OF RETURN AFTER THE SEGMENT HAS BEEN LOADED. * ;* SGLOAD WILL HAVE THE RESPONSIBILITY OF READING THE SEGMENT * ;* FROM DISC TO MEMORY, HANDLING ERRORS THAT RESULT FROM * ;* LE DISCIO TABLES ; .IFNZ NDISCS ; DO NOT ASSEMBLE DISCIO IF NDISCS = 0 ; ;*********************************************************************** ;* * ;* DISCIO TABLES * ;* * ;* PROGRAM IDENTIFICATION. DIOTBL * ;*  NOB REQUESTED CLRB R0 SWAB R0 ; START BLOCK REQUESTED CLR R1 ; INIT BITTBL INDEX CLR R2 ; INIT BIT COUNTER CLR R3 ; INIT HIT COUNTER X030: MOV BITTBL(R1),R4 ; GET A BIT MAP WORD CLR R5 ; WILL SHIFT INTO R5 X040: CMP R2,R0 ; GET TO START BLOCK REQUESTED? BGE X060 ; YES X050: ASR R4 ; DOUBLE SHID SYSTEM * ;* EQUATE STATEMENTS REQUIRED FOR THE RPOM SYSTEM. * ;* EACH PARAMETER IS DEFINED IN THE COMMENTS FIELD. * ;* * ;* PROGRAM USAGE. EACH TABLE AND DATA ITEM IS REFERENCED * ;* BY A RPOM SUBROUTINE. THOSE TABLES AND ITEMS WHICH * ;* MAY BE REFERENCED BY OTHER PROGRAMS WILL BE DECLARED * ;* IN A .DEF STATEMENT. THE REQUEST AND IF LOAD SUCCESSFUL, PERFORMING THE PROPER * ;* RETURN TO THE REQUESTING TASK. * ;* * ;* PROGRAM USAGE. THE FOLLOWING LINKAGE IS USED TO CALL * ;* SGLOAD: * ;* MOV SEGNO,-(SP) ;SGMNT # TO STACK * ;* MOV RETURN,-(SP) ;RETURN TYPE *  * ;* PURPOSE. DIOTBL CONTAINS ALL TABLES, DATA AND SYSTEM * ;* EQUATE STATEMENTS REQUIRED FOR THE DISCIO SUBROUTINE. * ;* EACH PARAMETER IS DEFINED IN THE COMMENTS FIELD. * ;* * ;* PROGRAM USAGE. EACH TABLE AND DATA ITEM IS REFERENCED * ;* BY THE DISC I/O SUBROUTINE. THOSE TABLES AND ITEMS * ;* WHICH MAY ALSO BE REFERENCEFT R4 ROR R5 ; TO R5 INC R2 ; BUMP BIT COUNTER BIT #17,R2 ; VALUE DIVISIBLE BY 16? BNE X040 ; NO MOV R5,BITTBL(R1) ; YES-REPLACE BIT MAP WORD TST (R1)+ ; BUMP BITTBL INDEX CMP R1,#TBLSIZ ; SEARCHED COMPLETE TABLE? BGE ERROR ; YES-SET ERROR BIT INCASE SEARCH BR X030 ; KEEP SEARCHING ; ; X060:  * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** ; .DEF BCPOOL,ECPOOL,AL;* EMT SGLOAD * ;* OR THE FORTRAN EQUIVALENT: * ;* CALL SGLOAD (SEGNO,RETURN) * ;* WHERE: * ;* SEGNO = THE TASK'S SEGMENT NUMBER TO LOAD * ;* RETURN = TYPE OF RETURN REQUESTED * ;* 0 = RETURN TO CALLING CODE AFTER SEGMENT D BY OTHER PROGRAMS WILL * ;* BE DECLARED IN A .DEF STATEMENT * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;************************** BIT #1.,R4 ; MAY ALSO BE BIS OR BIC X061: BEQ X070 ; MAY ALSO BE BVC CLR R3 ; RESET HIT COUNTER BR X050 ; ; X070: INC R3 ; BUMP HIT COUNTER CMP R3,TMP1 ; DONE FOR NOB REQUESTED BLT X050 ; NO-KEEP GOING MOV R2,R3 ; SAVE NO. OF BITS LEFT TO SHIFT SUB TMP1,R2 ; CALCULATE START BLOCK INCASE INC R2 POOL,DYSINI .REF BEGDYN,ENDDYN .CSECT ; .PAGE ; ; PRIORITY PROPERTY VALUES ARE AS FOLLOWS: ; +1 = TIME-SLICE ; 0 = FIXED ; -1 = DYNAMIC ; ; ; ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 1 ; .IFNZ NEQP01 .IFGE PRIP01 ; GENERATE TIME-SLICED OR FIXED HEADER .IFG PRIP01 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD  * ;* LOADED. (ILLEGAL TYPE IF REQUEST ALSO * ;* FROM SEGMENT) * ;* 1 = RETURN TO FIRST EXECUTABLE INSTRUCTION * ;* (AFTER RELOCATION INDEX OF SEGMENT) * ;* 2 = RETURN TO SECOND EXECUTABLE INSTRUCTION * ;* . . * ;* . . ********************************************* ; .DEF FILE,DOD,NODREQ,CPRSIP .DEF DQFRST,DQLAST,NDPRTY,HPRIRQ,CALLED .DEF COMPID,CDIHDR,CDIFCN,CDEND .CSECT ; .PAGE ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; ; THE FOLLOWING TABLE IS USED TO FIND THE NUMBER ; OF PRIORITY LEVELS IN EACH DISC QUEUE ; NDPRTY = . .BYTE NDPRT1 ; PRIORITIES DISC 1 ; .IFG NDISCS-1 .BYTE NDP; SEARCH REQUEST SWAB R2 BISB TMP1,R2 ; SB/NOB MOV R2,B3AR ; SET UP ANSWER REGISTER BIC #1,B3FR X075: ASR R4 ; FINISH CURRENT BITTBL WORD ROR R5 INC R3 BIT #17,R3 BNE X075 MOV R5,BITTBL(R1) ; SET IN BIT MAP X080: JSR R5,POPR ; RESTORE REGISTERS RTS PC ; RETURN ; ; ERROR: BIS #1,B3FR ; SET  .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0=NOT ALLOCATED .WORD QPRT01 ; PUSH ADDRESS .WORD QPRT01 ; PULL ADDRESS .WORD EQPT01 ; BOTTOM OF QUEUE * ;* . . * ;* N = RETURN TO NTH EXECUTABLE INSTRUCTION * ;* * ;* REGISTERS R0 THRU R5 WILL BE SAVED DURING THE * ;* LOAD PROCESS SO THAT IT WILL BE POSSIBLE TO PASS * ;* THESE REGISTERS FROM THE OVERLAY TASK TO A SEGMENT OR * ;* FROM SEGMENT TO SEGMENT. !RT2 ; PRIORITIES DISC 2 .ENDC ; .IFG NDISCS-2 .BYTE NDPRT3 ; PRIORITIES DISC 3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; .EVEN .PAGE ; ; THE FOLLOWING TABLES, DQ(N)1ST AND DQ(N)LST WHERE N = DISC ; DEVICE NUMBERS, CONTAIN THE DISC PRIORITY QUEUE THREAD ; INFORMATION. IN EACH SET OF TABLES, WORD 0 CORRESPONDS TO ; PRIORITY LEVEL 1(HIGHEST); WORD 1 CORRESPONDS TO PRIORITY ; CAN'T FIND AREA STATUS BR X080 ; RETURN ; .ENDC .END # .WORD QPRT01 ; TOP OF QUEUE .BYTE NEQP01-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT01 = . ; QPART LEVEL 01 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP01+QPRT01 ; GET RID OF ENTRYS NOT NEEDED EQPT01 = .-2 ; END OF THIS LEVEL'S QPART TABLE $ * ;* * ;* IF THE TASK IS ABORTED DUE TO AN ERROR CAUSED BY A * ;* SGLOAD REQUEST, AN ERROR MESSAGE WILL BE TYPED AND THE * ;* TASK ABORTED. * ;* * ;* A TASK MAY BE "CHECKPOINTABLE" DURING A SGLOAD REQUEST. * ;* SGLOAD WILL ASSURE THAT THE TASK I% LEVEL 2; ETC. ; ; DQ(N)1ST POINTS TO THE THREAD WORD OF THE FIRST I/O ; LIST REQUEST IN THE ASSOCIATED PRIORITY LEVEL THREAD. THE ; THREAD WORD OF THAT LIST POINTS TO THE NEXT I/O LIST ; IN THE THREAD; ETC. A ZERO IN THE THREAD WORD SIGNI- ; FIES THE END OF A QUEUE AND ITS ADDRESS IS CONTAINED ; IN DQ(N)LST. ; ; DQ11ST = . .WORD 0,0,0,0,0,0,0,0 ; ADD MORE WORDS IF NDPRT1>8 .=DQ11ST+NDPRT1+NDPRT1 ; GET RID OF ZEROS NOT NEEDED ; &; UPDATE 5/2/72 SYSINI.S02 ; UPDATE 4/14/72 SYSINI.S01 .TITLE SYSINI ;*********************************************************************** ;* * ;* SET UP SYSTEM TASKS IN TASK TABLE IF THEY ARE CORE * ;* RESIDENT TASKS-CALLED BY IPL. * ;* * ;***************************' .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 2 ; .IFNZ NEQP02 .IFGE PRIP02 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP02 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT (S NOT CHECKPOINTED * ;* DURING THE LOAD PROCEDURE. * ;* * ;* THE LINKAGE TO GOBACK IS: * ;* EMT GOBACK * ;* OR THE FORTRAN EQUIVALENT: * ;* CALL GOBACK * ;* ) DQ1LST = . .WORD DQ11ST,DQ11ST+2. ; ADD MORE .WORD DQ11ST+4.,DQ11ST+6. ; VALUES .WORD DQ11ST+8.,DQ11ST+10. ; IF .WORD DQ11ST+12.,DQ11ST+14. ; NDPRT1>8 .=DQ1LST+NDPRT1+NDPRT1 ; GET RID OF VALUES NOT NEEDED ; ; .IFG NDISCS-1 ; THREAD TABLE DEVICE 2 DQ21ST = . .WORD 0,0,0,0,0,0,0,0 ; ADD MORE WORDS IF NDPRT2>8 .=DQ21ST+NDPRT2+NDPRT2 ; GET RID OF ZEROS N********************************************* .DEF SYSINI .REF CMPRHD,FLSTHD,RASHED,LODHED .REF HEADER,TSTAT,TPRTY,TASKS .REF QIPL,INPTHD .CSECT .SYSIN ; HDRTBL = . .WORD CMPRHD .WORD FLSTHD .WORD RASHED .WORD LODHED .WORD INPTHD ; ; TNOTBL = . .WORD $CPTNO .WORD $FLTNO .WORD $RASNO .WORD $RLDNO .WORD $INPNO ; ; + ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT02 ; PUSH ADDRESS .WORD QPRT02 ; PULL ADDRESS .WORD EQPT02 ; BOTTOM OF QUEUE .WORD QPRT02 ; TOP OF QUEUE .BYTE NEQP02-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT02 = . , * ;* CONTROL IS THEN PASSED BACK TO WHERE THE LAST SGLOAD * ;* WAS CALLED IN THE MAIN OVERLAY TASK. REGISTERS R0 * ;* THRU R5 WILL NOT BE DESTROYED. * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION -OT NEEDED ; DQ2LST = . .WORD DQ21ST,DQ21ST+2. ; ADD MORE .WORD DQ21ST+4.,DQ21ST+6. ; VALUES .WORD DQ21ST+8.,DQ21ST+10. ; IF .WORD DQ21ST+12.,DQ21ST+14. ; NDPRT2>8 .=DQ2LST+NDPRT2+NDPRT2 ; GET RID OF VALUES NOT NEEDED .ENDC ; ; .IFG NDISCS-2 ; THREAD TABLE DEVICE 3 DQ31ST = . .WORD 0,0,0,0,0,0,0,0 ; ADD MORE WORDS IF NDPRT3>8 .=DQ31ST+NDPRT3+NDPRT3 . NOSYST = 5. ; NO. OF TASKS IN TABLE TO INITIALIZE NOSYSI = NOSYST+NOSYST ; INDEX OF ABOVE PRIOR = 9. ; TASK PRIORITY IN HEADER ; ; SYSINI = . JSR PC,QIPL ; INIT. TASK TABLE MOV #-NOSYSI,R0 ; LOOP CONTROL AND INDEX SYSI00: MOV HDRTBL+NOSYSI(R0),R1 ; GET A HEADER ADDRESS BEQ SYSI20 ; NOT IN CORE-FORGET MOV TNOTBL+NOSYSI(R0),R2 ; GET TASK'S NUMBER / ; QPART LEVEL 02 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP02+QPRT02 ; GET RID OF ENTRYS NOT NEEDED EQPT02 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 3 ; .IFNZ NEQP03 .IFGE PRIP03 ; GENERATE TIME-0 * ;* * ;*********************************************************************** ; .DEF SGLOAD,GOBACK .REF ACTIVE,$CTASK,FQPRTN,DISCIO,ABORT,DSPTCH .REF PUSHR,POPR ; .CSECT .PAGE ; ; EQUATES FOR PARTITION HEADER - FROM PROGRAM(TASK) HEADER ; SGADDR = -2. ; RELATIVE SEGMENT ADDRESS- TO PROGRAM HEADER SG1 ; GET RID OF ZEROS NOT NEEDED ; DQ3LST = . .WORD DQ31ST,DQ31ST+2. ; ADD MORE .WORD DQ31ST+4.,DQ31ST+6. ; VALUES .WORD DQ31ST+8.,DQ31ST+10. ; IF .WORD DQ31ST+12.,DQ31ST+14. ; NDPRT3>8 .=DQ3LST+NDPRT3+NDPRT3 ; GET RID OF VALUES NOT NEEDED .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; THE FOLLOWING TABLE IS USED TO FIND THE ; APPROPRIATE DEVICE'S FIRST AND LA CLRB TSTAT(R2) ; SET TASK QUIESCENT MOVB PRIOR(R1),TPRTY(R2) ; SET PRIORITY DEFAULT CMP R2,TASKS BLE SYSI10 MOV R2,TASKS SYSI10: ASL R2 ; TASK NO. WORD INDEX MOV R1,HEADER(R2) ; HEADER ADDRESS SYSI20: ADD #2.,R0 ; BUMP INDEX BLT SYSI00 ; DO FOR ALL .IFNZ NDISCS .REF $TKFLS,PFRITE MOV #$TKFLS,-(SP) ; WRITE TASK TABLE ON DISC 3SLICED OR FIXED HEA .IFG PRIP03 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT03 4LNGT = -4. ; SEGMENT LENGTH TRLIDX = -6. ; RELATIVE INDEX TO TRAILER HIOFCN = -13. ; I/O FCN FROM PROGRAM HEADER HFLEID = -16. ; OVERLAY FILE ID FROM HEADER HDBADD = -18. ; DATA BUFFER ADDRESS FROM HEADER HERRWD = -22. ; ERROR WD IN I/O LIST FOR ERROR CHECK HIOCMP = -26. ; I/O COMPLETE FROM HEADER HIOEXT = -27. ; I/O EXIT FROM HEADER HIOLST = 5ST. ; DQFRST = . .WORD DQ11ST ; FIRST TABLE DISC 1 ; .IFG NDISCS-1 .WORD DQ21ST ; FIRST TABLE DISC 2 .ENDC ; .IFG NDISCS-2 .WORD DQ31ST ; FIRST TABLE DISC 3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; DQLAST = . .WORD DQ1LST ; LAST TABLE DISC 1 ; .IFG NDISCS-1 .WORD DQ2LST ; LAST TABLE DISC 2 .ENDC ; 6; UPDATE 3/13/72 DECTAP.S02 ; UPDATE 3/9/72 DECTAP.S01 .TITLE DECTAP ; ;*********************************************************************** ;* * ;* DECTAPE I/O TABLES * ;* * ;*********************************************************************** ; .CSECT ; 7 ; PUSH ADDRESS .WORD QPRT03 ; PULL ADDRESS .WORD EQPT03 ; BOTTOM OF QUEUE .WORD QPRT03 ; TOP OF QUEUE .BYTE NEQP03-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT03 = . ; QPART LEVEL 03 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQPG-30. ; START OF DISC I/O PARAM. LIST HWRKWD = -32. ; WORK WORD FROM HEADER PHPRI = -33. ; PRIOR FROM PROGRAM HEADER HIQPRT = -34. ; IQPART FROM PROGRAM HEADER PHSB = -35. ; SB FROM PROGRAM HEADER PHNOB = -36. ; NOB FROM PROGRAM HEADER ; ; EQUATES FOR SEGMENT HEADER AND THE OVERLAY SEGMENT ; SEGNO = 0. ; SEGMENT NUMBER PSTATS = 1. ; PSTAT(PAE .IFG NDISCS-2 .WORD DQ3LST ; LAST TABLE DISC 3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; .PAGE ; THE FOLLOWING TABLES ARE THE DEVICE CONTROL ; TABLES (DCT) FOR THE DISCS. THESE TABLES KEEP THE ; FLAGS, POINTERS, DATA AND BUFFERS NECESSARY TO ; CONTROL EACH DEVICE. ; NODREQ = . ; NUMBER OF DEVICE REQUESTS IN QUEUE .WORD -1.,-1.,-1. ; EXPAND FOR MORE THAN 3 DEVICES .=NH; THE FOLLOWING TABLES CONTAIN THE DECTAPE QUEUE THREAD. ; DTFRST POINTS TO THE FIRST REQUEST IN THE QUEUE AND ; DTLAST POINTS TO THE LAST REQUEST IN THE QUEUE ; DTFRST: .WORD 0 DTLAST: .WORD DTFRST ; .PAGE ; ; THE FOLLOWING TABLE IS THE DEVICE CONTROL TABLE FOR ; THE DECTAPE. THIS TABLE CONTAINS THE FLAGS,POINTERS, ; DATA,ETC., REQUIRED TO CONTROL THE DECTAPES. ; NDTREQ: .WORD -1. ; NUMBER OF DECTAPE REQUESTS IN QUEUE F03+QPRT03 ; GET RID OF ENTRYS NOT NEEDED EQPT03 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 4 ; .IFNZ NEQP04 .IFGE PRIP04 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP04 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .B""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""DDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDTUUUUUUUUUUUUUUUUUUUUUUUUUUUUffffffDDDADDB C{7 |},8^{7s@Q{w]{6zy:{J"8}{62* dQDd$D~gffffBcc8a ͋,L w:B ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * BIODREQ+NDISCS+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; CRQPTR = . ; CURRENT REQUEST LIST POINTER .WORD 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES .=CRQPTR+NDISCS+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; CDCS = . ; CURRENT DISC CONTROL STATUS REGISTER .WORD 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES .=CDCS+NDISCS+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; HPRIRQ = . JYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT04 ; PUSH ADDRESS .WORD QPRT04 ; PULL ADDRESS .WORD EQPT04 ; BOTTOM OF QUEUE .WORD QPRT04 ; TOP OF QUEUE .BYTE NEQPKRTITION STATUS) SAVE BYTE RETURN = 2. ; RETURN TO MAIN SEGMENT ADDRESS SGFLID = 4. ; SEGMENT FILE ID SGFCN = 7. ; SEGMENT I/O FUNCTION SGTIDX = 14. ; SEGMENT INDEX TO TRAILER SGSTRT = 16. ; BEGINNING OF SEGMENT CODE ; ; PLOCK = 340 ; PRIORITY LOCKOUT MASK PSR = 177776 ; PROCESSOR STATUS REGISTER MASK ; ; MISCELLANEOUS EQUATES ; PRTNCK = LCDTCM: .WORD 0 ; CURRENT DECTAPE COMMAND CALLED: .BYTE 0 ; CALLED BY EXIT FLAG NOTRYS: .BYTE 0 ; DECTAPE ERROR RETRY COUNTER MODE: .WORD 0 ; DECTAPE MODE. 0= SEARCH,-1= XFER DTXFRC: .WORD 0 ; DECTAPE XFER COMMAND WITH DIRECTION DTNOWD: .WORD 0 ; TWO'S COMP. NO. WORDS IN XFER DTXFRA: .WORD 0 ; DECTAPE XFER ADDRESS ; BLNORQ: .WORD 0 ; BLOCK NUMBER REQUESTED BLKCTLM ; MAINTAINS HIGHEST PRIORITY IN QUEUE .BYTE -1.,-1.,-1. ; EXPAND FOR MORE THAN 3 DEVICES .=HPRIRQ+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; CALLED = . ; CALLED BY EXIT FLAG .BYTE 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES .=CALLED+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; NOTRYS = . ; DISC ERROR RETRY COUNTER .BYTE 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES .=NOTRYS+NDN04-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT04 = . ; QPART LEVEL 04 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP04+QPRT04 ; GET RID OF ENTRYS NOT NEEDED EQPT04 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; O 3. ; PARTITION NOT CHECKPOINTABLE ; ; -PSTAT STATUS IOERRW = 8. ; ERROR WORD IN I/O LIST FROM I/O LIST ; ; EQUATES FOR PROGRAM HEADER ; THREAD = 0. ; THREAD WORD ENTRY = 2. ; TASK ENTRY POINT INITPT = 4. ; TASK INITIALIZATION ENTRY MAXT = 6. ; ABORT OR TIME-SLICE MAX. TIME SIZE = 8. ; HEADER STACK SIZE (BYTP: .WORD 0 ; BLOCK NUMBER CONTROL ; .PAGE ; ; DECTAPE HARDWARE-SOFTWARE INTERFACE ; ; FUNCTION TABLE FOR TC-11 DECTAPE CONTROLLER. CONTAINS ; FUNCTION CODE. INTERRUPT ENABLE AND "DO" BIT. ; FCNTBL = . .BYTE 105 ; READ DATA .BYTE 115 ; WRITE DATA .EVEN ; DTCSR = 177340 ; DECTAPE CONTROL AND STATUS REGISTER DTCMR = 177342 ; DECTAPE COMMAND REGISTERQISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; TIMCTR = . ; TIME-OUT XFER RETRY COUNTER .BYTE 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES .=TIMCTR+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; .EVEN .IFNZ DRESDI ; DISC RESIDENT DIRECTORY ; ; DCT ENTRIES DFDBAD = . ; DISC FILE DIRECTORY BUFFER ADDRESS .WORD DFDBF1 ; DFD BUFFER DISC 1 ; R; GENERATE QPARTN TABLES FOR RPOM LEVEL 5 ; .IFNZ NEQP05 .IFGE PRIP05 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP05 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; SE) HPRIOR = 9. ; CURRENT TASK PRIORITY (BYTE) CTIMER = 10. ; CURRENT TIME-SLICE TIMER VALUE TARG = CTIMER+ARG+ARG ; TRANSMITTED ARGUMENT (OPTIONAL) CPUST = TARG+2 ; CPU STATUS REGISTER (BYTE) TASKNO = CPUST+1 ; TASK NUMBER (BYTE) TSTACK = TASKNO+1 ; SAVED STACK POINTER REGSV = TSTACK+2 ; REGISTER SAVE AREA ; .PAGE SGLOAD = . TST ACTIVE T DTWCR = 177344 ; DECTAPE WORD COUNT REGISTER DTBAR = 177346 ; DECTAPE BUS ADDRESS REGISTER DTDR = 177350 ; DECTAPE DATA REGISTER ; .PAGE ; ; TAPE UNIT NOT ON LINE ERROR MODULE ; ERRMOD = . .WORD 1 ; THREAD WORD .WORD 999. ; ERROR NUMBER TAPENO: .WORD 0 ; ARG.1-TAPE NUMBER .WORD 0,0,0 ; UNUSED ARGUMENTS ; ; .PAGE ; U .IFG NDISCS-1 .WORD DFDBF2 ; DFD BUFFER DISC 2 .ENDC ; .IFG NDISCS-2 .WORD DFDBF3 ; DFD BUFFER DISC 3 .ENDC ; ; EXPAND FOR MORE THAN 3 DISC DEVICE CONTROLLERS ; DFDBF1 = . . = DFDBF1+60.+60. ; RESERVE 60 WORD BUFFER, DISC 1 ; .IFG NDISCS-1 DFDBF2 = . .=DFDBF2+60.+60. ; RESERVE 60 WORD BUFFER, DISC 2 .ENDC ; .IFG NDISCS-2 DFDBF3 = VTIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT05 ; PUSH ADDRESS .WORD QPRT05 ; PULL ADDRESS .WORD EQPT05 ; BOTTOM OF QUEUE .WORD QPRT05 ; TOP OF QUEUE .BYTE NEQP05-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT05 = . ; QPART LEVEL 05 BEGIN .WORD 0,0,0,0,0,0,0,0,0,W ; CALLED BY AN ACTIVE TASK? BEQ SGLA50 ; NO- IGNORE REQUEST JSR R5,PUSHR ; SAVE TASK'S REGISTERS MOV $CTASK,R1 ; GET TASK NUMBER MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK CMP R1,#OVTMIN ; CALLED BY AN OVERLAY TASK? BLT SGLD00 ; NO- ABORT TASK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT JSR PC,FQPRTN ; FIND QPART(N) INFO. ON TASK MOV X; EQUATES FOR TASK PROGRAM HEADERS ; THREAD = 0. ; THREAD WORD ENTRY = 2. ; TASK ENTRY POINT INITPT = 4. ; TASK INITIALIZATION ENTRY MAXT = 6. ; MAXIMUM EXECUTION TIME SIZE = 8. ; HEADER STACK SIZE (BYTE) HPRIOR = 9. ; TASK PRIORITY (BYTE) CTIMER = 10. ; CURRENT TIMERVALUE TARG = CTIMER+ARG+ARG ; ARGUMENT (OPY . .=DFDBF3+60.+60. ; RESERVE 60 WORD BUFFER, DISC 3 .ENDC ; ; EXPAND FOR MORE THAN 3 DISC DEVICE CONTROLLERS ; .ENDC .PAGE ; ; ; CORE RESIDENT FILE DIRECTORY PARAMETER GENERATION ; STATEMENTS ; ; ; ; THE FOLLOWING IS FOR CORE & DISC RESIDENT DIRECTORIES ; DOD = . .IFNZ DRESDI ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; NOTE: DOD1 REFERS TO DISC PHYSICAL DEVICE 0 ; DODZ0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP05+QPRT05 EQPT05 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 6 ; .IFNZ NEQP06 .IFGE PRIP06 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP06 ; TIME-SLICE SUSPEND TIMER .WORD 1 [SGADDR(R4),R0 ; GET RELATIVE ADDRESS OF TASK'S SEGMENT AREA BEQ SGLD00 ; DOESN'T HAVE ONE - ERROR ADD R4,R0 ; ACTUAL ADDRESS OF SEGMENT HEADER MOVB (R2),PSTATS(R0) ; SAVE TASK'S CURRENT PARTITION STATUS- PSTAT MOVB #PRTNCK,(R2) ; SET PARTITION NOT CHECKPOINTABLE MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV R0,R5 ; CALCULATE EXTENT OF ADD SGLNGT(R4),R5 ; SEGMENT AREA \TIONAL) CPUST = TARG+2 ; CPU STATUS REGISTER (BYTE) TASKNO = CPUST+1 ; TASK NUMBER (BYTE) TSTACK = TASKNO+1 ; SAVED STACK POINTER REGSV = TSTACK+2 ; REGISTER SAVE AREA ; ; EQUATES FOR I/O PARAMETER LIST ; THREAD = 0. ; LIST THREAD WORD DEVICE = 2. ; LOGICAL DEVICE NUMBER TYPE = 3. ; EXIT TYPE EXIT = 4. ; I/O COMP]2 REFERS TO DISC PHYSICAL DEVICE 1 ; . . . ; . . . ; . . . ; DOD(NDISCS) REFERS TO DISC PHYSICAL DEVICE NDISC ; ; HOWEVER, THE DEVICE PARAMETER IN THE DOD IS LOGICAL ; DOD1: .WORD 1 ; FILE ID 1 .WORD DIRAD1 ; ADDRESS OF DIRECTORY FILE .WORD 100400 ; PROTECTED FILE-DEVICE 1 .WORD DIRLN1 ; LENGTH O^ ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT06 ; PUSH ADDRESS .WORD QPRT06 ; PULL ADDRESS .WORD EQPT06 ; BOTT_ MOV 14.(SP),R3 ; GET CALLER'S PC CMP R3,R0 ; CALLED FROM WITHIN SEGMENT? BLT SGLB00 ; NO - SAVE PC FOR GOBACK CMP R3,R5 BGT SGLB00 ; NO - SAVE PC FOR GOBACK TST 16.(SP) ; CALLED FROM SEGMENT, RETURN TYPE = 0? BEQ SGLD00 ; YES-ERROR, ABORT TASK SGLA10: MOV 18.(SP),R5 ; GET SEGMENT NO. REQUESTED CMPB R5,(R0) ; IS IT ALREADY IN SEGMENT A`LETE ADDRESS IF TYPE =3 ERRTSK = 6. ; TASK # TO QUEUE IF I/O ERROR IOFCN = 7. ; I/O FUNCTION OF REQUEST ERROR = 8. ; I/O ERROR INDICATOR SYSTEM = 10. ; RESERVED FOR DECTAP DATA = 12. ; ADDRESS OF I/O BUFFER ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK NTRYS = 10. aF FILE .WORD 0 ; .IFG NDISCS-1 DOD2: .WORD 2 ; FILE ID 2 .WORD DIRAD2 ; ADDRESS OF DIRECTORY FILE .WORD 101000 ; PROTECTED FILE-DEVICE 2 .WORD DIRLN2 ; LENGTH OF FILE .WORD 0 .ENDC ; .IFG NDISCS-2 DOD3: .WORD 3 ; FILE ID 3 .WORD DIRAD3 ; ADDRESS OF DIRECTORY FILE .WORD 101400 ; PROTECTED FILE-DEVICE 3 bOM OF QUEUE .WORD QPRT06 ; TOP OF QUEUE .BYTE NEQP06-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT06 = . ; QPART LEVEL 06 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP06+QPRT06 ; GET RID OF ENTRYS NOT NEEDED EQPT06 = .-2 ; END OF THIS LEVEL'S cREA BEQ SGLA20 ; YES- NO NEED FOR A DISC XFER THEN CLR R3 BISB SIZE(R4),R3 ; GET STACK HEADER NO. OF WORDS ASL R3 ; DOUBLE ADD #REGSV+2,R3 ; DISPLACEMENT IN TASK HEADER OF ; ; MAXIMUM SEGMENT NO. AND ; ; SEGMENT FILE ID'S ADD R4,R3 ; COMPUTE ACTUAL ADDRESS CMP R5,(R3) ; SEGNO REQUESTED VALId ; NO. OF RETRIES IF ERROR DVTYPE = 4. ; DECTAPE DEVICE TYPE IN ROS ; ; DECTAP ERROR EQUATES ; ERR001 = 201. ; LIST ALREADY QUEUED ERR002 = 202. ; INVALID DEVICE NO. ERR003 = 203. ; ILLEGAL EXIT TYPE ERR004 = 204. ; ILLEGAL I/O FUNCTION ERR005 = 205. ; ILLEGAL BLOCK NO. ERR006 = 206. ; TAPE I/O ERROR ; .PAGE ;*********************************e .WORD DIRLN3 ; LENGTH OF FILE .WORD 0 .ENDC ; .ENDC ; COMPID = . ; COMPRESSION WORK DIRECTORY .WORD NDISCS+1 ; ID .WORD 0,0,0,0 ; SET UP BY COMPRS ; FTDIR = . ; FILE TYPE DIRECTORY .WORD NDISCS+2 ; ID .WORD DIRAD1+DIRLN1 ; STARTS AFTER DOD-UNIT 1 .WORD 100400 ; PROTECTED FILE-DEVICE 1 .WORD $FTDRL ; FILE TYPE DIRfQPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 7 ; .IFNZ NEQP07 .IFGE PRIP07 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP07 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD gD? BHI SGLD00 ; NO- ERROR MOVB R5,(R0) ; YES-SAVE IN SEGMENT HEADER ASL R5 ; DOUBLE FOR WORD INDEX ADD R5,R3 ; ADDRESS OF REQUESTED SEGMENTS FILE ID MOVB #2.,HIOEXT(R4) ; REQUEST EXIT TYPE 2 I/O MOV (R3),SGFLID(R0) ; SET UP FILE ID TO READ CLRB SGFCN(R0) ; SET I/O FUNCTION FOR READ ADD #SGFLID,R0 ; CALCULATE ADDRESS OF SGMT DATA BUFFER MOV h************************************** ;* DECTAP - DECTAPE I/O HANDLER * ;* * ;* PROGRAM IDENTIFICATION. DECTAP * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPONSIBLE FOR ALL COMMUNICATIONS * ;* WITH THE DECTAPES IN ROS. ALL REQUESTS ARE QUEUED IN THE * ;* ROS THREAD SCHEME i. LENGTH .WORD 0 ; CDIMGE = . ; CORE DIRECTORY IMAGE FILE ENTRY .WORD NDISCS+3 ; ID .WORD DIRAD1+DIRLN1+$FTDRL ; STARTS AFTER FTDIR-UNIT 1 .WORD 100400 ; PROTECTED FILE-DEVICE 1 .WORD $CDISZ ; LENGTH .WORD 0 TTFILE = . ; TASK TABLE FILE .WORD NDISCS+4 ; ID .WORD DIRAD1+DIRLN1+$FTDRL+$CDISZ ; STARTS AFTER CDIMGE-UNIT 1 .WOj TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT07 ; PUSH ADDRESS .WORD QPRT07 ; PULL ADDRESS .WORD EQPT07 ; BOTTOM OF QUEUE .WORD QPRT07 ; TOP OF QUEUE .BYTE NEQP07-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT07 k R0,HDBADD(R4) ; SET IN DISC I/O PARAMETER LIST ADD #HIOLST,R4 ; CALCULATE ADDRESS OF I/O LIST MOV R4,-(SP) ; SET ON STACK FOR DISCIO CALL JSR PC,DISCIO ; READ SPECIFIED SEGMENT FOR TASK ; ; TASK IS SUSPENDED DURING THE DISCIO ; RESTARTS AT I/O COMPLETE HERE (EXIT TYPE 2) ; TST IOERRW(R4) ; DISC ERROR OCCUR? BNE SGLD00 ; YES- ABORT ERROR TST SGTIDX-SGFLID(R0) ; NEl(ONLY ONE PRIORITYLEVEL). REQUESTS * ;* TO THE DECTAPE ARE BLOCK NO. ORIENTED. DECTAP WILL * ;* HANDLE ERRORS AND RECOVERY ATTEMPTS. UNRECOVERABLE * ;* ERRORS WILL BE REPORTED BACK TO THE SYSTEM. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DECTAP IS: * ;* * ;* mRD 100400 ; PROTECTED FILE-DEVICE 1 .WORD $TKFNS ; LENGTH .WORD 0 ; ; NOTE: THE FOLLOWING BUFFER HEADER CONTAINS 5 WORDS AND ; WILL BE COUNTED AS A FILE ID ENTRY. HOWEVER, ALL SEARCHES ; WILL GO TO 'CDIMGE' BEFORE THEY GET TO THIS ENTRY. ; ID'S OF 'NDISCS+$SYSFL' OR LESS ARE ILLEGAL FOR FILE ; MANAGEMENT OPERATIONS. HENCE, THIS WILL BE TREATED AS A ; DUMMY ENTRY EXCEPT WHEN UPDATING THE CORE DIRECTORY IMAGE. ; CDIn= . ; QPART LEVEL 07 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP07+QPRT07 ; GET RID OF ENTRYS NOT NEEDED EQPT07 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 8 ; .IFNZ NEQP08 .IFGE PRIP08 oED TO RELOCATE SEGMENT? BEQ SGLA30 ; NO ; ; CALL RSOVLY TO RESOLVE ADDRESSES POINTED TO BY ; SEGMENT TRAILER. ; BR SGLA30 ; ; HERE IF DISC ROLL-IN NOT REQUIRED TO GET ; REGISTERS IN SHAPE ; SGLA20 = . ADD #SGFLID,R0 ; ADDRESS OF SGMT DATA BUFFER ADD #HIOLST,R4 ; ADDRESS OF I/O LIST SGLA30: MOV 16.(SP),R3 ; GET RETURN TYPE REQUESTED BEQ SGLC00 ; TYp MOV #LIST,-(SP) * ;* EMT DECTAP * ;* * ;* WHERE LIST IS THE STANDARD ROS I/O LIST WITH THE * ;* FOLLOWING EXCEPTION: * ;* WORD 3, BYTE 1 (USUALLY LEVEL) CONTAINS THE I/O * ;* FUNCTION OF THE REQUEST: * ;* qHDR = . ; HEADER FOR CORE DIR. IMAGE I/O .WORD NDISCS+3 ; FILE ID .BYTE 1 ; USE DIRECTORY INFO CDIFCN: .BYTE 1 ; WRITE I/O FCN .WORD 0,0,0 ; FILE = . .=DOD+NCRLOC CDEND = . ; END OF CORE RESIDENT DIRECTORY . = $CDISZ*64.*2+FILE ; RESERVE A MULTIPLE OF 64 WORDS ; .IFNZ DRESDI ; DODADD = . .WORD DOD1 ; ADDRESS OF DOD r; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP08 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO sPE 0, USE PC ON STACK ASL R3 ; DOUBLE TO REFLECT LOCATION INDEX ADD #SGSTRT-2,R3 ; DISP. IN SEGMENT TO START EXECUTION ; ; AT - 2 TO TAKE CARE OF RETURN'S ; ; STARTING WITH 1 ADD SGADDR-HIOLST(R4),R3 ; ADDRESS TO RESUME EXECUTION AT MOV R3,18.(SP) ; PLACE ON STACK FOR PROPER RETURN SGLA40: MOVB PSTATS-SGFLID(R0),(R2) ; RESTORE PARTITION STATUS t * ;* 0=READ DATA BLOCK N * ;* 1= WRITE DATA BLOCK N * ;* * ;* THE DECTAPE TRANSPORT WILL BE COMMANDED TO STOP AFTER * ;* ALL TRANSFERS * ;* * ;*uDEVICE 1 ; .IFG NDISCS-1 .WORD DOD2 ; ADDRESS OF DOD DEVICE 2 .ENDC ; .IFG NDISCS-2 .WORD DOD3 ; ADDRESS OF DOD DEVICE 3 .ENDC ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; .ENDC .PAGE ; ; DISC HARDWARE-SOFTWARE INTERFACE INFORMATION ; ; ; FUNCTION TABLE FOR RF-11 AND DDS DISC CONTROLLER. ; BITS 02:01 OF DISC CONTROL STATUS REGISTER ; FCNTBL = . .v.WORD QPRT08 ; PUSH ADDRESS .WORD QPRT08 ; PULL ADDRESS .WORD EQPT08 ; BOTTOM OF QUEUE .WORD QPRT08 ; TOP OF QUEUE .BYTE NEQP08-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT08 = . ; QPART LEVEL 08 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,w TST (SP)+ ; POP PSR OFF STACK JSR R5,POPR ; RESTORE TASK'S REGISTERS CMP (SP)+,(SP)+ ; POP STACK SO RETURN PC NEXT SGLA50: RTS PC ; RETURN TO SEGMENT OR MAIN ; ; SAVE RETURN PC FOR GOBACK ; SGLB00 = . MOV R3,RETURN(R0) ; SAVE PC IN SEGMENT HEADER BR SGLA10 ; ; TYPE 0 RETURN, USE PC ON STACK ; SGLC00 = . MOV 14.(SP),18.(SP) ; PLACE FOR PROPER Rx THE DATA BUFFER LAYOUT IS AS FOLLOWS: * ;* WORD 0= BLOCK NUMBER N. IF NEGATIVE, THEN * ;* READ OR WRITE IN BACKWARD DIRECTION. * ;* WORD 1= NUMBER OF WORDS TO TRANSFER. * ;* WORDS 2- N = BUFFER FOR DATA TRANSFER. * ;* * ;* IF AN ERROR OCCURS, WORD 4 OF THE I/O LIST (ERROR) yBYTE 4 ; READ FUNCTION .BYTE 2 ; WRITE FCN .BYTE 6 ; WRITE CHECK FCN PRIME = . .BYTE 1 .BYTE 0 .BYTE 2 .EVEN ; NRETRY = 10. ; NO. OF RETRIES IF DISC ERROR ; ; DCS = . ; DISC CONTROL AND STATUS REGISTER .IFZ $DDSDC .WORD 177460,0,0 .ENDC .IFNZ $DDSDC .WORD 165300,0,0 .ENDC .z0,0,0 .=4*NEQP08+QPRT08 ; GET RID OF ENTRYS NOT NEEDED EQPT08 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 9 ; .IFNZ NEQP09 .IFGE PRIP09 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP09 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE {ETURN BR SGLA40 ; ; ERROR OCCURRED DURING SGLOAD PROCESS ; ABORT REQUESTING TASK AND RETURN TO SYSTEM ; SGLD00 = . MOV (SP)+,PSR ; RESET LOCKOUT IN CASE SET JSR R5,POPR ; RESTORE REGS TO CONSERVE STACK SPACE MOV $CTASK,-(SP) ; TASK NUMBER TO STACK ; EVENTUALLY WILL PUT A REASON FOR ABORT ON STACK JSR PC,ABORT ; ABORT TASK AND RETURN ON SYSTEM JMP DSPTCH ; | * ;* WILL CONTAIN THE DECTAPE I/O ERROR CODE UPON REQUEST * ;* COMPLETION. VALUES OF ERROR ARE: * ;* * ;* 0 = I/O SUCCESSFUL * ;* 201 = LIST ALREADY QUEUED * ;* 202 = INVALID DEVICE NO. * ;* 203 = ILLEGAL EXIT TYPE REQUESTED }=DCS+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; WCR = . ; WORD COUNT REGISTER .IFZ $DDSDC .WORD 177462,0,0 .ENDC .IFNZ $DDSDC .WORD 165302,0,0 .ENDC .=WCR+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; CMA = . ; CURRENT MEMORY ADDRESS .IFZ $DDSDC .WORD 177464,0,0 .ENDC .IFNZ $DDSDC .WORD 165304,0,0 .ENDC ~TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT09 ; PUSH ADDRESS .WORD QPRT09 ; PULL ADDRESS .WORD EQPT09 ; BOTTOM OF QUEUE .WORD QPRT09 ; TOP OF QUEUE  STACK-GO TO DISPATCHER ; .PAGE ; ; GOBACK ; GOBACK = . JSR R5,PUSHR ; SAVE REGISTERS MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV ACTIVE,R4 ; GET TASK HEADER ADDRESS BEQ GOB050 ; TASK NOT ACTIVE, IGNORE REQUEST CMP #OVTMIN,$CTASK ; TASK AN OVERLAY? BLT SGLD00 ; NO-ERROR, ABORT TASK MO * ;* 204 = ILLEGAL I/O FUNCTION REQUESTED * ;* 205 = ILLEGAL BLOCK NO. REQUESTED * ;* 206 = TAPE I/O ERROR, I/O NOT COMPLETE * ;* NOTE:DTCSR WILL BE FOUND IN LIST * ;* SYSTEM WORD. * ;* * ;* .=CMA+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; DAR = . ; DISC ADDRESS REGISTER .IFZ $DDSDC .WORD 177466,0,0 .ENDC .IFNZ $DDSDC .WORD 165306,0,0 .ENDC .=DAR+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; DAE = . ; DISC ADDRESS EXTENSION .IFZ $DDSDC .WORD 177470,0,0 .ENDC .IFNZ $DDSDC .WORD 165310,0,0 . .BYTE NEQP09-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT09 = . ; QPART LEVEL 09 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP09+QPRT09 ; GET RID OF ENTRYS NOT NEEDED EQPT09 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER V SGADDR(R4),R0 ; GET RELATIVE ADDRESS OF SEGMENT AREA BEQ SGLD00 ; DOESN'T EXIST- ERROR, ABORT TASK ADD R4,R0 ; ACTUAL ADDRESS OF SEGMENT MOV R0,R5 ; CALCULATE EXTENT OF ADD SGLNGT(R4),R5 ; TASK'S SEGMENT AREA MOV 14.(SP),R3 ; FROM WHERE CALLED CMP R0,R3 ; CALLED FROM WITHIN SEGMENT AREA? BGT SGLD00 ; NO- ABORT TASK CMP R5,R3 * ;* * ;* * ;* * ;* REGISTERS R0 THRU R5 WILL BE SAVED * ;* * ;* PROGRAMMER 54 * ;* DATE ENDC .=DAE+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; ; THE FOLLOWING EQUATES ARE USED TO DETERMINE IF ; ERRORS OCCURRED AND IF SO, IF THEY ARE RETRIABLE. IT IS ; ASSUMMED THAT ALL DEVICES ARE ALIKE AND HAVE SOME- ; WHAT SIMILAR DCS, DAR AND DAE REGISTERS AS THE ; DEC RF-11. ; .IFZ $DDSDC ; THE FOLLOWING MASKS ARE FOR THE RF-11 ; DERMSK = 100000 ; DISC ERROR MASK FOR DCS ; RETDCS = 031000 ; RETRIABLE.ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 10 ; .IFNZ NEQP10 .IFGE PRIP10 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP10 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 BLT SGLD00 ; NO- ABORT TASK MOV RETURN(R0),14.(SP) ; PLACE RETURN FROM SEGMENT ; ; HEADER FOR PROPER RETURN GOB050: MOV (SP)+,PSR ; RESET PRIORITY LOCKOUT JSR R5,POPR ; RESTORE REGISTERS RTS PC ; RETURN TO TASK'S MAIN ROOT ; .ENDC ; MATCH FOR .IFNZ $SGMNT .END * ;* REVISION * ;* * ;*********************************************************************** .DEF DECTAP,DTINT .REF PUSHR,POPR,LOGMAX,PHYDEV,ACTIVE,$CTASK,IOSTAT .REF RESTOR,QSAVEI,DSPTCH,UNSPND,RELTSK,QUEUE .REF ERRTYP ; .CSECT DTIO ; ; DECTAP = . JSR R5,PUSHR DCS ERRORS ; ; BIT 13 = WRITE CHECK ERROR ; ; BIT 12 = DATA PARITY ERROR ; ; BIT 09 = MISSED XFER RETDAE = 170000 ; RETRIABLE DAE ERRORS ; ; BIT 15 = ADDRESS PARITY ERROR ; ; BIT 14 = A TIMING TRACK ERROR ; ; BIT 13 = B TIMING TRACK ERROR ; ; BIT 12 = C TIMING TRACK ERROR ; ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT10 ; PUSH ADDRESS .WORD QPRT10 ; PULL ADDRESS .WORD EQPT10 ; BOTTOM OF QUEUE .WORD QPRT10 ; TOP OF QUEUE .BYTE NEQP10-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT10 = . ; QPART LEVEL 10 BEGIN .WORD 0,; UPDATE 2 25 APR 1972 FIX ERROR RETURNS IN GETELT & FILECK ; UPDATE 1 21 APR 1972 FIX GETELT'S ELEMENT DISPLACEMENT .TITLE BFUP ; BFUP ;***********************************************************************BFUP ; *BFUP ; B F U P *BFUP ; ; SAVE CALLER'S REGISTERS MOV PSR,-(SP) ; SAVE PROCESSOR STATUS REGISTER MOV 16.(SP),R1 ; GET I/O REQUEST LIST MOV #ERR001,R0 ; PRESET ERROR REGISTER MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC (R1) ; DECREMENT REQUEST THREAD WORD BNE DTPA50 ; ERROR - LIST NOT AVAILABLE MOV (SP),PSR ; RESET PRIORITY LOCKOUT INC R0 ; BUMP ERROR REGISTER .ENDC .IFNZ $DDSDC ; ; THE FOLLOWING MASKS ARE FOR THE DDS DISC ; DERMSK = 100000 ; DISC ERROR MASK FOR DCS ; RETDCS = 031000 ; RETRIABLE DCS ERRORS ; ; BIT 13 = WRITE CHECK ERROR ; ; BIT 12 = BLOCK CHECK ERROR ; ; BIT 9 = MISSED XFER RETDAE = 0 ; NO RETRIABLE DAE ERRORS .ENDC ; .IFNZ ERRPRT ; ; 0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP10+QPRT10 ; GET RID OF ENTRYS NOT NEEDED EQPT10 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 11 ; .IFNZ NEQP11 .IFGE PRIP11 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP11 *BFUP ; PROGRAM IDENTIFICATION: BFUP - BATCH FILE UTILITY PROCESSOR *BFUP ; *BFUP ; PURPOSE: THIS SERIES OF ROUTINES ALLOWS A USER TO MANIPULATE *BFUP ; A BATCH FILE AND ITS ELEMENTS. THE FUNCTIONS *BFUP ; PROVIDED ARE: *BFUP ; BFINIT - INITIALIZE A ROS FILE FOR BFUP USE *BFUP ; MOVB DEVICE(R1),R4 ; GET LOGICAL DEVICE NUMBER CMP R4,LOGMAX ; IS IT WITHIN REQUIRED RANGE? BHI DTPA60 ; YES-ERROR - NOT A LEGAL DEVICE ASL R4 ; CONVERT TO WORD INDEX MOV PHYDEV(R4),R5 ; GET PHYSICAL DESCRIPTOR THIS DEVICE BMI DTPA60 ; ERROR-DEVICE NOT AVAILABLE SWAB R5 ; CHECK STATUS INFO. BIC #360,R5 ; ISOLATE TYPE IN LOWER BYTE CM DISC ERROR MESSAGE PRINTOUT MODULES ; ERMOD1 = . .WORD 1,0,0,0,0,0 ; ERROR MODULE DEVICE 0 ; .IFG NDISCS-1 ERMOD2 = . .WORD 1,0,1,0,0,0 ; ERROR MODULE DEVICE 1 .ENDC ; .IFG NDISCS-2 ERMOD3 = . .WORD 1,0,2,0,0,0 ; ERROR MODULE DEVICE 2 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; ADDRESS OF ERROR MODULES ; ERRMOD = . .WORD ERMOD1 ; ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT11 ; PUSH ADDRESS .WORD QPRT11 BFENTR - ENTER A NEW ELEMENT IN THE BFUP *BFUP ; DIRECTORY AND PREPARE IT FOR CREATION *BFUP ; BFOPEN - MARK AN EXISTING ELEMENT AS BEING READ*BFUP ; AND RETRIEVE THE LOCATION AND LENGTH *BFUP ; BFCLOS - FREE AN OPEN ELEMENT *BFUP ; UPDATE DIRECTORY ENTRY IF ELEMENT IS *BFUP ; BEING CREATED PB R5,#DVTYPE ; DEVICE TYPE A DECTAPE UNIT? BNE DTPA60 ; ERROR- NOT CORRECT DEVICE TYPE SWAB R5 CLR SYSTEM(R1) ; INITIALIZE MOVB R5,SYSTEM(R1) ; SAVE DECTAPE UNIT #IN SYSTEM WORD INC R0 ; BUMP ERROR REGISTER MOVB TYPE(R1),R2 ; LEGAL EXIT TYPE? BLE DTPA60 ; NO -ERROR CMP R2,#3. ; MUST BE 1,2, OR 3 BGT DTPA60 ; ERROR .IFG NDISCS-1 .WORD ERMOD2 .ENDC ; .IFG NDISCS-2 .WORD ERMOD3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; EQUATES FOR ERROR MODULES ; THREAD = 0. ; THREAD WORD ERRNUM = 2. ; ERROR NUMBER ARGM1 = 4. ; ARGUMENT 1 ARGM2 = 6. ; ARGUMENT 2 ARGM3 = 8. ; ARGUMENT 3 ARGM4 = 10. ; ARGUMENT 4 ; ; PULL ADDRESS .WORD EQPT11 ; BOTTOM OF QUEUE .WORD QPRT11 ; TOP OF QUEUE .BYTE NEQP11-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT11 = . ; QPART LEVEL 11 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP11+QPRT11 ; GET RID OF ENTRYS NOT NE *BFUP ; BFDELT - MARK AN EXISTING ELEMENT FOR DELETION *BFUP ; *BFUP ; METHOD: THE METHOD USED IS TO USE THREE TYPES OF TABLES. *BFUP ; THESE ARE: *BFUP ; 1) BFUP COMMUNICATIONS BLOCK WHICH CONTAINS ALL *BFUP ; COMMUNICATION BETWEEN BFUP AND THE USER. IT IS*BFUP ; PROVID INC R0 ; BUMP ERROR TYPE REG. CMPB #1.,IOFCN(R1) ; LEGAL I/O FUNCTION? BLO DTPA60 ; 0 OR 1 -OTHERWISE ERROR INC R0 ; BUMP YOU KNOW WHO AGAIN MOV DATA(R1),R4 ; ADDRESS OF DATA BUFFER MOV (R4),R2 ; GET BLOCK NO. OF REQUEST BPL DTPA10 NEG R2 ; ADJUST FOR ERROR CHECK DTPA10: CMP R2,#577. ; 578 IS TOTAL NO. OF BLOCKS BGT DTPA .ENDC ; .PAGE ; ; THE FOLLOWING IS FOR THE DISC TIMER MODULES AND ; TIMEOUT COMPLETE SUBROUTINE 'TIMOUT' ; MSEC = MSECR ; MILLISECOND TIMER RESOLUTION ; JOMSEC = 21!MSEC ; OPTION BYTE-J OPTION, MSEC RESOLUTION ; RESTIM = 4. ; WORD TO RESET TIMER AT TIMJSR = 6. ; WORD TO CHANGE TIMER JSR AT ; .WORD 0 ; DEVICE 0 TIMER MODULE DTIMR1 = . .WORD 1 EDED EQPT11 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 12 ; .IFNZ NEQP12 .IFGE PRIP12 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP12 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES ED BY THE USER. *BFUP ; WORD 0 STATUS CODE OF OPERATION *BFUP ; WORD 1 ID OF ROS FILE TO USE *BFUP ; WORD 2&3 ELEMENT NAME IN RAD50 (6 CHARS)*BFUP ; WORD 4 BYTE 0 RESERVED FOR BFUP USE *BFUP ; WORD 4 BYTE 1 ELEMENT TYPE *BFUP ; WORD 5 ELEMENT'S RELATIVE START SECTOR*60 ; WHOOPS-ERROR CLR ERROR(R1) ; INITIALIZE ERROR WORD MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV R1,@DTLAST ; THREAD REQUEST MOV R1,DTLAST ; IN DECTAPE QUEUE TST ACTIVE ; REQUESTED BY A TASK? BEQ DTPA20 ; NO MOV $CTASK,R3 ; YES-GET CURRENTLY ACTIVE TASK NO. MOVB R3,SYSTEM+1(R1) ; SAVE IN HIGH BYTE OF SYSTEM WORD INCB IOSTAT(R3) ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE JOMSEC ; OPTION BYTE .WORD 0 ; RESET/TIMER .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE ADDRESS ; .IFG NDISCS-1 .WORD 1 ; DEVICE 1 TIMER MODULE DTIMR2 = . .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE JOMSEC ; OPTION BYTE .WORD 0 .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT12 ; PUSH ADDRESS .WORD QPRT12 ; PULL ADDRESS .WORD EQPT12 ; BOTTOM OF QUEUE .WORD QPRT12 ; TOP OF QUEUE .BYTE NEQP12-1 ; MAX. ENTRIES -1 .BYTE 0 BFUP ; WORD 6 ELEMENT'S LENGTH IN SECTORS *BFUP ; *BFUP ; 2) ELEMENT DIRECTORY ENTRY WHICH RECORDS EACH *BFUP ; ELEMENT'S PERTINENT INFORMATION ON DISK. *BFUP ; SECTORS 0-31. ARE USED. EACH ENTRY REQUIRES *BFUP ; 8 WORDS. THEREFOR EACH SECTOR HOLDS 8 ENTRIES *BFUP ; GIVING A TOT ; BUMP I/O STATUS THIS TASK DTPA20: INC NDTREQ ; BUMP NUMBER OF REQUESTS BEQ DTPB00 ; FIRST ONE BR DTPC20 ; WAIT IN TURN- EXIT AS SPECIFIED ; DTPA50 = . INC (R1) ; SET THREAD WORD BACK MOV (SP),PSR ; RESET PRIORITY LOCKOUT DTPA60: JSR PC,ERR ; REPORT ERROR AS PROMISED BR DTPC30 ; AND RETURN TO CALLER ; ; GET A REQUEST FROM THE DECTAPE QUEUE ; RESET/TIMER .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE .ENDC ; .IFG NDISCS-2 .WORD 2 ; DEVICE 2 TIMER MODULE DTIMR3 = . .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE JOMSEC ; OPTION BYTE .WORD 0 ; RESET/TIMER .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE ADDRESS .ENDC ; ; EXPAND IF MORE T ; ALLOCATION SWITCH .ENDC QPRT12 = . ; QPART LEVEL 12 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP12+QPRT12 ; GET RID OF ENTRYS NOT NEEDED EQPT12 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 13 AL OF 256 BLOCKS. THE FIRST ENTRY *BFUP ; IS USED FOR FILE HOUSE KEEPING WHICH LEAVES *BFUP ; A MAXIMUM OF 255 ELEMENTS/FILE. *BFUP ; *BFUP ; 3) FILE DATA BLOCK - THIS IS THE FIRST DIRECTORY *BFUP ; ENTRY (REFERED TO AS 'ENTRY 0') AND CONTAINS *BFUP ; THE FILES STATUS, FLAGS, ETC. *BFUP AND PROCESS ; DTPB00 = . CLRB CALLED ; SET CALLED BY REQUEST SWITCH DTPB05: MOV (SP),PSR ; RESET PRIORITY LOCKOUT DTPB10 = . MOV DTFRST,R1 ; GET REQUEST AT HEAD MOV DATA(R1),R4 ; DATA BUFFER ADDRESS CLR R2 ; USE TO BUILD COMMANDS MOV (R4)+,R3 ; GET REQUESTED START BLOCK BPL DTPB20 ; READ/WRITE BLOCK FORWARD MOV #4000,R2 ; READHAN 3 DISC DEVICE CONTROLLERS ; ; ONE HUNDRED MILLISECOND TIME DELAY SET WORD ; TDELAY = . .BYTE 100. ; MULTIPLE .BYTE 0 ; ONE-SHOT ; ; USED TO IGNORE DISC TIME-OUT ; NOPTIM: RTS PC ; RETURN TO TIMER ; ; TIMER MODULE ADDRESSES ; TMTBL = . .WORD DTIMR1 ; TIMER MODULE DISC UNIT 0 ; .IFG NDISCS-1 .WORD DTIMR2 ; TIMER MODULE DISC UNIT 1 .; .IFNZ NEQP13 .IFGE PRIP13 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP13 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD ; *BFUP ; THE USER MAY DEFINE HIS ROS FILE TO ANY SIZE > 32 *BFUP ; SECTORS. EACH ELEMENT WILL ONLY USE THE SPACE IT *BFUP ; REQUIRES. TO PERMIT THIS, ONLY 1 ELEMENT MAYBE *BFUP ; CREATED AT A TIME IN EACH BFUP FILE. ON THE OTHER *BFUP ; HAND, UP TO 127 ELEMENTS MAYBE READ AT ONE TIME. *BFUP ; THE SPACE OVER THE 32 SEC/WRITE BLOCK BACKWARD NEG R3 ; TWO'S COMP. BLOCK NO. DTPB20: MOV R3,BLNORQ ; SET REQUESTED BLOCK NO. MOV R3,BLKCTL ; AND BLOCK SEARCH CONTROL MOVB SYSTEM(R1),R3 ; GET DECTAPE UNIT NO. SWAB R3 ; IN HIGH ORDER POSITION BIS R3,R2 ; SET IN COMMAND BEING BUILT MOV R2,CDTCM ; SET IN CURRENT DECTAPE COMMAND MOVB IOFCN(R1),R3 ; GET XFER TYPE REQUESTED ENDC ; .IFG NDISCS-2 .WORD DTIMR3 ; TIMER MODULE DISC UNIT 2 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; ; TIMER COMPLETE RECEIVED SWITCHES ; TMCRSW = . .BYTE 0,0,0 ; SWITCHES TO KEEP CONFLICT ; ; BETWEEN DISC INTERRUPT AND ; ; TIMER CALL FROM HAPPENING ; .=TMCRSW+NDISCS ; USE ONLY WHATS NEEDED .EVEN ; ; EX 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT13 ; PUSH ADDRESS .WORD QPRT13 ; PULL ADDRESS .WORD EQPT13 ; BOTTOM OF QUEUE .WORD QPRT13 ; TOP OF QUEUE .BYTE NEQP13-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT13 = . ; QPART LEVEL 13 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 TORS USED FOR THE DIRECTORY *BFUP ; IS COMPLETLY AVAILABLE FOR USER DATA. *BFUP ; *BFUP ; EACH USER REQUEST WILL, IF'COMPLETED, UPDATE THE *BFUP ; ELEMENTS DIRECTORY AND, IF REQUIRED, THE FILE'S *BFUP ; DATA BLOCK. IF NOT COMPLETED IT WILL RETURN AN ERROR *BFUP ; CODE IN THE COMMUNICATIONS BLOCK. *BFUP ; BISB FCNTBL(R3),R2 ; BUILD FINAL XFER COMMAND WITH ; ; DIRECTION,UNIT,INT.ENABLE, ; ; FCN AND GO. MOV R2,DTXFRC ; SAVE FOR LATER MOV (R4)+,DTNOWD ; NO. OF WORDS TO XFER NEG DTNOWD ; TWO'S COMPLEMENT IS NEEDED MOV R4,DTXFRA ; ADDRESS OF XFER START MOVB #103,CDTCM ; SET UP TO READ BLOCK NUMBERS CLR MODE ; SET PAND FOR MORE THAN 3 DISC DEVICE CONTROLLERS ; .PAGE ; ; THE FOLLOWING IS USED TO CONTROL THE COMPRESSION INTERLOCK ; PROTECTION FEATURE. ; CPRSIP: .WORD -1. ; COMPRESSION IN PROGRESS FLAG ; .PAGE ; ; EQUATES FOR TASK PROGRAM HEADERS ; THREAD = 0. ; THREAD WORD ENTRY = 2. ; TASK ENTRY POINT INITPT = 4. ; TASK INITIALIZATION ENTRY MAXT = 6. ; MAXIMUM EXECUT.WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP13+QPRT13 ; GET RID OF ENTRYS NOT NEEDED EQPT13 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 14 ; .IFNZ NEQP14 .IFGE PRIP14 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP14 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; *BFUP ; ONLY ONE CALL TO BFUP CAN BE ACTIVE. CONTROL IS NOT *BFUP ; RETURNED UNTIL A REQUEST IS COMPLETED. *BFUP ; *BFUP ; DEFINITIONS: FILE - A ROS DEFINED FILE *BFUP ; BFUP FILE - A FILE PROCESSED BY BFINIT TO SETUP *BFUP ; THE BFUP DIRECSEARCH MODE MOVB #NTRYS,NOTRYS ; INIT. ERROR RETRY COUNTER DTPC00: MOV CDTCM,DTCMR ; START DECTAPE SEARCH/I/O XFER TSTB CALLED ; CALLED FROM INTERRUPT? BEQ DTPC20 ; NO DTPC10: MOV (SP)+,PSR ; POP PSR OFF STACK - RESET LOCKOUT JMP RESTOR ; RESTORE FROM INTERRUPT ; ; EXIT AS SPECIFIED BY CALLER ; R1= I/O LIST ADDRESS ; DTPC20 = . CMPB TYPE(R1),#2. ; EXIT TION TIME FLAGS = 8. ; TASK STATUS FLAG BITS ,BYTE. HPRIOR = 9. ; TASK PRIORITY CTIMER = 10. ; CURRENT TIMER VALUE TARG = CTIMER+ARG+ARG ; ARGUMENT (OPTIONAL) CPUST = TARG+2 ; CPU STATUS REGISTER (BYTE) TASKNO = CPUST+1 ;TASK NUMBER (BYTE) TSTACK = TASKNO+1 ; SAVED STACK POINTER REGSV = TSTACK+2 ; REGISTER SAVE AREA ; ; EQUATES FOR I/O THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT14 ; PUSH ADDRESS .WORD QPRT14 ; PULL ADDRESS .WORD EQPT14 ; BOTTOM OF TORY. *BFUP ; ELEMENT - A SINGLE COLLECTION OF DATA IN A BFUP *BFUP ; FILE. IT IS IDENTIFIED BY A UNIQUE *BFUP ; 6 CHARACTER NAME AND TYPE CODE. *BFUP ; TYPE - EACH ELEMENT IS FLAGED AS TO ITS TYPE. *BFUP ; CURRENT TYPES ARE: *BFUP ; 0 - OBJECT (OUTPUT OF RASM) *BFUP ; YPE 2 WANTED? BEQ DTPC40 ; YES DTPC30 = . ; NO- MOV (SP)+,PSR ; RESET PSR JUST INCASE SET JSR R5,POPR ; RESTORE REGISTERS MOV (SP)+,(SP) ; FOR PROPER RETURN RTS PC ; RETURN TO CALLER ; DTPC40 = . MOV (SP),PSR ; RESET JUST IN CASE MOV (SP)+,14.(SP) ; SAVE FOR QSAVEI CALL JSR R5,POPR ; RESTORE REGISTERS PARAMETER LIST ; THREAD = 0. ; LIST THREAD WORD DEVICE = 2. ; LOGICAL DEVICE NUMBER TYPE = 3. ; EXIT TYPE EXIT = 4. ; I/O COMPLETE ADDRESS IF TYPE = 3 ERRTSK = 6. ; TASK # TO QUEUE IF I/O ERROR LEVEL = 7. ; DISC PRIORITY LEVEL OF I/O REQUEST ERROR = 8. ; I/O ERROR INDICATOR SYSTEM = 10. ; RESERVED FOR DISCIO DATA = 12. QUEUE .WORD QPRT14 ; TOP OF QUEUE .BYTE NEQP14-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT14 = . ; QPART LEVEL 14 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP14+QPRT14 ; GET RID OF ENTRYS NOT NEEDED EQPT14 = .-2 ; END OF THIS LEVEL'S QPART 1 - LOAD (OUTPUT OF ROSLOD) *BFUP ; 2 - GENERAL SYMBOLIC *BFUP ; 3 - RASM SYMBOLIC *BFUP ; 4 - FORTRAN SYMBOLIC *BFUP ; 5 - DATA SYMBOLIC *BFUP ; *BFUP ; LINKAGE: ALL BFUP ROUTINES ARE USED WITH A ST CLR -(SP) ; VOLUNTARY SUSPEND JSR PC,QSAVEI ; DO IT JMP DSPTCH ; GO TO ROS DISPATCHER ; .PAGE ; ; DECTAPE INTERRUPT ; DTINT = . $SAVE ; SAVE ENVIRONMENT MOV PSR,-(SP) ; SAVE PROCESSOR STATUS MOVB #1,CALLED ; SET CALLED BY INTERRUPT TST MODE ; SEARCH OR XFER INTERRUPT? BMI XFRINT ; TRANSFER ; ; ; ADDRESS OF I/O BUFFER ; ; EQUATES FOR I/O BUFFER ; FILEID = 0. ; FILE IDENTIFICATION NO. SCFLAG = 2. ; SECTOR FLAG INOUT = 3. ; INPUT FUNCTION DUSE1 = 4. ; RESERVED FOR DISCIO DUSE2 = 6. ; RESERVED FOR DISCIO DUSE3 = 8. ; RESERVED FOR DISCIO RLSECT = 10. ; RELATIVE SECTOR ADDRESS NWORD = 12. ; NO. OF WORDS IN XFER T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 15 ; .IFNZ NEQP15 .IFGE PRIP15 ; GENERATE TIME-SLICED OR FIXED HEA .IFG PRIP15 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABANDARD LINKAGE. *BFUP ; IT IS: *BFUP ; *BFUP ; MOV #COMBLK,-(SP) (RASM) *BFUP ; EMT BFUP ROUTINE *BFUP ; *BFUP ; CALL BFUP ROUTINE(COMBLK) (FORTRAN) *BFUP ; RECORD NUMBER SEARCH IN PROGRESS ; TST DTCMR ; ERROR OCCUR? BMI SRCHER ; GO INVESTIGATE BIT #4000,CDTCM ; CURRENT TRAVEL? BNE BKWD ; BACKWARD CMP DTDR,BLNORQ ; CHECK BLOCK FOUND BEQ BFND ; GOT BLOCK REQUESTED BMI TARND2 ; SHOULD GET TO IT THIS WAY TARND: MOV #4000,-(SP) ; NO-MUST TURN AROUND MOV #2,-(SP) ; ASSUME TRAVEL ; ; EQUATES FOR RELATIVE FILE POSITIONS ; FILEID = 0. ; FILE ID SCTR = 2. ; SECTOR FTYPE = 4. ; FILE TYPE PDVCE = 5. ; PROTECT STATUS AND DEVICE LGTH = 6. ; FILE LENGTH CKSAVE = 8. ; CHECKPOINTS SECTOR ADDRESS ; ; DISC ERROR NUMBER PARAMETERS ; ERR001 = 1. ; LIST ALREADY IN QUEUE ERR002 = 2. ; INVALID DEVICE NUMBER RT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD QPRT15 ; PUSH ADDRESS .WORD QPRT15 ; PULL ADDRESS .WORD EQPT15 ; BOTTOM OF QUEUE .WORD QPRT15 ; TOP OF QUEUE .BYTE NEQP15-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT15 = *BFUP ; WHERE COMBLK IS THE ADDRESS OF A BFUP COMMUNICATIONS *BFUP ; BLOCK *BFUP ; *BFUP ; THE VARIOUS ROUTINES REQUIRE THE FOLLOWING INFO. *BFUP ; BFINIT ROS ID *BFUP ; BFENTR ROS ID, NAME, TYPE NOW FORWARD BIT #4000,CDTCM ; CHECK DIRECTION BEQ TARND1 ; IF FORWARD-OMIT NEG 2(SP) ; BACKWARD - REVERSE NEG (SP) ; EVERYTHING TARND1: SUB (SP)+,BLNORQ ; ALLOW TWO BLOCKS FOR TURN AROUND ADD (SP)+,CDTCM ; REVERSE TRAVEL TARND2: JMP DTPC00 ; CONTINUE SEARCH ; BKWD: CMP DTDR,BLNORQ ; CHECK BLOCK NUMBER FOUND BEQ BFND ; GOT BLOCK REQUESTE ERR003 = 3. ; ILLEGAL EXIT TYPE ERR004 = 4. ; ILLEGAL PRIORITY LEVEL ERR005 = 5. ; ILLEGAL FILE ID OR IFD ERR006 = 6. ; ILLEGAL I/O FUNCTION ERR007 = 7. ; NON-EXISTENT FILE ID ERR008 = 8. ; # WORDS IN I/O GREATER THAN FILE SIZE ERR009 = 9. ; REQUEST NO WHOLLY CONTAINED IN FILE ERR010 = 10. ; DISCIO WRITE REQUEST IN PROTECTED FILE ERR011 = . ; QPART LEVEL 15 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .=4*NEQP15+QPRT15 ; GET RID OF ENTRYS NOT NEEDED EQPT15 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; GENERATE QPARTN TABLES FOR RPOM LEVEL 16 ; .IFNZ NEQP16 .IFGE PRIP16 ; GENE *BFUP ; BFOPEN ROS ID, NAME, TYPE *BFUP ; BFCLOS ROS ID, NAME, TYPE, LENGTH *BFUP ; BFDELT ROS ID, NAME, TYPE *BFUP ; *BFUP ; ALL RETURN A STATUS CODE. ADDITIONALLY, BFENTR *BFUP ; AND BFOPEN RETURN A RELATIVE START SECTOR FOR *BFUP ; TRANSFD BPL TARND2 ; SHOULD GET TO IT THIS WAY BR TARND ; TURN AROUND ; ; GOT BLOCK REQUESTED- CHECK IF DIRECTION CORRECT ; BFND: CMP BLNORQ,BLKCTL ; TRAVEL AS ORIGINALLY STORED? BNE TARND ; NO - TURN AROUND MOV #-1.,MODE ; SET XFER MODE SWITCH MOV DTXFRC,CDTCM ; SET-UP DESIRED XFER COMMAND MOV DTNOWD,DTWCR ; SET- UP WORD COUNT REGISTER MOV DTXFRA,DTBAR 11. ; DISC I/O ERROR-I/O NOT COMPLETE ERR012 = 12. ; TIME-OUT ERROR ON XFER ERR013 = 13. ; NO CKSAVE SPECIFIED DURING CHKPIO ERR014 = 14. ; DDS DISC-NOT EVEN # WORDS ; ; ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 000340 ; PRIORITY LOCKOUT MASK FOR PSR .PAGE .TITLE DISCIO,CHKPIO,PFRITE ;*********************************************************************** ;*RATE TIME-SLICED OR FIXED HEA .IFG PRIP16 ; TIME-SLICE SUSPEND TIMER .WORD 1 ; THREAD WORD .BYTE 0 ; DON'T QUEUE TASK .BYTE 20!TRES ; OPTION BYTE, J & TRES .WORD 0 ; RESET/TIMER .WORD TSABRT ; TIMER COMPLETE SUBROUTINE .WORD 0 ; TIME-OUT RACE FLAG .ENDC .WORD 0 ; PARTITION ADDRESS. 0= NOT ALLO .WORD ERS TO BEGIN AT. *BFUP ; *BFUP ; BFUP STATUS CODES ARE: *BFUP ; 0 *BFUP ; 1 *BFUP ; 2 *BFUP ; 3 ; SET-UP BUS ADDRESS REGISTER BR TARND2 ; START I/O ; ; TRANSFER COMPLETE INTERRUPT ; XFRINT = . TST DTCMR ; ERROR OCCUR? BMI XFRERR ; UH-0H CLR R0 ; SET NO ERROR MOVB #10.,DTCMR ; STOP DECTAPE TRANSPORT XFIA05: MOV DTFRST,R1 ; GET CURRENT REQUEST CMPB TYPE(R1),#2. ; IS IT AN EXIT TYPE 2? BNE XFIA10 ; NO CLR DISCIO,CHKPIO,PFRITE * ;* * ;* PROGRAM IDENTIFICATION. DISCIO * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPONSIBLE FOR ALL COMMUNICATIONS * ;* WITH A DISC IN ROS. ALL REQUESTS ARE QUEUED IN A SPECIFIC * ;* DISC PRIORITY. ALL DISC REQUESTS ARE FILE ORIENTED SUCH QPRT16 ; PUSH ADDRESS .WORD QPRT16 ; PULL ADDRESS .WORD EQPT16 ; BOTTOM OF QUEUE .WORD QPRT16 ; TOP OF QUEUE .BYTE NEQP16-1 ; MAX. ENTRIES -1 .BYTE 0 ; ALLOCATION SWITCH .ENDC QPRT16 = . ; QPART LEVEL 16 BEGIN .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 *BFUP ; 4 *BFUP ; 5 *BFUP ; 6 *BFUP ; 7 *BFUP ; 8 *BFUP ; 9 *BFUP ; 10 -(SP) ; YES BISB SYSTEM+1(R1),(SP); SET TASK NO TO UNSUSPEND CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,UNSPND ; UNSUSPEND CALLING TASK-EXIT TYPE 2 TST (SP)+ ; IGNORE ERROR XFIA10: MOV #DTLAST,R4 ; ADDRESS OF DEVICE'S LAST LIST MOV #DTFRST,R3 ; ADDRESS OF DEVICE'S FIRST LIST MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV (R1),(R3) ; PULL REQUEST-SET NEW FIR * ;* THAT THE REQUESTING PROGRAM SUPPLIES A FILE NUMBER (OR IFD) * ;* AND, OPTIONALLY, THE SECTOR NUMBER RELATIVE TO THE BEGINNING * ;* OF THE FILE AND THE NUMBER OF WORDS TO READ/WRITE. * ;* DISCIO WILL HANDLE ERRORS AND REPORT THEM TO THE SYSTEM * ;* IN THE SPECIFIED MANNER. THREE ENTRY POINTS ARE PROVIDED * ;* FOR DISC SERVICE. THEY ARE: * ;* DISCIO-SUBROUTINE TO PERFORM DISC I/O. .=4*NEQP16+QPRT16 ; GET RID OF ENTRYS NOT NEEDED EQPT16 = .-2 ; END OF THIS LEVEL'S QPART T .WORD -1 ; TAIL MARKER .ENDC ; ; ; ; ; THE FOLLOWING TABLE CONTAINS THE ADDRESS OF THE QPART'S ; FOR EACH PRIORITY LEVEL. 0 = DOESN'T EXIST ; QPARTN = .-2 ; TAKE CARE OF ILLEGAL LEVEL 0 .WORD QPRT01,QPRT02 .WORD QPRT03,QPRT04 .WORD QPRT05,QPRT06 .WORD QP *BFUP ; 11 *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, POPR, DISCIO *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *ST BNE XFIA20 ; DIDN'T EMPTY QUEUE MOV R3,(R4) ; SET FIRST = LAST.I.E. EMPTY XFIA20: MOV #1.,(R1) ; SET THREAD WORD OF REQUEST BACK TO 1 CLR R2 BISB SYSTEM+1(R1),R2 ; GET TASK NUMBER SAVED BEQ XFIA30 ; NO TASK- BYPASS DECB IOSTAT(R2) ; RESET I/O IN PROGRESS FOR TASK .IFNZ OVRLAY BNE XFIA30 ; NOT LAST ONE MOV (SP),PSR ; RESET LOCKOUT * ;* CHKPIO-SUBROUTINE FOR SYSTEM USE ONLY TO * ;* PERFORM CHECKPOINT I/O. * ;* PFRITE-SUBROUTINE FOR SYSTEM USE ONLY TO * ;* PERFORM PROTECTED FILE I/O (WRITE). * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DISCIO IS: * ;* RT07,QPRT08 .WORD QPRT09,QPRT10 .WORD QPRT11,QPRT12 .WORD QPRT13,QPRT14 .WORD QPRT15,QPRT16 .=QPARTN+2+NPRIOR+NPRIOR ; GET RID OF ENTRIES NOT NEEDED ; ; ; GENERATE DUMMY SYMBOLS FOR NON-EXISTENT QPART TABLES .IFZ NEQP01 QPRT01 = 0 .ENDC .IFZ NEQP02 QPRT02 = 0 .ENDC .IFZ NEQP03 QPRT03 = 0 .ENDC .IFZ NEQP04 QPRT04 = 0 BFUP ; PROGRAMMER: 53 *BFUP ; DATE: 7-APR-72 *BFUP ; REVISION: *BFUP ; CATALOGUE NUMBER: *BFUP ; *BFUP ;***********************************************************************BFUP .REF PUSHR,POPR ; MOV R2,-(SP) ; TASK NUMBER TO STACK JSR PC,RELTSK ; RELEASE TASK .ENDC XFIA30: MOV (SP),PSR ; RESET LOCKOUT INCASE SET MOV R0,SYSTEM(R1) ; IN CASE DTCSR SET FROM ERROR CMPB TYPE(R1),#3. ; EXIT TYPE 3? BNE XFIA40 ; NO JSR PC,@EXIT(R1) ; EXECUTE I/O COMPLETE SUBROUTINE XFIA40: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC NDTREQ ; DECREMENT # DECTAPE * ;* MOV [LIST],-(SP) * ;* EMT DISCIO * ;* WHERE THE I/O LIST ADDRESS WILL BE FOUND ON THE STACK. * ;* THE FORTRAN EQUIVALENT CALL IS: * ;* * ;* CALL DISCIO(LIST) * ;* .ENDC .IFZ NEQP05 QPRT05 = 0 .ENDC .IFZ NEQP06 QPRT06 = 0 .ENDC .IFZ NEQP07 QPRT07 = 0 .ENDC .IFZ NEQP08 QPRT08 = 0 .ENDC .IFZ NEQP09 QPRT09 = 0 .ENDC .IFZ NEQP10 QPRT10 = 0 .ENDC .IFZ NEQP11 QPRT11 = 0 .ENDC .IFZ NEQP12 QPRT12 = 0 .ENDC .IFZ NEQP13 BFUP .PAGE BFUP ; PARAMETERS USED BY BFUP BFUP ; BFUP ; FILE & ELEMENT STATUS (BYTES) BFUP STAVAL = 0 ; ELEMENT AVAILABLE - FILE FREE BFUP STOPEN = 1 ; ELEMENT BEING READ BFUP REQUESTS LEFT BMI XFIA50 ; EMPTY-RETURN FROM INTERRUPT JMP DTPB05 ; PROCESS NEXT REQUEST XFIA50: JMP DTPC10 ; ; ; ; SEARCH ERROR OCCURRED-EXAMINE ; SRCHER = . TST DTCSR ; IN END ZONE ? BMI TARND ; OK, MEANS TURN AROUND BIT #14000,DTCSR ; TAPE UNIT ON-LINE ? BNE TPMSG ; NO-TELL OPERATOR MOV #10,DTCMR ; STOP TRANSPORT SRER10: * ;* THE LINKAGE TO SUBROUTINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* MOV [LIST],-(SP) * ;* JSR PC,CHKPIO * ;* * ;* AND MOV [LIST],-(SP) * ;* JSR PC,PFRITE QPRT13 = 0 .ENDC .IFZ NEQP14 QPRT14 = 0 .ENDC .IFZ NEQP15 QPRT15 = 0 .ENDC .IFZ NEQP16 QPRT16 = 0 .ENDC ; .PAGE ; ; THE FOLLOWING TABLE CONTAINS THE NUMBER OF (REQUESTS -1) ; PENDING IN EACH PRIORITY LEVEL'S QPART. ; NREQQP = .-1 ; TAKE CARE OF ILLEGAL LEVEL 0 .BYTE -1.,-1.,-1.,-1. .BYTE -1.,-1.,-1.,-1. .BYTE STXUSE = -1 ; ELEMENT BEING CREATED BFUP STDELT = -2 ; ELEMENT DELETED BFUP STFWRT = 200 ; FILE HAS ELEMENT BEING CREATED BFUP ; BFUP ; ELEMENT TYPES (BYTE - SIGN BIT USED BY ROSLOAD) BFUP TYOBJ = 0 ; OBJECT ELEMENT BFUP TYLOD = 1 ; LOAD ELEDECB NOTRYS ; ATTEMPT RETRY? BEQ RPRTER JMP DTPB10 ; YES-RESTART SEARCH RPRTER: MOV #ERR006,R0 ; NO-REPORT ERROR MOV DTFRST,R1 ; GET REQUEST ADDRESS JSR PC,ERR ; PROCESS ERROR SUBROUTINE BR XFIA05 ; DE-QUEUE REQUEST AS SPECIFIED ; ; XFER ERROR OCCURRED-EXAMINE ; XFRERR = . BIT #34000,DTCSR ; TAPE FAILURE/OPERATOR FAULT? BNE TPMSG * ;* FORTRAN EQUIVALENT CALLS DO NOT EXIST FOR CHKPIO AND PFRITE. * ;* * ;* THE I/O PARAMETER LIST IS CONSTRUCTED AS IN THE ROS I SPEC., * ;* PAGE 42. * ;* * ;* THE DATA BUFFER LAYOUT IS AS FOLLOWS: * ;* WORD 0 -1.,-1.,-1.,-1. .BYTE -1.,-1.,-1.,-1. .=NREQQP+1+NPRIOR ; GET RID OF ENTRYS NOT NEEDED .EVEN ; .PAGE ; ; THE FOLLOWING ARE THE ADDRESSES OF THE DEVICE REGISTERS ; FOR THE PERIPHERAL HARDWARE ALLOCATOR B3. ; .IFNZ $CORAL B3FR = 162024 ; FUNCTION REGISTER B3AR = 162022 ; ADDRESS REGISTER(ANSWER REGISTER) B3RR = 162020 ; REQUEST REGISTER .ENDC ; BSYB3 = MENT BFUP TYSYM = 2 ; SYMBOLIC ELEMENT (UNSPECIFIED) BFUP TYASM = 3 ; ASSEMBLER SYMBOLIC ELEMENT BFUP TYFOR = 4 ; FORTRAN SYMBOLIC ELEMENT BFUP TYDATA = 5 ; DATA ELEMENT BFUP ; BFUP ; DIRECTORY ENTRIES (OFFSETS) BFUP DNAME1 ; TELL OPERATOR MOV #10,DTCMR ; STOP TAPE BIT #100400,DTCSR ; FATAL ERROR(END ZONE-N.E.M)? BNE RPRTER ; YES-REPORT ERROR BR SRER10 ; RECOVERABLE-ATTEMPT RETRY ; ; REPORT TAPE NOT ON-LINE OR OPERATOR FAULT ; SHOULD GO WHEN ON LINE??-CHECKOUT ; TPMSG = . MOV DTFRST,R1 ; GET REQUEST ADDRESS CLR TAPENO BISB SYSTEM(R1),TAPENO ; SET TAPE UNIT NO = FILE ID * ;* WORD 1,BYTE 0 = SCFLAG * ;* WORD 1,BYTE 1 = INOUT ; ;* WORD 2 = FOR DISCIO USE * ;* WORD 3 = FOR DISCIO USE * ;* WORD 4 = FOR DISCIO USE * ;* WORD 5 = RLSECT * ;* WORD 000002 ; BUSY MASK FOR B3 BOX SRCHB3 = 000060 ; SEARCH MASK FOR B3 BOX ; ; NOTE: MINIMUM SEARCH ALLOB3 = 000010 ; ALLOCATE MASK FOR B3 BOX DEALB3 = 000004 ; DE-ALLOCATE MASK FOR B3 BOX SERRB3 = 000001 ; SEARCH ERROR MASK FOR B3 BOX ; ; COULDN'T FIND AN AREA ERROR .IFZ $CORAL .REF B3FR,B3AR,B3RR .ENDC ; .PAG = 0 ; FIRST TRIAD OF NAME BFUP DNAME2 = 2 ; SECOND TRIAD OF NAME BFUP DSTAT = 4 ; ELEMENT STATUS BFUP DTYPE = 5 ; ELEMENT TYPE BFUP DHOUR = 6 ; TIME OF CREATION BFUP DMIN = 7 ; BFUP DSEC = 8. ; . MOV #ERRMOD,-(SP) ; ERROR MODULE ADDRESS TO STACK JSR PC,ERRTYP ; TYPE ERROR MESSAGE JMP DTPC10 ; RESTORE FROM INTERRUPT AND WAIT ; ; FOR READY. ; ; ERR IS THE DECTAPE ERROR PROCESSOR ; R0= ERROR NUMBER ; R1 = I/O LIST ADDRESS ; ERR = . MOV R0,ERROR(R1) ; SET I/O NOT SUCCESSFUL MOVB ERRTSK(R1),-(SP); QUEUE AN ERROR TASK? 6 = NWORD * ;* WHERE: * ;* FILEID = FILE IDENTIFICATION NO. IF HIGH ORDER BIT * ;* IS SET, INDEX TO CORE RESIDENT FILE DIRECTORY * ;* (IFD = NO. OF DIRECTORIES TO REQUESTED ONE). * ;* INOUT = READ/WRITE FLAG. 0 = READ, 1 = WRITE, * ;* 2 = WRITE CHECK AND 3 = WRITE WITH WRITE * ;* E ; ; THE FOLLOWING INFORMATION IS THE DYNAMIC CORE ; SPACE DESCRIPTORS. CORE BLOCKS (ONE GRANULE OF CORE ; SPACE) ARE OF SIZE 2**N AND ARE MULTIPLES OF DISC ; SECTORS. ; BCPOOL: .WORD BEGDYN ; BEGINNING ADDRESS OF CORE POOL ; ; SET UP BY INITIALIZATION ECPOOL: .WORD ENDDYN ; ENDING ADDRESS OF CORE POOL ; ; SET UP BY INITIALIZATION BSZ256 = 1 ; BLOCK BFUP DYEAR = 9. ; DATE OF CREATION BFUP DDAY = 10. ; BFUP DMONTH = 11. ; BFUP DSTSEC = 12. ; FIRST SECTOR (RELATIVE) IN ELEMENT BFUP DLENTH = 14. ; NUMBER OF SECTORS IN ELEMENT BFUP ; BFUP ; COMMUNICATBEQ ERRA20 ; NO - POP .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG MOV R1,-(SP) ; SEND I/O LIST ADDRESS AS ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,QUEUE ; QUEUE TASK ERRA20: TST (SP)+ MOV DTCSR,R0 ; SET DECTAPE STATUS REG. IN R0 RTS PC ; RETURN ; .END CHECK, 4 = WRITE AFTER READ (NOTE: THIS * ;* THIS IS AN UPDATE FCN AND MUST BE USED * ;* WITH AN EXIT TYPE 3. THE I/O COMPLETE * ;* SUBROUTINE WILL BE EXECUTED TWICE, ONCE * ;* AFTER READ AND ONCE AFTER WRITE.) * ;* SCFLAG = SECTOR FLAG. 0 = USE RLSECT AND NWORD * ;* 1 = USE FIRST SECTOR ADDRESS FROM FILE * ;* SIZE 256 WORD OPTION ; ; IF SET THEN BLOCK # IN HIGH ; ; ORDER BYTE = # OF WORDS. ; ; DOUBLE FOR NO. LOCATIONS. .IFZ BSZ256 ; ; IF NOT SET USE SHFTCT TO ; ; CALCULATE # WORDS BY SHIFTING SHFTCT = 0 ; SHIFT COUNT USED TO CALCULATE # .ENDC ; ; WORDS FROM # BLION BLOCK (OFFSETS) BFUP BFERR = 0 ; ERROR WORD BFUP BFRFIL = 2 ; ROS FILE ID (THE BFUP FILE) BFUP BFELN1 = 4 ; FIRST TRIAD OF ELEMENT NAME BFUP BFELN2 = 6 ; SECOND TRIAD OF ELEMENT NAME BFUP BFSTAT = 8. ; FOR SYSTEM USE - USUALLY STATUS BFUP BFTYPE = 9. ; ELEMENT TYPE. JSR PC,PFRITE .ENDC RTS PC ; RETURN TO IPL ; ; .END DIRECTORY. * ;* RLSECT = SECTOR ADDRESS RELATIVE TO FIRST SECTOR OF * ;* FILE. * ;* NWORD = NO. OF WORDS IN DISC TRANSFER * ;* * ;* IF SCFLAG = 0, THEN THE AREA FROM WHICH DISC DATA IS * ;* TRANSFERRED TO OR FROM BEGINS AT WORD 6. IF SCFLAG = 1, OCKS ; ; ; ALLOCATION POOL TABLE. CONTAINS START BLOCK IN ; CORE POOL OF SPECIFIED PRIORITY CORE SPACE ; ; CURRENTLY SET UP FOR 3K OF DYNAMIC CORE ; UP TO 12 SEGMENTS ALPOOL = .-1 ; TAKE CARE OF ILLEGAL LEVEL 0 .BYTE $SB001 .BYTE $SB002 .BYTE $SB003 .BYTE $SB004 .BYTE $SB005 .BYTE $SB006 .BYTE $SB007 .BYTE $SB008 .BYTE $SB009 .BYTE $SB010 BFUP BFSEC = 10. ; FIRST SECTOR IN ELEMENT BFUP BFLNTH = 12. ; LENGTH (IN SECTORS) OF ELEMENT BFUP ; BFUP ; MISCELLANEOUS BFUP DIRMAX = 32. ; # OF SECTORS IN DIRECTORY BFUP $DSKIO = 23 ; EMT # OF DISCIO BFUP $GTIME = 31 * ;* THEN THE XFER BEGINS AT WORD 4. * ;* NOTE: 1 SECTOR CODED AT 64 WORDS * ;* * ;* IF AN ERROR OCCURS, WORD 4 OF THE I/O LIST (ERROR) WILL * ;* CONTAIN THE DISC I/O ERROR CODE UPON I/O REQUEST COM- * ;* PLETION. THE VALUES OF SYSTEM ARE: * ;* .BYTE $SB011 .BYTE $SB012 .BYTE $SB013 .BYTE $SB014 .BYTE $SB015 .BYTE $SB016 .=ALPOOL+1+NPRIOR ; GET RID OF ENTRIES NOT NEEDED .EVEN ; .CSECT .DYSIN ; ; DYNAMIC STORAGE INITIALIZATION. ; CALLED BY IPL TO INITIALIZE STORAGE ALLOCATOR TO SIZE ; OF DYNAMIC CORE AND RESERVE FIXED OR TIME-SLICED PARTITIONS ; IF NECESSARY. ; NOTE: WHEN B3 DEFINED, CLEAN-UP MEANING OF BLO ; EMT # OF GET TIME BFUP $GDATE = 32 ; EMT # OF GET DATE BFUP DSKSIZ = 64. ; # WORDS IN A DISK SECTOR BFUP WFUN = 3 ; WRITE FUNCTION - DISCIO (WITH WRT CHK)BFUP RFUN = 0 ; READ FUNCTION - DISCIO BFUP BHEAD = 14. ; #BYTES FOR DISCIO IN BUFFER BFUP ; * ;* 0= I/O SUCESSFUL * ;* 1= LIST ALREADY IN A QUEUE * ;* 2= INVALID DEVICE NUMBER * ;* 3= ILLEGAL EXIT TYPE REQUESTED * ;* 4= ILLEGAL PRIORITY LEVEL REQUESTED * ;* 5= ILLEGAL FILE ID OR IFD SPECIFIED * ;* 6= ILLEGAL I/O FUNCTION REQUESTED CK 0 ; .REF DYNSIZ DYSINI = . MOV DYNSIZ,R0 ; SIZE OF DYNAMIC STORAGE ASR R0 ; NO. OF WORDS CLRB R0 ; CALCULATE START BLOCK ; ; TABLE REGISTERS MOV R0,R1 SWAB R1 ; GET START BLOCK IN R1 BISB #377,R0 ; SET UP TO SET 256 BITS MOV R0,B3RR ; ALLOCATE UNUSED MOV #ALLOB3,B3FR ; BFUP ; FOR ENTRY 0 IN SECTOR 0 (OFFSETS) BFUP FID = BHEAD ; ROS FILE ID # BFUP FNDNUM = BHEAD+2 ; # OF NEXT DIRECTORY ENTRY BFUP FSTAT = BHEAD+3 ; FILE'S STATUS BFUP ; 0 - FREE BFUP ; >0 - # READS IN PROGRESS BFUP * ;* 7= NON-EXISTENT FILE ID * ;* 8= NO. OF WORDS TO READ/WRITE IS GREATER THAN * ;* FILE SIZE * ;* 9= RELATIVE SECTOR ADDRESS + LENGTH GOES BEYOND * ;* DEFINED FILE. * ;* 10= REQUESTED A DISCIO WRITE INTO A PROTECTED * ;* FILE. DYNAMIC STORAGE .IFZ $CORAL JSR PC,ALLOC ; USE SOFTWARE ALLOCATOR .ENDC CLR R0 BITB (R0)+,-(R0) ; DELAY BITB (R0)+,-(R0) BITB (R0)+,-(R0) BITB (R0)+,-(R0) BIT #BSYB3,B3FR ; B3 STILL BUSY? BEQ DYSI10 ; NO HALT ; YES-HALT INIT.************ DYSI10: RTS PC ; RETURN TO IPL ; .CSECT .PAGE ; ; SIGN BIT SET IFF WRITE IN PROG. BFUP FDIRSC = BHEAD+4 ; SECTOR # TO CONTAIN NEXT DIRECTORY ENTBFUP FNSEC = BHEAD+6 ; SECTOR # FOR NEXT ELEMENT (ITS DATA) BFUP FFLAG1 = BHEAD+12. ; THESE 2 WORDS MUST CONTAIN THE RAD50 BFUP FFLAG2 = BHEAD+14. ; /.BFUP./ AS A FLAG INDICATING THE BFUP ; FILE HAS BEEN INITIALIZED BY BFINIT BFUP .PAGE * ;* 11= DISC I/O ERROR, I/O NOT COMPLETE * ;* NOTE: DCS WILL BE IN DATA BUFFER WORD 2 * ;* DAE WILL BE IN DATA BUFFER WORD 3 * ;* 12= TIME-OUT ERROR DURING DATA TRANSFER OCCURRED * ;* 13= NO CKSAVE SPECIFIED ON CHKPIO. * ;* 14= DDS DISC-NOT EVEN NUMBER OF WORDS IN XFER * ;* ; THE FOLLOWING LIST IS THE PARTITION HEADER THAT IS ; DYNAMICALLY SET IN A PARTITION BY RPOM. ; PRTHDR = . .WORD 0 ; PARTITIONS B3 ADDRESS-SET DYNAMICALLY .WORD 1 ; PRIOR & IQPART .WORD 0 ; WORK WORD ; ; DISC I/O PARAMETER LIST ; .WORD 1 ; THREAD WORD .BYTE SYSDSC ; LOGICAL DEVICE = SYSTEM DISC .BYTE 0 ; EXIT TYPE-SET DY BFUP ; TABLES, LISTS, ETC BFUP ; BFUP BFBUSY: .BYTE 0 ; BFUP BUSY FLAG: =0 NO, =1 YES BFUP .EVEN BFUP ; DISKI/O LIST BFUP DSKLST: .WORD 1 ; THREAD WORD BFUP .BYTE 1  * ;* AFTER AN ERROR TYPE 12, NO OTHER REQUESTS WILL BE * ;* PROCESSED FROM THE DEVICE QUEUE. * ;* * ;* REGISTERS R0 THRU R5 WILL BE SAVED * ;* * ;* PROGRAMMER 54 * ;* DATE NAMICALLY .WORD 0 ; I/O COMPLETE SET DYNAMICALLY .BYTE 0 ; NO I/O ERROR TASK .BYTE 3 ; DISC I/O LEVEL THREE .WORD 0,0 ; ERROR AND SYSTEM WORDS .WORD 0 ; ADDRESS OF BUFFER SET DYNAMICALLY ; ; DISC I/O DATA HEADER ; .WORD 0 ; FILE ID SET DYNAMICALLY .BYTE 1 ; USE FICE DIRECTORY INFORMATION .BYTE 0  ; DEVICE CODE BFUP .BYTE 2 ; EXIT TYPE BFUP .WORD 0 ; NO EXIT ROUTINE BFUP .BYTE 0 ; NO ERROR TASK BFUP .BYTE NDPRT1 ; LOWEST DISK PRIORITY BFUP DSKERR: .WORD 0 ; ERROR WORD BFUP .WORD 0 ; DISCIO USE  * ;* REVISION * ;* * ;*********************************************************************** .DEF DISCIO,CHKPIO,PFRITE,DINT,DIHA50,DIOA65 .REF PHYDEV,ACTIVE,IOSTAT,RESTOR,QSAVE,DSPTCH .REF UNSPND,ERRTYP,QUEUE,LOGMAX,QTIME,DQTIME .REF $CTASK,PUSHR,POPR,RELTSK,HEADER ; .CSECT DI; I/O FCN SET DYNAMICALLY-INITIALLY READ .WORD 0,0,-1. ; THREE SYSTEM WORDS-LAST ONE ALSO TAIL SWITCH ; .PAGE ; ; ROLL-IN ERROR TYPE-OUT MODULE. ERROR #2 ; RIEMOD = . .WORD 1 ; THREAD WORD .WORD 2 ; ERROR NUMBER 2 .WORD 0 ; ARGUMENT 1- TASK .WORD 0,0,0 ; UNUSED ARGUMENTS ; ; TIME-SLICE SUSPEND TIME-OUT ERROR MODULE ; .IFNZ $TMSLC TSEMODBFUP DSKADD: .WORD 0 ; ADDRESS OF BUFFER FOR TRANSFER BFUP ; BFUP ; DISK BUFFER FOR SECTOR 0 (ALWAYS) BFUP ZBUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP ZFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RE O ; ; CHKPIO = . MOV R0,-(SP) ; SAVE R0 MOV #40000,R0 ; CHKPIO ENTRY POINT MASK BR DIOA00 ; PFRITE = . MOV R0,-(SP) ; SAVE R0 MOV #100000,R0 ; PFRITE ENTRY POINT MASK BR DIOA00 ; DISCIO = . MOV R0,-(SP) ; SAVE R0 CLR R0 ; DISCIO ENTRY POINT MASK DIOA00: MOV R1,-(SP) ; SAVE R1 MOV R2,-(SP) ; SAVE R2  = . .WORD 1 ; THREAD WORD .WORD 4 ; ERROR NUMBER 4 .WORD 0 ; ARGUMENT 1- TASK .WORD 0,0,0 ; UNUSED ARGUMENTS .ENDC ; .IFNZ $TMSLC!CHKPTC ; ; ROLL-OUT ERROR TYPE-OUT MODULE. ERROR #1. ; ROEMOD = . .WORD 1 ; THREAD WORD .WORD 1 ; ERROR NUMBER 1 .WORD 0 ; ARGUMENT 1- TASK .WOR SERVED FOR DISCIO USE BFUP ZSEC: .WORD 0 ; SECTOR 0 - ALWAYS BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ZBFEND =.-2 ; ADDRESS OF LAST CELL IN ZBUF BFUP ; BFUP ; DISK BUFFER FOR ALL OTHER SECTORS BFUP  MOV R3,-(SP) ; SAVE R3 MOV R4,-(SP) ; SAVE R4 MOV R5,-(SP) ; SAVE R5 MOV 14.(SP),R1 ; R1 = ADDRESS OF DISC I/O LIST MOV 12.(SP),14.(SP) ; PUT CALLER'S PC IN PROPER POS. FOR RETURN MOV R0,SYSTEM(R1) ; SET ENTRY POINT MASKS AND CLEAR OTHER MOV #ERR001,R0 ; USE R0 TO KEEP TRACK OF ERROR TYPES MOV PSR,-(SP) ; SAVE CPU STATUS MOV #PLOCK,PSR ; SET PRD 0,0,0 ; UNUSED ARGUMENTS ; .ENDC ; .PAGE ; PLOCK = 340 ; PRIORITY LOCKOUT MASK PSR = 177776 ; PROCESSOR STATUS REGISTER ADDRESS ; ; ; PARTITION STATUS VALUES - PSTAT ; EWS = 0. ; ENTRY WAITING SERVICE PARTCK = 1. ; PARTITION CHECKPOINTABLE VOLSCK = 2. ; VOL. SUSPENDED AND CHECKPOINTABLE PRTNCK = 3. ; PARTITION NOT CHECKPOIABUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP AFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED FOR DISCIO USE BFUP ASEC: .WORD 0 ; SECTOR # OF TRANSFER BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE IORITY LOCKOUT DEC (R1) ; DECREMENT FIRST WORD OF LIST BNE DIOA72 ; NON-ZERO-ERROR, CAN'T THREAD LIST MOV (SP)+,PSR ; RESET LOCKOUT INC R0 ; BUMP ERROR TYPE MOVB DEVICE(R1),R4 ; GET LOGICAL DEVICE NUMBER CMP R4,LOGMAX ; IS IT WITHIN SPECIFIED RANGE BHI DIOA70 ; NO-ERROR TYPE 2 ASL R4 ; CONVERT TO INDEX MOV PHYDEV(R4),R5 NTABLE VLSNCK = 4. ; VOL. S'PNDED AND NOT CHECKPOINTABLE IOIP = 5. ; OVERLAY I/O IN PROGRESS ABRTRQ = 6. ; ABORT REQUESTED ; ; ; ; EQUATES FOR PARTITION HEADER-FROM PARTITION BEGINNING ; NOB = 0. ; NUMBER OF BLOCKS SB = 1. ; START BLOCK IQPART = 2. ; INDEX INTO QPART OPRIOR = 3. ; OVERLAY PRIORITY WORKWD = 4. ; THE BUFFER BFUP ABFEND =.-2 ; ADDRESS OF LAST CELL IN ABUF. BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFINIT IS USED TO INITIALIZE A ROS FILE INTO A BFUP FILE. *BFUP ; THIS IS DONE BY INITIALIZING THE DIRECTORY AND ENTRY 0 IN IT. *BFUP ; THE  ; GET PHYSICAL DESCRIPTOR FOR THIS DEVICE SWAB R5 ; CHECK IF DEVICE AVAILABLE DECB R5 ; AND, DEVICE TYPE = 1 - DISC BNE DIOA70 ; OTHERWISE-ERROR TYPE 2 SWAB R5 ; R5 NOW CONTAINS DISC CONTROLLER UNIT # INC R0 ; BUMP ERROR TYPE MOVB TYPE(R1),R2 ; LEGAL EXIT TYPE? BLE DIOA70 ; NO-ERROR TYPE 3 CMP R2,#3. BGT DIOA70 WORK WORD IOTHRD = 6. ; I/O THREAD WORD IOEXIT = 9. ; I/O EXIT TYPE IOCOMP = 10. ; I/O COMPLETE ADDRESS IN I/O LIST DBADDR = 18. ; DATA BUFFER ADDRESS OFLEID = 20. ; OVERLAY FILE ID IOFCN = 23. ; I/O FUNCTION ; ; EQUATES FOR PARTITION HEADER-FROM PROGRAM (TASK) HEADER ; SGADDR = -2. ; RELATIVE SEGMENT ADDRESS SGLNGT = -4. ; SEGMPROCEEDURE IS: *BFUP ; 1) READ SECTOR 0 *BFUP ; 2) IF NOT A BFUP FILE, ZERO SECTORS 1 - 33 *BFUP ; 3) IF A BFUP FILE ONLY ZERO SECTORS IF STATUS BYTE OF COM *BFUP ; BLOCK IS ONE. IF THE STATUS = 0, RETURN TO THE CALLER. *BFUP ; 4) BUILD ENTRY ZERO *BFUP ;  ; NO-ERROR TYPE 3 INC R0 ; BUMP ERROR TYPE MOVB LEVEL(R1),R2 ; SET LEVEL OF REQUEST IN R2 BLE DIOA70 ; ERROR IF ZERO OR LESS-ERROR TYPE 4 CMPB R2,NDPRTY(R5) ; LEGAL DISC PRIORITY LEVEL? BGT DIOA70 ; ERROR TYPE 4 INC R0 ; BUMP ERROR TYPE MOV DATA(R1),R4 ; R4 = ADDRESS OF I/O BUFFER MOV (R4),R3 ; FILE ID OR IFD BEQ DIOA70 ENT LENGTH TRLIDX = -6. ; RELATIVE INDEX TO TRAILER HIOFCN = -13. ; I/O FCN FROM PROGRAM HEADER HFLEID = -16. ; OVERLAY FILE ID FROM HEADER HDBADD = -18. ; DATA BUFFER ADDRESS FROM HEADER HERRWD = -22. ; ERROR WD IN I/O LIST FOR ERROR CHECK HIOCMP = -26. ; I/O COMPLETE FROM HEADER HIOEXT = -27. ; I/O EXIT FROM HEADER HIOLST = -30. ; START OF DISC I/O  *BFUP ; THE FOLLOWING SUBROUTINES ARE USED: PUSHR, POPR, FILECK *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFINIT ; BFUP BFINIT =. ; ENTRY POINT BFUP JSR ; ZERO ID ILLEGAL-ERROR TYPE 5 BPL DIOA10 ; FILE ID BIC #100000,R3 ; STRIP OUT IFD SIGNIFIER CMP R3,#NCFILE ; CHECK AGAINST NO. OF CORE RES. FILES BGT DIOA70 ; ERROR TYPE 5 DIOA10: INC R0 ; BUMP ERROR TYPE CMPB INOUT(R4),#4. ; IS FUNCTION LEGAL? BLO DIOA20 ; YES BHI DIOA70 ; ERROR IF GREATER THAN 4-TYPE 6 CMPB TYPE(R1),#3. ; IF I/O FCN PARAM. LIST HWRKWD = -32. ; WORK WORD FROM HEADER PHPRI = -33. ; PRIOR FROM PROGRAM HEADER HIQPRT = -34. ; IQPART FROM PROGRAM HEADER PHSB = -35. ; SB FROM PROGRAM HEADER PHNOB = -36. ; NOB FROM PROGRAM HEADER ; ; EQUATES FOR PROGRAM HEADER ; THREAD = 0. ; THREAD WORD ENTRY = 2. ; TASK ENTRY POINT INITPT = 4. ; TASK INITIALIZATIO R5,PUSHR ; SAVE ALL REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; GO MAKE SURE WE HAVE A FILE BFUP BNE INIT10 ; NOT A ROS/BFUP FILE BFUP TSTB BFSTAT(R5) ; IS REINITIALZATION REQUESTED BFUP BEQ INIT99 ; NO. - ALL DONE BFUP INIT10: ; HERE TO ZERO SECTORS!= 4 THEN EXIT TYPE BNE DIOA70 ; MUST = 3 DIOA20: CLR ERROR(R1) ; INITIALIZE ERROR INDICATOR CLR DUSE3(R4) ; INITIALIZE DUSE3 MOV R5,R0 ; COMPUTE DISC CONTROLLER UNIT WORD INDEX ASL R0 ; DCUWX MOV DQLAST(R0),R3 ; GET ADDRESS OF DEVICE LAST LIST MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMPB "N ENTRY MAXT = 6. ; TIME-SLICE VALUE SIZE = 8. ; HEADER STACK SIZE (BYTE) HPRIOR = 9. ; CURRENT TASK PRIORITY (BYTE) CTIMER = 10. ; CURRENT TIME-SLICE TIMER VALUE TARG = CTIMER+ARG+ARG ; TRANSMITTED ARGUMENT (OPTIONAL) CPUST = TARG+2 ; CPU STATUS REGISTER (BYTE) TASKNO = CPUST+1 ; TASK NUMBER (BYTE) TSTACK = TASKNO+1 ; SAVED STACK POINTER RE# 32 - 1 BFUP ; FIRST BUILD A BUFFER OF ZEROS. BFUP MOV #ZBFEND+2,R1 ; ADDRESS OF LAST WORD +2 TO ZERO. BFUP INIT20: CLR -(R1) ; ZERO THE BUFFER BFUP CMP #ZBUF+BHEAD,R1 ; DONE YET? BFUP BLO INIT20 ; NO. BFUP MOV #ZBUF,DSKADD ; YES - NOW LET'S ZERO THE DISK. BFUP MOVB #W% R2,HPRIRQ(R5) ; WILL THIS BE HIGHEST PRIORITY REQUEST BHIS DIOA50 ; NO MOVB R2,HPRIRQ(R5) ; YES - SET IN HPRIRQ DIOA50: ASL R2 ; CONVERT LEVEL TO WORD INDEX ADD R2,R3 ; GET TO PROPER 'LAST' ADDRESS +1 MOV R1,@-(R3) ; INSERT PARAMETER LIST IN QUEUE MOV R1,(R3) ; SET LAST WORD IN DIRECTORY TST ACTIVE ; LOOK AT CURRENTLY ACTIVE TASK LOC. BEQ DIOA60 &GSV = TSTACK+2 ; REGISTER SAVE AREA ; ; ; EQUATES FOR TIME-SLICE OR FIXED QPART FROM QPRT'XX' ; ALLOSW = -1. ; ALLOCATION SWITCH MAXENT = -2. ; MAXIMUM ENTRIES -1 TOFQUE = -4. ; TOP OF QUEUE ADDRESS BOFQUE = -6. ; BOTTOM OF QUEUE ADDRESS PULLAD = -8. ; PULL ADDRESS PUSHAD = -10. ; PUSH ADDRESS PRTADD = -12. ; PARTITION ADDRESS TIMMOD = 'FUN,ZFUN ; SET DISK FUNCTION BFUP MOV #DIRMAX,ZSEC ; SET SECTOR TO TRANSFER -BEGIN WITH 32BFUP INIT30: JSR PC,DISKBF ; GO ZERO A SECTOR BFUP BEQ INIT50 ; NO DISC I/O ERRORS. BFUP CMP #9.,DSKERR ; FILE FULL? BFUP BEQ INIT97 ; YES BFUP BR INIT98 ; ALL OTHER ERRORS. ) ; NO TASKS ARE ACTIVE MOV $CTASK,R3 ; R3 CONTAINS TASK NUMBER BISB R3,SYSTEM(R1) ; SAVE TASK NUMBER IN SYSTEM INCB IOSTAT(R3) ; SET I/O IN PROGRESS FOR THAT TASK DIOA60: INC NODREQ(R0) ; BUMP NO. OF DISC REQUESTS BNE DIOA75 ; NO-EXIT AS SPECIFIED CLRB CALLED(R5) ; CLEAR EXIT TYPE FLAG-INT. OR T-OUT MOV (SP)+,PSR ; RESTORE PROCESSOR PRIORITY DIOA65: MOV TMTBL(R0),R1 ; ADDRESS OF * -22. ; TIMER MODULE THREAD WORD ; HEADQP = PULLAD ; HEAD OF QUEUE POINTER IS ALSO ; ; PULL ADDRESS ; ; EQUATES FOR TIMER MODULE FROM IT'S THREAD WORD ; RESTIM = 4. ; WORD TO RESET TIMER AT TMRACE = 8. ; TIMER RACE CONDITION SWITCH HDQUE = 14. ; HEADQP FROM TIMER MODULE ; ; EQUATES FOR QPART ENTRY ; PSTAT = 0. ; PARTITION STAT+ BFUP INIT50: DEC ZSEC ; DECREMENT SECTOR COUNT BFUP BGT INIT30 ; GO ZERO NEW SECTOR IF NOT #0. BFUP BLT INIT99 ; HAVE NOW DONE #0, GO HOME BFUP MOV #ZBUF+BHEAD,R2 ; HERE TO SETUP ENTRY ZERO IN SECTOR 0. BFUP ; R2 HAS ADDRESS OF FIRST WORD. BFUP MOV BFRFIL(R5),(R2)+; SETUP ENTRY 0. FIRST PUT FILE ID IN ITBFUP MOV #1,(R2)+ ND.E T ENEMATSTL NAIOITNDCOT RSFIR FOH TCMA; C ND.E ; ET SC.C.H IT WRNTURE; PC S RT: 30S0QT NDOU FOR F 0 =OT NC.C.T SE; R2 T TS: 20S0-TIMER MODULE MOV TDELAY,RESTIM(R1) ; INCASE ALREADY THREADED MOV #TIMOUT,TIMJSR(R1) ; DISC TIME-OUT SUBROUTINE MOV R1,-(SP) ; TIMER MODULE ADDRESS TO STACK MOV TDELAY,-(SP) ; THREAD A 100 MSEC TIMER FOR THIS DISC JSR PC,QTIME ; SET TIMER MODULE IN THREAD TST (SP)+ ; IGNORE ERROR BR DIOB00 ; START QUEUE SEARCH ; ; JMPS USED TO GET OVER BR RESTRICTIONS. TO: ;.US CSTAT = 0. ; CHECKPOINT STATUS OVTSK = 1. ; TASK NUMBER TRARG = 2. ; TRANSMITTED ARGUMENT ; ; ; TASK STATUS VALUES = TSTAT ; ABTREQ = -3. ; ABORT REQUESTED-SERVICE IN PROGRESS DQREQ = -2. ; DE-QUEUE REQUESTED-SERVICE IN PROGRESS EXITRQ = -1. ; EXIT REQUESTED-SERVICE IN PROGRESS QUISNT = 0. ; TASK QUIESCENT OVYACT = 1. ; / ; THEN SET # OF NEXT DIRECTORY ENTRY. BFUP ; AND FILE'S STATUS (0). THE SECTOR OF BFUP CLR (R2)+ ; DIRECTORY ENTRY IS ZERO. BFUP MOV #DIRMAX,(R2)+ ; SECTOR # OF NEXT ELEMENT. BFUP CMP (R2)+,(R2)+ ; SKIP 2 UNUSED WORDS - THEY ARE ZERO. BFUP MOV (PC)+,(R2)+ ; SET TWO WORD FLAG INDICATING FILE IS BFUP .RAD50 /.BF/ ; SET UP FOR BFUP. ND.E T ENEMATSTL NAIOITNDCOT RSFIR FOH TCMA; C ND.E ; ET SC.C.H IT WRNTURE; PC S RT: 30S0QT NDOU FOR F 0 =OT NC.C.T SE; R2 T TS: 20S0QT E ATOGRRTEIND AN ; 10S0QT BR RYNT EXTNEO TMPBU; + 2)(R+,2)(R P CM: 15S0QT OKS-YE; 20S0QT E BN E IVCT ARYNT EIS; RQRTAB,#2)1 DIOD10, DIOD15, DIOD20, DIOE00 ; DIOA70: JMP DIOD10 DIOA72: JMP DIOD15 DIOA75 = . JMP DIOD20 DIOA80: JMP DIOE00 ; ; SEARCH APPROPRIATE DEVICE QUEUE FOR HIGHEST ; PRIORITY REQUEST. ; R0 = DCUWX ; R5 = DISC CONTROLLER UNIT NO. ; DIOB00 = . MOV DQFRST(R0),R3 ; GET APPROPRIATE DEVICE FIRST TABLE DIOB10: MOV (R3)+,R1 BEQ DIOB10 ; DIDN'T FIND ANYTHING AT THAT LEVEL 2OVERLAY MONITOR(RPOM)WORKING ON TASK QINROS = 2. ; QUEUED IN ROS THREAD TACTVE = 3. ; TASK ACTIVE VOLSUS = 4. ; VOLUNTARILY SUSPENDED INVSUS = 5. ; INVOLUNTARILY SUSPENDED-NOT ; ; IN ROS QUEUE TDSABL = 6. ; TASK DISABLED TABRTD = 7. ; TASK ABORTED ODQREQ = 8. ; OVERLAY DE-QUEUE REQUESTED QINQPT = 9. 3 BFUP MOV (PC)+,(R2)+ ; BFUP .RAD50 /UP./ ; BFUP BR INIT30 ; GO WRITE SECTOR ZERO OUT. BFUP INIT97: JMP BFER07 ; TO FAR FOR BRANCHES BFUP INIT98: JMP BFERDK ; BFUP INIT99: JMP ENDBF ; BFUP .PAGE (R PBCM NO; 15S0QT E BN T? INDFI; 2)(RSKVT,OR1 PBCM ) ET SDYEALR AC.C. (ORRR-EITT GO; 30S0QT Q BE ERRKMAL AI TOR FSTTE; R5 C IN RYNT EANT GE; 5 ,R2)(R V MO: 10S0QT ) ET SDYEALR AC.C. (RNTURE- T ISEXT N'ESDO; 30S0QT Q BE S ESDRADT ARQPT GE; 2 ,R3)(RTNARQP V MO EXND IRDWOE ATULLCCA; R3 L AS TYRIIOPRT GE; 3 ,RR0 V MO 5 MOV R1,CRQPTR(R0) ; SET UP CURRENT REQUEST IN DCT MOV DATA(R1),R4 ; ADDRESS OF I/O BUFFER TST DUSE3(R4) ; FILE DIRECTORY INFORMATION NEEDED? BNE DIOA80 ; NO MOV (R4),R0 ; GET FILE ID TO LOOK FOR. BMI DIOB80 ; DON'T SEARCH. IT'S AN IFD MOV #-NCRLOC,R2 ; USED FOR AN INDEX THRU CORE ; ; RESIDENT DIRECTORY DIOB20: CMP R0,DOD+NCRLOC(R2) ;6; QUEUED IN QPARTN-NOT YET IN ROS ; ; MISC. EQUATES ; SYSDSC = 1 ; SYSTEM DISC UNIT NO. PHDSZE = 30. ; NO. OF LOCATIONS IN PARTITION HEADER ; ;**NOTE: LOADER HAS SIMILAR VALUE ERRTSK = 4. ; DISP. FOR TASK # IN ERROR MODULE OTSKNO = -HIOLST+TASKNO ; TASK NO. IN HEADER FROM I/O LIST IOERRW = 8. ; ERROR WORD IN I/O LIST FROM I/O LIST ; .PAGE .TITLE RP7 ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFENTR PROVIDES THE USER WITH THE MEANS TO MAKE A NEW ENTRY IN A *BFUP ; BFUP FILES DIRECTORY AND AT THE SAME TIME OPENING THE NEW ELEMENT *BFUP ; AND FILE FOR INPUT FROM THE USERS PROGRAM. *BFUP ; *. = CHSRQT ; R.TEISEG RRKWOA S IR5 ; Y.TREND IN F'TDNULCO, 0 =R2 ; F IT.XI EON2 RONT SEE BLLWIS DECON IOITNDCO ; EXND IRDWOY ITORRI P =R3 ; RYNT ERTPA Q'SSKTAF OSSREDD A =R2 ; ERMBNUK AS T =R1 ; Y ITORRI P =R0 N:URET RONUP ; ERMBNUK AS T =R1 ; Y ITORRI P =R0 : RYNT EONUP ; EDLLCAN HE WNTDESIREE OR CBET NOD EE NSKTA ; Y.TRENS K'AS TICIFECSPA R FO 9 SEARCH CORE DIRECTORY FOR MATCH BEQ DIOB50 ; FOUND IT DIOB25: ADD #10.,R2 ; BUMP INDEX BNE DIOB20 ; TRY AGAIN .IFZ DRESDI ; CORE ONLY DIRECTORY MOV #ERR007,R0 ; ERROR TYPE 7 BR DIOB48 .ENDC ; ; IF DISC RESIDENT DIRECTORY - READ APPROPRIATE SECTOR FROM FILE ; R0 = FILE ID TO SEARCH FOR ; R1 = I/O LIST ADDRESS ; R4 = ADDRESS OF I/O BUFF:OM ;*********************************************************************** ;* * ;* QOVLAY QOVNXT QSOVLY UNSOVY CKPT NOCKPT TSOVLY * ;* DQOVLY * ;* * ;* PROGRAM IDENTIFICATION. RPOM; ROS PROGRAM OVERLAY * ;* MONITOR. ;BFUP ; THE BFUP COMMUNICATIONS BLOCK SPECIFIES THE ELEMENT NAME, TYPE, *BFUP ; STATUS, AND ROS FILE ID. THE STATING SETOR IS RETURNED IN THE BLOCK *BFUP ; FOR THE USER'S I/O. *BFUP ; *BFUP ; BFENTR MARKS THE FILE AND ELEMENT AS OPEN FOR INPUT. *BFUP ; *BFUP ; SUBROUTINES USED ARE: PUSHR,POPR,; E BLTAT ARQPS Y'ITORRI PEDFICIPE S ACHARSEL IL WCHSRQT ; ; ; RNTURE; PC S RT TYRIIOPR; R0 R AS R BEUM NSKTA; R1 R AS ERSTGIRES ESDRADY TRENN ILTSURE; 2 ,R0)(RTNARQP D AD ERADHEN IOITRTPAM RO FRTPAIQT GE; 2 ,R4)(RRTQPHI SBBI R2 R CL X DEIND OR WTYRIIOPR; R0 L AS Y ITORRI P'SSKTA; 0 ,R4)(RORRIHP VBMO: 10PRFQ R DEEA HAMGRRO POFS ESDRADT GE; 4 =ER ; R5 = DISC CONTROLLER UNIT NO. ; .IFNZ DRESDI ASL R5 ; R5 BECOMES DCUWX MOV DODADD(R5),R2 ; ADDRESS OF APPROPRIATE DOD DEC R0 ; CALCULATE (FILE ID#-1)/12 CLR R3 ; USE R3 TO CONTAIN QUOTIENT DIOB30: SUB #12.,R0 ; DIVIDE BY 12 TO FIND BMI DIOB35 ; RELATIVE SECTOR OF DIRECTORY INC R3 ; ACCUMULATE RELATIVE SECTOR BR> * ;* * ;* PURPOSE. THE ROS PROGRAM OVERLAY MONITOR CONSISTS * ;* OF NINE SUBROUTINE ENTRY POINTS WHOSE PURPOSE * ;* IS PROVIDING A PRIORITY OVERLAY STRUCTURE IN A * ;* ROS II (OR ABOVE) SYSTEM. RPOM IS DESIGNED TO * ;* PROVIDE A FLEXIBLE METHOD OF PROGRAM PARTITIONS * ;* BY HANDLING DYNAMICALLY ALLOCATED PARTITIONS, ? FILECK *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFENTR ; BFUP BFENTR =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP ,R1)(RERADHE V MO X DEIND OR WO. NSKTAE UTMPCO; R1 L AS . = TNPRFQ ; D OAGL SOMFRD LEAL CSOAL ; R DEEA HAMGRRO POFS ESDRAD= R4 ; Y TRENT ARQPS K'AS TOFS ESDRAD= R2 ; ERMBNUK AS=TR1 ; TYRIIOPRS K'AS=TR0 ; N:URET RONUP ; ERMBNUK AS=TR1 ; D LEAL CENWHT ENIDES RRECOK AS T ; ONTIMAORNF IRYNT ERTPA QTEIAPRROPP AHE TNDFIL IL WTNPRFQ ; ; ; RNTURE; A DIOB30 ; NOT FINISHED DIOB35: ADD #12.,R0 ; BUMP BACK REMAINDER BISB R0,SYSTEM+1(R1) ; SAVE AS INDEX INTO FILE BUFFER CMP R3,LGTH(R2) ; LENGTH OF DIRECTORY EXCEEDED? BLE DIOB40 ; NO MOV #ERR007,R0 ; YES-REPORT ERROR TYPE 7 BR DIOB47 DIOB40: ADD SCTR(R2),R3 ; SECTOR AT WHICH TO START READ MOV DATA(R1),R4 ; ADDRESS OF DATA BUFFER MOV DFDBAD(R5),DUSE1(R4) ;BFIXED- * ;* DEDICATED PARTITIONS AND PARTITION TIME-SLICING. * ;* RPOM IS NOTIFIED BY 'QUEUE' WHEN AN ATTEMPT IS * ;* MADE TO QUEUE AN OVERLAY TASK. RPOM STORES THE * ;* REQUEST INFORMATION IN IT'S INTERNAL QUEUES * ;* AND IF THE PARTITION OR CORE SPACE IS AVAILABLE, THE * ;* DISC I/O WILL BE INITIATED FOR THE TASK. ALL * ;* OVERLAY TASKS WILL HAVE ENTRIES IN THEC MOV 14.(SP),R5 ; GET ADDRESS OF BFUB BLOCK. BFUP JSR PC,FILECK ; MAKE SURE ROS/BFUP FILE BFUP BNE ENTA99 ; BRANCH IF NOT A ROS/BFUP FILE BFUP ; ZBUF NOW HAS SECTOR 0 IN IT. BFUP TSTB ZBUF+FSTAT ; CHECK FILE'S STATUS - ONLY ONE WRITE BFUP BMI BFER03 ; AT A TIME. BFUP JSR PC,GETELT ; SEE IF C PC S RT R BEUM NSKTAO TCKBA; R5 R AS T ENIDES RRECOT NOT SE; 5)(RERADHE R CL R DEEA H'SSKTAT OUL-OL ROFS ESDRAD; 3 ,R5)(RERADHE V MO EXND IRDWOR BEUM NSKTA; R5 L AS K AS TUT-OLLRON ONGKIOR WOMRPT SE; ) R5T(TATST,ACVY#O VBMO SKTAT OUL-OL ROFR BEUM NSKTA; R5),R1K(TSOV SBBI R5 R CL SKTAN -ILLROR FOS ESGRRO PINO I/T SE; 2)(RP,OI#I SBBI T ESQUREF E START CORE ADDRESS FOR SIO ASR R5 ; R5 TO DISC CONTROLLER UNIT # MOV R3,DUSE2(R4) ; SECTOR FOR START I/O MOV #60.,DUSE3(R4) ; WORDS IN XFER FOR SIO BISB #100,INOUT(R4) ; SET FILE ID READ REQUESTED SWITCH CLR R2 ; SPECIFY DISC READ BR DIOC00 ; SIO - START I/O ; DIOB47: JMP DIHD00 ; REPORT ERROR .ENDC ; ; JMP TO GET TO DIHD00(BR RESTRICTIONS) ; DIOB48: JMPF FILE DIREC- * ;* TORY AND IT MAY BE DISC RESIDENT. RPOM WILL HANDLE * ;* PRIORITY REQUESTING, DYNAMIC CORE ALLOCATION, CHECK- * ;* POINTING (ROLL-IN/ROLL-OUT), PARTITION TIME SLICING, * ;* OVERLAY TASK SUSPENSION, TASK COMPLETION AND * ;* INITIATION OF THE NEXT REQUEST ON A PRIORITY * ;* BASIS. ROLL-IN/ROLL-OUT ERROR HANDLING WILL ALSO * ;* BE THE RESPONSIBILITY OF RPOM GAN FIND EXISTING ELEMENT. BFUP BEQ ENTA30 ; SKIP NEXT BLOCK IF NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP BNE BFER11 ; NO - CAN'T DELETE IT THEN. BFUP MOVB #STDELT,(R0) ; SET DELETED STATUS-R0 POINTS FROM GET BFUP TSTB R3 ; ALL IN SECTOR ZERO? BFUP BEQ ENTA30 ; YES BFUP OATST CVESA; ) R2,(77#1 CBBI K AS TUT-OLLRO ; ; OR FIPIO= T TAPS& 1 = T TACST SE; 1)(RP,OI!I00#2 VBMO . = UPLSRO ; K AS TUT-OLLROF OERMBNUK AS T =R5 ; K AS TUT-OLLROF OSSREDD AERADHEK AS T =R3 ; R2D AN1 RTHWIG ONALN URET RONUP: TENO ; ) STUEEQ(RSKTAN -ILLROF OSSREDD ARYNT ERTPA Q =R2 ; K AS TUT-OLLROF OSSREDD ARYNT ERTPA Q =R1 ; H:IT WUTKOOC LERND UEDLLCAI DIHD10 ; REPORT ERROR ; ; FOUND ACTIVE FILE WITH APPROPRIATE FILE ID ; FIRST DETERMINE IF FILE ID IS ASSOCIATED WITH DEVICE ; REQUESTED. ; R1 = I/O LIST ADDRESS ; R2 = NEGATIVE INDEX INTO 'FILE' ; R4 = ADDRESS OF I/O BUFFER ; R5 = DISC CONTROLLER UNIT NO. ; DIOB50 = . MOVB DOD+NCRLOC+PDVCE(R2),R3 ; GET LOGICAL DEVICE NO. OF FILE BIC #177600,R3 ; ISOLATE CMPB RJ * ;* * ;* THE NINE SUBROUTINE ENTRY POINTS PROVIDED ARE: * ;* * ;* QOVLAY- SUBROUTINE CALLED BY 'QUEUE' TO QUEUE OVERLAY * ;* TASK REQUESTS AND INITIATE THE DISC I/O * ;* IF THE PARTITION OR CORE SPACE IS AVAILABLE. * ;* QOVNXT- SUBROUTINE CALK MOVB #WFUN,AFUN ; NO - MUST WRITE THIS SECTOR TO DISK. BFUP JSR PC,DISKBF ; SECTOR # STILL SET - GO DO I/O BFUP BNE BFERDK ; NO-ERROR. BFUP ENTA30: ; OLD ELEMENT NOW DELETED BFUP MOV #ZBUF+BHEAD,R2 ; GET ADDRESS FOR ZBUF USE BFUP MOVB ZBUF+FDIRSC,R0 ; IS EVERYTHING IN SECTOR 0? BFUP BEQ ENTA50 ; YES E BSTMUE INUTROUB SISTH ; IPIO= T TAPS : SKTAN -ILLRO ; 0 = S ESDRADR DEEA HLEAB TSKTA ; CTYAOV= T TATS ; IPIO= T TAPS& 1 = T TACS K:AS TUT-OLLRO ; S.SKTAN -ILLROD AN ; UT-OLLROE THF OS'TUTA SSKTA SHE TESAREPPRP UET SUT-OLLRO ; ; C ND.E ; ET SESOD CONTIDION CTHWIN URET RND A; PC S RT S STUEEQ ROF# T ENEMCRDE; 0)(RQPEQNR CBDE S ESDRADM3,DEVICE(R1) ; SAME AS CALLS DEVICE NUMBER? BNE DIOB25 ; NO KEEP SEARCHING FOR ID ON PROPER DEVICE ADD #DOD+NCRLOC,R2 ; ADDRESS OF FILE'S DIRECTORY DIOB55: JSR PC,CFILID ; CHECK FILE & SET UP FOR XFER TST R0 ; ERROR OCCUR BNE DIOB48 ; YES-REPORT MOVB INOUT(R4),R2 ; GET REQUEST'S I/O FCN DIOB70: CMP R2,#3. ; WRITE/WRITE CHECK OR READ-WRITE? BLT DIOC00 ; NO-STNLED BY 'EXIT' TO TERMINATE AN * ;* OVERLAY TASK AND INITIATE THE DISC I/O FOR * ;* THE NEXT REQUEST, IF ANY. * ;* QSOVLY- SUBROUTINE CALLED BY 'QSAVE' DURING THE * ;* VOLUNTARY SUSPENSION OF A TASK TO INITIATE * ;* THE I/O FOR ANY PRIORITY REQUEST, IF * ;* ANY, FOR THAT CORE SPACE. * ;* UNSOVY- SUBROUO BFUP MOV R0,ASEC ; NO-MUST READ IN DESIRED SECTOR BFUP MOV #ABUF+BHEAD,R2 ; GET ADDRESS FOR ABUF USE BFUP MOV #ABUF,DSKADD ; SET BUFFER ADD INTO I/O LIST. BFUP MOVB #RFUN,AFUN ; SET READ FUNCTION BFUP JSR PC,DISKBF ; READ IN THE SECTOR. BFUP BNE BFERDK ; BRANCH IF DISK I/O ERRORS. BFUP ENTA50: MOVBH US PXTNET SE; ) R2D(LAUL,PR3 V MO: 10LQPL E EUQUF OOP TTOT SERED-DI; 3 ,R2)(RUEFQTO V MO 'TDNDI; 10LQPL T BL NDOUARP RA WOR FSTTE; ) R2E(QUOF,BR3 P CM D OR WNDCOSET GE; R5+,3)(R V MO L EL CIDVOD AN ; + 3)(R R CL RDWOT RSFIT GE; 4 ,R3)(R V MO SSREDD ALLPUT GE; 3 ,R2)(RADLLPU V MO . = QPLLPU ; C SE U.141= E IM TSECAT RSWO ; . UEUE QTYMP EANG INLLPUT NOQART REQUEST'S I/O BGT DIOB78 ; WRITE AFTER READ SUB #2.,R2 ; START WRITE FCN FOR WRITE/WRITE CHECK DIOB75: BISB #200,INOUT(R4) ; SET MULTIPLE DISC FCN REQUESTED BR DIOC00 DIOB78: CLR R2 ; SET READ FCN FOR READ/WRITE BR DIOB75 ; ; R0 CONTAINS AN IFD - INDEX INTO FILE DIRECTORY. ; THIS IS THE NUMBER OF FILES BETWEEN THE BEGINNING OF ; THE CORE RESIDENT DIRECTORY 'DOD' AND THE DIRECTORY RTINE CALLED BY 'UNSPND' TO RE-THREAD * ;* A VOLUNTARILY SUSPENDED TASK BACK INTO THE * ;* ROS QUEUES OR PERFORM ROLL-IN I/O IF * ;* REQUIRED. * ;* CKPT -SUBROUTINE WHICH MAY BE CALLED BY ANY * ;* OVERLAY TASK TO PUT IT IN A CHECKPOINTABLE * ;* STATE. * ;* NOCKPTS ZBUF+FNDNUM,R1 ; GOT CURRENT DIR. SECTOR - R0 POINTS TOBFUP BIC #177770,R1 ; IT - LET'S BUILD THE ENTRY NOW - WE BFUP ASL R1 ; KNOW WE HAVE ROOM-ALWAYS UPDATE IN BFUP ASL R1 ; BFCLOS. R1 IS SET TO ADDRESS IN BUFFBFUP ASL R1 ; BFUP ASL R1 ; BFUP ADD R2,R1 ; ADD ADDRESS TO POINTS MESUAS ; T.XI EONUPP QQRE NONT SES DECON IOITNDCO ; D VESAT NO- R TEISEG RRKWOA S AR3S SE UNETIOUBRSU ; T ENUMRG AEDTTMINSRA T =R5 ; T TAPSC/O/KNAS T =R4 N:URET RONUP ; SSREDD ARTPA Q =R2 ; C MINADYE BOT NSTMUY-ITORRI PRTPA Q =R0 ; T SEE BSTMUT OUK-OC LTYRIIOPR : RYNT EONUP ; L.EL CDSOI VND AUEUE QLEAB TRTPA Q'STYRIIOPRD XEFI ; R OEDICSLE-IM T AOFT OUY TRENN AL'UL'PL IL WQPLLPU ; U; WHICH THE IFD REPRESENTS. THUS A TRUE INDEX WOULD ; BE IFD*10. ; DIOB80 = . BIC #100000,R0 ; GET RID OF IFD MARKER MOV R0,R2 ASL R0 ; R0 ASL R0 ; TIMES ADD R0,R2 ; FIVE ADD R2,R2 ; GIVES IFD*10 - TRUE INDEX ADD #DOD,R2 ; ADDRESS OF FILE'S DIRECTORY TST (R2) ; IS FILE ACTIVE? BNE DIOV- SUBROUTINE WHICH MAY BE CALLED BY ANY OVERLAY * ;* TASK TO SET IT'S PARTITION OR CORE-SPACE * ;* NOT CHECKPOINTABLE. * ;* TSOVLY -SUBROUTINE CALLED BY 'TIMER' TO REQUEST A * ;* TIME-SLICE ROLL-OUT AND ROLL-IN OF A PARTITION. * ;* DQOVLY- SUBROUTINE THAT WILL DE-QUEUE AN OVERLAY * ;* REQUEST ACTIVE IN RPOM. * ;* W TO CORRECT BUFFERBFUP ; R1 NOW POINTS TO WORD OF BUFF TO STARTBFUP MOV R5,R4 ; GET ADD OF COM BLOCK BFUP CMP (R4)+,(R4)+ ; ADD 4 TO POINT TO NAME WR01 BFUP MOV (R4)+,(R1)+ ; MOVE WORD 1 OF ELEM NAME BFUP MOV (R4)+,(R1)+ ; MOVE WORD 2 BFUP MOV (R4)+,(R1)+ ; SET TYPE OF ELEMENT BFUP MOVB #S ; ; RNTURE; PC S RT S DECO. NDCOP UM BND ATSESQUREF OO. NMPBU; 0)(RQPEQNR CBIN DEMAT US JRYNT EOFS ESDRAD; R3+,P)(S V MO S ESDRADH US PXTNET SE; ) R2D(HAUS,PR3 V MO: 10HQPS E EUQUF OOP TTOT SERED-DI; 3 ,R2)(RUEFQTO V MO 'TDNDI; 10HQPS T BL D UNRO AAPWRR FOT ES T; ) R2E(QUOF,BR3 P CM L EL COFD OR WNDCOSED AN ; )+R3,(R5 V MO LLCEF ORDWOT RSFIT SE; )+YB55 ; YES - CHECK FILE ID & START I/O MOV #ERR007,R0 ; NO-ERROR TYPE 7 BR DIOB48 ; REPORT ; .PAGE ; ; ; DISC START I/O SEQUENCE ; R1 = I/O LIST ADDRESS ; R2 = SINGLE I/O FCN. 0= READ, 1= WRITE, 2= WRITE CHECK ; R4 = ADDRESS OF I/O DATA BUFFER ; R5 = DISC CONTROLLER UNIT NO. ; ; 'DUSE1' = START ADDRESS OF XFER ; 'DUSE2' = START SECTOR NO. ; Z RELTSK- SUBROUTINE THAT WHEN CALLED BY SYSTEM SERVICE * ;* SUBROUTINES (I.E. I/O HANDLERS) WILL RELEASE * ;* THE CORE SPACE IF AN EXIT, ABORT OR DE-QUEUE * ;* WAS REQUESTED WITH I/O IN PROGRESS. * ;* * ;* PROGRAM USAGE. THE FOLLOWING RULES ARE TO BE FOLLOWED * ;* IN ALL CALLS TO RPOM UNLESS OTHERWISE NOTED. *[TXUSE,-2(R1) ; SET STATUS OF ELEMENT IN DIRECTORY BFUP EMT $GTIME ; GET HOUR, MIN, & SEC OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET HOUR BFUP MOVB (SP)+,(R1)+ ; SET MIN BFUP MOVB (SP)+,(R1)+ ; SET SEC BFUP EMT $GDATE ; GET DAY, MONTH, & YEAR OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET YEAR R3,(R4 V MO K ACSTN OVESA; P)(S,-R3 V MO SSREDD ASHPUT GE; 3 ,R2)(RADSHPU V MO . = QPSHPU ; ECUS .242= E IM TSECAT RSWO ; . LLFUT NOE EUQUS MESUAS ; T XI EONUPP QQRE NONT SES DECON IOITNDCO ; DEMAT US JSSREDD ARYNT ERTPA Q =R3 ; D VEERESPRS ERSTGIREE OVAB N:URET RONUP ; T ENUMRG AEDTTMINSRA T =R5 ; T TAPS/ /CO KNAS=TR4 ; SSREDD ARTPA=QR2 ] 'DUSE3' = NO. OF WORDS IN XFER ; DIOC00 = . MOVB #NRETRY,NOTRYS(R5) ; INITIALIZE ERROR CTR. MOVB #NRETRY,TIMCTR(R5) ; INITIALIZE TIME-OUT CTR. ASL R5 ; R5 BECOMES DCUWX ; ; R5 = DISC CONTROLLER UNIT WORD INDEX-DCUWX ; DIOC10: MOV DUSE3(R4),@WCR(R5) NEG @WCR(R5) ; SET WORD COUNT REGISTER MOV DUSE1(R4),@CMA(R5) ; START ADDRESS .IFZ $DDSDC ; ; CALCULATE AND SET ^ ;* * ;* 1) TSTAT = 1(OVYACT) FOR THE TASK BEING CALLED FOR. * ;* 2) RPOM IS NEVER CALLED UNDER LOCKOUT. * ;* 3) REGISTERS NOT SAVED EXCEPT FOR CKPT, NOCKPT AND RELTSK. * ;* * ;* THE LINKAGE TO RPOM SUBROUTINES IS AS FOLLOWS: * ;* _ BFUP MOVB (SP)+,(R1)+ ; SET DAY BFUP MOVB (SP)+,(R1)+ ; SET MONTH BFUP MOV ZBUF+FNSEC,(R4) ; SET STARTING SECTOR INTO COM BLOCK BFUP MOV (R4),(R1)+ ; AND INTO ENTRY BFUP CLR (R1) ; CLEAR LENGTH ENTRY IN DIRECTORY BFUP BISB #STFWRT,ZBUF+FSTAT ; MARK FILE AS WRITE IN PROG. BFUP TST R0 ; C MINADYE BOT NSTMUY-ITORRI PRTPA=QR0 ; ET SBET US MUT-OCKLOY ITORRI P : RYNT EONUP ; . UEUE QLEAB TRTPA Q'STYRIIOPRD XEFI ; R OEDICSLE-IM T ATOINY TRENN AH'US'PL IL WQPSHPU ; ; T ARXP!FLCMS$T Z FN.I ; PC S RT E INMBCO; 3 ,RR5 D AD 1 E YT BINE ATOLIS; R3 RBCL R3 ABSW K OCBLT ARSTT GE; 3 ,R0)(ROLPOAL VBMO S CKLO BOF. NOT GE; R5),R3E(IZBS SBaDAR & DAE FOR RF-11 CONTROLLER ; FROM SECTOR IN DUSE2. NOTE ROS SECTORS ARE 64 WORD ; BLOCKS. THIS WILL BE SMALLEST ADDRESSABLE UNIT OF DISC. ; MOV #6.,R0 ; MULTIPLICATION CTR FOR TIMES 64 CLR @DAE(R5) ; INITIALIZE FOR DOUBLE WORD SHIFT .ENDC MOV DUSE2(R4),@DAR(R5) ; SECTOR TO DAR .IFZ $DDSDC DIOC20: ASL @DAR(R5) ; MULTIPLY BY 2 ROL @DAE(R5) ; SHIFT C TO DAE DEC Rb * ;* QOVLAY- MOV TASK,-(SP) * ;* MOV PRIOR,-(SP) * ;* MOV ARG,-(SP) * ;* JSR PC,QOVLAY * ;* TST (SP)+ * ;* BNE ERROR * ;* WHERE ERROR STATUS ON THE STACK c ; JUST SECTOR 0? BFUP BEQ ENTA70 ; NO - HERE TO PUT OUT DIRECTORY SECTOR.BFUP MOVB #WFUN,AFUN ; SET FUNCTION FOR A WRITE BFUP JSR PC,DISKBF ; AND WRITE IT OUT BFUP BNE BFERDK ; ERROR BFUP ENTA70: MOV #ZBUF,DSKADD ; SET UP TO DO SECTOR 0 BFUP MOVB #WFUN,ZFUN ; SET FUNCTION FOR A WRITE BI R5 R CL . = DD3AFB ERSTGIREK OR W =R5 ; SB1=E YT,BOB N =E0YT BS.ESDRAD3 B =R3 ; N:URET RONUP ; . NOK AS T =R3 ; TYRIIOPR =R0 ; 3. BTO ; T ESQURER FOK AS T AOFS ESDRAD3 BNDFIL IL WDD3AFB ; ; **********************************************************************;* * ;* * ESINUTROUB Se0 ; NEED (SECTOR)**64 BNE DIOC20 .ENDC ; ; CALCULATE AND CONSTRUCT DCS FOR RF-11 OR DDS CONTROLLER ; 1= WRITE IN DCS 02:01 ; 2= READ IN DCS 02:01 ; 3= WRITE CHECK IN DCS 02:01 ; MOVB FCNTBL(R2),R2 ; GET CORRECT FUNCTION VALUE BIS #101,R2 ; SET GO FCN IN :01 & INTERRUPT ENABLE MOV R2,CDCS(R5) ; SAVE CURRENT DCS WORD THIS DEVICE ; ; RESET TIMER FOR 100 MSEC Tf * ;* =0, NO ERROR * ;* =1, QPART(N) FULL * ;* =-1, QPART DOES NOT EXIST FOR REQUESTED * ;* PRIORITY. * ;* * ;* QOVNXT- MOV TASK,-(SP) * ;* JSR PC,QOVNXg BFUP JSR PC,DISKBF ; AND WRITE SECTOR 0 OUT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP ENTA99: JMP BFER02 ; TO FAR FOR A BRANCH BFUP .PAGE BFUP ;***********************************************************************BFUP ; TYLITI UOMRP ;* * ;* **********************************************************************;* 10OM CTSE.C E AG.P ; C ND.E K TSEL RIN ; ; TELEMPCOO I/R FOT AI WND AITEX; 20VBQO P JM USATSTD TEESQURET ORABT SE; ) R1T(TATSQ,REBT#A VBMO: 10A0TS E ACSPE OR CSHUINQLIRE; XXXXQN P JM D TEORABS=TUTA SSKTAT SE; ) R1iIME-OUT ON I/O XFER ; MOV TMTBL(R5),R3 ; GET TIMER MODULE THIS DEVICE MOV TDELAY,RESTIM(R3) ; RESET FOR 100 MSEC TIME-OUT MOV PSR,-(SP) ; SAVE CURRENT LEVEL CMPB (SP),#340 ; SHOULD IT BE RAISED TO 5? BHIS DIOC30 ; NO MOV #340,PSR ; SET LEVEL TO 5 FOR SIO DIOC30 = . MOV R2,@DCS(R5) ; START DISC I/O XFER ASR R5 ; R5 BECOMES DISC CONTROLLER UNIjT * ;* * ;* QSOVLY- TASK ALREADY SUSPENDED * ;* MOV TASK,-(SP) * ;* JSR PC,QSOVLY * ;* * ;* UNSOVY- MOV TASK,-(SP) * ;* JSR k *BFUP ; BFDELT PROFICES THE BATCH USER WITH A MEANS TO MARK AN ELEMENT AS *BFUP ; DELETED. AN ERROR CODE IS SET IF THE ELEMENT IS NOT FOUND. *BFUP ; NOTE: A DELETED ELEMENT AND ITS DIRECTORY ENTRY STILL EXIST. *BFUP ; BFPACK MUST BE USED TO COMPRESS THE FILE. *BFUP ; *BFUP ;SUBROUTINES USED: GETELT, FILECK, PUSHR, DISKBF *T(TATSD,RTAB#T VBMO S YE; 10A0TS E BN S?ESGRRO PINO I/E AV HSKTA; 1)(RATSTIO TBTS UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO T OUNTRI PORRR E ; P TYRR,EPC R JS R FO ; P)(S,-R5 V MO R BEUM NSKTAT SE; ) R5K(TSRR,ER1 V MO E ULOD MORRR EOFS ESDRAD; R5D,MOSE#T V MO XXXXQNR FO. GSRER PERO PIN ; ; ONTIMAORNF IRTPA QNDFI ; mT # ; ; EXITS FROM DISCIO, CHKPIO OR PFRITE ; R1= I/O LIST ADDRESS ; R5 = DISC CONTROLLER UNIT NO. ; DIOD00 = . TSTB CALLED(R5) ; INTERRUPT OR TIME-OUT FLAG SET BEQ DIOD20 ; NO- SUBROUTINE REQUEST CALL BMI DIOD30 ; TIME-OUT - COMPLETE SUBROUTINE RETURN MOV (SP)+,PSR ; RESET FROM LEVEL 5 JMP RESTOR ; EXIT FROM INTERRUPT ; ; ERROR EXIT FROM DISCIO,CHKPInPC,UNSOVY * ;* TST (SP)+ * ;* BNE ERROR * ;* WHERE ERROR STATUS ON THE STACK * ;* =0, NO ERROR * ;* =1, TASK HAS BEEN CANCELLED DUE TO * ;* VOLUNTARY SUSPEND LENGTH OF TIME * ;* EXoBFUP ; *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFDELT ; BFUP BFDELT =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SA N RTQP,FPC R JS N CAE WSOR BEUM NSKTAT GE; R1),R2K(TSOV SBBI R1 R CL RYNT EUEUE QOFD EA HOFS ESDRAD; R2),R1E(QUHD V MO CKTA SONS TUTA SORSSCERO PVESA; ) SP-(R,PS V MO H TCWI SCERAR METIT SE; 1)(RCERATM C IN . = RTABTS ; ; 9 OM CTSE.C LCMS$T Z FN.I E AG.P ; E ACSPE OR COMFRK AS TVEMORE; XXXXQN P JM ET SUTKOOC LTYRIIOPRE UR SKEMA; SR,PCKLO#P qO, OR PFRITE ; CANNOT THREAD REQUEST ; R0 = ERROR CLASSIFICATION ; R1 = I/O LIST ADDRESS ; NOTE: IF EXIT TYPE 2, IT WILL BE TREATED AS AN EXIT ; TYPE 1 ; DIOD10 = . INC (R1) ; BUMP BACK TREAD WORD DIOD12: JSR PC,ERR ; EXECUTE DISC I/O ERROR SUBROUTINE MOV PSR,-(SP) ; MAKE COMPATIBLE BR DIOD25 ; START EXIT SEQUENCE DIOD15: INC (R1) ; BUMP BACK rEEDED (TIME-SLICER'S) * ;* * ;* CKPT - EMT CKPT OR THE FORTRAN * ;* EQUIVALENT: CALL CKPT * ;* * ;* NOCKPT- EMT NOCKPT OR THE FORTRAN * ;* EQUIVALENT: CALL NOCKPT * ;* sVE THE REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF COM BLOCK BFUP JSR PC,FILECK ; IS IT A ROS/BFUP FILE? BFUP BNE BFER02 ; NOT A BFUP FILE - BAD! BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP V MO R BEUM NSKTA; R1),R2K(TSOV SBBI R1 R CL SSREDD AERADHEM RAOGPR; 4 ,RR1 V MO TYRIIOPRE UTMPCO; R0 R AS: 60OVGO D LEABIS DSKTAT SE; ) R4T(TATSL,ABDS#T VBMO GESAES MORRR EUT OPETY; P TYRR,EPC R JS P)(S,-R5 V MO T ENUMRG AINR BEUM NSKTAT SE; ) R5K(TSRR,ER4 V MO E ULOD MORRR EOFS ESDRAD; R5D,MOIE#R V MO . = 50OVGO ; ERMBNUK AS T =R4 uTHREAD WORD UNDER LOCKOUT BR DIOD25 ; ; EXIT AS SPECIFIED BY CALLER ; R1= I/O LIST ADDRESS ; DIOD20 = . CMPB #2.,TYPE(R1) ; EXIT TYPE 2 SPECIFIED IN REQUEST ? BEQ DIOD40 ; YES DIOD25: MOV (SP)+,PSR ; RESTORE PSR MOV (SP)+,R5 ; RESTORE MOV (SP)+,R4 ; CALLER'S MOV (SP)+,R3 ; REGISTERS MOV (SP)+,R2 MOV (SP)+,R1 v * ;* TSOVLY- TASK ALREADY SUSPENDED * ;* TASK = IN $CTASK * ;* JSR PC,TSOVLY * ;* * ;* DQOVLY- TSTAT = 8(ODQREQ) * ;* MOV TASK,-(SP) * ;* w BNE BFER11 ; NO - CAN'T DELETE IT THEN BFUP MOVB #STDELT,(R0) ; SET ELEMENTS STATUS AS DELETED. BFUP TSTB R3 ; EVERYTHING IN SECTOR ZERO? BFUP BEQ BFDL20 ; YES. BFUP MOVB #WFUN,AFUN ; WRITE DIRECTORY SECTOR OUT. DISCIO BFUP JSR PC,DISKBF ; LIST ALL SET UP FROM GETELT BFUP BNE BFERDK ; DISCIO E ; SSREDD ARYNT ERTPA Q =R2 ; SSREDD AERADHEK AS T =R1 ; EXND IRDWOY ITORRI P =R0 ; N -ILLROY LAEROVG INUR DEDRRCUOCR ROERD EA RSCDI ; ; OMRPM RO FITEXD AN; 15OVGO BR ESEUQUS ROF OADHET ASKTAE EUQU; 0)(RSTIR,FR1 V MO: 30OVGO LYEROPPRP USTLAT SE- Y PTEM; ) R0T(AS,LR1 V MO E EUQUY PTEMT NO; 30OVGO E BN D OR WADRETHS K'AS TUPT SE; 1)(R),R0T(RSFI V MO . = y MOV (SP)+,R0 TST (SP)+ ; SP TO PROPER STACK POSITION FOR RTS PC ; SUBROUTINE RETURN ; ; RETURN FROM TIMER COMPLETE SUBROUTINE ; DIOD30 = . CLRB TMCRSW(R5) ; RESET TIMER COMPLETE SUB. SWITCH MOV (SP)+,PSR ; RESET FROM LEVEL 5 RTS PC ; SUBROUTINE RETURN ; ; SUSPEND CALLING PROGRAM - TYPE 2 EXIT ; DIOD40 = . MOV (SP)+,12.(SP) ; SAVE PSR z JSR PC,DQOVLY * ;* * ;* RELTSK- IOSTAT = 0 * ;* MOV TASK,-(SP) * ;* JSR PC,RELTSK * ;* PROGRAMMER 54 * ;* DATE * ;* {RROR BFUP MOV #ZBUF,DSKADD ; SET ADD. OF ZBUF INTO I/O LIST. BFUP BFDL20: MOVB #WFUN,ZFUN ; HAVE TO DO THIS TWICE BFUP JSR PC,DISKBF ; NOW DO SECTOR ZERO. BFUP BNE BFERDK ; DISK I/O ERROR BFUP BR ENDBF ; ALL DONE - RETURN TO USER. BFUP .PAGE BFUP ;***** 20OVGO ; EDICSLE-IM TORD TEINPOCKHE CAS WIND-LEOL RSKTA ; ; OMRPM RO FITEXD AN; 20VBQO P JM 0 =ATST CND ALEABPTCKN IOITRTPAT SE; 2)(RK,TCAR#P VBMO USATSTS RON IEDEUQUT SE; ) R4T(TATSS,ROIN#Q VBMO: 15OVGO T ARQPN INDPEUS SL.VOT NOT SE; ) R2G(ARTR R CL R DEEA HSKTAN ITYRIIOPRT SE; ) R1R(IOPR,HR0 VBMO TYRIIOPR; R0 R AS C ND.E ERADHEN INTMEGUART SE; 1)(RRGTA),R2G(ARTR } MOV (SP)+,R5 ; RESTORE MOV (SP)+,R4 ; ENVIRONMENT MOV (SP)+,R3 ; OF MOV (SP)+,R2 ; CALLER MOV (SP)+,R1 ; BEFORE MOV (SP)+,R0 ; DISCIO CLR -(SP) ; VOLUNTARY SUSPEND JSR PC,QSAVE ; SUSPEND TASK JMP DSPTCH ; EXIT TO DISPATCHER ; ; ; FILE DIRECTORY INFORMATION IS NOT NEEDED. SYS~REVISION * ;* * ;*********************************************************************** ; .DEF QOVLAY,QOVNXT,TSOVLY,CKPT,NOCKPT,QSOVLY .DEF UNSOVY,DQOVLY,GETOV,GOTOV,TSABRT .DEF FQPRTN,RELTSK .REF PPTAB,BSIZE,IFD,CHKPIO,DISCIO .REF HEADER,DQRPOM,TSTAT,$CTASK,$PRIOR .REF ACTIVE,QSAVE,QTIME,TPRTY,DQTIME,FIRS******************************************************************BFUP ; *BFUP ; THIS CODE TAKES CARE OF SFTTING THE ERROR WORD. THE LOW BYTE WILL *BFUP ; CONTAIN THE BFUP STATUS AND THE HIGH BYTE THE DISCIO STATUS, IF *BFUP ; APPLICABLE. AFTER THE ERROR STATUS IS SET, CONTROL IS TRANSERED *BFUP ; TO ENDBF TO RETURN TO THE USER *BFUP ; V MO G AR Z FN.I UEUE QOS ROF ; ) R0T(AS,LR1 V MO L AI TATK AS TADRETH; 0)(RSTLA,@R1 V MO 0 =RDWOD EAHR TSKTAT SE; 1)(R R CL C ND.E S YE; 20OVGO I BM ? EDICSLE-IM TORD TEINPOCKHE CSKTAS WA; 2)(R TBTS C PTHK!CLCMS$T Z FN.I R BEUM NSKTAE UTMPCO; R4 R AS SSREDD AERADHEM RAOGPRT SE; ) R4R(DEEA,HR1 V MO EXND IRDWOR BEUM NSKTA; TEM, DUSE1 ; DUSE2 AND DUSE3 ALREADY SET UP FOR START I/O. ; DETERMINE FUNCTION TO PERFORM. ; DIOE00 = . MOVB INOUT(R4),R2 ; GET REQUEST'S I/O FCN BPL DIOB70 ; PERFORM I/O FOR REQUESTED FCN BITB #4.,INOUT(R4) ; I/O FCN = 4? BNE DIOE20 ; YES MOV #2.,R2 ; WRITE CHECK NEXT FOR W/WC REQUEST DIOE10: BICB #200,INOUT(R4) ; RESET MULIPLE FCN SWITCH BR DIOC00 ; START T .REF LAST,ERRTYP,STACK,DSPTCH .REF PUSHR,POPR,IOSTAT,DQTIME .IFNZ $DEBUG .REF SEARCH,ALLOC,DALLOC .ENDC ; .CSECT OM1 ; ; TASK IS A VALID QUEUEABLE TASK. TSTAT = OVYACT = 1. ; QOVLAY = . MOV 4.(SP),R0 ; SAVE PRIORITY MOV (SP),4.(SP) ; PC TO PROPER PLACE FOR RETURN MOV 2.(SP),(SP) ; SET ARGUMENT MOV 6.(SP),-(SP) ; AND TASK IN PROPER PLACE *BFUP ;***********************************************************************BFUP BFER12: INCB (R5) ; ONLY 127 OPEN (READ) ELEMENTS/FILE BFUP BFER11: INCB (R5) ; ELEMENT NOT FREE BFUP BFER10: INCB (R5) ; SPECIFIED ELEM CAN NOT BE CLOSED BFUP BFER09: INCB (R5) ; DISK I/O ERROR BFUP BFER08: INCB (R5) ; BFUP IS BUSY - ONLY ONE USER AT A TIMEBFUP BFER07: INCB R4 L AS UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO: 10OVGO ; ESSSREDD ALETBCALOREE LVSORE; ) R3,(PC R JS Y TRENR LEAITRO TMPBU; + 3)(R T TS R LEAITRF OSSREDD AALTUAC; 3 ,RR1 D AD R LEAITRE THN INDOU FESSSREADE THE LVSOREO TIT ; LLCAD ANY VLSO ROR FTSENUMRG ANGLIAL CUPT SE ; ; . = 05OVGO C ND.E LYOVRST N'DOS-YE; 10OVGO I BM ? EDICSLE-IM TORD TEINPOCKHEI/O DIOE20: MOV #1.,R2 ; WRITE NEXT FOR READ/WRITE REQUEST BR DIOE10 .PAGE ; ; CFILID IS AN INTERNAL SUBROUTINE TO DISCIO THAT WILL ; DETERMINE THE VALIDITY OF THE I/O REQUEST IN RESPECT WITH ; THE FILE'S DIRECTORY. THIS SUBROUTINE WILL CALCULATE AND SET ; DUSE1, DUSE2 AND DUSE3 FOR THE START I/O SEQUENCE. ; ; THE CALLING SEQUENCE IS: ; ; JSR PC,CFILID ; ; WHERE: R1 = I/O LIST ADDRESS ;  CLR 8.(SP) ; CLEAR ERROR PARAMETER IN STACK MOV PSR,4.(SP) ; PROCESSOR STATUS TO STACK MOV R0,R1 ; CALCULATE PRIORITY ASL R1 ; WORD INDEX MOV (SP),R3 ; GET TASK NUMBER JSR PC,FB3ADD ; FIND B3 ADDR FOR ALLO REQUEST .IFNZ $TMSLC!FXPART TSTB PPTAB(R0) ; DYNAMIC PRIORITY LEVEL? BMI QOVA10 ; YES JMP QOVC00  (R5) ; ROS FILE FULL BFUP BFER06: INCB (R5) ; REQUEST ELEMENT DOESN'T EXIST BFUP BFER05: INCB (R5) ; ELEMENT ASSIGNED FOR EXCLUSIVE USE. BFUP BFER04: INCB (R5) ; ELEMENT ALREADY IN EXCLUSIVE MODE BFUP BFER03: INCB (R5) ; FILE ALREADY HAS ELEMENT BEING CREATEDBFUP BFER02: INCB (R5) ; THIS ROS FILE NOT BFUP INITIALIZED BFUP BFER01: INCB (R5) ; ROS FILE AS SPECIFIE CSKTA; 2)(R TBTS TCKPCH FZ.I Y'VLSO'RS ASYP B -NO; 10OVGO Q BE R?LEAITRN IOATOCEL R AREHE TIS; 3 ,R1)(RDXLITR V MO S YE; 50OVGO E BN R?CUOCR ROERD EA RSCDID DI; 1)(RWDRRHE T TS S YE; 60OVGO Q BE D?TEESQUREE BRTBO ALLWI; ) R4T(TATSQ,REDQ#O PBCM S YE; 60OVGO Q BE ? EDSTUEEQ RENBET ORABS HA; RQRTAB,#2)(R PBCM R BEUM NSK R2 = ADDRESS OF APPROPRIATE FILE DIRECTORY ; R4 = ADDRESS OF I/O BUFFER ; R5 = DISC CONTROLLER UNIT NO. ; ; UPON RETURN FROM CFILID: ; ; R0 = ERROR TYPE THAT OCCURRED. 0 = NONE ; IF NO ERROR: ; 'DUSE1' = START ADDRESS OF XFER ; 'DUSE2' = START SECTOR NO. ; 'DUSE3' = NO. OF WORDS IN XFER ; CFILID = . BIT #100000,SY ; NO-QUEUE IN QPART-'PUSH' .ENDC QOVA10: MOV QPARTN(R1),R2 ; GET THIS PRIORITY'S QPART TABLE ADDRESS BEQ QOVB30 ; ERROR(-1),DOESN'T EXIST QOVA20: MOV (R2),R5 ; IS QPART CELL AVAILABLE? BEQ QOVA30 ; YES - MAKE ENTRY INC R5 ; DID WE GET TO END OF TABLE BEQ QOVB40 ; YES - ERROR TYPE 1, QPART FULL CMP (R2)+,(R2)+ ; BUMP TO NEXT QPART CELL BR QOVA20D DOESN'T EXIST BFUP BR ENDBF ; GO BACK TO USER BFUP BFERDK: ASL (R5) ; DISK ERR STATUS-SHIFT TO EVEN DIGIT(8)BFUP BR BFER09 ; THEN PUT BFUP ERROR CODE IN LOW BYTE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; ENDBF IS USED ASTAT GE; R4),R2K(TSOV SBBI R4 R CL Y TRENT ARQPS K'AS TOFS ESDRAD; 2 ,R0)(RTNARQP D AD ERADHEN IOITRTPAM RO FRTPAIQT GE; 2 ,R1)(RRTQPHI SBBI R2 R CL EXND IRDWOY ITORRI PKEMA; R0 L AS ERADHEN IOITRTPAM RO FTYRIIOPRT GE; R0),R1I(PRPH VBMO R DEEA HAMGRRO POFS ESDRADE ATULLCCA; 1 ,RSTOLHI#- D AD ; EDCKHE C/O IONR ROERL TIUND EA RSTJUR DEEA HSKTA ; N OLYRET YET NOAN-CONTIMAORNF|STEM(R1) ; PFRITE ENTRY? BNE CIDA05 ; YES-IGNORE COMPRS TEST MOVB FTYPE(R2),R0 ; GET FILE TYPE BIC #177600,R0 ; ISOLATE MOV PSR,-(SP) ; SAVE PS ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMP R0,CPRSIP ; THIS FILE TYPE BEING COMPRESSED? BEQ CIDC00 ; YES-DO WHATS NECESSARY MOV (SP)+,PSR ; RESET LOCKOUT CIDA05: BIT #40000,SYSTEM(R1) ;  ; TRY AGAIN QOVA30: MOV #PLOCK,PSR ; SET CPU LOCK-OUT TST (R2) ; STILL AVAILABLE? BEQ QOVA40 ; YES - CONTINUE MOV 4.(SP),PSR ; RESET PRIORITY LOCKOUT BR QOVA10 ; AND SEARCH AGAIN QOVA40: MOV R3,B3RR ; SET ALLOCATION SEARCH ADDRESS BIS #SRCHB3,B3FR ; START B3 SEARCH .IFZ $CORAL JSR PC,SEARCH .ENDC SWAB (SP)  A COMMON CLOSING FOR ALL BFUP ROUTINES. IT WILL: *BFUP ; 1) RESTORE REGISTER *BFUP ; 2) CLEAR THE BFUP BUSY FLAG *BFUP ; 3) RESTORE TO THE BATCH USER *BFUP ; *BFUP ; THE LINKAGE IS EITHER A 'JMP ENDBF' OR A 'BR ENDBF'. *BFUP ; IERADHEN IOITRTPAE US ; ; CKTA SONS TUTA SORSSCERO PVESA; ) SP-(R,PS V MO . = V TOGO ; ; 8 OM CTSE.C E AG.P ; C ND.E ; C ND.E 10OVGE BR S STUEEQ ROF. NOT ENEMCRDE; 0)(RQPEQNR CBDE RYNT ERTPA QIDVO; 2)(R R CL 10OVGE L BP ) R0B(TAPP TBTS TCKPCH Z FN.I C ND.E 10OVGE BR TCKPCH FZ.I . = 40OVGE ; xCHECKPOINT I/O REQUESTED? BNE CIDA40 ; YES TSTB SCFLAG(R4) ; USE RELATIVE SECTOR IN RLSECT? BEQ CIDA50 ; YES ; ; NO - USE INFO. IN FILES DIRECTORY MOV SCTR(R2),DUSE2(R4) ; SET START SECTOR NO. CIDA10: MOV LGTH(R2),R0 ASL R0 ; MULTIPLY ASL R0 ; SECTORS ASL R0 ; BY ASL R0 ; ; SET UP FIRST WORD OF QPART ENTRY MOV (SP)+,(R2) ; TASK # (POPPED FROM STACK),C=0&PSTAT=WAITING MOV (SP)+,TRARG(R2) ; ARGUMENT TO QPART INCB NREQQP(R0) ; BUMP NO. REQUESTS THIS PRIORITY ; ; 20.1 USEC DELAY QOVA45: BIT #BSYB3,B3FR ; IF STILL BUSY - B3 HUNG UP BNE QOVB50 ; DO ERROR RECOVERY BIT #SERRB3,B3FR ; BSIZE BLOCKS AVAILABLE? BEQ QOVA47 ; YES  *BFUP ; SUBROUTINES USED: POPR *BFUP ; *BFUP ;***********************************************************************BFUP ENDBF =. ; ENTRY POINT BFUP JSR R5,POPR ; RESTORE ALL REGISTERS BFUP MOV (SP)+,(SP) ; BUMP RETURN ADDRESS OVER ARG ADDRESS. BFUP CLRB BFBUSY UT-OLLROK AS TNGRIDUD TEESQURET ORAB ; ; 25OVGE BR E BLTAKPECCHT NO, NDPEUS SL.VO= T TAPST SE; 2)(RK,NCLS#V VBMO: 30OVGE ITEX; 20VBQO P JM R PETYR ROERR FO ; P TYRR,EPC R JS CKTA SONT SE; P)(S,-R4 V MO ERMBNUK AS TUT-OLLROT SE; ) R4K(TSRR,ER1 V MO LEDUMOR ROERT OUL-OL ROFS ESDRADT GE; R4D,MOOE#R V MO: 25OVGE INGA AO. NSKTA; R1 R AS T OUK-OC LTYRIIOPRT SERE; t 64 ASL R0 ; FOR ASL R0 ; NO. WORDS MOV R0,DUSE3(R4) ; SET LENGTH OF XFER MOV R4,R0 ; CALCULATE ADDRESS OF RLSECT ADD #RLSECT,R0 ; AND START I/O THERE CIDA20: MOV R0,DUSE1(R4) ; SET START ADDRESS OF XFER TSTB INOUT(R4) ; IS IT A WRITE REQUEST? BEQ CIDA30 ; NO - EXIT TSTB PDVCE(R2) ; YES-PERFORM PROTECTED JMP QOVD00 ; NO-CHECKPOINT OR WAIT QOVA47: MOV B3AR,B3RR ; SET UP TO ALLOCATE AREA BIS #ALLOB3,B3FR ; START ALLOCATION .IFZ $CORAL JSR PC,ALLOC .ENDC BISB #IOIP,(R2) ; SET I/O IN PROGRESS IN PSTAT MOV B3AR,R3 ; GET PARTITION ADDRESS MOV R3,R4 ; CALCULATE ADDRESS CLRB R4 ; OF PARTITION ADD R4,R4 ; FROM  ; CLEAR THE BUSY FLAG BFUP RTS PC ; RETURN TO THE CALLER BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFOPEN PROVIDES THE BATCH USER WITH MEANS OF OPENING AN EXISTING *BFUP ; BFUP ELEMENT FOR OUTPUT TO A USERS PROGRAM. IF THE SPECIFIED FI SR,PP)(S V MO INGA ANTDESIREE OR CSSREDD AERADHET SE; ) R1R(DEEA,HR4 V MO EXND IRDWOR BEUM NSKTA; R1 L AS S RON IEDEUQU= S TUTA SSKTAT SE; ) R1T(TATSS,ROIN#Q VBMO LEABNTOIKPECCHT NON IOITRTPAT SE; 2)(RK,NCRT#P VBMO S UEUE QOS RTOIN ; ) R0T(AS,LR4 V MO CKBAK AS TADRETH; 0)(RSTLA,@R4 V MO 0 =RDWOD EAHR TSKTAT SE; 4)(R R CL T OUK-OC LTYRIIOPRT SE; SR,PCKp FILE CHECK BPL CIDA30 ; OK - NOT A PROTECTED FILE BIT #140000,SYSTEM(R1) ; PROTECTED IF DISCIO ENTRY BEQ CIDB10 ; SET ERROR TYPE 10 CIDA30: CLR R0 ; SIGNIFY NO ERRORS RTS PC ; RETURN TO CALLER ; ; CHKPIO ENTRY - USE CKSAVE IN FILE'S DIRECTORY ; CIDA40 = . MOV CKSAVE(R2),DUSE2(R4) ; CHECKPOINT ADDRESS SET BNE CIDA10 ; OK - CONTINUE START BLOCK ADD BCPOOL,R4 ; AND BEGINNING OF CORE POOL ; ; 25.9 USEC DELAY BIT #BSYB3,B3FR ; IF STILL BUSY-B3 HUNG UP BNE QOVB50 ; DO ERROR RECOVERY MOV (SP),PSR ; RESET LOCKOUT .IFNZ $TMSLC!FXPART TSTB PPTAB(R0) ; PRIORITY TIME-SLICED OR FIXED? BMI QOVA49 ; NO MOV QPARTN(R1),R5 ; YES-QPART ADDRESS FOR THIS PRIORITY LE *BFUP ; IS A ROS/BFUP FILE AND THE REQUESTED ELEMENT CAN BE FOUND, THE # OF *BFUP ; OPEN ELEMENTS IN THE FILE IS INCREMENTED, THE ELEMENT IS MARKED AS *BFUP ; OPEN FOR READ IF AVAILABLE, AND THE STARTING SECTOR AND LENGTH ARE *BFUP ; RETURNED TO THE USER VIA THE COMMUNICATIONS BLOCK. *BFUP ; *BFUP ; SUBROUTINES USED: GETELT, ENDBF, DISKBF, FILECK, PUSHR *BFUP ; LO#P V MO X DEIND OR WTYRIIOPR; R0 L AS S YE; 30OVGE E BN D?DEENSPSUY ILARNTLUVOK AS TIS; ) R2G(ARTR T TS: 23OVGE C ND.E R TEISEG RTEIAPRROPP ATOS ESDRADY TREN; 2 ,RR3 V MO ERADHEN IOITRTPAN IITT SE; ) R4T(PRIQ,HR5 VBMO T ARQP IEW N'SITE ATULLCCA; 5 ,RR2 B SU SSREDD ARYNT EVESA; 3 ,RR5 V MO SSREDD AERADHEM RAOGPRT SERES-YE; R4+,P)(S V MOl MOV #ERR013,R0 ; REPORT ERROR TYPE 13 RTS PC ; RETURN TO CALLER ; ; USE RLSECT & NWORD FOR I/O PARAMETERS ; CIDA50 = . MOV NWORD(R4),R0 ; GET NO. WORDS IN I/O REQUEST .IFNZ $DDSDC BIT #1,R0 ; DDS MUST HAVE EVEN NO. OF WORDS IN XFER BNE CIDB14 .ENDC JSR PC,WRDSCT ; CONVERT TO SECTORS CMP R0,LGTH(R2) ; GREATER THAN FILE SIZE? BGT  MOV R4,PRTADD(R5) ; SET ADDRESS ALLOCATED FOR THIS PRI. .ENDC QOVA49: MOV #PRTHDR,R5 ; GET ADDRESS OF PARTITION HEADER INFO. QOVA50: MOV (R5)+,(R4)+ ; TRANSFER HEADER TO PARTITION BPL QOVA50 ; NOT FINISHED SUB #PHDSZE,R4 ; GET TO PARTITION BEGINNING MOV R3,(R4) ; SET SB AND NOB ; ; BUILD PARTITION HEADER, SET UP FOR ROLL-IN AND ; INITIATE I/O. ; R0=PRIORITY ;  *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFOPEN ; BFUP BFOPEN =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SZVE ALL REGISTERS UEUE QOFD EA HATK AC BUT-OLLROT GET US-MNO; 22OVGE E BN ? NTWAE WNE OTOT GE; 5)(RSKVT,OR1 PBCM Y TREND EA HOFS ESDRADT GE; 5 ,R2)(RQPADHE V MO UTKOOC LTYRIIOPRT SERE; SR,PP)(S2. V MO L AI TTOINT ISHPU; P HQUS,PPC R JS T ARQPF OUT ORYNT ELLPU; P LQUL,PPC R JS UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO: 22OVGE S ESDRADR DEEA HONTITIAR PVESA; P)(S,-R4 V MO R0 R ASh CIDB08 ; YES-ERROR TYPE 8 MOV LGTH(R2),R3 ; GET LENGTH OF FILE ADD SCTR(R2),R3 ; CALCULATE EXTENT OF FILE ADD RLSECT(R4),R0 ; CALCULATE EXTENT OF I/O REQUEST ADD SCTR(R2),R0 ; ADD START SECTOR CMP R0,R3 ; WILL I/O OVERFLOW FILE? BGT CIDB09 ; YES-ERROR TYPE 9 MOV SCTR(R2),R0 ADD RLSECT(R4),R0 ; SECTOR ADDRESS OF I/O MOV R0,DUSE2(R4)  R1=PRIORITY WORD INDEX ; R2=ADDRESS OF REQUEST'S QPART CELL ; R4=PARTITION ADDRESS ; QOVB00 = . MOV R2,R3 ; DUPLICATE QPART ADDRESS SUB QPARTN(R1),R3 ; CALCULATE IQPART - INDEX INTO QPART MOVB R3,IQPART(R4) ; SET IQPART IN HEADER MOVB R0,OPRIOR(R4) ; SET PARTITION'S PRIORITY MOV #GOTOV,IOCOMP(R4) ; SET I/O COMPLETE TO 'GOTOV' MOVB #3.,IOEXIT(R4) ; SET I/O EXIT TBFUP MOV 14.(SP),R5 ; SAVE COM BLOCK ADD. IN R5. BFUP JSR PC,FILECK ; IS THIS A VALID FILE, ETC. BFUP BNE BFER02 ; NOT A ROS FILE - BAD. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND REQUESTED ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP INCB ZBUF+FSTAT ; FOUND IT. SET STATUS AS OPEN IN FILE BFUP BPL OPEN10 ; CA LEAB TRTPA Q'STYRIIOPRS HI TOFS ESDRAD; 2 ,R0)(RTNARQP V MO X DEIND OR WTYRIIOPR; R0 L AS S YE; 23OVGE I BM ? ELEV LTYRIIOPRC MINADY; ) R0B(TAPP TBTS T ARXP!FLCMS$T Z FN.I R HDT PRN II.PRK AS TUT-OLLROT SERE; 4)(RRIHP,PR0 VBMO G INITWAO T ; ; STUEEQ ROFT TAPST SERE; 4)(RWDRKHW,@77#1 C BI . = 20OVGE ; S ESDRADR DEEA Hd; SET FOR SIO MOV NWORD(R4),DUSE3(R4) ; WORDS IN XFER FOR SIO MOV R4,R0 ; CALCULATE ADDRESS AT WHICH TO ADD #NWORD+2,R0 ; START THE I/O BR CIDA20 ; CONTINUE ; CIDB08 = . MOV #ERR008,R0 ; REPORT ERROR TYPE 8 RTS PC ; CIDB09 = . MOV #ERR009,R0 ; REPORT ERROR TYPE 9 RTS PC ; CIDB10 = . MOV #ERR010,R0 ; REPORT ERROR TYPE 10 YPE MOV R4,R3 ; CALCULATE ADDRESS ADD #OFLEID,R3 ; OF DATA BUFFER MOV R3,DBADDR(R4) ; SET IT IN I/O LIST CLR R5 BISB OVTSK(R2),R5 ; GET REQUEST'S TASK NUMBER ASL R5 ; CALCULATE TASK WORD INDEX MOV IFD(R5),OFLEID(R4) ; SET IFD/FILE ID IN LIST CLRB IOFCN(R4) ; SET READ FUNCTION ADD #IOTHRD,R4 ; R4 = I/O LIST ADDRESS MOV N WE OPEN ANY MORE FOR (READ)? BFUP DECB ZBUF+FSTAT ; NO. RESET COUNTER. BFUP BR BFER12 ; AND GO DO ERROR STUFF. BFUP OPEN10: MOVB #STOPEN,(R0) ; SET ELEM. STATUS BFUP ADD #DSTSEC-DSTAT,R0; BUMP R0 TO POINT TO START SECTOR BFUP MOV (R0)+,BFSEC(R5) ; SET START SECTOR INTO COM BLOCK BFUP MOV (R0),BFLNTH(R5) ; SET LENGTH INTO COM BLOCK. BFUP AMGRRO P =R4 ; S ESDRADY TRENT ARQPS K'AS T =R2 ; ERMBNUK AS T =R1 ; TYRIIOPRK AS T =R0 ; T MPTEATT OUL-OL RAYRLVE ONGRIDUD REURCC OORRR ETERI WSCDI ; ; STUEEQ ROFN -ILLROT ARST; 00VBQO P JM SSREDD AERADHEN IOITRTPAE ATULLCCA; 4 ,ROBHN#P D AD EXND IRDWO; R1 L AS TYRIIOPRE ATULLCCA; 1 ,RR0 V MO ERADHE. RTPAM RO FTYRIIOPRS T'ESQURET GE; R0),R4I(PRPH` RTS PC ; .IFNZ $DDSDC CIDB14 = . MOV #ERR014,R0 ; REPORT ERROR TYPE 14 RTS PC .ENDC ; ; COMPRESSION IN PROGRESS THIS FILE TYPE ; CIDC00 = . MOV #$CPTNO,R0 ; GET TASK NUMBER OF COMPRESS ASL R0 ; WORD INDEX MOV HEADER(R0),R0 ; GET HEADER ADDRESS JMP @INITPT(R0) ; QUEUE REQUEST IN REQUEST QUEUE ; ; DONE BY COR4,-(SP) ; SET ON STACK FOR DISC SERVICE .IFNZ $TMSLC!CHKPTC TSTB (R2) ; IS TASK CHECKPOINTED BPL QOVB10 ; NO JSR PC,CHKPIO ; YES - READ CHECKPOINTED TASK BR QOVB11 QOVB10 = . .ENDC JSR PC,DISCIO ; ROLL-IN OVERLAY TASK QOVB11: TST IOERRW(R4) ; DID DISCIO REQUEST PROCESS ERROR OCCUR? BNE QOVB60 ; YES ; ; BEFORE EXITING FROM RPOM A TSTB R3 ; ALL IN SECTOR 0? BFUP BEQ OPEN20 ; YES BFUP MOVB #WFUN,AFUN ; OUTPUT DIRECTORY SECTOR - ABUF BFUP JSR PC,DISKBF ; GO DO I/O. #ABIUF IN DSKADD. BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADDRESS IFF USED ABUF. BFUP OPEN20: MOVB #WFUN,ZFUN ; HERE TO VBMO S ESDRADY TRENT ARQPS T'ESQURET GE; 2 ,R4)(RWDRKHW V MO UTKOOC LTYRIIOPRT SERE; SR,PP)(S V MO: 10OVGE D DEENSPSUUN ; ; L TIUNN -IEDLLROE B'TON WSO ; ; E BLTAKPCH& D ENSPSU. OL=VATST P1,T=TACS; 2)(RK,SCOL#V D AD S YE; 10OVGE Q BE N?IONSPEUS SRYTAUNOLNV IANT IIS; ) R2G(ARTR T TS CEVIER SOR FNGTIAI W =ATST PET-SNO; 2)(RP,OI#I \MPRS-RETURNS TO DIHA50 ; ; ; CONVERT WORDS TO SECTORS (64 WORDS). INCLUDES ; PARTIALLY FILLED SECTORS. ; JSR PC,WRDSCT ; UPON ENTRY R0 = WORDS ; UPON EXIT R0 = SECTORS ; OTHER REGISTERS WILL NOT BE DESTROYED ; WRDSCT = . MOV R1,-(SP) ; SAVE R1 FOR WORK REGISTER MOV R0,R1 ; DUPLICATE ASR R1 ; CONVERT ASR R1 ; LENGTH ASR R1 ; FTER A QOVLAY CALL, ROLL-IN ; OR ROLL-OUT REQUEST-SET TSTAT = 9 = QINQPT ; R2 = QPART ENTRY ADDRESS ; QOVB15 = . CLR R1 BISB OVTSK(R2),R1 ; GET TASK NUMBER MOVB #QINQPT,TSTAT(R1) ; SET QINQPT AND EXIT ; ; EXIT FROM RPOM ; QOVB20 = . MOV (SP)+,PSR ; POP PSR OFF STACK AND RESET ; ; LOCKOUT JUST IN CASE SET RTS PC ; ; ERROR TYPE -1, QPART DOUTPUT SECTOR 0. BFUP JSR PC,DISKBF ; DO IT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFCLB SU S YE; 20OVGE E BN ? URCC OORRR ESCDID DI; 4)(RWDRRHE T TS ; . UPD NEEACLT GEY LLCATIMATOAU ; L IL WIT- ET SISQ REDQ QIFT INPOS HI TAT: TENO ; ; S YE; 40OVGE Q BE ? EDSTUEEQ RENBET ORABS HA; RQRTAB,#2)(R PBCM UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO O.NF IRTPA QUT-OLLROF OSTRET GE; 0 R1QP,FPC R JS EXND IRDWO ; R1 L AS R BEUM NSKTA; X INTO ASR R1 ; SECTORS- ASR R1 ; DIVIDE BY ASR R1 ; 64 BIT #77,R0 ; IS THERE A PARTIAL SECTOR? BEQ WTSA10 ; NO INC R1 ; YES-ADJUST ACCORDINGLY WTSA10: MOV R1,R0 ; SET ANSWER MOV (SP)+,R1 ; RESTORE R1 RTS PC ; RETURN ; .PAGE ; ; ; DINT IS THE DOESN'T EXIST FOR THIS PRIORITY ; QOVB30 = . DEC 8.(SP) ; SET -1 ERROR CODE ON STACK BR QOVB45 ; EXIT ; ; ERROR TYPE 1, QPART FULL FOR THIS PRIORITY ; QOVB40 = . INC 8.(SP) ; SET 1 ERROR CODE ON STACK QOVB45: MOV (SP)+,R1 ; GET TASK NUMBER THAT CAUSED ERROR CLRB TSTAT(R1) ; SET TASK QUIESCENT TST (SP)+ ; POP ARG OFF STACK BR QOVB20 OS PROVIDES THE USER WITH MEANS OF 'UNOPENING' AN ELEMENT. THIS *BFUP ; WILL CHANGE BOTH THE ELEMENT'S AND TASK'S STATUS. IF THE ELEMENT *BFUP ; CAN NOT BE FOUND, AND ERROR CODE WILL BE RETURNED. WHEN CLOSING AN *BFUP ; ELEMENT OPENED BY BFENTR, THE USER MUST SUPPLY THE LENGTH OF THE *BFUP ; ELEMENT. *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, FILECK, GETELT, DISKB1 ,R4)(RNOSKTA SBBI R1 R CL =0R DEEA HLEAB TSKTAE USCABE ; 4 ,RR1 V MO R DEEA HAMGRRO POFS ESDRAD; 1 ,RSTOLHI#- D AD CKTA SONS TUTA SORSSCERO PVESA; ) SP-(R,PS V MO . = V TOGE ; ; 7 OM CTSE.C C PTHK!CLCMS$T Z FN.I E AG.P ; T IDO; 25LARE BR -Q DERFT ANTCEESUI QUSATSTT SE; P)(S2. R CL . = 40LARE ; RNTURE; 10LARE TISC INTERRUPT HANDLER. INTERRUPTS WILL NOT BE ; LOCKED-OUT AT INTERRUPT TIME. THE INTERRUPT VECTOR PSR ; CONTAINS THE DEVICE CONTROLLER UNIT NO. THE PROCESSOR ; LEVEL WILL BE RESET TO THE HARDWARE LEVEL OF THE DISC ; INTERRUPT. ; DINT = . $SAVE ; TRAP TO SAVE ENVIRONMENT MOV PSR,-(SP) ; CURRENT PSR CONTAINS DEVICE NO. IN C.C. MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV (SP),R5 ; SAVE P; EXIT ; ; ; ERROR-B3 BOX HUNG UP ; EVENTUALLY HANDLE ERROR WITH SOFTWARE BACK-UP ; ; QOVB50: HALT ; REAL-TIME ERROR HANDLER********* ; ; ERROR OCCURRED DURING THE DISCIO REQUEST PROCESSING. ; SOMETHING WRONG-CAN'T ROLL-IN ; QOVB60: MOV R4,R1 ADD #-HIOLST,R1 ; TASK HEADER ADDRESS MOV R5,R4 ASR R4 ; TASK NUMBER ASL R0 ; PRIORITY WORD INDEX JMP F *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFCLOS ; BFUP BFCLOS =. ; ENTRY POINT BFUP JSR BR T XI EAYRLVE ORMFOER-PITEX; T NXOV,QPC R JS . = 30LARE ; 15LARE BR WDK WRP POY-ELATRIOPPRAPS TUTA SSKTAT SE; ) R0T(TATS+,P)(S VBMO VESAT NOS OE DLYOVDQN-AIAGR BEUM NSKTAT GE; R0),SP.(16 V MO T IUEUE-QDE; Y VLQO,DPC R JS LYOVDQR FOS TUTA SSKTAT SE; ) R0T(TATSQ,REDQ#O VBMO: 25LARE LY6VDQR TEAFT TATSS HI TTOT SE; P)(S2.D,RTAB#T V MO S ESGRRO PINE ICRVSED-TEESQUREQ D-; PRIORITY AND GET DEVICE MASK BIC #177760,R5 ; ISOLATE TSTB TMCRSW(R5) ; RACE CONDITION BETWEEN TIMER AND DISC? BEQ DIHA01 ; NO-OK MOV (SP)+,PSR ; RESET CPU PRIORITY JMP RESTOR ; IGNORE INTERRUPT DIHA01: MOVB #1,CALLED(R5) ; SET CALLED BY INTERRUPT SWITCH ASL R5 ; R5 BECOMES DCUWX-DISC CONTROLLER UNIT ; ; WORD INDEX MOV TMTBL(R5), GOOV50 ; DISCIO READ ERROR PROCESSING ; .IFNZ $TMSLC!FXPART ; ; PUSH REQUEST INTO QPART TABLE QUEUE ; R0 = PRIORITY ; R1 = PRIORITY WORD INDEX ; R3 = TASK'S B3 REQUEST ADDRESS IF NEEDED ; QOVC00 = . MOV QPARTN(R1),R2 ; GET QPART TABLE ADDRESS THIS PRIORITY BEQ QOVB30 ; ERROR (-1), QPART DOESN'T EXIST MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMPB NREQ R5,PUSHR ; SAVE THE REGISTERS BFUP MOV 14.(SP),R5 ; PUT ADDRESS OF COM BLOCK INTO R5 BFUP JSR PC,FILECK ; IS THE FILE OK BFUP BNE BFER02 ; NO.-NOT BFUP. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT. BFUP BEQ BFER06 ; NOT FOUND BFUP CMPB #STOPEN,(R0) ; STATUS = OPEN-READ 40LARE Q BE SSREOGPRN ICEVIER-SEDSTUEEQ RITEX; 30LARE T BG D?TEESQUREQ D-; Q REDQ,#R1 PBCM CKTA SONR BEUM NSKTAT PU; P)(S,-R0 V MO . = 20LARE ; ERLLCAO TRNTURE; PC S RT RNTURER FOC PUPT SE; P)(S+,P)(S V MO S ERSTGIREE ORSTRE; R OP,PR5 R JS: 15LARE + P)(S T TS: 10LARE SSREOGPRN I/O ITHWI ; ; EDSTUEEQ RRTBO/A-Q/DITEX; LR3 ; RESET TIMER SO TIME-OUT MOV TDELAY,RESTIM(R3) ; WILL NOT OCCUR MOV (SP)+,PSR ; SET APPROPRIATE CPU LEVEL FOR THIS DEVICE MOV CRQPTR(R5),R1 ; ADDRESS OF CURRENT REQUESTS I/O LIST MOV DATA(R1),R4 ; ADDRESS OF I/O DATA BUFFER BIT #DERMSK,@DCS(R5) ; DID AN ERROR OCCUR? BEQ DIHA03 ;NO JMP DIHC00 ; YES-PERFORM APPROPRIATE FUNCTION DIHA03 = . .IFNZ DRQP(R0),MAXENT(R2) ; IS QPART FULL? BEQ QOVC30 ; YES TSTB NREQQP(R0) ; WILL THIS BE FIRST REQUEST? BPL QOVC10 ; NO - PUT IN QUEUE TST PRTADD(R2) ; YES - DO WE NEED ALLOCATION? BNE QOVC10 ; NO - PUT IN QUEUE MOV R3,B3RR ; SET SEARCH ADDRESS FOR B3 BIS #SRCHB3,B3FR ; START SEARCH REQUEST .IFZ $CORAL JSR PC,SEARCH .ENDC IN BFUP BEQ CLSA30 ; YES BFUP CMPB #STXUSE,(R0) ; NO - THEN IS IT OPEN-WRITE BFUP BNE BFER10 ; NO - ERROR BFUP MOV BFLNTH(R5),DLENTH-DSTAT(R0); PUT ELEM. LEN IN DIRECTORY BFUP ADD BFLNTH(R5),ZBUF+FNSEC ; AND ADD TO FILE SECTOR POINTERBFUP BICB #STFWRT,ZBUF+FSTAT ; REMOVE WRITE STATUS ON FILE BFUP INCB ZB 20LARE I BM S TUTA S'SSKTAT GE; R1),R0T(TATS VBMO K ACSTO NT ORDWOK OR WSHPU; ) SP-( T TS R BEUM NSKTAT GE; R0),SP.(14 V MO RSTEISEG RVESA; HRUS,PR5 R JS . = SKLTRE ; 0 =ATSTION HE WESINUTROUB SCEVIER SEMSTSYY BEDLLCA ; ; ; ITEX; 25OVDQ BR TSESQUREF OERMBNUT ENEMCRDE; 0)(RQPEQNR CBDE RYNT ERTPA QIDVO; 2)(R R CL C ND.E HESDI BITB #100,INOUT(R4) ; FILE DIRECTORY READ? BNE DIHB00 ; YES - GET INFORMATION .ENDC TSTB INOUT(R4) ; WRITE FROM A WRITE/WRITE CHECK? ; ; OR READ FROM READ/WRITE? BPL DIHA05 ; NO JMP DIHB30 ; YES DIHA05: CMPB TYPE(R1),#2. ; IS EXIT A TYPE 2? BNE DIHA20 ; NO CLR -(SP) BISB SYSTEM(R1),(SP) ; GET TASK NUMBER ACB ALLOSW(R2) ; SET ALLOCATION SWITCH QOVC10: MOV (SP)+,R4 ; GET TASK NUMBER SWAB R4 ; TASK NO./C = 0/PSTAT = WAITING MOV (SP)+,R5 ; GET TRANSMITTED ARGUMENT JSR PC,PUSHQP ; 'PUSH' ENTRY INTO QPART BNE QOVC20 ; NOT FIRST REQUEST-WAIT IN TURN MOV PRTADD(R2),R4 ; GET PARTITION ADDRESS MOV HEADQP(R2),R2 ; GET ADDRESS OF ENTRY TST R4 ; ARE WE REQUF+FNDNUM ; UPDATE DIRECTORY # COUNTER BFUP BNE CLSA20 ; SKIP IF DIR. NOT FULL BFUP MOV #-1,ZBUF+FDIRSC ; DIRECTORY FULL - SET DIR SEC=-1 BFUP BR CLSA40 ; BFUP CLSA20: BITB #7,ZBUF+FNDNUM ; DIRECTORY NOT FULL - IS SECTOR FULL? BFUP BNE CLSA40 ; NO. BFUP INC ZBUF+FDIRSC ; YES - INCREMENT DIRECTORY T XI-ENO; 25OVDQ L BP -TYRIIOPRC MINADY; ) R0B(TAPP TBTS T ARXP!FLCMS$T Z FN.I . = 50OVDQ SKTAM RO FITEXS-YE; X1XXQN P JM T ENIDES RRECOT NO; 50OVDQ Q BE S ESDRADR DEEA HSKTAT GE; 4 ,R1)(RERADHE V MO X DEIND OR WSKTAE UTMPCO; R1 L AS: 40OVDQ C ND.E T TAPSN ISTUEEQ RRTBO AET-SNO; 2)(RQ,TRBR#A VBMO S YE; 40OVDQ I BM ? ELEV LTYDND SET UP CALL CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,UNSPND ; UNSUSPEND CALLING TASK-EXIT TYPE 2 TST (SP)+ ; POP ERROR PARAMETER ON STACK DIHA20: MOV #1.,R2 ; SET R2 FOR PRIORITY LEVEL 1 MOV DQFRST(R5),R0 ; ADDRESS OF THIS DEVICE'S FIRST LIST MOV DQLAST(R5),R4 ; ADDRESS OF THIS DEVICE'S LAST LIST MOVB LEVEL(R1),R3 ; CURRENT PRIORITY OF REQUEST ASL R3 UESTING AN ALLOCATION? BNE QOVC15 ; NO JMP QOVA45 ; YES-ALLOCATE AND BUILD HEADER QOVC15: MOVB #IOIP,(R2) ; SET I/O IN PROGRESS IN PSTAT MOV (SP),PSR ; RESET PRIORITY LOCK-OUT BR QOVB00 ; SET UP AND START ROLL-IN QOVC20: MOV R3,R2 ; QPART ENTRY ADDRESS BR QOVB15 ; EXIT ; ; DETERMINE IF THERE ARE ANY ABORT REQUESTED ENTRYS ; IN QPART-IF THERE IS, USE IT!!SECTOR COUNTBFUP BR CLSA40 ; BFUP CLSA30: DECB ZBUF+FSTAT ; HERE FOR OPEN-READ BFUP CLSA40: CLRB (R0) ; CLEAR STATUS IN DIRECTORY BFUP MOVB #WFUN,ZFUN ; ALL ENTRIES DONE - SET TO DO WRITE. BFUP TST R3 ; TO DISK - FIRST, ALL IN SECTOR 0? BFUP BEQ CLSB20 ; YES BFUP MOVB #WFUN,AFRIIOPRC MINADY; ) R0B(TAPP TBTS T ARXP!FLCMS$T Z FN.I . = 30OVDQ ITEXD AN; 20VBQO P JM: 25OVDQ D TEESQURET ORABT SES-YE; 2)(RQ,TRBR#A VBMO NO; 30OVDQ T BL ? SSREOGPRN IRTBO AORO I/; IPIO,#R4 P CM R40,6077#1 C BI: 23OVDQ LYOVTSY BEDLLPUH US PSECAIN; 05OVDQ BR T OUCKLOT SERE; SR,PP)(S V MO OK; 23OVDQ E BN T TAPST GE; 4 ,R@ ; DOUBLE FOR WORD ADDRESSING ADD R3,R4 ; ADDRESS OF CURRENT LEVEL'S LAST LIST ADD R0,R3 ; ADDRESS OF CURRENT LEVEL'S FIRST LIST ASR R5 ; R5 = DISC CONTROLLER UNIT # MOV PSR,-(SP) ; SAVE PSR ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT MOV (R1),-(R3) ; PULL REQUEST OUT OF QUEUE THREAD BNE DIHA25 ; DIDN'T EMPTY PRIORITY LIST MOV R3,-(R4)  ; QOVC30 = . MOV 4.(SP),PSR ; RESET LOCKOUT QOVC35: MOV (R2),R5 ; GET QPART ENTRY INC R5 BNE QOVC40 ; OK-NOT END OF QPART JMP QOVB40 ; SORRY-QPART "IS" FULL-ERROR TYPE 1 QOVC40: CMPB (R2),#ABRTRQ ; ABORT REQUESTED ON ENTRY? BEQ QOVC50 ; YES-USE THIS CELL CMP (R2)+,(R2)+ ; NO-BUMP TO NEXT QPART CELL BR QOVC35 ; KEEP A LOOKIN' QOVC50: UN ; SET ABUF FOR WRITE ALSO. BFUP JSR PC,DISKBF ; NO - I/O LIST SET UP FROM GETELT BFUP BNE BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADD. ONLY IF USED ABUF. BFUP CLSB20: JSR PC,DISKBF ; HERE TO DO SEDTOR 0. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE. 2)(R V MO T OUK-OC LTYRIIOPRT SE; SR,PCKLO#P V MO: 20OVDQ C ND.E EMTHF ONE OINE BSTMU; 10OVDQ Q BE Y TRENS K'AS TOR FOKLO; H RCTS,QPC R JS L VELEH RCEA SMPBU; R0 C IN: 10OVDQ ESBLTAY ITORRI PERTH OCHARSE; R0 R CL ITT GO; 20OVDQ E BN Y RTDP Z FN.I Y TRENT ARQPS K'AS TNDFI; H RCTS,QPC R JS Y ITORRI PLEAB TSKTAT GE; R0),R1Y(RTTP VBMO: 05< ; EMPTY-LAST POINTS TO FIRST DIHA25: MOV R2,(R1) ; SET REQUEST LIST THREADABLE DIHA30: TST (R0)+ ; SEARCH DEVICE QUEUE FOR BNE DIHA40 ; HIGHEST PRIORITY LEFT-GOT IT! INC R2 ; CHECK NEXT REQUEST LEVEL CMPB R2,NDPRTY(R5) ; QUEUE EMPTY? BLE DIHA30 ; NO- SCAN SOME MORE MOV #-1.,R2 ; YES- RESET HPRIRQ DIHA40: MOVB R2,HPRIRQ(R5) ; UPDATE HPRIRQ APPROPRIATELY MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT CMPB (R2),#ABRTRQ ; ABORT STILL REQUESTED? BNE QOVC30 ; NO-START SEARCH ALL OVER MOV (SP)+,(R2) ; CONSTRUCT TASKNO/ C = 0/ SWAB (R2) ; AND PSTAT = WAITING MOV (SP)+,TRARG(R2) ; SET TRANSMITTED ARGUMENT JMP QOVB15 ; WAIT IN TURN .ENDC ; ; ; BSIZE BLOCKS NOT AVAILABLE AT THIS TIME ; R0 = PRIORITY ;  BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; THE SUBROUTINE GETELT IS USED BY BFUP TO SCAN A SPECIFIED BFUP *BFUP ; DIRECTORY FOR A GIVEN ELEMENT (NAME & TYPE). *BFUP ; *BFUP ; INPUT TO GETELT IS: OVDQ ) SP-(R,PS V MO RNTURER PERO POR FPCT SE; P)(S+,P)(S V MO R BEUM NSKTAT GE; 1 ,RP)(S2. V MO . = LYOVDQ ; -3R O-21,,-,9,5,4,3 2 =ATST TTHWIS SKTAT ORABY MA ; 1 = T ACVY O =ATST TTHWIK AS TRTBO AOTNNCA: TENO ; ; 6 OM CTSE.C E AG.P C ND.E ; ITEXD AN; 25OVQS BR D DEENSPSUY ILARNTLUVOT NOT SE; ) R2G(ARTR R CL: 50OVUS N -IEDLLROE BTOT ESQURE ; 40VAQO 8 CLR R2 BISB SYSTEM(R1),R2 ; GET TASK NUMBER BEQ DIHA45 ; ZERO-BYPASS DECB IOSTAT(R2) ; RESET I/O IN PROGRESS FOR TASK .IFNZ OVRLAY BNE DIHA45 ; NOT LAST ONE MOV (SP),PSR ; RESET LOCKOUT MOV R2,-(SP) ; TASK NO. ON STACK JSR PC,RELTSK ; RELEASE TASK .ENDC DIHA45: MOV (SP),PSR ; RESET LOCKOUT-LEAVE PSR ON STACK CMPB TYPE(R R2 = QPART ENTRY ADDRESS ; QOVD00 = . TSTB PPTAB(R0) ; DYNAMIC PRIORITY? BPL QOVB15 ; NO-WAIT FOR MEMORY SPACE ; ; SEARCH FOR CHECKPOINTABLE TASK ; PSTAT = 1, PARTITION CHECKPOINTABLE ; PSTAT = 2, VOL. SUSPEND & CHECKPOINTABLE ; CHECK LOWEST PRIORITY FIRST ; QOVD05: MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV #NPRIOR,R4 ; GET FIRST SEARCH PRIORITY QOVD10: CMP R0,R4 ; IS *BFUP ; R5 = ADDRESS OF COMMUNICATIONS BLOCK *BFUP ; SECTOR ZERO IN THE ZBUF *BFUP ; DISKIO LIST SETUP FOR ROS FILE *BFUP ; *BFUP ; OUTPUT FROM GETELT IS: *BFUP ; R3 = SECTOR # CONTAINING SPECIED ELEMENTS DIRECTORY ENTRY * P JM CTFEAFT N'WO' UEUE-QRE 'SO; 0)(RQPEQNR CBDE ERMBNUK AS TND A ; P)(S,-R1 V MO K ACSTN ONTMEGUAR0 T SE; ) SP-( R CL =0ATST/P=1ATST/CO. NSKTA; ; S ALTUI BBEL IL WRYNT ESOT SE; R10,0000#1 S BI SSREDD AB3E ATRIOPPRAP ; D ADB3,FPC R JS D IN FTOR BEUM NSKTAE US; 3 ,RR1 V MO R BEUM NSKTAO TCKBAT GE; R1 R AS S YE; 41),#3. ; IS EXIT A TYPE 3? BNE DIHA47 ; NO MOV R5,-(SP) ; YES-SAVE DISC CONTROLLER UNIT NO. JSR PC,@EXIT(R1) ; EXECUTE I/O COMPLETE SUBROUTINE MOV (SP)+,R5 ; RESTORE DISC UNIT NUMBER DIHA47: CLR R4 ; SET CALLED BY DISCIO DIHA50: MOV R5,R0 ASL R0 ; CALCULATE DCUWX MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC NODREQ(R0) ; DECREMENT NO. REQUESTS REQUEST'S PRI. LOWER OR EQUAL? BGE QOVB15 ; YES-CAN'T CHECKPOINT THEN TSTB PPTAB(R4) ; IS SEARCH PRIORITY DYNAMIC? BPL QOVD40 ; NO-BUMP TO NEXT LEVEL MOV R4,R5 ; CALCULATE SEARCH PRIORITY ASL R5 ; WORD INDEX MOV QPARTN(R5),R1 ; GET PRIORITY'S QPART ENTRY BEQ QOVD40 ; DOESN'T EXIST - BUMP TO NEXT LEVEL QOVD20: MOV (R1),R5 ; SEARCHED TO BFUP ; R2 = ADDRESS OF LAST CELL IN LAST EXAMED BUFFER (ZBUF OR ABUF) *BFUP ; R0 = ADDRESS IN BUFFER OF STATUS BYTE OF ENTRY IF FOUND *BFUP ; = 0 IF ELEMENT NOT FOUND *BFUP ; Z STATUS BIT SET IFF ELEMENT NOT FOUND *BFUP ; ABUF CONTAINS SECTOR WITH THE ELEMENT'S DIRECTORY ENTRY (UNLESS*BFUP ; ENTRY FOUND IN SECTOR 0. *BFUP ; 50OVUS Q BE S?ESGRRO PINL ILSTO I/; IPIO0!20,#2)(R PBCM . = 40OVUS ; SSREDD ARYNT ERTPA Q =R2 ; STUEEQ RY'VLQO ' AKELI ; G INOKLOY BINL-OL RSTUEEQ RT,OUD-LEOL RAS WSKTA ; ; TCKPCH Z FN.I N URET R; 25OVQS BR UEUE QTYRIIOPRS RO ; ) R3T(AS,LR4 V MO O NT ICKBAK AS TADRETH; 3)(RSTLA,@R4 V MO 0 =RDWOD EAHR TSKTAT SE; 4)(R R CL USATSTS RON I0 QUEUED THIS DEVICE BPL DIHA55 ; MORE REQUESTS LEFT MOV TMTBL(R0),R1 MOV #NOPTIM,TIMJSR(R1) ; IGNORE NEXT TIMER COMPLETE DIHA55: TSTB CALLED(R5) ; ERROR AND D-Q'ED-? BEQ DIHA60 ; YES-FROM CALLER-EXIT AS SPECIFIED BMI DIHA57 ; YES-FROM TIME-OUT TST NODREQ(R0) ; ANY MORE PENDING REQUESTS? BPL DIHA62 ; YES MOV (SP)+,PSR ; RESET PRIORITY LOCKOUT END OF TABLE? INC R5 ; -1 TAIL MARKER BEQ QOVD40 ; YES BUMP TO NEXT LEVEL MOVB (R1),R5 ; GET CSTAT AND PSTAT BLE QOVD30 ; ALREADY CHECKPOINTED - VOID - OR WAITING CMPB R5,#VOLSCK ; IS IT CHECKPOINTABLE? BLE QOVD50 ; YES - DETERMINE IF CORE SPACE ADEQUATE QOVD30: CMP (R1)+,(R1)+ ; BUMP TO NEXT ENTRY BR QOVD20 ; AND EXAMINE IT. QOVD40: DEC  *BFUP ; SUBROUTINES USED: DISKBF *BFUP ; *BFUP ; ALL UNUSED REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP GETELT =. ; ENTRY POINT BFUP EDEUQUT SE; ) R1T(TATSS,ROIN#Q VBMO R BEUM NSKTAT GE; R1 R AS G LA FNDPEUS SL.VOT SERE; ) R2G(ARTR R CL TETA SATST PUSIOEVPRM RO F ; ; LEABPTCKT NOR OLEABPTCKT SE; 2)(R.,#1 B SU C ND.E N -ILLROC MINADYR FOP UET S -NO; 40OVUS Q BE TCKPCH Z FN.I T?ENIDES RRECOL ILSTK AS TIS; 4 ,R1)(RERADHE V MO T OUK-OC LTYRIIOPRT SE; SR,PCKLO#P , JMP RESTOR ; NO-EXIT FROM INTERRUPT ; DIHA57 = . MOV (SP)+,PSR ; RESET PRIORITY LOCKOUT CLRB TMCRSW(R5) ; RESET TIMER SWITCH RTS PC ; RETURN TO TIMER ; ; ERROR EXIT AFTER QUEUED BUT I/O NOT STARTED ; R4 = 0 CALLED BY DISCIO ; R4 = NOT 0 CALLED BY COMPRS AFTER REQUEUE IN CPD'Q' ; DIHA60 = . TST R4 ; CALLED BY COMPRS? BNE DIHA R4 ; BUMP SEARCH LEVEL TO NEXT HIGHEST BR QOVD10 ; ; DETERMINE IF CHECKPOINTABLE OVERLAY TASK AFFORDS ; ENOUGH MEMORY SPACE FOR HIGHER PRIORITY'S REQUEST ; R0 = REQUEST'S PRIORITY ; R1 = SEARCH ENTRY'S QPART ADDRESS ; R2 = REQUEST'S QPART ADDRESS ; R4 = SEARCH ENTRY'S PRIORITY ; QOVD50 = . CLR R5 BISB OVTSK(R2),R5 ; REQUEST'S ENTRY TASK NUMBER CLR  MOV #ZBUF+FID+FFLAG2+2-FID,R0 ; PUT ADDRESS OF ENTRY 1, BFUP ; SECTOR 0 INTO R0 BFUP MOV #ZBFEND,R2 ; ADDRESS OF LAST WORD IN BUFFER BFUP CLR R3 ; SECTOR # OF SEARCH BFUP GETA10: CMP (R0)+,BFELN1(R5); DOES FIRST TRIAD MATCH? BFUP BNE GETA20 ; NO BFUP CMP (R0)+,BFELN2(R5); YES. DOEV MO X DEIND OR W #SKTAE UTMPCO; R1 L AS: 30OVUS C ND.E S TUTA SORRR ERENOIG; + P)(S T TS E ULOD MADRETHUN; E IMQT,DPC R JS R METIG INUEUE-QDE ; P)(S,-R4 V MO LEHI WUT-OCKLOT SEREN CA ; SR,PP)(S V MO WEO SUEAL VERIM TLLFUA T SE; ) R4M(TIES,R1.#- VBMO: 25OVUS RNTURED AN ; 25OVQS BR K ACSTN OCHITSWR ROERT SES-YE; P)(S4. C IN (61 JMP DIOD25 ; NO-EXIT AS SPECIFIED DIHA61: MOV (SP)+,PSR ; RESET LOCKOUT JMP DIOD20 ; EXIT NORMALLY ; DIHA62: MOV (SP)+,PSR ; RESET PRIORITY LOCKOUT BR DIHB20 ; PROCESS HIGHEST REQUEST IN QUEUE ; .IFNZ DRESDI ; ; FIND FILES REQUESTED DIRECTORY FROM DIRECTORY BUFFER ; USING CALCULATED INDEX WHICH WAS SAVED IN SYSTM2 ; R1 = ADDRESS OF I/O LIST ; R4 = ADDRESS R3 BISB BSIZE(R5),R3 ; NO. OF CORE BLOCKS NEEDED CLR R5 BISB OVTSK(R1),R5 ; GET SEARCH ENTRY'S TASK NO. ASL R5 ; CALCULATE TASK # WORD INDEX MOV HEADER(R5),R5 ; GET TASK'S PROGRAM HEADER ADDRESS ; NOTE: HEADER MAY BE ZERO IF INT. CAME IN & CHECKPOINTED SEARCH ; TASK. IF IT PASSES CORE SPACE TEST, IT WILL FAIL TEST AFTER ; LOCKOUT SET. THIS TECHNIQUE REDUCES LOCKOUT TIME CONSIDERABLY. S SECOND TRIAD? BFUP BNE GETA30 ; NO. BFUP CMPB 1(R0),BFTYPE(R5); YES. DOES TYPE? BFUP BNE GETA30 ; NO BFUP CMPB (R0),#STDELT ; YES - DELETED ELEMENT? BFUP BEQ GETA30 ; YES- SKIP IT THEN. BFUP CLZ ; FORCE STATUS BIT FOR RETURN BFUP NO; 25OVUS Q BE URCC OONTIDION CCERAR METI; 4)(RCERATM T TS UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO LEDUMOR METIS Y'ITORRI POFS ESDRAD; R4D,MOIM#T D AD S ESDRADE BLTAT ARQPT GE; 4 ,R3)(RTNARQP V MO NO; 30OVUS E BL Y ITORRI PCELI-SMETI; ) R0B(TAPP TBTS LCMS$T Z FN.I . = 20OVUS C ND.E EMTHF ONE OINE BSTMU; 10OVUS Q BE Y TRENS $ OF I/O DATA BUFFER ; R5 = DCUWX ; DIHB00 = . BICB #100,INOUT(R4) ; RESET SWITCH MOVB SYSTEM+1(R1),R2 ; GET INDEX INTO FILE BUFFER BIC #177700,R2 ; ISOLATE MOV R2,R0 ASL R0 ; PERFORM ASL R0 ; MULTIPLICATION ADD R0,R2 ; BY 5 ADD R2,R2 ; NOW DOUBLE FOR WORD ADDRESSING ADD DFDBAD(R5),R2 ; ADDRESS OF REQUESTSMOV PHNOB(R5),R5 ; OVERLAY'S SB & NOB CMPB R3,R5 ; WILL REQUEST FIT? BGT QOVD30 ; NO, KEEP-A-SEARCHIN' SWAB R5 CMPB R5,ALPOOL(R0) ; START BLOCK COMPATABLE WITH ALPOOL DEF.? BLT QOVD30 ; NO, KEEP-A-SEARCHIN' MOV #PLOCK,PSR ; YES-LOCK-OUT AND RE-CHECK TSTB (R2) ; IS REQUEST STILL WAITING? BEQ QOVD60 ; YES QOVD55: JMP QOVB15 ; NO-F RTS PC ; YES - ALL DONE RETURN TO USER. BFUP GETA20: TST (R0)+ ; INCREMENT R0 BY 2 BFUP GETA30: ADD #BFLNTH-DSTAT+4,R0 ; BUMP R0 TO NEXT ENTRY BFUP CMP R0,R2 ; OR ARE WE OUT OF THE BUFFER? BFUP BLO GETA10 ; NOPE. PROCEED WITH SEARCH BFUP MOV #ABUF+BHEAD+DNAME1,R0 ; YUP. SET R0=ADD OF FIRST ENTRYBFUP ; IN ABUK'AS TOR FOKLO; H RCTS,QPC R JS L VELEH RCEA SMPBU; R0 C IN: 10OVUS ESBLTAY ITORRI PERTH OCHARSE; R0 R CL ITT GO; 20OVUS E BN Y RTDP Z FN.I Y TRENT ARQPS K'AS TNDFI; H RCTS,QPC R JS Y ITORRI PLEAB TSKTAT GE; R0),R1Y(RTTP VBMO CKTA SONS TUTA SORSSCERO PVESA; ) SP-(R,PS V MO H TCWI SRNTURER ROERR EACL; P)(S2. R CL R BEUM NSKTAT GE; 1 ,R  DIRECTORY TST (R2) ; FILE ID ACTIVE? BEQ DIHB40 ; NO-ERROR TYPE 7 JSR PC,CFILID ; CHECK FILE ID AND SET UP FOR XFER TST R0 ; ERROR OCCUR BNE DIHD00 ; YES-TYPE 8,9,10 OR 13 .ENDC DIHB10: MOV R5,R0 ; R0=DCUWX ASR R5 ; R5=DISC CONTROLLER UNIT NUMBER CMPB LEVEL(R1),HPRIRQ(R5) ; HAVE HIGHER PRIORITY REQUESTS BGT DIHB20 ORGET ABOUT CHECKPOINTING QOVD60: MOVB (R1),R5 ; IS TASK STILL CHECKPOINTABLE? BLE QOVD05 ; NO-RESTART SEARCH CMPB R5,#VOLSCK BGT QOVD05 ; NO-RESTART SEARCH .IFZ CHKPTC ; ; DETERMINE IF TASK HAS EVER EXECUTED. IF NOT, NO NEED ; TO ROLL-OUT LOGIC WILL EXECUTE(QOVE10). OTHERWISE, WAIT ; FOR AVAILABLE CORE SPACE. ; CLR R5 BISB OVTSK(R1),R5 ; ROLL-OUT TASK NUMBER F BFUP MOV #ABFEND,R2 ; SET R2 = ADDRESS OF ABUF LAST WORD BFUP INC R3 ; ADD 1 TO R3 (SECTOR COUNTER BFUP CMP R3,#DIRMAX ; HAVE WE CHECKED ALL SECTORS BFUP BLT GETA50 ; NOT YET BFUP CLR R0 ; YES. R0 = 0 SINCE NOTHING FOUND BFUP RTS PC ; RETURN BFUP GETA50: MOV P)(S2. V MO . = VYSOUN ; D.DEENSPSU ; LYRITAUNOL VENBES HAT HA TSKTAY LAEROVD LIVAA D ENSPSUUN ; ; T XI END ANDPEUS SS,TUTA SET-SNO; 20OVQS BR C ND.E R METIT UCTRNSCOS-YE; 10OVQS T BG Y?ITORRI PCELI-SMETI; ) R0B(TAPP TBTS LCMS$T Z FN.I E BLTAKP COT N &NDPEUS SL.VO= T TAPST SE; 2)(RK,NCLS#V VBMO: 30OVQS ; OMRPM RO FITEX; 20VBQO P JM: 25OVQS CKTA SFF OCHITSWY BED ; BEEN QUEUED. YES-PROCESS ; ; THOSE FIRST JMP DIOE00 ; NO/START REQUEST'S I/O ; ; JMP TO GET TO DIOB00 ; DIHB20: JMP DIOB00 DIHB30: BITB #4.,INOUT(R4) ; I/O FCN TYPE 4? BEQ DIHB10 ; NO JSR R5,PUSHR ; SAVE REGISTERS JSR PC,@EXIT(R1) ; EXECUTE USER I/O SUB FOR FIRST TIME JSR R5,POPR ; RESTORE REGISTERS TSTB IOSTAT(R5) ; TASK HAVE ANY I/O IN PROGRESS BNE QOVD55 ; YES-SORRY CHARLIE ASL R5 ; COMPUTE WORD INDEX OF TASK NO. MOV HEADER(R5),R5 ; GET HEADER ADDRESS TST TSTACK(R5) ; TASK EVER EXECUTED? BEQ QOVE00 ; NO-EXECUTE ROLL-OUT LOGIC BR QOVD55 ; YES-WAIT FOR AVAILABLE CORE .ENDC ; .IFNZ $TMSLC!CHKPTC ; ; INITIATE ROLL-OUT OF AN OVERLAY  #ABUF,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP MOVB #RFUN,AFUN ; SET STATUS FOR READ BFUP MOV R3,ASEC ; SET SECTOR # BFUP JSR PC,DISKBF ; GO READ SECTOR BFUP BEQ GETA10 ; NO ERRORS - GO PROCESS THIS BUFFER BFUP GETA99: TST (SP)+ ; FIX STACK - DISK I/O ERROR BFUP JMP BFERDK ; TO FAR FOR A BRANCH LLCAP PO; + P)(S T TS D DEENSPSUY ARNTLUVOK AS TET S);R5T(TATSS,SUOL#V VBMO ) CHSR QOMFRE AS CIN ( #SKTAT GE; 5 ,RSKTA$C V MO: 20OVQS C ND.E ORRR ERENOIG; + P)(S T TS E ULOD MERIM TADRETH; METI,QPC R JS S NDCOSE6 37 'ATG DOH-TCWA; P)(S,-76#3 V MO K ACSTO TSSREDD ALEDUMO; P)(S,-R3 V MO T SEREG LA FCERAE UR SKEMA; 3)(RCERATM R CL E ULOD MERIM TOFS ESDRAD;  BR DIHB10 ; NO WRITE NOW DIHB40 = . MOV #7,R0 ; ERROR TYPE 7 BR DIHD00 ; REPORT .PAGE ; ; ERROR OCCURRED DURING DISC XFER ; R1 = ADDRESS OF I/O LIST ; R4 = ADDRESS OF I/O DATA BUFFER ; R5 = DISC CONTROLLER UNIT WORD INDEX-DCUWX ; DIHC00 = . MOV R5,R0 ASR R0 ; CALCULATE DISC CONTROLLER UNIT # BIT #RETDCS,@DCS(R5) TASK ; TASK TO BE ROLLED-OUT IS SUSPENDED EITHER VOL. OR INV. ; R0= PRIORITY OF TASK REQUESTING ROLL-OUT ; R1= QPART ENTRY ADDRESS OF ROLL-OUT TASK ; R2= QPART ENTRY ADDRESS OF REQUEST TASK ; R4= PRIORITY OF ROLL-OUT TASK ; *INTERRUPTS MUST BE LOCKED-OUT AT THIS POINT* ; QOVE00 = . JSR PC,ROLSUP ; ROLL-OUT STATUS SET-UP MOV (SP),PSR ; RESET PRIORITY LOCKOUT MOV R5,-(SP) BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; THIS SUBROUTINE, FILECK, IS USED BY ALL BFUP ENTRY POINTS TO: *BFUP ; 1) INSURE THAT BFUP IS AVAILABL FOR USE *BFUP ; 2) READ SECTOR 0 INTO ZBUF, THUS INSURING THAT THE SPECIFIED *BFUP ; ROS FIL R3D,MOIM#T D AD S ESDRADG INNNGIBEE BLTAT ARQP; 3 ,R0)(RTNARQP V MO X DEIND OR WTYRIIOPRE UTMPCO; R0 L AS . = 10OVQS ; SKTAE ICSLE-IM TOFN IONSPEUS SRYTAUNOL VOR FERIM TUPT SE ; ; LCMS$T Z FN.I ; C ND.E Y TRENG INITWAR FOS UEUE QCHARSE; H RCQS P JM TCKPCH Z FN.I C ND.E ITEXT,KP CNOC-MINADY; 20OVQS BR TCKPCH FZ.I C ND.E C ND.E ; CHECK DCS FOR RETRIABLE ERROR BNE DIHC10 ; MASK HITS - RETRY BIT #RETDAE,@DAE(R5) ; CHECK DAE FOR RETRIABLE ERROR BEQ DIHC20 ; MASKS DIDN'T HIT-DON'T WASTE TIME RETRING DIHC10: DECB NOTRYS(R0) ; DECREMENT ERROR RETRY COUNTER BEQ DIHC20 ; SORRY-NO MORE TRIES LEFT MOV #400,@DCS(R5) ; RF-11 AND DDS DISC CLEAR DIHC15: MOV CDCS(R5),R2 ; GET DCS THAT CAUSED ERROR ASR R2  ; SET IN STACK-R3 & R4 SET JSR PC,DQRPOM ; AND DE-QUEUE IT FROM ROS TST (SP)+ ; IGNORE ERROR INDICATOR ; ; SET TASK STATUS OF ROLL-OUT TASK VOLUNTARILY OR INVOLUTARILY ; SUSPENDED. IF VOL. CANNOT BE QUEUED, ETC. MAY BE ABORTED ; OR UNSUSPENDED THOUGH. ; R0 = PRIORITY OF TASK REQUESTING ROLL-OUT ; R1 = QPART ENTRY ADDRESS OF ROLL-OUT TASK ; R2 = QPART ENTRY ADDRESS OF REQUEST TASK ; R3 = TASK E IS DEFINED IN ROS. *BFUP ; 3) SETING THE STATUS BITS & ROTO 1 IF THE FILE HAS NOT BEEN *BFUP ; INITIALIZED AS A BFUP FILE. IF THE FILE IS INITIALIZED, RO *BFUP ; IS SET TO 0 AND THE STATUS BITE ARE SET ACCORDINGLY. *BFUP ; ERROR EXITS ARE TAKEN IF ITEMS 1 OR 2 ARE NOT CORRECT. *BFUP ; ONLY REGISTER R0 IS USED AND NOT RESTORED. *BFUP ; D CELI-SMETI; 10OVQS L BP LCMS$T Z FN.I C ND.E D XEFI; 20OVQS Q BE RTPAFX Z FN.I E?YP TTYRIIOPR; ) R0B(TAPP TBTS T ARXP!FLCMS$T Z FN.I LEABNTOIKPECCH& D ENSPSU. OL VT:TAPST SE; 2)(RK,SCOL#V VBMO NO; 30OVQS E BG E?BLTAINPOCKHE CONTITIAR PIS; CKTNPR,#2)(R PBCM RDWO. RG ARTPA QING LA FNDPEUS SL.VOT SE; ) R2G(ARTR C IN ONTIMAORNF ; ISOLATE BIC #177774,R2 ; I/O FUNCTION DEC R2 ; PRIME FOR START I/O MOVB PRIME(R2),R2 ; SET IT FOR DIOC// JMP DIOC10 ; RESTART I/O ; ; REPORT ERROR ; DIHC20 = . MOV #ERR011,R0 ; REPORT ERROR TYPE 11 DIHC25: JSR PC,ERR ; VIA INTERNAL ERROR SUBROUTINE .IFNZ ERRPRT MOV ERRMOD(R5),R2 ; ADDRESS OF DEVICE'S ERROR MODULE MOV R0, HEADER ADDRESS OF ROLL-OUT TASK ; R5 = TASK # OF ROLL-OUT TASK ; QOVE10: TST TSTACK(R3) ; HAS ROLL-OUT TASK EVER EXECUTED? BEQ QOVE30 ; NO-NO NEED TO ROLL-OUT THEN MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT THEN MOVB #VOLSUS,TSTAT(R5) ; SET VOL. SUSPEND TST TRARG(R1) ; IS IT? BNE QOVE20 ; YES INCB TSTAT(R5) ; NO-ADJUST QOVE20: MOV (SP),PSR ; RESET PRIORITY LOC *BFUP ;***********************************************************************BFUP FILECK =. ; ENTRY POINT BFUP CLR (R5) ; CLEAR BFUP COM BLOCKS ERROR WORD BFUP TSTB BFBUSY ; IS BFUP IN USE BFUP BNE FLCK98 ; YES - ERROR BFUP INCB BFBUSY ; SET BFUP BUSY FLAG BFUP CLR ZSEC IRYNT ERTPA QNDFI; N RTQP,FPC R JS H RCQSR FO; ; K ACSTN OLYOVQSY BEDLLCAT SE; ) SP-(.,#1 V MO CKTA SONS TUTA SORSSCERO PVESA; ) SP-(R,PS V MO RNTURER PERO POR FPCT SE; P)(S+,P)(S V MO R BEUM NSKTAT GE; 1 ,RP)(S2. V MO . = LYOVQS ; K ACSTM TEYS SON ; VESA QBYD DEENSPSUY ILARNTLUVON EE BDYEALR AAS HSKTA ; ; 5 OM CTSE.C E AG.P ; ERRNUM(R2) ; SET ERROR NUMBER IN MODULE MOVB DEVICE(R1),ARGM1(R2) ; SET LOGICAL DEVICE IN MODULE MOV DUSE2(R4),ARGM2(R2) ; SET SECTOR ADDR. IN MODULE MOV @DCS(R5),ARGM3(R2) ; SET DCS IN MODULE MOV @DAE(R5),ARGM4(R2) ; SET DAE IN MODULE MOV R2,-(SP) ; SET MODULE ADDRESS ON STACK JSR PC,ERRTYP ; TYPE SYSTEM ERROR MESSAGE .ENDC MOV @DCS(R5),DUSE1(R4) ; REPORT BACK DCS AS PROKOUT MOV R2,HWRKWD(R3) ; SET REQUEST'S QPART ENTRY ADDR IN WRKWD MOVB R0,PHPRI(R3) ; SAVE PRIORITY OF REQUESTING TASK ; ; NOTE: ROLL-OUT TASK'S PRIORITY ; ; IS STILL IN PROGRAM HEADER MOVB #3.,HIOFCN(R3) ; SET WRITE WITH WRITE DISC CHECK MOVB #3.,HIOEXT(R3) ; SET EXIT TYPE MOV #GETOV,HIOCMP(R3) ; SET I/O COMPLETE SUBROUTINE ADDRESS MOV R3,R4  ; SET SETOR NUMBER ZERO IN DISK ADDRESS.BFUP MOV #ZBUF,R0 ; GET ADDRESS OF BUFFER FOR SECTOR ZERO BFUP MOVB #RFUN,ZFUN ; SET SECTOR 0 FOR READ BFUP MOV 2(R5),(R0) ; SET BOTH BUFFERS WITH FILE ID. BFUP MOV 2(R5),ABUF ; BFUP MOV R0,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP JSR PC,DISKBF ; READ IN SECTOR 0 ; RNTURE; PC S RT: 20CKNO C ND.E S ERSTGIREE ORSTRE; R OP,PR5 R JS: 10CKNO T OUCKLOT SERE; R PS+,P)(S V MO E BLTAINPOCKHE COT N =ATST P'SSKTAT SE; 2)(RK,NCRT#P VBMO N IOATRMFOINT ARQPS K'AS TNDFI; N RTQP,FPC R JS T OUCKLOT SE; SR,PCKLO#P V MO Y ITORRI PVESA; ) SP-(R,PS V MO N URET RND ARENOIG- NO; 10CKNO T BL Y?LAEROVN AERLLCA; INTMOV,#R1 PBCM MISED MOV @DAE(R5),DUSE2(R4) ; AND DAE/DER MOV #400,@DCS(R5) ; RF-11 AND DDS DISC CLEAR BICB #300,INOUT(R4) ; JUST INCASE-RESET FOR USER DIHC30: JMP DIHA05 ; PERFORM EXIT FUNCTION ; ; ; ; REPORT ERROR AND EXIT APPROPRIATELY ; AFTER PULLING REQUEST OUT OF QUEUE ; R0 = ERROR TYPE ; R1 = I/O LIST ADDRESS ; R5 = DISC CONTROLLER UNIT NO. OR DCUWX ; DIHD00 = . ASR R5  ADD #HFLEID,R4 ; ADDRESS OF DATA BUFFER MOV R4,HDBADD(R3) ADD #HIOLST,R3 ; CALCULATE ADDRESS OF DISC I/O LIST MOV R3,-(SP) ; TO STACK WITH IT JSR PC,CHKPIO ; ROLL IT OUT TST IOERRW(R3) ; DID REQUEST PROCESS ERROR OCCUR? BNE QOVE40 ; YES JMP QOVB15 ; RETURN TO CALLER QOVE30: CLRB (R1) ; RESET TO WAITING FOR SERVICE ADD #PHNOB,R3  BFUP BEQ FLCK10 ; NO DISK I/O ERRORS. BFUP CMP #7,DSKERR ; WAS THIS A REAL ROS FILE? BFUP BEQ FLCK99 ; NO DISK I/O ERROR - ALL IS AOK. BFUP BR GETA99 ; YES. THEREFORE A REAL I/O ERROR. BFUP FLCK10: CMP FFLAG1(R0),(PC)+; LET'S SEE IF THIS IS A BFUP FILE? BFUP .RAD50 /.BF/ ; FIRST WORD OF FLAG BFUP BNE FLCK30 ERMBNUK AS T'SERLLCAT GE; 1 ,RSKTA$C V MO RSTEISEG RVESA; HRUS,PR5 R JS K AS TVETIAC; 20CKNO Q BE M RO FEDLLCAE BSTMU; VETIAC T TS C SLTM!$TCKPCH Z FN.I . = PTCKNO ; ; ; C ND.E CHARSEE NUTION C; 35CHQS BR UT-OCKLOY ITORRI PETES R; SR,PP)(S2. V MO: 80CHQS H RCEA SRTTAES R; 05CHQS BR UT-OCKLOY ITORRI PETES R; SR,PP)(S2.  ; MAKE UNIT NUMBER DIHD10 = . ; R5 = UNIT NUMBER JSR PC,ERR ; REPORT ERROR TSTB CALLED(R5) ; CALLED BY INTERRUPT? BNE DIHC30 ; YES-PERFORM I/O COMPLETE FCN ASL R5 ; R5 = DCUWX JMP DIHA20 ; PULL REQUEST AND EXIT AS SPECIFIED .PAGE ; ; TIMOUT IS AN INTERNAL SUBROUTINE TO DISCIO THAT IS CALLED ; FROM TIMER WHEN THE 100 MSEC TIME-OUT ON THE DIS ; PARTITION ADDRESS MOV R3,R4 ; TO R4 FOR QOVB00 MOV R0,R1 ; CALCULATE REQUEST'S ASL R1 ; PRIORITY WORD INDEX JMP QOVB00 ; ROLL-IN REQUESTING TASK ; ; ERROR OCCURRED DURING THE DISCIO REQUEST PROCESSING ; SOMETHING WRONG-CAN'T ROLL-OUT ; QOVE40: MOV R5,R1 ; TASK NUMBER TO R1 JSR PC,FQPRTN ; GET QPART INFO. OF ROLL-OUT TASK JMP GE ; NOT BFUP FILE BFUP CMP FFLAG2(R0),(PC)+; FIRST WORD OK - IS THE SECOND? BFUP .RAD50 /UP./ ; SECOND WORD OF FLAG. BFUP BNE FLCK30 ; NOT A BFUP FILE BFUP CLR R0 ; IT IS A BFUP FILE SET R0 & STATUS BITSBFUP RTS PC ; RETURN BFUP FLCK30: MOV #1,R0 ; SET R0 AND STATUS BITS - NOT BFUP V MO: 70CHQS ; T OUL-OL RTEIAITIN; 10VEQO P JM T OUCKLOU CPT SERE; SR,PP)(S V MO UPT-SES TUTA SUT-OLLRO; P SUOL,RPC R JS SKTAT OUL-OL ROFS ESDRADY TRENT ARQP; 1 ,RR5 V MO CKTA SFF OCHITSWY BEDLLCAP PO; + P)(S T TS NO; 80CHQS T BL ? OLPOALH IT WLEABATMPCOK OCBLT ARST; ) R0L(OOLP,AR3 PBCM R3 ABSW NO; 80CHQS T BG E?BLLAAIAVS CKLO BOF C XFER ; OCCURS. ; R1=ADDRESS OF TIMER MODULE THAT TIMED-OUT ; TIMOUT = . MOV R1,R2 ; SAVE ADDRESS MOV -(R1),R0 ; GET DISC DEVICE UNIT NUMBER MOV R0,R5 ASL R5 ; CALCULATE DCUWX INCB TMCRSW(R0) ; SET TIMER COMPLETE SWITCH MOVB #-1.,CALLED(R0) ; SET CALLED BY TIMER TIME-OUT MOV CRQPTR(R5),R1 ; GET CURRENT REQUEST ADDRESS MOV DATA(R1),R4 OV20 ; DISCIO WRITE ERROR PROCESSING .ENDC ; .PAGE .CSECT OM2 ; ; ON SYSTEM STACK ; EXITING TASK HEADER HAS BEEN "CLEANED-UP" ; QOVNXT = . MOV 2.(SP),R1 ; GET EXITING TASK NUMBER MOV (SP)+,(SP) ; SET PC FOR PROPER RETURN MOV PSR,-(SP) ; SAVE PROCESSOR STATUS JSR PC,FQPRTN ; GET QPART ENTRY INFORMATION QNX000: MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT BFUP RTS PC ;FILE RETURN. BFUP FLCK98: TST (SP)+ ; FIX STACK BFUP JMP BFER08 ; TO FAR FOR A BRANCH BFUP FLCK99: TST (SP)+ ; FIX STACK BFUP JMP BFER01 ; TO FAR FOR A BRANCH BFUP .PAGE BFUP ;***********************************R BEUM NINT FI; 3 ,RR1 PBCM ZESI B'SSKTAT GE; R1),R1E(IZBS VBMO O. NSKTAT GE; R1),R2K(TSOV SBBI R1 R CL N AIAGH RCEA SRTTA S -NO; 70CHQS E BN T TAPSE ATOLIS; R10,6077#1 C BI N AIAGH RCEA SRTTA-SIDVOY TREN; 70CHQS Q BE ? NGTIAI WLLTI SSKTAD HERCEA SIS; 1 ,R2)(R V MO T OUK-OC LTYRIIOPRT SE; SR,PCKLO#P V MO . = 60CHQS ; CEPA SRECOS K'  ; GET CURRENT I/O DATA BUFFER DECB TIMCTR(R0) ; DECREMENT TIME-OUT RETRY COUNTER BEQ TOTA10 ; TRIED ENOUGH-NOW TELL 'EM MOV #400,@DCS(R5) ; RF-11 AND DDS DISC CLEAR MOV R2,-(SP) MOV TDELAY,-(SP) ; RE-THREAD TIMER JSR PC,QTIME TST (SP)+ ; IGNORE ERROR BR DIHC15 ; ; REPORT TIME-OUT ERROR-STOP DISC I/O ; RECOVERY NOT YET ESTABLISHED ; TOTA10 = .  CLRB TSTAT(R1) ; SET TASK QUIESCENT QNXXXX: ASL R1 ; TASK WORD INDEX QNXXX1: CLR HEADER(R1) ; SET TASK NOT CORE RESIDENT IN TASK TBL .IFNZ $TMSLC!FXPART TSTB PPTAB(R0) ; DYNAMIC PRIORITY LEVEL? BPL QNXC00 ; NO- 'PULL' QPART TABLE .ENDC MOV PHNOB(R4),B3RR ; DE-ALLOCATE THE TASK'S CORE SPACE BIS #DEALB3,B3FR ; SET DE-ALLOCATION FUNCTION .IFZ $CORAL ************************************BFUP ; *BFUP ; DISKBF IS AN INTERNAL SUBROUTINE USED BY BFUP TO DO DISK I/O USING *BFUP ; THE EMT DISCIO. IT PUSHS THE LIST ADDRESS ON THE STACK, USES THE EMT*BFUP ; AND, ON RETURN, CHECKS THE STATUS. NON-ZERO STATUS WILL CAUSE THE *BFUP ; THE ERROR STATUS TO BE SET IN THE COMMUNICATIONS BLOCK *BFUP ; *BFUP AS TLEABNTOIKPECCH ; N IIT FLLWIT IIFE INRMTEDE- Y TRENG INITWAD UNFO ; ; 20OVQS P JM E BLTAKP C &US SL.VO= T TAPSS T'ESQURET SE; 5)(RK,SCOL#V VBMO NGOI GEPKE- O N; 20CHQS E BL S T'ARQPR IOPR NEDCHARSE; ORRINP,#R0 P CM: 55CHQS T XI END ALEABNTOIKPECCHT SE; 20PTCK BR NO; 55CHQS E BN PTCKY BEDLLCA; P)(S T TS . = 50CHQS ; ERLLCAE INRMTEDE ; ;  MOV #ERR012,R0 ; REPORT ERROR TYPE 12 BR DIHC25 .PAGE ; ; ; ; ERR IS AN INTERNAL SUBROUTINE TO DISCIO THAT WILL ; SET AN ERROR CLASSIFICATION IN SYSTEM AND IF REQUESTED, ; WILL QUEUE AN ERROR TASK WITH I/O LIST ADDRESS AS ARG. ; THE CALL IS: ; JSR PC,ERROR ; WHERE R0 = ERROR TYPE ; R1 = I/O LIST ADDRESS ; ERR = . MOV R0,ERROR(R1) ; SEJSR PC,DALLOC .ENDC CLR (R2) ; VOID QPART ENTRY DECB NREQQP(R0) ; DECREMENT NO. REQUEST'S QUEUED QNXA00: BITB -(R2),(R2)+ ; DELAY 5.4 USEC ADDITIONAL FOR B3 BITB -(R2),(R2)+ ; AND ANOTHER 5.4 ; ; FOR A TOTAL OF 21.6 BIT #BSYB3,B3FR ; IS B3 STILL DE-ALLOCATING BNE QNXB40 ; YES, ERROR-HUNG UP QNXA05: MOV (SP),PSR ; RESTORE LOCK-OUT QNXA10: MO; THE LINKAGE IS 'JSR PC,DISKBF'. *BFUP ; *BFUP ;***********************************************************************BFUP DISKBF =. ; ENTRY POINT BFUP MOV #DSKLST,-(SP) ; PUSH DISK I/O LIST ADDRESS BFUP EMT $DSKIO ; USE EMT BFUP BISB DSKERR,1(R5) ; SET DISK 10CHQS BR H RCEA SOFY ITORRI PMPBU; R0 C IN: 40CHQS N'KIOO-L-AEPKE; 30CHQS BR E BLTAT ARQPN IRYNT EXTNEO TMPBU; + 2)(R+,2)(R P CM: 35CHQS E ICRVSEG INITWAY TREND UNFO; 60CHQS Q BE T TAPSE ATOLIS; R10,6077#1 C BI Y TRENT EX NTOP UM-BIDVOY TREN; 35CHQS Q BE ELEV LXTNEO TMPBU- D KEAR MILTA1 -; 40CHQS Q BE ? LEAB TOFD ENO TEDCHARSE; R1 C INV #1.,R0 ; SET UP SEARCH AT PRIORITY LEVEL 1 MOV #2.,R1 ; WORD INDEX FOR PRIORITY LEVEL 1 QNXA20: TSTB NREQQP(R0) ; ANYTHING IN THIS PRIORITY'S OVERLAY Q? BMI QNXA50 ; EMPTY-BUMP TO NEXT LEVEL MOV QPARTN(R1),R2 ; GET PRIORITY'S QPART TABLE ADDRESS TSTB PPTAB(R0) ; DYNAMIC PRIORITY LEVEL? BPL QNXA40 ; NO- TEST IF HEAD WAITING SERVICE QNXA30: MOV (R2),R3 ; LOOK AT FIRST WO T/O STATUS BITS INTO UPPER BYBFUP RTS PC ; RETURN TO CALLER. BFUP .END ; BFUP T I/O NOT SUCESSFUL MOVB ERRTSK(R1),-(SP) ; QUEUE AN ERROR TASK? BEQ ERRA50 ; NO-POP AND RETURN .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG MOV R1,-(SP) ; SEND I/O LIST ADDRESS AS AN ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,QUEUE ; QUEUE ERROR TASK ERRA50: TST (SP)+ ; POP ERROR PARA LLCET ARQPA F ORDWOT RSFIT GE; 1 ,R2)(R V MO: 30CHQS ELEV LXTNEO TMPBUT-ISEXT N'ESDO; 40CHQS Q BE S ESDRADT ARQPS Y'ITORRI PISTHT GE; 2 ,R1)(RTNARQP V MO X DEIND OR WTYRIIOPR ; R1 L AS CHARSEE ATULLCCA; 1 ,RR0 V MO: 20CHQS NO; 50CHQS E BG 'SSKTAE IVCT AANTHR HEIG HI.PR; 4 ,RR0 P CM ELEV LXTNEO TMPBU- NO; 40CHQS L BP ?ICAMYN DELEV LTYRIIORD OF CELL INC R3 BEQ QNXA50 ; END OF TABLE-BUMP TO NEXT LEVEL DEC R3 BEQ QNXA35 ; VOID ENTRY-BUMP TO NEXT BIC #177600,R3 ; ISOLATE PSTAT BEQ QNXB00 ; FOUND ENTRY WAITING SERVICE QNXA35: CMP (R2)+,(R2)+ ; BUMP TO NEXT ENTRY IN QPART BR QNXA30 ; INTERROGATE IT QNXA40: MOV HEADQP(R2),R2 ; ADDRESS OF ENTRY AT HEAD TSTB (R2) ; LOOK AT METER AND IGNORE RTS PC ; ; .ENDC ; MATCH FOR .IFNZ NDISCS .END PRS I; ) R0B(TAPP TBTS: 10CHQS T RSFI1 L VELEH RCEA STOP UET S; R0.,#1 V MO: 05CHQS K AS TVETIACF OOB/NSBT GE; R3),R1B(NOPH V MO K AS TVETIACF OSSREDD ARYNT EVESA; 5 ,RR2 V MO SKTAE IVCT AOFY ITORRI PVESA; 4 ,RR0 V MO S ESDRADR DEEA HAMGRRO PVESA; 1 ,RR4 V MO . = H RCQS ; S ESDRADR DEEA HAMGRRO P =R4 ; Y TRENS K'AS TVETIACF OSSREDD ARTPA Q =R2 CSTAT & PSTAT BEQ QNXB10 ; MUST BOTH BE ZERO TO NEED ALLOCATION QNXA50: INC R0 ; BUMP TO NEXT PRIORITY LEVEL TST (R1)+ ; BUMP PRIORITY WORD INDEX CMP R0,#NPRIOR ; SEARCHED ALL LEVELS? BLE QNXA20 ; NO QNXA60: JMP QOVB20 ; YES-Q'S EMPTY, EXIT FROM RPOM ; ; FOUND ENTRY WAITING ALLOCATION REQUEST ; R0 = PRIORITY ; R1 = PRIORITY WORD INDEX ; ; SKTAE IVCT AOFY ITORRI P =R0 : RYNT EONUP ; Y.VLSO Q = 1T,KP C = 0. CKTA SIN ; NDOU FBEL IL WCHITSWY BEDLLCAA . EDCHARSEE BLLWI ; ESEUQUL AL, Y'VLSO'QY BEDLLCAF IS.RTPA QTYRIIOPR ; ERGHHIH RCEA SLYONL IL W',PTCK 'BYD LEAL CIF ; D.TECUXE EICOG LINL-OL/RUT-OLLROD AND DEENSPSUE BLLWI ; K AS TVETIACE TH, NDOU FISE ONF IE.ACSPE OR C'SSKTA ; VETIACE THO NT IIT FLLWIT HA TS,T'ARQPC MINADY ; HE TINT ESQUREG INITWAA D IN FTOD LEAL CISH RC" R2 = QPART ENTRY ADDRESS ; QNXB00 = . ; DYNAMIC PRIORITY ENTRY MOV #PLOCK,PSR ; SET PRIORITY LOCK-OUT MOV (R2),R3 ; ENTRY STILL WAITING SERVICE? BEQ QNXA05 ; VOID-START SEARCH AGAIN BIC #177600,R3 ; ISOLATE BEQ QNXB20 ; YES BR QNXA05 ; START SEARCH AGAIN QNXB10 = . ; FIXED OR TIME-SLICE ENTRY MOV #PLOCK,PSR ; SEQS ; ; TCKPCH Z FN.I ; ; ERCHATSPDIR OSKTAO TRNTURE; PC S RT: 40PTCK C ND.E T OUCKLOU CPT SERE; R PS+,P)(S V MO CKTA SFF OCHITSWY BEDLLCAP PO; + P)(S T TS UEUE QTYRIIOPRF OADHET ASKTAE EUQU; 0)(RSTIR,FR4 V MO: 30PTCK LYEROPPRT AS LUPT SEY-PTEM; ) R0T(AS,LR4 V MO E EUQUY PTEMT NO; 30PTCK E BN D OR WADRETHS K(AS TUPT SE; 4)(R),R0T(RSFI V MO X DEIND OR WTY&T PRIORITY LOCK-OUT MOVB (R2),R3 ; ENTRY STILL NOT CKPTED & WAITING BNE QNXA05 ; NO-START SEARCH AGAIN QNXB20: BISB OVTSK(R2),R3 ; GET OVERLAY TASK NUMBER WAITING ; ; R3 ALREADY ZERO JSR PC,FB3ADD ; FIND B3 ADDRESS FOR SEARCH MOV R3,B3RR ; SET ALLOCATION REQUEST ADDRESS BIS #SRCHB3,B3FR ; START SEARCH .IFZ $CORAL JSR PC,SEARCH RIIOPR; R0 L AS S RON IEDEUQU= T TATST SE; ) R1T(TATSS,ROIN#Q VBMO LEABNTOIKPECCH= T TAPST SE; 2)(RK,TCAR#P VBMO UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO C ND.E O LS AO.FN ITNARQPD AN ; N RTQP,FPC R JS N AIAGR BEUM NSKTAT GE; 1 ,RSKTA$C V MO: 20PTCK ; Y ITORRI PICAMYN DOT NIFE ER HESOM COR ; D UNFOT NOT ESQUREG INNDPEF ICHSR QOMFRS RNTURE ; ; CHARSEQ M ORRFPES-YE; *.ENDC BITB -(R3),(R3)+ ; DELAY BITB -(R3),(R3)+ ; DURING B3 BITB -(R3),(R3)+ ; SEARCH FOR A TOTAL BITB -(R3),(R3)+ ; OF 21.6 USEC BIT #BSYB3,B3FR ; SHOULDN'T BE BUSY BNE QNXB40 ; ERROR-HUNG UP BIT #SERRB3,B3FR ; BSIZE BLOCKS AVAILABLE? BEQ QNXB30 ; YES MOV (SP),PSR ; NOT ENOUGH CORE SPACE, LOOK FOR H RCQS I BM TYRIIOPRC MINADY; ) R0B(TAPP TBTS TCKPCH Z FN.I N IOATRMFOINN RTPA QNDFI; N RTQP,FPC R JS K ACSTN OPTCKY BEDLLCAT SE; ) SP-( R CL CKTA SONS TUTA SORSSCERO PVESA; ) SP-( R CL R HETCPAIS DOR FPCS RTT SE; ) SP-(H,TCSP#D V MO 0ELEV LTHWIT OUCKLOT SERE; R PS R CL T TATSN ISYBUY LAEROVT SE; ) R1T(TATST,ACVY#O VBMO R BEUM NSKTAT GE; .TSTB PPTAB(R0) ; ANOTHER TASK BMI QNXA35 ; DYNAMIC BR QNXA50 ; TIME-SLICED OR FIXED QNXB30: JMP QOVA47 ; ; ; ERROR-B3 BOX HUNG-UP ; EVENTUALLY HAVE SOFTWARE RECOVERY ; ; QNXB40: HALT ; ANOTHER REAL-TIME ERROR HANDLER******* ; .IFNZ $TMSLC!FXPART ; ; PULL ENTRY OUT OF QPART ; QNXC00 = . MOV R0,R1 ; CALCULATE PRIORITY ASL R1 1 ,RSKTA$C V MO K ACSTM TEYS SONT GED ANT IDO; VESA,QPC R JS T OUCKLOR DEUNE AVQS; SR,PCKLO#P V MO E EUQUREO NND ANDPEUS SL.VOIN; P)(S,-1.#- V MO E AVQSR FOR PS; ) SP-(R,PS V MO E ORGN-INO; 40PTCK T BL ? SKTAY LAEROV; INTMOV,#SKTA$C P CM K AS TVETIAC ; 40PTCK Q BE M RO FEDLLCAE BSTMU; VETIAC T TS C SLTM!$TCKPCH Z FN.I . 2 ; WORD INDEX QNXC10: MOV QPARTN(R1),R2 ; GET ADDRESS OF QPART QUEUE JSR PC,PULLQP ; PULL HEAD ENTRY OUT OF QUEUE BMI QNXC20 ; EMPTIED QPART MOV PRTADD(R2),R4 ; GET ADDRESS OF PARTITION MOV HEADQP(R2),R2 ; QPART ENTRY ADDRESS CURRENTLY AT HEAD CMPB (R2),#ABRTRQ ; ABORT REQUESTED? BEQ QNXC10 ; YES- PULL OUT OF QUEUE BISB #IOIP,(R2) ; SET I/O IN PROGRESS IN P = PTCK ; ; 4 OM CTSE.C E AG.P ; C ND.E ; OMRPM RO FITEX; 20VBQO P JM USATSTS RON IEDQ'E ORSTRE; ) R1T(TATSS,ROIN#Q VBMO E IM TISTHE IM TLFHAE ONY NL OVEGI; 4)(RERIMCT R AS . = 30OATS N RTQP,FPC R JS N AIAG. FOINT ARQPT GE; 1 ,RSKTA$C V MO . = 29OATS ; UEAL VALINIGOR2 1/O TCELI-SMETIT SERE ; ; E IN LINT ESQURET EX NCKHE CND A; 10OATS 6STAT ; NOTE: PSTAT MUST BE WAITING FOR SERVICE AT THIS POINT ; IF $TMSLC!FXPART MOV (SP),PSR ; RESET PRIORITY LOCKOUT JMP QOVB00 ; ROLL-IN NEXT REQUEST QNXC20: CMP #1.,TIMMOD(R2) ; TIMER MODULE THREADED? BNE QNXC25 ; NO MOV R2,-(SP) ; YES-MUST BE ABORTING ADD #TIMMOD,(SP) ; ADDRESS OF TIMER MODULE THREAD WORD JSR PC,DQTIME ; DE-QUEUE IT TST (SP) BR E EUQUF OUT OSKTAD TEORABE AK T; P LQUL,PPC R JS: 20OATS K AS TXTNEN -ILLRO& T OUT -ILLRO; 00VEQO P JM S SKTAH OT BOFY ITORRI P =R40= R; 4 ,RR0 V MO S YE; 29OATS Q BE ? ALINIGORO TCKBAE OM CND ATNARQP ; ; OFT OUS SKTAL AL" LLPUT ORAB "WED DI; 1 ,RR2 P CM SKTAT ESQUREF OSSREDD ARYNT EET G; 2 ,R2)(RQPADHE V MO ERADHE. RTPAN IRTPAIQW NET SE; :+ ; IGNORE ERROR QNXC25: TSTB ALLOSW(R2) ; WAS ALLOCATION SWITCH SET BEQ QNXA60 ; NO-EXIT FROM RPOM MOV @PRTADD(R2),B3RR ; DEALLOCATE PARTITION'S CORE SPACE BIS #DEALB3,B3FR ; START DE-ALLOCATION .IFZ $CORAL JSR PC,DALLOC .ENDC CLRB ALLOSW(R2) ; RESET ALLOCATION SWITCH CLR PRTADD(R2) ; AND PARTITION ADDRESS = 0 BITB -(R2),(R2)+ ; DE ) R5T(ARQP,IR3 VBMO S ESDRADN IOITRTPA; 5 ,R2)(RDDTAPR V MO RTPAIQW NEE ATULLCCA; 3 ,RR2 B SU Y TRENT OUL-OL ROFS ESDRADW NE; 1 ,RR3 V MO SSREDD ARYNT EEDSHPUE ORSTRE; R3+,P)(S V MO: 25OATS 10OATS BR ILTAT AITT PU; P HQUS,PPC R JS P LQUL,PPC R JS NO; 25OATS E BN D?TEESQUREE BRTBO ALLWI; Q REDQ#O),R3T(TATS PBCM R BEUM NSKTA; >LAY TOTAL OF BITB -(R2),(R2)+ ; 10.8 USEC FOR B3 BR QNXA00 ; CHECK FOR WAITING REQUESTS .ENDC ; .PAGE .IFNZ $TMSLC .CSECT OM3 ; ; TASK HAS BEEN INVOLUNTARILY SUSPENDED ; ON SYSTEM STACK ; TSOVLY = . MOV PSR,-(SP) ; SAVE PROCESSOR STATUS ON STACK MOV $CTASK,R1 ; GET TASK NO. TO TIME-SLICE JSR PC,FQPRTN ; FIND QPART ENTRY INFORMATIONR3 ABSW R3 RBCL S YE; 20OATS Q BE ? RYNT EOND TEESQURET ORAB; RQRTAB,#R3 PBCM R3),R2P(DQEA@H V MO: 10OATS Y TRENF OSSREDD AVESA; P)(S,-R3 V MO L AI TTOIN' SHPU 'ND A ; P HQUS,PPC R JS ADHEM RO FRYNT EL'UL'P; P LQUL,PPC R JS UTKOOC LTYRIIOPRT SE; SR,PCKLO#P V MO R0 R AS S ESDRADE BLTAT ARQPT GE; 2 ,R0)(RTNARQP V MO X DEIND OR WTYRIIOPR; MOV MAXT(R4),CTIMER(R4) ; RESTORE TIME-SLICE VALUE ; ; NOTE******THIS WILL EVENTUALLLY BE ; * DONE BY TIMER********* TSTB NREQQP(R0) ; ONLY ENTRY ACTIVE IN IT'S QPART BEQ TSOA30 ; YES MOVB (R2),R3 ; GET PSTAT DEC R3 ; PSTAT=PARTCK, I.E. CHECKPOINTABLE? BNE TSOA30 ; NO ASL R0