      LDA .17 
      JSB TMRR,I    WAIT 15 MILLISEC
      JMP OTCD3 
OTCD4 EQU * 
      LDB SW12      CHECK BIT 12
      JSB SWRC,I    IS IT SET?
      JMP *+2       YES-WAIT 10 MS
      JMP OTCD1     GO-WAIT FOR FLAG
      LDA .10D
      JSB TMRR,I    WAIT 10 MILLISEC
OTCD3 EQU * 
      LDA MSKRW 
      JSB BITCK     IS THE UNIT REWINDING?
      JMP *-2       YES-GO WAIT FOR IT TO CLEAR 
      JMP OUTCD,I   EXIT
OTCD1 EQU * 
OTCD5 SFC CMMD      WAIT FOR COMMAND FLAG 
      JMP OTCD3     FLAG SET-EXIT 
      LDB SW15      FLAG NOT SET
      JSB SWRC,I     IS BIT 15 SET? 
      JMP T3022      YES ABORT
      JMP OTCD5      NO-GO CHECK FLAG AGAIN 
* 
.10D  DEC 10
.30D  DEC 30
* 
*          DMA TRANSFER ROUTINE 
* 
* 
*    --PROGRAM OPERATION--
* 
*    1. LOAD SWITCH REGISTER BIT 3
* 
*    2. LOAD THE SWITCH REGISTER (0-7) WITH THE PATTERN OF
*       THE BYTE TO BE WRITTEN. 
* 
*    3. PRESS RUN 
* 
*    ---------------------
* 
*    THE PROGRAM WRITES A 2048(MAXIMUM) BYTE RECORD, THEN BACK- 
*    SPACES AND READS THE RECORD .
* 
*    SETTING SWITCH 15 TO ONE ON THE SWITCH REGISTER, BRINGS
*    THE PROGRAM TO A NORMAL HALT (106046). 
*    OTHER WISE THE PROGRAM CONTINUES TRANSFERRING RECORDS UN-
*    TIL AN END-OF-TAPE IS DETECTED, AT WHICH TIME THE TAPE IS
*    AUTOMATICALLY REWOUND. 
* 
 SPC 1
********************************************************* 
* 
* 
*         DMA TRANSFER
* 
T3006 NOP 
      JSB MSGH,I    OUTPUT MESSAGE
      DEF H152      AND HALT
      JMP T3036     SKIP OVER MESSAGE 
H152  EQU * 
      ASC 11,H152 SELECT DMA BYTE/
* 
T3036 EQU * 
      LDB SW15      CHECK BIT 15
      JSB SWRC,I    IS IT SET?
      JMP T3006,I   YES-EXIT TO CONTROL 
      LDA DMAFG     CHECK IF COMPUTER HAS DMA 
      SZA,RSS       IS IT ZERO? 
      JMP T3006,I   YES- NO DMA 
      LDA FGDMA     GET DMA FLAG
      STA T3047     SAVE IT FOR EXIT
      SZA           WAS THE FLAG SET? 
      JMP T3045     YES-GO USE THAT CHANNEL 
      LDA .2        NO - SETUP DMA CH 2 
      STA FGDMA      GO SET FLAG
T3045 EQU * 
      LDB SW15
      JSB SWRC,I    IS SWITCH 15 SET FOR ABORT
      JMP T3048     YES-GO TO EXIT ROUTINE
      LIA SW        LOAD A WITH SWITCH  REG 
      AND MK377     GET BITS 7-0
      STA T3037     SAVE IT 
      ALF,ALF       ROTATE BYTE TO UPPER
      ADA T3037     SETUP COMPUTER WORD 
      STA T3037     SAVE IT 
      LDA BFMAX     GET MAX BUFFER
      STA T3038     SAVE IT 
      LDA .1        ONE WORD PATTERN
      LDB T3037-1   POINTER TO COMPUTER WORD
      JSB FILL,I    FILL THE OUTPUT BUFFER
      DEF T3039     RETURN ADDRESS
T3038 NOP           BUFFER LENGTH 
      DEF T3001     ERROR RETURN
      DEF *+1       POINTER TO WORD 
