ASMB,R,L,C   FH-RTGEN   DRIVER SECTION. 
      HED FH RTGEN DRIVER SECTION 
*     NAME:   FHDVR 
*     SOURCE: 92001-18017 
*     RELOC:  92001-16017 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975.  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 FHGEN 92001-16017 REV 1529 DATE CODE 750630 
      SUP 
* 
*     CONSTANTS ARE EXTERNAL ON BASE PAGE 
* 
      EXT N1,N2,N3,N4,N5,N6,N8,N9,N10,N16,N27 
      EXT N64,P2,P3,P4,P5,P6,P7,P8,P9,P11,P12,P13,P14 
      EXT P15,P16,P17,P18,P19,P20,P21,P22,P23,P24,P25 
      EXT P28,P29,P31,P33,P60,P64,P99,P202,P6K,L60,L2000
      EXT M60,M77,M120,M177,M377,M777,M400,D128,M200,M0760
      EXT M1740,M1600,M1777,M2000,M1377,M7400,M7000,M7600 
      EXT M7700,M7777,M0300,M1177 
      EXT DPWRS,P0100,P1000,P100,P10,P1 
      EXT OPWRS,M0100,M1000,M100,M10
      EXT LWASM,PPREL,PPREL,BLANK,UBLNK,MSIGN,RPARB 
      EXT DSKA,MOVW 
* 
*     ENTRY POINTS FOR THIS MODULE
* 
*     VARIABLES ... 
* 
      ENT SYSCH     SYSTEM SUBCHANNEL 
      ENT AUXCH     AUX DISC SUBCHANNEL 
      ENT DSIZE     SYSTEM DISC SIZE (TRACKS) 
      ENT DAUXN     AUX DISC SIZE (TRACKS)
      ENT DSETU     INITILIZE SUBROUTINE
      ENT DSKSC     SCRATCH DISC ADDRESS
      ENT LSSYS,LSAUX  LAST SEEK FLAGS
      ENT DISKA     INCREMENT DISC ADDRESS SUBROUTINE 
      ENT DISKO     DISC OUTPUT ROUTINE 
      ENT DISKI     DISC INPUT ROUTINE
      ENT DSTBL     GENERATE DISC TABLE SUBROUTINE
      ENT TRTST     TEST CURRENT TRACK SUBROUTINE 
      ENT DTSET     SET UP TAT SUBROUTNE
      ENT SDS#      SYSTEM DISC SECTORS/TRACK 
      ENT ADS#      AUX DISC SECTORS/TRACK
      ENT FSECT     FLUSH FINAL SECTOR FROM CORE
      ENT DERCN     DISC ERROR COUNT
      ENT DBPO      ORG OF DUMMY BASE PAGE
      ENT DSKAB     INITIAL ABS DISC ADDRESS
      ENT PTBOT     CONFIGURE DISC/ PUNCH BOOT
* 
*     UTILITY SUBROUTINES 
* 
      EXT DOCON,SPACE,READ,GETNA,GINIT,GETOC,GETAL
      EXT INERR,YE/NO,LSTS,ERROR,LSTE,LABDO,IRERR 
      EXT OUTID,CONVD 
* 
A     EQU 0 
B     EQU 1 
DRKEY EQU 102B      TTY ADDRESS 
      SPC 3 
BEGIN EQU *         START OF PROG.
      SPC 1 
TBUF  BSS 5         TEMP BUFFER 
TBCHN BSS 1         TEMP
DRHSP EQU 103B      PUNCH ADDRESS 
* 
*     DEFINE LST ADDRESSES
* 
LST   EQU 7         LST IS FIXED ON BASE PAGE 
LST1  EQU LST 
LST2  EQU LST+1 
LST3  EQU LST+2 
LST4  EQU LST+3 
LST5  EQU LST+4 
DSKAB OCT 4         INITIAL DISC ADDRESS FOR SYS CODE 
ASBUF DEF ASPBF+1   ADDRESS OF 9-WORD BUFFER IN BOOT
ABOOT DEF START     ADDRESS OF BOOTSTRAP LOADR
LSAUX NOP 
LSSYS EQU *-1 
DSIZE BSS 1         DISK SIZE - NO. OF TRACKS 
DSKSC BSS 1         ADDRESS OF DISK SCRATCH AREA
DAUXN BSS 1         AUXILIARY DISK SIZE 
SDS#  BSS 1         # SECTORS/TRACK FOR SYSTEM DISC$
ADS#  OCT 0         # SECTORS/TRACK FOR AUX. DISC 
DERCN BSS 1         DISK ERROR COUNTER
SYSCH NOP           SUBCHANNEL OF SYSTEM UNIT 
AUXCH NOP           SUBCHANNEL OF AUX UNIT
PTRAK NOP           NUMBER OF PROTECTED TRACKS
* 
DBP   EQU *         START OF DUMMY BASE PAGE
DBPO  EQU DBP       DEFINE ENTRY POINT
* 
INTMP BSS 1         TEMP FOR INITILIZATION ROUTINES 
* 
MES50 DEF *+1 
      ASC 7,START SCRATCH?
