ASMB,Q,R,C
      HED RT4G5 - I/O TABLE GENERATION SEGMENT. 
      NAM RT4G5,5,90 92067-16320 REV.2001 790817
      SPC 1 
******************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
******************************************************************
      SPC 3 
******************************************************
* 
*   NAME:           RT4G5 
*   SOURCE PART #:  92067-18320 
*   REL PART #:     92067-16320 
*   WRITTEN BY:     JJC,KFH,JH,GAA
* 
******************************************************
      SPC 1 
* 
*   ENTRY POINT NAMES 
* 
      ENT \IOTB,\TBLS 
* 
*   EXTERNAL REFERENCE NAMES
* 
      EXT \LSTS,\TLST 
      EXT \LST1,\LST4,\LST5 
      EXT \IDXS,\IDX,\TIDN
      EXT \ID6,\ID8 
      EXT \IFIX,\FIX,\PFIX
      EXT \FIX1,\FIX2,\FIX3,\FIX4 
      EXT \LNKX,\LNK,\LNKS
      EXT \LNK1,\LNK2,\LNK3 
* 
      EXT \CURL,\CPL2,\TBUF 
      EXT \SYS,\USER
      EXT \SRET 
      EXT \OCTN,\CONV,\GETN,\GINT,\GET#,\GETC,\DCON 
      EXT \ADBP,\NABP,\CMFL 
      EXT \READ,\SPAC,\GNER,\INER,\ABOR,\MESS,\IRER 
      EXT \ABDO,\ADSK 
      EXT \SSID,\ASKY,\SKYA 
      EXT \PREL 
* 
A     EQU 0 
B     EQU 1 
      SUP 
************************************************************************
* 
      SKP 
*************************************************************************** 
* 
*                                                              780126 
* 
*    THE FOLLOWING BLOCK OF STORAGE FOR VARIABLES PRECEEDS, 
*    AND IS REFERENCED BY, EACH SEGMENT.  IT IS NOT OVERLAID
*    AS EACH NEW SEGMENT IS LOADED INTO MEMORY. 
* 
*    THE LOCATION OF EACH VARIABLE MUST BE THE SAME IN ALL
*    SEGMENTS.  IF A CHANGE IS MADE, MAKE THE SAME CHANGES
*    IN THE REST OF THE SEGMENTS. 
* 
*************************************************************************** 
* 
* 
TB30  BSS 160       TRACK MAP TABLE/HEADER RECORD BUFFER
* 
ILIST BSS 64        USER SYSTEM PROG IDENT ADDR LIST
CURIL BSS 1         CURRENT ILIST ADDRESS 
* 
SYSCH BSS 1         SUBCHANNEL OF SYSTEM UNIT.
DCHNL BSS 1         CHANNEL OF SYSTEM DISK UNIT 
AUXCH BSS 1         SUBCHANNEL OF AUX UNIT. 
DSIZE BSS 1         DISK SIZE -NO. OF TRACKS. 
#SUBC BSS 1         # DISC SUBCHANNELS DEF'D (7905/7920)
DAUXN BSS 1         AUXILIARY DISK SIZE.
ADS#  BSS 1         AUX DISC SECTORS/TRACK. 
* 
*             RELOCATION BASE TABLE.
RBTA  BSS 1         ABSOLUTE PROGRAM BASE.
TPREL BSS 1         CURRENT PROGRAM BASE ADDRESS. 
TPBRE BSS 1         BASE PAGE RELOCATION ADDRESS. 
COMAD BSS 1         CURRENT COMMON RELOCATION BASE. 
      BSS 1         ABS PROGRAM BASE FOR MR CODE. 