T3037 NOP           COMPUTER WORD 
T3039 EQU *         CONTINUE
      CCA 
      STA SKPSW     SET SW REG SKIP FLAG
      JSB SIOW,I    WRITE A RECORD
      JSB BSRWF     BACKSPACE RECORD
      JSB SIOR,I    READ THE RECORD 
      CLA 
      STA SKPSW     CLEAR SW REG CHECK FLAG 
      JSB EOTRW     CHECK FOR EOT 
      JMP T3045     LOOP
* 
T3048 EQU * 
      LDA T3047     LOAD OLD DMA FLAG 
      STA FGDMA     RESTORE DMA FLAG
      JMP T3006,I   EXIT ROUTINE
* 
T3047 NOP           SAVE FOR OLD DMA FLAG 
* 
* 
* 
*                   END OF TEST 30
* 
* 
* 
* 
*    STANDARD I/O WRITE TRANSFER ROUTINE    * 
* 
*  CALL:
*        THE RECORD WORD LENGTH='BUFLG' 
*        THE OUTPUT BUFFER'S S.A.='FWA' 
* 
SIOTW NOP 
      LDA .M3 
      STA SIOW7      SETUP RECORD COUNTER 
      LDA .M10       SETUP GAP COUNTER
      STA SIOW8 
      CLA 
      STA SIOW9      CLEAR REWRITE COUNTER
      STA SIOW1     CLEAR TOTAL # OF REWRITES 
      STA ERRFG     CLEAR ERROR MESSAGE FLAG
* 
      JSB STATS     GET STATUS
      AND MSKFP     IS FILE PROTECTED (NO RING)?
      SZA,RSS 
      JMP SIOW4     NO-CONTINUE 
      CLB           SETUP EXPECTED STATUS 
      JSB ERMS,I    YES - REPORT ERROR
      DEF E042
      JMP SIOW4     CONTINUE
E042  EQU * 
      ASC 10,E042 NO WRITE RING/
SIOW4 EQU * 
      LDA FGDMA     CHECK DMA I/O FLAG
      SZA           IS IT ZERO? 
      JMP SIOW2     YES-GOTO DMA WRITE
      JSB .WRIT     WRITE THE RECORD
      JMP SIOW3     SKIP OVER DMA ROUTINE 
SIOW2 EQU * 
      JSB DMAWT,I   WRITE RECORD UNDER DMA
SIOW3 EQU * 
      LDA FWAM      BUFFER ADDRESS
      LDB BUFLG     BUFFER LENGTH 
      JSB SIOCR     GO COMPARE CRCC + LRCC
      LDA WRERR     LOAD WRITE ERROR FLAG 
      SZA           IS THERE A WRITE ERROR? 
      JMP SIOW5     YES-GOTO REWRITE ROUTINE
SIOW6 EQU * 
      LDA SIOW1     LOAD TOTAL # OF REWRITES
      SZA,RSS       IS IT ZERO? 
      JMP SIOW.     YES-OK TO CONTINUE
      JSB MS,I      NO-REPORT # OF REWRITES 
      DEF SIOW.     RETURN
      DEF H057      POINTER TO MESSAGE
SIOW1 NOP           REWRITES COUNTER
SIOW. EQU * 
      JMP SIOTW,I   EXIT
* 
SIOW5 EQU * 
      LDA ERRFG     LOAD SKIP ERROR MSG FLAG
      CPA WRERR     IS IT = TO WRITE ERROR FLAG?
      JMP SIW10     YES-SKIP ERROR MESSAGE
      CLB           NO-SETUP EXPECTED STATUS
      JSB ERMS,I    REPORT WRITE ERROR
      DEF E065
      LDA WRERR     LOAD CURRENT WRITE ERROR
      STA ERRFG     STORE IT IN SKIP-ERROR MSG
SIW10 EQU * 
      LDB SW09      CHECK SWITCH 9
      JSB SWRC,I    IS IT SET?
      JMP SIOW6     YES-EXIT
      JSB BSRWF     BACKSPACE THE RECORD
      ISZ SIOW1     INCREMENT TOTAL # OF REWRITES 
      ISZ SIOW9     INCREMENT REWRITE COUNTER 
      ISZ SIOW7     IS THIS THE 3RD TIME? 
      JMP SIOW4     NO-GO TRY AGAIN 
      LDA .M3       YES-RESET RECORD COUNTER
      STA SIOW7 
      JSB WTGAP     GAP OVER BAD SPOT 
      ISZ SIOW8     INCREMENT GAP COUNTER 
      JMP SIOW4     LOOP IF NOT THE 10TH TIME 
      JMP SIOW6     ERROR EXIT
