ASMB,Q,L,C * * NAME: RTIOL * SOURCE: 92071-18092 * RELOC: 92071-16092 * PGMR: C.H.W.,N.J.S. * * **************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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 92071-16092 REV.2041 800902 * * * * ENT $ABRQ, $BLIM, $CIC, $DIOC, $DMPR, $DVLU ENT $MPSQ, $ONER, $ONEW, $READ, $SELR ENT $SETM, $SETR, $UINI, $VBUF, $WRIT 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, $PBZY, $PDON ENT $POWF, $PRTY, $Q.PV, $Q.TO, $RTSM, $RUN# ENT $TBG,$TBG#,$UNLK,$UPIO,$XSIO * EXT $CVT1,$SYMG,$ERAB,$IDSQ,$IDNO,$MAPS EXT $ERMG,$TYPE,$PIMK,$USER EXT $RQRT,$RQCT,$RQP1,$RQP2,$RQP3 EXT $RQP4,$RQP5,$RQP6,$RQP7,$RQP8,$RQP9 EXT $RQ.1,$RQ.2,$RQ.3,$RQ.4,$RQ.5,$RQ.6 EXT $RQ.7,$RQ.8,$RQ.9 EXT $TMP1,$TMP2,$TMP3,$TMP4,$TMP5 EXT $PRIO,$XQT,$SUSP,$IDSZ,$IDA EXT CNUMD, CNUMO EXT $A,$B,$EO EXT $XEQ,$LIST,$ALC,.MVW,.MWF,.MWI EXT $CLCK,$RTN,$SCHD EXT $C.CL,$I.CL,$F.CL EXT $MPTF, $MAPF, $TEST, $DB, $CMAP EXT .XLA, .XLD, .XSA, .XST, .CAX, .CBX 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 EXT $CLTA START OF CLASS TABLE EXT $MAP START OF MAP REGISTERS EXT $BASE START OF RELOCATION REGISTERS EXT $SCPG EXT $SC# EXT $SC0 STARTING PAGE OF SYSTEM COMMON PARTITION - 1 EXT $LCOM EXT $MATA EXT $MASZ EXT $MATV NUMBER OF VALID MAT ENTRIES * A EQU 0 B EQU 1 SC.00 EQU 0 SC.02 EQU 2 SC.03 EQU 3 SC.04 EQU 4 SC.05 EQU 5 SC.06 EQU 6 SC.07 EQU 7 SC.11 EQU 11B SC.15 EQU 15B SC.20 EQU 20B SC.21 EQU 21B SC.22 EQU 22B SC.23 EQU 23B SC.30 EQU 30B 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 SC.04 DISABLE INTERRUPT SYSTEM * * PRESERVE CURRENT STATUS OF MACHINE * DST $A,I SAVE A&B * CIC.2 LIB SC.04 GET INTERRUPT CODE ISZ $MPTF ISZ $MAPF LDA $PIMK OTA SC.00 SET INTERRUPT MASK STC SC.04 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 SC.04 TURN OFF ALL INTERRUPTS STA SAVA * **BELOW MAY BE MODIFIED BY ROUTINES WISHING PRIVILEGED SERVICE **EVERY 10 MILLISECS $TBG# CLF SC.06 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 $MAPF GET STATE OF MAPPING BEFORE INTERRUPT SZA JMP TB.1 WASN'T ENABLED STC SC.11 TURN ON MAPPING CLC SC.15 TURN OFF 1610A ANALYZER LDA $DB SSA,RSS DEBUGGING ALL OR CPA $XQT CURRENT PROGRAM? STC SC.15 YES * TB.1 LDA SAVA INCREMENT TICK COUNTER & GET OUT STC SC.04 JMP $TBG,I RETURN TO POINT OF INTERRUPTION * $TBG2 LDA $TBG PASS INTERRUPT RETURN POINT STA $CIC TO $CIC LDA SAVA DST $A,I SAVE STATE OF A AND B REGISTERS JMP CIC.2 ENTER $CIC NOW! SAVA NOP SPC 2 * PARITY INTERRUPT HAS OCCURRED $PRTY NOP CLC SC.04 DISABLE INTERRUPTS DST ABSAV SAVE AWAY VALUES ISZ $MPTF LDA $PIMK SET PRIVILEGED MASK OTA SC.00 LDB $MAPF GET STATE OF MAPPING BEFORE CHANGING IT ISZ $MAPF STC SC.04 ENABLE INTERRUPTS LIA SC.04 GET INTERRUPT CODE CPA .5 REALLY A PARITY ERROR? RSS YES - CONTINUE PROCESSING JMP HLT3 NO - EXECUTING 0,1,2,3,4 JUST HALT * LIA SC.05 GET VIOLATION ADDR STA VIOL AND SAVE IT * SZB ENABLED? JMP EXSYS NO - EXECUTING IN SYSTEM LDB $MAP,I GET 1ST MAP REGISTER SZB,RSS IF 0 AND MAPPED JMP HALT5 MUST BE IN THE IDLE LOOP * * EXECUTING IN USER AREA * SSA EXECUTING JMP DOWN YES - PE IN USER AREA - DOWN PTN * LDA $PRTY NO - DATA - GET P-REG ADA M2 AND BACK UP 2 JSB .XLA GET INSTRUCTION FROM DEF A,I USER MAP CPA =B104213 CROSS LOAD? JMP DOWN YES CPA =B104413 CROSS STORE? JMP UCROS YES JMP DOWN NO - MUST BE PE ON DATA IN USER MAP * * CROSS MAP INSTRUCTION EXECUTED IN USER MAP * UCROS LDA $PRTY GET P-REG AND ADA M1 BACK UP 1 TO ADDRESS ULOOP CPA VIOL IS THIS THE BAD ADDRESS? JMP DOWN YES - PE ON ADDRESS IN USER AREA STA PNTR NO - GET CONTENTS TO DLD ABSAV PICK A AND B IN CASE ADDR WAS A,I OR B,I JSB .XLA SEE OF IT IS INDIRECT PNTR NOP RAL,CLE,SLA,ERA STRIP OFF SIGN BIT - INDIRECT? JMP ULOOP YES CPA VIOL NO - DATA ADDRESS IN SYSTEM MAP JMP HALT5 PE ON DATA IN SYSTEM MAP JMP DOWN PE ON ADDRESS #1 IN USER MAP SPC 2 * * EXECUTING IN SYSTEM * EXSYS SSA EXECUTING JMP HALT5 YES - PE IN SYSTEM * LDA $PRTY NO - DATA - GET P-REG ADA M2 AND BACK UP 2 LDA A,I GET INSTRUCTION TO SEE IF IT IS X-MAP CPA =B104213 CROSS LOAD JMP HALT5 YES CPA =B104413 CROSS STORE JMP SCROS YES JMP HALT5 MUST BE PE ON DATA IN SYSTEM * * CROSS MAP INSTRUCTION EXECUTED IN SYSTEM MAP * SCROS LDA $PRTY GET P-REG AND BACK ADA M1 UP 1 TO ADDRESS SLOOP CPA VIOL IS THIS THE BAD ADDRESS? JMP HALT5 YES - PE ON ADDRESS IN SYSTEM LDA A,I NO - GET CONTENTS RAL,CLE,SLA,ERA STRIP OFF SIGN BIT - INDIRECT? JMP SLOOP YES CPA VIOL NO - DATA ADDRESS IN USER MAP JMP DOWN PE ON DATA IN USER MAP JMP HALT5 PE ON ADDR+1 IN SYSTEM MAP SPC 2 * * DOWN THE PARTITION, PRINT THE MESSAGE, AND ABORT THE PROGRAM * DOWN LDB $MATV GET NUMBER OF VALID MAT ENTRIES CMB,INB MAKE NEGATIVE STB BSAVE AND USE AS A COUNTER LDA $MATA GET ADDRESS OF PARTITION TABLE ADA .2 POSITION TO STARTING PAGE DWN.1 LDB A,I GET IT CPB $MAP,I WHAT MAPS ARE SET UP FOR?? JMP DWN.2 YES - FOUND THE PARTITION ADA $MASZ NO - STEP TO NEXT STARTING PAGE ISZ BSAVE END? JMP DWN.1 NO - KEEP GOING JMP HALT5 YES - DIDN'T FIND IT - BAD NEWS! * DWN.2 ADA M2 POSITION TO ID SEGMENT ADDRESS LDB A,I GET ID SEGMENT ADDRESS STB BID AND SAVE IT FOR IO FLUSH CCB REPLACE WITH -1 TO STB A,I SET THE PARTITION DOWN JSB PTMSG CALCULATE BAD PAGE AND PRINT MESSAGE * LDA BID GET ID SEGMENT ADDRESS JSB $IOFL AND FLUSH ALL I/O FOR THIS PROGRAM * LDA VIOL GET VIOLATION REGISTER AGAIN RAL,CLE,ERA STRIP SIGN BIT SEZ,RSS EXECUTING INSTRUCTION? LDA $PRTY NO - USE PRTY AS POINT OF SUSPENSION STA $SUSP,I ELSE USE VIOLATION REG LESS BIT 15 * STC SC.05 ENABLE PARITY * DLD P.ERR SET PE MESSAGE JSB $ERMG AND ABORT PROGRAM JMP $XEQ DISPATCHER KNOWS WHAT TO DO * * * HALT5 LDB VIOL GET VIOLATION REGISTER RBL,CLE,ERB GET PAGE NUMBER LSR 10 TO LOWER BITS LDA VIOL VIOLATION REGISTER TO A HLT SC.05 HALT 5 JMP *-1 * HLT3 HLT SC.03 JMP *-1 * * P.ERR ASC 2,PE SPC 3 * * HERE FROM DRIVER ON A DMA PARITY $DMPR NOP LIA SC.02 IOR HLT0 STA DMHLT STORE CONFIG'D HALT LIA SC.20 SELF-CONFIG ADDR ADA M1 DECREMENT 1 STA TMPE2 AND SAVE * LIA SC.22 VIOLATION ADDRESS RAL,CLE,ERA CLEAR BIT 15 IN CASE IT'S SET ADA M1 DECREMENT 1 (IS ONE PAST ACTUAL ERROR ADDR) STA VIOL AND SAVE IT * LIA SC.21 GET DMA CONTROL WORD AND B377 AND MASK TO RELOC REGISTER NUMBER ADA $BASE CALCULATE ADDRESS OF RR LDA A,I AND GET VALUE STA BPAGE SAVE IT SZA,RSS IF ZERO, DMA'ING INTO SYSTEM JMP HLTDP SO BETTER JUST PITCH IT * * LDB $USER GET FIRST PAGE OF USER AREA CMB,INB SEE IF ADDRESS OF DMA TRANSFER ADB A IS ABOVE OR BELOW THIS BOUNDARY SSB,RSS JMP DMP.1 ABOVE SYSTEM COMMON * LDA $SC# NUMBER OF WORDS IN SYSTEM COMMON ALF,ALF TRANSLATE TO NUMBER OF PAGES RAL,RAL ADB A SEE IF ADDRESS OF DMA TRANSFER SSB IS IN SYSTEM COMMON JMP HLTDP BELOW SYSTEM COMMON!! SHOULDN'T EVER GET HERE CCA,RSS IN SYSTEM COMMON * DMP.1 CLA FLAG FOR WHETHER REQUEST WAS TO SYS COMMON STA ASAVE IF SO, DON'T WANT TO DOWN A PARTITION * LDA $IF1 IFT ADDRESS ADA .4 POSITION TO DVT BACK POINTER LDA A,I GET DVT ADDRESS INA LDB A,I I/O CONTROL BLOCK ADDRESS RBL,CLE,ERB CLEAR Q-BIT ADA .13 POSITION TO REQUEST TYPE LDA A,I IN DVT AND GET IT ELA CLASS OR BUFFERED REQUEST - SSA SHOULDN'T BE - PARITY WOULD BE IN SAM JMP HLTDP YES - CLASS OR BUFFERED SEZ,RSS NORMAL REQUEST? JMP NORRQ YES * * XSIO REQUEST * ADB .7 GET STARTING PAGE OF PARTITION LDA B,I FROM XSIO CONTROL BLOCK SZA,RSS ZERO? (SHOULDN'T HAPPEN) JMP HLTDP YES - BETTER HALT STA BPAGE USE THIS AS BAD PAGE * LDA $MATV USE NUMBER OF VALID MAT ENTRIES CMA,INA AS A NEGATIVE COUNTER STA CNT1 * LDA $MATA GET ADDRESS OF MAT TABLE INA POSITION TO 1ST PAGE OF PARTITION FINDP LDB A,I STARTING PAGE OF PARTITION INA PLUS NUMBER OF PAGES IN ADB A,I THE PARTITION CMB ADB BPAGE IS BAD PAGE IN SSB IN THIS PARTITION??? JMP FNDPT YES - FOUND PARTITION ADA .2 NOPE - GO TRY THE NEXT ONE ISZ CNT1 TRIED THEM ALL? JMP FINDP NO JMP HLTDP YES - HOW COULD THIS HAPPEN??? * FNDPT ADA M2 POSITION TO ID SEGMENT ADDRESS LDB A,I AND GET IT JMP DDOWN GO SAVE * * * * NORMAL REQUEST * NORRQ ADB .25 POSITION TO PARTITION # LDA B,I GET PARTITION NUMBER AND B377 AND MASK TO LOWER BYTE LDB $MATV GET NUMBER OF VALID MAT ENTRIES CMB IS PARTITION NUMBER ADB A WITHIN VALID SSB,RSS MAT ENTRIES? JMP HLTDP NOPE - SOMETHING'S REALLY WRONG * ADA M1 MPY $MASZ ADA $MATA ADDRESS OF ID WORD IN MAT ENTRY LDB A,I GET ID SEGMENT ADDRESS DDOWN STB BID AND SAVE LDB ASAVE GET FLAG TO SEE IF SHOULD DOWN PARTIT. SSB (DON'T DOWN IF VIOL IN SYS COMMON) JMP DMP.2 CCB DOWN IT STB A,I * DMP.2 JSB PTMSG SET PAGE AND OFFSET MESSAGE TO TERMINAL LDB BID GET ID SEGMENT ADDRESS * * FOR DEBUG PURPOSES ONLY * SHOULDN'T EVER GET THIS CONDITION * LDA M1 SZB CPB M1 JMP HLT3 * * * JSB $IDSQ LDA $A,I STA $SUSP,I LDA BID JSB $IOFL AND GO FLUSH I/O FOR THIS PROGRAM * LDB BID GET ID SEGMENT ADDRESS AGAIN JSB $IDSQ AND SET UP ADDRESSES STC SC.05 ENABLE PARITY DLD P.ERR SEND PARITY ERROR JSB $ERMG MESSAGE AND ABORT PROGRAM JMP $XEQ DISPATCHER KNOWS WHAT TO DO * HLTDP LDA TMPE2 SELF CONFIG ADDRESS LDB VIOL DMA ADDRESS LESS 1 DMHLT NOP HALT JMP *-1 HLT0 HLT SC.00 * * DOCLF NOP LDA CHAN SELECT CODE OTA SC.02,C SET ENABLE GLOBAL REG CLC SC.21 SUSPEND DMA CLC SC.23,C TURNOFF DMA CLC SC.30,C CLEAR CARD JMP DOCLF,I SPC 3 * * PTMSG - SUBROUTINE TO PRINT PARITY ERROR MESSAGE * * ENTER - VIOLATION ADDRESS IN VIOL * PTMSG NOP LDA VIOL GET VIOLATION ADDRESS AND B1777 MASK TO OFFSET STA OFFST AND SAVE XOR VIOL MASK TO PAGE NUMBER CLE,ELA RIGHT ALF,RAL JUSTIFY ADA $MAP INDEX TO CORRECT MAP REGISTER LDA A,I GET VALUE IN MAP REGISTER STA ASAVE BAD PAGE!!! * JSB CNUMD CONVERT PAGE NUMBER TO ASCII DEF *+3 DEF ASAVE DEF P.PAG * JSB CNUMO CONVERT OFFSET TO ASCII DEF *+3 DEF OFFST DEF P.OFF * JSB $SYMG SEND PARITY ERROR MESSAGE DEF PEROR TO LU 1 * JMP PTMSG,I RETURN * * PEROR OCT 40001 DEC 15 ASC 5,PE PAGE# P.PAG BSS 3 ASC 4, OFFSET P.OFF BSS 3 * * .25 DEC 25 B1777 OCT 1777 OFFST NOP VIOL NOP BID NOP BPAGE NOP CNT1 NOP ABSAV NOP 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 SC.04 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 * LDB $TEST SET UP MAPS BEFORE JSB $MAPS RETURNING TO USER PROGRAM * LDB $EO,I RESTORE E & O CLO SLB,ELB STO CLA STA $MPTF CLEAR MEMORY PROTECT FLAG STA $MAPF CLEAR MAP SELECT FLAG OTA SC.00 ENABLE EVERYBODY * CLC SC.15 TURN OFF 1610A ANALYZER LDA $DB SSA,RSS DEBUGGING ALL OR CPA $XQT CURRENT PROGRAM? STC SC.15 YES * DLD $A,I RESTORE THE A AND B REGS STC SC.04 TURN ON THE INTERRUPT SYSTEM STC SC.11 ENABLE MAPPING STC SC.07 AND MEMORY PROTECT JMP CHAN,I RETURN * TICKD ADA M1 DECREMENT TICK COUNT STA TICK STC SC.04 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 SC.04 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 * 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 $RQ.2 *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 $RQ.1 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 $RQ.2 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 $RQ.2 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 $RQ.1 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 $RQ.4 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 LDB $XQT MAKE SURE BUFFER JSB $VBUF RESIDES IN USER PARTITION DEF $RQP3,I OR WITHIN SYSTEM COMMON DEF B1LNG RSS ERROR JMP L.02 * $ER04 LDB .4 IO04 JMP EREX * L.016 LDB $RQ.6 *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 STA T6 SAVE A TEMPORARILY WHILE CALLING VBUF LDB $XQT GET ID ADDRESS OF CURRENT PROGRAM JSB $VBUF MAKE SURE BUFFER RESIDES DEF $RQP5,I ENTIRELY IN USER PARTITION DEF B2LNG OR WITHIN SYSTEM COMMON JMP $ER04 ERROR LDA T6 RESTORE A LDB RQPX JMP L.013 * L.018 ISZ DISCF *FLAG DISC OPS. CPB .3 CONTROL? JMP L.019 YES LDA $RQ.2 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 $RQ.1 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 $RQ.1 CLASS CONTROL? JMP L.011 NO LDA $RQ.4 YES, RE-ALIGN LDB $RQ.5 OPTIONAL STB $RQ.4 PARAMETERS LDB $RQ.6 FOR EASE STB $RQ.5 OF FUTURE LDB $RQ.7 PROCESSING STB $RQ.6 STA $RQ.7 LDA $RQP4 LDB $RQP5 STB $RQP4 LDB $RQP6 STB $RQP5 LDB $RQP7 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 $RQ.9 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 $RQ.2 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 $RQ.1 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.132 -BUFFER RETHREAD, SET TO GO STB T5 OK, (B)=CLASS TAB.ENTRY PTR CLB,INB JMP L.052 * L.132 LDA $RQ.7 RETURN CLASS NUMBER JSB .XSA FOR RETHREAD REQUEST DEF $RQP7,I JMP L.134 * CKTYP NOP LDA RQPX CPA $RQ.1 IS THIS CLASS I/O? JMP CKTYP,I NO, OK TO SUSPEND LDA $RQ.7 GET CLASS WORD SSA,RSS NO WAIT? JMP CKT.1 NO, SUSPEND OK JSB .XSA RETURN CLASS NUMBER DEF $RQP7,I TO CALLER BEFORE RETURNING 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 * CKT.1 JSB DEALO DEALLOCATE CLASS NUMBER BEFORE SUSPENDING JMP CKTYP,I AND RETURN * DEALO NOP JSB .XLA GET CALL PARAMETER FOR DEF $RQP7,I CLASS NUMBER AND B377 SZA ONLY DEALLOCATE IF SENT IN AS 0 JMP DEALO,I SENT A CLASS NUMBER SO JUST RETURN LDB T5 GET ADDRESS OF CLASS TABLE ENTRY STA B,I ZERO IT ADB $CLTA,I POSITION TO SEND WORD STA B,I AND ZERO IT TOO JMP DEALO,I 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 $RQ.2 *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 $RQ.1 CLASS REQ.ATTEMPTED? JMP L.10 NO, FORCE NON-BUFR'D I/O JSB DEALO DEALLOCATE THE CLASS NUMBER 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 JSB .CBX (FOR MOVE WORDS) LDA $RQP3 (A)=SOURCE BUFR,(USER) LDB T4 (B)=DESTINATION BUFR,(SAM+8/10) JSB .MWF MOVE IT! * L.072 ISZ T3 LDB $RQ.4 STB T3,I WORD4=R/W BUFR LNG ISZ T3 OR OPT.PARM * LDB $RQ.2 BLF,SLB 2-BUFR REQ(Z BIT=1)? JMP L.078 YES, GET 2ND BUFR ADDR LDB $RQ.5 WORD5=OPT.PARM L.073 STB T3,I (B)=DESTINATION BUFR.ADDR. LDA B2LNG SZA,RSS SKIP BUFFER MOVE ON JMP L.074 ZERO LNG REQUEST JSB .CAX (FOR MOVE WORDS) LDA $RQP5 (A)=SOURCE BUFR,(USER) JSB .MWF MOVE IT NOW * L.074 ISZ T3 CLE LDB $RQ.6 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 $RQ.1 CLASS OR BUFFERED? JMP L.12 BUFFERED, JUMP CPB .3 TYPE=3? CCE SET E IF CLASS CONTROL LDB $RQ.8 WORD 10=USER PARAMETER LDA $RQ.7 WORD9=CLASS INFO JSB .XSA RETURN THE CLASS NUMBER DEF $RQP7,I 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 LDB $RQ.3 IF CONTROL REQ, 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 CPB .3 BRANCH IF CONTROL JMP L.106 LDB $RQP3 =BUFR ADDR L.102 STB $TMP2,I POST @ ID.SEG LDB $RQ.4 GET BUFR LNG/OPT.PARM2 STB $TMP3,I & POST @ ID.SEG LDB $RQ.5 LDA $RQ.2 CHECK Z-BIT FOR ALF,SLA 2-BUFR REQ LDB $RQP5 =OPT.BUFR.ADDR, IF Z ON STB $TMP4,I POST @ ID.SEG. LDB $RQ.6 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 $RQ.3 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 LDB $RQP3 ADDRESS TO RETURN INFORMATION TO JSB .XST DO CROSS MAP STORE DEF B,I * LDB $RQCT ADB M3 WAS 3RD PARAMETER SSB SUPPLIED? JMP L.RTN NO - DON'T RETURN ANY MORE INFO LDA $DV5,I GET IFT ADDR SZA RETURN 0 IF NO IFT ADA .5 POINT TO IFT6 LDA 0,I RETURN INTERFACE STATUS LDB $RQP4 GET ADDRESS TO RETURN INFO TO JSB .XST DO CROSS MAP STORE DEF B,I * LDA $RQ.2 CHECK FOR Z-BIT ALF,SLA IN CONWD ?? JMP L.152 * NOTE: IF BIT BUCKET, DVTP DATA IS MEANINGLESS * LDB $RQCT MAKE SURE RQP5 WAS SUPPLIED ADB M4 SSB JMP L.RTN IT WASN'T - DON'T RETURN ANY MORE INFO LDA $DVTP,I GET $DVX LDB $RQP5 JSB .XST AND RETURN IN RQP5 DEF B,I * LDB $RQCT MAKE SURE RQP6 WAS SUPPLIED ADB M5 SSB JMP L.RTN IT WASN'T - DON'T RETURN ANY MORE INFO LDA $DVTP GET $DVX+1 INA LDA A,I LDB $RQP6 JSB .XST AND RETURN IN RQP6 DEF B,I JMP L.RTN * L.152 LDB $RQCT INSURE 5 PARMS LDA $RQ.6 ARE SUPPLIED ADB M5 & SSB,RSS BUFR LNG >=0 ? SSA JMP $ER01 NO, ERR:"IO01" * JSB .CAX COUNT TO .X. FOR MOVE WORDS LDB $XQT INSURE BUFFER EXISTS JSB $VBUF WITHIN PROGRAM OR DEF $RQP5,I WITHIN SYSTEM COMMON DEF $RQ.6 JMP $ER04 BAD BUFFER BOUNDS * LDA $DVTP MOVE DRIVER PARAMETERS LDB $RQP5 INTO USER'S BUFFER JSB .MWI JMP L.RTN 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 .10 DEC 10 .12 DEC 12 M3 DEC -3 M4 DEC -4 M5 DEC -5 M41 DEC -41 B50 OCT 50 B61 OCT 61 B77 OCT 77 B603 OCT 603 B7703 OCT 7703 B377C OCT 37700 B377K OCT 37777 C100K OCT 77777 IO07 ASC 2,IO07 $D$DV DEF BUCKT DUMMY DVT FOR BIT BUCKET SKP * * $XSIO - HERE FOR SYSTEM REQUESTS * * JSB $XSIO * DEF * NORMAL RETURN * * XSIO PARAMETER AREA: * DEC (BIT14="Q"=1 IF CALL FROM I/O SYS/DVR) * DEF * NOP * OCT * DEF (BUFFER) * DEC (BUFFER LENGTH) * DEC * DEC * DEC * DEC * DEC * DEC * * $XSIO NOP LDB $XSIO,I STB T3 KEEP ADDRESS OF XSIO PARAMETER BLOCK 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 ADB .3 COMPUTE ADDR OF STB T4 XLOG RETURN CCA ADA T3,I 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 T3,I GET LU WORD SSA WAS THIS A "Q" XSIO DE-Q? JMP IX.XS YES LDB $XSIO POINT TO XSIO CONTINUE ADDR INB SEZ LONE ITEM IN Q? JMP 1,I NO, TAKE EXIT NOW! SKP * $INIO STB $$RTN $$RTN FOR 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,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 * JSB SORCE STB $DV10,I LDA $DV15,I SEZ IOR .8 STA $DV15,I * LDB $DV1 JSB $SETM * LDB $DV1 CPB $D$DV IS THIS "BIT BUCKET" JMP LD.42 YES, GO TO LOG.DONE LDA $DV6,I CCE 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 T3,I STORE IN LU WORD JSB LINK ADD XSIO REQUEST TO SYS.DONE QUEUE DEF Q.SD LDB $XSIO POINT TO XSIO CONTINUE ADDR INB JMP 1,I RETURN IMMEDIATELY TO CALLER SPC 4 * DEVICE IS DOWN ADD XSIO BLOCK TO SYS DONE QUEUE - XLOG = 0 XDOWN CLA STA T4,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 * * PROVIDES AN ENTRY INTO $INIO FROM USER MAP * DONE FOR LA COMMAND * $UINI NOP LDB $UINI JMP $INIO 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 $DV15,I GET DVT WORD WITH TYPE ELB SEZ,RSS IS THIS A SSB NORMAL REQUEST?? JMP LD.35 NO - CLASS, BUFFERED, OR XSIO - PRINT MESSAGE LDB $DV2,I GET I/O CONTROL BLOCK ADDRESS RBL,CLE,ERB CLEAR SIGN BIT ADB .15 POSITION TO ID SEG WORD 16 LDB B,I AND GET IT RBL GET NO ABORT BIT TO 15 SSB REQUEST MADE NO ABORT?? JMP LD.36 YES - SKIP MESSAGE * LD.35 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 .9 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 LDB $DV1 STB $IF5,I JSB $SETR SET UP RELOCATION REGISTER 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 T3,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 T3 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 .9 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 SC.02 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 SC.04 DISALLOW P.F. OTA SC.02,C SET/ENABLE GLOBAL REG CLA LIA SC.02,C RE-READ GLOBAL REG SZA,RSS IS CARD THERE? JMP P.DV8 NO, CAN'T LEAVE GLOBAL REG INVALID STC SC.04 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 SC.02,C RESTORE IT STC SC.04 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 STA $DV17,I ZERO THE TRANSMISSION LOG 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 .14 DEC 14 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 * * $MPSQ - SETS UP 32 MAP REGISTERS BEGINNING WITH * A SPECIFIED PHYSICAL PAGE * * CALLING SEQUENCE: LDA PAGE * JSB $MPSQ * RETURN * * $MPSQ NOP CMA,INA MAKE STARTING PAGE NEGATIVE CPA $CMAP ALREADY SET UP? JMP $MPSQ,I YES - JUST RETURN STA $CMAP NO - CHANGE FLAG CMA,INA MAKE PAGE POSITIVE AGAIN * LDB $MAP ADDRESS OF MAP REGISTERS PEQLP STA B,I INB CPB $BASE SET UP MAPS UNTIL REACH JMP $MPSQ,I BEGINNING OF RELOCATION REGISTERS INA JMP PEQLP SPC 4 * * $SETM - SETS UP MAP REGISTERS PER A CURRENT REQUEST * ON A DVT * * CALLING SEQUENCE: B=DVT ADDRESS * JSB $SETM * RETURNS A & B UNCHANGED * * $SETM NOP STA ASAVE STB BSAVE * ADB .14 POSITION TO DVT15 LDB B,I CLA (FOR XSIO REQUEST) ELB,RBR UPPER BIT OF TYPE INDICATOR TO E RBR,RBR SOURCE OF DATA BIT (3) TO LSB RBR,SLB DATA IN SYSTEM OR USER AREA? RSS USER AREA JMP SET.2 DATA IN SYSTEM * LDB BSAVE DATA IN USER AREA INB GET I/O CONTROL BLOCK LDB B,I ADDRESS (ID ON NORMAL REQUEST) SEZ XSIO OR NORMAL REQUEST? JMP SET.1 XSIO REQUEST RBL,CLE,ERB JSB $MAPS NORMAL REQUEST. JUST CALL JMP EXIT $MAPS AND RETURN * SET.1 RBL,CLE,ERB ADB .7 XSIO REQUEST - GET STARTING LDA B,I PHYSICAL PAGE OF PARTITION SET.2 JSB $MPSQ LOAD MAPS SEQUENTIALLY * EXIT LDA ASAVE RESTORE LDB BSAVE REGISTERS AND JMP $SETM,I RETURN SPC 4 * * $SELR - SELECT RELOCATION REGISTER * * CALLING SEQUENCE: B = IFT ADDRESS * A = < ADDRESS OF REQUEST PARAMETERS > * JSB $SELR * RETURN * A = RELOCATION REGISTER NUMBER * $SELR NOP LDA A,I GET 1ST WORD OF REQUEST PARAMETERS RAR,RAR RAR,SLA DATA IN SYSTEM OR USER AREA? JMP SEL.1 USER AREA CLA SYSTEM - JUST RETURN 0 JMP $SELR,I * SEL.1 ADB .5 GET I/O CANNEL LDA B,I FROM IFT AND AND B77 MASK ADA M17B CALCULATE RELOCATION REGISTER NUMBER JMP $SELR,I SPC 4 * * $SETR - SET RELOCATION REGISTER * * CALLING SEQUENCE: B = DVT ADDRESS * JSB $SETR * RETURN * B = VALUE IN R.R. A = R.R. NUMBER * $SETR NOP STB BSAVE ADB .4 GET ADDRESS LDA B,I OF ASSOCIATED IFT ADA .5 LDA A,I GET I/O CHANNEL AND B77 AND MASK ADA M17B CALCULATE RELOCATION REGISTER NUMBER STA ASAVE * ADB M3 LDA B,I RAL,CLE,ERA * ADB .13 POSITION TO DVT15 LDB B,I ELB,RBR UPPER BIT OF TYPE TO E-REG RBR,RBR SOURCE OF DATA BIT (3) TO LSB RBR,SLB DATA IN SYSTEM OR USER AREA? JMP SER.1 USER AREA CLA DATA IN SYSTEM STA ASAVE (CLEAR FOR RETURN) CLB JMP SER.2 * SER.1 ADA .7 IF THIS IS AN XSIO REQUEST, LDB A,I B WILL HAVE STARTING PAGE OF PARTITION LDA BSAVE POSITION TO DVT10 ADA .9 SEZ,RSS XSIO OR NORMAL REQUEST? LDB A,I NORMAL - USE PAGE IN DVT10 LDA ASAVE GET RELOCATION REGISTER NUMBER * SER.2 ADA $BASE CONVERT TO ADDRESS STB A,I STUFF PHYSICAL PAGE IN R.R. LDA ASAVE RETURN WITH R.R NUMBER JMP $SETR,I IN A-REG SPC 4 * * $READ - READS ONE WORD OF DATA FROM SYSTEM OR USER AREA * ASSUMES THAT MAP REGISTERS ARE SET UP * * CALLING SEQUENCE: B = LOGICAL ADDRESS OF VALUE TO BE READ * JSB $READ * DEF < REQUEST PARAMETERS > * RETURN * A = VALUE READ B,E = UNCHANGED * * $READ NOP LDA $READ,I GET 1ST WORD OF PARAMETER AREA ISZ $READ JSB RESLV RESOLVE POSSIBLE INDIRECTS LDA A,I RAR,RAR CHECK SOURCE OF DATA BIT (3) RAR,SLA DATA IN USER OR SYSTEM AREA? JMP RD.1 IN USER AREA - GO DO CROSS-LOAD LDA B,I DATA IN SYSTEM - DO REGULAR LOAD JMP $READ,I AND RETURN * RD.1 JSB .XLA DEF B,I JMP $READ,I SPC 4 * * $WRIT - WRITES 1 WORD OF DATA INTO SYSTEM OR USER AREA * ASSUMES MAPS ARE SET UP * CALLING SEQUENCE: B = LOGICAL ADDRESS OF VALUE TO BE WRITTEN * A = VALUE TO BE WRITTEN * JSB $WRIT * DEF < REQUEST PARAMETERS > * RETURN * A,B,E UNCHANGED * $WRIT NOP STA ASAVE LDA $WRIT,I GET 1ST WORD OF REQUEST PARAMETERS ISZ $WRIT JSB RESLV RESOLVE POSSIBLE INDIRECTS LDA A,I RAR,RAR CHECK SOURCE OF DATA BIT (3) RAR,SLA DATA IN USER OR SYSTEM AREA? JMP WR.1 USER AREA - DO CROSS STORE LDA ASAVE STA B,I IN SYSTEM SO DO REGULAR STORE JMP $WRIT,I * WR.1 LDA ASAVE JSB .XST DEF B,I JMP $WRIT,I SPC 4 RESLV NOP SSA,RSS JMP RESLV,I ELA,CLE,ERA LDA A,I JMP *-4 SPC 4 * * $ONER - READS ONE WORD FROM DATA AREA * MAPS DO NOT HAVE TO BE SET UP * DVT ADDRESSES DO NOT HAVE TO BE SET UP * CALLING SEQUENCE: B = LOGICAL ADDRESS OF WORD TO BE READ * JSB $ONER * DEF < REQUEST PARAMETERS > * DEF < DVT > * RETURN * A = VALUE READ B UNCHANGED * $ONER NOP ERA SAVE CONTENTS OF E-REGISTER STA ESAVE STB BSAVE LDA $ONER GET 1ST WORD OF REQUEST PARAMETERS ISZ $ONER LDA A,I RAL,CLE,SLA,ERA JMP *-2 LDA A,I RAR,RAR CHECK SOURCE OF DATA BIT (3) RAR,SLA DATA IN SYSTEM OR USER AREA? JMP ONR.1 USER AREA LDA B,I SYSTEM, JUST LOAD JMP EX.R AND RETURN * ONR.1 LDA $ONER GET DVT ADDRESS LDA A,I RAL,CLE,SLA,ERA JMP *-2 INA LDB A,I I/O CONTROL BLOCK ADDRESS RBL,CLE,ERB ADB .9 IF THIS IS AN XSIO REQUEST B WILL LDB B,I CONTAIN STARTING PHYSICAL PAGE NUMBER ADA .13 POSITION TO DVT15 LDA A,I AND GET TYPE INFO SSA XSIO OR NORMAL REQUEST? JMP ONR.X XSIO REQUEST - ALL SET WITH B-REG * LDA $ONER GET DVT ADDRESS AGAIN LDA A,I RAL,CLE,SLA,ERA JMP *-2 ADA .9 GET PHYSICAL PAGE NUMBER LDB A,I FROM DV10 * ONR.X LDA BSAVE GET LOGICAL ADDRESS OF READ AND B76K MASK TO PAGE NUMBER ALF AND RIGHT JUSTIFY RAL,RAL ADB A ADD TO START PAGE OF PARTITION ADA $MAP GET ADDRESS OF MAP REGISTER STA MPREG TO BE CHANGED AND SAVE ADDRESS LDA MPREG,I GET CONTENTS STA MPSAV AND SAVE THEM STB MPREG,I PUT NEW VALUE IN MAP REGISTER JSB .XLA DO THE CROSS LOAD DEF BSAVE,I LDB MPSAV GET SAVED VALUE OF FIRST MAP REGISTER STB MPREG,I AND RESTORE IT * EX.R LDB ESAVE RESTORE E-REGISTER ELB LDB BSAVE ISZ $ONER JMP $ONER,I SPC 4 * * $ONEW - WRITES ONE WORD TO DATA AREA * MAPS DO NOT HAVE TO BE SET UP * DVT ADDRESSES DO NOT HAVE TO BE SET UP * CALLING SEQUENCE: B = LOGICAL ADDRESS OF WORD TO BE WRITTEN * A = VALUE TO BE WRITTEN * JSB $ONEW * DEF < REQUEST PARAMETERS > * DEF < DVT > * RETURN * A,B UNCHANGED * $ONEW NOP STA ASAVE ERA SAVE CONTENTS OF E-REGISTER STA ESAVE STB BSAVE LDA $ONEW GET 1ST WORD OF REQUEST PARAMETERS ISZ $ONEW LDA A,I RAL,CLE,SLA,ERA JMP *-2 LDA A,I RAR,RAR CHECK SOURCE OF DATA BIT (3) RAR,SLA DATA IN SYSTEM OR USER AREA? JMP ONW.1 USER AREA LDA ASAVE SYSTEM, JUST STA B,I STORE AND RETURN JMP EX.W * ONW.1 LDA $ONEW GET DVT ADDRESS LDA A,I RAL,CLE,SLA,ERA JMP *-2 INA LDB A,I I/O CONTROL BLOCK ADDRESS RBL,CLE,ERB ADB .9 IF THIS IS AN XSIO REQUEST B WILL LDB B,I CONTAIN STARTING PHYSICAL PAGE NUMBER ADA .13 POSITION TO DVT15 LDA A,I AND GET TYPE INFO SSA XSIO OR NORMAL REQUEST? JMP ONW.X XSIO REQUEST - ALL SET WITH B-REG * LDA $ONEW GET DVT ADDRESS AGAIN LDA A,I RAL,CLE,SLA,ERA JMP *-2 ADA .9 GET PHYSICAL PAGE NUMBER LDB A,I FROM DV10 * ONW.X LDA BSAVE GET LOGICAL ADDRESS OF WRITE AND B76K MASK TO PAGE NUMBER ALF AND RIGHT JUSTIFY RAL,RAL ADB A ADD TO START PAGE OF PARTITION ADA $MAP GET ADDRESS OF MAP REGISTER STA MPREG TO BE CHANGED AND SAVE ADDRESS LDA MPREG,I GET CONTENTS STA MPSAV AND SAVE THEM STB MPREG,I PUT NEW VALUE IN MAP REGISTER LDA ASAVE JSB .XSA DO THE CROSS STORE DEF BSAVE,I LDB MPSAV GET SAVED VALUE OF FIRST MAP REGISTER STB MPREG,I AND RESTORE IT * EX.W LDB ESAVE RESTORE E-REGISTER ELB LDB BSAVE ISZ $ONEW JMP $ONEW,I SPC 4 * * $VBUF - VALIDITY CHECK OF USER BUFFER * MAKES SURE BUFFER IS WITHIN USER PROGRAM SPACE * OR CONTAINED WITHIN SYSTEM COMMON * * CALLING SEQUENCE: B = ID SEGMENT ADDRESS * JSB $VBUF * DEF BUFFER (WILL RESOLVE INDIRECTS) * DEF BUF LENGTH (+WORDS OR -CHARS) * * RETURN P+1 NOT VALID * P+2 OK * * * FOUR CASES: * * 1. PROGRAM HAS NO SYSTEM COMMON - MAKE SURE BUFFER RESIDES * WITHIN THE PARTITION. * 2. PROGRAM HAS SYSTEM COMMON AND BUFFER STARTS BELOW SYSTEM * COMMON - TREAT AS CASE 1 BECAUSE DMA WILL BE TO USER SPACE * AND LOGICAL ADDRESS IS BEFORE SYSTEM COMMON. * 3. PROGRAM HAS SYSTEM COMMON AND BUFFER STARTS IN SYSTEM * COMMON - MAKE SURE BUFFER RESIDES ENTIRELY WITHIN SYSTEM * COMMON. * 4. PROGRAM HAS SYSTEM COMMON AND BUFFER STARTS BEYOND * SYSTEM COMMON - MAKE SURE BUFFER RESIDES WITHIN THE PARTITION. * * $VBUF NOP LDA $VBUF GET BUFFER ADDRESS ISZ $VBUF LDA A,I REMOVE ANY RAL,CLE,SLA,ERA INDIRECTS JMP *-2 STA ASAVE BUFFER ADDRESS * LDA $VBUF GET ADDRESS OF BUFFER LENGTH ISZ $VBUF LDA A,I REMOVE ANY RAL,CLE,SLA,ERA INDIRECTS JMP *-2 LDA A,I GET BUFFER LENGTH SSA +WORDS OR -CHARACTERS? CPA =B100000 JMP V.1 +WORDS ARS CONVERT TO +WORDS CMA,INA V.1 STA BSAVE BUFFER LENGTH IN WORDS * ADB .24 GET ID SEGMENT WORD 25 LDA B,I (SIZE IN PAGES-1) AND B76K MASK TO # WORDS IN PARTITION - 1024 ADB M9 LDB B,I STATUS WORD (16) FROM ID BLF SSB,RSS DOES THIS PROGRAM USE SYSTEM COMMON? JMP V.3 NO SYSTEM COMMON USED * LDB $LCOM HAS SYSTEM COMMON CMB,INB (-FIRST WORD SYSTEM COMMON) ADB ASAVE SSB JMP V.3 BUFFER IS BELOW SYSTEM COMMON CMB ADB $SC# $SC# = NUMBER OF WORDS IN COMMON SSB,RSS CLA BUFFER RESIDES IN SYSTEM COMMON ADA $SC# BUFFER IS ABOVE SYSTEM COMMON * V.3 ADA .1024 ADD BACK THE -1 PAGE OR BASE PAGE LDB BSAVE ADB ASAVE CMB,INB ADB A SSB BUFFER RESIDE ENTIRELY IN PTN OR SYS COM? CPB =B100000 ISZ $VBUF YES - STEP RETURN ADDRESS JMP $VBUF,I SPC 4 * * STPAG - ROUTINE TO RETURN STATUS OF PROGRAM AND STARTING * PHYSICAL PAGE OF THE PARTITION INTO WHICH IT IS * LOADED. * * CALLING SEQUENCE: B = ID SEGMENT ADDRESS * JSB STPAG * RETURN A = STATUS WORD FROM ID (16) * B = STARTING PAGE * * STPAG NOP ADB .15 POSITION TO ID SEGMENT WORD 16 STB BSAVE SAVE ADDRESS OF STATUS WORD ADB .10 GET NUMBER OF PARTITION THIS LDA B,I PROGRAM IS LOADED INTO AND B377 ADA M1 INDEX INTO MAT TABLE MPY $MASZ USING PARTITION NUMBER ADA $MATA AND GET STARTING ADA .2 PHYSICAL PAGE OF LDB A,I THIS PARTITION LDA BSAVE,I GET STATUS WORD JMP STPAG,I SPC 4 * * SORCE - DETERMINES THE SOURCE OF DATA, SYSTEM OR USER * AREA. ALSO CALCULATES THE VALUE TO BE PUT IN * DV10: 0 IF DATA FROM SYSTEM, A PAGE NUMBER IF * DATA IS FROM THE USER AREA OR SYSTEM COMMON AREA. * * CALLING SEQUENCE: ASSUMES DVT ADDRESSES ARE SET UP * JSB SORCE * RETURN E = 0/1 - SYSTEM/USER * B = VALUE FOR DV10 * * SORCE NOP CLB,CLE PRESET FOR FROM THE SYSTEM LDA $DV15,I GET TYPE INFO RAL SSA CLASS OR BUFFERED? JMP SORCE,I YES - RETURN WITH 'IN SYSTEM' * LDB $DV2,I GET I O CONTROL BLOCK ADDRESS ELB,CLE,ERB CLEAR SIGN BIT CLE,SLA,RSS XSIO REQUEST OR NORMAL REQUEST? JMP SRC.1 NORMAL * ADB .7 XSIO LDB B,I GET STARTING PHYSICAL PAGE SZB IF NON-ZERO CCE DATA IS IN USER AREA JMP SORCE,I * SRC.1 JSB STPAG NORMAL - GET STATUS WORD AND ALF STARTING PHYSICAL PAGE CCE,SSA,RSS DOES THIS PROGRAM USE SYSTEM COMMON? JMP SORCE,I NO * LDA $DV16,I HAS SYSTEM COMMON AND B377K ADDRESS AND MASK OFF BITS 14 AND 15 CMA ADA $LCOM FIRST WORD OF SYSTEM COMMON SSA,RSS JMP SRC.2 BUF NOT IN SYS COMMON ADA $SC# NUMBER OF WORDS IN SYSTEM COMMON CCE,SSA JMP SRC.2 BUF NOT IN SYS COMMON LDB $SC0 BUFFER IS IN SYSTEM COMMON JMP SORCE,I * SRC.2 LDA $SCPG GET NUMBER OF PAGES IN SYSTEM COMMON CMA,INA ADB A DV10 = STARTING PHYSICAL PAGE LESS CCE NUMBER OF PAGES OF SYSTEM COMMON JMP SORCE,I SPC 4 * * ASAVE NOP BSAVE NOP ESAVE NOP MPSAV NOP MPREG NOP M17B DEC -15 (-17 OCTAL) .24 DEC 24 B76K OCT 76000 M9 DEC -9 .1024 DEC 1024 * * 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