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 <XSIO PARAMETER AREA> 
*       NORMAL RETURN 
* 
*                  XSIO PARAMETER AREA: 
*                  DEC <LU>  (BIT14="Q"=1 IF CALL FROM I/O SYS/DVR) 
*                  DEF <COMPLETION ADDR>
*                  NOP <LIST LINKAGE> 
*                  OCT <I/O CONTROL WORD> 
*                  DEF <PARM1>    (BUFFER)
*                  DEC <PARM2>    (BUFFER LENGTH) 
*                  DEC <PARM3>
*                  DEC <PARM4>
*                  DEC <PRIORITY> 
*                  DEC <STARTING PHYSICAL PAGE OF PARTITION>
*                  DEC <STATUS RETURN>
*                  DEC <TRANSMISSION LOG> 
* 
* 
$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 <Q-HEAD ADDR> 
*     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 <Q-HEAD ADDR> 
*     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 
                                              