* 
H057  EQU * 
      ASC 09,H057 # REWRITE(S)/ 
* 
SIOW9 NOP           REWRITE COUNTER 
SIOW8 NOP           GAP COUNTER 
SIOW7 NOP           3 X RECORD COUNTER
ERRFG NOP           SKIP-ERROR MESSAGE FLAG 
* 
* 
*         COMPARES CRCC FROM TAPE WITH CRCC FROM BUFFER 
*CALL:
*     LDA <BUFFER ADDRESS>
*     LDB <BUFFER LENGTH> 
*     JSB SIOCR 
* 
SIOCR NOP 
      STA AREG      SAVE A AND B REG. 
      STB BREG
      LDA ERRFG     LOAD ERROR MESSAGE SKIP FLAG
      SZA           IS IT ZERO? 
      JMP SIOCR,I   NO-SKIP CRCC CHECK
      LDB CRCFG     LOAD CRCC SKIP FLAG 
      SZB           IS IT SET?
      JMP SIOCR,I   YES-EXIT
      LDB BREG      NO-CONTINUE 
      SZB,RSS       IS BUFFER LENGTH ZERO?
      JMP SIOCR,I   YES-EXIT
      LDA FG183     IS IT A 13183?
      SZA 
      JMP SIOCR,I   YES-EXIT
      LDA AREG      NO-LOAD A AND B REG.
      LDB BREG
* 
      JSB .CRCC,I   GENERATES CRCC FROM BUFFER
      STA SIO26     SAVE IT 
SIO27 EQU * 
      LIA DATA      LOAD CRCC FROM TAPE 
      CPA SIO26     COMPARE TAPE AND BUFFER CRCC
      JMP SIO29     THEY COMPARE-CONTINUE 
      CLB           SETUP EXPECTED STATUS 
      JSB ERMS,I    FAILED-REPORT ERROR 
      DEF E141
      JMP SIO29 
E141  EQU * 
      ASC 08,E141 CRCC ERROR/ 
SIO29 EQU * 
      LIA DATA      CHECK LRCC
      AND MK377     ISOLATE LOWER BYTE
      SZA,RSS       IS LRCC RESIDUAL ZERO?
      JMP SIO28     YES-EXIT
      CLB           SETUP EXPECTED STATUS 
      JSB ERMS,I    NO-REPORT ERROR 
      DEF E135
      JMP SIO28 
E135  EQU * 
      ASC 08,E135 LRCC ERROR/ 
SIO28 EQU * 
      JMP SIOCR,I   EXIT
* 
SIO26 NOP           GENERATED CRCC
* 
* 
*    STANDARD I/O READ TRANSFER ROUTINE    *
* 
*  CALL:
*        THE INPUT BUFFER'S S.A. IS IN BWAL THEN ADD 1='INBUF'
*  THE RECORD WORD LENGTH IS ALREADY LOADED IN "BUFLG"
* 
SIOTR NOP 
      LDA .M10
      STA SIO31     SETUP MAXIMUM REREADS COUNTER 
      CLA 
      STA SIO32     CLEAR REREADS COUNTER 
      STA ERRFG     CLEAR ERROR MESSAGE FLAG
      LDB FWAM      GET FWAM
      ADB BFMAX     COMPUTE LWA ADDRESS 
SIO34 EQU * 
      STB INBUF     STORE INPUT BUFFER ADDRESS
SIO30 EQU * 
      LDA FGDMA     CHECK DMA I/O FLAG
      SZA           IS IT ZERO? 
      JMP SIO14     YES-GOTO DMA READ 
      JSB .READ     READ THE RECORD 
      JMP SIO15     SKIP OVER DMA ROUTINE 
SIO14 EQU * 
      JSB DMARD,I   READ  RECORD UNDER DMA