* 
WDCNT BSS 1         TEMPORARY WORD COUNTER. 
DSKSY BSS 1         INITIAL ID SEGMENT DISK ADDRESS 
IDSP  BSS 1         POSITION OF 1ST ID SEG. IN SECT 
TTYCH BSS 1         SYSTEM TTY CHANNEL NO.
* 
PLFLG BSS 1         PROGRAM LOAD. FLAG = -1/0 = L/NL
DSCNT BSS 1         DISK SEGMENT SECTOR COUNT 
* 
NXFLG BSS 1         ENT/EXT FLAG = -1/0 
EXCNT BSS 1         SYMBOL COUNTER
* 
LCNT  BSS 1         CURRENT \LBUF COUNT 
DCNT  BSS 1         CURRENT DBUF COUNT
CURAI BSS 1         CURRENT IBUF COUNT
* 
CPLS  BSS 1         ADDRESS OF TOP OF FIXED CP LINK IMAGE 
CPL1  BSS 1         ADDRESS OF LOW CURRENT PAGE LINK SPECS. 
CPL1H BSS 1         NUMBER OF CURRENT PAGE LINKS ASSIGNED 
CPL2H BSS 1         IN LOW AND HIGH AREA RESPECTIVELY 
URBP1 BSS 1         LWA R/T DISC RES BP LINK AREA 
CURAK BSS 1         CURRENT KBUF ADDRESS
* 
CURAT BSS 1         CURRENT \TBUF ADDRESS 
TCNT  BSS 1         CURRENT \TBUF COUNT 
* 
CURAP BSS 1         CURRENT PLIST ADDRESS 
* 
AMAD  BSS 1         CURRENT MLIST ADDRESS 
* 
IXCNT BSS 1         ID EXTENSION COUNT
IDEXC BSS 1         CURRENT ID EXT'S USED 
IDEX  BSS 1         ADDRESS OF ID EXTENSION TABLE 
* 
LICNT BSS 1         LONG ID SEGMENT COUNT 
SSCNT BSS 1         BG. SEG ID COUNT
* 
DSKID BSS 1         DISK ID SEGMENT ADDRESS 
KEYCN BSS 1         TOTAL KEYWORD COUNT 
KEYCT BSS 1         CURRENT KEYWORD COUNT 
* 
MLIST BSS 11        MEMORY MAP BUFFER 
* 
TEMP1 BSS 1 
TEMP2 BSS 1 
LWH1  BSS 1 
LWH2  BSS 1 
LWH3  BSS 1 
LWH4  BSS 1 
L01   BSS 1 
* 
FSYBP BSS 1         FIRST WORD SYS BP LINKAGE 
SYSAD BSS 1         CURRENT ID SEGMENT ADDRESS
* 
TBREL BSS 1         CURRENT BP RELOC ADDR 
PBREL BSS 1         INITIAL BP RELOC ADDR 
* 
RELAD BSS 1         CURRENT CORE RELOCATION ADDRESS 
* 
BSBAD BSS 1         BG SEGMENT BP RELOC ADDR
BSPAD BSS 1         BG SEGMENT PROG RELOC ADDR
* 
LFLAG BSS 1         PROGRAMS-LOADED FLAG
IMAIN BSS 1         CURRENT MAIN IDENT INDEX. 
HDFLG BSS 1         HEADING FORMAT FLAG 
CIDNT BSS 1         CURRENT MAIN IDENT INDEX. 
* 
AEQT  BSS 1         ADDRESS OF EQUIPMENT TABLE
CEQT  BSS 1         NO. ENTRIES IN EQUIPMENT TABLE
SPLCO BSS 1         SPOOL EQT COUNT 
DVMAP BSS 1         ADDRESS OF DRIVER MAP TABLE 
* 
DPFLG BSS 1         DP RELOCATION FLAG, 0=YES, -1=NO
DPLN BSS 1          PAGE LENGTH OF DRIVER PARTITION 
DPADD BSS 1         START ADDR OF DRIVER PARTITION
DSKDP BSS 1         DISK ADDRESS OF DP #2 
PAGE# BSS 1         NEXT PHYSICAL PAGE TO ALLOCATE
DPNUM BSS 1         CURRENT DP# -1, OR TOT DP PAGES 
SDID  BSS 1         IDENT IDEX OF SYS DISK DRIVER 
LWDP1 BSS 1         LAST WORD OF DP, +1 
FWSDA BSS 1         FIRST WORD OF SDA 
* 
ASQT  BSS 1         ADDR OF DEVICE REFERENCE TABLE
CSQT  BSS 1         NO. ENTRIES IN DEV. REF. TABLE
* 
AINT  BSS 1         ADDRESS OF INTERRUPT TABLE
* 
DSKIN BSS 1         DISK ADDR OF INT CODE RECORD
INTCN BSS 1         RECORD COUNT OF INT CODE
* 
IDSAV BSS 1         INDEX OF CURRENT IDENT. 
DSKMN BSS 1         INITIAL MAIN DISK ADDRESS 
BSSDP BSS 1         INITIAL DISK RES MAIN BSS DISP
PRENT BSS 1         PRIMARY ENTRY POINT 
DBLAD BSS 1         CURRENT DBL ADDRESS 
REKEY BSS 1         INSTRUCTION TYPE BYTE 
INSCN BSS 1         INSTRUCTION TYPE COUNTER
INSTR BSS 1         CURRENT INSTRUCTION 
PAGNO BSS 1         CURRENT PAGE NO.
OPRND BSS 1         CURRENT OPERAND 
PLGTH BSS 1         PROGRAM LENGTH
* 
DRT2  BSS 1         DISK DRT ENTRY ( SYSTEM)
DRT3  BSS 1         AUX DISK DRT ENTRY
* 
LIBFG BSS 1 
LDTYP BSS 1 
* 
SCH1  BSS 1         INDEX OF IDENT OF PGM TO BE SCHEDULED 
SCH3  BSS 1         ADDRESS OF CURRENT ID SEGMENT 
SCH4  BSS 1         ADDRESS OF THE SCHEDULED PGM ID SEG 
FGBGC BSS 1         BACKGROUND USING FG COMMON FLAG 
$LIBR BSS 1         INDEX OF $LIBR ENT
$LIBX BSS 1         INDEX OF $LIBX ENT
CUPRI BSS 1 
* 
BLLO  BSS 1         -(LOWER BUFFER LIMIT) 
BLHI  BSS 1         -(UPPER BUFFER LIMIT) 
* 
MEM6  BSS 1 
MEM12 BSS 1 
* 
COMRT BSS 1         MAXIMUM RT COM LENGTH 
COMBG BSS 1         MAXIMUM BG COM LENGTH 
COMSZ BSS 1         #WORDS COMMON DECLARED IN CURRENT MAIN
RTCAD BSS 1         RT COMMON ADDRESS 
BGCAD BSS 1         BG COMMON ADDRESS 
FPCOM BSS 1         FIRST PAGE OCCUPIED BY COMMON 
LPCOM BSS 1         LAST PAGE CONTAINING ANY COMMON 
* 
FPSAM BSS 1         1ST PAGE CONTAINING S.A.M.
FWSAM BSS 1         1ST WORD CONTAINING S.A.M.
SYMAD BSS 1         VALUE FOR AVMEM IN SCOM 
SAM#1 BSS 1         SIZE OF FIRST CHUNK OF SAM
SAM#2 BSS 1         SIZE OF SECOND CHUNK OF SAM 
SAM2P BSS 1         START PAGE OF SAM #2
LWTAI BSS 1         LAST WORD OF TABLE AREA I FOR SAM#0 
FWPRV BSS 1         FIRST WORD FOR PRIVILEGED PROGRAMS
* 
FWSYS BSS 1         FIRST WORD OF SYSTEM CODE 
LPSYS BSS 1         LAST PAGE CONTAINING SYS
LWSYS BSS 1         LAST WORD OF SYSTEM 
LPSLB BSS 1         LAST PAGE OF SLOW BOOT
LWSLB BSS 1         LAST WORD OF SLOW BOOT
MTYPE BSS 1         MAIN PROGRAMS'S TYPE
* 
HIBP  BSS 1         BP LINK MODE FOR FIXUP ENTRIES
LOLNK BSS 1         LOW LINK FOR SSGA,LIB, OR SYS 
HILNK BSS 1         HI LINK USED BY MEM RES PRG 
BPINC BSS 1         BP LINK ALLOCATION MODE, -1=DOWN,1=UP 
BPLMT BSS 1         LAST AVAIL BP LINK IN CURRENT MODE, +1
* 
TPMAX BSS 1         HWM FOR RELOCATION OF BG MAINS & SEGS 
MAXPT BSS 1         NUM PARTS. ALLOWED
MAT.  BSS 1         ADDRESS OF MEMORY ALLOCATION TABLE
* 
SSGA. BSS 1         FWA SSGA
MAP.  BSS 1         PTR TO MEU RES MAP
MPFT. BSS 1         PTR TO MPFT 
* 
EMLNK BSS 1         EMA SYMBOL'S LINK 
EMLST BSS 1         LST INDEX OF EMA SYMBOL 
EMDSK BSS 1         DISK ADDR OF EMA PROGRAM
* 
*     MEMORY RESIDENT AREA POINTERS 
* 
MRACM BSS 1         MR ACCESS COMMON FLAG (>0 IF YES) 
LBCAD BSS 1         FIRST WORD OF MEMORY RES LIBRARY
LEND  BSS 1         LAST  WORD OF MEMORY RES LIBRARY
FWMRP BSS 1         FIRST WORD OF MEMORY RES PROGRAM AREA 
EMRP  BSS 1         LAST  WORD OF MEMORY RES PROGRAM AREA 
FPMRP BSS 1         FIRST PAGE OF MEMORY RES PROGRAM AREA 
FPMBP BSS 1         PAGE # FOR MEMORY RES BASE PAGE 
MRP#  BSS 1         # PAGES OCCUPIED BY MRL & MRP'S 
DSKMB BSS 1         DISK ADDRESS OF MEMORY RES BASE PAGE
DSKMR BSS 1         DISK ADDRESS OF MEMORY RESIDENT LIB/PROG AREA 
DSKBP BSS 1         SYSTEM DISK ADDRESS 
* 
DSKAV BSS 1         NEXT AVAILABLE DISK ADDRESS 
DSKLC BSS 1         DISK ADDRESS OF LIBRARY CODE
DSKLB BSS 1         DISK ADDR OF LIBRARY ENTRY PTS
DSKUT BSS 1         UTILITY PROG DISK ADDRESS 
DSKBS BSS 1         DISK ADDR OF MAIN BG DISK RES BP
DSKBR BSS 1         CURRENT MAIN BG DISK RES DISK AD
ADICT BSS 1         ADDR OF DISK DICTIONARY 
LBCNT BSS 1         RESIDENT LIBR ENTRY PT COUNT
SYCNT BSS 1         SYSTEM ENTRY POINT COUNT
KEYAD BSS 1         CURRENT KEYWORD ADDRESS 
* 
SYBAD BSS 1         ADDR OF FIRST BP LINK FOR BG
IDSAD BSS 1         ADDR OF FIRST ID SEGMENT
ABSID BSS 1         IDENT ADDR FOR NEXT BG SEG SCAN 
IDMBS BSS 1         BG MAIN ADDRESS FOR BS REF
* 
SYTRK BSS 1         DISC ADDR WHERE SYSTEM BEGINS - TRACK 
SYSEC BSS 1         DISC ADDR WHERE SYSTEM BEGINS - SECTOR
* 
SSGAF BSS 1         SSGA ACCESS FLAG
SPAR2 BSS 1         SPARE VARIABLE
SPAR3 BSS 1         SPARE VARIABLE
SPAR4 BSS 1         SPARE VARIABLE
SPAR5 BSS 1         SPARE VARIABLE
* 
********************************************************* 
*                                                       * 
*  END OF COMMON STORAGE BLOCK FOR ALL SEGMENTS.        * 
*                                                       * 
********************************************************* 
* 
      SPC 4 