MES40 DEF *+1 
      ASC 8,# SECTORS/TRACK?
* 
      HED FH RTGEN DRIVER SECTION  INTERACTIVE CODE 
* 
* 
DSETU NOP           ENTRY POINT FOR QUESTION SECESSION. 
CHNLD LDA P13 
      LDB MESS2     MESS2 = ADDR: DISK CHNL?
      JSB READ      PRINT MESSAGE, GET REPLY
      LDA P2        SET FOR 2 OCTAL DIGITS INPUT
      JSB DOCON     GET DIGITS, RETURN OCTAL
      JMP CHNLD     REPEAT INPUT
* 
      STA DCHNL     SET DISK CHANNEL NUMBER 
* 
      SPC 1 
      JSB SPACE 
ISYSC LDA P14       SEND MESSAGE: 
      LDB MESS1     SYS DISK SIZE?
      JSB READ      GET ANSWER
      LDA N3        THREE DIGIT DECIMAL 
      JSB DOCON     GO CONVERT
      JMP ISYSC     ERROR - TRY AGAIN 
* 
      STA DSIZE     SET SYSTEM SIZE 
      SPC 1 
      JSB SPACE 
STREL LDA P14 
      LDB MES50     MES50 = ADDR: START SCRATCH?
      JSB READ      PRINT MESSAGE, GET REPLY
      LDA N3        SET FOR 3 DECIMAL DIGITS INPUT
      JSB DOCON     GET DIGITS, RETURN OCTAL
      JMP STREL     REPEAT INPUT
* 
      LDB DSIZE     GET DISC SIZE 
      CMB,INB       IF INPUT NOT GREATER
      ADB A         THAN DISC 
      SSB           SIZE
      JMP STREM     SKIP
* 
      JSB INERR     ELSE ERROR
      JMP STREL     TRY AGAIN 
* 
STREM SZA           IF SYSTEM AND ZERO SKIP 
      RAL,SLA       ELSE MULTIPLY BY TWO
      LDA DSIZE     ZERO ON SYSTEM - USE UPPER HALF SYSTEM
      ALF,ALF       ROTATE TO 
      RAR,RAR       TRACK LOCATION
      AND M7600     MASK TO TRACK 
      STA DSKSC     SET START SCRATCH 
* 
      JSB SPACE     SET NO. PROTECTED 
PROTD LDA P14 
      LDB MES21     'NO. PROTECTED?'
      JSB READ      PRINT MESSAGE, GET REPLY
      LDA N2        SET FOR 2 DIGIT DECIMAL INPUT 
      JSB DOCON     GET DIGITS
      JMP PROTD     IF ERROR REPEAT 
* 
      STA PTRAK     SET NO. PROTECTED TRACKS
* 
* 
      JSB SPACE     GET # SECTORS FOR SYSTEM DISC 
#SEC1 LDA P16 
      LDB MES40     '# SECTORS/TRACK?'
      JSB READ      PRINT MESSAGE, READ REPLY 
      LDA N3        SET FOR 3 DECIMAL DIGIT INPUT 
      JSB DOCON     GET DIGITS
      JMP #SEC1     IF ERROR REPEAT 
* 
      STA SDS#      SET # SECTORS FOR SYSTEM DISC 
* 
*                                   GET AUXILIARY DISK SIZE 
      JSB SPACE     NEW LINE
AUXDS LDA P14 
      LDB MES33     MES33 = ADDR: AUX DISK SIZE?
      JSB READ      PRINT MESSAGE, GET READ 
      LDA N3        SET FOR 3 DECIMAL DIGITS INPUT
      JSB DOCON     GET DIGITS, RETURN OCTAL
      JMP AUXDS     REPEAT INPUT
* 
      STA DAUXN     SET AUXILIARY DISK SIZE 
      SZA,RSS       IF AUX. DISC NOT PRESENT, 
      JMP DSETU,I    SKIP # OF SECTORS INPUT. 
* 
*                                  GET # SECTORS FOR AUX. DISC
      JSB SPACE     NEW LINE
#SEC2 LDA P16 
      LDB MES40     REPEAT
      JSB READ       # SECTORS
      LDA N3         MESSAGE AND
      JSB DOCON      INPUT. 
      JMP #SEC2 
      STA ADS#      SET # SECTORS OF SYSTEM DISC
      JMP DSETU,I   RETURN TO MAIN GENERATOR
* 
      HED FH RTGEN DRIVER SECTION  CONFIGURE DRIVERS AND BOOTSTRAPS 