SIO15 EQU * 
*                   ALLOWS SKIP OF CRCC FOR EOF 
      LDA MSKEF 
      JSB BITCK     WAS AN EOF READ?
      JMP SIO35     YES-SKIP OVER CRCC
      LDA INBUF     BUFFER ADDRESS
      LDB INBFL     BUFFER LENGTH 
      JSB SIOCR     GO COMPARE CRCC + LRCC
SIO02 EQU * 
      LDB SW09      CHECK SWITCH 9 FOR ABORT
      JSB SWRC,I    IS IT SET?
      JMP SIO04      YES-EXIT 
      LDA RDERR 
      SZA,RSS       IS READ ERROR FLAG SET? 
      JMP SIO33     NO-CONTINUE 
      LDA ERRFG     LOAD SKIP ERROR MSG FLAG
      CPA RDERR     IS IT = TO READ ERROR FLAG? 
      JMP SIO36     YES-SKIP ERROR MESSAGE
      CLB           NO-SETUP EXPECTED STATUS
      JSB ERMS,I    REPORT READ ERROR 
      DEF E066
      LDA RDERR     LOAD CURRENT WRITE ERROR
      STA ERRFG     STORE IT IN SKIP-ERROR MSG
SIO36 EQU * 
      JSB BSRWF     YES-BACKSPACE RECORD
      ISZ SIO32     INCREMENT REREAD COUNTER
      ISZ SIO31     IS THIS THE LAST TIME?
      JMP SIO30     NO-DO IT AGAIN
      JSB FSRWF     SPACE OVER BAD RECORD 
      JMP SIO33     ERROR EXIT
H060  EQU * 
      ASC 09,H060 # REREAD(S)/
* 
SIO31 NOP           MAXIMUM REREADS COUNTER 
* 
SIO33 EQU * 
      LDA SIO32     LOAD REREAD COUNTER 
      SZA,RSS       IS IT ZERO? 
      JMP SIO35     YES-EXIT
      JSB MS,I      NO-REPORT # OF REREADS
      DEF SIO35     RETURN
      DEF H060      POINTER TO MESSAGE
SIO32 NOP           REREAD COUNTER
SIO35 EQU * 
SIO04 EQU *         YES-CONTINUE
      JMP SIOTR,I   EXIT
* 
* 
*    NON-DMA WRITE DRIVER    *
* 
*  CALL:
*        THE RECORD WORD LENGTH='BUFLG' 
*        THE OUTPUT BUFFER'S S.A.='FWA' 
* 
.WRIT NOP 
      CLA 
      STA WRERR     CLEAR WRITE ERROR FLAG
      LDB FWAM      SETUP FOR OUTPUT  BUFFER ADDRESS
      LDA BUFLG     GET LENGTH
      ADA B         SETUP LWA +1 OF BUFFER
      STA COUNT     SET THE WORD COUNTER
      LDB WCC       START THE WRITE 
      JSB OCMMD 
      LDB FWAM
.WR01 STC DATA,C    SET THE DATA TRANSFER 
      LDA FGINT     LOAD INTERRUPT FLAG 
      SZA,RSS       IS IT ZERO? 
      JMP .WR12     NO-CONTINUE IN NON-INTERRUPT
      JSB LDINT,I   LOAD ERROR MESSAGES INTO TRAP CELLS 
      LDA CMD       SETUP FOR COMMAND CHANNEL 
      JSB INTJP,I    INTERRUPT
      DEF TCCMD     INTERRUPT BASE PAGE LINK
      DEF .WR11     POINTER TO INTERRUPT JMP
      LDA DTA       SETUP FOR DATA CHANNEL
      JSB INTJB,I   INTERRUPT SERVICE ROUTINE 
      DEF TCDAT     INTERRUPT BASE PAGE LINK
      DEF .WR13     POINTER TO DATA TRANSFER ROUTINE
      LDB FWAM      LOAD BUFFER ADDRESS 
      JMP .WR15     GO WAIT FOR INTERRUPTS