AILST DEF ILIST 
ATB30 DEF TB30
      SKP 
* 
*     NOTE THE FOLLOWING RESOLVES DEF'S TO EXTERNALS
* 
GIO   LDA N         GET LOOP COUNTER
      STA TEMP1     SAVE IN TEMP LOCATION 
      LDB LSTAA     GET ADDRESS OF WHERE LIST ROUTINE LOCATED 
LOOP  LDA B         HERE WE CHASE DOWN OUR OWN
      LDA A,I       INDRECTS
      RSS 
      LDA A,I 
      RAL,CLE,SLA,ERA 
      JMP *-2 
      STA B,I       AND SAVE IT AGAIN 
      INB 
      ISZ TEMP1     DONE? 
      JMP LOOP      NO
      JMP \SRET     RETURN TO MAIN. 
* 
      SPC 1 
N     DEC -1
LSTAA DEF *+1 
ATBUF DEF \TBUF+0 
      SKP 
*  THIS SECTION OF CODE GENERATES THE I/O TABLES FOR THE SYSTEM.
*  THESE INCLUDE THE EQUIPMENT TABLE (EQT), DEVICE REFERENCE
*  TABLE (DRT), INTERRUPT TABLE (INT), AND DRIVER MAP TABLE (DVMAP).
* 
*  THE EQT RECORDS HAVE THE FOLLOWING FORMAT: 
* 
*    N1,DVRN2<,D><,B><,T><,X><,S><,M> 
* 
*  N1 = CHANNEL NO. (2 OCTAL DIGITS)
*  N2 = DRIVER CLASS. CODE (2 OCTAL DIGITS) 
*  D = DMA FLAG (OPTIONAL)
*  B = BUFFERING FLAG (OPTIONAL)
*  T = TIME-OUT VALUE TO BE ENTERED 
*  X = EQT EXTENSION SIZE TO BE ENTERED 
*  S = SYSTEM DRIVER AREA 
*  M = SYSTEM DRIVER AREA WITH MAPPING
* 
*    IF T IS ENTERED, A VALUE FOR THE DEVICE'S TIME-OUT 
*    CLOCK MUST BE NEXT ENTERED IN RESPONSE TO: 
*                  ' T = '
*    THE OPERATOR MUST ENTER A POSITIVE DECIMAL NUMBER
*    OF UP TO FIVE DIGITS.  THIS IS THEN THE NUMBER OF
*    TIME BASE GENERATOR INTERRUPTS (10 MSEC INTERVALS) 
*    BETWEEN THE TIME IO IS INITIATED ON THE DEVICE AND 
*    THE TIME AFTER WHICH THE DEVICE SHOULD HAVE INTERRUPTED. 
*    IF THE DEVICE HAS NOT INTERRUPTED BY THIS TIME, IT 
*    IS CONSIDERED TO HAVE TIMED-OUT. 
* 
* 
*  EACH DRT RECORD CONSISTS OF A 2-DIGIT NO. SPECIFYING THE 
*  CORRESPONDING ENTRY IN THE EQUIPMENT TABLE 
*  AND AN OPTIONAL 1-DIGIT NO. SPECIFYING A 
*  SUBCHANNEL WITHIN THAT ENTRY.  FOR EXAMPLE, IN 
*  RESPONSE TO THE MESSAGE:  5 = ?, THE RESPONSE 6 INDICATES THAT 
*  THE LOGICAL UNIT NO. 5 IS TO USE DEVICE 6 IN EQT.
*  WHEREAS THE RESPONSE 6,2 INDICATES THAT THE
*  LOGICAL UNIT NO. 5 IS TO USE SUBCHANNEL 2 OF 
*  DEVICE 6 IN EQT. 
* 
* 
*  THE INT RECORDS HAVE ONE OF THE FOLLOWING FORMATS: 
* 
*    N1,EQT,N2
*    N1,PRG,NAME
*    N1,ENT,ENTRY 
*    N1,ABS,N3
* 
*  N1 = CHANNEL NO. (2 OCTAL DIGITS - MUST BE IN INCREASING ORDER)
*        EXCEPTION:    IF N1 = 04 (POWER - FAIL), 
*        THIS ENTRY DOES NOT HAVE TO BE IN ORDER.  ALSO,
*        ONLY AN ENT OR AN ABS TYPE ENTRY IS ACCEPTED 
*        FOR N1 = 04. 
*  N2 = EQT NO. 
*  NAME = PROGRAM NAME TO BE SCHEDULED
*  ENTRY = ENTRY POINT TO WHICH TRANSFER IS TO BE MADE
*  N3 = ABSOLUTE VALUE (6 OCTAL DIGITS) 
* 
* 
*       GENERATE EQUIPMENT TABLE (EQT)
* 
\IOTB NOP 
      JSB \SPAC     SEND A SPACE
      LDA PAGE#     CONVERT CURRENT PAGE #
      CMA,INA         TO DECIMAL ASCII
      LDB MS32A         AND STUFF IN MESSAGE. 
      JSB \CONV     STUFF.
      LDA P30 
      LDB MES32 
      JSB \MESS     PRINT: TABLE AREA I  <<PAGE XXXX>>: 