PTBOT NOP 
* 
*                                   CONFIGURE DISK I/O INSTRUCTIONS 
* 
      LDA N5
      LDB HPDSK     GET HIGH PRIORITY ADDRESSES 
      JSB STDSK     SET HIGH PRIORITY CHANNEL NOS.
* 
      ISZ DCHNL     SET DISK CHNL NO. TO L.P. 
* 
      LDA N9
      JSB STDSK     SET LOW PRIORITY DISK ADDRESSES 
* 
      CLA 
DSK5  OTA 0         SET DISK ADDRESS = 0,0
DSK6  LIA 0         GET STATUS WORD 
      AND P4        ISOLATE PROTECT BIT 
      SZA           SKIP - TRACK IS PROTECTED 
      JMP PTB1
* 
      JSB SPACE     NEW LINE
      LDA P33 
      LDB MES32     MES32 = ADDR: TURN OFF DISK ETC.
      JSB DRKEY,I   PRINT: TURN OFF DISK PROTECT
      HLT 32B       WAIT FOR OPERATOR 
      JMP DSK6       REPEAT CHECK 
* 
PTB1  LDA ASPBF     GET ADDRESS OF BOOTSTRAP BUFFER 
      AND M1777     ISOLATE PAGE BITS 
      STA B 
      LDA LWASM     GET LWA SYSTEM MEMORY 
      AND M0760     ISOLATE PAGE NUMBER 
      STA TBUF      SAVE PAGE NO. OF BOOTSTRAP LDR
      IOR B         SET A = NEW BUFFER ADDRESS
      STA ASPBF     SET BUFFER ADDR IN BOOTSTRAP
      LDA SDS#      SET # OF SECTORS -1 FOR 
      ADA N1         SYSTEM DISC IN 
      STA #SECT      BOOTSTRAP LOADER.
      CPA M177      IF 128 SECTORS/TRACK
      JSB FS128     MAKE A FAST BOOT
      CMA,INA 
      AND M177      CONSTRUCT AND SET UPDATE TRACK
      STA #MASK      # WITH SECTOR 0 VALUE. 
      CLA,INA       SET DISK ADDRESS = 0,1
      LDB ABOOT     GET ADDRESS OF BOOTSTRAP
      JSB DISKO     OUTPUT BOOTSTRAP TO 0,1 
* 
      CLA           SET DISK ADDRESS = 0,0
      LDB ADBUF     GET ADDRESS OF DBUF 
      JSB DISKI     READ DISK 0,0 
      LDB ADBUF     GET ADDRESS OF DBUF 
      ADB P3        ADJUST FOR 4TH WORD IN 0,0
      LDA B,I       GET WORD 4 OF 0,0 (BASIC ENT PT)
      STA DMS       SET BASIC ENTRY PT. IN NEW LDR
      LDA B1600     GET PAGE OFFSET OF BOOTSTRAP
      IOR TBUF      ADD PAGE NO.
      STA RT/TS     SET RT LOADER ENTRY PT. IN LDR
      CLA           SET DISK ADDRESS = 0,0
      LDB BLODR     GET ADDRESS OF 0,0 BOOTSTRAP
      JSB DISKO     PUT OUT 0,0 BOOT
      JMP PTBOT,I   RETURN TO MAIN
* 
* 
FS128 NOP           FAST BOOT ROUTINE 
      LDB JMPST     THIS ROUTINE
      STB ADP64     MODIFIES THE BOOT 
      LDB JMPPL     TO LOAD THE WHOLE AREA IF 
      STB LDAB      THE CONTROLER SUPPORTS END OF 
      JMP FS128,I   TRACK SWITCHING (IT DOES IF 128 SECT/TR)
* 
BLODR DEF RLOAD     ADDRESS OF 0,0 LOADER 
DCHNL NOP           DISC CHANNEL
WDCNT NOP           TEMP
      SKP 
* 
*                                   INSERT CHNL NO. IN INSTRUCTION
* 
*  THE STDSK SUBROUTINE SETS THE CURRENT DISK CHANNEL 
*  NOS. IN THE I/O INSTRUCTIONS.
* 
*  CALLING SEQUENCE:
*    A = NO. WORDS TO BE CONFIGURED (NEG.)
*    B = ADDRESS OF INSTRUCTION ADDR LIST 
*    JSB STDSK
* 
*  RETURN:
*    A = DESTROYED
*    B = NEXT INSTRUCTION ADDRESS 
* 
STDSK NOP 
      STA WDCNT     SAVE NO. OF INSTRUCTIONS
      LDA B,I       GET INSTRUCTION 
      AND M7700     ISOLATE INSTRUCTION CODE
      IOR DCHNL     INSERT CHANNEL NO.
      STA B,I       SET INSTRUCTION IN CODE 
      INB           INCR INSTRUCTION ADDRESS
      ISZ WDCNT     SKIP - ALL INSTRUCTIONS CONFIG. 
      JMP *-6       CONFIGURE NEXT INSTRUCTION
      JMP STDSK,I   RETURN
      SPC 3 