* 
.WR12 EQU *         NON-INTERRUPT CONTINUATION
MORWT CLA           CLEAR TIME OUT COUNTER
.WR02 SFS DATA      IS DATA FLAG SET
      JMP .WR08     NO-GO WAIT FOR FLAG 
      LDA B,I       LOAD A WITH OUTPUT WORD 
.WR04 OTA DATA,C    WRITE THE WORD
      INB           ADVANCE THE BUFFER POINTER
      CPB COUNT     IS THIS THE LWA OF THE BUFFER?
      JMP .WR05     YES-GO TO END OF RECORD ROUTINE 
      JMP MORWT     NO- GO GET NEXT WORD
.WR08 EQU *         WAIT FOR DATA FLAG LOOP 
.WR06 EQU * 
      SFC CMMD      IS THE COMMAND FLAG SET?
      JMP .WR11     YES-GO REPORT ERROR 
      INA,SZA       INCREMENT TIME OUT COUNTER
      JMP .WR02     NOT ZERO-GO CHECK DATA FLAG 
.WR10 EQU *         TIME OUT-EXIT 
      JSB CLEAR     CLEAR CONTROLLER
      JSB DATFG     REPORT DATA FLAG LOST 
.WR05 CLC DATA,C    NORMAL END OF RECORD
      JSB FLGWT     WAIT FOR THE OPERATION TO FINISH
      JSB LDINT,I   LOAD TRAP CELLS WITH ERROR MSG
      JSB STATS     GET STATUS
      AND MSKIO     CHECK FOR PARITY AND DATA ERRORS
      SZA,RSS       IS IT NON ZERO? 
      JMP .WR07     NO-STATUS OK-CONTINUE WRITE 
      LDA STATU     GET STATUS
      STA WRERR     YES-SAVE STATUS 
.WR07 EQU * 
      JMP .WRIT,I   EXIT
.WR11 EQU * 
      JSB CLEAR     CLEAR CONTROLLER
      JSB CMDFG     GO REPORT ERROR 
      JMP .WR07     EXIT
* 
*          INTERRUPT-DATA TRANSFER ROUTINE
.WR13 NOP 
      LDA B,I 
.WR17 EQU * 
      OTA DATA,C    OUTPUT DATA WORD
      INB 
      CPB COUNT       IS IT THE LAST WORD?
      JMP .WR05     YES-EXIT THRU NORMAL END
      CLA           CLEAR TIME OUT COUNTER
      JMP .WR13,I   EXIT
* 
*           INTERRUPT WAIT ROUTINE
.WR15 EQU * 
      CLA           CLEAR TIME OUT COUNTER
.WR16 EQU * 
      INA,SZA      IS THE DATA TIME-OUT  COUNTER=0? 
      JMP .WR16     NO- WAIT FOR INTERRUPT
      JMP .WR10     YES-REPORT DATA FLAG TIME OUT ERROR 
* 
* 
*                   CMDFG-REPORTS SPURIOUS COMMAND FLAG 
* 
CMDFG NOP 
      CLB           SETUP EXPECTED STATUS 
      JSB ERMS,I    REPORT COMMAND FLAG SET 
      DEF E133
      JMP CMDFG,I     EXIT
* 
E133  EQU * 
      ASC 09,E133 COMMAND FLAG/ 
* 
* 
* 
*    NON-DMA READ DRIVER    * 
* 
*  CALL:
*        THE RECORD WORD LENGTH='BUFLG' 
*        THE INPUT BUFFER S.A.='INBUF'
* 
.READ NOP 
      JSB .CLBF,I   CLEAR INPUT BUFFER AREA 
      CLA 
      STA RDERR     CLEAR READ ERROR FLAG 
      STA INBFL     CLEAR INPUT BUFFER LENGTH 
      LDA BFMAX     YES-LOAD MAX BUFFER SIZE
      ADA INBUF     COMPUTE LWA OF BUFFER 
      STA .RDCT     STORE IT IN READ COUNTER
      LDB RD10,I    START THE READ
      JSB OCMMD 