* 
      JSB \SPAC     MAKE IT LOOK NICE.
      LDA \PREL     SET STARTING ADDRESS
      STA AEQT      OF EQT'S
      CLA 
      STA CEQT      CLEAR NO. OF EQT ENTRIES
      STA SPLCO     CLEAR THE SPOOL EQT COUNT 
      STA BPONL    ?AND THE BASE PAGE ONLY FLAG 
      CCA           SET DRT2 AND
      STA DRT2      DRT3
      STA DRT3      TO IMPOSSIBLE NUMBERS 
      LDA ATB30 
      ADA P65       SET FOR HEADER RECORD 
      STA HEADR     STORAGE 
      JSB \SPAC 
      LDA P22 
      LDB MES25     MES25 = ADDR: EQT TABLE ENTRY 
      JSB \MESS     PRINT: EQUIPMENT TABLE ENTRY
* 
      JSB SFIX      GET A FIXUP ENTRY IF NEEDED 
SEQT  JSB \SPAC     SEND \SPAC
      LDA CEQT
      CPA P63       OVER LAST ALLOWED DEFINITION? 
      JMP BLEQT     YES, MAX OF 63
      CMA 
      LDB ATBUF     THE CURRENT EQT 
      JSB \CONV     NUMBER TO ASCII 
      LDA \TBUF+2    SET IN THE 
