ASMB,R * * NAME: RTIOL * SOURCE: 92070-18092 * RELOC: 92070-16092 * PGMR: C.H.W. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * **************************************************************** * * NAM RTIOL,0 92070-16092 REV.1941 800324 * * * * ENT $ABRQ,$BLIM,$CIC,$DIOC,$DMPR,$DVLU ENT $DV1,$DV2,$DV3,$DV4,$DV5,$DV6 ENT $DV7,$DV8,$DV9,$DV10,$DV11,$DV12 ENT $DV13,$DV14,$DV15,$DV16,$DV17,$DV18 ENT $DV19,$DV20,$DV21,$DV22,$DVTP ENT $IF1,$IF2,$IF3,$IF4,$IF5,$IF6 ENT $IF7,$IFTX ENT $INIO,$IOCL,$IOCX,$IODN,$IOFL,$IORQ,$IOTI ENT $IOTO,$IOUP,$IRT,$MPTF,$PBZY,$PDON ENT $POWF,$PRTY,$Q.PV,$Q.TO,$RTSM,$RUN# ENT $TBG,$TBG#,$UNLK,$UPIO,$XSIO * EXT $CVT1,$SYMG,$ERAB,$IDSQ,$IDNO EXT $ERMG,$TYPE,$PIMK EXT $RQRT,$RQCT,$RQP1,$RQP2,$RQP3 EXT $RQP4,$RQP5,$RQP6,$RQP7,$RQP8,$RQP9 EXT $ROM,$TMP1,$TMP2,$TMP3,$TMP4,$TMP5 EXT $PRIO,$XQT,$SUSP,$IDSZ,$IDA EXT $A,$B,$EO EXT $XEQ,$LIST,$ALC,.MVW EXT $CLCK,$RTN,$SCHD EXT $C.CL,$I.CL,$F.CL EXT $LUTA START OF LU TABLE EXT $LUT# # OF DEFINED LU'S EXT $DVTA START OF DVT'S EXT $DVT# # OF DVT'S EXT $IFTA START OF IFT'S EXT $IFT# # OF IFT'S EXT $INTA START OF INTERRUPT TABLE EXT $INT# # OF ENTRIES SKP * <$CIC> PERFORMS THE FOLLOWING: * * 1. DISABLES THE INTERRUPT SYSTEM. * * 2. SAVES ALL REGISTERS PLUS THE INTERRUPT * RETURN POINT IN THE EXECUTING * ID SEGMENT. * * 3. TRANSFERS DIRECTLY TO THE INTERRUPT * PROCESSOR "$CLCK" ON TBG INTERRUPT. * * FOR OTHER SOURCES, THE INTERRUPT SOURCE * CODE IS USED TO INDEX THE INTERRUPT TABLE. * THE CONTENTS OF THE INTBL ENTRY DETERMINES * THE MANNER IN INITIATING THE PROCESSOR: * * A. +, THE CONTENTS OF THE ENTRY IS * ASSUMED TO BE THE FWA OF AN IFT ENTRY. * THE ADDRESSES OF THE ENTRY * ARE SET IN <$IF1 - $IFN> AND CONTROL * IS TRANSFERRED DIRECTLY TO THE * PHYSICAL DRIVER (PHYSICAL RESUME). * * B. -, THE VALUE IS SET POSITIVE AND IS * SET IN A CALL TO <$LIST> IN THE * SCHEDULING MODULE- THE CALL IS MADE IF * THE USER PROGRAM IS DORMANT- CONTROL IS * TRANSFERRED TO $XEQ. IF THE PROGRAM IS * NOT DORMANT, IT IS NOT SCHEDULED AND THE * DIAGNOSTIC "SC03 INT XXXXX" IS OUTPUT * TO THE SYSTEM TTY- XXXXX IS THE PROGRAM * NAME. CONTROL IS RETURNED TO THE INTER- * RUPTED SEQUENCE. * * C. 0, ILLEGAL OR UNDEFINED INTERRUPTS ARE * NOT PROCESSED BUT THE DIAGNOSTIC * "ILL INT XX" IS OUTPUT TO THE SYSTEM * TTY. XX IS THE INTERRUPT CODE. * * 4. RESTORING INTERRUPT CONDITIONS AND RETURN * TO POINT OF INTERRUPTION. AN ENTRY POINT * CALLED '$IRT' IS PROVIDED FOR USE BY * OTHER MODULES OF THE R/T EXEC TO RESET * FLAGS, RESTORE REGISTERS, & RETURN TO THE * USER PROGRAM. * * THE CALLING SEQUENCE IS JUST: * * - JMP $IRT - * * $IRT PERFORMS THE FOLLOWING: * 1 - DISABLES THE INTERRUPT SYSTEM * 2 - IF PRIVILEGED DONE QUEUE HAS A REQUEST, REENABLES * INTERRUPTS & REENTERS PHY DRIVER OR DOES PHY DONE. * 3 - IF ANY TBG TICKS OCCURRED WHILE IN SYSTEM, RESTORES * INTERRUPTS & JUMPS TO $CLCK. * 4 - ELSE RESTORES THE REGISTERS AND * 5 - EXECUTES THE CURRENT PROGRAM AT $SUSP. * * SKP $CIC NOP * CLC 4 DISABLE INTERRUPT SYSTEM * * PRESERVE CURRENT STATUS OF MACHINE * DST $A,I SAVE A&B * LIB 4 GET INTERRUPT CODE ISZ $MPTF LDA $PIMK OTA 0 SET INTERRUPT MASK STC 4 ALLOW PRIVILEGED INTERRUPTS NOW! * ERA,ALS SOC INA STA $EO,I SAVE E&O LDA $CIC SAVE P-REGISTER A POSSIBLE STA $SUSP,I POINT OF SUSPENSION. CPB .6 IF TIME BASE GENERATOR, JMP $CLCK GO TO TIME PROCESSOR * STB CHAN SAVE INTERRUPT CODE ADB $INTA INDEX TO PROPER ENTRY * * GET PROCESSOR IDENT FROM INTERRUPT TABLE * LDB 1,I CODE. GET CONTENTS OF ENTRY SZB,RSS INTERRUPT ALLOWED? JMP CIC.4 NO, UNDEFINED INTERRUPT * SSB,RSS DO "PHYSICAL RESUME" IF JMP PR.00 VALUE IS POSITIVE. * ** INTERRUPT PROCESSOR IS USER ROUTINE TO BE ** SCHEDULED FOR PRIORITY EXECUTION * JSB DOCLF CLEAR FLAG CMB,INB SET POSITIVE TO GET ID SEG ADDR STB 0 LEAVE ID SEG ADDR IN B REG FOR <$LIST> * ADA .15 CHECK STATUS OF PROGRAM. LDA 0,I IF STATUS IS ZERO (DORMANT), AND B77 SZA SCHEDULE PROGRAM, OTHERWISE JMP $PBZY ISSUE DIAGNOSTIC. * JSB $LIST CALL SCHEDULER TO LINK PROGRAM OCT 60 INTO SCHEDULE LIST. JMP $XEQ * .15 DEC 15 SPC 2 * * TBG INTERRUPT PROCESSOR - TBG RUNS PRIVILEGED $TBG NOP CLC 4 TURN OFF ALL INTERRUPTS STA SAVA **BELOW MAY BE MODIFIED BY ROUTINES WISHING PRIVILEGED SERVICE **EVERY 10 MILLISECS $TBG# CLF 6 CLEAR TBG FLAG LDA $MPTF GET STATE OF MEMORY PROTECT SZA,RSS IS IT ENABLED? JMP $TBG2 YES, WE CAN ENTER $CIC DIRECTLY ISZ TICK NO, DON'T ENTER SYSTEM, BUT * POSSIBLE "NOP" HERE IF ROLL-OVER IS POSSIBLE LDA SAVA INCREMENT TICK COUNTER & GET OUT STC 4 JMP $TBG,I RETURN TO POINT OF INTERRUPTION * $TBG2 LDA $TBG PASS INTERRUPT RETURN POINT STA $CIC TO $CIC LDA SAVA JMP $CIC+2 ENTER $CIC NOW! SAVA NOP SPC 2 * PARITY INTERRUPT HAS OCCURRED $PRTY NOP LIB 5 GET VIOLATION ADDR HLT 5 & HALT JMP *-1 * HERE FROM DRIVER ON A DMA PARITY $DMPR NOP LIA 2 IOR HLT0 STA HLTDP STORE CONFIG'D HALT LIA 20B SELF-CONFIG ADDR LIB 22B DMA ADDR ADA M1 ADB M1 HLTDP NOP HALT JMP *-1 HLT0 HLT 0 * * DOCLF NOP LDA CHAN SELECT CODE OTA 2,C SET ENABLE GLOBAL REG CLC 21B SUSPEND DMA CLC 23B,C TURNOFF DMA CLC 30B,C CLEAR CARD JMP DOCLF,I SKP SPC 3 * * * ILLEGAL OR UNDEFINED INTERRUPT * CIC.4 JSB DOCLF CLEAR THE FLAG LDB ASCSC ="SC" LDA CHAN GET THE INTERRUPT CODE. CLE JSB ILLIN GIVE ILLEGAL INTERRUPT MSG JMP IOCX * * ISSUE DIAGNOSTIC FOR BEING UNABLE TO * SCHEDULE USER PROGRAM ON INTERRUPT. * * B REG HAS ID SEG ADDR ON ENTRY $PBZY ADB .12 SET (B) TO ADDRESS OF NAME IN LDA 1,I PROGRAM ID SEGMENT. STA CICM2+4 STORE INB PROGRAM DLD 1,I NAME IN DST CICM2+5 DIAGNOSTIC AND PRINT JSB $SYMG "INT-XXXXX BUSY" DEF CICM2 JMP IOCX SKP * * RESET INTERRUPT CONDITIONS - RETURN TO SEQUENCE * * * ROUTINE: '$IRT' * * THIS ROUTINE RETURNS TO THE CURRENT USER PROGRAM. * IT RESTORES THE PROGRAMS REGISTERS AND THE INTERRUPT * AND MEMORY PROTECT SYSTEM. * * CALLING SEQUENCE: * * SET UP $XQT AREA ON THE BASE PAGE FOR THE PROGRAM * * JMP $IRT * $IRT EQU * CLC 4 PROTECT AGAINST A TICK HERE LDB $Q.PV HEAD OF COMPLETED PRIV IFTS SZB ANYTHING QUEUED? JMP PVSET YES, DO A PHYSICAL DONE LDA TICK COUNT OF TICKS WHILE M.P. WAS OFF SZA ANY? JMP TICKD YES, TICKED WHILE IN SYSTEM LDB $SUSP,I (A) = 0 AT THIS POINT STB CHAN (B) = RETURN ADDR. SAVE IT SPC 1 LDB $EO,I RESTORE E & O CLO SLB,ELB STO STA $MPTF CLEAR MEMORY PROTECT FLAG OTA 0 ENABLE EVERYBODY * DLD $A,I RESTORE THE A AND B REGS STC 4 TURN ON THE INTERRUPT SYSTEM STC 7 AND MEMORY PROTECT JMP CHAN,I RETURN * TICKD ADA M1 DECREMENT TICK COUNT STA TICK STC 4 JMP $CLCK TICK NOP * * UNLINK FROM COMPLETED PRIVILEGED QUEUE PVSET LDA 1,I GET LINK TO NEXT OR ZERO STA $Q.PV UPDATE HEAD PTR ADB M7 POINT TO 1ST WD OF IFT * * PRIVILEGED DRIVERS CAN ENTER HERE DIRECTLY IF $MPTF WAS ZERO * B REG MUST HAVE ADDR OF IFT EXTENSION WORD 1 (IFTX) * NOTE THAT "T" BIT IN IFT IS NOT CHECKED HENCE PRIVILEGED * DRIVERS CAN NOT LEAVE THEMSELVES IN THE TIME LIST AT PHY.DONE. $PDON STC 4 INTERRUPT SYSTEM ON JSB OFTO REMOVE IFT FROM T.O. LIST JSB @IFT SET-UP IFT POINTERS LDA $IF7,I GET SYS.FLAGS SSA,RSS REQUEST TO REENTER PHY. DVR.? JMP PD.00 NO, DO PHY. DONE NOW LDB .2 YES, GO TO PHY DVR, USING JMP PR.04 IF6 TO SET GLOBAL REG $Q.PV NOP PRIVILEGED DONE QUEUE M7 DEC -7 $MPTF DEC 1 * IMSG OCT 40001 XSIO QUEUE DEC -14 ASC 7,**ILL INT-XXXX * CICM2 OCT 1 DEC -14 ASC 7,INT-XXXXX BUSY * ASCSC ASC 1,SC * * THIS ROUTINE PRINTS THE ILLEGAL INTERRUPT MESSAGE ILLIN NOP STB IMSG+7 "SC" OR "LU" JSB $CVT1 CONVERT TO ASCII STA IMSG+8 STORE IN MSG JSB $SYMG PRINT MSG DEF IMSG JMP ILLIN,I SKP * * THIS IS THE I/O REQUEST INITIATION SECTION OF RTIOL. * IT IS ENTERED ON AN EXEC 1,2,3,17,18,19,& 20. IF REQUEST * IS BUFFERED OR CLASS, THE I/O CONTROL BLOCK RESIDES IN * SYSTEM AVAILABLE MEMORY. THE ID SEGMENT IS THE I/O CONTROL * BLOCK ON NORMAL REQUESTS. THE I/O CONTROL BLOCK IS ADDED * TO THE DVT INITIATION QUEUE (DVT2) IN EITHER A PRIORITY OR * FIFO SEQUENCE AS SPECIFIED IN THE DVT. * * * I/O REQUEST INITIATION $IORQ EQU * CLA CLEAR: STA DISCF DISC I/O OP.FLAG STA B1LNG I/O BUFR LNG STA B2LNG OP.BUFR LNG CPA $RQCT INSURE >0 PARMS JMP $ER01 -NO, ERR: "IO01" * * LU VALIDITY CHECK * LDA $RQP2,I *VALIDATE LU AND B77 EXTRACT LU STA $B,I SAVE LU IN PGM'S B REG CMA,INA,SZA,RSS LU=0? JMP L.BKT YES, USE BIT BUCKET ADA $LUT# CMA,SSA,RSS LU <= LUMAX? JMP $ER02 -NO, ERR: "IO02" ADA $LUT# RECOVER LU-1 ADA $LUTA & LDB 0,I GET DVT ASGNMNT SZB,RSS IF 0 THEN USE L.BKT LDB $D$DV BIT BUCKET JSB @DVT SET DVT ADDRS * * REQUEST CODE ANALYSIS * LDA $RQP1 GET REQUEST CODE AND B17 & KEEP LOW PART STA RQPX CPA .13 IF STATUS REQ, JMP L.15 GO PROCESS * LDA $DV6,I *CHECK DEVICE AVAILABILITY RAL LDB B54 DOWN DEVICE LIST STATE SSA IF DEVICE DOWN, (AV=1)? JMP L.SUS SUSPEND PROG SKP * * REQUEST CHECK FOR REQUIRED PARMS * LDB RQPX AND B70K CHECK DEVICE TYPE CPA B30K FOR DISC (30-37) & JMP L.018 DO SPECIAL HANDLING CPB .3 CONTROL? JMP L.01A YES LDA $RQP2,I GET CONWD IOR DSKCK INA,SZA,RSS SUPPOSED TO BE A DISC REQ? JMP $ER01 YES, ERROR * L.011 ADB RQPTB *GET REQUIRED PARMS LDA 1,I (INDEXED BY REQ.CODE) L.012 LDB $RQP2,I GET 4-BIT QUANT. @ TAB.ENT BLF,SLB,ERB IF Z=1, (BIT 12 OF CONWD) ALF POSITION WITHIN HI/LO BYTE LDB RQPX CPB $RQP1 IF NORMAL REQ. ALF,ALF POSITION TO LO BYTE AND B17 EXTRACT REQUIREMENT CMA,SEZ,INA JMP L.016 IF Z=1, SET OPT.BUFR.LNG L.013 ADA $RQCT SSA REQUIRED # PARMS PROVIDED? JMP $ER01 -NO, ERR: "IO01" * CPB .3 *INPUT BUFR VALIDITY CHK JMP L.02 IF CNTRL REQ, SKIP BUFR CHK LDA $RQP4,I GET BUFR LNG & CLE,SSA,RSS INSURE WE HAVE JMP L.014 WORD COUNT ARS TRANSLATE -CHARS CMA,INA TO +WORDS L.014 STA B1LNG POST FOR LATER USE CPB $RQP1 IF CLASS REQ, CPB .2 OR WRITE REQ, JMP L.02 SKIP BUFR CHK ADA $RQP3 INSURE AREA RESIDES CMA,CLE,SSA,INA,RSS JMP $ER04 WITHIN ADA $ROM AVAILABLE SEZ MEMORY JMP L.02 OK * $ER04 LDB .4 IO04 JMP EREX * L.016 LDB $RQP6,I *IF 2-BUFR REQ SSB,RSS CHECK 2ND BUFR LNG JMP L.017 BRS TRANSLATE -CHARS CMB,INB TO +WORDS & L.017 STB B2LNG POST FOR LATER LDB RQPX JMP L.013 * L.018 ISZ DISCF *FLAG DISC OPS. CPB .3 CONTROL? JMP L.019 YES LDA $RQP2,I SSA BYPASS DEVICE DRIVER? JMP L.019 YES, IGNORE BELOW CHECK IOR DSKCK INA,SZA CON BITS SET FOR DISC? JMP $ER01 NO, ERROR L.019 CPB $RQP1 CLASS REQUESTS LOSE! RSS JMP $ER02 -ERR: "IO02" CPB .3 CONTROL REQ? CCA,RSS YES, REQUIRE 2 PARMS LDA M5 NO, REQUIRE 6 PARMS JMP L.013 * L.01A CPB $RQP1 CLASS CONTROL? JMP L.011 NO LDA $RQP4 YES, RE-ALIGN LDB $RQP5 OPTIONAL STB $RQP4 PARAMETERS LDB $RQP6 FOR EASE STB $RQP5 OF FUTURE LDB $RQP7 PROCESSING STB $RQP6 STA $RQP7 LDA RQPCN JMP L.012 .13 DEC 13 B17 OCT 17 B30K OCT 30000 DSKCK OCT 170077 B70K OCT 70000 SKP * * * THE FOLLOWING TABLE DEFINES THE REQUIRED * NUMBER OF PARAMETERS-1 FOR EACH I/O REQUEST * AVAILABLE. THE TABLE IS INDEXED BY REQUEST * CODE TO OBTAIN AN ENTRY. FORMAT OF THIS * ENTRY IS AS FOLLOWS: * *********************************** * * 15-12 * 11-8 * 7-4 * 3-0 * * *********************************** * * CLASS * NORMAL * NORMAL * CLASS * * * Z=1 * Z=0 * Z=1 * Z=0 * * *********************************** * RQPTB DEF * DO NOT REARRANGED! OCT 61526 READ : 6,3,5,6 OCT 61526 WRITE: 6,3,5,6 RQPCN OCT 60523 CNTRL: 6,1,5,3 OCT 60006 W/R : 6,-,-,6 SKP * * CHECK LU LOCK CONDITION * L.02 LDA $DV7,I EXTRACT LU LOCK FLAG AND B3770 LDB $PRIO,I ID SEG PRIORITY STB T1 SET LINKING PRIORITY SZA,RSS LOCKED? JMP L.03 NO, SKIP LOCK CHK * STA T3 SAVE RN FOR LOCK PASSING TEST LDB C100K SET 77777 AS LINK PRIORITY STB T1 (TO INSURE PRIOR REQUESTS FINISH) LDB $XQT JSB $IDNO GET ID SEG NO BLF,RBR CPB T3 JMP L.025 LOCKED TO CALLING PGM LDA T3 RRR 3 ADA M1 MPY $IDSZ ADA $IDA A= ID SEG ADDR OF LOCKER ADA .28 LDA 0,I AND .1700 ISOLATE SEQ NO IOR T3 SWP CPB $RQP9,I JMP L.025 KEYWORD MATCHES LDB B50 LOCKED DEVICE SUSPEND LIST JMP L.SUS SUSPEND CALLER * B3770 OCT 3770 .1700 OCT 170000 * L.025 CLB,INB BUFFERING PRIORITY= 1 SKP * BUILD I/O CONTROL WORD, LESS TY FIELD * * FORMAT: * ************************************** * * 15-14 * 13 * 12 * 11-6 * 5-3 * 2 * 1-0 * * ****************************************** * * TY * E * Z * SF * 0 * D * RQ * * ****************************************** * * WHERE: * TY=REQ.TYPE: 0=NORMAL,1=BUFR'D,2=SYSTEM,3=CLASS * E =FLAG IF CALLER WANTS TO HANDLE ALL ERRORS (ALWAYS FLUSH) * Z =OPTIONAL BUFR INDICATOR * 0=PARM3/4=INTG.VARIABLES * 1=PARM3/4=BUFR ADDR/LNG * SF=SUB-FUNCTION, (6-BIT FIELD) * D =DON'T CALL LOGICAL DRIVER * RQ=REQUEST CODE: 1=READ,2=WRITE,3=CONTROL * L.03 STB T2 SET BUFFERING PRIORITY LDB RQPX *CONSTRUCT I/O CNTRL WORD: CPB .4 -BIT(1-0)=I/O REQ CODE CLB,INB CHANGE CLASS W/R TO READ LDA $RQP2,I SSA DON'T CALL LOGICAL DRIVER? ADB .4 YES, MOVE TO CONWD BIT 2 AND B377C -BIT(12)=Z-BIT & BIT(13)=E-BIT IOR 1 -BITS(11-6)=SUB-FUN. STA T3 =(WORD2 OF I/O CONTROL BLOCK) * * CLASS ALLOCATION/INITATION * LDB RQPX CPB $RQP1 CLASS I/O JMP L.05 NO, SKIP THIS CONCERN LDB T2 PRIORITY JSB $I.CL INITIATE CLASS JMP L.054 -PENDING COUNT AT MAX JMP L.134 -BUFFER RETHREAD, SET TO GO STB T5 OK, (B)=CLASS TAB.ENTRY PTR CLB,INB JMP L.052 * CKTYP NOP LDA RQPX CPA $RQP1 IS THIS CLASS I/O? JMP CKTYP,I NO, OK TO SUSPEND LDA $RQP7,I GET CLASS WORD SSA,RSS NO WAIT? JMP CKTYP,I NO, SUSPEND OK LDA M2 ($A)=-2:SAM FULL/BUFR LIM'D STA $A,I L.RTN LDA $RQRT SET RETURN ADDR STA $SUSP,I @ ID SEG JMP $XEQ & RETURN TO DISPATCHER SKP * * AUTOMATIC BUFFERING SECTION * FOUR THINGS PREVENT A NORMAL REQUEST FROM BEING BUFFERED * 1. THE DVT BUFFERING FLAG IS NOT SET * 2. THE "NO BUFFER" BIT ON THE USER'S REQUEST IS SET * 3. THE DEVICE IS A DISC (TYPE=30-37) * 4. THE REQUEST IS FOR DYNAMIC STATUS * L.05 LDA $RQP2,I *CHECK BUFFERING REQUIREMENT RAL,ELA E=1 IIF OVERRIDE BUFFERING SET LDA $DV8,I GET DVT BUFFERING FLAG CMA,SEZ,SSA,RSS DV8(15)=1 & NO OVERRIDE? CPB .1 YES, CHECK IF INPUT JMP L.10 -NO BUFFERING! LDA T3 AND B7703 LDB DISCF DISC REQUESTS SZB,RSS & CPA B603 DYNAMIC STATUS REQ JMP L.10 ARE NEVER BUFFERED! * L.052 ADB .9 *COMPUTE BUFR SIZE REQUIREMENT STB T4 =9 FOR I/O BLOCK, (+1 FOR CLASS) ADB B1LNG +PRIMARY BUFR LNG ADB B2LNG +OPTIONAL BUFR LNG STB L.LNG POST FOR ALLOCATION STB $TMP1,I SAVE BUFR LEN IN CASE OF MEM SUSP * CLB SET TO TEST JSB $BLIM UPPER BUFFER LIMIT JMP L.06 HERE IF NOT ABOVE B.L. LDB $PRIO,I ABOVE LIMIT, SO ADB M41 CHECK PRIORITY AND SSB IF < 41 JMP L.06 THEN IGNORE B.L. * L.054 JSB CKTYP MAKE SURE NOT NO-WAIT CLASS I/O LDB B55 & SUSPEND REQUEST SKP * * GENERAL WAIT LIST SUSPENSIONS, AS FOLLOWS: * DOWN DEVICE - STATE= 54 * LOCKED LU - STATE= 50 * BUFR LIMITED - STATE= 55 * MEM SUSPEND - STATE= 61 * L.SUS STB DISCF SAVE NEW STATE LDA $DV1 A=DVT ADDRESS LDB $XQT B=ID SEG ADDRESS JSB $LIST SUSPEND PGM ON DESIGNATED LIST DISCF NOP JMP $XEQ & RETURN TO DISPATCHER * * ALLOCATE MEMORY FOR BUFR'D/CLASS REQUESTS * L.06A LDA RQPX *NO SAM IN SYSTEM CPA $RQP1 CLASS REQ.ATTEMPTED? JMP L.10 NO, FORCE NON-BUFR'D I/O JMP $ER04 YES, ERR:"IO04" * L.06B JSB CKTYP MAKE SURE NOT N0-WAIT CLASS I/O LDA L.LNG REQUESTED BLOCK LENGTH STA $TMP1,I IS SAVED IN ID SEG LDB B61 MEM SUSPEND LIST STATE JMP L.SUS PUT PGM ON LIST * * L.06 JSB $ALC *ALLOCATE MEM.FROM SAM L.LNG NOP =BLOCK LNG, WORDS JMP L.06A -NEVER ANY FREE MEM JMP L.06B -OUT OF MEM FOR NOW STA T6 ALLOC OK, POST ADDR STB L.LNG & ACTUAL LNG ADB $DV8,I UPDATE BUFFER ACCUM. STB $DV8,I * SKP * * BUILD I/O BLOCK, BUFR'D & CLASS REQUESTS * (CARVED OUT OF SYSTEM AVAILABLE MEMORY) * WORD1: I/O LIST LINKAGE * WORD2: I/O CONTROL WORD * WORD3: REQ.PARM1/PRIME.BUFR.ADDR * WORD4: REQ.PARM2/PRIME.BUFR.LNG(& XLOG) * WORD5: REQ.PARM3/OPT.BUFR.ADDR * WORD6: REQ.PARM4/OPT.BUFR.LNG * WORD7: REQUEST PRIORITY(& CLASS COMP.STATUS) * WORD8: I/O BLOCK LNG * WORD9: IF CLASS, CLASS INFO, IF BUFFERED, ID SEG/RUN # * WORD10:IF CLASS, USER-DEFINED VALUE * WORD10/11 : BUFFERED DATA... * L.07 SWP CCE,INB POINT TO CONWD LDA T4 T4=9 IF BUFRD,10 IF CLASS AND .3 ERA,RAR A=140000B IF CLS, 40000B IF BUFRD IOR T3 INCLUDE "TY" FIELD STA 1,I STORE NEW CONWD INB STB T3 =RUNNING I/O BLOCK ADDR * LDB T6 WORD3=PRIMARY BUFR ADDR ADB T4 @SAM+9, IF BUFR'D R/W STB T4 @SAM+10, IF CLASS R/W LDA RQPX CPA .3 CONTROL? JMP L.076 YES, GET OPT.PARM L.071 STB T3,I LDB B1LNG SZB DO BUFR MOVE FOR CPA .1 NON-ZERO LNG JMP L.072 WRITE REQ.ONLY LDA $RQP3 (A)=SOURCE BUFR,(USER) LDB T4 (B)=DESTINATION BUFR,(SAM+8/10) JSB .MVW MOVE IT! DEF B1LNG =BUFR LNG, WORDS NOP * L.072 ISZ T3 CLA (IN CASE $RQP4=0) LDB $RQP4,I STB T3,I WORD4=R/W BUFR LNG ISZ T3 OR OPT.PARM * LDB $RQP2,I BLF,SLB 2-BUFR REQ(Z BIT=1)? JMP L.078 YES, GET 2ND BUFR ADDR LDB $RQP5,I WORD5=OPT.PARM L.073 STB T3,I (B)=DESTINATION BUFR.ADDR. CPA B2LNG SKIP BUFFER MOVE ON JMP L.074 ZERO LNG REQUEST LDA $RQP5 (A)=SOURCE BUFR,(USER) JSB .MVW MOVE IT NOW DEF B2LNG =OPT.BUFR.LNG NOP * L.074 ISZ T3 CLA,CLE (IN CASE $RQP6=0) LDB $RQP6,I WORD6=OPT.PARM4 OR STB T3,I OPT.BUFR.LNG ISZ T3 LDB T2 WORD7=PRIORITY STB T3,I ISZ T3 LDB L.LNG WORD8=I/O BLOCK LNG STB T3,I ISZ T3 LDB RQPX CPB $RQP1 CLASS OR BUFFERED? JMP L.12 BUFFERED, JUMP CPB .3 TYPE=3? CCE SET E IF CLASS CONTROL LDB $RQP8,I WORD 10=USER PARAMETER LDA $RQP7,I WORD9=CLASS INFO DST * T3 EQU *-1 SEZ,RSS CONTROL? CLA NO, USER'S A = 0 AND MSK13 ISOLATE CLASS # (IF CTL) ISZ T5,I BUMP PENDING COUNT LDB T6 (B)=LINK ITEM ADDR JMP L.133 * L.076 CLA IF CONTROL REQ, LDB $RQP3,I WORD3=OPT.PARM3 JMP L.071 * L.078 LDB T4 IF 2-BUFR REQ, ADB B1LNG WORD5=OPT.BUFR ADDR JMP L.073 WORD5=OPT.PARM5 * MSK13 OCT 17777 SKP * BUILD I/O BLOCK, NORMAL REQUEST * (INFO.MAINTAINED IN ID SEG AREA) * $XQT : I/O LIST LINKAGE * $TMP1 : I/O CONTROL WORD * $TMP1+1: REQ.PARM1/PRIME.BUFR.ADDR. * $TMP1+2: REQ.PARM2/PRIME.BUFR.LNG. * $TMP1+3: REQ.PARM3/OPT.BUFR.ADDR. * $TMP1+4: REQ.PARM4/OPT.BUFR.LNG. * $PRIO : PROGRAM PRIORITY * L.10 LDA T3 POST I/O CONTROL INFO STA $TMP1,I IN ID.SEG. LDB RQPX CLA CPB .3 BRANCH IF CONTROL JMP L.106 LDB $RQP3 =BUFR ADDR L.102 STB $TMP2,I POST @ ID.SEG LDB $RQP4,I GET BUFR LNG/OPT.PARM2 STB $TMP3,I & POST @ ID.SEG LDB $RQP5,I LDA $RQP2,I CHECK Z-BIT FOR ALF,SLA 2-BUFR REQ LDB $RQP5 =OPT.BUFR.ADDR, IF Z ON STB $TMP4,I POST @ ID.SEG. CLA LDB $RQP6,I GET OPT.BUFR LNG/PARM4 STB $TMP5,I & POST @ ID.SEG * LDB $XQT JSB $LIST MOVE PROG TO .2 DEC 2 I/O SUSPENSION LIST LDB $XQT USE I/O BLK ADDR FOR LINKAGE LDA $SUSP,I ($A)=SUSPENSION POINT * L.133 STA $A,I SET USER'S A REG L.134 LDA $RQRT SET RETURN ADDR STA $SUSP,I IN ID.SEG CLE (E)=I/O BLK SELECT LDA T1 (A)=LINK PRIORITY JSB LINK & ADD USER REQUEST DEF $DV2,I TO DVT INIT.Q. SEZ,RSS LONE ITEM IN Q? JMP LI.00 YES, SO START LOGICAL JMP IOCX * L.106 LDB $RQP3,I GET OPT PARM1 JMP L.102 & POST @ ID SEG * L.12 LDB $XQT JSB $RUN# FORM ID SEG#/ RUN # STA T3,I BUF'RD REQ, WORD 9= ID SEG/RUN# LDB T6 JMP L.134 SKP * * STATUS SECTION * L.15 LDB $RQCT INSURE AT LEAST ADB M2 2 PARMS ARE GIVEN SSB JMP $ER01 NO, ERR:"IO01" * LDA $DV6,I RETURN DEVICE STATUS STA $RQP3,I AT 1ST PARM LDA $DV5,I GET IFT ADDR SZA RETURN 0 IF NO IFT ADA .5 POINT TO IFT6 LDA 0,I RETURN INTERFACE STATUS STA $RQP4,I AT 2ND PARM * LDA $RQP2,I CHECK FOR Z-BIT ALF,SLA IN CONWD ?? JMP L.152 * NOTE: IF BIT BUCKET, DVTP DATA IS MEANINGLESS DLD $DVTP,I OFF, RETURN: STA $RQP5,I $DVX @ 3RD PARM STB $RQP6,I $DVX+1 @ 4TH PARM L.151 LDA $DV10,I CURRENT MAX REC SIZE RAL,CLE,ERA STA $B,I RETURN IN B REG JMP L.RTN * L.152 CLA INSURE 5 PARMS LDA $RQP6,I ARE SUPPLIED ADB M3 & SSB,RSS BUFR LNG >=0 ? SSA JMP $ER01 NO, ERR:"IO01" LDB 0 ADB $RQP5 INSURE BUFR EXISTS CMB,CLE,SSB,INB,RSS IN USER'S AREA JMP $ER04 ADB $ROM CMA,SEZ,RSS JMP $ER04 NO, ERR:"IO04" LDB $DVTP OK, SET TO MOVE STB T1 DVTP AREA TO USER * L.153 INA,SZA,RSS JMP L.151 ALL DONE LDB T1,I STB $RQP5,I ISZ T1 ISZ $RQP5 JMP L.153 * SKP $ER01 CLB,INB,RSS $ER02 LDB .2 EREX LDA IO07 ="IO" JMP $ERAB SPC 2 * DATA AREA FOR REQUEST PROCESSING SECTION T1 NOP T2 NOP T4 NOP T5 NOP T6 NOP CHAN NOP RQPX NOP B1LNG NOP B2LNG NOP .1 DEC 1 .9 DEC 9 .12 DEC 12 M3 DEC -3 M5 DEC -5 M41 DEC -41 B50 OCT 50 B61 OCT 61 B77 OCT 77 B603 OCT 603 B7703 OCT 7703 B377C OCT 37700 C100K OCT 77777 IO07 ASC 2,IO07 $D$DV DEF BUCKT DUMMY DVT FOR BIT BUCKET SKP * * $XSIO - HERE FOR SYSTEM REQUESTS * * JSB $XSIO * DEC (BIT14="Q"=1 IF CALL FROM I/O SYS/DVR) * DEF * NOP * OCT * DEF * DEC * DEC * DEC * DEC - COMPLETION LOG ON RTN * (RESERVED FOR DMS FUTURE USAGE) * * $XSIO NOP LDB $XSIO LDA 1,I GET LU WORD RAL XSIO2 ADB .2 SET ADDR OF I/O BLOCK CCE,SSA IS "Q" FLAG SET? JMP XSIOQ YES, JUST QUEUE IT STB T1 CCE,INB LDA 1,I GET I/O CONTROL WORD ELA,CLE,ELA & RAR,RAR SET TY-FIELD=2 STA 1,I ADB .5 COMPUTE ADDR OF STB T2 PRIORITY WORD CCA ADA $XSIO,I EXTRACT LU & INDEX INTO LUT AND B77 ADA $LUTA & LDB 0,I (=DVT ADDR) SZB,RSS LDB $D$DV (FOR BIT BUCKET) JSB @DVT SETUP DVT ADDRS LDB T1 (B)=LINK ITEM LDA $DV6,I GET "AV" RAL DOWN FLAG INTO SIGN BIT CLE,SSA IS DEVICE DOWN? JMP XDOWN YES LDA T2,I GET PRIORITY JSB LINK & ADD REQUEST DEF $DV2,I TO DVT INIT.Q. * XSIO6 LDA $XSIO,I GET LU WORD SSA WAS THIS A "Q" XSIO DE-Q? JMP IX.XS YES ADB .8 POINT TO XSIO CONTINUE ADDR SEZ LONE ITEM IN Q? JMP 1,I NO, TAKE EXIT NOW! SKP * $INIO STB $$RTN SAVE RETURN FROM IOC * * LOGICAL DRIVER INITIATION * * ENTERED FROM #IORQ,$XSIO FOR REQUEST INITIATION * DVT ADDRESSES ARE ASSUMED TO HAVE BEEN SETUP. * LI.00 LDB $DV7,I GET FLAGS BLF,SLB TEST LOGICAL "HOLD" JMP IOCX SET, DONT START THIS REQ. LDB $DV3 NODE LIST LI.02 LDB 1,I GET LINK SSB IS THIS ONE BUSY? JMP IOCX YES, CAN'T START REQ CPB $DV3 ALL IN NODE LIST CHECKED? CLA,CCE,INA,RSS YES, START REQ JMP LI.02 NO ADA $DV2,I MOVE REQUEST PARMS ELA,CLE,ERA (STRIP Q-BIT) LDB $DV15 TO ACTIVE PARMS AREA JSB .MVW AT $DV15-$DV19 DEF .5 NOP LDB $DV1 CPB $D$DV IS THIS "BIT BUCKET" JMP LD.42 YES, GO TO LOG.DONE LDA $DV6,I ALR,ERA SET DVT BUSY RAR,ELA CLEAR BIT 0 (E) STA $DV6,I LDA $DV3,I IOR BIT15 SET NODE BUSY STA $DV3,I CLA,INA (A)=INIT NEW REQ * LI.20 JSB L.DVR CALL LOGICAL DRIVER JMP LW.00 -LOGICAL WAIT. JMP PI.00 -PHYSICAL INIT. JMP LD.00 -LOGICAL DONE. JMP PI.00 NO LOG.DVR, SKIP TO PHY. SPC 5 * ENTER HERE TO QUEUE AN XSIO REQUEST ON Q.SD AND RETURN * IMMEDIATELY TO THE CALLER (PRESUMABLY A DRIVER) XSIOQ ERA,CLE SET BIT15 TO IDENTIFY IT STA $XSIO,I STORE IN LU WORD JSB LINK ADD XSIO REQUEST TO SYS.DONE QUEUE DEF Q.SD ADB .8 POINT TO XSIO CONTINUE ADDR JMP 1,I RETURN IMMEDIATELY TO CALLER SPC 4 * DEVICE IS DOWN ADD XSIO BLOCK TO SYS DONE QUEUE - XLOG = 0 XDOWN CLA STA T2,I RETURN XLOG OF ZERO JSB LINK ADD XSIO BLOCK TO SYS DONE QUEUE DEF Q.SD CCE FORCE RETURN FROM I/O SYS JMP XSIO6 SKP * * LOGICAL WAIT SECTION * * $DV7(15-11)= M0IHT, WHERE: * M=LOCK MAINTENANCE REQUESTED BY LOG.DVR * I=ILL.INTRPT ENTRY REPORTED BY LOG.DVR * H=HOLD ASSERT/MAINTAIN REQ'ED BY LOG.DVR * T=TIMEOUT REQ'ED BY LOG.DVR * LW.00 BLF GET "T" CLE,SSB TIMEOUT REQUESTED? JSB ONTO YES, ALLOW TIME OUT LDA $DV7,I RAL,RAL ILL INTRPT REPORT SSA,RSS REQUESTED? JMP LW.06 NO * LW.05 LDB $DV1 JSB $DVLU GET ASSOCIATED LU LDB ASCLU ="LU" CCE JSB ILLIN GIVE ILLEGAL INTERRUPT MSG LDA $DV7,I RAL,RAL * LW.06 RAR,SLA LOCK MAINTAINANCE REQ? JMP IOCX YES, DON'T DISTURB! LDB $DV5,I JSB @IFT ELSE, SET IFT ADDRS LDB $IF3,I & CHECK FOR LOCK ELB,CLE,ERB CONDITION, THIS DVT LDA $IF6,I RAL,SLA IS IFT BUSY? JMP IOCX YES CPB $DV1 DVT @ IFT Q-HEAD? CCE,SSA,RSS LOCKED? JMP PW.30 NO, PROCEED JSB UNLNK REMOVE DVT FROM DEF $IF3,I IFT INIT Q LDB $IF6,I (RELEASE LOCK) ELB,ELB & RBR,CLE,ERB SET IFT AV=0 STB $IF6,I SZA,RSS IFT Q EMPTY? JMP IOCX YES LDB $IF3,I NO, GET NEW DVT HEAD JSB @DVT SET DVT POINTERS JMP PI.18 INITIATE NEW HEAD * SKP * * LOGICAL RESUME SECTION * * THIS SECTION ALLOWS A PHYSICAL DRIVER TO "INTERRUPT" * LOGICAL DRIVER ACTIVITY. THE APPROPRIATE LOGICAL * DRIVER IS SELECTED FROM THE DVT REFERENCE WORD POSTED * AT $IF5. IF A LOGICAL DRIVER DOES NOT EXIST FOR THIS * DVT, THEN THE PHY.DRIVER REQUEST IS DISMISSED. * LR.00 LDB $IF5,I GET DVT REF.WORD JSB @DVT & SETUP ADDRS LDA .5 (A)=RESUME JSB L.DVR CALL LOGICAL DRIVER JMP LW.00 -LOGICAL WAIT JMP PI.02 -PHYSICAL INIT JMP LD.00 -LOGICAL DONE JMP LW.05 NO LOG.DVR, SO LOSE! *NOTE **WHAT ABOUT CHECKING T AT LR.00** * SKP * * LOGICAL DONE * LD.00 BLF,CLE ENABLE LOG.TIME OUT SSB IF REQUESTED BY JSB ONTO LOGICAL DRIVER LDB $DV5,I SET IFT ADDRS JSB @IFT LDB $DV7,I BLF,ERB MOVE "HOLD" TO E-REG LSR 5 MOVE "AB" TO BIT 0 SLB,RSS ACTIVE ABORT PROCESS? JMP LD.02 NO LDA $DV16,I *I/O ABORT HANDLING AND B77 EXTRACT ERR CODE CPA .1 ILL.REQ.ERR? JMP LD.10 YES * LD.02 LDA $DV3,I RAL,ERA CLEAR NODE BUSY UNLESS HOLD SET STA $DV3,I LDA $DV1,I INA,SZA,RSS DVT LINKAGE CLEAR? JMP LD.08 YES, GO CHECK FOR ERRS * LDA $DV7,I *ABNORMAL COMPLETION AND .3 LDB AQ.DO POINTER TO "DONE QUEUE" CMA,INA,SZA,RSS Q'ED ON $IF? (RS=0)? LDB $IF3 YES, FREE FROM $IF.Q CCE,INA,SZA,RSS Q'ED @IFT-HEAD? (RS=1)? JMP LD.16 YES, FREE IFT & START NXT STB LD.05 LDB $DV1 (B)=ITEM ADDR, (E)=DVT SELECT JSB UNLNK REMOVE DVT FROM LD.05 DEF * INDICATED QUEUE * LD.08 LDA $IF3,I ELA,CLE,ERA LDB $IF6,I SZA IFT QUEUE EMPTY? RBL,SLB,ELB NO, IFT BUSY? JMP LD.30 YES, JUMP LDA $IF7,I SEZ,RSS LOCKED? ALF,SLA NO, IS HOLD SET? JMP LD.30 YES * PHYSICAL HOLD IS RELEASED, PUT DVT ON DONE QUEUE AND * START REQUEST AT HEAD OF IFT QUEUE LDB $DV1 JSB LINK LINK ONTO DONE QUEUE DEF Q.DO LDA $DV7,I IOR .3 SET RS=3 STA $DV7,I LDB $IF3,I JSB @DVT SET-UP DVT POINTERS AND JMP PI.22 DO PHYSICAL INITIATE * * ILLEGAL REQUEST FROM LOG DVR ON ABORT ENTRY LD.10 CLB LDA $DV15,I IOR .4 SET FLAG TO NOT CALL LOG DVR STA $DV15,I JMP PR.04 CALL PHYSICAL DRIVER * * LOGICAL DONE WHILE REQUEST IS ACTIVE AT IFT LD.16 LDA $IF6,I *RELEASE IFT BUSY/LOCK ALR,ARS SET IFT FREE, AV=0 STA $IF6,I LDB $DV1 (B)=ITEM ADDR, (E)=1 JSB UNLNK REMOVE DVT FROM DEF $IF3,I IFT INIT QUEUE LDB .3 RS=3 CCE,SZA QUEUE NOW EMPTY? JMP PD.21 NO, GO START NEXT AT IFT * LD.30 LDB $DV6,I *NORMAL COMPLETION STB LD.05 (TEMP SAVE-AV FIELD) ELB,CLE,ERB CLEAR SIGN LDA $DV16,I *CHECK ERROR HANDLING AND B77 CCE,SZA ERRS REPORTED BY DVR? RBR,ELB YES, SET "E-BIT" STB $DV6,I SZA,RSS ERRS? JMP LD.37 NO, SO SKIP IT CLB CPA .1 ILLEGAL REQUEST? STB $DV17,I YES, FORCE XLOG=0 STA MSG1+4 (TEMP SAVE-ERR CODE) LDA $DV16,I GET ERROR CODE WITH "FLUSH" FLAG RAL MOVE FLAG TO BIT15 LDB BLNKS ASCII BLANK SSA FLUSHING? LDB MSG.F YES, GET AN "F" LDA $DV2,I GET I/O BLOCK ADDR ELA,CLE,ERA CLEAR SIGN INA LDA 0,I GET CONWD RAL,RAL PUT "U"-BIT IN BIT15 CCE,SSA,RSS CALLER PROCESSING ERRORS? JMP LD.32 NO, OBEY THE DOWN/FLUSH FLAGS RAR,SLA TEST FOR XSIO REQUEST SSA (SY=10 BINARY) JMP LD.37 NOT AN XSIO REQ, SO FLUSH, DONT DOWN LDB MSG.F ITS AN XSIO WITH "UE", FORCE FLUSH LD.32 STB MSG1+9 SAVE FLUSH INDICATOR IN MSG LDB $DV1 JSB $DVLU GET LU LDB $DV16,I CPA .1 DON'T DOWN RBL,ERB SYSTEM CONSOLE! STB $DV16,I STA MSG1+7 (TEMP SAVE-LU) LDA MSG1+9 =",F" OR BLANKS RAR,ERA SET E IF FLUSHING SSB,RSS DON'T DOWN BIT SET? JSB $IODN NO, SO DOWN THE DEVICE LDA MSG1+4 *GIVE ERR REPORT CPA B77 UNLESS CODE IS 63 JMP LD.36 SO NO MESSAGE LDB 0 RECOVER ERR CODE ADB ERCNT SSB IF CODE DEFINED ADA ERTBA USE ERR MNEMONIC SSB ELSE GIVE ERR LDA 0,I NUMBER PROVIDED CCE,SSB,RSS BY LOG.DRIVER JSB $CVT1 & STA MSG1+4 POST IN MSG LDA MSG1+7 JSB $CVT1 GET LU TO MSG STA MSG1+7 LDB $DV16,I LDA MSG.D RBL,SLB IF DVT HAS BEEN LDA BLNKS SET DOWN, ADD STA MSG1+8 INDICATION TO MSG JSB $SYMG NOTIFY USER DEF MSG1-1 * LD.36 LDA MSG1+9 CPA BLNKS FLUSH THIS REQUEST? JMP LD.80 NO, DON'T DEQUEUE IT * LD.37 LDA LD.05 RECOVER AV-FIELD CLE,SSA,RSS DVT BUSY? JMP LD.80 NO, RELEASE OF HOLD BY DVR * LD.40 LDA $DV17,I CHECK XMISSION LOG SSA POSITIVE? CMA,INA NO, THEN MAKE IT SO LD.41 STA $DV17,I LDB $DV2,I (B)=ITEM, (E)=I/O BLK SEL. ELB,CLE,ERB CLEAR "Q"-BIT STB RQPX SAVE BLOCK ADDR FOR LATER JSB UNLNK REMOVE COMPLETED REQ. DEF $DV2,I FROM DVT INIT Q INB LDA 1,I GET I/O CNTRL WORD RAL,SLA,ELA & CHECK TY-FIELD JMP LD.60 IT'S CLASS OR SYSTEM REQ SEZ TY=0? JMP LD.50 NO, HANDLE BUFFERED REQUEST LDA $DV16,I NORMAL REQ, GET STATUS AND B77 CPA .1 ILLEGAL REQUEST? JMP LD.45 YES * * PROCESS COMPLETION OF NORMAL I/O REQUEST LDA $DV16,I STA 1,I SAVE EXTENDED STATUS INB LDA $DV17,I STA 1,I INB LDA $DV18,I STA 1,I INB LDA $DV19,I STA 1,I ADB .5 LDA $DV6,I GET DVT STATUS STA 1,I TO USER'S A REG INB & LDA $DV17,I TRANSMISSION LOG STA 1,I TO USER'S B REG LDB RQPX ID SEG ADDR JSB $LIST RETURN USER PROGRAM OCT 60 TO SCHEDULE LIST JMP LD.80 * BIT BUCKET LOGICAL DONE LD.42 CLA,CLE STA $DV16,I NO ERRORS JMP LD.40 * REQUEST ERROR ON NORMAL I O REQUEST LD.45 LDB RQPX JSB $LIST PUT PGM IN SCHEDULE LIST OCT 60 LDB RQPX JSB $IDSQ SET ID SEG REFS LDA $A,I STA $SUSP,I RESET POINT OF SUSPENSION LDB $DV1 ADDR OF DVT STB ACDVT SAVE IT DLD IO07 ="IO07" JSB $ERMG GIVE ERROR/ ABORT USER LDB ACDVT GET DVT ADDR AGAIN JSB @DVT RE-SETUP POINTERS JMP LD.80 * LD.50 LDB RQPX *BUFFERED REQ (TY=1) LDA $DV1 PASS DVT ADDR JSB $RTSM RETURN SAM, CHECK FOR BELOW B.L. JMP LD.80 * LD.60 LDB RQPX I/O BLOCK ADDR LDA $DV17,I GET TRANSMISSION LOG SEZ JMP LD.70 GO HANDLE CLASS REQUEST * ADB .6 POINT TO WORD FOR LOG STA 1,I SAVE IT THERE * LDB RQPX *SYSTEM REQUEST (TY=2) JSB LINK SAVE I/O BLOCK DEF Q.SD ON SYSTEM DONE QUEUE JMP LD.80 TRY NEXT REQUEST * * PROCESS CLASS I/O COMPLETION LD.70 JSB $C.CL GO TO CLASS COMPLETION ROUTINE * * FIND ANOTHER REQUEST USING NODE LIST - DO LOGICAL INITIATION * FOR NEXT DVT IN NODE LIST WHICH HAS A REQUEST QUEUED, DOES NOT * HAVE HOLD SET, AND IS FREE. * LD.80 LDA $DV7,I AND M5 CLEAR AB FLAG STA $DV7,I LDB $DV3,I FIND NXT DVT REQUEST LD.81 SSB WAS HOLD LEFT SET? JMP IOCX YES, HOLD OFF ENTIRE NODE LIST CCA ADA 1 CHECK NEXT NODE FOR LDA 0,I PENDING REQUEST ON ELA,CLE,ERA ROUND ROBIN BASIS SZA JMP LD.85 FOUND A REQUEST LD.82 CPB $DV3 JMP IOCX END OF NODE LIST, SO QUIT! LDB 1,I JMP LD.81 * LD.85 ADB .4 LDA 1,I GET $DV7 ADB M1 POINT TO $DV6 ALF,SLA HOLD IN EFFECT ON THIS $DV? JMP LD.87 YES, BYPASS IT LDA 1,I GET $DV6 RAL CMA,CCE,SSA,SLA DVT FREE? JMP *+3 YES, OK TO PROCEED LD.87 ADB M3 MUST SKIP THIS REQUEST JMP LD.82 ADB M5 POINT TO START OF DVT JSB @DVT SET-UP DVT ADDRS JMP LI.00 INITIATE THE REQUEST SKP * ERTBA DEF * ASC 1,RQ ERR 1 ASC 1,NR ERR 2 ASC 1,TO ERR 3 ASC 1,ET ERR 4 ASC 1,TE ERR 5 ASC 1,WP ERR 6 ASC 1,AD ERR 7 ASC 1,SP ERR 8 ASC 1,GP ERR 9 ASC 1,FA ERR 10 ASC 1,DC ERR 11 ERCNT ABS ERTBA-* =-(# ENTRIES+1) * SUP OCT 40001 XSIO QUEUE REQ MSG1 DEC -18 ASC 9,**I/O-XX @LUXX,D,F UNS * ASCLU EQU MSG1+6 BLNKS OCT 20040 MSG.D ASC 1,,D MSG.F ASC 1,,F ACDVT NOP SKP * PHYSICAL DRIVER INITIATION PI.00 LDB $DV5,I FIND IFT & JSB @IFT SETUP ADDRS PI.02 LDA $DV1,I *CHECK DVT REQUEST STATE CCE,INA,SZA,RSS REQUEST STARTED YET? JMP PI.10 NO, THEN START NOW LDA $DV7,I AND .3 CMA,INA,SZA,RSS QUEUED ON $IF? (RS=0)? JMP PW.10 YES CCE,INA,SZA,RSS RUNNING AT $IF? (RS=1)? JMP PI.20 YES, BREAK IN WITH NEW REQ. LDB $DV1 BEFORE PROCEEDING. JSB UNLNK DEF Q.DO DONE QUEUE CCE * PI.10 LDA $DV20,I GET DEVICE PRIORITY AND B77 ISOLATE IT LDB $DV1 POINTER TO THIS DVT JSB LINK ADD LOG.DVR.REQ. DEF $IF3,I TO PHY.INIT.Q LDA $DV7,I & AND C3 SET REQUEST STATE, RS=0 STA $DV7,I (QUEUED ON $IF) SEZ REQ AT Q-HEAD? JMP PW.10 NO, SO WAIT PI.18 ISZ $DV7,I MARK @Q-HEAD, (RS=1) * PI.20 LDA $IF7,I *START REQ.@ $IF ALF,SLA HOLD ASSERTED BY PHY.DVR? JMP IOCX YES, HONOR IT! * PI.22 LDA $DV7,I RAL,CLE,ERA GET LOCK BIT IN E STA $DV7,I CLEAR IT IN DV7 ELA,CLE LDB $IF6,I SET AVAILABILITY RBL,RBL AV=2, BUSY, OR RRR 2 AV=3 BUSY & LOCKED STB $IF6,I RAR MOVE "T" TO BIT 9 CMA IOR $IF7,I "M" OR NOT "T" LSL 6 SSA,RSS IS "T"=1 AND "M"=0? JSB ONTO YES, ALLOW LOGICAL TIME OUT LDA $DV1 STA $IF5,I LDA $DV7,I RAL,RAL ALLOW ABORT REQUEST CLB,INB FROM LOG.TO PHY.DVR. SSA CLB JMP PR.04 GO CALL PHYSICAL DRIVER SKP * * PHYSICAL CONTINUE - AWAIT INTERRUPT * PW.00 LDB $IF7,I GET FLAGS RBL,RBL *CHECK FOR ERROR REPORT SSB,RSS ILL.INTRPT REPORTED? JMP PW.10 NO CLE,RSS * PW.05 JSB DOCLF CLEAR FLAG (NO DVT FOR INTERRUPT) * LDB ASCSC ="SC" LDA $IF6,I (A)=I/O CHAN JSB ILLIN GIVE ILLEGAL INTERRUPT MSG * PW.10 LDA $IF6,I SSA CHECK FOR IFT BUSY JMP IOCX IT IS, SO DONE * * * ENTER HERE WHEN PHYSICAL DRIVER HAS EXITED WHILE IFT * WAS NOT BUSY. CHECK FOR RELEASED HOLD. * PW.30 LDB $IF3,I GET ADDR OF DVT AT HEAD ELB,CLE,ERB CLEAR SIGN SZB,RSS ANYTHING AT HEAD? JMP IOCX NO, NOTHING WAS HELD JSB @DVT SET-UP DVT ADDRESSES RAL A(15)=IFT LOCK FLAG AND $DV7,I AND WITH "MAINTAIN LOCK" FLAG SSA IS IFT LOCK MAINTENANCE IN EFFECT? JMP IOCX YES! WAIT FOR LOG DVR TO INITIATE JMP PI.20 GO START NEXT REQUEST * HI.2 OCT 100002 C3 OCT 177774 SKP * * PHYSICAL RESUME - INTERRUPT SERVICE * PR.00 JSB @IFT SETUP ADDRS CLA,CLE CPA $IF5,I DOES IFT REFERENCE A DVT? JMP PW.05 NO, DON'T GO TO PHY.DVR. LDB HI.2 (B)=CONTINUE PR.04 JSB P.DVR & CALL PHYSICAL DVR JMP LR.00 -LOGICAL RESUME JMP PW.00 -PHYSICAL CONT SKP * * PHYSICAL DRIVER DONE-CONTINUE LOGICAL * * THE PRIORITY OF OPERATIONS IS AS FOLLOWS: * 1) IF IFT LOCKED, CONTINUE LOGICAL DRIVER * 2) IF IFT REQUESTS PENDING, MOVE COMPLETED * LOGICAL REQUEST TO PHYSICAL DONE QUEUE * AND INIT NEXT IFT OPERATION * 3) IF NO PENDING IFT REQUESTS, CONTINUE LOGICAL * PD.00 LDB $IF3,I GET ADDR OF DVT AT IFT HEAD ELB,CLE,ERB STB TMPA1 SAVE IT LDA $IF6,I GET IFT "AV" FIELD ELA,CLE,ERA CLEAR SIGN (BUSY FLAG) LDB $IF5,I GET CURRENT DVT REF CPB TMPA1 DID DVR CHANGE DVT REF? STA $IF6,I NO, STORE $IF6 WITH BUSY CLEAR CLE,SZB,RSS WAS ANY DVT ADDR SPECIFIED? JMP PW.30 NO,CHK RELEASE OF HOLD JSB @DVT SET DVT REFERENCE FROM $IF5 LDB $DV11 JSB OFTO REMOVE ANY LOG.TIME OUT * LDB $IF7,I GET SYSTEM FLAGS LDA $IF6,I GET $IF6 LOCK FLAG RAL,ELA *TEMP SEZ,CCE,SSB,RSS IFT NOT LOCKED & ADVANCE Q? SEZ,SSB,RSS **TEMP JMP PD.20 YES, UNLINK THIS REQUEST * DVT LOCKED TO IFT OR PHY DVR SET "Q"-BIT, DONT UNLINK DVT * PD.12 LDB $IF7,I RBL SSB DID PHYSICAL WANT TO BYPASS LOGICAL? JMP IOCX YES, DONE * PD.15 LDA .2 LOGICAL CONTINUATION JSB L.DVR CALL LOG. DVR. JMP LW.00 -LOGICAL WAIT JMP PI.02 -PHYSICAL INIT JMP LD.00 -LOGICAL DONE JMP LD.00 NO, LOG.DVR, ASSUME DONE SKP * * ENTER HERE TO DEQUEUE THIS DVT FROM IFT AND IF ANOTHER DVT * WAS ON THE IFT'S QUEUE, PUT THIS DVT ON THE DONE QUEUE ("Q.DO") * AND IMMEDIATELY CALL THE PHYSICAL DRIVER FOR THE NEW DVT AT * THE HEAD OF THE IFT INITIATION QUEUE. * PD.20 LDB $DV1 *DO IFT REQ CLEANUP CCE **TEMP JSB UNLNK UNLINK COMPLETED DEF $IF3,I REQ FROM IFT Q LDB $IF6,I B HAS IFT "AV" SZA IFT INITIATION QUEUE EMPTY? SSB NO, IS IFT FREE? JMP PD.12 YES LDA $IF7,I RAL GET SYS FLAGS CCE,SSA PHY DVR WANT TO CALL LOGICAL? JMP PD.22 NO, LEAVE DVT OFF QUEUES LDB .2 RS=2 * PD.21 LDA $DV7,I GET RS FIELD AND C3 IOR 1 UPDATE RS STA $DV7,I LDB $DV1 JSB LINK MOVE DVT TO AQ.DO DEF Q.DO DONE QUEUE * HEAD OF PHYSICAL INITIATION QUEUE WILL NOW BE STARTED PD.22 LDB $IF3,I SET DVT ADDRS JSB @DVT FOR NXT REQ JMP PI.18 & START NOW! SKP * * TIME OUT PROCESSING * $IOTO EQU * CCB 1ST TIME FLAG TO.00 LDA Q.TO TIME OUT QUEUE CLE,SZA,RSS EMPTY?? JMP IX.30 YES, DONE INA STA TMPA1 SAVE ADDR OF CLOCK CLA CPA TMPA1,I IS CLOCK AT HEAD = 0? JMP TO.04 YES, TIME OUT! SZB HAVE WE TICKED YET? ISZ TMPA1,I NO, SO BUMP IT JMP IX.30 & LEAVE * TO.04 LDB TO.AD STB $$RTN RETURN TO "TO.00" FROM IOCX LDB Q.TO JSB UNLNK REMOVE ITEM FROM DEF Q.TO TIME OUT LIST * NOTE FOLLOWING CODE PRESUMES DVT'S PRECEDE IFT'S IN CORE LDA $IFTA ADDRESS OF IFT AREA CMA,CLE,INA ADA 1 IS ITEM ADDR >= CLA,SEZ,RSS START OF IFT'S? JMP TO.20 NO, LOG.TIME OUT! * JSB @IFT *PHYSICAL LEVEL T.O. CPA $IF5,I IS THERE A DVT FOR THIS IFT? JMP IX.20 NO, SO IGNORE THE T.O. LDB .3 JMP PR.04 SET, GIVE TO PHY.DVR * TO.20 ADB M10 *LOGICAL LEVEL T.O. JSB @DVT LDA .3 JMP LI.20 GIVE TO LOG.DVR. * TO.AD DEF TO.00 * M10 DEC -10 * Q.DO OCT 100000 SIGN=FIFO QUEUE Q.SD OCT 100000 SIGN=FIFO QUEUE SPC 3 * * THIS ENTRY PROVIDED FOR DRIVERS TO UP DEVICE * $UPIO JSB $IOUP GO TO UP ROUTINE SKP * * IOCX - EMPTY COMPLETION QUEUES * $IOCX EQU * IOCX LDB Q.DO DONE QUEUE CPB BIT15 QUEUE EMPTY? JMP IX.20 CCE NO,(E)=DVT SELECT JSB UNLNK REMOVE $DV DEF Q.DO FROM Q.DO JSB @DVT SET DVT ADDRESSES LDA $DV7,I GET DVT STATE .8 SLA PHYSICAL OR LOGICAL DONE? JMP LD.30 LOGICAL, GO COMPLETE IT JMP PD.15 PHYSICAL, DO SAME * IX.20 LDA $$RTN CLE,SZA,RSS IS IOC REALLY DONE? JMP IX.30 YES CLB,CCE NO, CONTINUE TIMER, FLUSH, UP, POWER- STB $$RTN FAIL, LA, OR XSIO PROCESSING. JMP 0,I * * ENTER HERE WHEN AN XSIO REQUEST PREVIOUSLY QUEUED ON Q.SD * CAN NOW BE INITIATED IF IT IS AT HEAD OF DVT INIT. QUEUE. IX.XS ELA,CLE,ERA CLEAR BIT 15 OF LU WORD STA $XSIO,I *TEMP SEZ,CLE,RSS IS REQ NOW AT IFT HEAD? SEZ,RSS **TEMP JMP LI.00 YES, INITIATE IT NOW CLE **TEMP * E ALWAYS ZERO WHEN WE GET HERE IX.30 LDB Q.SD SYSTEM DONE CPB BIT15 QUEUE EMPTY? JMP $TYPE YES JSB UNLNK REMOVE I/O BLOCK DEF Q.SD FROM Q.SD ADB M2 COMPUTE ADDR OF BLOCK STB $XSIO LDA 1,I GET LU WORD RAL,CLE,SLA,ERA WAS BIT15 SET? JMP XSIO2 YES, START XSIO REQ NOW INB NO, THIS IS A COMPLETED REQ LDA 1,I COMPLETION ADDRESS CLE,SZA,RSS DEFINED? JMP IX.30 NO, EMPTY Q.SD JMP 0,I YES, GO TO XSIO COMPLETION SKP * $IOFL PERFORMS I/O ABORT PROCESSING. * * IT IS ENTERED WITH THE ABORTING ID SEGMENT ADDRESS IN * THE A REGISTER. $IOFL WILL DEQUEUE AND DEALLOCATE ALL * BUFFERED REQUESTS INITIATED BY THE ABORTING PROGRAM AS * WELL AS ALL CLASS REQUESTS FOR WHICH IT IS THE DESIGNATED * OWNER. IN THE LATTER CASE, THE CLASS NUMBER WILL BE * DEALLOCATED. ALL REQUESTS ACTIVE * AT THE PHYSICAL LEVEL MIGHT NOT BE COMPLETED WHEN $IOFL * IS EXITED. HOWEVER, THE SYSTEM WILL FLUSH THE REQUESTS * AS A MATTER OF COURSE IN THE LOGICAL DONE PROCESSING * SECTION. * $IOFL NOP STA T2 SAVE ABORTING ID SEG ADDR JSB $F.CL FLUSH ALL "OWN"ED & COMPLETED DEC 0 CLASS BUFFERS CLA STA T5 SET IF REQUEST AT IFT HEAD MUST ABORT LDA $DVT# # OF DVT'S CMA,INA STA T4 USE AS RUNNING COUNTER LDB T2 ID SEG ADDR JSB $RUN# COMPUTE ID SEG # / RUN # STA T1 LDA $DVTA ADDR OF 1ST DVT * ENTER HERE FOR EACH LU FL.05 STA T3 GET ASSOCIATED DVT ADDR INA ADDRESS OF $DV2 STA FL.52 * ENTER HERE FOR EACH REQUEST FL.10 LDA 0,I GET ADDRESS OF NEXT REQUEST FL.11 ELA,CLE,ERA CLEAR POSSIBLE SIGN SZA,RSS END OF CHAIN? JMP FL.60 YES STA TMPE2 SAVE REQUEST'S ADDRESS CPA T2 IS THIS THE ID SEGMENT ITSELF? JMP FL.30 YES LDB 0 NO INB POINT TO CONTROL WORD LDB 1,I GET IT RBL,SLB IS THIS A BUFFERED REQUEST? JMP FL.10 SSB,RSS JMP FL.10 NO, TRY NEXT REQUEST LDB 0 ADB .8 9TH WORD OF REQUEST HAS ID SEG/RUN # LDB 1,I OF INITIATING PROGRAM CPB T1 IS IT OURS? RSS YES JMP FL.10 NO, TRY NEXT REQUEST SKP * AT THIS POINT A NORMAL OR BUFFERED REQUEST TO BE FLUSHED * HAS BEEN FOUND. FL.30 XOR FL.52,I ELA,CLE,ERA CLE,SZA IS THIS REQ AT THE DVT HEAD? JMP FL.50 NO, JUST UNLINK / DEALLOCATE IT LDB T3 GET DVT ADDR ADB .5 POINT TO $DV6 LDA 1,I GET IT SSA,RSS IS DVT BUSY? JMP FL.50 NO, FLUSH IT NOW * ISZ T5 FLAG THAT HEAD OF DVT MUST BE LDA TMPE2 ABORTED BY DRIVER CALL JMP FL.10 DO REST OF DVT BEFORE CALLING DVR * * NOW UNLINK THE REQUEST FROM THE $DV FL.50 LDB TMPE2 REQUEST ADDRESS LDA 1,I GET LINK TO NEXT REQUEST STA TMPE2 FOR LATER JSB UNLNK UNLINK REQUEST FROM LOG. INITIATE QUEUE FL.52 NOP (CONTAINS ADDR OF DVT2) CPB T2 WAS THIS A NORMAL REQUEST? JMP FL.54 YES, DO SCHED REQ TO ABORT IT LDA T3 GET DVT ADDR JSB $RTSM RETURN SAM, CHECK FOR BELOW B.L. JMP FL.56 DO NEXT REQUEST * FL.54 JSB $LIST DO SCHEDULE CALL TO ABORT PGM OCT 60 FL.56 LDA TMPE2 LINK TO NEXT JMP FL.11 GO PROCESS IT SKP * * THE DVT HAS NOW BEEN PROCESSED, AND ANY NON-ACTIVE * NORMAL OR BUFFERED REQUESTS HAVE BEEN FLUSHED FL.60 LDB T3 GET DVT ADDRESS LDA T2 A= ID SEG ADDR JSB $F.CL GO FLUSH "OWNED" PENDING CLASS DEC 2 REQUESTS ON THIS DVT LDB T3 GET DVT ADDRESS CLA CPA T5 ACTIVE ENTRY TO ABORT? JMP FL.70 NO STA T5 CLEAR FLAG FOR NEXT TIME JSB @DVT SET-UP DVT ADDRS LDA $DV6,I GET DVT WORD 6 AND .034 CHECK DEV TYPE CPA .014 IS THIS A DISC? JMP FL.70 YES, DON'T DO ABORT JSB $ABRQ DO ABORT INITIATION * FL.70 LDB T3 ADB .20 ADDR OF DVT21 LDB 1,I GET # OF DVR PARAMS CLA RRL 7 RIGHT JUSTIFY IN A REG ADA T3 + DVT ADDR ADA .22 + DVT SIZE = NEXT DVT ADDR ISZ T4 ALL PROCESSED? JMP FL.05 NO, EXAMINE NEXT DEVICE * * ALL REQUESTS ON ALL $DV'S RELATED TO THIS ID SEGMENT * HAVE BEEN FLUSHED IF INACTIVE, AND ABORTION HAS BEEN * INITIATED ON ALL ACTIVE REQUESTS JMP $IOFL,I EXIT * TMPE2 NOP .20 DEC 20 .22 DEC 22 .034 OCT 34000 .014 OCT 14000 SKP * * $IOCL FLUSHES AN XSIO REQUEST * * CALLING SEQUENCE: * JSB $IOCL * DEF (XSIO CALL LU WORD) * * IF THE SPECIFIED REQUEST IS ACTIVE, IT IS ABORTED, OTHERWISE * IT IS SIMPLY DEQUEUED FROM THE DVT. ANY XSIO COMPLETION * ROUTINE WILL BE CALLED FROM IOCX THE NEXT TIME THE I/O * SYSTEM EXITS NORMALLY (SINCE $IOCL IMMEDIATELY RETURNS TO * CALLER). * * NOTE: DON'T USE THIS ROUTINE UNLESS XSIO CONTROL BLOCK * SPECIFIES A COMPLETION ROUTINE! * $IOCL NOP LDB $IOCL,I GET XSIO REQ ADDR ISZ $IOCL POINT TO RTN ADDR CCA ADA 1,I LU-1 AND B77 ADA $LUTA ADDR OF LU ENTRY IN LUT LDA 0,I GET IT ADB .2 POINT TO XSIO LINK WORD CCE,INA STA TMPE1 SAVE ADDR OF DVT2 * CL.10 LDA 0,I GET NEXT REQ ON DVT ELA,CLE,ERA CPA 1 IS THIS IT? JMP CL.20 YES, FLUSH IT CLE,SZA,RSS END OF LIST? JMP $IOCL,I NOT ON INITIATION QUEUE JMP CL.10 TRY NEXT * CL.20 LDA TMPE1 ADA .4 POINT TO DVT6 LDA 0,I GET DVT6 *TEMP SEZ,CLE,SSA AT HEAD AND BUSY? SEZ,SSA **TEMP JMP CL.40 YES, GO ISSUE ABORT TO DVR CLE **TEMP JSB UNLNK NO, DEQUEUE THE REQ FROM DVT TMPE1 NOP CLE JSB LINK ADD TO SYSTEM DONE QUEUE DEF Q.SD JMP $IOCL,I BACK TO CALLER NOW * CL.40 CCB ADB TMPE1 COMPUTE ADDR OF DVT1 JSB $ABRQ ABORT REQUEST AT HEAD JMP $IOCL,I DONE! NOW BACK TO CALLER SKP * * $IOUP IS CALLED WHEN A DEVICE IS TO BE "UP"ED. * * DVT ADDRESSES HAVE ALREADY BEEN SET WHEN ENTERED. * $IOUP NOP LDA $DV1 RESCHEDULE ALL WAITERS FOR JSB $SCHD A DOWNED DEVICE B54 OCT 54 LDA $DV6,I GET AVAILABILITY FIELD RAL,CLE,RAL ERA,RAR CLEAR DOWN FLAG STA $DV6,I LDB $DV2,I ELB,CLE,ERB SZB ANYTHING QUEUED ON DEVICE? SSA YES, IS DEVICE NON-BUSY? JMP $IOUP,I NO, DONE LDB $$RTN SZB,RSS ENSURE $$RTN NOT SET (I.E. P.F.) LDB $IOUP RETURN ADDR FOR JMP $INIO GO START LOGICAL REQUEST SKP * * $IODN IS CALLED WHEN A DEVICE IS "DOWN"ED * * DVT ADDRESSES HAVE BEEN SET WHEN ENTERED. THE * ROUTINE CHECKS FOR ANY PROGRAMS IN I/O SUSPENSION * FOR THE DEVICE AND PLACES THOSE FOUND INTO THE * WAIT LIST WITH POINT OF SUSPENSION RESET SO * THAT THE REQUEST WILL BE REINITIATED WHEN THE * DEVICE IS UP'ED. * XSIO REQUESTS WILL BE IMMEDIATELY COMPLETED WITH * TRANSMISSION LOGS OF ZERO. THIS IS TO ALLOW THE XSIO * ROUTINES TO BE AVAILABLE TO OTHER DEVICES WHICH * ARE NOT DOWN BUT SHARE THE SAME XSIO CTL BLOCK. * ON ENTRY, E=0 IF CALLED FROM LOG.DONE & DON'T FLUSH * $IODN NOP LDA $DV6,I IOR BIT14 SET DEVICE DOWN STA $DV6,I IN DVT "AV" FIELD LDB $DV2,I GET HEAD OF LOG INITIATION QUEUE SEZ,SSA,RSS AV=NOT BUSY AND DON'T FLUSH? JMP IODN2 YES, DON'T SKIP HEAD ELB,CLE,ERB CLEAR SIGN SZB DVT QUEUE EMPTY? LDB 1,I NO, SKIP 1ST IODN2 ELB,CLE,ERB CLEAR SIGN SZB,RSS MORE ON QUEUE? JMP $IODN,I NO, RETURN * STB TMPA4 SAVE REQUEST ADDRESS LDA 1,I STA TMPA5 SAVE LINK TO NEXT INB LDA 1,I GET CONTROL WORD RAL CLE,SSA TEST REQUEST TYPE JMP IODN4 BUFFERED OR CLASS, IGNORE STA $IOUP SAVE CONWD LDB TMPA4 REQ BLOCK ADDR JSB UNLNK REMOVE FROM DVT INIT QUEUE DEF $DV2,I LDA $IOUP GET CONWD CLE,SLA NORMAL REQUEST? JMP IODN6 NO, XSIO REQUEST BLOCK * ADB .9 LDA 1,I STEP TO SAVE A REG., GET SAVED ADB M1 POINT OF SUSPENSION, AND STORE STA 1,I IT IN $SUSP FOR THIS PROGAM. LDB TMPA4 GET REQ BLOCK ADDR LDA $DV1 DVT ADDRESS JSB $LIST LINK THIS PROGRAM INTO THE OCT 54 DOWN DEVICE LIST IODN4 LDB TMPA5 GET ADDR OF NEXT REQUEST JMP IODN2 PROCESS IT SPC 2 IODN6 JSB LINK ADD XSIO BLOCK TO SYS DONE QUEUE DEF Q.SD ADB .6 POINT TO XLOG WORD CLA STA 1,I RETURN ZERO XMISSION LOG JMP IODN4 SKP * * THIS ROUTINE INITIATES REQUEST ABORT PROCEEDINGS FOR THE * ACTIVE REQUEST FOR THE GIVEN DEVICE. IF IF HEAD IS NOT * ACTIVE, IT IS SIMPLY FLUSHED. * CALLING SEQUENCE: * LDB (DVT ADDRESS) * JSB $ABRQ * (RETURN) * $ABRQ NOP JSB @DVT SET DVT ADDRESSES LDA $ABRQ ENSURE WE RETURN TO STA $$RTN CALLER FROM IOCX LDA $DV6,I GET "AV" SSA,RSS BUSY? JMP NOTBZ NO, DO IMMEDIATE FLUSH LDA $DV7,I IOR .4 SET "AB" FLAG STA $DV7,I BIT13 XOR 0 A=0 (ABORT) * JSB L.DVR CALL LOGICAL DRIVER JMP LW.00 LOGICAL WAIT JMP PI.00 PHYSICAL INITIATE JMP LD.00 LOGICAL DONE * ADB BIT13 NO LOG DVR, SO CALL PHY DVR STB $DV7,I FOR ABORT NOW JMP PI.00 GO TO PHYSICAL INITIATE * * NOTBZ CLA STA $DV16,I RETURN NO ERROR JMP LD.41 FLUSH WITH XLOG=0 SKP * LINK - QUEUING IS ON EITHER A PRIORITY OR A FIFO * BASIS, AS DIRECTED BY THE Q-BIT LOCATED AT BIT15 * OF THE LIST HEAD. IF PRIORITY IS INDICATED, THE * E-REQ. DEFINES WHERE THE PRIORITY WORD FOR THE * CURRENTLY LINKED REQUESTS WILL BE FOUND: * (E)=0 - PRIORITY WORD @ (LINK WORD+6) * (E)=1 - PRIORITY WORD @ (LINK WORD+1),I+6 * * (E)=0/1 - I/O BLK / DVT SELECT * (A)=LINK PRIORITY, (NOT NEEDED IF FIFO QUEUE) * (B)=LINK ITEM ADDR * JSB LINK * DEF * RETURN: P+1, B=ITEM ADDR, A MEANINGLESS * (E)=0/1 - QUEUE WAS EMPTY/NOT EMPTY ON ENTRY * * LINK NOP STA TMPA1 =LINK PRIORITY ELB,CLE,ERB STB TMPA2 =LINK ITEM ADDR LDB LINK (SIGN MUST NOT BE SET HERE!) LINK1 ELB,CLE,ERB (DON'T DISTURB E-REQ) LDB 1,I GET Q-HEAD ADDR SSB & CHASE INDIRECTS JMP LINK1 LDA 1,I GET Q-TYPE TO A(15) ERA,CLE,RAL & BLK/DVT SELECT TO A(0) STA TMPA3 START SCAN PROCESS RSS **TEMP LINK9 CCE,RSS **TEMP * LINK2 LDA TMPA3 LINK3 STB TMPA4 SAVE PREVIOUS ENTRY ADDR LDB 1,I & ADVANCE TO NEXT ELB,CLE,ERB (CLEAR POSSIBLE SIGN) SZB,RSS END OF LIST? JMP LINK6 YES, GO LINK NEW ITEM *TEMP SEZ,CCE SKIP IF FIRST TIME SEZ **TEMP SSA NOT 1ST, SKIP IF PRIORITY Q'ING *TEMP JMP LINK3 FIFO, SO CONTINUE SCAN JMP LINK9 **TEMP * STB TMPA5 ITEM ADDR SLA I/O BLK OR DVT? JMP LINK4 DVT, JUMP ADB .6 LDA 1,I USE REQ PRIORITY JMP LINK5 (WORD 7 OF I/O BLOCK * LINK4 ADB .19 DVT SO FIND DEVICE LDA 1,I PRIORITY IN DVT20 AND B77 BITS 5-0 * LINK5 LDB TMPA5 CMA,INA NEGATE THIS PRIORITY ADA TMPA1 COMPARE TO CURRENT CCE,SSA,RSS IF CURRENT IS HIGHER THAN NEW JMP LINK2 (LOWER #), THEN CONTINUE SCAN * LINK6 STB TMPA2,I SET LINK WD OF NEW BLOCK LDA TMPA4,I ADD NEW REQUEST TO AND BIT15 APPROPRIATE I/O Q AND IOR TMPA2 MAINTAIN SIGN BIT OF STA TMPA4,I CURRENT REQUEST LDB TMPA2 RETURN ITEM ADDR IN B ISZ LINK JMP LINK,I * TMPA3 BSS 1 TMPA4 BSS 1 .19 DEC 19 SKP * * UNLNK - REMOVE ITEM FROM INDICATED LIST * * (E)=0/1 : 0/-1 TO LINK WORD * (B)=ITEM ADDR * JSB UNLNK * DEF * RETURN P+2 * (B)=ITEM ADDR * (A)=0 IF QUEUE NOW EMPTY * $UNLK EQU * UNLNK NOP ELB,CLE,ERB STRIP SIGN OF ITEM ADDR CCA,SEZ,RSS (E)=1 GETS -1 TO LINK WORD CLA (E)=0 GETS 0 TO LINK WORD STA TMPA1 LDA UNLNK UNLN1 LDA 0,I GET Q-HEAD ADDR RAL,CLE,SLA,ERA & CHASE INDIRECTS JMP UNLN1 STA TMPA2 =Q-HEAD ADDR * UNLN2 STA TMPA3 SAVE PREV.ITEM ADDR. LDA 0,I GET NEXT ITEM RAL,CLE,ERA EXTRACT SIGN BIT CPA 1 ITEM FOUND? JMP UNLN3 YES, GO UNLINK IT SZA END OF LIST? JMP UNLN2 NO, CONTINUE JMP UNLN4 YES, QUIT! * UNLN3 LDA 1,I REMOVE THE ITEM RAL,ERA (MAINTAIN SIGN) STA TMPA3,I & LDA TMPA1 INIT.LINK WORD STA 1,I OF UNLINKED ITEM * UNLN4 LDA TMPA2,I ELA,CLE,ERA A NOW = 0 IF EMPTY Q ISZ UNLNK JMP UNLNK,I * SKP * * ONTO - ADD $DV/IFT TO TIME OUT QUEUE * * (E)=0/1 : LOGICAL/PHYSICAL LEVEL SELECT * JSB ONTO * ONTO NOP LDB $IF1 CHOOSE LOGICAL OR SEZ,RSS PHYSICAL LEVEL LDB $DV11 CLOCK BLOCK STB TMPA1 =LINK ITEM ADDR INB LDA 1,I GET CLOCK VALUE CMA,INA,SZA,RSS REQUESTED?? JMP ONTO,I NO, LEAVE STB TMPA2 =CLOCK WORD ADDR LDB AQ.TO * ONTO1 STB TMPA3 SAVE PREV ITEM ADDR LDB 1,I & GET NEXT ONE SZB,RSS END OF LIST? JMP ONTO3 YES CLE,INB MOVE TO CLOCK TIME ADA 1,I & ACCUMULATE SEZ,RSS CURR.ENT.BEYOND NEW? JMP ONTO2 YES, POSITION FOUND ADB M1 CMA,INA ELSE, POST NEGATIVE STA TMPA2,I TIME VALUE REMAINS CMA,INA JMP ONTO1 * ONTO2 STA 1,I UPDATE NEXT ITEM'S CLOCK ADB M1 B= ADDR OF NEXT * ONTO3 STB TMPA1,I SET NXT INTO NEW LDA TMPA1 SET NEW ITEM ADDR STA TMPA3,I INTO PREV.ITEM LINK JMP ONTO,I & LEAVE * SKP * * OFTO - REMOVE LOG/PHY LEVEL FROM TIME OUT QUEUE * * JSB OFTO * OFTO NOP LDA 1,I INA,SZA,RSS IN T.O.LIST?? JMP OFTO,I NO, SO LEAVE ALONE STB TMPA5 TMPA5 EQU *+1 DLD * GET LINK AND CURRENT TIMER CCE,INA POINT TO TIMER OF NEXT ADB 0,I ADD THIS TIMER TO NEXT ENTRIES STB 0,I STORE IN NEXT ENTRY (OR B IF NO MORE) LDB TMPA5 JSB UNLNK UNLINK THIS ENTRY FROM T.O.QUEUE AQ.TO DEF Q.TO JMP OFTO,I & LEAVE * SKP * * L.DVR - LOGICAL DRIVER ENTRY ROUTINE * * -CLEARS LOGICAL TIME OUT CLOCK * -REMOVES DVT FROM TIME OUT QUEUE * -CALLS LOGICAL DRIVER * -POSTS LOG.DVR'S REQ @ $DV7, BITS 15-11 * * (A)=DRIVER DIRECTIVE: * 0=ABORT, 1=INIT, 2=CONT, 3=TO, 4=PF, 5=RESUME * JSB L.DVR * P+1: LOGICAL WAIT REQUESTED * P+2: PHYSICAL INIT REQUESTED * P+3: LOGICAL DONE REQUESTED * P+4: NO LOGICAL DRIVER * L.DVR NOP STA TMPA4 LDB $DV11 JSB OFTO REMOVE DVT FROM .O.QUEUE CLA CLEAR LOGICAL STA $DV12,I TIME OUT CLOCK LDB $DV15,I RBR,RBR GET CONWD BIT 2 SLB,RSS DON'T CALL LOGICAL DRIVER SET? LDA $DV14,I NO, GET LOG.DVR ADDR SZA ANY?? JMP *+3 YES ISZ L.DVR NO, EXIT P+4 JMP L.DV2 STA TMPA5 LDA TMPA4 (A)=DVR.DIRECTIVE LDB $DV1 (B)=DVT ADDRESS JSB TMPA5,I CALL LOGICAL DVR. L.DV2 ISZ L.DVR -LOG.DONE, P+3 ISZ L.DVR -PHY.INIT, P+2 LDB $DV7,I & POST DVR'S RETURNED BLF,RBL CNTRL INFO AT $DV7 RRR 5 STB $DV7,I JMP L.DVR,I * SKP * P.DVR - PHYSICAL DRIVER ENTRY ROUTINE * * -SET VALIDATE I/O CHIP GLOBAL REG * -INIT TIME CLOCK TO TIME OUT VALUE * -REMOVE IFT FROM TIME OUT QUEUE * -CALL PHYSICAL DRIVER * -POST PHY.DVR'S REQUEST @ $IF7, BITS 15-11 * * (B)=DRIVER DIRECTIVE, BIT15=1 IF INTRPT ENTRY * 0=ABORT, 1=INIT, 2=CONT, 3=TO, 4=PF * JSB P.DVR * P+1: LOGICAL RESUME REQUESTED * P+2: PHYSICAL CONTINUE REQUESTED * P+3: PHYSICAL DONE REQUESTED * P.DVR NOP LIA 2 GET CURRENT GLOBAL REG STA TMPE1 LDA $IF6,I GET I/O CHAN RBL,CLE,SLB,ERB INTRPT ENTRY? LDA CHAN YES, USE SOURCE CHAN CLC 4 DISALLOW P.F. OTA 2,C SET/ENABLE GLOBAL REG CLA LIA 2,C RE-READ GLOBAL REG SZA,RSS IS CARD THERE? JMP P.DV8 NO, CAN'T LEAVE GLOBAL REG INVALID STC 4 NEW GLOBAL REG OK, PROCEED STB TMPE1 LDA $IF7,I GET "M" FLAG LSL 6 MOVE TO SIGN SSA IS IT SET? JMP P.DV4 YES, DON'T TOUCH T.O. LIST LDB $IF1 JSB OFTO REMOVE IFT FROM Q.TO LDB $IF5,I GET DVT ADDR ADB .12 & BUMP TO $DV13 LDB 1,I GET TIME OUT VALUE STB $IF2,I & POST IN IFT CLOCK * P.DV4 LDA TMPE1 (A)=DRIVER DIRECTIVE LDB $IF4,I STB TMPE1 =DRIVER ENTRY ADDR LDB $IF5,I (B)=DVT ADDR JSB TMPE1,I CALL PHY.DVR P.DV6 ISZ P.DVR -PHY.DONE, P+3 ISZ P.DVR -PHY.CONT, P+2 LDB $IF7,I -LOG.RESUME, P+1 BLF,RBL (A)=5-BIT DVR CONTROL INFO RRR 5 POST IN IFT STB $IF7,I BLF CCE,SSB "T" SET? JSB ONTO YES, PUT IFT ON TIME-LIST JMP P.DVR,I SPC 2 * INTERFACE CHIP HAS FAILED OR IS NOT THERE. RESTORE * GLOBAL REG TO PREVIOUS VALUE SO IN CASE OF POWER FAIL * SYSTEM STATE IS RESTORABLE, NOTABLY PRIVILEGED MASK. * RETURN A "NOT READY" & FLUSH THIS REQUEST. P.DV8 LDB TMPE1 PREVIOUS GLOBAL REG OTB 2,C RESTORE IT STC 4 REENABLE P.F. & LEV 3 INRUPS LDB $IF5,I JSB @DVT SET-UP DVT POINTERS LDB NRDYF =140002, NOT READY, FLUSH STB $DV16,I SET DVT ERROR JMP P.DV6 DO PHY DONE, A=0 * NRDYF OCT 140002 SKP * * THIS ROUTINE PERFORMS BUFFER LIMIT CHECKING * ON ENTRY, B=0 IF UPPER LIMIT CHECK, OR * B=RETURNED SIZE IF LOWER LIMIT CHECK * EXITS TO RETURN+1 UNLESS ALREADY BUFFER LIMITED * ON UPPER LIMIT CHECK(RETURN+2). * $BLIM NOP LDA $DV9,I BUFFER LIMITS FOR THIS $DV AND B377 CMB,INB,SZB LOWER LIMIT CHECK? JMP BLIM2 YES STA TMPA1 LDA $DV9,I SSA ALREADY LIMITED? JMP BLIM3 YES, DO RTN+2 LSR 8 RIGHT JUSTIFY ADA TMPA1 A = UPPER LIMIT MODULO 16 BLIM2 ALF ADJUST FROM MODULO 16 CMA,INA,SZA,RSS LDA BUMAX USE BUMAX IF IT WAS ZERO STA TMPA1 LDA $DV8,I GET CURRENT ACCUMULATION ADA 1 SUBTRACT ANY RTN'D LENGTH STA $DV8,I RAL,CLE,ERA CLE ADA TMPA1 TEST LIMIT (E=0 IF BELOW) LDA $DV9,I SZB CHECK WHICH LIMIT JMP BLIM4 LOWER, JUMP ELA,SLA,RAR IF ABOVE, SET "S", DON'T SKIP BLIM3 ISZ $BLIM RTN+2, LIMITING STA $DV9,I JMP $BLIM,I * BLIM4 RAL,SLA,ERA SKIP IF NOT BUFFER LIMITED SSA WAS ABOVE, ARE WE NOW BELOW? JMP $BLIM,I NO, JUST EXIT STA $DV9,I YES, CLEAR "S"-BIT LDA $DV1 AND JSB $SCHD SCHEDULE ANY B.L. WAITERS B55 OCT 55 JMP $BLIM,I * BUMAX DEC -32766 SKP * * THIS ROUTINE RETURNS A BLOCK OF SYSTEM AVAILABLE * MEMORY AND CALLS "$BLIM" TO ADJUST THE B.L. ACCUMULATOR * AND SCHEDULE WAITERS IF IT GOES BELOW THE LOWER B.L. * ON ENTRY: A=DVT ADDR , B=BLOCK ADDRESS * $RTSM NOP STB TMPA1 SAVE BLOCK ADDR ADB .7 POINT TO WD 8 LDB 1,I STB TMPA2 SAVE RETURNED SIZE LDB 0 JSB @DVT ENSURE DVT POINTERS SET JSB $RTN RETURN S.A.M. TMPA1 NOP TMPA2 NOP LDB TMPA2 GET RETURNED SIZE JSB $BLIM LOWER BUFFER LIMIT CHECK JMP $RTSM,I SKP * * $DIOC - ADVANCE DVT REFERENCES AND/OR SETUP $DV/IFT ADDRS * * * 2 * 1 * 0 * WHERE: * ************* A=1 TO ADVANCE DVT REF @ $IF5 * (A)=* A * I * D * I=1 TO SETUP IFT ADDRESSES * ************* D=1 TO SETUP DVT ADDRESSES * * (B)=DVT ADDR * JSB $DIOC * RETURN: P+1 REG MEANINGLESS * $DIOC NOP ELB,CLE,ERB INSURE WE HAVE TRUE ADDR SZB,RSS BIT BUCKET? LDB $D$DV YES STA TMPA1 SAVE DVR'S SETUP REQ. RAR,RAR SLA,RSS A-BIT SET? JMP DI2 NO, SKIP IT ADB .3 GET NEXT DVT IN LDB 1,I CIR.LIST @ $DV4 ELB,CLE,ERB (STRIP SIGN) LDA 1 ADA .4 GET IFT REFERENCE LDA 0,I AT $DV5 ELA,CLE,ERA & ADA .4 POINT TO $IF5 STB 0,I POST NEW DVT REF IN IFT WORD 5 * DI2 LDA TMPA1 SLA D-BIT SET? JSB @DVT YES, POST DVT ADDRS ADB .4 GET IFT ADDR TO (B) LDB 1,I RAR,SLA I-BIT SET? JSB @IFT YES, POST IFT ADDRS JMP $DIOC,I SKP * ROUTINE TO SET PHYSICAL TIMEOUTS FOR PHYSICAL * DRIVERS WHICH MANAGE THEIR OWN TIMEOUTS * CALLING SEQUENCE: * LDB (IFT ADDRESS) * LDA (PHYSICAL TIMEOUT VALUE) * JSB $IOTI * $IOTI NOP STA $DIOC JSB @IFT SET-UP IFT POINTERS LDB $IF1 JSB OFTO REMOVE IFT FROM T.O.QUEUE LDA $DIOC GET VALUE FROM PHY.CLOCK STA $IF2,I STORE PHY.T.O.VALUE CCE IFT INDICATOR JSB ONTO ADD IFT TO T.O.LIST JMP $IOTI,I RETURN TO THE DRIVER SPC 1 * THIS ROUTINE IS CALLED BY THE POWER-FAIL DRIVER "PD.43" TO * PERFORM I/O PROCESSING ON AN IFT OR DVT WHEN POWER IS UP'ED. * CALLING SEQUENCE: * LDB (IFT ADDRESS) * CCE * JSB $POWF (P.F. PROCESSING FOR PHYSICAL LEVEL) * OR * LDB (DVT ADDRESS) * CLE * JSB $POWF (P.F. PROCESSING FOR LOGICAL LEVEL) * $POWF NOP LDA $POWF GET RETURN ADDR SEZ DOING IFT OR DVT? JMP PF.50 IFT JSB @DVT DVT, SET-UP ADDRESSES LDB $DV6,I GET "AV" RBL,SLB IS DVT BUSY? JMP PF.30 YES SSB,RSS NO, IS DEVICE DOWN? JMP $POWF,I NO, RETURN STA $$RTN SET RTN ADDR FROM IOCX & GO UP JMP $UPIO DEVICE IN CASE SET DOWN BY P.F. * PF.30 LDB $DV14,I LOG DVR ADDR SZB IS THERE A LOGICAL DRIVER? LDB $DV4,I YES, GET "P"-BIT SSB,RSS NOW SKIP IF LOG DVR AND "P"=1 JMP $POWF,I ELSE RETURN NOW STA $$RTN SAVE RETURN ADDR LDA .4 DO POWER-FAIL ENTRY TO JMP LI.20 LOGICAL DRIVER * PF.50 STA $$RTN SET RETURN TO $POWF CALLER JSB @IFT SET-UP IFT ADDRESSES LDB .4 POWER-FAIL ENTRY TO JMP PR.04 PHYSICAL DRIVER SKP * ORB $DV1 NOP $DV2 NOP $DV3 NOP $DV4 NOP $DV5 NOP $DV6 NOP $DV7 NOP $DV8 NOP $DV9 NOP $DV10 NOP $DV11 NOP $DV12 NOP $DV13 NOP $DV14 NOP $DV15 NOP $DV16 NOP $DV17 NOP $DV18 NOP $DV19 NOP $DV20 NOP $DV21 NOP $DV22 NOP $DVTP NOP $IF1 NOP $IF2 NOP $IF3 NOP $IF4 NOP $IF5 NOP $IF6 NOP $IF7 NOP $IFTX NOP ORR SPC 3 * * Q.TO NOP TIME-OUT QUEUE HEAD $Q.TO EQU Q.TO $$RTN NOP * .3 DEC 3 .4 DEC 4 .5 DEC 5 .7 DEC 7 B377 OCT 377 SKP * * ROUTINE TO COMPUTE LU FROM DVT ADDRESS * CALLING SEQUENCE: * LDB (DVT ADDRESS) * JSB $DVLU * (A HAS LU ON RETURN, B & E UNCHANGED) * $DVLU NOP LDA $LUTA STA $RUN# SET ADDRESS OF LUT CLA,INA * DVL2 CPB $RUN#,I LUT ENTRY DVT MATCH? JMP $DVLU,I YES, RETURN CPA $LUT# DONE? CLA,RSS YES, EXIT WITH A=0 (NO MATCH) INA,RSS NO, BUMP LUT COUNTER JMP $DVLU,I RETURN ISZ $RUN# POINT TO NEXT LUT ENTRY JMP DVL2 SPC 3 * B ON ENTRY = ID SEG ADDR (ASSUMED TO BE VALID) * A ON RETURN = ID SEG/RUN #, B MEANINGLESS, E=0 $RUN# NOP ADB .28 POINT TO ID SEG+28 LDA 1,I GET CURRENT RUN # AND B17XX ISOLATE IT STA $DVLU LDA $IDA ADDR OF 1ST ID SEG CMA,INA ADA 1 COMPUTE OFFSET (+24) OF OURS CLB DIV $IDSZ COMPUTE ID SEG # CLE,INA IOR $DVLU INCLUDE RUN # JMP $RUN#,I RETURN * B17XX OCT 170000 .6 DEC 6 .28 DEC 28 SKP * * @DVT - SETUP DVT ADDRESSES * * (B)=DVT ADDR * JSB @DVT * (B)=DVT ADDR (A & E REG UNCHANGED) * @DVT NOP ELB,CLE,ERB CPB $DV1 DVR ADDRS SET YET? JMP @DVT,I YES, EXIT STB $DV1 POST DVT ADDRESSES INB STB $DV2 INB STB $DV3 INB STB $DV4 INB STB $DV5 INB STB $DV6 INB STB $DV7 INB STB $DV8 INB STB $DV9 INB STB $DV10 INB STB $DV11 INB STB $DV12 INB STB $DV13 INB STB $DV14 INB STB $DV15 INB STB $DV16 INB STB $DV17 INB STB $DV18 INB STB $DV19 INB STB $DV20 INB STB $DV21 INB STB $DV22 INB STB $DVTP LDB $DV1 (B)=DVT ADDR JMP @DVT,I SPC 4 * * @IFT - SETUP IFT ADDRESSES * * (B)=IFT ADDR * JSB @IFT * @IFT NOP CPB $IF1 JMP @IFT,I STB $IF1 INB STB $IF2 INB STB $IF3 INB STB $IF4 INB STB $IF5 INB STB $IF6 INB STB $IF7 INB STB $IFTX JMP @IFT,I RETURN (A REG UNCHANGED) SKP * BUCKT DEC -1,0 DEF * OCT 0 DEF *-2 EXEC(13) PICKS UP DVT8 OCT 0 TYPE=0 , STATUS = 0 DEC 0,0,0,0 DVT7 - DVT10 BIT14 OCT 040000 DVT11 BIT15 OCT 100000 DVT14 M1 DEC -1 OF BIT BUCKET M2 DEC -2 ARE UNUSED DEC 0,0,0,0,0 DVT15 - DVT 19 * NOTE: DVT20 - DVT22 NOT NECESSARY FOR BIT BUCKET * SIZE EQU * * END