.RD01 STC DATA,C    START THE DATA TRANSFER 
      LDA FGINT     LOAD INTERRUPT FLAG 
      SZA,RSS       IS IT ZERO? 
      JMP .RD15     NO-CONTINUE IN NON-INTERRUPT
      JSB LDINT,I   LOAD ERROR MESSAGES INTO TRAP CELLS 
      LDA CMD       SETUP FOR COMMAND CHANNEL 
      JSB INTJP,I    INTERRUPT
      DEF TCCMD     INTERRUPT BASE PAGE LINK
      DEF .RD05     POINTER TO INTERRUPT JMP
      LDA DTA       SETUP FOR DATA CHANNEL
      JSB INTJB,I   INTERRUPT SERVICE ROUTINE 
      DEF TCDAT     INTERRUPT BASE PAGE LINK
      DEF .RD09     POINTER TO DATA TRANSFER ROUTINE
      LDB INBUF     LOAD BUFFER ADDRESS 
      JMP .RD16     GO WAIT FOR INTERRUPTS
* 
.RD15 EQU *         NON-INTERRUPT CONTINUATION
* 
      LDB INBUF     GET INPUT BUFFER ADDRESS
MORED CLA 
.RD02 SFS DATA      WAIT FOR DATA FLAG
      JMP .RD08     FLAG CLEAR-GOTO WAIT LOOP 
.RD03 LIA DATA,C    LOAD DATA WORD
      STA B,I       STORE WORD IN BUFFER
      INB           ADVANCE THE BUFFER POINTER
      CPB .RDCT     IS IT LWA IN BUFFER?
      JMP .RD04     YES-GO TO END OF RECORD 
      JMP MORED     NO-GO GET NEXT WORD 
.RD08 EQU *         CHECK FOR DATA FLAG TIME OUT
.RD06 EQU * 
      SFC CMMD      IS COMMAND FLAG SET?
      JMP .RD05     YES-GO TERMINATE RECORD 
      INA,SZA       INCREMENT AND CHECK FOR ZERO
      JMP .RD02     NO TIME OUT-GO CHECK FLAG AGAIN 
*                        YES- TIME OUT EXIT 
.RD13 EQU * 
      STB .RDTP     SAVE LWA OF BUFFER
      JSB CLEAR     CLEAR CONTROLLER
      JSB DATFG     REPORT DATA FLAG LOST 
      JMP .RD17     GO COMPUTE BUFFER LENGTH
.RD04 EQU * 
      CLC DATA,C    END OF RECORD 
      STB .RDTP     SAVE LWA OF BUFFER
      JSB FLGWT     WAIT FOR THE OPERATION TO FINISH
.RD05 EQU * 
      STB .RDTP     SAVE LWA OF BUFFER
.RD17 EQU * 
      JSB LDINT,I   PUT ERROR MSG IN TRAP CELLS 
      LDA MSKEF 
      JSB BITCK     IS EF BIT SET?
      JMP .RD07     YES-JUMP OVER DATA ERROR CHECK
      JSB STATS     GET STATUS
      AND MSKIO     CHECK FOR DATA ERRORS 
      SZA,RSS       IS IT NON ZERO? 
      JMP .RD07     NO- STATUS OK-CONTINUE READ 
      LDA STATU     GET STATUS
      STA RDERR     YES-SAVE STATUS 
.RD07 EQU * 
      LDB .RDTP     GET LWA OF BUFFER 
      LDA INBUF     GET FWA OF BUFFER 
      CMA,INA       MAKE IT NEGATIVE
      ADA B         COMPUTE BUFFER LENGTH 
      STA INBFL     SAVE INPUT BUFFER LENGTH
      JMP .READ,I 
* 
RD10  EQU * 
      DEF RRF     READ COMMAND ADDRESS
* 
*                  DATA TRANSFER ROUTINE FOR INTERRUPT
* 
.RD09 NOP 
.RD14 EQU * 
      LIA DATA,C    LOAD IN THE DATA
      STA B,I       STORE IT IN THE BUFFER* 
      INB           INCREMENT BUFFER POINTER
      CPB .RDCT     IS RECORD LARGER THAN AVAILABLE CORE? 
      JMP .RD04     YES-EXIT RECORD 
      CLA           NO-RESET DATA FLAG TIME OUT COUNTER.
      JMP .RD09,I   GO WAIT FOR NEXT INTERRUPT