SETNO STA MESEQ     EQT MESSAGE BUFFER
      LDA P7        GET MESSAGE LENGTH
      LDB MESQE     SEND MESSAGE "EQT XX?" AND
      JSB \READ      GET EQT RECORD FROM TTY
      LDA N2
      JSB \GETN     MOVE 2 CHARS TO \TBUF 
      CPA "/E"      CHARS = /E? 
      JMP EQTFX     YES - SET DEVICE REF TABLE (SQT)
* 
      LDA CEQT      GET NUMBER OF DEFINED EQT'S 
      CPA P63       IF OVER LIMIT 
      JMP EQTOV     THEN SEND ERROR UNTIL /E
      JSB \GINT     RE-INITIALIZE LBUF SCAN 
      LDA P2
      JSB \GET#     GET 2 OCTAL DIGITS, CONVERT 
      JMP IOERR     INVALID DIGIT 
      JSB \GETC     GET NEXT CHAR FROM LBUF 
      CPA BLANK     CHAR = COMMA? 
      JMP CLDBU     YES - SET CHNL NO., CLEAR D,B,U 
* 
IOERR LDA ERR24     SET CODE = INVALID CHNL IN EQT
      JSB \GNER     PRINT DIAGNOSTIC
      JMP SEQT      GET NEXT EQT RECORD 
* 
BLEQT LDA BLNKS     SET EQT # TO BLANKS 
      JMP SETNO     IN PROMPT 
* 
EQTOV LDA ERR35     SET CODE = OVER 63 DEFINED EQT'S
      CMA,INA       SIGNAL NO TR TO THE OPERATOR
      JSB \GNER     PRINT THE DIAGNOSTIC
      JMP SEQT      CONTINUE UNTI /E ENTERED