B1600 OCT 1600
MESS1 DEF *+1 
      ASC 7,SYS DISC SIZE?
MESS2 DEF *+1 
      ASC 7,FH DISC CHNL? 
MES21 DEF *+1 
      ASC 7,NO. PROTECTED?
MES32 DEF *+1 
      ASC 17,TURN OFF DISC PROTECT - PRESS RUN
MES33 DEF *+1 
      ASC 7,AUX DISC SIZE?
* 
* 
HPDSK DEF *+1,I     HIGH PRIORITY CHANNEL NOS.
      DEF LINKG 
      DEF DMAC
      DEF DSK3
      DEF DSK8
      DEF DSKB
*                                   LOW PRIORITY CHANNEL NOS. 
      DEF DSK2
      DEF DSK4
      DEF DSK5
      DEF DSK6
      DEF DSK7
      DEF DSK9
      DEF DSKAG 
      DEF DSKC
      HED FH RTGEN DRIVER SECTION** TRACK 0, SECTOR 0 BOOTSTRAP **
* 
ADBUF DEF *+1 
      BSS 64        BUFFER TO PUSH BOOT 0,0 AROUND IN 
      BSS BEGIN+1000B-* MAKE CODE EASY TO READ
*  THE FOLLOWING IS THE FORMAT FOR THE PORTION OF THE 
*  BOOTSTRAP LOADER TO BE SET IN 0,0.  THIS SECTION OF THE
*  BOOTSTRAP IS LOADED INTO 2 TO 77B BY THE PROTECTED BINARY
*  LOADER.  WHEN IT IS READ COMPLETELY INTO CORE IT CHECKS FOR
*  READ PARITY ERRORS DURING ITS INPUT.  FOLLOWING THIS A HALT
*  INSTRUCTION PERMITS THE OPERATOR TO PROTECT THE BASIC
*  BINARY LOADER AND SET SWITCH 0 OF THE SWITCH REGISTER
*  TO 0 (EITHER REAL TIME EXECUTIVE OR TIME-SHARED BASIC) 
*  OR 1 (DISC MONITOR SYSTEM).  PRESSING 'RUN' READS THE
*  SELECTED SYSTEM LOADER FROM 0,1 OR 0,2 RESPECTIVELY.  THIS 
*  PORTION OF THE BOOTSTRAP OPERATION WILL THEN LOAD INTO 
*  CORE THE SELECTED SYSTEM AND TRANSFER CONTROL TO IT. 
* 
BSBSO EQU * 
* 
RLOAD OCT 0,0       DON'T USE (A) AND (B) 
RT/TS OCT 0         REAL TIME EXEC/TIME-SHARED BASIC
DMS   OCT 0 
      HLT 4,C       IN CASE OF POWER FAIL 
* 
BSLD0 STA BSLD2-BSBSO+1  CHANGE IRRECOVERABLE HLT 0 
      ISZ BSLD2-BSBSO      INTO RECOVERABLE HLT 1 
      HLT 77B       PROTECT BBL, SET SWR FOR SYSTEM 
      LDA LINKG-BSBSO    SET UP DISC/DMA
      OTA 6                LINKAGE
* 
BSLD1 LIA 1         SELECT SYSTEM LOADER
      CLB,INB         FROM SWITCH REGISTER: 
      SLA               SWR = 0 IMPLIES SECTOR 1
      INB               SWR = 1 IMPLIES SECTOR 2
DSK7  OTB 0         OUTPUT DISC ADDRESS 
      CCE,INB       SAVE
      LDA 1,I         CHOSEN LOADER'S 
      STA CORAD-BSBSO   ENTRY POINT 
      RAL,ERA       OUTPUT 'READ' FORM
      CLC 2           OF LOADER'S 
      OTA 2             CORE ADDRESS
      LDA .N64-BSBSO     OUTPUT 
      STC 2                TRANSFER 
      OTA 2                  LENGTH 
      STC 6,C       START DMA 
DSK8  STC 0         START DISC TRANSFER 
      JSB TSTAT-BSBSO    VALIDATE READ
      JMP CORAD-BSBSO,I  TRANSFER TO SYSTEM LOADER
* 
TSTAT DEF BSLD0-BSBSO    (INITIAL EXIT) 
DSK9  LIA 0         WAIT FOR
      SLA             TRANSFER
      JMP *-BSBSO-2     COMPLETION
      AND BSB32-BSBSO    TRANSFER 
      SZA,RSS              OK?
      JMP TSTAT-BSBSO,I  YES
