; UPDATE 9/23/72 IOCOMX.S05 ; UPDATE 9/21/72 (2) IOCOMX.S04 ; UPDATE 9/21/72 IOCOMX.S03 ; UPDATE 20 SEPT 1972 IOCOMX.S02 .TITLE IOCOMX ;*********************************************************************** ;* ** ;* I O C O M X ** ;* ** ;* PROGRA; UPDATE TIMERQ.002 08.16.72 .TITLE $$TMRQ ;*********************************************************************** ;* ** ;* T I M E R Q ** ;* ** ;* PROGRAM IDENTIFICATION. TIMERQ - PROCESS TIMEOUT QUEUEING ** ;* AND UNSUSPEND REQUESTS. **  .TITLE $$TEST .GLOBL HED4,STK04 ; HED4: .WORD 1,4 .BYTE 20,2 .WORD START-STACK+100. .WORD 0,0,50.,0,0,0 .WORD 7006 ;PDR'S .WORD 77406 .WORD 0,0,0,0,0 .WORD 77406 ; STK04: .WORD STACK .WORD 0,0,0,0,0,0 .WORD 7600 .=.+12. .=.+100. STACK: SP = %6 ; ; START: MOV :MODULE-STACK+100.,-(SP) MOV #2,-(SP) ; UPDATE 9/21/72 DECTAP.S05 ; UPDATE 9/8/72 DECTAP.S04 ; UPDATE DECTAP.S03 ; UPDATE 3/13/72 DECTAP.S02 ; UPDATE 3/9/72 DECTAP.S01 .TITLE DECTAP ; ;*********************************************************************** ;* * ;* DECTAPE I/O TABLES * ;* M IDENTIFICATION. IOCOMX - I/O COMPLETE SUBROUTINE ** ;* DISPATCHER. ** ;* ** ;* PURPOSE. THIS ROUTINE IS RESPONSIBLE FOR EXECUTING THE ** ;* SPECIFIED I/O COMPLETE SUBROUTINE, WHETHER IT IS PART OF ** ;* ROS OR PART OF A TASK, ON THE PDP-11/45 OR ON THE PDP-11/20. ** ;* THE I/O COMPLETE ROUTINE IS EXECUTED AS AN EXTENSION OF ** ;* ;* ** ;* PURPOSE. TIMERQ IS QUEUED BY THE TIMER ROUTINE WHENEVER A ** ;* MODULE HAS TIMED OUT AND A QUEUE OR UNSUSPEND REQUEST MUST ** ;* BE PROCESSED. SINCE TIMER IS A TASK, THE PROCESSING TIME ** ;* TO PERFORM THESE FUNCTIONS IS DONE AT THE TASK LEVEL, AND ** ;* NOT AT THE TIMER INTERRUPT LEVEL. ** ;* EMT 7 TST (SP)+ MOV :MODULE-STACK+100.,-(SP) EMT 8. .BOUND EMT 4 ; MODULE: .WORD 1,0,0,0 .BYTE 1,110 .WORD 0,-1,10. .END * ;*********************************************************************** ; .CSECT ; ; 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 ; .QUE DTF,DTL,1 DTFRST = DTF+4 DTLAST = DTL+4 ; .PAGE ; ; THE FOLLOWING TABLE IS THE DEVICE CONTROL TABLE FOR ; THE DECTAPE. THIS TA THE INTERRUPT ROUTINE AND AT THE SAME PROCESSOR INTERRUPT ** ;* LEVEL. ** ;* ** ;* USAGE. THE LINKAGE TO IOCOMX IS: ** ;* ** ;* MOV #LIST,-(SP) ;ADDRESS OF I/O LIST ** ;* MOV #TASKNO,-(SP) ;NUMBER OF REQUESTING TASK (0 = ROS) ** ** ;* USAGE. TIMERQ SCANS EACH RESOLUTION'S QUEUE. ANY MODULE ** ;* THAT HAS THE 'B' BIT SET WILL BE PROCESSED. AFTER BEING ** ;* PROCESSED, THE MODULE WILL BE DEQUEUED IF THE RESET BYTE IS ** ;* ZERO. AFTER ALL QUEUES HAVE BEEN SCANNED, THE INTERRUPTS ** ;* ARE INHIBITED AND 'REPEAT' IS DECREMENTED. IF 'REPEAT' IS ** ;* NON-ZERO, THEN INTERRUPTS ARE RELEASED AND TIMERQ STARTS ** ;* AGAIN. OTHERWISE, TIMERQ EXITS WITH INTERRUPTS IN ; UPDATE 9/30/72 DISCIO.S39 ; UPDATE 9/21/72 DISCIO.S38 ; UPDATE 9/8/72 DISCIO.S37 ; UPDATE DISCIO.S36 ; 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 BLE CONTAINS THE FLAGS,POINTERS, ; DATA,ETC., REQUIRED TO CONTROL THE DECTAPES. ; NDTREQ: .WORD -1. ; NUMBER OF DECTAPE REQUESTS IN QUEUE CDTCM: .WORD 0 ; CURRENT DECTAPE COMMAND .IFNZ $KT11C CDTLST: .WORD 0 ; USED TO SAVE CURRENT LIST SVA DTPAR5: .WORD 0 ; USED TO SAVE CURRENT LIST PAR5 .ENDC CALLED: .BYTE 0 ; CALLED BY EXIT FLAG NOTRYS: .BYTE 0 ; DECTAPE ERROR RETRY COUN ;* JSR PC,IOCOMX ** ;* ** ;* WHERE (ON THE 11/45) THE DEVICE INTERRUPT ROUTINE IS EXPECTED ** ;* TO BE IN THE KERNEL MODE. THE I/O COMPLETE ROUTINE RETURNS ** ;* TO IOCOMX BY EXECUTING THE INSTRUCTION: IOT. ** ;* ** ;* COPYRIGHT 1972 HIBITED. ** ;* ** ;*********************************************************************** .DEF TIMERQ,PKTMQ .REF PKTQFR .REF QUEUE,UNSPND,EXIT,TMRQST .REF TQFRST,TQLAST,DQTIME .IIF NE $KT11C .REF TQVIRT,TQPAR .IFNZ $KT11C .REF PPASV5 .ENDC .SYSTM = 20 ;SYSTEM TASK ACCESS BIT ;* ;* T I M E R Q T A S K  DISCIO.S28 ; UPDATE 3/23/72 DISCIO.S27 ; UPDATE 3/17/72 DISCIO.S26 ; UPDATE 3/13/72 DISCIO.S25 ; UPDATE 2/24/72 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 ; TER 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 BLKCTL: .WORD 0 ; BLOCK NUMBER CONTROL ; .PAGE ; ; DECTAPE HARDWARE-SOFTWARE INTERFACE ; ; FUNCTION TABLE FOR TC-11 DECTAPE CONTROLLE ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .DEF IOCOMX .DEF IOTXIT .IFNZ $KT11C .REF HEADER,PPASV5,TSTAT,PSTRAP,$TYPE3  H E A D E R ;* TIMERQ = . .WORD 1 ;THREAD WORD .WORD $TMRNO ;TASK NUMBER .BYTE .SYSTM ;TASK ACCESS STATUS (SYSTEM TASK) .BYTE 1 ;TASK PRIORITY .WORD TMQA00-TMQSTK ;ENTRY TO TASK .WORD 0 ;MAXIMUM EXECUTION TIME .WORD 0 ;CURRENT TIMER VALUE .WORD 50. ;STACK SIZE .WORD 0,0,0 ;RESERVED .IFN UPDATE 1/12/72 DISCIO.S16 ; UPDATE 12/15/71 DISCIO.S15 ; UPDATE 12/17/71 DISCIO.S14 ; UPDATE 11/30/71 DISCIO.S13 ; 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 R. 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 REGISTER DTWCR = 177344 ; DECTAPE WORD COUNT REGISTER DTBAR = 177346 ; DECTAPE BUS ADDRESS REGISTER DTDR = 177350 ; DECTAPE DA .REF $CTASK,$ACESS .ENDC ;* ;* E Q U A T E S F O R I O C O M X ;* .FRGND = 4 ;FOREGROUND TASK ACCESS BIT .SYSTM = 20 ;SYSTEM TASK ACCESS BIT TASKNO = 2. ;POSITION OF TASK NUMBER IN TASK HEADER TACESS = 4. ;POSITION OF TASK ACCESS IN TASK HEADER STKSIZ = 12. ;POSITION OF STACK SIZE IN HEADER TSTACK = 16. ;POSITION OF STACK POINTER IN TASK HEADER Z $KT11C ;TASK PAGE DESCRIPTOR REGISTERS .WORD 007006 ;PDR 0 = 15. BLOCKS READ/WRITE .WORD 077406 ;PDR 1 = NON-EXISTENT .WORD 0 ;PDR 2 = NON-EXISTENT .WORD 0 ;PDR 3 = NON-EXISTENT .WORD 0 ;PDR 4 = NON-EXISTENT .WORD 0 ;PDR 5 = NON-EXISTENT .WORD 0 ;PDR65 = NON-EXISTENT .WORD 077406 ;PDR 7 = DEVICE REGISTERDISCIO.S05 ; UPDATE 9/14/71 DISCIO.S04 ; UPDATE 9/8/71 DISCIO.S03 ; UPDATE 9/3/71-DISCIO ; UPDATE 9/2/71-DISCIO .TITLE DISCIO TABLES ; .IFNZ NDISCS ; DO NOT ASSEMBLE DISCIO IF NDISCS = 0 ; ;*********************************************************************** ;* * ;* DISCIO TABLES * ;* TA REGISTER ; .PAGE ; ; TAPE UNIT NOT ON LINE ERROR MODULE ; .BOUND ERRMOD = . .WORD 1 ; THREAD WORD .WORD 0 .WORD 999. ; ERROR NUMBER TAPENO: .WORD 0 ; ARG.1-TAPE NUMBER .WORD 0,0,0 ; UNUSED ARGUMENTS ; ; .PAGE ; ; EQUATES FOR I/O PARAMETER LIST ; THREAD = 0. ; LIST THREAD WORD DEVICE = 2. ; LOGICAL TSKASR = 20. ;POSITION OF TASK ASR'S IN TASK HEADER $EXIT = 4 ;RELATIVE POSITION OF I/O COMP. ADDR IN LIST $IOT = IOT ; IOT INSTRUCTION FOR I/O COMPLETE .PAGE ;* ;* ;* AND NOW, HERE WE GO..... ;* ;* IOCOMX = . .IFNZ $KT11C TST 2(SP) ;SEE IF CALLER IS A TASK BNE IOCA10 ;BRANCH IF 'TIS .ENDC MOV 4(SP),R1 ;CALLER IS NOT A TASK, MUSS, READ/WRITE ; ;TASK PAGE ADDRESS REGISTERS ; TMRQST: .WORD TMQSTK ;PAR 0 = TIMERQ BASE ADDRESS .WORD 0 ;PAR 1 .WORD 0 ;PAR 2 .WORD 0 ;PAR 3 .WORD 0 ;PAR 4 .WORD 0 ;PAR 5 .WORD 0 ;PAR 6 .WORD 7600 ;PAR 7 = DEVICE REGISTER B * ;* PROGRAM IDENTIFICATION. DIOTBL * ;* * ;* PURPOSE. DIOTBL CONTAINS ALL TABLES, DATA AND SYSTEM * ;* EQUATE STATEMENTS REQUIRED FOR THE DISCIO SUBROUTINE. * ;* EACH PARAMETER IS DEFINED IN THE COMMENTS FIELD. * ;* * ;* P DEVICE NUMBER TYPE = 3. ; EXIT TYPE EXIT = 4. ; I/O COMPLETE ADDRESS IF TYPE =3 ERRTSK = 6. ; USED TO SAVE D.T. UNIT NO. 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 DATA1 = 16. ; SVA OF DATA BUFFER DATA2 = 14. ; !T BE FROM ROS MOV (SP)+,2(SP) ;R1 = ADDRESS OF I/O LIST TST (SP)+ ;POP OFF TASK NUMBER. STACK NOW LOOKS JMP @$EXIT(R1) ;LIKE THE I/O ROUTINE JSR'D DIRECTLY TO ; ;I/O COMPLETE ; .IFNZ $KT11C ; IOCA10: MOV 2(SP),R0 ;GET TASK NUMBER ASL R0 ;* ;* NOTE: DON'T FORGET ABOUT CHECKPOINTED TASKS ;* MOV HEADER(R0),-(SP);GET ADDRESS OF TASK HEADER (PAC"ASE ADDRESS ; . = .+12. ;FORCE LOCATION COUNTER BACK TO .ENDC ;32-WORD BOUNDARY ; TMQSTK = . . = .+50.+50. ;TIMERQ STACK AREA KERNEL = 62 ;EMT NUMBER TO SWITCH TO KERNEL MODE RSVRD1 = 2. ;THREAD WORD RSVRD2 = 4. ;BACKWARD THREAD RSVRD3 = 6. ;TIMERQ THREAD RES = 8. ;RESOLUTION OPTION#ROGRAM USAGE. EACH TABLE AND DATA ITEM IS REFERENCED * ;* BY THE DISC I/O SUBROUTINE. THOSE TABLES AND ITEMS * ;* WHICH MAY ALSO BE REFERENCED BY OTHER PROGRAMS WILL * ;* BE DECLARED IN A .DEF STATEMENT * ;* * ;* PROGRAMMER 54 * ;* DATE * ;$ASR 6 FOR ABOVE ; ; MISCELLANEOUS EQUATES ; PSR = 177776 ; PROCESSOR STATUS REGISTER PLOCK = 340 ; PRIORITY LOCKOUT MASK NTRYS = 10. ; NO. OF RETRIES IF ERROR DVTYPE = 4. ; DECTAPE DEVICE TYPE IN ROS LISTAD = 16.+4*$KT11C ; USED TO FIND I/O LIST ADDRESS IN STACK ; ; DECTAP ERROR EQUATES ; ERR001 = 201. ; LIST ALREADY QUEUED ERR002 = 202. ; INVALI%KED PHYSICAL) JSR PC,PPASV5 ;CONVERT TO SYSTEM VIRTUAL (ASR 5) MOV (SP)+,R0 ;R0 = SYSTEM VIRTUAL TASK HEADER ADDRESS BIT #.FRGND!.SYSTM,TACESS(R0) ;IS TASK FOREGROUND OR SYSTEM BNE IOCB00 ;BRANCH IF YES MOV (SP)+,2(SP) ;OTHERWISE, IGNORE REQUEST (BACKGROUND TST (SP)+ ;AND BATCH CAN'T HAVE I/O EXIT 3. RTS PC ;RETURN TO CALLER ;* ;* ;* AT THIS POINT,& = 9. ;OPTION BYTE RSVRD5 = 10. MULTPL (BYTE 0) AND RESET (BYTE 1) MULTPL = 10. ;TIMER MODULE MULTIPLE OF RESOLUTION RESET = 11. ;RESET VALUE FOR MULTPL ARG = 12. ;ARGUMENT FOR TASK TO BE QUEUED *EACH OF THESE FLAG = 12. ;BITS TO BE OR'ED *IS SET AS IF MASK = 14. ; INTO THIS ADDRESS *THE PREVIOUS JSTARG = 12. '* REVISION * ;* * ;*********************************************************************** ; .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 NUMB(D 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 ;*********************************************************************** ;* DECTAP - DECTAPE I/O HANDLER * ;* * ;* PROGRAM IDENTIFICATION. DECTAP ) THE RECIPIENT I/O COMPLETE SUBROUTINE IS ;* RESIDENT IN A FOREGROUND TASK. BEFORE WE DISPATCH HIM, WE ;* NEED TO SAVE ALL OF THE USER MODE ASR'S. ;* ;* IOCB00: MOV @#PS,-(SP) ;SAVE PS OF I/O INTERRUPT ROUTINE BIS #30000,@#PS ; SET PREVIOUS MODE TO USER INC $TYPE3 ;SET I/O COMPLETE ROUTINE IN EXECUTION STATUS .LOCK ;INHIBIT INTERRUPTS MOV #$UPAR0,R3 ;NOW, WE HAVE TO SAVE THE WHOLE *;ADDRESS OF TIMEOUT SUBROUTINE *OPTIONAL TASKNO = 12. ; *IS OMITTED S = 100000 ;OPTION A = 040000 ; BITS F = 020000 ; IN J = 010000 ; THE T = 004000 ; OPTION D = 002000 ; BYTE Q = 001000 ; OF THE B = 000400 ; MODULE ; PKTMQ: .IIF NE $KT11C .P+ER ; OF PRIORITY LEVELS IN EACH DISC QUEUE ; NDPRTY = . .BYTE NDPRT1 ; PRIORITIES DISC 1 ; .IFG NDISCS-1 .BYTE NDPRT2 ; 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, CONT, * ;* * ;* PURPOSE. THIS SUBROUTINE IS RESPONSIBLE FOR ALL COMMUNICATIONS * ;* WITH THE DECTAPES IN ROS. ALL REQUESTS ARE QUEUED IN THE * ;* ROS THREAD SCHEME (ONLY ONE PRIORITYLEVEL). REQUESTS * ;* TO THE DECTAPE ARE BLOCK NO. ORIENTED. DECTAP WILL * ;* HANDLE ERRORS AND RECOVERY ATTEMPTS. UNRECOVERABLE * ;* ERRORS WILL BE REPORTED - MOV #$UPDR0,R1 ;BLOODY MESS MOV (R3)+,-(SP) ;SAVE: USER PAGE ADDRESS REGISTERS AND MOV (R1)+,-(SP) ; USER PAGE DESCRIPTOR REGISTERS MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R.ACK TIMERQ ;FOR USE BY TIMERS WHEN .IIF EQ $KT11C .WORD TIMERQ ;PLACING TIMERQ IN ROS THREAD .PAGE ;**** ;* T I M E R Q ;* TMQA00: .IFNZ $KT11C ;IF WE'RE ON THE 11/45 WITH SEGMENTATION, EMT KERNEL ;WE NEED TO SWITCH TO THE KERNEL MODE .ENDC ; TMQA10: MOV #340,R5 ;INITIALIZE REGISTERS: R0 = POINTER TO QUEUE MOV #PS,R4 ; R4 = ADDR (PS) ; /AIN THE DISC PRIORITY QUEUE THREAD ; INFORMATION. IN EACH SET OF TABLES, WORD 0 CORRESPONDS TO ; PRIORITY LEVEL 1(HIGHEST); WORD 1 CORRESPONDS TO PRIORITY ; 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 0BACK TO THE SYSTEM. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE DECTAP IS: * ;* * ;* MOV #LIST,-(SP) * ;* EMT DECTAP * ;* * ;* WHERE LIST IS TH13)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MFPI SP ;SAVE USER MODE SP VALUE ; IOCB20: MOVB 34.(SP),@#PS ;ENABLE INTERRUPTS MOV R0,R3 ;AND PREPARE TO INITIALIZE THE USER ASR'S ADD #TSKASR,R3 ;R3 POINTS TO TASK'S ASR'S IN HEADER MOV #$UPAR0,R1 MOV (R3)+,(R1)+ ;INITIALIZE THE USER PAGE ADDRESS REGISTERS MOV (R3)+,(R1)+ 2 ; R5 = INHIBIT BITS TMQA20: MOV #TQFRST,R0 ; MOVB R5,(R4) ;INHIBIT INTERRUPTS MOV (R0),R0 ;GET FIRST MODULE IN QUEUE TST RSVRD3(R0) ;SEE IF ANYTHING IS QUEUED BNE TMQA30 ;BRANCH IF THERE IS A MODULE QUEUED JSR PC,@#EXIT ;OTHERWISE, EXIT TO ROS ; TMQA30: .IFNZ $KT11C ;ON THE 11/45 WITH SEGMENTATION MOV R03; IN DQ(N)LST. ; ; .QUE DQ11ST,DQ1LST,NDPRT1 .IIF DF NDPRT3 .QUE DQ31ST,DQ3LST,NDPRT3 .IIF DF NDPRT3 .QUE DQ21ST,DQ2LST,NDPRT2 ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; THE FOLLOWING TABLE IS USED TO FIND THE ; APPROPRIATE DEVICE'S FIRST AND LAST. ; DQFRST = . .WORD DQ11ST ; FIRST TABLE DISC 1 ; .IFG NDISCS-1 .WORD DQ21ST ; FIRST TABLE DISC 2 .ENDC ; 4E STANDARD ROS I/O LIST WITH THE * ;* FOLLOWING EXCEPTION: * ;* WORD 3, BYTE 1 (USUALLY LEVEL) CONTAINS THE I/O * ;* FUNCTION OF THE REQUEST: * ;* * ;* 0=READ DATA BLOCK N * ;* 1= WRITE DATA BLOCK N * ;* 5 MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV #$UPDR0,R1 ;THEN, INITIALISE THE PAGE MOV (R3)+,(R1)+ ;DESCRIPTOR REGISTERS MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ 6,-(SP) ;THE MODULE ADDRESS MUST BE JSR PC,@#PPASV5 ;CONVERTED TO SYSTEM VIRTUAL MOV (SP)+,R0 ; .ENDC BITB #D,OPTION(R0) ;IS THE 'DEQUEUE' BIT SET? BNE TMQB10 ;BRANCH IF YES, AND WE WON'T PROCESS ;THE REQUEST. BITB #B,OPTION(R0) ;OTHERWISE, SEE IF THE MODULE IS BUSY BEQ TMQA40 ;BRANCH IF ALL IS FREE AND CLEAR BICB #Q,OPTION(R0) ;OOP7 .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 ; .IFG NDISCS-2 .WORD DQ3LST ; LAST TABLE DISC 3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; .PAGE ; THE FOLG * ;* THE DECTAPE TRANSPORT WILL BE COMMANDED TO STOP AFTER * ;* ALL TRANSFERS * ;* * ;* THE DATA BUFFER LAYOUT IS AS FOLLOWS: * ;* WORD 0= BLOCK NUMBER N. IF NEGATIVE, THEN * ;* READ OR WRITE IN BACKWARD DIRECTION. * ;* E .LOCK ;INHIBIT INTERRUPTS AGAIN MOV TASKNO(R0),R1 ;GET TASK NUMBER FROM HEADER CMPB #3,TSTAT(R1) ;AND SEE IF THIS TASK IS CURRENTLY ACTIVE BEQ IOCB40 ;IF IT IS, WE DON'T NEED TO LOAD USER SP TST TSTAT(R1) ;SEE IF THE TASK HAS ALREADY EXITED BEQ IOCB50 ;BRANCH IF IT HAS MOV TSTACK(R0),R1 ;OTHERWISE, LOAD USER MODE SP FROM HEADER BIC #160000,R1 ;GET RID OF ANFS! WE CAN'T PLAY WITH IT YET. MOVB #1,MULTPL(R0) ;RESET THE TIMER FOR ONE MORE TIMEOUT BR TMQB20 ;AND GO REMOVE IT FROM TIMERQ QUEUE ; TMQA40: BISB #B,OPTION(R0) ;SET MODULE BUSY - IT'S OURS NOW! CLRB (R4) ;CLEAR INTERRUPT INHIBIT BITB #T,OPTION(R0) ;IF WE ARE TO QUEUE A TASK, THEN T = 1 BEQ TMQA80 ;BRANCH IF NO (MEANS AN UNSUSPEND REQUEST) MOV R0,R2 ;SET UP STACK FOHLOWING 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 .=NODREQ+NDISCS+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; CRQPTR = . ; CURRENT REQUEST LIST POINTER .WORD 0,0,0 ; EXPAND FOR MORE TH""""""" """DDDDDDD@DDDDDDDDDDDDDDDDDDDDDD"""""""""""""""""""""""""""""""""""""""""""""""""""@DDDDDDDDDDDDDDDADDB C:_{]u~!"PVL"O8}{/{7| 8:_{Zu~!"R*v d{af d{f$Dwwwwwwwwwwwa ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & IY UNWANTED BITS LEFT ;BY THE ROS TASK CONTROOL PROGRAMS ; IOCB40: MOV #$IOT,-(SP) ;PUT AN IOT INSTRUCTION ON THE STACK MTPI -(R1) ;THEN, PUT IT ON THE USER'S STACK MOV R1,-(SP) ; THEN, PUT ADDRESS OF THE IOT ON THE MTPI -(R1) ;STACK (THIS WAY, THE I/O COMPLETE PROGRAM ;CAN EXIT BY EXECUTING AN RTS) MOV R1,-(SP) ;STORE CURRENT VALUE OF JR CALL TO 'QUEUE' CLR R3 ;R3 = ARGUMENT TO TRANSMIT (IF SPECIFIED) BITB #A,OPTION(R0) ;IS ARGUMENT PRESENT? BEQ TMQA50 ;BRANCH IF NO TST (R2)+ ;OTHERWISE, ALLOT ROOM FOR ARG MOV ARG(R0),R3 ;AND PUT IN R3 ; TMQA50: BITB #F,OPTION(R0) ;NOW SEE IF FLAGS ARE PRESENT BEQ TMQA60 ;BRANCH IF NO CMP (R2)+,(R2)+ ;OTHERWISE, STEP OVER THEM ; TMQA60: K 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) * ;* WILL CONTAIN THE DECTAPE I/O ERROR CODE UPON REQUEST * ;* COMPLETION. VALUES OF ERROR ARE: * ;* * LAN 3 DEVICES .=CRQPTR+NDISCS+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; .IFNZ $KT11C CRQDPT = . ; CURRENT REQUEST DATA POINTER .WORD 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES . = CRQDPT+NDISCS+NDISCS ; CRPAR5 = . ; CURRENT REQUEST PAR5 (LIST) .WORD 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES . = CRPAR5+NDISCS+NDISCS ; CDPAR6 = . ; CURRENT REQUEST PAR6 (MUSER'S STACK POINTER MTPI SP ;AND PUT IT IN THE USER'S SP MOV #030000,-(SP) ;SET UP DUMMY PS ON STACK MOVB 40.(SP),(SP) ;BUT USE PS LEVEL OF I/O DEVICE MOV 46.(SP),R1 ;GET I/O LIST ADDRESS TASK VIRTUAL) MOV $EXIT(R1),-(SP) ; PLACE ADDRESS OF I/O COMPLETE ON STACK MOV TASKNO(R0),$CTASK ;INITIALIZE SYSTEM MOVB TACESS(R0),$ACESS ; PARAMETERS, AND RTI N BITB #J,OPTION(R0) ;AND FINALLY, IS A SUBR. ADDR. SPECIFIED BEQ TMQA70 ;NO - AND THAT'S THE TRUTH! TST (R2)+ ;YES - SKIP OVER IT. ; TMQA70: MOV TASKNO(R2),-(SP);AND FINALLY WE CAN SET UP STACK FOR CLR -(SP) ;CALL TO QUEUE MOV R3,-(SP) CLR -(SP) MOV #QUEUE,-(SP) BR TMQB00 ; TMQA80: MOV RSVRD2(R0),-(SP);SET UP STACK FOR CALL TO UNSPND O;* 0 = I/O SUCCESSFUL * ;* 201 = LIST ALREADY QUEUED * ;* 202 = INVALID DEVICE NO. * ;* 203 = ILLEGAL EXIT TYPE REQUESTED * ;* 204 = ILLEGAL I/O FUNCTION REQUESTED * ;* 205 = ILLEGAL BLOCK NO. REQUESTED * ;* 206 = TAPE I/O ERROR, I/O NOT COMPLETE PBUFFER) .WORD 0,0,0 ; EXPAND FOR MORE THAN 3 DEVICES . = CDPAR6+NDISCS+NDISCS ; .ENDC 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 = . ; MAINTAINS HIGHEST PRIORITY IN QUEUE .BYTE -1.,-1.,-1. ; EXPAND FOR MORE THAN 3 DEVICES .=HPRIRQ+NDISCS Q ; ACTIVATE THE ROUTINE ; IOCB50: MOV STKSIZ(R0),-(SP) ;TASK IS NOT ACTIVE, SO WE CAN ASL (SP) ;USE THE WHOLE STACK. (SP) = TASK VIRTUAL BR IOCB35 ;EQUIVALENT OF STACK TOP .PAGE ;*********************************************************************** ;* ** ;* I O T X I T ** ;* R CLR -(SP) MOV #UNSPND,-(SP) ;* ;* NOW WE CAN PROCESS THE REQUEST BY LINKING TO THE SPECIFIED ;* SUBROUTINE (QUEUE OR UNSPND). ;* TMQB00: JSR PC,@(SP)+ ;LINK TO IT TST (SP)+ ;POP ERROR CODE (NO SENSE LOOKIN' AT IT) MOVB R5,(R4) ;INHIBIT INTERRUPTS AGAIN BICB #Q!B,OPTION(R0) ;CLEAR 'QUEUE PENDING' AND 'BUSY' BITS TSTB RESET(R0) ;SHOULD MODULE BE REMOVED FROM TIMER QUEUE S * ;* NOTE:DTCSR WILL BE FOUND IN LIST * ;* SYSTEM WORD. * ;* * ;* * ;* * ;* * ;* T ; 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+NDISCS ; GET RID OF DCT ENTRIES NOT NEEDED ; TIMCTR = . ; TIME-OUT XFER RETRY COUNTER .BYTEU ** ;* THIS ENTRY IS REACHED WHEN THE I/O COMPLETE SUBROUTINE ** ;* EXECUTES AN IOT TRAP. IOTXIT WILL RETURN CPU CONTROL TO ** ;* THE ORIGINAL INTERRUPT CALLER. INTERRUPTS ARE INHIBITED ** ;* ON ENTRY. ** ;* ** ;*********************************************************************** ; IOTXV BEQ TMQB10 ;BRANCH IF YES (REQUEST WAS ONE-SHOT) BITB #D,OPTION(R0) ;HAS A DEQUEUE REQUEST BEEN RECEIVED BEQ TMQB20 ;ELSEWHERE? BRANCH IF NO ; TMQB10: BICB #D,OPTION(R0) ; MOV R0,-(SP) JSR PC,@#DQTIME ;DEQUEUE THE MODULE FROM TIMER THREAD TST (SP)+ ; TMQB20: MOV RSVRD3(R0),@#TQFRST ;NOW DEQUEUE THIS MODULE FROM BNE TMQB30 ;THE TIMERQ W * ;* REGISTERS R0 THRU R5 WILL BE SAVED * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*************************************************X 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 ; .IFG NDISCS-1 .WORD DFDBF2 ; DFD BUFFER DISC 2 .ENDC ; .IFG NDISCS-2 .WORD YIT = . TST $TYPE3 ;FIRST, MAKE SURE REQUEST IS LEGAL BEQ IOTC00 ;(CAN'T LET JUST ANYBODY TRAP HERE!!) ;BRANCH IF AN I/O COMPLETE ISN'T ACTIVE ADD #6,SP ;EVERYTHING IS BEAUTIFUL! CLEAN UP ;THE STACK (WE DON'T NEED THE IOT TRAP STUFF) MTPI SP ;RESTORE THE USER SP OF THE ORIGINALLY ;INTERRUPTED PROGRAM THREAD MOV PKTQFR,@#TQLAST .IFNZ $KT11C MOV #TQFRST,TQVIRT ;SET UP VIRTUAL ADDRESS CLR TQPAR ;TO POINT TO TQFRST .ENDC JSR PC,@#EXIT ;EXIT TO ROS ; TMQB30: CLRB (R4) ;UN-INHIBIT BR TMQA20 ;AND GO BACK FOR MORE .END [********************** .DEF DECTAP,DTINT .REF PUSHR,POPR,LOGMAX,PHYDEV,ACTIVE,$CTASK,IOSTAT .REF RESTOR,QSAVEI,DSPTCH,UNSPND,RELTSK,QUEUE .REF ERRTYP,SAVE,PPASV5,PPASV6,SVPPA .REF TSK.PC,IOCOMX ; .CSECT DTIO ; ; DECTAP = . JSR R5,PUSHR ; SAVE CALLER'S REGISTERS .IFNZ $KT11C MOV $KPAR5,-(SP) ; SAVE MOV $KPAR6,-(SP) ; ALSO .ENDC MOV \ 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 = . .=DFDBF3+60.+60. ; RESERVE 60 WORD BUFFER, DISC 3 .ENDC ; ; EXPAND FOR MORE THAN 3 DISC DEVICE CONTRO] MOV #$UPDR7+2,R0 MOV #$UPAR7+2,R1 MOV (SP)+,-(R0) ;RESTORE - USER PAGE DESCRIPTOR REGISTERS MOV (SP)+,-(R1) ;AND USER PAGE ADDRESS REGISTERS MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) ^; UPDATE IOCOMX.S06 09.24.72 ; UPDATE 9/23/72 IOCOMX.S05 ; UPDATE 9/21/72 (2) IOCOMX.S04 ; UPDATE 9/21/72 IOCOMX.S03 ; UPDATE 20 SEPT 1972 IOCOMX.S02 .TITLE IOCOMX ;*********************************************************************** ;* ** ;* I O C O M X ** ;* _ @#PSR,-(SP) ; SAVE PROCESSOR STATUS REGISTER MOV LISTAD(SP),R1 ; GET I/O REQUEST LIST MOV #ERR001,R0 ; PRESET ERROR REGISTER .LOCK DEC (R1) ; DECREMENT REQUEST THREAD WORD BNE DTPA50 ; ERROR - LIST NOT AVAILABLE MOVB (SP),@#PSR ; RESET PRIORITY LOCKOUT INC R0 ; BUMP ERROR REGISTER MOVB DEVICE(R1),R4 ; GET LOGICAL DEVICE NUMBER CMP R4,LOG`LLERS ; .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 ; DOD2 REFERS TO DISC PHYSICAL DEVICE 1 ; . . . ; . . . ; MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,4(SP) ;PUT ORIGINAL CALLING PS IN PROPER PLACE MOV (SP)+,(SP) ;AND FOLLOW IT WITH THE RETURN PC RTI ;AND EXIT ;* ;* ILLEGAL IOT - TREAT THE SAME AS ILLEGAL TRAP ;* IOTC00: JMP PSTRAP .ENDC .END b ** ;* PROGRAM IDENTIFICATION. IOCOMX - I/O COMPLETE SUBROUTINE ** ;* DISPATCHER. ** ;* ** ;* PURPOSE. THIS ROUTINE IS RESPONSIBLE FOR EXECUTING THE ** ;* SPECIFIED I/O COMPLETE SUBROUTINE, WHETHER IT IS PART OF ** ;* ROS OR PART OF A TASK, ON THE PDP-11/45 OR ON THE PDP-11/20. ** ;* THE I/O COMPLETE ROUTINE IS EXcMAX ; 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 CMPB R5,#DVTYPE ; DEVICE TYPE A DECTAPE UNIT? BNE DTPA60 d . . . ; 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 OF FILE .WORD 0 ; .IFG NDISCS-1 DOD2: .WORD 2 ; FILE ID 2 .WORD DIRAD2 ; Ae ; UPDATE 9/30/72 BFUP.S04 ; UPDATE 2 25 APR 1972 FIX ERROR RETURNS IN GETELT & FILECK ; UPDATE 1 21 APR 1972 FIX GETELT'S ELEMENT DISPLACEMENT .TITLE BFUP ; BFUP .ENABLE CDR ; BFUP ;***********************************************************************BFUP ; *BFUP ; fECUTED AS AN EXTENSION OF ** ;* THE INTERRUPT ROUTINE AND AT THE SAME PROCESSOR INTERRUPT ** ;* LEVEL. ** ;* ** ;* USAGE. THE LINKAGE TO IOCOMX IS: ** ;* ** ;* MOV #LIST,-(SP) ;ADDRESS OF I/O LIST ** ;* MOV #TASKNO,-(SP) g ; ERROR- NOT CORRECT DEVICE TYPE SWAB R5 MOVB R5,ERRTSK(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 INC R0 ; BUMP ERROR TYPE REG. CMPB #1.,IOFCN(R1) ; LEGAL I/O FUNCTION? BLO DTPA60hDDRESS 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 .WORD DIRLN3 ; LENGTH OF FILE .WORD 0 .ENDC ; .ENDC ; COMPID = . ; COMPRESSIOi B F U P *BFUP ; *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: j ;NUMBER OF REQUESTING TASK (0 = ROS) ** ;* JSR PC,IOCOMX ** ;* ** ;* WHERE (ON THE 11/45) THE DEVICE INTERRUPT ROUTINE IS EXPECTED ** ;* TO BE IN THE KERNEL MODE. THE I/O COMPLETE ROUTINE RETURNS ** ;* TO IOCOMX BY EXECUTING THE INSTRUCTION: IOT. ** ;* ** ;* k ; 0 OR 1 -OTHERWISE ERROR INC R0 ; BUMP YOU KNOW WHO AGAIN .IFZ $KT11C MOV DATA(R1),R4 ; ADDRESS OF DATA BUFFER .ENDC .IFNZ $KT11C MOV DATA1(R1),R4 ; SVA OF DATA BUFFER MOV DATA2(R1),$KPAR6 ; ASR FOR ABOVE .ENDC MOV (R4),R2 ; GET BLOCK NO. OF REQUEST BPL DTPA10 NEG R2 ; ADJUST FOR ERROR CHECK DTPA10: CMP R2,#lN 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 DIR. LENGTH .WORD 0 ; CDIMGE = . ; CORE DIRECTORY IMAGE FILE ENTRY .WORD NDISCS+3 ; m *BFUP ; BFINIT - INITIALIZE A ROS FILE FOR BFUP USE *BFUP ; 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 ; n COPYRIGHT 1972 ** ;* GULF ELECTRONIC SYSTEMS ** ;* DIGITAL DATA SYSTEMS ** ;* SAN DIEGO, CALIF ** ;* ** ;*********************************************************************** .DEF IOCOMX .DEF IOTXIT .IFNZ $KT11C .REF o577. ; 578 IS TOTAL NO. OF BLOCKS BGT DTPA60 ; WHOOPS-ERROR ; ; **** DO I/O LIMIT CHECK HERE- IOLIM ; CLR ERROR(R1) ; INITIALIZE ERROR WORD .LOCK .IFZ $KT11C MOV R1,@DTLAST ; THREAD REQUEST MOV R1,DTLAST ; IN DECTAPE QUEUE .ENDC .IFNZ $KT11C MOV R1,-(SP) JSR PC,SVPPA ; GET LIST'S PPA MOV (SP)+,R4 MOV DTpID .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 .WORD 100400 ; PROTECTED FILE-DEVICE 1 .WORD $TKFNS ; LENGTH .WORD 0 ; ; NOTE: THE FOLLq UPDATE DIRECTORY ENTRY IF ELEMENT IS *BFUP ; BEING CREATED *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 CONTAINSrHEADER,PPASV6,TSTAT,PSTRAP,$TYPE3 .REF $CTASK,$ACESS .ENDC ;* ;* E Q U A T E S F O R I O C O M X ;* .FRGND = 4 ;FOREGROUND TASK ACCESS BIT .SYSTM = 20 ;SYSTEM TASK ACCESS BIT TASKNO = 2. ;POSITION OF TASK NUMBER IN TASK HEADER TACESS = 4. ;POSITION OF TASK ACCESS IN TASK HEADER STKSIZ = 12. ;POSITION OF STACK SIZE IN HEADER TSTACK = 16. ;PsLAST,-(SP) ; GET LAST'S SVA JSR PC,PPASV6 MOV R4,@(SP)+ ; THREAD REQUEST MOV R4,DTLAST ; IN DECTAPE QUEUE .ENDC CLR R3 CMP LISTAD-2(SP),#TSK.PC BEQ DTPA15 ; NOT CALLED BY TASK MOV $CTASK,R3 ; GET CURRENTLY ACTIVE TASK NO. DTPA15: MOV R3,SYSTEM(R1) ; SAVE IN SYSTEM WORD BEQ DTPA20 ; TASK ISN'T ACTIVE INCB IOSTAT(R3) ; BUMPtOWING 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. ; CDIHDR = . ; HEADER FOR CORE DIR. IMAGE I/O .WORD NDISCS+3 ; FILE ID .BYTE 1 u ALL *BFUP ; COMMUNICATION BETWEEN BFUP AND THE USER. IT IS*BFUP ; PROVIDED 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 ; WOvOSITION OF STACK POINTER IN TASK HEADER TSKASR = 20. ;POSITION OF TASK ASR'S IN TASK HEADER $EXIT = 4 ;RELATIVE POSITION OF I/O COMP. ADDR IN LIST $IOT = IOT ; IOT INSTRUCTION FOR I/O COMPLETE .PAGE ;* ;* ;* AND NOW, HERE WE GO..... ;* ;* IOCOMX = . .IFNZ $KT11C TST 2(SP) ;SEE IF CALLER IS A TASK BNE IOCA10 ;BRANCH IF 'TIS .ENDC MOV w 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 MOVB (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 AND PROCEx ; 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 DEVICE 1 ; .IFG NDISCS-1 .WORD DOD2 ; ADDRESS OF DOD DEVICE 2 .ENDC ; .IFG NDISCyRD 4 BYTE 1 ELEMENT TYPE *BFUP ; WORD 5 ELEMENT'S RELATIVE START SECTOR*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 z4(SP),R1 ;CALLER IS NOT A TASK, MUST BE FROM ROS MOV (SP)+,2(SP) ;R1 = ADDRESS OF I/O LIST TST (SP)+ ;POP OFF TASK NUMBER. STACK NOW LOOKS JMP @$EXIT(R1) ;LIKE THE I/O ROUTINE JSR'D DIRECTLY TO ; ;I/O COMPLETE ; .IFNZ $KT11C ; IOCA10: MOV 2(SP),R0 ;GET TASK NUMBER ASL R0 ;* ;* NOTE: DON'T FORGET ABOUT CHECKPOINTED TASKS ;* MOV HEADER{SS ; DTPB00 = . CLRB CALLED ; SET CALLED BY REQUEST SWITCH DTPB05: MOVB (SP),PSR ; RESET PRIORITY LOCKOUT DTPB10 = . .IFZ $KT11C MOV DTFRST,R1 ; GET REQUEST AT HEAD .ENDC .IFNZ $KT11C MOV DTFRST,-(SP) JSR PC,PPASV5 ; GET SVA MOV (SP)+,R1 .ENDC .IFZ $KT11C MOV DATA(R1),R4 ; DATA BUFFER ADDRESS .ENDC |S-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 = . .BYTE 4 ; READ FUNCTION .BYTE 2 ; WRITE FCN .BYTE 6 ; WRITE CHECK FCN } *BFUP ; 8 WORDS. THEREFOR EACH SECTOR HOLDS 8 ENTRIES *BFUP ; GIVING A TOTAL 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 (REF~(R0),-(SP);GET ADDRESS OF TASK HEADER (PACKED PHYSICAL) JSR PC,PPASV6 ;CONVERT TO SYSTEM VIRTUAL (ASR 6) MOV (SP)+,R0 ;R0 = SYSTEM VIRTUAL TASK HEADER ADDRESS BIT #.FRGND!.SYSTM,TACESS(R0) ;IS TASK FOREGROUND OR SYSTEM BNE IOCB00 ;BRANCH IF YES MOV (SP)+,2(SP) ;OTHERWISE, IGNORE REQUEST (BACKGROUND TST (SP)+ ;AND BATCH CAN'T HAVE I/O EXIT 3. RTS PC .IFNZ $KT11C MOV DATA1(R1),R4 ; SVA OF DATA BUFFER MOV DATA2(R1),$KPAR6 ; ASR FOR ABOVE MOV R1,CDTLST ; SAVE I/O LIST SVA MOV $KPAR5,DTPAR5 ; SAVE LIST PAR5 .ENDC CLR R2 ; USE TO BUILD COMMANDS MOV (R4)+,R3 ; GET REQUESTED START BLOCK BPL DTPB20 ; READ/WRITE BLOCK FORWARD MOV #4000,R2 ; READ/WRITE BLOCK BACKWARD NEG R3 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 .=DCS+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; WCR = . ; WORD COUNT REGISTER .IFZ $DDERED TO AS 'ENTRY 0') AND CONTAINS *BFUP ; THE FILES STATUS, FLAGS, ETC. *BFUP ; *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;RETURN TO CALLER ;* ;* ;* AT THIS POINT, THE RECIPIENT I/O COMPLETE SUBROUTINE IS ;* RESIDENT IN A FOREGROUND TASK. BEFORE WE DISPATCH HIM, WE ;* NEED TO SAVE ALL OF THE USER MODE ASR'S. ;* ;* IOCB00: MOV @#PS,-(SP) ;SAVE PS OF I/O INTERRUPT ROUTINE BIS #30000,@#PS ; SET PREVIOUS MODE TO USER INC $TYPE3 ;SET I/O COMPLETE ROUTINE IN EXECUTION STATUS .LOCK ;INHIBIT INTERRUPTS MOV ; TWO'S COMP. BLOCK NO. DTPB20: MOV R3,BLNORQ ; SET REQUESTED BLOCK NO. MOV R3,BLKCTL ; AND BLOCK SEARCH CONTROL MOVB ERRTSK(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 BISB FCNTBL(R3),R2 ; BUILD FINAL XFERSDC .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 .=CMA+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; DAR = . ; DISC ADDRESS REGISTER .IFZ ; HAND, UP TO 127 ELEMENTS MAYBE READ AT ONE TIME. *BFUP ; THE SPACE OVER THE 32 SECTORS 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 COM#$UPAR0,R3 ;NOW, WE HAVE TO SAVE THE WHOLE MOV #$UPDR0,R1 ;BLOODY MESS MOV (R3)+,-(SP) ;SAVE: USER PAGE ADDRESS REGISTERS AND MOV (R1)+,-(SP) ; USER PAGE DESCRIPTOR REGISTERS MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) 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 SEARCH MODE MOVB #NTRYS,NOTRYS $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 .WORD 165310,0,0 .ENDC .IFNZ $DDSDC .WORD 165310,0,0 .ENDC .=DAE+NDISCS+NDISCS ; DELETE WHAT WE DON'T NEED ; ; THE FOLLOWING EQUATES ARE USEDPLETED IT WILL RETURN AN ERROR *BFUP ; CODE IN THE COMMUNICATIONS BLOCK. *BFUP ; *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 ; MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MOV (R3)+,-(SP) MOV (R1)+,-(SP) MFPI SP ;SAVE USER MODE SP VALUE ; IOCB20: MOVB 34.(SP),@#PS ;ENABLE INTERRUPTS MOV R0,R3 ;AND PREPARE TO INITIALIZE THE USER ASR'S ADD #TSKASR,R3 ;R3 POINTS TO TASK'S ASR'S IN HEADER MOV #$UPDR0,R1 ; MOV (R3)+,(R1)+ ;INITIALIZE THE USER ; INIT. ERROR RETRY COUNTER DTPC00: MOV CDTCM,DTCMR ; START DECTAPE SEARCH/I/O XFER TSTB CALLED ; CALLED FROM INTERRUPT? BEQ DTPC20 ; NO DTPC10: MOVB (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 TYPE 2 WANTED? BEQ DTPC40 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 DCS ERRORS ; ; BIT 13 = WRITE CHECK ERROR ; ; BFUP FILE - A FILE PROCESSED BY BFINIT TO SETUP *BFUP ; THE BFUP DIRECTORY. *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 PAGE ADDRESS REGISTERS MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV #$UPAR0,R1 ;THEN, INITIALIZE THE PAGE MOV (R3)+,(R1)+ ;DESCRIPTOR REGISTERS MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ ; YES DTPC30 = . ; NO- MOVB (SP)+,@#PSR ; RESET PSR JUST INCASE SET .IFNZ $KT11C MOV (SP)+,$KPAR6 ; RESTORE MOV (SP)+,$KPAR5 ; ALSO .ENDC JSR R5,POPR ; RESTORE REGISTERS MOV (SP)+,(SP) ; FOR PROPER RETURN RTS PC ; RETURN TO CALLER ; DTPC40 = . MOVB (SP),@#PSR ; RESET JUST INCASE MOV (SP)+,14.+4*$KBIT 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 ; .ENDC .IFNZ $DDSDC ; ; THE FOLLOWING MASKS ARE FOR THE DDS DISC ; DERMSK =: *BFUP ; 0 - OBJECT (OUTPUT OF RASM) *BFUP ; 1 - LOAD (OUTPUT OF ROSLOD) *BFUP ; 2 - GENERAL SYMBOLIC *BFUP ; 3 - RASM SYMBOLIC *BFUP ; 4 - FORTRAN SYMBOLIC *BFUP ; 5 - DATA SYMBOLIC *BFUP ; MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ .LOCK ;INHIBIT INTERRUPTS AGAIN MOV TASKNO(R0),R1 ;GET TASK NUMBER FROM HEADER CMPB #3,TSTAT(R1) ;AND SEE IF THIS TASK IS CURRENTLY ACTIVE BEQ IOCB40 ;IF IT IS, WE DON'T NEED TO LOAD USER SP TSTB TSTAT(R1) ;SEE IF THE TASK HAS ALREADY EXITED BEQ IOCB50 ;BRANCH IF IT HAS MOV TSTACK(R0),R1 ;OTHERWISE, LOAD USER MODE SP FRT11C(SP) ; SAVE FOR QSAVEI CALL .IFNZ $KT11C MOV (SP)+,$KPAR6 ; RESTORE MOV (SP)+,$KPAR5 ; ALSO .ENDC JSR R5,POPR ; RESTORE REGISTERS CLR -(SP) ; VOLUNTARY SUSPEND JSR PC,QSAVEI ; DO IT JMP DSPTCH ; GO TO ROS DISPATCHER ; .PAGE ; ; DECTAPE INTERRUPT ; DTINT = . JSR R5,SAVE ; SAVE ENVIRONMENT .IFZ 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 ; ; DISC ERROR MESSAGE PRINTOUT MODULES ; .BOUND ERMOD1 = . .WORD 1,0,0,0,0,0,0 *BFUP ; LINKAGE: ALL BFUP ROUTINES ARE USED WITH A STANDARD LINKAGE. *BFUP ; IT IS: *BFUP ; *BFUP ; MOV #COMBLK,-(SP) (RASM) *BFUP ; EMT BFUP ROUTINE *BFUP ; OM HEADER BIC #160000,R1 ;GET RID OF ANY UNWANTED BITS LEFT ;BY THE ROS TASK CONTROOL PROGRAMS ; IOCB40: MOV #$IOT,-(SP) ;PUT AN IOT INSTRUCTION ON THE STACK MTPI -(R1) ;THEN, PUT IT ON THE USER'S STACK MOV R1,-(SP) ; THEN, PUT ADDRESS OF THE IOT ON THE MTPI -(R1) ;STACK (THIS WAY, THE I/O COMPLETE PROGRAM ;CAN EXIT BY EXECUTING AN RTS) $1145 MOVB #300,PSR ; SET LEVEL 6 .ENDC .IFNZ $1145 SPL 6 ; SET LEVEL 6 .ENDC MOV @#PSR,-(SP) ; SAVE PROCESSOR STATUS MOVB #1,CALLED ; SET CALLED BY INTERRUPT .IFZ $KT11C MOV DTFRST,R1 ; GET CURRENT REQUEST .ENDC .IFNZ $KT11C MOV CDTLST,R1 ; GET CURRENT LIST SVA MOV DTPAR5,$KPAR5 ; GET CURRENT LIST P ; ERROR MODULE DEVICE 0 ; .IFG NDISCS-1 .BOUND ERMOD2 = . .WORD 1,0,0,1,0,0,0 ; ERROR MODULE DEVICE 1 .ENDC ; .IFG NDISCS-2 .BOUND ERMOD3 = . .WORD 1,0,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 ; .IFG NDISCS-1 .WORD ERMOD2 .ENDC *BFUP ; CALL BFUP ROUTINE(COMBLK) (FORTRAN) *BFUP ; *BFUP ; WHERE COMBLK IS THE ADDRESS OF A BFUP COMMUNICATIONS *BFUP ; BLOCK *BFUP ; *BFUP ; THE VARIOUS ROUTINES REQUIRE THE FOLLOWING INFO. *BFUP ; MOV R1,-(SP) ;STORE CURRENT VALUE OF USER'S STACK POINTER MTPI SP ;AND PUT IT IN THE USER'S SP MOV #140000,-(SP) ;SET UP DUMMY PS ON STACK MOVB 36.(SP),(SP) ;BUT USE PS LEVEL OF I/O DEVICE MOV 42.(SP),R1 ;GET I/O LIST ADDRESS (TASK VIRTUAL) MOV $EXIT(R1),-(SP) ; PLACE ADDRESS OF I/O COMPLETE ON STACK MOV TASKNO(R0),$CTASK ;INITIALIZE SYSTEM MOVB TACESS(R0),$ACESS AR5 .ENDC TST MODE ; SEARCH OR XFER INTERRUPT? BMI XFRINT ; TRANSFER ; ; RECORD NUMBER SEARCH IN PROGRESS ; TST DTCMR ; ERROR OCCUR? BMI TARND3 ; GO INVESTIGATE BIT #4000,CDTCM ; CURRENT TRAVEL? BNE BKWD ; BACKWARD CMP DTDR,BLNORQ ; CHECK BLOCK FOUND BEQ BFND ; GOT BLOCK REQUESTED BMI TARND2 ; .IFG NDISCS-2 .WORD ERMOD3 .ENDC ; ; EXPAND IF MORE THAN 3 DISC DEVICE CONTROLLERS ; ; EQUATES FOR ERROR MODULES ; THREAD = 0. ; THREAD WORD ERRNUM = 4. ; ERROR NUMBER ARGM1 = 6. ; ARGUMENT 1 ARGM2 = 8. ; ARGUMENT 2 ARGM3 = 10. ; ARGUMENT 3 ARGM4 = 12. ; ARGUMENT 4 ; .ENDC ; .PAGE ; ; THE FOLLOWING IS BFINIT ROS ID *BFUP ; BFENTR ROS ID, NAME, TYPE *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, ; PARAMETERS, AND RTI ; ACTIVATE THE ROUTINE ; IOCB50: MOV STKSIZ(R0),R1 ;TASK IS NOT ACTIVE, SO WE CAN USE THE ASL R1 ;WHOLE STACK. SER R1 = TASK VIRTUAL BR IOCB40 ; EQUIVALENT OF TOP OF STACK ADDRESS .PAGE ;*********************************************************************** ;* ** ;* ; SHOULD GET TO IT THIS WAY TARND: MOV #4000,-(SP) ; NO-MUST TURN AROUND MOV #2,-(SP) ; ASSUME TRAVEL 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 FOR THE DISC TIMER MODULES AND ; TIMEOUT COMPLETE SUBROUTINE 'TIMOUT' ; MSEC = MSECR ; MILLISECOND TIMER RESOLUTION ; JOMSEC = 21 ; OPTION BYTE-J OPTION ; RESTIM = 10. ; WORD TO RESET TIMER AT TIMJSR = 12. ; WORD TO CHANGE TIMER JSR AT TIMDEV = 14. ; DEVICE # FOR TIMER MODULE ; DTIMR1 = . .WORD 1 ; THREAD WORD .WORD 0,0,0 .BYTE MSEC BFENTR *BFUP ; AND BFOPEN RETURN A RELATIVE START SECTOR FOR *BFUP ; TRANSFERS TO BEGIN AT. *BFUP ; *BFUP ; BFUP STATUS CODES ARE: *BFUP ; 0 *BFUP ; 1 *BFUP ; I O T X I T ** ;* ** ;* THIS ENTRY IS REACHED WHEN THE I/O COMPLETE SUBROUTINE ** ;* EXECUTES AN IOT TRAP. IOTXIT WILL RETURN CPU CONTROL TO ** ;* THE ORIGINAL INTERRUPT CALLER. INTERRUPTS ARE INHIBITED ** ;* ON ENTRY. ** ;* ** ;***************** ; CONTINUE SEARCH ; BKWD: CMP DTDR,BLNORQ ; CHECK BLOCK NUMBER FOUND BEQ BFND ; GOT BLOCK REQUESTED BPL TARND2 ; SHOULD GET TO IT THIS WAY BR TARND ; TURN AROUND ; TARND3: JMP SRCHER ; ; 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 ; RESOLUTION .BYTE JOMSEC ; OPTION BYTE .WORD 0 ; RESET/TIMER .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE ADDRESS ; .WORD 0 ; DEVICE 0 TIMER MODULE ; .IFG NDISCS-1 DTIMR2 = . .WORD 1 ; THREAD WORD .WORD 0,0,0 .BYTE MSEC ; RESOLUTION .BYTE JOMSEC ; OPTION BYTE .WORD 0 ; RESET/TIMER 2 *BFUP ; 3 *BFUP ; 4 *BFUP ; 5 *BFUP ; 6 *BFUP ; 7 *BFUP ; 8 ****************************************************** ; IOTXIT = . TST $TYPE3 ;FIRST, MAKE SURE REQUEST IS LEGAL BEQ IOTC00 ;(CAN'T LET JUST ANYBODY TRAP HERE!!) ;BRANCH IF AN I/O COMPLETE ISN'T ACTIVE ADD #4,SP ;EVERYTHING IS BEAUTIFUL. CLEAN UP ;THE STACK (WE DON'T NEED THE IOT TRAP STUFF) MTPI SP ;RESTORE THE USER SP OF THE ORIGINALSWITCH MOV DTXFRC,CDTCM ; SET-UP DESIRED XFER COMMAND MOV DTNOWD,DTWCR ; SET- UP WORD COUNT REGISTER .IFZ $KT11C MOV DTXFRA,DTBAR ; SET-UP BUS ADDRESS REGISTER .ENDC .IFNZ $KT11C MOV DTXFRA,-(SP) ; XFER ADDRESS SVA JSR PC,SVPPA ; TO PPA MOV (SP)+,R3 ; GET READY FOR CLR R2 ; DOUBLE - WORD ASHC #2,R2 ; SHIFT FO .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE .ENDC .WORD 1 ; DEVICE 1 TIMER MODULE ; .IFG NDISCS-2 DTIMR3 = . .WORD 1 ; THREAD WORD .WORD 0,0,0 .BYTE MSEC ; RESOLUTION .BYTE JOMSEC ; OPTION BYTE .WORD 0 ; RESET/TIMER .WORD TIMOUT ; TIMER COMPLETE SUBROUTINE ADDRESS .ENDC .WORD 2 ; DEVI *BFUP ; 9 *BFUP ; 10 *BFUP ; 11 *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, POPR, DISCIO *BFUP ; *BFUP ; ALL REGISTERS ARE RELY ;INTERRUPTED PROGRAM MOV #$UPDR7+2,R0 MOV #$UPAR7+2,R1 MOV (SP)+,-(R0) ;RESTORE - USER PAGE DESCRIPTOR REGISTERS MOV (SP)+,-(R1) ;AND USER PAGE ADDRESS REGISTERS MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) R 18-BIT ADDRESS ASH #4,R2 ; GET EXTENDED MEMORY BITS BIC #60,CDTCM BIS R2,CDTCM ; SET EXTENDED MEMORY BITS MOV DTXFRA,R2 ; GET LEAST BIC #177774,R2 ; SIGNIFICANT TWO BITS BIS R2,R3 ; PHYSICAL ADDRESS LEAST 16-BITS MOV R3,DTBAR ; SET UP BUS ADDRESS REGISTER .ENDC BR TARND2 ; START I/O ; ; TRANSFER COMPLETE INTECE 2 TIMER MODULE ; ; EXPAND IF MORE THAN 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 DTIMR2STORED *BFUP ; *BFUP ; PROGRAMMER: 53 *BFUP ; DATE: 7-APR-72 *BFUP ; REVISION: *BFUP ; CATALOGUE NUMBER: *BFUP ; MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,-(R0) MOV (SP)+,-(R1) MOV (SP)+,4(SP) ;PUT ORIGINAL CALLING PS IN PROPER PLACE MOV (SP)+,(SP) ;AND FOLLOW IT WITH THE RETURN PC RTI ;AND EXIT ;* ;* ILLEGAL IOT - TREAT THE SAME AS ILLEGAL TRAP ;* IOTC00: JMP PSTRAP .ENDC .END RRUPT ; XFRINT = . TST DTCMR ; ERROR OCCUR? BMI XFRERR ; UH-0H CLR R0 ; SET NO ERROR MOVB #10,DTCMR ; STOP DECTAPE TRANSPORT XFIA05 = . CMPB TYPE(R1),#2. ; IS IT AN EXIT TYPE 2? BNE XFIA10 ; NO MOV SYSTEM(R1),-(SP); SET TASK # TO UNSUSPEND CLR -(SP) ; IMMEDIATE RETURN REQUESTED JSR PC,UNSPND ; UNSUSPEND ; TIMER MODULE DISC UNIT 1 .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 *BFUP ;***********************************************************************BFUP .REF PUSHR,POPR ; BFUP .REF GTIME,GDATE ; BFUP .PAGE BFUP ; PARAMETERS USED BY BFUP BFUP ; BFUP ; FILE & ELEMENT STATUS (BYTES) ; UPDATE 9/30/72 BFUP.S05 ; UPDATE 9/30/72 BFUP.S04 ; UPDATE 2 25 APR 1972 FIX ERROR RETURNS IN GETELT & FILECK ; UPDATE 1 21 APR 1972 FIX GETELT'S ELEMENT DISPLACEMENT .TITLE BFUP ; BFUP .ENABLE CDR ; BFUP ;***********************************************************************BFUP ; 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 .LOCK MOV (R1),(R3) ; PULL REQUEST-SET NEW FIRST BNE XFIA20 ; DIDN'T EMPTY QUEUE MOV R3,(R4) ; SET FIRST = LAST.I.E. EMPTY .IFNZ $KT11C CLC ROR (R4) ; MAKE PACKED CLC ONLY WHATS NEEDED .EVEN ; ; EXPAND 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 I/O PARAMETER LIST ; THREAD = 0. ; LIST THREAD WORD DEVICE = 2. ; LOGICAL DEVICE NUMBER TYPE = 3. ; EXIT TYPE EXIT = BFUP STAVAL = 0 ; ELEMENT AVAILABLE - FILE FREE BFUP STOPEN = 1 ; ELEMENT BEING READ BFUP STXUSE = -1 ; ELEMENT BEING CREATED BFUP STDELT = -2 ; ELEMENT DELETED BFUP STFWRT = 200 ; FILE HAS ELEMENT BEING CREATED BFUP ; BFUP *BFUP ; B F U P *BFUP ; *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 ; ROR (R4) ; PHYSICAL ADDRESS .ENDC XFIA20: MOV #1.,(R1) ; SET THREAD WORD OF REQUEST BACK TO 1 MOV SYSTEM(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 MOVB (SP),PSR ; RESET LOCKOUT MOV R2,-(SP) ; TASK NUMBER TO STACK JSR PC 4. ; I/O COMPLETE ADDRESS IF TYPE = 3 ERRTSK = 6. ; USED FOR ENTRY POINT STATUS LEVEL = 7. ; DISC PRIORITY LEVEL OF I/O REQUEST ERROR = 8. ; I/O ERROR INDICATOR SYSTEM = 10. ; RESERVED FOR DISCIO DATA = 12. ; ADDRESS OF I/O BUFFER DATA1 = 16. ; SYSTEM VIRTUAL ADDRESS OF DATA BUFFER DATA2 = 14. ; ASR6 FOR ABOVE ; ; EQUATES FOR I ; ELEMENT TYPES (BYTE - SIGN BIT USED BY ROSLOAD) BFUP TYOBJ = 0 ; OBJECT ELEMENT BFUP TYLOD = 1 ; LOAD ELEMENT BFUP TYSYM = 2 ; SYMBOLIC ELEMENT (UNSPECIFIED) BFUP TYASM = 3 ; ASSEMBLER SYMBOLIC ELEMENT BFUP TYFOR = 4 ; FORTRAN SYMBOLIC ELEMENT BFUP TYDATA = 5 ; DATA EPROVIDED ARE: *BFUP ; BFINIT - INITIALIZE A ROS FILE FOR BFUP USE *BFUP ; 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 ,RELTSK ; RELEASE TASK .ENDC XFIA30: MOVB (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 MOV R1,-(SP) ; LIST ADDRESS MOV R2,-(SP) ; TASK # JSR PC,IOCOMX ; I/O COMPLETE XFIA40 = . .LOCK DEC NDTREQ ; DECREMENT # DECTAPE REQUESTS LEFT BM/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 ; ; EQUATES FOR RELATIVE FILE POSITIONS ; FILEID LEMENT BFUP ; BFUP ; DIRECTORY ENTRIES (OFFSETS) BFUP DNAME1 = 0 ; FIRST TRIAD OF NAME BFUP DNAME2 = 2 ; SECOND TRIAD OF NAME BFUP DSTAT = 4 ; ELEMENT STATUS BFUP DTYPE = 5 ; ELEMENT TYPE BFUP DHOU *BFUP ; UPDATE DIRECTORY ENTRY IF ELEMENT IS *BFUP ; BEING CREATED *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) I 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: DECB NOTRYS ; = 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 ERR003 = 3. ; ILLEGAL EXIT TYPE ERR0R = 6 ; TIME OF CREATION BFUP DMIN = 7 ; BFUP DSEC = 8. ; BFUP DYEAR = 9. ; DATE OF CREATION BFUP DDAY = 10. ; BFUP DMONTH = 11. ; BFUP DSTSEC = 12. ; FIRST SECTORBFUP COMMUNICATIONS BLOCK WHICH CONTAINS ALL *BFUP ; COMMUNICATION BETWEEN BFUP AND THE USER. IT IS*BFUP ; PROVIDED 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 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 ; TELL OPERATOR 04 = 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 = 11. ; DISC I/O ERROR-I/O NOT COMPLETE E (RELATIVE) IN ELEMENT BFUP DLENTH = 14. ; NUMBER OF SECTORS IN ELEMENT BFUP ; BFUP ; COMMUNICATION 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 = *BFUP ; WORD 4 BYTE 1 ELEMENT TYPE *BFUP ; WORD 5 ELEMENT'S RELATIVE START SECTOR*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 ; SECTOR 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 = . CLR TAPENO BISB ERRTSK(R1),TAPENO ; SET TAPE UNIT NO. MOV #ERRMOD,-(SP) ; ERROR MODULE ADDRESS TO STACK JSR RR012 = 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 ;*********************************************************************** ;* DISCIO,CHKPIO,PFRITE 6 ; SECOND TRIAD OF ELEMENT NAME BFUP BFSTAT = 8. ; FOR SYSTEM USE - USUALLY STATUS BFUP BFTYPE = 9. ; ELEMENT TYPE. BFUP BFSEC = 10. ; FIRST SECTOR IN ELEMENT BFUP BFLNTH = 12. ; LENGTH (IN SECTORS) OF ELEMENT BFUP ; BFUP ; MISCELLANEOUS S 0-31. ARE USED. EACH ENTRY REQUIRES *BFUP ; 8 WORDS. THEREFOR EACH SECTOR HOLDS 8 ENTRIES *BFUP ; GIVING A TOTAL 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 * 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 MOV DTCSR,R0 ; SET DECTAPE STATUS REG. IN R0 RTS PC ; RETURN ; .END * ;* * ;* 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 * ;* THAT THE REQUESTING PROGRAM SUPPLIES A FILE BFUP DIRMAX = 32. ; # OF SECTORS IN DIRECTORY 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 ; BFUP ; FOR ENTRY 0 INBFUP ; ENTRY (REFERED TO AS 'ENTRY 0') AND CONTAINS *BFUP ; THE FILES STATUS, FLAGS, ETC. *BFUP ; *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 I 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. * ;* CHKPIO-SUBROUTINE FOR SYSTE 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 ; SIGN BIT SET IFF WN EACH BFUP FILE. ON THE OTHER *BFUP ; HAND, UP TO 127 ELEMENTS MAYBE READ AT ONE TIME. *BFUP ; THE SPACE OVER THE 32 SECTORS 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 ; UPDATE 9/21/72 (2) IOCOMX.S04 ; UPDATE 9/21/72 IOCOMX.S03 ; UPDATE 20 SEPT 1972 IOCOMX.S02 .TITLE IOCOMX ;*********************************************************************** ;* ** ;* I O C O M X ** ;* ** ;* PROGRAM IDENTIFICATION. IOCOMX - I/O COMPLETE SUBM 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: * ;* * ;* MOV [LIST],-(SPRITE 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 BFUP ; TABLES, LISTS, ETC ; DATA BLOCK. IF NOT COMPLETED IT WILL RETURN AN ERROR *BFUP ; CODE IN THE COMMUNICATIONS BLOCK. *BFUP ; *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 DEFINEDROUTINE ** ;* DISPATCHER. ** ;* ** ;* PURPOSE. THIS ROUTINE IS RESPONSIBLE FOR EXECUTING THE ** ;* SPECIFIED I/O COMPLETE SUBROUTINE, WHETHER IT IS PART OF ** ;* ROS OR PART OF A TASK, ON THE PDP-11/45 OR ON THE PDP-11/20. ** ;* THE I/O COMPLETE ROUTINE IS EXECUTED AS AN EXTENSION OF ** ;* THE INTERRUPT ROUTINE AND AT THE SAME PROC) * ;* EMT DISCIO * ;* WHERE THE I/O LIST ADDRESS WILL BE FOUND ON THE STACK. * ;* THE FORTRAN EQUIVALENT CALL IS: * ;* * ;* CALL DISCIO(LIST) * ;* * ;* THE LINKAGE TO SUBR BFUP ; BFUP BFBUSY: .BYTE 0 ; BFUP BUSY FLAG: =0 NO, =1 YES BFUP .EVEN BFUP ; DISKI/O LIST BFUP .BOUND ; FORCE ONTO A DOUBLE WORD BOUNDARY BFUP DSKLST: .WORD 1 ; THREAD WORD FILE *BFUP ; BFUP FILE - A FILE PROCESSED BY BFINIT TO SETUP *BFUP ; THE BFUP DIRECTORY. *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 ; MESSOR INTERRUPT ** ;* LEVEL. ** ;* ** ;* USAGE. THE LINKAGE TO IOCOMX IS: ** ;* ** ;* MOV #LIST,-(SP) ;ADDRESS OF I/O LIST ** ;* MOV #TASKNO,-(SP) ;NUMBER OF REQUESTING TASK (0 = ROS) ** ;* JSR PC,IOCOMX OUTINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* MOV [LIST],-(SP) * ;* JSR PC,CHKPIO * ;* * ;* AND MOV [LIST],-(SP) * ;* JSR PC,PFRITE * ;* FORTRAN EQU BFUP .BYTE 1 ; 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 CURRENT TYPES ARE: *BFUP ; 0 - OBJECT (OUTPUT OF RASM) *BFUP ; 1 - LOAD (OUTPUT OF ROSLOD) *BFUP ; 2 - GENERAL SYMBOLIC *BFUP ; 3 - RASM SYMBOLIC *BFUP ; 4 - FORTRAN SYMBOLIC *BFUP ; 5 - DATA SYMBOLITINES CHKPIO AND PFRITE ARE RESPECTIVELY: * ;* * ;* MOV [LIST],-(SP) * ;* JSR PC,CHKPIO * ;* * ;* AND MOV [LIST],-(SP) * ;* JSR PC,PFRITE * ;* FORTRAN EQUIVIVALENT 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 = FILE ID * ;* ; DISCIO USE BFUP DSKADD: .WORD 0 ; ADDRESS OF BUFFER FOR TRANSFER BFUP .WORD 0 ; ASR 6 BFUP DSKVAD: .WORD 0 ; ADD. OF BUFFER (VIRTUAL) FOR KT11C BFUP ; BFUP ; DISK BUFFER FOR SECTOR 0 (ALWAYS) BFUP ZBUF: .WORD 0 ; ROS FILE ID C *BFUP ; *BFUP ; LINKAGE: ALL BFUP ROUTINES ARE USED WITH A STANDARD LINKAGE. *BFUP ; IT IS: *BFUP ; *BFUP ; MOV #COMBLK,-(SP) (RASM) *BFUP ; EMT BFUP ROUTINE *BFUP ; ALENT 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 = 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 6 = NWORD * ;* BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP ZFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED 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 ; *BFUP ; CALL BFUP ROUTINE(COMBLK) (FORTRAN) *BFUP ; *BFUP ; WHERE COMBLK IS THE ADDRESS OF A BFUP COMMUNICATIONS *BFUP ; BLOCK *BFUP ; *BFUP ; THE VARIOUS ROUTINES REQUIRE THE FOL 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 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 * ;* CHECK, 4 = WRITE AFTER READ (NOTE: THIS ADDRESS OF LAST CELL IN ZBUF BFUP ; BFUP ; DISK BUFFER FOR ALL OTHER SECTORS BFUP ABUF: .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 BFUPLOWING INFO. *BFUP ; BFINIT ROS ID *BFUP ; BFENTR ROS ID, NAME, TYPE *BFUP ; BFOPEN ROS ID, NAME, TYPE *BFUP ; BFCLOS ROS ID, NAME, TYPE, LENGTH *BFUP ; BFDELT ROS ID, NAME, TYPE *BFUP ; *BFUP ; 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 * ;* 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 * ;* DIRECTORY. ASEC: .WORD 0 ; SECTOR # OF TRANSFER BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ABFEND =.-2 ; ADDRESS OF LAST CELL IN ABUF. BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; ALL RETURN A STATUS CODE. ADDITIONALLY, BFENTR *BFUP ; AND BFOPEN RETURN A RELATIVE START SECTOR FOR *BFUP ; TRANSFERS TO BEGIN AT. *BFUP ; *BFUP ; BFUP STATUS CODES ARE: *BFUP ; 0 *BFUP ; 1 * ;* 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 * ;* 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, * ;* THEN THE XFER BEGINS AT WORD 4. *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 PROCEEDURE 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 ; *BFUP ; 2 *BFUP ; 3 *BFUP ; 4 *BFUP ; 5 *BFUP ; 6 *BFUP ; 7 *BFUP ; * ;* 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, * ;* 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: * ;* * ;* 0= I/O SUCESSFUL BLOCK IS ONE. IF THE STATUS = 0, RETURN TO THE CALLER. *BFUP ; 4) BUILD ENTRY ZERO *BFUP ; *BFUP ; THE FOLLOWING SUBROUTINES ARE USED: PUSHR, POPR, FILECK *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;*********************************************8 *BFUP ; 9 *BFUP ; 10 *BFUP ; 11 *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, POPR, DISCIO *BFUP ; * ;* 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: * ;* * ;* 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 * ;* 7= NON-EXISTENT FILE**************************BFUP .DEF BFINIT ; BFUP BFINIT =. ; ENTRY POINT BFUP JSR 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 TS *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *BFUP ; PROGRAMMER: 53 *BFUP ; DATE: 7-APR-72 *BFUP ; REVISION: *BFUP ; CATALOGUE NUMBER: *BFUP ; * ;* 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 * ;* 7= NON-EXISTENT FILE I 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. * ;* 11= DISC I/O TB BFSTAT(R5) ; IS REINITIALZATION REQUESTED BFUP BEQ INIT99 ; NO. - ALL DONE BFUP INIT10: ; HERE TO ZERO SECTORS 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 ;***********************************************************************BFUP .REF PUSHR,POPR ; BFUP .REF GTIME,GDATE,DISCIO BFUP .PAGE BFUP ; PARAMETERS USED BY BFUP BFUP ; D * ;* 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. * ;* 11= DISC I/O ERERROR, 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 * ;* * ;* AFTER AN ERRO BFUP BLO INIT20 ; NO. BFUP MOV #ZBUF,DSKADD ; YES - NOW LET'S ZERO THE DISK. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD BFUP MOVB #WFUN,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 BFUP ; FILE & ELEMENT STATUS (BYTES) BFUP STAVAL = 0 ; ELEMENT AVAILABLE - FILE FREE BFUP STOPEN = 1 ; ELEMENT BEING READ BFUP STXUSE = -1 ; ELEMENT BEING CREATED BFUP STDELT = -2 ; ELEMENT DELETED BFUP STFWRT = 200 ; FILE HAS ELEMENT BEING CREATED BFUP ; ROR, 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 * ;* * ;* AFTER AN ERROR R TYPE 12, NO OTHER REQUESTS WILL BE * ;* PROCESSED FROM THE DEVICE QUEUE. * ;* * ;* REGISTERS R0 THRU R5 WILL BE SAVED * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISINIT50 ; NO DISC I/O ERRORS. BFUP CMP #9.,DSKERR ; FILE FULL? BFUP BEQ INIT97 ; YES BFUP BR INIT98 ; ALL OTHER ERRORS. 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 HOM BFUP ; ELEMENT TYPES (BYTE - SIGN BIT USED BY ROSLOAD) BFUP TYOBJ = 0 ; OBJECT ELEMENT BFUP TYLOD = 1 ; LOAD ELEMENT BFUP TYSYM = 2 ; SYMBOLIC ELEMENT (UNSPECIFIED) BFUP TYASM = 3 ; ASSEMBLER SYMBOLIC ELEMENT BFUP TYFOR = 4 ; FORTRAN SYMBOLIC ELEMENT BFUP TYPE 12, NO OTHER REQUESTS WILL BE * ;* PROCESSED FROM THE DEVICE QUEUE. * ;* * ;* REGISTERS R0 THRU R5 WILL BE SAVED * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISIOION * ;* * ;*********************************************************************** .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 .REF SAVE,IOCOMX,TSK.PC .IFNZ $KT11C .REF PP E 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)+ ; THEN SET # OF NEXT DIRECTORY ENTRY. BFUP ; AND FILE'S STATUS (0). THE SECTOR OF BFUP CLR (R2)+ ; DIRECTORY ENTRY IS ZERO. BFUP MOV #DIRMA TYDATA = 5 ; DATA ELEMENT BFUP ; BFUP ; DIRECTORY ENTRIES (OFFSETS) BFUP DNAME1 = 0 ; FIRST TRIAD OF NAME BFUP DNAME2 = 2 ; SECOND TRIAD OF NAME BFUP DSTAT = 4 ; ELEMENT STATUS BFUP DTYPE = 5 ; ELEMENT N * ;* * ;*********************************************************************** .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 .REF SAVE,IOCOMX,TSK.PC .IFNZ $KT11C .REF PPAS ASV5,PPASV6,SVPPA .ENDC ; .CSECT DIO ; ; CHKPIO = . MOV R0,-(SP) ; SAVE R0 MOV #100,R0 ; CHKPIO ENTRY POINT MASK BR DIOA00 ; PFRITE = . MOV R0,-(SP) ; SAVE R0 MOV #200,R0 ; PFRITE ENTRY POINT MASK BR DIOA00 ; DISCIO = . MOV R0,-(SP) ; SAVE R0 CLR R0 ; DISCIO ENTRY POINT MASK DIOA00 = . X,(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. BFUP MOV (PC)+,(R2)+ ; BFUP .RAD50 /UP./ ; BFUP BR INIT30 ; GO WRITE SECTOR ZERO OUT. TYPE BFUP DHOUR = 6 ; TIME OF CREATION BFUP DMIN = 7 ; BFUP DSEC = 8. ; BFUP DYEAR = 9. ; DATE OF CREATION BFUP DDAY = 10. ; BFUP DMONTH = 11. ; BFUP DSTSECV5,PPASV6,SVPPA .ENDC ; .CSECT DIO ; ; CHKPIO = . MOV R0,-(SP) ; SAVE R0 MOV #100,R0 ; CHKPIO ENTRY POINT MASK BR DIOA00 ; PFRITE = . MOV R0,-(SP) ; SAVE R0 MOV #200,R0 ; PFRITE ENTRY POINT MASK BR DIOA00 ; DISCIO = . MOV R0,-(SP) ; SAVE R0 CLR R0 ; DISCIO ENTRY POINT MASK DIOA00 = .  .IFNZ $KT11C MOV $KPAR5,-(SP) ; SAVE KERNEL PAR'S MOV $KPAR6,-(SP) ; 5 AND 6 .ENDC MOV R1,-(SP) ; SAVE R1 MOV R2,-(SP) ; SAVE R2 MOV R3,-(SP) ; SAVE R3 MOV R4,-(SP) ; SAVE R4 MOV R5,-(SP) ; SAVE R5 MOV 14.+4*$KT11C(SP),R1 ; GET I/O LIST ADDRESS MOV 12.+4*$KT11C(SP),14.+4*$KT11C(SP) ; ; PUT C BFUP INIT97: JMP BFER07 ; TO FAR FOR BRANCHES BFUP INIT98: JMP BFERDK ; BFUP INIT99: JMP ENDBF ; BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; *BFUP ; BFENTR PROVIDES THE USER W = 12. ; FIRST SECTOR (RELATIVE) IN ELEMENT BFUP DLENTH = 14. ; NUMBER OF SECTORS IN ELEMENT BFUP ; BFUP ; COMMUNICATION BLOCK (OFFSETS) BFUP BFERR = 0 ; ERROR WORD BFUP BFRFIL = 2 ; ROS FILE ID (THE BFUP FILE) BFUP BFELN1 = 4 ; FIRST TRIAD OF .IFNZ $KT11C MOV $KPAR5,-(SP) ; SAVE KERNEL PAR'S MOV $KPAR6,-(SP) ; 5 AND 6 .ENDC MOV R1,-(SP) ; SAVE R1 MOV R2,-(SP) ; SAVE R2 MOV R3,-(SP) ; SAVE R3 MOV R4,-(SP) ; SAVE R4 MOV R5,-(SP) ; SAVE R5 MOV 14.+4*$KT11C(SP),R1 ; GET I/O LIST ADDRESS MOV 12.+4*$KT11C(SP),14.+4*$KT11C(SP) ; ; PUT CALALLER'S PC IN PROPER POSITION FOR RETURN MOVB R0,ERRTSK(R1) ; SET ENTRY POINT MASK AND CLEAR INDEX MOV #ERR001,R0 ; USE R0 TO KEEP TRACK OF ERROR TYPES MOV PSR,-(SP) ; SAVE CPU STATUS .LOCK DEC (R1) ; DECREMENT FIRST WORD OF LIST BNE DIOA72 ; NON-ZERO-ERROR, CAN'T THREAD LIST MOVB (SP)+,@#PSR ; RESET LOCKOUT INC R0 ; BUMP ERROR TYPE MOVB DEVICITH 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 ; *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.  ELEMENT NAME BFUP BFELN2 = 6 ; SECOND TRIAD OF ELEMENT NAME BFUP BFSTAT = 8. ; FOR SYSTEM USE - USUALLY STATUS BFUP BFTYPE = 9. ; ELEMENT TYPE. BFUP BFSEC = 10. ; FIRST SECTOR IN ELEMENT BFUP BFLNTH = 12. ; LENGTH (IN SECTORS) OF ELEMENT BFUP ; BFUP ; MISCELLANELER'S PC IN PROPER POSITION FOR RETURN MOVB R0,ERRTSK(R1) ; SET ENTRY POINT MASK AND CLEAR INDEX MOV #ERR001,R0 ; USE R0 TO KEEP TRACK OF ERROR TYPES MOV PSR,-(SP) ; SAVE CPU STATUS .LOCK DEC (R1) ; DECREMENT FIRST WORD OF LIST BNE DIOA72 ; NON-ZERO-ERROR, CAN'T THREAD LIST MOVB (SP)+,@#PSR ; RESET LOCKOUT INC R0 ; BUMP ERROR TYPE MOVB DEVICE(E(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 ; 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 CO *BFUP ; *BFUP ; BFENTR MARKS THE FILE AND ELEMENT AS OPEN FOR INPUT. *BFUP ; *BFUP ; SUBROUTINES USED ARE: PUSHR,POPR, FILECK *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *BFUP ;*********************************OUS BFUP DIRMAX = 32. ; # OF SECTORS IN DIRECTORY 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 ; 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 ; 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 CONTNTAINS 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 ; 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? **************************************BFUP .DEF BFENTR ; BFUP BFENTR =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP 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 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 AINS 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 ; 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 .IFZ $KT11C MOV DATA(R1),R4 ; R4 = ADDRESS OF I/O BUFFER .ENDC .IFNZ $KT11C MOV DATA1(R1),R4 ; SVA OF DATA BUFFER MOV DATA2(R1),$KPAR6 ; FOR ABOVE .ENDC MOV (R4),R3 ; FILE ID OR IFD BEQ DIOA70 ; ZERO ID ILLEGAL-ERROR TYPE 5 BPL DIOA10 ; FILE ID B! ; 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 CAN FIND EXISTING ELEMENT. BFUP BEQ ENTA30 ; SKIP NEXT BLOCK IF NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP BNE BFER11 ; NO - C" ; 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 # BGT DIOA70 ; ERROR TYPE 4 INC R0 ; BUMP ERROR TYPE .IFZ $KT11C MOV DATA(R1),R4 ; R4 = ADDRESS OF I/O BUFFER .ENDC .IFNZ $KT11C MOV DATA1(R1),R4 ; SVA OF DATA BUFFER MOV DATA2(R1),$KPAR6 ; FOR ABOVE .ENDC MOV (R4),R3 ; FILE ID OR IFD BEQ DIOA70 ; ZERO ID ILLEGAL-ERROR TYPE 5 BPL DIOA10 ; FILE ID BIC$IC #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 = 4 THEN EXIT TYPE BNE DIOA70 ; MUST = 3 DIOA20 = %AN'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 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 ENTA& BFUP ; TABLES, LISTS, ETC BFUP ; BFUP BFBUSY: .BYTE 0 ; BFUP BUSY FLAG: =0 NO, =1 YES BFUP .EVEN BFUP ; DISKI/O LIST BFUP .BOUND ; FORCE ONTO A DOUBLE WORD BOUNDARY BFUP DSKLST: .WORD 1 ' #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 = 4 THEN EXIT TYPE BNE DIOA70 ; MUST = 3 DIOA20 = ( . ; ; **** CALL IOLIM CHECK AT THIS TIME ; 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 .LOCK CMPB R2,HPRIRQ(R5) ; WILL THIS BE HIGHEST PRIORITY RE)30: ; 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 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 A+ ; THREAD WORD BFUP .BYTE 1 ; 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 + . ; ; **** CALL IOLIM CHECK AT THIS TIME ; 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 .LOCK CMPB R2,HPRIRQ(R5) ; WILL THIS BE HIGHEST PRIORITY REQU,QUEST BHIS DIOA50 ; NO MOVB R2,HPRIRQ(R5) ; YES - SET IN HPRIRQ DIOA50: ASL R2 ; CONVERT LEVEL TO ASL R2 ; DOUBLE-WORD INDEX ADD R2,R3 ; GET TO PROPER 'LAST' ADDRESS .IFZ $KT11C MOV R1,@(R3) ; INSERT PARAMETER LIST IN QUEUE MOV R1,(R3) ; SET LAST WORD IN DIRECTORY .ENDC .IFNZ $KT11C MOV R1,-(SP) JSR -DD INTO I/O LIST. BFUP MOV #ABUF,DSKVAD ; SET V ADD. 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: MOVB ZBUF+FNDNUM,R1 ; GOT CURRENT DIR. SECTOR - R0 POINTS TOBFUP BIC #177770,R1 ; IT - LET'S BUILD THE ENTRY NOW - WE BFUP AS.; UPDATE TIMERQ.004 08.30.72 ; UPDATE TIMERQ.003 08.18.72 ; UPDATE TIMERQ.002 08.16.72 .TITLE $$TMRQ ;*********************************************************************** ;* ** ;* T I M E R Q ** ;* ** ;* PROGRAM IDENTIFICATION. TIMERQ - PROCESS TIMEOUT QUEUEI/ BFUP .WORD 0 ; DISCIO USE BFUP DSKADD: .WORD 0 ; ADDRESS OF BUFFER FOR TRANSFER BFUP .WORD 0 ; ASR 6 BFUP DSKVAD: .WORD 0 ; ADD. OF BUFFER (VIRTUAL) FOR KT11C BFUP ; BFUP ; DISK BUFFER FOR SECTOR 0 (ALWAYS) BFUP ZBUF: .WORD 0 0PC,SVPPA ; GET LIST'S PPA MOV (SP)+,R4 MOV (R3),-(SP) ; GET LAST'S PPA JSR PC,PPASV6 ; GET SVA MOV R4,@(SP)+ ; INSERT IN QUEUE MOV R4,(R3) ; SET LAST IN DIRECTORY .ENDC CLR R3 CMP 16.+4*$KT11C(SP),#TSK.PC ; ; CALLED BY A TASK? BNE DIOA55 ; NO. MOV $CTASK,R3 ; R3 CONTAINS TASK NUMBER DIOA55: MOV 1L 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 POINT TO CORRECT BUFFERBFUP ; R1 NOW POINTS TO WORD OF BUFF TO STARTBFUP MOV R5,R4 ; GET ADD OF COM BLO2NG ** ;* AND UNSUSPEND REQUESTS. ** ;* ** ;* PURPOSE. TIMERQ IS QUEUED BY THE TIMER ROUTINE WHENEVER A ** ;* MODULE HAS TIMED OUT AND A QUEUE OR UNSUSPEND REQUEST MUST ** ;* BE PROCESSED. SINCE TIMER IS A TASK, THE PROCESSING TIME ** ;* TO PERFORM THESE FUNCTIONS IS DONE AT THE TASK LEVEL, AND ** ;* NOT AT THE TIMER INTERRUPT LEVEL. 3 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP ZFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RESERVED FOR DISCIO USE BFUP ZSEC: .WORD 0 ; SECTOR 0 - ALWAYS BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER 4 R3,SYSTEM(R1) ; SAVE TASK NUMBER IN SYSTEM BEQ DIOA60 ; NO TASK IS ACTIVE 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 ; RESET LOCKOUT DIOA65: MOV TMTBL(R0),R1 ; ADDRESS OF TIMER MODULE MOV TDELAY,RESTIM(R1) ; 5CK 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 #STXUSE,-2(R1) ; SET STATUS OF ELEMENT IN DIRECTORY BFUP BR 10$ ; TEMP NO TIMERS TO JSR TO ******************* JSR 6 ** ;* ** ;* USAGE. TIMERQ SCANS EACH RESOLUTION'S QUEUE. ANY MODULE ** ;* THAT HAS THE 'B' BIT SET WILL BE PROCESSED. AFTER BEING ** ;* PROCESSED, THE MODULE WILL BE DEQUEUED IF THE RESET BYTE IS ** ;* ZERO. AFTER ALL QUEUES HAVE BEEN SCANNED, THE INTERRUPTS ** ;* ARE INHIBITED AND 'REPEAT' IS DECREMENTED. IF 'REPEAT' IS ** ;* NON-ZERO, THEN INTERRUPTS ARE RELEASED A7BFUP ZBFEND =.-2 ; ADDRESS OF LAST CELL IN ZBUF BFUP ; BFUP ; DISK BUFFER FOR ALL OTHER SECTORS BFUP ABUF: .WORD 0 ; ROS FILE ID BFUP .BYTE 0 ; USE SPECIFIED SECTOR BFUP AFUN: .BYTE 0 ; TRANSFER FUNCTION BFUP .WORD 0,0,0 ; RE8INCASE 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: ; DIOD10, DIOD15, DIOD20, DIOE00 ; DIOA70: JMP 9 PC,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 JSR PC,GDATE ; GET DAY, MONTH, & YEAR OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET YEAR BFUP MOVB (SP)+,(R1)+ ; SET DAY :ND TIMERQ STARTS ** ;* AGAIN. OTHERWISE, TIMERQ EXITS WITH INTERRUPTS INHIBITED. ** ;* ** ;*********************************************************************** .DEF TIMERQ,PKTMQ .REF PKTQFR .REF QUEUE,UNSPND,EXIT,TMRQST .REF TQFRST,TQLAST,DQTIME .IIF NE $KT11C .REF TQVIRT,TQPAR .IFNZ $KT11C .REF PPASV5 .ENDC ;* ;* ;SERVED FOR DISCIO USE BFUP ASEC: .WORD 0 ; SECTOR # OF TRANSFER BFUP .WORD DSKSIZ ; # WORDS TO TRANSFER - 1 SECTOR BFUP .=.+DSKSIZ+DSKSIZ ; RESERVE THE BUFFER BFUP ABFEND =.-2 ; ADDRESS OF LAST CELL IN ABUF. BFUP .PAGE ; BFUP ;***********************************************************************BFUP < 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: CMP (R3)+,(R3)+ ; BUMP LEVEL MOV (R3),R1 BEQ DIOB10 ; DIDN'T FIND ANYTHING AT THAT LEVEL .IFNZ $= BFUP MOVB (SP)+,(R1)+ ; SET MONTH BFUP 10$: ; TEMP ************************************ 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 > T I M E R Q T A S K H E A D E R ;* TIMERQ = . .WORD 1 ;THREAD WORD .WORD $TMRNO ;TASK NUMBER .BYTE .SYSTM ;TASK ACCESS STATUS (SYSTEM TASK) .BYTE 1 ;TASK PRIORITY .WORD TMQA00-TMQSTK ;ENTRY TO TASK .WORD 0 ;MAXIMUM EXECUTION TIME .WORD 0 ;CURRENT TIMER VALUE .WORD 50. ;STACK SIZE .WORD 0,0,0 ?; *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 PROCEEDURE 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 SECTOR@KT11C MOV R1,-(SP) ; PPA JSR PC,PPASV5 ; TO SVA MOV (SP)+,R1 .ENDC MOV R1,CRQPTR(R0) ; SET UP CURRENT REQUEST IN DCT .IFZ $KT11C MOV DATA(R1),R4 ; ADDRESS OF I/O BUFFER .ENDC .IFNZ $KT11C MOV DATA1(R1),R4 ; DATA BUFFER SVA MOV DATA2(R1),$KPAR6 ; ASR6 FOR ABOVE MOV R4,CRQDPT(R0) ; SET UP CURRENT DATA BUFFER IN DCT MA R0 ; 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 MOV #ZBUF,DSKVAD ; SET V. ADD. B ;RESERVED .IFNZ $KT11C ;TASK PAGE DESCRIPTOR REGISTERS .WORD 007006 ;PDR 0 = 15. BLOCKS READ/WRITE .WORD 0 ;PDR 1 = NON-EXISTENT .WORD 0 ;PDR 2 = NON-EXISTENT .WORD 0 ;PDR 3 = NON-EXISTENT .WORD 0 ;PDR 4 = NON-EXISTENT .WORD 0 ;PDR 5 = NON-EXISTENT .WORD 0 ;PDR65 = NON-EXISTENT .WORD 077406 CS IF STATUS BYTE OF COM *BFUP ; BLOCK IS ONE. IF THE STATUS = 0, RETURN TO THE CALLER. *BFUP ; 4) BUILD ENTRY ZERO *BFUP ; *BFUP ; THE FOLLOWING SUBROUTINES ARE USED: PUSHR, POPR, FILECK *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;*****DOV $KPAR5,CRPAR5(R0) ; SAVE CURRENT LIST PAR5 IN DCT MOV $KPAR6,CDPAR6(R0) ; SAVE CURRENT BUFFER PAR6 IN DCT .ENDC 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 E BFUP MOVB #WFUN,ZFUN ; SET FUNCTION FOR A WRITE 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 ;*******************F ;PDR 7 = DEVICE REGISTERS, READ/WRITE ; ;TASK PAGE ADDRESS REGISTERS ; TMRQST: .WORD TMQSTK ;PAR 0 = TIMERQ BASE ADDRESS .WORD 0 ;PAR 1 .WORD 0 ;PAR 2 .WORD 0 ;PAR 3 .WORD 0 ;PAR 4 .WORD 0 ;PAR 5 .WORD 0 ;PAR 6 .WORD 7600 G******************************************************************BFUP .DEF BFINIT ; BFUP BFINIT =. ; ENTRY POINT BFUP JSR 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/BFUPH R0,DOD+NCRLOC(R2) ; 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 ; I****************************************************BFUP ; *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 ; J;PAR 7 = DEVICE REGISTER BASE ADDRESS ; . = .+12. ;FORCE LOCATION COUNTER BACK TO .ENDC ;32-WORD BOUNDARY ; TMQSTK = . . = .+50.+50. ;TIMERQ STACK AREA KERNEL = 62 ;EMT NUMBER TO SWITCH TO KERNEL MODE RSVRD1 = 2. ;THREAD WORD RSVRD2 = 4. ;BACKWARD THREAD RSVRD3 = 6. ;TIMERQ THREAD RES = 8. K FILE BFUP TSTB BFSTAT(R5) ; IS REINITIALZATION REQUESTED BFUP BEQ INIT99 ; NO. - ALL DONE BFUP INIT10: ; HERE TO ZERO SECTORS 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 L R4 = ADDRESS OF I/O BUFFER ; 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 ; ACCUMULATM *BFUP ;SUBROUTINES USED: GETELT, FILECK, PUSHR, DISKBF *BFUP ; *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFDELT ; BFUP BFDELT =. N ;RESOLUTION OPTION = 9. ;OPTION BYTE RSVRD5 = 10. ;MULTPL (BYTE 0) AND RESET (BYTE 1) MULTPL = 10. ;TIMER MODULE MULTIPLE OF RESOLUTION RESET = 11. ;RESET VALUE FOR MULTPL ARG = 12. ;ARGUMENT FOR TASK TO BE QUEUED *EACH OF THESE FLAG = 12. ;BITS TO BE OR'ED *IS SET AS IF MASK = 14. ; INTO THIS ADDRESS *THE PREVIOUS JSTAO #ZBUF+BHEAD,R1 ; DONE YET? BFUP BLO INIT20 ; NO. BFUP MOV #ZBUF,DSKADD ; YES - NOW LET'S ZERO THE DISK. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD BFUP MOVB #WFUN,ZFUN ; SET DISK FUNCTION BFUP MOV #DIRMAX,ZSEC ; SET SECTOR TO TRANSFER -BEGIN WITH 32BFUP INIT30: JSR PC,DISKBF ; GO ZERO A SECTOR PE RELATIVE SECTOR BR DIOB30 ; NOT FINISHED DIOB35: ADD #12.,R0 ; BUMP BACK REMAINDER BISB R0,ERRTSK(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 DFDBAD(R5),DUSE1(R4) ; START CORE ADDRESS FOR SIO Q ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE 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 RRG = 12. ;ADDRESS OF TIMEOUT SUBROUTINE *OPTIONAL TASKNO = 12. ; *IS OMITTED S = 200 ;OPTION *SUSPEND CALLER A = 100 ; BITS *ARGUMENT PRESENT F = 040 ; IN *FLAG AND MASK PRESENT J = 020 ; THE *SUBROUTINE ADDRESS PRESENT T = 010 ; OPTION *TASK TO BE QUEUED D S BFUP BEQ INIT50 ; NO DISC I/O ERRORS. BFUP CMP #9.,DSKERR ; FILE FULL? BFUP BEQ INIT97 ; YES BFUP BR INIT98 ; ALL OTHER ERRORS. BFUP INIT50: DEC ZSEC ; DECREMENT SECTOR COUNT BFUP BGT INIT30 ; GO ZERO NEW SECTOR IF NOT #0. BFUP BLT INT 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: JMP DIHD10 ; REPORTU BFUP TSTB (R0) ; IS ELEMENT FREE BFUP 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 V= 004 ; BYTE *DEQUEUE MODULE PENDING Q = 002 ; OF THE *TASK QUEUE REQUEST PENDING B = 001 ; MODULE *MODULE BUSY .SYSTM = 20 ;SYSTEM TASK ACCESS BIT ; PKTMQ: .IIF NE $KT11C .PACK TIMERQ ;FOR USE BY TIMERS WHEN .IIF EQ $KT11C .WORD TIMERQ ;PLACING TIMERQ IN ROS THREAD .PAGE ;**** ;* T I M E R Q ;* TMQA00: .IFNZ $KT11C ;IF WIT99 ; 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)+ ; THEN SET # OF NEXT DIRECTORY ENTRY. BFUP ; AND FILE'S STATUS (0). THE SECTOR OF BFUP CLR (R2)+ ; DIRECTORY ENTRY IS ZERO. X 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 R3,DEVICE(R1) ; SAME AS CALLY; LIST ALL SET UP FROM GETELT BFUP BNE BFERDK ; DISCIO ERROR BFUP MOV #ZBUF,DSKADD ; SET ADD. OF ZBUF INTO I/O LIST. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD. 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 BFZWE'RE ON THE 11/45 WITH SEGMENTATION, EMT KERNEL ;WE NEED TO SWITCH TO THE KERNEL MODE MOV #TMQA10,PC .ENDC ; TMQA10: MOV #340,R5 ;INITIALIZE REGISTERS: R0 = POINTER TO QUEUE MOV #PS,R4 ; R4 = ADDR (PS) ; ; R5 = INHIBIT BITS TMQA20: MOV #TQFRST,R0 ; MOVB R5,(R4) ;INHIBIT INTERRUPTS MOV [ 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. BFUP MOV (PC)+,(R2)+ ; BFUP .RAD50 /UP./ ; BFUP BR INIT30 \S 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-START REQUEST'S I/O BG]UP BR ENDBF ; ALL DONE - RETURN TO USER. BFUP .PAGE BFUP ;***********************************************************************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 ^(R0),R0 ;GET FIRST MODULE IN QUEUE BNE TMQA30 ;BRANCH IF THERE IS A MODULE QUEUED JSR PC,@#EXIT ;OTHERWISE, EXIT TO ROS ; TMQA30: .IFNZ $KT11C ;ON THE 11/45 WITH SEGMENTATION MOV R0,-(SP) ;THE MODULE ADDRESS MUST BE JSR PC,@#PPASV5 ;CONVERTED TO SYSTEM VIRTUAL MOV (SP)+,R0 ; .ENDC BITB #D,OPTION(R0) ;IS THE 'DEQUEUE' BIT SET? BNE TMQB10_ ; GO WRITE SECTOR ZERO OUT. BFUP INIT97: JMP BFER07 ; TO FAR FOR BRANCHES BFUP INIT98: JMP BFERDK ; BFUP INIT99: JMP ENDBF ; BFUP .PAGE ; BFUP ;***********************************************************************BFUP ; `T 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 ; WHICH THE IFD REPRESEaIS SET, CONTROL IS TRANSERED *BFUP ; TO ENDBF TO RETURN TO THE USER *BFUP ; *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 BFb ;BRANCH IF YES, AND WE WON'T PROCESS ;THE REQUEST. BITB #B,OPTION(R0) ;OTHERWISE, SEE IF THE MODULE IS BUSY BEQ TMQA40 ;BRANCH IF ALL IS FREE AND CLEAR BICB #Q,OPTION(R0) ;OOPS! WE CAN'T PLAY WITH IT YET. MOVB #1,MULTPL(R0) ;RESET THE TIMER FOR ONE MORE TIMEOUT BR TMQB20 ;AND GO REMOVE IT FROM TIMERQ QUEUE ; TMQA40: BISB #B,OPTION(R0) ;SET MODULE BUSY - Ic *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 ; *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. dNTS. 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 DIOB55 ; YES - CHECK FIeER09: INCB (R5) ; DISK I/O ERROR BFUP BFER08: INCB (R5) ; BFUP IS BUSY - ONLY ONE USER AT A TIMEBFUP BFER07: INCB (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 ALREAfT'S OURS NOW! CLRB (R4) ;CLEAR INTERRUPT INHIBIT BITB #T,OPTION(R0) ;IF WE ARE TO QUEUE A TASK, THEN T = 1 BEQ TMQA80 ;BRANCH IF NO (MEANS AN UNSUSPEND REQUEST) MOV R0,R2 ;SET UP STACK FOR CALL TO 'QUEUE' CLR R3 ;R3 = ARGUMENT TO TRANSMIT (IF SPECIFIED) BITB #A,OPTION(R0) ;IS ARGUMENT PRESENT? BEQ TMQA50 ;BRANCH IF NO TST (R2)+ ;OTHERWIg *BFUP ; *BFUP ; BFENTR MARKS THE FILE AND ELEMENT AS OPEN FOR INPUT. *BFUP ; *BFUP ; SUBROUTINES USED ARE: PUSHR,POPR, FILECK *BFUP ; ALL REGISTERS ARE RESTORED *BFUP ; *hLE 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. ; 'DUSE3' = NO. OF WORDSiDY HAS ELEMENT BEING CREATEDBFUP BFER02: INCB (R5) ; THIS ROS FILE NOT BFUP INITIALIZED BFUP BFER01: INCB (R5) ; ROS FILE AS SPECIFIED 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 ;*******jSE, ALLOT ROOM FOR ARG MOV ARG(R0),R3 ;AND PUT IN R3 ; TMQA50: BITB #F,OPTION(R0) ;NOW SEE IF FLAGS ARE PRESENT BEQ TMQA60 ;BRANCH IF NO CMP (R2)+,(R2)+ ;OTHERWISE, STEP OVER THEM ; TMQA60: BITB #J,OPTION(R0) ;AND FINALLY, IS A SUBR. ADDR. SPECIFIED BEQ TMQA70 ;NO - AND THAT'S THE TRUTH! TST (R2)+ ;YES - SKIP OVER IT. ; TMQA70: MOV TASKNO(R2),-(SP);AkBFUP ;***********************************************************************BFUP .DEF BFENTR ; BFUP BFENTR =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE ALL REGISTERS BFUP MOV 14.(SP),R5 ; GET ADDRESS OF BFUB BLOCK. BFUP JSR PC,FILECK ; MAKE SURE ROS/BFUP FILE BFUP BNE ENTA99 ; BRl 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 .IFZ $KT11C MOV DUSE1(R4),@CMA(R5) ; START ADDRESS .ENDC .IFNZ $KT11C MOV R2m****************************************************************BFUP ; *BFUP ; ENDBF IS USED AS 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 ; nND FINALLY WE CAN SET UP STACK FOR CLR -(SP) ;CALL TO QUEUE MOV R3,-(SP) CLR -(SP) MOV #QUEUE,-(SP) BR TMQB00 ; TMQA80: MOV RSVRD2(R0),-(SP);SET UP STACK FOR CALL TO UNSPND CLR -(SP) MOV #UNSPND,-(SP) ;* ;* NOW WE CAN PROCESS THE REQUEST BY LINKING TO THE SPECIFIED ;* SUBROUTINE (QUEUE OR UNSPND). ;* TMQB00: JSR PC,@(SP)+ ;LINK TO IT TST oANCH 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 ENTA98 ; AT A TIME. BFUP JSR PC,GETELT ; SEE IF CAN FIND EXISTING ELEMENT. BFUP BEQ ENTA30 ; SKIP NEXT BLOCK IF NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP p,-(SP) ; SAVE I/O FCN MOV DUSE1(R4),-(SP) ; START ADDRESS SVA JSR PC,SVPPA ; GET I/O BUFFER MOV (SP)+,R3 ; PACKED PHYSICAL CLR R2 ; FOR DOUBLE WORD SHIFT ASHC #2,R2 ; SHIFT FOR 18-BIT ADDRESS ASH #4,R2 ; EXTENDED MEMORY POSITION FOR DCS MOV R2,CDCS(R5) ; SAVE FOR FCN WORD MOV DUSE1(R4),R2 ; GET LEAST SIGNIFICANT BIC #177q *BFUP ; THE LINKAGE IS EITHER A 'JMP ENDBF' OR A 'BR ENDBF'. *BFUP ; *BFUP ; SUBROUTINES USED: POPR *BFUP ; *BFUP ;***********************************************************************BFUP ENDBF =. ; ENTRY POINT BFUP JSR r (SP)+ ;POP ERROR CODE (NO SENSE LOOKIN' AT IT) MOVB R5,(R4) ;INHIBIT INTERRUPTS AGAIN BICB #Q!B,OPTION(R0) ;CLEAR 'QUEUE PENDING' AND 'BUSY' BITS TSTB RESET(R0) ;SHOULD MODULE BE REMOVED FROM TIMER QUEUE BEQ TMQB10 ;BRANCH IF YES (REQUEST WAS ONE-SHOT) BITB #D,OPTION(R0) ;HAS A DEQUEUE REQUEST BEEN RECEIVED BEQ TMQB20 ;ELSEWHERE? BRANCH IF NO ; TMQB10: BICB #D,OPTION(s 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 MOVB #WFUN,AFUN ; NO - MUST WRITE THIS SECTOR TO DISK. BFUP JSR PC,DISKBF ; SECTOR # STILL SET - GO DO I/O BFUP BNE INIT98 ; NO - ERRt774,R2 ; TWO BITS TO COMPLETE BIS R2,R3 ; 18-BIT START ADDRESS MOV R3,@CMA(R5) ; START ADDRESS MOV (SP)+,R2 ; RESTORE I/O FUNCTION .IFZ $DDSDC ; ; CALCULATE AND SET DAR & 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 u R5,POPR ; RESTORE ALL REGISTERS BFUP MOV (SP)+,(SP) ; BUMP RETURN ADDRESS OVER ARG ADDRESS. BFUP CLRB BFBUSY ; CLEAR THE BUSY FLAG BFUP RTS PC ; RETURN TO THE CALLER BFUP .PAGE BFUP ;***********************************************************************BFUP ; vR0) ; MOV R0,-(SP) JSR PC,@#DQTIME ;DEQUEUE THE MODULE FROM TIMER THREAD TST (SP)+ ; TMQB20: MOV RSVRD3(R0),@#TQFRST ;NOW DEQUEUE THIS MODULE FROM BNE TMQB30 ;THE TIMERQ THREAD MOV PKTQFR,@#TQLAST .IFNZ $KT11C MOV #TQFRST,TQVIRT ;SET UP VIRTUAL ADDRESS CLR TQPAR ;TO POINT TO TQFRST .ENDC JSR PC,@#EXIT ;EXIT wOR 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 BFUP MOV R0,ASEC ; NO-MUST READ IN DESIRED SECTOR BFUP MOV #ABUF+BHEAD,R2 ; GET ADDRESS FOR ABUF USE BFUP x@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 R0 ; 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= WRy *BFUP ; BFOPEN PROVIDES THE BATCH USER WITH MEANS OF OPENING AN EXISTING *BFUP ; BFUP ELEMENT FOR OUTPUT TO A USERS PROGRAM. IF THE SPECIFIED FILE *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 ; TO ROS ; TMQB30: CLRB (R4) ;UN-INHIBIT BR TMQA20 ;AND GO BACK FOR MORE .END { MOV #ABUF,DSKADD ; SET BUFFER ADD INTO I/O LIST. BFUP MOV #ABUF,DSKVAD ; SET V ADD. 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: MOVB ZBUF+FNDNUM,R1 ; GOT CURRENT DIR. SECTOR - R0 POINTS TOBFUP BIC #177770,R1 ; IT - LET'S BUI|ITE CHECK IN DCS 02:01 ; MOVB FCNTBL(R2),R2 ; GET CORRECT FUNCTION VALUE BIS #101,R2 ; SET GO FCN IN :01 & INTERRUPT ENABLE .IFZ $KT11C MOV R2,CDCS(R5) ; SAVE CURRENT DCS WORD THIS DEVICE .ENDC .IFNZ $KT11C BIS R2,CDCS(R5) ; SAVE CURRENT DCS WORD THIS DEVICE .ENDC ; ; RESET TIMER FOR 100 MSEC TIME-OUT ON I/O XFER ; MOV TMTBL(R5),R3 ; GET TIMER MODULE THIS DEVICE } *BFUP ; SUBROUTINES USED: GETELT, ENDBF, DISKBF, FILECK, PUSHR *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFOPEN ; ~ AGAIN FOR A WHILE MOVB EMLIST,-(SP) ;GET SCOOP ON VIRTUAL ADDRESSES IN STACK MOVB -2(R0),@#PS ;ENABLE INTERRUPTS MOVB (SP),R2 ;GET INDEX OF POSITION OF LIST ADDRESS BEQ EMTD00 ;BRANCH IF NO CONVERSION IS REQUIRED BIC #177600,R2 ;OTHERWISE, CLEAR EXTRANEOUS BITS ADD SP,R2 ;R2 = ADDRESS ON STACK THAT CONTAINS ;THE LIST ADDRESS MOVB 1(R2),R3 LD 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 POINT TO CORRECT BUFFERBFUP ; R1 NOW POINTS TO WORD OF BUFF TO STARTBFUP MOV  MOV TDELAY,RESTIM(R3) ; RESET FOR 100 MSEC TIME-OUT MOV PSR,-(SP) ; SAVE CURRENT LEVEL .LOCK DIOC30 = . MOV CDCS(R5),@DCS(R5) ; START DISC I/O XFER ASR R5 ; R5 BECOMES DISC CONTROLLER UNIT # ; ; 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  BFUP BFOPEN =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SZVE ALL REGISTERS BFUP 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  ;GET LIST ADDRESS TOP BYTE, 'CAUSE ASH #-4,R3 ;FIRST, WE NEED THE PAR NUMBER BIC #177761,R3 ;R0 = (PAR #)*2 FOR INDEXING MOV $UPAR0(R3),@#$KPAR5 ;TRANSFER USER PAR TO KERNEL PAR MOV (R2),R3 ;NOW, PUT THE PAR TO THE BIC #160000,R3 ;NEAREST 32-WORD BOUNDARY ASH #-6,R3 ;BY TAKING BITS 6-12 OF TASK ADD R3,@#$KPAR5 ;VIRTUAL AND ADDIN 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 #STXUSE,-2(R1) ; SET STATUS OF ELEMENT IN DIRECTORY BFUP BR 10$ ; TEMP NO TIMERS TO JS BEQ DIOD20 ; NO- SUBROUTINE REQUEST CALL BMI DIOD30 ; TIME-OUT - COMPLETE SUBROUTINE RETURN MOVB (SP)+,@#PSR ; RESET FROM LEVEL 7 JMP RESTOR ; EXIT FROM INTERRUPT ; ; ERROR EXIT FROM DISCIO,CHKPIO, 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 =  ; NOT FOUND BFUP INCB ZBUF+FSTAT ; FOUND IT. SET STATUS AS OPEN IN FILE BFUP BPL OPEN10 ; CAN 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 G TO BITS ;0-12 OF KPAR 5 BIC #177700,(R2) ;NOW, SET THE LIST ADDRESS TO VIRTUAL BIS #120000,(R2) ;USING KPAR 5. TSTB (SP)+ ;NOW, IS THERE A DATA BUFFER ADDRESS? BPL EMTB20 ;BRANCH IF NO MOV (R2),R2 ;OTHERWISE, GET THE TASK VIRTUAL ADDRESS MOVB DATA+1(R2),R3 ; ASH #-4,R3 ;GET THE PAR NUMBER BIC #177761,R3 R TO ******************* JSR PC,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 JSR PC,GDATE ; GET DAY, MONTH, & YEAR OF CREATION BFUP MOVB (SP)+,(R1)+ ; SET YEAR BFUP MOVB  . INC (R1) ; BUMP BACK TREAD WORD DIOD12: JSR PC,ERR ; EXECUTE DISC I/O ERROR SUBROUTINE MOVB PSR,-(SP) ; MAKE COMPATIBLE BR DIOD25 ; START EXIT SEQUENCE DIOD15: INC (R1) ; BUMP BACK THREAD 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 ?  BFUP MOV (R0)+,BFSEC(R5) ; SET START SECTOR INTO COM BLOCK BFUP MOV (R0),BFLNTH(R5) ; SET LENGTH INTO COM BLOCK. BFUP 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  ;R0 = PAR INDEX MOV $UPAR0(R3),DTPAR(R2) ;TRANSFER USER PAR TO KERNEL PAR MOV DATA(R2),R3 ;NEXT, PUT THE PAR TO THE BIC #160000,R3 ;NEAREST 32-WORD BOUNDARY ASH #-6,R3 ; ADD R3,DTPAR(R2) ; MOV DTPAR(R2),@#$KPAR6 ;SET UP KERNEL PAR 6 MOV DATA(R2),R3 ;THEN, CHANGE THE ADDRESS TO KERNEL VIRTUAL BIC #177700,R3 ;AND POINT IT  (SP)+,(R1)+ ; SET DAY BFUP MOVB (SP)+,(R1)+ ; SET MONTH BFUP 10$: ; TEMP ************************************ 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  BEQ DIOD40 ; YES DIOD25: MOVB (SP)+,@#PSR ; RESTORE PSR MOV (SP)+,R5 ; RESTORE MOV (SP)+,R4 ; CALLER'S MOV (SP)+,R3 ; REGISTERS MOV (SP)+,R2 MOV (SP)+,R1 .IFNZ $KT11C MOV (SP)+,$KPAR6 ; RESTORE MOV (SP)+,$KPAR5 ; KERNEL SCRATCH ASR'S. .ENDC MOV (SP)+,R0 TST (SP)+ ; SP TO PROPER STACK POS; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADDRESS IFF USED ABUF. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP OPEN20: MOVB #WFUN,ZFUN ; HERE TO OUTPUT SECTOR 0. BFUP JSR PC,DISKBF ; DO IT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BF BIS #140000,R3 ; TO KPAR 6 MOV R3,DTVIRT(R2) ;AND SAVE BOTH IN THE I/O LIST ; EMTB20: MOV (SP)+,R3 ;RESTORE MOV (SP)+,R2 ; REGISTERS JSR PC,@(SP)+ ;LINK TO REQUESTED SUBROUTINE ;* ;* ;* RETURN HERE AFTER SUBROUTINE HAS FINISHED DOING ITS THING. ;* NOW WE NEED TO REORGANIZE THE TASK STACK SO'S WE CAN RETURN ;* TO HIM. R0 AND R1 SHOULD STILL BE SET AS DEFINED ABOVE. ;* ;* TSK.PC: AS WRITE IN PROG. BFUP TST R0 ; 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 MOV ITION FOR RTS PC ; SUBROUTINE RETURN ; ; RETURN FROM TIMER COMPLETE SUBROUTINE ; DIOD30 = . CLRB TMCRSW(R5) ; RESET TIMER COMPLETE SUB. SWITCH MOVB (SP)+,@#PSR ; RESET FROM LEVEL 7 RTS PC ; SUBROUTINE RETURN ; ; SUSPEND CALLING PROGRAM - TYPE 2 EXIT ; DIOD40 = . MOV (SP)+,12.+4*$KT11C(SP) ; SAVE PSR MOV (SP)+,R5 ; RESTORE MOV (SP)+,R4 UP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFCLOS 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 M .LOCK ;INHIBIT INTERRUPTS MOV STACK,SP ;RESTORE THE SYSTEM STACK VALUE MOV -(R0),-(SP) ;PUT RETURN PS MOV -(R0),-(SP) ;AND PC ON SYSTEM STACK FOR RTI MOV -(R0),R1SAVE ;SAVE OLD R0 AND R1 SOMEWHERE MOV -(R0),R0SAVE ;ELSE FOR A WHILE TST R1 ;SEE IF THERE ARE ANY ARGUMENTS BEQ EMTC10 ;RETURNED FROM SUBROUTINE - BR IF NO ; EMTC00: MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP MOVB #WFUN,ZFUN ; SET FUNCTION FOR A WRITE BFUP JSR PC,DISKBF ; AND WRITE SECTOR 0 OUT. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE BFUP ENTA98: JMP BFER03 ; TO FAR TO BRANCH BFUP ENTA99: JMP BFER02 ; TO FAR FOR A BRANCH  ; ENVIRONMENT MOV (SP)+,R3 ; OF MOV (SP)+,R2 ; CALLER MOV (SP)+,R1 ; BEFORE .IFNZ $KT11C MOV (SP)+,$KPAR6 ; RESTORE MOV (SP)+,$KPAR5 ; KERNEL SCRATCH ASR'S .ENDC MOV (SP)+,R0 ; DISCIO CLR -(SP) ; SUSPEND-NO REQUEUE JSR PC,QSAVE ; SUSPEND TASK JMP DSPTCH ; EXIUST SUPPLY THE LENGTH OF THE *BFUP ; ELEMENT. *BFUP ; *BFUP ; SUBROUTINES USED: PUSHR, FILECK, GETELT, DISKBF *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;* -(R0),8.(R0) ;MOVE SUBROUTINE ARGUMENTS, PS AND PC SOB R1,EMTC00 ;UP ON THE STACK ; EMTC10: ADD #8.,R0 ;ADJUST TASK STACK VALUE BIC #160000,R0 ;POINT R0 STACK BASE TO ASR 0 (USER MODE) MOV R0,-(SP) ;PUT USER STACK VALUE ON STACK MOV R0SAVE,R0 ;RESTORE TASK'S MOV R1SAVE,R1 ; REGISTERS BIS #PUSER,@#PS ;SET PREVIOUS MODE = USER MTPI SP  BFUP .PAGE BFUP ;***********************************************************************BFUP ; *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 T TO DISPATCHER ; ; ; FILE DIRECTORY INFORMATION IS NOT NEEDED. SYSTEM, 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 BMI 10$ ; JMP DIOB70 ; GO PERFORM I/O FOR REQUESTED FCN 10$: BITB #4.,INOUT(R4) ; I/O FCN = 4? BNE DIOE20 ; YES MOV #2.,R2 ; WRITE CHECK NE**********************************************************************BFUP .DEF BFCLOS ; BFUP BFCLOS =. ; ENTRY POINT BFUP JSR 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 BF;RESET USER MODE SP VALUE RTI ;RETURN TO USER ;* ;* EMT ERROR - TREAT AS ANY ERROR TRAP ;* EMTX00: TST (SP)+ ;CLEAN MOV (SP)+,R0 ; UP MOV (SP)+,R1 ; SYSTEM MOV (SP)+,R2 ; STACK ; EMTX20: JMP PSTRAP ;THEN GO TO ROS ERROR TRAP ROUTINE ; EMTD00: TST (SP)+ ;POP CODE OFF STACK BR EMTB20 ;AND GO LINK TMUST BE USED TO COMPRESS THE FILE. *BFUP ; *BFUP ;SUBROUTINES USED: GETELT, FILECK, PUSHR, DISKBF *BFUP ; *BFUP ; ALL REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***************************************************************XT FOR W/WC REQUEST DIOE10: BICB #200,INOUT(R4) ; RESET MULIPLE FCN SWITCH BR DIOC00 ; START I/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. ; ; THUP. BFUP JSR PC,GETELT ; SEE IF WE CAN FIND THE ELEMENT. BFUP BEQ BFER06 ; NOT FOUND BFUP CMPB #STOPEN,(R0) ; STATUS = OPEN-READ BFUP BEQ CLSA30 ; YES BFUP CMPB #STXUSE,(R0) ; NO - THEN IS IT OPEN-WRITE BFUP BNE BFER10 ; NO - ERROR BFUP O THE SUBROUTINE .PAGE ;*********************************************************************** ;* ;* K E R N E L ;* ;* THIS SHORT EMT PROCESSING SUBROUTINE CAN ONLY BE ENTERED BY ;* SYSTEM TASKS THAT ARE WITHIN 16K MEMORY. THIS SUBROUTINE ;* PLACES THE CALLING TASK (WHO IS IN USER MODE) IN THE ;* KERNEL MODE. --- CAVEAT EMPTOR --- ;* ;* KERNEL: MOV $CTASK,-(SP) ;PUSH THE TASK NUMBER AND MOV 8.(SP),-********BFUP .DEF BFDELT ; BFUP BFDELT =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE 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 E CALLING SEQUENCE IS: ; ; JSR PC,CFILID ; ; WHERE: R1 = I/O LIST ADDRESS ; 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' = SMOV 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 ZBUF+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 ; (SP) ;PC OF THE CALLING TASK JSR PC,TVSV5 ;SO'S WE CAN CONVERT THE VIRTUAL ;ADDRESS TO A SYSTEM VIRTUAL ADDRESS JMP @(SP)+ ;THEN WE CAN RETURN TO THE TASK ;IN THE KERNEL MODE. .ENDC .PAGE .IFZ $KT11C .CSECT .EMTIN ;FORCE INTO IPL GROUP ;[GLOBAL REFERENCES WHICH REMAIN UNDEFINED AT LINK TIME BECAUSE THEY ; WERE NOT INCLUDED IN THE MONITOR BEI ; SEE IF WE CAN FIND THE ELEMENT BFUP BEQ BFER06 ; NOT FOUND BFUP TSTB (R0) ; IS ELEMENT FREE BFUP 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. TART SECTOR NO. ; 'DUSE3' = NO. OF WORDS IN XFER ; CFILID = . TSTB ERRTSK(R1) ; PFRITE ENTRY ? BMI CIDA05 ; YES-IGNORE COMPRS TEST MOVB FTYPE(R2),R0 ; GET FILE TYPE BIC #177600,R0 ; ISOLATE MOV PSR,-(SP) ; SAVE PS ON STACK .LOCK CMP R0,CPRSIP ; THIS FILE TYPE BEING COMPRESSED? BEQ CIDC00 ; YES-DO WHATS NECESSARY MOVB (SP BFUP CLSA20: BITB #7,ZBUF+FNDNUM ; DIRECTORY NOT FULL - IS SECTOR FULL? BFUP BNE CLSA40 ; NO. BFUP INC ZBUF+FDIRSC ; YES - INCREMENT DIRECTORY SECTOR COUNTBFUP BR CLSA40 ; BFUP CLSA30: DECB ZBUF+FSTAT ; HERE FOR OPEN-READ BFUP CLSA40: CLRB (R0) ; CLEAR STATUS IN DIRECTORY BFUP MOVB NG GENERATED WILL BE LOADED WITH ; A ZERO BY THE LOADER. THE FOLLOWING SUBROUTINE WILL BE CALLED BY "IPL" ; TO INITIALIZE THESE ENTRIES TO "EMTERR" IN CASE THEY ARE CALLED.] EMTINIT: ;SUBROUTINE TO REPLACE UNDEFINED VECTOR ELEMENTS ;WITH IMMEDIATE RETURNS. ("HALTS" IN DEBUG VERSION.) MOV #EMTABL,R0 EMTI10: TST (R0)+ ;IS THIS VECTOR ELEMENT UNDEFINED? BNE EMTI20 ;NO MOV #EMTERR,-(R0) ;YES - PUT ERROR RETURN IN BFUP MOVB #WFUN,AFUN ; WRITE DIRECTORY SECTOR OUT. DISCIO BFUP JSR PC,DISKBF ; LIST ALL SET UP FROM GETELT BFUP BNE BFERDK ; DISCIO ERROR BFUP MOV #ZBUF,DSKADD ; SET ADD. OF ZBUF INTO I/O LIST. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP BFDL20: MOVB #WFUN,ZFUN ; HAVE TO DO THIS TWICE BFUP JSR PC,DISKBF ; )+,@#PSR ; RESET LOCKOUT CIDA05: BITB #100,ERRTSK(R1) ; CHECKPOINT 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 .IFZ $1145 ASL R0 ; MULTIPLY ASL R0 ;  #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,AFUN ; 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 IT TST (R0)+ ;...AND ADVANCE IT AGAIN EMTI20: CMP R0,#MAXEMT*2+EMTABL ;REACHED END OF VECTOR YET? BLOS EMTI10 ;NOT YET - KEEP GOING MOV #EMTRAP,30 ;INIT EMT VECTOR MOV #340,32 RTS PC ;ALL DONE .ENDC .END NOW DO SECTOR ZERO. BFUP BNE BFERDK ; DISK I/O ERROR BFUP BR ENDBF ; ALL DONE - RETURN TO USER. BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; THIS CODE TAKES CARE OF SFTTING THE ERROR WORD. THE LOW BYTE WILL *BFUP SECTORS ASL R0 ; BY ASL R0 ; 64 ASL R0 ; FOR ASL R0 ; NO. WORDS .ENDC .IFNZ $1145 ASH #6.,R0 ; MULTIPLY BY 64 FOR # OF WORDS .ENDC MOV R0,DUSE3(R4) ; SET LENGTH OF XFER MOV R4,R0 ; CALCULATE ADDRESS OF RLSECT ADD #RLSECT,R0 ; AND START I/O THERE CIDA20: USED ABUF. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP CLSB20: JSR PC,DISKBF ; HERE TO DO SEDTOR 0. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE. BFUP .PAGE BFUP ;***********************************************************************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 ; *BFUP ;***********************************************************************BFUP BFER12: INCB (R5) ; ONLY 127 OPEN (READ) ELEMENTS/FILE BFUP BFER11: INCB (R5) ; ELEMENMOV 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 FILE CHECK BPL CIDA30 ; OK - NOT A PROTECTED FILE BITB #300,ERRTSK(R1) ; PROTECTED IF DISCIO ENTRY BEQ CIDB10 ; SET ERROR TYPE 10 CIDA30: CLR R0 ; SIGNIFY NO ERRORS RTS PC ; RETURN TO  *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: *BFUP ; R5 = ADDRESS OF COMMUNICATIONS BLOCK *BFUP ; SECTOR ZERO IN THE ZBUF T 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 (R5) ; ROS FILE FULL BFUP BFER06: INCB (R5) ; REQUEST ELEMENT DOESN'T EXIST BFUP BFER05: INCB (R5) ; ELEMENT ASSIGNED FOR EXCLUSIVE USE. BFUP BFERCALLER ; ; CHKPIO ENTRY - USE CKSAVE IN FILE'S DIRECTORY ; CIDA40 = . MOV CKSAVE(R2),DUSE2(R4) ; CHECKPOINT ADDRESS SET BNE CIDA10 ; OK - CONTINUE 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  *BFUP ; DISKIO LIST SETUP FOR ROS FILE *BFUP ; *BFUP ; OUTPUT FROM GETELT IS: *BFUP ; R3 = SECTOR # CONTAINING SPECIED ELEMENTS DIRECTORY ENTRY *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 04: 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 SPECIFIED 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 BFUMUST 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 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 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 ; *BFUP ; SUBROUTINES USED: DISKBF *BFUP ; P ERROR CODE IN LOW BYTE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; ENDBF IS USED AS A COMMON CLOSING FOR ALL BFUP ROUTINES. IT WILL: *BFUP ; 1) RESTORE REGISTER *BFUP ; 2) CLEAR THE BFUP BUSY FLAG *BFUP ; 3) ; 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) ; 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 *BFUP ; ALL UNUSED REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP GETELT =. ; ENTRY POINT BFUP MOV #ZBUF+FID+FFLAG2+2-FID,R0 ; PUT ADDRESS OF ENTRY 1, BFUP ; SECTOR 0 INTO R0 BFUP MOV #ZBFEND,R2  RESTORE TO THE BATCH USER *BFUP ; *BFUP ; THE LINKAGE IS EITHER A 'JMP ENDBF' OR A 'BR ENDBF'. *BFUP ; *BFUP ; SUBROUTINES USED: POPR *BFUP ; *BFUP ;*************************************************** TYPE 8 RTS PC ; CIDB09 = . MOV #ERR009,R0 ; REPORT ERROR TYPE 9 RTS PC ; CIDB10 = . MOV #ERR010,R0 ; REPORT ERROR TYPE 10 RTS PC ; .IFNZ $DDSDC CIDB14 = . MOV #ERR014,R0 ; REPORT ERROR TYPE 14 RTS PC .ENDC ; ; COMPRESSION IN PROGRESS THIS FILE TYPE ; ; *** NOTE: USE IOCOMX TO CALL COMPRS BY ; LOOKING LIKE I/O COMPLETE -; 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. DOES SECOND TRIAD? BFUP BNE GETA30 ; NO. BFUP CMPB 1(R0),BFTYPE(R5); YES. DOES TYPE? BF********************BFUP ENDBF =. ; ENTRY POINT BFUP JSR R5,POPR ; RESTORE ALL REGISTERS BFUP MOV (SP)+,(SP) ; BUMP RETURN ADDRESS OVER ARG ADDRESS. BFUP CLRB BFBUSY ; CLEAR THE BUSY FLAG BFUP RTS PC ; RETURN TO THE CALLER BFUP .PAGE BFUP ;*************** THUS WILL ; OPERATE IN USER MODE, TASK STACK. ALSO ; USE ROSGET FOR ROS/TASK COMMUNICATION. ; SAVE KERNEL ASR'S ; ; CIDC00 = . MOV #2*$CPTNO,R0 ; COMPRESS TASK NUMBER WORD INDEX .IFZ $KT11C MOV HEADER(R0),R0 ; HEADER ADDRESS .ENDC .IFNZ $KT11C MOV HEADER(R0),-(SP) JSR PC,PPASV6 ; GET SVA USING ASR6 MOV (SP)+,R0 .ENDC UP 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 RTS PC ; YES - ALL DONE RETURN TO USER. BFUP GETA20: TST (R0)+ ; INCREMENT R0 BY 2 BFUP GETA30: ADD #BFLNTH-DSTAT+4,R0 ********************************************************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 FILE *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  ADD #16.,R0 ; BUMP TO LOOK LIKE I/O LIST MOV R0,-(SP) MOV #$CPTNO,-(SP) MOV R1,-(SP) ; I/O LIST SVA JSR PC,SVPPA MOV (SP)+,R4 ; I/O LIST PPA JSR PC,IOCOMX ; QUEUE REQUEST IN COMPRESS QUEUE JMP DIHA50 ; ; ; CONVERT WORDS TO SECTORS (64 WORDS). INCLUDES ; PARTIALLY FILLED SECTORS. ; JSR PC,WRDSCT ; UPON ENTRY R0 = WORDS ; UPON EX ; 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 ABUF BFUP MOV #ABFEND,R2 ; SET R2 = ADDRESS OF ABUF LAST WORD BFUP INC R3 ; ADD 1 TO R3 (SECTOR COUNTER BFUP LENGTH ARE *BFUP ; RETURNED TO THE USER VIA THE COMMUNICATIONS BLOCK. *BFUP ; *BFUP ; SUBROUTINES USED: GETELT, ENDBF, DISKBF, FILECK, PUSHR *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED. *BFUP ; *BFUP ;*********************IT R0 = SECTORS ; OTHER REGISTERS WILL NOT BE DESTROYED ; WRDSCT = . MOV R1,-(SP) ; SAVE R1 FOR WORK REGISTER MOV R0,R1 ; DUPLICATE .IFZ $1145 ASR R1 ; CONVERT ASR R1 ; LENGTH ASR R1 ; INTO ASR R1 ; SECTORS- ASR R1 ; DIVIDE BY ASR R1 ; 64  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 #ABUF,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP MOV #ABUF,DSKVAD ; SET V. ADD. BFUP MOVB #RFUN,AFUN ; SET STATUS**************************************************BFUP .DEF BFOPEN ; BFUP BFOPEN =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SZVE ALL REGISTERS BFUP 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.  .ENDC .IFNZ $1145 ASH #-6.,R1 ; DIVIDE BY 64 .ENDC 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 DISC INT. HANDLER. THE INTERRUPT VECTOR PSR ; CONTAINS THE DEVICE  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 BFUP .PAGE BFUP ;******* 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 ; CAN 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)CONTROLLER UNIT NO. THE PROCESSOR ; LEVEL WILL BE RESET TO THE HARDWARE LEVEL OF THE DISC ; INTERRUPT. ; DINT = . JSR R5,SAVE ; SAVE ENVIRONMENT MOV @#PSR,-(SP) ; CURRENT PSR CONTAINS DEVICE NO. IN C.C. MOV (SP)+,R5 ; GET DEVICE MASK MOV #240,-(SP) ; RESTORE TO CPU LEVEL 5 BIC #177760,R5 ; ISOLATE TSTB TMCRSW(R5) ; RACE CONDITION BETWEEN TIMER AND DISC? BEQ ****************************************************************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 FILE IS DEFINED IN ROS. *BFUP ; 3) SETING THE STATUS BITS & ROTO 1 IF THE  ; 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 TSTB R3 ; ALL IN SECTOR 0? BFUP BEQ OPEN20 ; YES BFUP MOVB #WFUN,AFUN ; OUTPUT DIRECTORY SECTOR - ABUF  DIHA01 ; NO-OK MOVB (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),R3 ; RESET TIMER SO TIME-OUT MOV TDELAY,RESTIM(R3) ; WILL NOT OCCUR MOVB (SP)+,@#PSR ; SET APPROPRIATE CPU LEVEL FOR THIS DFILE 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 ; *BFUP ;***********************************************************************BFUP FILECK =.  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 MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP OPEN20: MOVB #WFUN,ZFUN ; HERE TO OUTPUT SECTOR 0. BFUP JSR PC,DISKBF ; DO IT. BFUP BNE BFERDK ; EVICE MOV CRQPTR(R5),R1 ; ADDRESS OF CURRENT REQUESTS I/O LIST .IFNZ $KT11C MOV CRQDPT(R5),R4 ; ADDRESS OF I/O DATA BUFFER MOV CRPAR5(R5),$KPAR5 ; SO WE CAN USE I/O LIST SVA MOV CDPAR6(R5),$KPAR6 ; SO WE CAN USE BUFFER SVA .ENDC .IFZ $KT11C MOV DATA(R1),R4 ; ADDRESS OF I/O DATA BUFFER .ENDC BIT #DERMSK,@DCS(R5) ; DID AN ERROR OCCUR? BEQ DIHA03  ; 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 ; SET SETOR NUMBER ZERO IN DISK ADDRESS.BFUP MOV #ZBUF,R0 ; GET ADDRESS OF BUFFER ERROR BFUP BR ENDBF ; ALL DONE BFUP .PAGE BFUP ;***********************************************************************BFUP ; *BFUP ; BFCLOS 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 ;NO JMP DIHC00 ; YES-PERFORM APPROPRIATE FUNCTION DIHA03 = . .IFNZ DRESDI 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 TYPEFOR 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 MOV R0,DSKVAD ; SET V. ADD. BFUP JSR PC,DISKBF ; READ IN SECTOR 0 BFUP BEQ FLCK ; 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, DISKBF *BFUP ; *BFUP ; ALL REGISTERS ARE RESTORED.  2? BNE DIHA20 ; NO MOV SYSTEM(R1),-(SP); GET TASK NO. AND 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 10 ; 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 ; NOT BFUP FILE  *BFUP ; *BFUP ;***********************************************************************BFUP .DEF BFCLOS ; BFUP BFCLOS =. ; ENTRY POINT BFUP JSR R5,PUSHR ; SAVE THE REGISTERS BFUP MOV 14.(SP),R5 ; PUT ADDRESS OF COM BLOCK INTO R5 BFUP  MOVB LEVEL(R1),R3 ; CURRENT PRIORITY OF REQUEST ASL R3 ; DOUBLE-WORD ASL R3 ; INDEX 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 .LOCK MOV (R1),(R3) ; PULL REQUEST OUT OF QUEUE THREAD  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 BFUP RTS PC  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 BFUP BEQ CLSA30 ; YES BFUP CMPB #STXUSE,(R0) ; NO - THEN IS BNE DIHA25 ; DIDN'T EMPTY PRIORITY LIST MOV R3,(R4) ; EMPTY-LAST POINTS TO FIRST .IFNZ $KT11C CLC ROR (R4) ; CALCULATE CLC ROR (R4) ; PPA .ENDC DIHA25: MOV R2,(R1) ; SET REQUEST LIST THREADABLE DIHA30: CMP (R0)+,(R0)+ ; SEARCH DEVICE QUEUE TST (R0) ; FOR BNE DIHA40 ; HIGHEST PRIORITY LEFT-GOT IT!  ;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 ;******************************************************************* 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 ZBUF+FNDNUM ; UPDATE DIRECTORY # COUNTER BFUP BNE CLSA20 ; SKIP IF DIR. NOT FULL BFUP MO 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 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****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 ; THE LINKAGE IS 'JSR PC,DISKBF'V #-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 SECTOR COUNTBFUP BR CLSA40 ; BFUP CLSA30: DECB ZBUF+FSTAT ; HERE FOR OPEN-READ ONE MOVB (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(R1),#3. ; IS EXIT A TYPE 3? BNE DIHA47 ; NO MOV R5,-(SP) ; YES-SAVE DISC CONTROLLER UNIT NO. MOV R1,-(SP) ; LIST ADDRESS MOV SYSTEM(R1),-(SP); TASK # JSR . *BFUP ; *BFUP ;***********************************************************************BFUP DISKBF =. ; ENTRY POINT BFUP MOV #DSKLST,-(SP) ; PUSH DISK I/O LIST ADDRESS BFUP JSR PC,DISCIO ; GO DO DISCIO (AT LAST). BFUP BISB DSKERR,1(R5) ; SET DISK T/O STATUS BITS INTO UPPER BYBF 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,AFUN ; SET ABUF FOR WRITE ALSO. BFUP JSR PC,DISKBF ; NO - I/O LIST SET UP FROM GETELT BFUP BNE PC,IOCOMX ; 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 .LOCK DEC NODREQ(R0) ; DECREMENT NO. REQUESTS QUEUED THIS DEVICE BPL DIHA55 ; MORE REQUESTS LEFT MOV TMTBL(R0),R1 MOV #NOPTIM,TIMJSR(R1) ; IGNORE NEXT TIMER COMPLETE DIHA55: TSTB CALLEUP RTS PC ; RETURN TO CALLER. BFUP .END ; BFUP BFERDK ; ERROR BFUP MOV #ZBUF,DSKADD ; SET ZBUF ADD. ONLY IF USED ABUF. BFUP MOV #ZBUF,DSKVAD ; SET V. ADD. BFUP CLSB20: JSR PC,DISKBF ; HERE TO DO SEDTOR 0. BFUP BNE BFERDK ; ERROR BFUP BR ENDBF ; ALL DONE. BFUP .PAGE D(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 MOVB (SP)+,@#PSR ; RESET PRIORITY LOCKOUT JMP RESTOR ; NO-EXIT FROM INTERRUPT ; DIHA57 = . MOVB (SP)+,@#PSR ; RESET PRIORITY LOCKOUT CLRB TMCRSW(R5) ; RESET TIMER SWITCH  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: *BFUP ; R5 = ADDRESS O 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 DIHA61 JMP DIOD25 ; NO-EXIT AS SPECIFIED DIHA61: MOVB (SP)+,@#PSR ; RESET LOCKOUT JMP DIOD20 ; EXIT NORMALLY ; DIHA62: MOVB (SP)+,@#PSR F 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 *BFUP ; R2 = ADDRESS OF LAST CELL IN LAST EXAMED BUFFER (ZBUF OR; RESET LOCKOUT BR DIHB20 ; PROCESS HIGHEST REQUEST IN QUEUE ; .IFNZ DRESDI ; ; FIND FILES REQUESTED DIRECTORY FROM DIRECTORY BUFFER ; USING CALCULATED INDEX WHICH WAS SAVED IN ERRTSK ; R1 = ADDRESS OF I/O LIST ; R4 = ADDRESS OF I/O DATA BUFFER ; R5 = DCUWX ; DIHB00 = . BICB #100,INOUT(R4) ; RESET SWITCH MOVB ERRTSK(R1),R2 ; GET INDEX INTO FILE BUFFER BIC #177700 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 ; *BFUP ; SUBROUTINES USED: DISKBF ,R2 ; ISOLATE .IFZ $1145 MOV R2,R0 ASL R0 ; PERFORM ASL R0 ; MULTIPLICATION ADD R0,R2 ; BY 5 ADD R2,R2 ; NOW DOUBLE FOR WORD ADDRESSING .ENDC .IFNZ $1145 MOV R2,R3 MUL #10.,R3 ; MULTIPLY BY 10 FOR TRUE INDEX MOV R3,R2 .ENDC ADD DFDBAD(R5),R2 ; ADDRESS OF REQUESTS DIRECTORY  *BFUP ; *BFUP ; ALL UNUSED REGISTERS ARE PRESERVED. *BFUP ; *BFUP ;***********************************************************************BFUP GETELT =. ; ENTRY POINT BFUP MOV #ZBUF+FID+FFLAG2+2-FID,R0 ; PUT ADDRESS OF ENTRY 1,  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 ; 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. DOES SECOND TRIAD? BFUP BNE GETA30 ;  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 .IFNZ $KT11C MOV $KPAR5,-(SP) ; SAVE MOV $KPAR6,-(SP) ; THIS TOO .ENDC MOV 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 RTS PC ; YES - ALL DONE RETURN TO USER. BFUP R1,-(SP) ; LIST ADDRESS MOV SYSTEM(R1),-(SP); TASK NO. JSR PC,IOCOMX ; EXECUTE USER I/O SUB FOR FIRST TIME .IFNZ $KT11C MOV (SP)+,$KPAR6 MOV (SP)+,$KPAR5 .ENDC JSR R5,POPR ; RESTORE REGISTERS BR DIHB10 ; NO WRITE NOW DIHB40 = . MOV #7,R0 ; ERROR TYPE 7 BR DIHD00 ; REPORT .PAGE ; ; ERROR OCCURRED DURING D 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 ABUF BFUP MOV #ABFEND,R2 ; SET R2ISC 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) ; CHECK DCS FOR RETRIABLE ERROR BNE DIHC10 ; MASK HITS - RETRY BIT #RETDAE,@DAE(R5) ; CHECK DAE FOR RETRIABLE ERROR BEQ DIHC20 ; MAS = 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 #ABUF,DSKADD ; SET BUFFER ADDRESS FOR TRANSFER BFUP KS 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 ; ISOLATE BIC #177774,R2 ; I/O FUNCTION DEC R2 ; PRIME FOR START I/O MOVB PRIME(R2),R2 ; SET IT FOR DIOC// JMP DI MOV #ABUF,DSKVAD ; SET V. ADD. 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 OC10 ; 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, 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 # BRANCH 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 ; $@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 PROMISED 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 ' ROS FILE 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 ; ( 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 ; MAKE UNIT NUMBER DIHD10 = . ; R5 = UNIT NUMBER JSR PC,ERR ; REPORT ERROR TSTB CALLED(R5) ; CALLED BY INTERRUPT? BNE+ *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 , 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 DISC XFER ; OCCURS. ; R1=ADDRESS OF TIMER MODULE THAT TIMED-OUT ; TIMOUT = . MOV R1,R2 ; SAVE ADDRESS MOV TIMDEV(R1),R0 ; GET DISC DEV/ZSEC ; 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 MOV R0,DSKVAD ; SET V. ADD. 0ICE 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 .IFNZ $KT11C MOV CRQDPT(R5),R4 ; DATA BUFFER SVA MOV CRPAR5(R5),$KPAR5 ; FOR LIST SVA MOV CDPAR6(R5),$KPAR6 ; FOR BUFFER SVA .ENDC .IFZ $KT11C 3 BFUP JSR PC,DISKBF ; READ IN SECTOR 0 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/ 4 MOV DATA(R1),R4 ; GET CURRENT I/O DATA BUFFER .ENDC 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 NO7 ; FIRST WORD OF FLAG BFUP BNE FLCK30 ; 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 8T YET ESTABLISHED ; TOTA10 = . MOV #ERR012,R0 ; REPORT ERROR TYPE 12 BR DIHC25 .PAGE ; ; ; ; ERR IS AN INTERNAL SUBROUTINE TO DISCIO THAT WILL ; SET AN ERROR CLASSIFICATION IN ERROR. ; THE CALL IS: ; JSR PC,ERROR ; WHERE R0 = ERROR TYPE ; R1 = I/O LIST ADDRESS ; ERR = . MOV R0,ERROR(R1) ; SET I/O NOT SUCESSFUL RTS ND.E CSISNDZ FN.IR FOH TCMA; C ND.E ;; PC S RT L FUSSCESUT NOO I/T SE; 1)(RORRR,ER0 V MO . ; BFUP FLCK30: MOV #1,R0 ; SET R0 AND STATUS BITS - NOT BFUP 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 PC ; ; .ENDC ; MATCH FOR .IFNZ NDISCS .END = R ER ;S ESDRADT IS L/O I =R1 ; PETYR ROER= 0 RREHE W ;R ROERC, P SR J ;: ISL AL CHE T ; R.ROERN IONTICAFISIASCLR ROERN AET S ; LLWIT HA TIOSCDIO TNETIOUBRSUL NAERNT IANS IRR E ;; ;; GEPA . 5 C2IH D R B 2 1PETYR ROERT OREP R ; 0 ,R12R0ER # OV M . = 10TATO ;D HEISBLTAEST YET NOY EROVEC R ;O I/C IS DOPSTR-ROERT OUE-IM TRTPORE ; ;5 C1IH D ? BFUP ;***********************************************************************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 UPBF ; ND.E UPBF . ERLLCAO TRNTURE; PC S RT UPBFBYR PEUPO NT ITSBIS TUTA S/O TSKDIT SE; 5)(R,1RRKEDS SBBI UPBF . T)AS LAT (IOSCDIO DGO *BFUP ; *BFUP ; THE LINKAGE IS 'JSR PC,DISKBF'. *BFUP ; *BFUP ;***********************************************************************BFUP DISKBF =. ; ENTRY POINT BFUP MOV #DSKLST,-(SP) ; PUSH DISK I/O LIST ADDRESS BFUP JSR PC,DISCIO ;