* 
CLDBU LDB \OCTN     GET I/O CHANNEL NO. 
      STB IOADD     SET I/O ADDRESS 
      CLA 
      STA IODMA     CLEAR DMA FLAG
      STA IOBUF     CLEAR AUTOMATIC BUFFERING FLAG
      STA IOSDM     CLEAR SDA/MAPPING WORD
      STA XLNTH     CLEAR EXTENSION LENGTH
      STA \FIX3,I    CLEAR THE
      STA \FIX4,I    FLAG WORDS 
      STA \FIX2,I 
      STA TVAL      AND TIME OUT VALUE
      CCA 
      STA TFLAG     CLEAR TIME-OUT FLAG 
      LDA N2
      JSB \GETN     MOVE 2 CHARS TO \TBUF 
      CPA "DV"      CHAR = "DV"?
      CLA,INA,RSS   YES - CONTINUE
      JMP DVERR     INVALID DRIVER NAME 
      JSB \GETN     MOVE 1 CHAR TO \TBUF (CHAR 3) 
      JMP STYPE      GET DRIVER TYPE
* 
DVERR LDA ERR25     SET CODE = INVALID DRIVER NAME
      JSB \GNER     PRINT DIAGNOSTIC
      JMP SEQT      GET NEXT EQT RECORD 
* 
STYPE STA X.        SAVE KEY CHARACTER (R FOR STD.) 
      LDA N2
      JSB \GETN     MOVE 2 CHARS TO \TBUF 
      STA .YY       SAVE 2 ASCII CHARS FOR I.XX,C.XX
      CCA 
      ADA \CURL     ADJUST CURRENT LBUF ADDR
      STA \CURL     RESET \CURL TO CONVERT TYPE 
      LDA P2
      JSB \GET#     GET 2 OCTAL CHARS, CONVERT
      JMP DVERR     INVALID DRIVER NAME 
* 
      LDB \OCTN     GET DRIVER TYPE 
      BLF,BLF       ROTATE TO UPPER B 
      STB IOTYP     SET DRIVER TYPE 
      JSB \GETC     GET NEXT CHAR FROM LBUF 
      CPA ZERO      END OF BUFFER?
      JMP GENEQ     SCAN FOR I.XX, C.XX 
      CPA BLANK     CHAR = COMMA? 
      RSS           YES - CONTINUE
      JMP DVERR     NO - INVALID DRIVER NAME
* 
      CCA 
      STA \FIX1,I 
      STA DFLAG     SET DMA-IN FLAG 
      STA BFLAG     SET BUFFERING-IN FLAG 
      STA XFLAG     SET EQT EXTEND FLAG 
      STA SFLAG     SET SDA FLAG
      STA MFLAG     SET MAPPING FLAG
* 
INDBU CCA 
      STA \CMFL     SET COMMA FLAG = NO COMMA IN
      JSB \GETC     GET NEXT CHAR FROM LBUF 
      CPA "D"       CHAR = D? 
      JMP SEDMA     YES - SET DMA CODE
* 
      CPA "B"       CHAR = B? 
      JMP SETBU     YES - SET BUFFERING CODE
* 
      CPA "T"       CHAR = T? 
      JMP SETIM      YES - SET TIME-OUT FLAG
* 
      CPA "X"       CHAR = X? 
      JMP SETEX     YES GO SET UP EQT EXTENSION 
* 
      CPA "S"       CHAR = S? 
      JMP SETSD     YES - SET SDA CODE FOR DVMAP
* 
      CPA "M"       CHAR = M? 
      JMP SETSM     YES = SET SDA/MAPPING CODE FOR DVMAP
* 
UNERR LDA ERR26     SET CODE = INVALID D,B,T,X
      JSB \GNER     PRINT DIAGNOSTIC
      JMP SEQT      GET NEXT EQT RECORD 
* 
SETIM ISZ TFLAG     SKIP - FIRST T ENTERED
      JMP UNERR     DUPLICATE T'S ENTERED 
      JMP TEQU      GET THE TIME OUT VALUE
* 
* 
EQTST JSB \GETC     GET NEXT CHAR FROM LBUF 
      CPA ZERO      END OF BUFFER?
      JMP GENEQ     SCAN FOR I.XX, C.XX 
* 
      CPA BLANK     CHAR = COMMA? 
      JMP INDBU     YES - GET NEXT D,B,U, ENTRY 
      JMP UNERR     NO - INVALID D,B,U CHARACTER
* 
SEDMA ISZ DFLAG     SKIP - FIRST D ENTERED
      JMP UNERR     DUPLICATE D'S ENTERED 
* 
      LDA MSIGN     SET BIT 15 = 1 FOR DMA FLAG 
      STA IODMA     SET DMA CODE
      JMP EQTST     TEST FOR NEXT OPERAND 