* 
*                   WAIT FOR INTERRUPT ROUTINE
* 
.RD16 EQU * 
      CLA           CLEAR DATA FLAG TIME OUT COUNTER
.RD12 EQU * 
      INA,SZA       IS IT A TIME OUT? 
      JMP .RD12     NO-WAIT FOR INTERRUPT 
      JMP .RD13     YES-GO TERMINATE READ 
* 
* 
*         NON-ERROR MESSAGES REPORTING
* 
*     CALLING SEQUENCE: 
*         JSB MSG   (MS,I)
*         DEF RTN 
*         DEF <FORMAT STARTING ADDRESS> 
*         NOP <NUMBER FOR FORMATT>
*         . 
*   RTN   EQU * <NEXT EXECUTING INSTRUCTION>
* 
MSG   NOP 
      LDA ERSKP     CKECK ERROR MSG SKIP FLAG 
      SZA           IS IT SET?
      JMP MSGEX     YES-EXIT
      LDB SW10      CHECK IF SUPRESSED
      JSB SWRC,I
      JMP MSGEX     YES 
      LDA MSG       NO - OUTPUT MESSAGE 
      JSB OPMSG     OUTPUT MESSAGE
MSGEX LDA MSG,I     GET RETURN ADDRESS
      JMP A,I       RETURN TO CALLER
* 
      SKP 
OPMSG NOP           ENTRY TO OUTPUT A MESSAGE 
      INA 
      LDB A,I       GET FORMAT ADDRESS
      INA 
      STA NUA       SAVE NUMBER ADDRESS 
      STB FPTA      SAVE FORMAT STARTING ADDRESS
      SZB,RSS       IS THERE A MESSAGE
      JMP OPMSG,I   NO
      CLA,CLE       SLOW OUTPUT DEVICE
MSGA  LDB FPTA      RETRIEVE MESSAGE
      JSB FMTR2,I   START FORMAT
MSGL0 SZA,RSS       IS THERE ANY NUMBERS REQUESTED
      JMP OPMSG,I   NO
      LDB NUA,I     YES GET NUMBER
      CCA 
      JSB FMTR2,I   OUTPUT IT 
      ISZ NUA       MOVE TO NEXT NUMBER 
      JMP MSGL0 
NUA   NOP 
FPTA  NOP 
* 
* 
*         DMA READ DRIVER 
*CALL:
*     JSB DMARD,I   HIGH CORE CALL
*     JSB .DMRD     LOW CORE CALL 
*         THE RECORD WORD LENGTH='BUFLG'
*         THE INPUT BUFFER S.A. ='INBUF'
*     N.B. IF BUFFER LENGTH IS ZERO, LENGTH IS SET TO MAX BUFFER
* 
.DMRD NOP 
      JSB .CLBF,I   CLEAR INPUT BUFFER AREA 
      CLA 
      STA RDERR     CLEAR READ ERROR FLAG 
      LDA FGDMA     FETCH CHANNEL # 
      STA .DMR1     SETUP CHANNEL NUMBER
      LDA INBUF     GET INPUT BUFFER ADDRESS
      ADA ..1MG     SETUP BUFFER FOR INPUT FROM DMA 
      STA .DMR2 
      LDA INBFL     LOAD INPUT BUFFER LENGTH
      CPA BUFLG     IS IT PRESET TO OUTPUT BUFFER LENGTH? 
      JMP *+2       YES-READ IN ONLY BUFLG AMOUNT 
      LDA BFMAX     SET BUFFER LENGTH TO MAXIMUM
      STA .DMR3 
      CLA 
      STA INBFL     CLEAR INPUT BUFFER LENGTH 
      JSB .DMUP,I   GO TO DMA READ ROUTINE
.DMR1 NOP           CHANNEL NUMBER
.DMR2 NOP           BUFFER ADDRESS
.DMR3 NOP           BUFFER LENGTH 
      JMP .DMR5     ERROR RETURN
.DMR4 EQU * 
      JMP .DMRD,I   EXIT
.DMR5 EQU * 
      JSB STATS     GET STATUS
      STA RDERR     SET READ ERROR FLAG 
      JMP .DMR4     GOTO EXIT ROUTINE 