BSLD2 HLT 0              NO (HLT 1, NOP AFTER CHECK 
      JMP *-BSBSO-1 
      JMP BSLD1-BSBSO    RETRY LOAD 
* 
CORAD OCT 0         SYSTEM LOADER ENTRY ADDRESS 
LINKG OCT 20000     DISC/DMA LINKAGE TEMPLATE 
BSB32 OCT 32        TRANSFER VALIDATION MASK
.N64  DEC -64 
* 
      BSS 77B-*+BSBSO PUT JUMP IN LOCATION 77B
* 
      JMP DSK9-BSBSO     TEST BOOTSTRAP LOAD
      SPC 2 
      BSS BEGIN+1600B-* SKIP TO 1600B TO AVOID PROBLEMS WITH
*                             'O   EQU START-1600B' 
      HED  FH RTGEN DRIVER SECTION  ** TRACK 0, SECTOR 1 BOOTSTRAP**
* 
*  THE FOLLOWING LOADER PERMITS LOADING OF THE RESIDENT PORTIONS
*  OF THE REAL TIME MONITOR.  THE LOADER IS LOCATED ON SECTOR 1,
*  TRACK 0 OF THE SYSTEM DISC.  IT IS GENERATED BY THE SYSTEM 
*  GENERATOR AND CONSISTS OF: 
* 
*  (1) THE INSTRUCTIONS REQUIRED FOR LOADING THE SYSTEM 
*  (2) THE DISK AND CORE ADDRESSES SPECIFYING LOADING 
* 
* 
*  THE ADDRESSES REQUIRED FOR LOADING ARE THE FOLLOWING:
* 
*  (A) BASE PAGE LINKAGES 
*     (1) LOW CORE ADDRESS
*     (2) HIGH CORE ADDRESS 
*     (3) DISK ADDRESS OF ABSOLUTE CODE 
* 
*  (B) SYSTEM, RT RESIDENT MAIN 
*     (1) LOW CORE ADDRESS
*     (2) HIGH CORE ADDRESS 
*     (3) DISK ADDRESS OF ABSOLUTE CODE 
* 
*  (C) BG RESIDENT MAIN 
*     (1) LOW CORE ADDRESS
*     (2) HIGH CORE ADDRESS 
*     (3) DISK ADDRESS OF ABSOLUTE CODE 
* 
*  THE PROGRAM IS ASSUMED TO BE LOADED IN THE 64 WORDS PRECEDING
*  THE PROTECTED LOADER.
* 
START ABS LDB-O+ASPBF     GET ADDR OF DISK SPEC. BUFFER 
      ABS STB-O+SPCAD     SET CURRENT SPBUF ADDRESS 
      ABS JSB-O+PLOAD     LOAD MAIN SYSTEM, RT RESIDENTS
      ABS JSB-O+PLOAD     LOAD MAIN BG RESIDENTS
      ABS JSB-O+PLOAD     LOAD BP LINKAGES
      JMP 3B,I      TRANSFER TO RT MONITOR ENTRY PT.
* 
PLOAD NOP 
      ABS LDB-O+SPCAD+I+I GET LOW CORE ADDRESS
      ABS ISZ-O+SPCAD     INCR CURRENT SPBUF ADDRESS
      ABS LDA-O+SPCAD+I+I GET HIGH CORE ADDRESS 
      ABS ISZ-O+SPCAD     INCR CURRENT SPBUF ADDRESS
      CMA,CCE,INA   COMPLEMENT, SET DIRECTION BIT 
      ADA B         SET A = TOTAL WORD COUNT
      RBL,ERB       SET DIRECTION BIT IN CORE ADDR
      CLC 2 
      OTB 2         SET MEMORY ADDRESS REGISTER 
      ABS LDB-O+SPCAD+I+I GET DISK ADDRESS OF ABSOLUTE CODE 
      ABS ISZ-O+SPCAD     INCR CURRENT SPBUF ADDRESS
* 
SLOAD SSA,RSS       SKIP - MORE SECTORS TO LOAD 
JMPPL ABS JMP-O+PLOAD+I+I RETURN - THIS SECTION LOADED
ADP64 ABS ADA-O+P.64      ADJUST FOR NEXT COUNT 
      ABS STA-O+RECNT     SET REMAINING COUNT 
      SSA           SKIP - LESS THAN 64 WORDS 
      CLA 
      ABS ADA-O+N.64      SET A = CURRENT SECTOR COUNT
STC2  STC 2 
      OTA 2         SET WORD COUNT REGISTER 
DSKAG OTB 0         OUTPUT CURRENT DISK ADDRESS 
      STC 6,C       INITIATE DMA
DSKB  STC 0         INITIATE DATA TRANSFER
DSKC  LIA 0         GET STATUS WORD 
      SLA           SKIP - TRANSFER COMPLETE
      ABS JMP-O+*-2       WAIT FOR COMPLETION 
      RAR,SLA,RAL   SKIP - NO READ PARITY ERROR 
      HLT 0B        WAIT FOR OPERATOR - READ PARITY 
LDAB  LDA B         GET CURRENT DISK ADDRESS
      ABS AND-O+M.177     ISOLATE SECTOR NO.
      ABS CPA-O+#SECT     LAST SECTOR READ? 
      RSS           YES - CONTINUE ON NEXT TRACK
      CLA,INA,RSS   NO - SET COUNT FOR NEXT SECTOR
      ABS LDA-O+#MASK     SET COUNT FOR NEXT TRACK
      ADB A         SET B = NEXT DISK ADDRESS 
      ABS LDA-O+RECNT     GET REMAINING COUNT 
      ABS JMP-O+SLOAD     LOAD NEXT SECTOR
* 
*                                   DATA AREA 
M.177 OCT 177 
#SECT NOP           # SECTORS - 1 FOR SYSTEM DISC 
#MASK NOP           INCREMENT TRACK # VALUE 
N.64  DEC -64 
P.64  DEC 64
RECNT OCT 0         CURRENT REMAINING COUNT 
SPCAD OCT 0         CURRENT DISK SPEC. BUFFER ADDR
ASPBF DEF -O+*+1
      BSS 9         SYSTEM LOADING SPECIFICATIONS 
BTEND EQU *-START   LENGTH OF BOOT (100B OR LESS PLS) 
* 
JMPST ABS JMP-O+STC2
* 
* 
*  THE FOLLOWING EQU SECTION ALLOWS THE BOOTSTRAP 
*  TO BE LOCATED ANYWHERE IN CORE WHEN OUTPUT TO
*  DISK, BUT EXECUTABLE FROM THE LAST PAGE OF CORE. 
* 
* 
O     EQU START-1600B SET FOR START AT 1600 PAGE RELATIVE 
* 
LDB   EQU 066000B     LDB 
CPA   EQU 052000B     CPA 
STB   EQU 076000B     STB 
ADB   EQU 046000B     ADB 
JSB   EQU 016000B     JSB 
ISZ   EQU 036000B     ISZ 
LDA   EQU 062000B     LDA 
STA   EQU 072000B     STA 
ADA   EQU 042000B     ADA 
AND   EQU 012000B     AND 
XOR   EQU 022000B     XOR 
JMP   EQU 026000B     JMP 
I     EQU 040000B   INDIRECT BIT (CODE AS I+I)
      HED FH RTGEN DRIVER SECTION  GENERATOR DRIVER CODE
      BSS 2000B+DBP-* RESERVE 1K FOR DUMMY BP.
* 
*                                   INCREMENT DISK ADDRESS
* 
*  THE DISKA SUBROUTINE INCREMENTS THE CURRENT DISK ADDRESS 
*  TO PROVIDE THE ADDRESS OF THE SUCCEEDING SECTOR, 
*  WHETHER THAT SECTOR IS ON THE SAME TRACK OR THE FOLLOWING
*  TRACK.  IN ADDITION, THE DISKA SUBROUTINE CHECKS THAT
*  THE NEXT DISK ADDRESS IS VALID.
* 
*  CALLING SEQUENCE:
*    A = CURRENT DISK ADDRESS 
*    B = IGNORED
*    JSB DISKA
* 
*  RETURN:
*    A = NEXT DISK ADDRESS
*    B = DESTROYED
* 
DISKA NOP 
      STA B         SAVE CURRENT ADDRESS
      AND M177      ISOLATE SECTOR NUMBER 
      INA           ADD 1.
      CPA SDS#      IF = TO MAX NO. ON SYS. DISC, 
      CLA            SET # = 0, 
      STA DISKT      AND SAVE NEW SECTOR #. 
      LDA B         ISOLATE 
      ALF,ALF        TRACK
      RAL            ADDRESS
      AND M377       IN LOW A.
      CLB           IF NEW
      CPB DISKT      SECTOR # = 0,
      INA            ADD 1 TO TRACK #.
      CPA DSIZE     CHECK FOR OVERFLOW. 
      JMP DKERR      -YES.
      ALF,RAL       RESTORE TRACK # TO 14-07, 
      RAL,RAL        AND
      IOR DISKT      INSERT SECTOR #. 
      JMP DISKA,I   -RETURN.
* 
DKERR LDA ERR17     SET CODE FOR INSUFFICIENT DISK
      JSB IRERR     IRRECOVERABLE ERROR EXIT
* 
DISKT NOP           -TEMPORARY STORAGE
DCMND NOP           DISC ADDRESS SAVE AREA
EDCNT NOP           DISC ERROR COUNTER
MADDR NOP           DISC XFER CORE ADDRESS SAVE 
AEBUF DEF *+1       DISC SCAN OUT AREA
      BSS 64
ERR17 ASC 1,17
ERR22 ASC 1,22
      SKP 
* 
*                                   DISK INPUT DRIVER 
* 
*  THE DISKI SUBROUTINE CONTROLS THE INPUT FROM THE DISK. 
*  IT ADDS THE DIRECTION BIT TO THE CORE ADDRESS, AND 
*  CONTAINS THE ERROR RECOVERY PROCEDURE IF READ PARITY 
*  OR DECODE ERRORS ARE DETECTED ON READ.  FOLLOWING DETECTION
*  OF SUCH AN ERROR, 9 ADDITIONAL ATTEMPTS TO READ THE
*  SPECIFIED SECTOR WILL BE MADE.  IF THESE FAIL, THE DISK ADDRESS
*  AND THE CORE ADDRESS ARE DISPLAYED IN THE A AND B REGISTERS
*  AND THE COMPUTER HALTS.  BY PRESSING RUN, 10 ADDITIONAL
*  ATTEMPTS TO READ THE SECTOR WILL BE MADE.
* 
*  CALLING SEQUENCE:
*    A = DISK ADDRESS 
*    B = CORE ADDRESS 
*    JSB DISKI
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
* 
DISKI NOP 
      ADB MSIGN     SET SIGN = 1
      STA DCMND     SAVE DISK ADDRESS 
      STB MADDR     SAVE MEMORY ADDRESS 
REPR1 LDA N10       SET DISK READ ERROR COUNT 
      STA EDCNT     SET ERROR COUNTER 
REPR2 LDA DCMND     GET DISK ADDRESS
      LDB MADDR     GET CORE ADDRESS
      JSB DISKD     READ 64-WORD RECORD 
      JMP DISKI,I   RETURN
      ISZ EDCNT     SKIP - 10 READ ATTEMPTS FAILED
      JMP REPR2     TRY AGAIN 
      LDA ERR22     GET DISK READ ERROR CODE
      JSB ERROR     PRINT ERROR MESSAGE 
      LDA DCMND     GET DISK ADDRESS
      LDB MADDR     GET CORE ADDRESS
      HLT 22B       WAIT FOR OPERATOR INTERVENTION
      JMP REPR1     TRY 10 MORE TIMES 
      SKP 
* 
*                                   DISK OUTPUT DRIVER
* 
*  THE DISKO SUBROUTINE CONTROLS ALL OUTPUT TO THE
*  DISK.  IT ADDS THE DIRECTION BIT TO THE CORE ADDRESS, AND CONTAINS 
*  THE ERROR RECOVERY PROCEDURE IF DISK ERRORS ARE DETECTED.
*  FOLLOWING EXECUTION OF THE DISK WRITE, THE SECTOR IS 
*  IMMEDIATELY READ BACK TO TEST FOR ERRORS.  IF ERRORS ARE DETECTED, 
*  THIS PROCEDURE IS REPEATED (SEE RECOVERY FOR DISKI). 
* 
*  CALLING SEQUENCE:
*    A = DISK ADDRESS 
*    B = CORE ADDRESS 
*    JSB DISKO
* 
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
* 
DISKO NOP 
      STB MADDR     SAVE MEMORY ADDRESS 
      LDB DSKA      GET CURRENT HIGH
      CMB,INB       AND SUBTRACT
      ADB A         FROM CURRENT ADDRESS
      SSB,RSS       IF NEW HIGH 
      STA DSKA      SET NEW HIGH
      IOR MSIGN     SET SIGN OF DISK ADDR = WRITE 
      STA DCMND     SAVE DISK ADDRESS 
REPW1 LDA N10       SET DISK READ ERROR COUNT 
      STA EDCNT     SET ERROR COUNTER 
REPW2 LDA DCMND     GET DISK ADDRESS
      LDB MADDR     GET CORE ADDRESS
      JSB DISKD     WRITE 64-WORD RECORD
      LDA DCMND     GET DISK ADDRESS
      RAL,CLE,ERA   CLEAR WRITE BIT 
      LDB AEBUF     GET ADDRESS OF SCANOUT AREA 
      JSB DISKD     READ RECORD FROM DISK 
      JMP DISKO,I   RETURN
      ISZ EDCNT     SKIP - 10 READ ATTEMPTS FAILED
      JMP REPW2     TRY AGAIN 
      LDA ERR22     GET DISK READ ERROR CODE
      JSB ERROR     PRINT ERROR MESSAGE 
      LDA DCMND     GET DISK ADDRESS
      LDB MADDR     GET CORE ADDRESS
      HLT 22B       WAIT FOR OPERATOR INTERVENTION
      JMP REPW1     TRY 10 MORE TIMES 
      SKP 
* 
*                                   COMMON I/O DISK DRIVER
* 
*  THE DISKD SUBROUTINE IS THE MAIN DISK INPUT/OUTPUT 
*  DRIVER.  IT SETS UP THE MEMORY ADDRESS REGISTER, THE 
*  WORD COUNT REGISTER, AND THE DISK ADDRESS.  FOLLOWING THESE, 
*  IT INITIATES THE TRANSFER, AND WAITS UNTIL THE TRANSFER
*  IS COMPLETE (BY TESTING THE DISK STATUS WORD).  IN THE CASE OF 
*  A DISK READ, IT TESTS FOR READ PARITY AND DECODE ERRORS. 
* 
*  CALLING SEQUENCE:
*    A = DISK ADDRESS (WITH DIRECTION BIT)
*    B = CORE ADDRESS (WITH DIRECTION BIT)
*    JSB DISKD
* 
*  RETURN: CONTENTS OF A AND B ARE DESTOYED.
*    (N+1): READ - A READ PARITY OR DECODE ERROR IS DETECTED
*           WRITE - ALL 
*    (N+2): NORMAL READ 
* 
DISKD NOP 
      CCE,SSA,RSS   SET E = 1 (DISK WRITE)
      CLE           SET E FOR DISK READ 
      CLC 2         PREPARE TO SET MEM ADDR REGISTER
      OTB 2         SET MEM ADDR IN MAR 
      LDB DMAC      ASSIGN THE DMA
      OTB 6         TO THE DISK 
* 
      STC 2         PREPARE TO SET WORD COUNT REG 
      LDB N64       SET WORD COUNT = 64 
      OTB 2         SET WORD COUNT IN WCR 
* 
DSK2  OTA 0         SET DISK ADDR IN COMMAND CHNL 
* 
      STC 6,C       INITIATE DMA 1
DSK3  STC 0         INITIATE DATA TRANSFER
DSK4  LIA 0         GET STATUS WORD 
      SLA           SKIP IF TRANSFER COMPLETE 
      JMP *-2       WAIT
      SEZ           SKIP - DISK READ
      JMP DISKD,I   WRITE RETURN
      AND P18       ISOLATE BITS 1,4
      SZA,RSS       SKIP - READ PARITY OR DECODE ERR
      JMP DISKD,I   NORMAL READ RETURN
      ISZ DERCN     INCR TOTAL DISK ERROR COUNT 
      ISZ DISKD     INCR RETURN ADDRESS (ERROR) 
      JMP DISKD,I   DISK READ ERROR RETURN
* 
DMAC  OCT 20000 
      HED FH RTGEN DRIVER SECTION  GENERAL SUBROUTINES? 
*                                   SET DISK TRACK TABLE
* 
*  DTSET SETS UP THE DISK TRACK TABLE FOR BOTH THE SYSTEM 
*  AND AUXILIARY DISK.  IT USES THE ID SEGMENT BUFFER FOR 
*  PUTTING OUT THE TRACK TABLES.
* 
*  CALLING SEQUENCE:
*    A = NO. USED TRACKS
*    JSB DTSET
*  RETURN: CONTENTS OF A AND B ARE DESTROYED. 
* 
DTSET NOP 
      LDB PTRAK     GET THE NUMBER OF PROTECTED TRACKS
      CMB,INB       AND CKECK IF ALL USED 
      ADB A         IF A < 0 THEN IT IS NO. OF
      STB TBUF      UNUSED PROTECTED TRACKS 
      SSB,RSS       IF NONE 
      JMP DTSET,I   JUST RETURN (TAT IS ALREADY ZERO) 
* 
DTSE1 LDA MSIGN     ASSIGN REST OF
      JSB OUTID     PROTECTED TRACKS
      ISZ TBUF      TO THE SYSTEM 
      JMP DTSE1     LOOP TILL DONE
* 
      JMP DTSET,I   THEN RETURN 
      SPC 2 
DSTBL NOP           DUMMY ROUTINES FOR SETTING TRACK MAP
TRTST EQU *-1       AND TESTING A TRACK 
      LDB A         SET B TO EQUAL A AND
      JMP DSTBL,I   JUST RETURN 
      SPC 2 
*     FSECT IS A ROUTINE TO SET LOAD SPECS IN THE LOAD SPEC.
*           TABLE IN THE DISC RESIDENT BOOT EXTENSION.
* 
*   CALLING SEQUENCE: 
*     LDA SPEC BUFFER ADDRESS  I.E. ADDRESS OF THE NINE WORDS 
*     JSB FSECT 
*     RETURN REGS. MEANINGLESS
* 
FSECT NOP 
      STA DTSET     SAVE THE ADDRESS FOR A BIT
      LDB ABOOT     GET THE 
      CLA,INA       BOOT FROM 
      JSB DISKI     THE DISC
      LDA DTSET     GET THE FROM ADDRESS
      LDB ASBUF     AND THE TO ADDRESS
      JSB MOVW      AND MOVE THE WORDS
      DEC -9
      LDB ABOOT     NOW WRITE 
      CLA,INA       THE BOOT
      JSB DISKO     BACK TO THE DISC
      JMP FSECT,I   RETURN
* 
      END 
                                                                                                                                                                      