* 
SETBU ISZ BFLAG     SKIP - FIRST B ENTERED
      JMP UNERR     DUPLICATE B'S ENTERED 
* 
      LDA BIT14     SET BIT14 = 1 
      STA IOBUF     SET AUTOMATIC BUFFERING CODE
      JMP EQTST     TEST FOR NEXT OPERAND 
* 
SETSD ISZ SFLAG     SKIP - FIRST S ENTERED
      JMP UNERR     DUPLICATE S'S ENTERED 
* 
      LDA BIT14     SET BIT 14 = 1
      JMP SETS2     IN IOSDM FOR DVMAP
* 
SETSM ISZ MFLAG     SKIP - FIRST M ENTERED
      JMP UNERR     DUPLICATE M'S ENTERED 
* 
      LDA BIT13     SET BIT 13 (MAPPING)
      IOR BIT14     AND BIT 14 (SDA) TO 1 
SETS2 IOR IOSDM     IN WORD FOR DVMAP 
      STA IOSDM 
      JMP EQTST     TEST FOR NEXT OPERAND 
* 
SETEX ISZ \FIX1,I    SKIP FIRST X ENTERED 
      JMP UNERR     NO BITCH
* 
TEQU  STA I.XX      SAVE THE TYPE FLAG
      JSB \GETC     GET THE NEXT CHARACTER
      CPA EQU       IF NOT "="
      RSS 
      JMP UNERR     BITCH 
* 
      LDA N5        GET DECIMAL NUMBER
      JSB \GET# 
      JMP UNERR     ILLEGAL NUMBER SO BITCH 
* 
      LDB I.XX      GET THE TYPE FLAG 
      CPB "X"       IF EXTENSION
      JMP QEXT      SAVE THE LENGTH OF THE EXTENSION
      STA TVAL      SET THE TIME OUT VALUE
      JMP EQTST     GO GET THE NEXT OPERAND 
* 
QEXT  STA XLNTH     SAVE EXTENSION SIZE 
      STA \FIX3,I   FOR BUILDING IT 
      LDB \PREL     SET ADDRESS OF
      ADB P12       EQT 13
      STB \FIX2,I   FOR LATER FIXUP 
      JMP EQTST     GET NEXT OPERAND
* 
GENEQ LDA X.        GET THE KEY CHARACTER 
      STA SFLAG     AND SAVE  **TEMPORAY**
      CPA "R"       IF R THEN USE 
      LDA "."       A PERIOD. 
      IOR "INL"     SET "I" IN UPPER HALF 
      STA X.        SET FOR LST SEARCH
      LDB ENT       GET ADDRESS 
      JSB \LSTS      LOOK FOR SYMBOL
      JMP DVERR     ILLEGAL DRIVER ENT NOT FOUND. 
* 
      LDA \LST4,I   RETRIEVE IDENT INDEX OF 
      STA \TIDN     DRIVER MAIN, AND
      JSB \IDX      SET IT UP 
      JSB \ABOR     BETTER BE THERE!
      LDA \ID6,I    MUST BE A TYPE 0 MODULE 
      AND M177
      SZA 
      JMP DVERR     ELSE ERROR
* 
      LDB IOADD     GET CHANNEL # 
      CPB DCHNL     WAS IT THE SYSTEM DISC
      RSS           CHANNEL?
      JMP COMPS     NO
      CLA           MAKE SURE SDA 
      JMP CHSM      WASN'T SPECIFIED FOR IT 
* 
COMPS LDA \ID8,I    WAS AN EQT PREVIOUSLY 
      SSA,RSS       DEFINED FOR THIS DRIVER?
      JMP SETFX     NO, SO NEEDN'T CHECK
      AND SMBIT     THE S,M SPECIFICATIONS
CHSM  CPA IOSDM     (OR ABSENCE OF EITHER/BOTH) 
      JMP SETFX     OK, NEW CONFORMS WITH OLD, DISC NOT SDA 
* 
      LDA ERR23     SET CODE = EQT DOESN'T DEFINE 
      JSB \GNER     SAME S,M SPECS FOR DRIVER  - OR THE 
      JMP SEQT       SYSTEM DISC WAS SPECIFIED AS SDA 
* 
SETFX JSB SFIX     GET A NEW FIXUP ENTRY
      LDA HIDIR     SET 0 INSTR, HIBP BIT, DIRECT ADDR
      STA \FIX2,I 
      CLA 
      STA \FIX3,I   CLEAR OFFSET
      CCA           SET 
      ADA \TLST     LST INDEX OF
      STA \FIX4,I   I.XX
      STA TEMP2     SAVE FOR NOCXX
      LDA \PREL     GET EQT2 ADDRESS WHERE
      INA           I.XX ADDRESS IS TO BE 
      STA \FIX1,I   STORED DURING FIXUP 