* 
* 
*         DMA WRITE DRIVER
*CALL:
*     JSB DMAWT,I   HIGH CORE CALL
*     JSB .DMWT     LOW CORE  CALL
*         <NORMAL RETURN> 
*         <NORMAL RETURN> 
*         THE RECORD WORD LENGTH ='BUFLG' 
*         THE OUTPUT BUFFER'S S.A='FWA' 
* 
.DMWT NOP 
      CLA 
      STA WRERR     CLEAR WRITE ERROR FLAG
      LDA FGDMA     FETCH CHANNEL # 
      STA .DMW1     SETUP CHANNEL NUMBER
      LDA FWAM      GET INPUT BUFFER ADDRESS
      STA .DMW2 
      LDA BUFLG     GET BUFFER LENGTH 
      STA .DMW3 
      JSB .DMUP,I   GOTO DMA WRITE ROUTINE
.DMW1 NOP           CHANNEL NUMBER
.DMW2 NOP           BUFFER ADDRESS
.DMW3 NOP           BUFFER LENGTH 
      JMP .DMW5     ERROR RETURN
.DMW4 EQU * 
      JMP .DMWT,I   EXIT
.DMW5 EQU * 
      JSB STATS     GET STATUS
      STA WRERR     SET WRITE ERROR FLAG
      JMP .DMW4 
* 
* 
*         DMAUP- SETUP DMA FOR READ OR WRITE
*         NOTE INTERRUPTS ARE NOT USED
*CALL:
* P   JSB .DMUP,I        HIGH CORE
* P   JSB DMAUP          LOW CORE 
* P+1     <CHANNEL NUMBER>
* P+2     <STARTING ADDRESS OF BUFFER (BIT 15 INPUT)> 
* P+3     <WORD COUNT>
* P+4     <ERROR RETURN>
* P+5     <NORMAL RETURN> 
* 
DMAUP NOP 
      LDA DMAUP,I   GET CHANNEL # 
      STA CHNUM 
      LDA FGINT     GET INTERRUPT FLAG
      SZA,RSS       IS IT ZERO? 
      JMP DMP23     YES-JUMP OVER TRAP CELL SETUP 
      LDA CMD       GET SELECT FOR TRAP CELL
      JSB INTJP,I   SETUP JMP IN TRAP CELL
      DEF TCCMD     BASE PAGE LINK
      DEF DMP20     DESTINATION OF JMP
      LDA DTA       GET SELECT CODE FOR TRAP CELL 
      JSB INTJP,I   SETUP JMP IN TRAP CELL
      DEF TCDAT     BASE PAGE LINK
      DEF DMP10     DESTINATION OF JMP
      LDA CHNUM     GET DMA CHANNEL # 
      ADA .4
      CPA .7        IS IT DMA CH 3? 
      JMP DMP22     YES-GO SET IT UP
      JSB INTJP,I   SETUP TRAP CELL FOR DMA 
      DEF TCDA1     INTERRUPT BASE PAGE LINK
      DEF DMP11     POINTER TO DMA COMPLETION 
      JMP DMP23     JUMP OVER CH 3 SETUP
DMP22 EQU * 
      JSB INTJP,I   SETUP TRAP CELL FOR DMA 
      DEF TCDA2     INTERRUPT BASE PAGE LINK
      DEF DMP11     POINTER TO DMA COMPLETION 
DMP23 EQU * 
      LDA DMP02     LOAD DMA COMMAND
      JSB SETCH     ADD NEW CHANNEL # 
      STA DMP02     REPLACE DMA COMMAND 
      LDA DMP03     LOAD DMA COMMAND
      JSB SETCH     ADD NEW CHANNEL # 
      STA DMP03     REPLACE DMA COMMAND 
      STA DMP05     REPLACE DMA COMMAND 
      STA DMP12     REPLACE DMA COMMAND 
      LDA DMP04     LOAD DMA COMMAND
      JSB SETCH     ADD NEW CHANNEL # 
      STA DMP04     REPLACE DMA COMMAND 
      LDA DMP13     LOAD DMA COMMAND
      JSB SETCH     ADD NEW CHANNEL # 
      STA DMP13     REPLACE DMA COMMAND 
      STA DMP14     REPLACE DMA COMMAND 