* 
      JSB SFIX     GET A NEW FIXUP ENTRY
      LDA HIDIR     SET 0 INSTR CODE, HIBP BIT, 
      STA \FIX2,I   AND DIRECT ADDRESS
      CLA 
      STA \FIX3,I   CLEAR OFFSET
      LDA \PREL     SET EQT3 ADDRESS
      ADA P2        WHERE C.XX ADDRESS IS TO BE 
      STA \FIX1,I   STORED DURING FIXUP 
* 
      LDA X.        GET THE I. OR WHAT EVER 
      XOR B5000     CHANGE IT TO C. OR WHAT EVER
      STA X.        AND RESET 
      LDB ENT       SCAN THE LST
      JSB \LSTS      FOR THE "C.YY" ENTRY POINT.
      JMP NOCXX     C.XX NOT FOUND IN LST 
      CCA           SET LST 
      ADA \TLST     INDEX OF C.XX 
* 
STCXX STA \FIX4,I   IN FIXUP ENTRY
      LDA X.        IF THIS IS
      CPA "CS"      DVS43 THEN
      LDA .YY       COUNT 
      CPA "43"      A 
      ISZ SPLCO     SPOOL EQT 
* 
      LDA IOADD     SAVE THE CHANNEL AND
      AND M377      TYPE IN THE HEADER
      ALF,ALF       RECORD
      LDB IOTYP 
      BLF,BLF 
      IOR B 
      STA HEADR,I 
      ISZ HEADR 
* 
      CLA 
      LDB \PREL     GET THE ADDRESS 
      JSB \ABDO     PUT OUT I/O LIST POINTER
      CLA           ENTRY POINT TO BE FIXED UP
      JSB \ABDO     OUTPUT ABSOLUTE DVRXX ENT ADDR
      LDA C.XX      GET DRIVER EXIT POINT 
      JSB \ABDO     OUTPUT ABSOLUTE DVRXX COMP. ADDR
      LDA IODMA     GET DMA CODE
      IOR IOBUF     ADD BUFFERING CODE
      IOR IOADD     ADD CHANNEL NO. 
      JSB \ABDO     OUTPUT D,B,U, CHANNEL 
* 
      LDA IOTYP     GET EQUIPMENT TYPE CODE 
      AND M7000     ISOLATE UPPER 7 BITS
      SZA           SKIP - TYPE = 0,1 
      CLA,RSS       SET STATUS = 0, SKIP
      LDA BLANK     SET STATUS = 40(8)
      IOR IOTYP     ADD EQUIPMENT TYPE CODE 
      JSB \ABDO     OUTPUT EQUIPMENT TYPE, STATUS 
* 
      ADB P6        INDEX TO EQT12
      LDA XLNTH      GET EXTENSION SIZE 
      JSB \ABDO     AND SEND IT TO THE DISC 
      INB           STEP TO EQT14 
      LDA TVAL      GET THE TIME OUT VALUE
      SZA           IF ZERO LEAVE IT
      CMA           ELSE SET IT TO ONES COMPLEMENT
      JSB \ABDO     SEND TIME OUT TO EQT
      INB           SET THE ADDRESS 
      STB \PREL     OF THE NEXT EQT 
* 
      LDB DDVMP     GET DVMAP BUFFER ADDRESS
      ADB CEQT      FOR STORAGE 
      LDA IOSDM     SET POSSIBLE S,M BITS 
      IOR MSIGN     AND EQT DEFINED BIT 
      IOR \ID8,I
      STA \ID8,I    IN DRIVER IDENT 
      RAL           POSITION S BIT TO 15
      SSA           SKIP IF NOT SDA 
      JMP SDAEQ     GO SET DVMAP ENTRY FOR SDA DRIVER 
* 
      CCA           GET DRIVER IDENT INDEX
      ADA \TIDN     FOR SCAN ON RELOCATION
      IOR BIT14     SET TO DISTINGUISH FROM SDA,PAGE # IN ENTRY 
      STA B,I       AND STORE IN DVMAP ENTRY
      JMP NEXTE     SET UP FOR NEXT EQT 
* 
SDAEQ STB MFLAG     SAVE DVMAP ENTRY ADDR **TEMP**
      LDB MSIGN     BIT 15 MUST BE SET FOR SDA
      RAL           POSITION M BIT TO 15
      SSA           SKIP IF NO MAPPING
      INB           SET BIT 0 IF DRIVER MAPS
      STB MFLAG,I   AND STORE IN DVMAP
* 
NEXTE JSB SFIX      GET A NEW FIXUP TABLE ENTRY IF NEEDED 
      ISZ CEQT      INCR EQT ENTRY COUNT
      JMP SEQT      PROCESS NEXT EQT RECORD 
* 
                                                                                                                                