      HED PCOP,ERROR,B11CK,SWR,PRINT,PRNT1,FPRNT,CNVRT,TTYCK
* 
PCOP  NOP                ROUTINE TO PRINT COPR
      LDA COPRN 
      JMP PCOPI,I 
* 
*     ERROR 
*      REPORT ERROR MESSAGES
*      USES SIOLO,SWR,B11CK 
*      THE RETURN ADDRESS IS USED TO LOOK UP THE ADDRESS,LENGTH AND 
*      NUMBER OF THE ERROR MESSAGE
* 
ERROR NOP 
      CLF 0         DISABLE INTERRUPTS
      CCB 
      ADB ERROR 
      LDA EFER,I    FIND ERROR NUMBER BASED ON RETRN
ER2   EQU * 
      CPB A,I       ADDRESS AND TABLE 
      JMP ER1       FOUND IT
      INA 
      CPA ELER,I
      JMP 1777B     PROGRAM ERROR,PAGE 0 MAY BE 
*                                     WIPED OUT.
      JMP ER2 
ER1   EQU * 
      ADA EFERC,I 
      ADA MM1 
      STA ELOC
      JSB FPRNT     PRINT MESSAGE 
      LDB ELOC
      ADB MM8       -8
      SSB           SKIP IF ERROR NUMBER GTR THAN 7 
      JSB ERHTI,I   CHECK FOR HALT
      JMP ERROR,I 
* 
*     B11CK 
*      IF TTY SUPPRESSED,RETURN 
*      IF TTY NOT SUPPRESSED,SKIP NEXT INSTRUCTION ON RETURN
*      USES SWR 
* 
B11CK NOP 
      JSB SWR 
      AND BIT11 
      SZA,RSS       IS TTY SUPPRESSED?
      ISZ B11CK     NO
      JMP B11CK,I 
* 
*     SWR 
*      INPUT SWITCH REGISTER TO A-REGISTER
* 
SWR   NOP 
      LIA 1 
      IOR ISR       CAPTURE ALL SWITCHES
      STA ISR        WHICH ARE SET
      LIA 1 
      JMP SWR,I 
* 
*     PRINT 
*      A = ERROR NUMBER 
* 
PRINT NOP 
      JSB PRNT1     GET ADDRESS AND LENGTH
      JMP PRINT,I   TTY SUPPRESSED
      JSB SIOLO,I   OUTPUT MESSAGE
      JMP PRINT,I 
* 
*     PRNT1 
*      EXITS WITH B=MESSAGE ADDRESS 
*                 A=MESSAGE LENGTH
* 
PRNT1 NOP 
      STA PSAVE 
      JSB B11CK 
      JMP PRNT1,I 
      ISZ PRNT1 
      LDB PSAVE 
      ADB PFMI,I    MESSAGE ADDRESS 
      LDB B,I 
      STB PSAVE     SAVE ADDRESS
      CLA 
      STA LOCAL     LENGTH COUNTER
* 
*     SCAN MESSAGE UNTIL #
* 
PLOOP EQU * 
      LDA B,I       NEXT TWO CHARACTERS 
      CPA C1440     21440B = #,BLANK? 
      JMP L1        YES 
      AND B377      NO
      CPA B43       =#? 
      JMP L2        YES 
      ISZ LOCAL     NO
      ISZ LOCAL 
      ISZ B 
      JMP PLOOP 
L2    EQU * 
      ISZ LOCAL 
L1    EQU * 
      LDB PSAVE     ADDRESS 
      LDA LOCAL     LENGTH
      JMP PRNT1,I   RETURN
* 
* 
*     FPRNT 
*      OUTPUT TO FAST DEVICE IF CONFIGURED
* 
FPRNT NOP 
      LDB 113B      IS FAST DEVICE
      SZB            CONFIGURED?
      JMP FPR1      YES 
      JSB PRINT     OUTPUT TO SLOW DEVICE 
      JMP FPRNT,I 
FPR1  EQU * 
      JSB PRNT1     GET MESSAGE AND LENGTH
      JMP FPRNT,I   TTY SUPPRESSED
      JSB SIOFO,I 
      JMP FPRNT,I 
* 
* 
*         CNVRT CLEARS E AND CALLS O2ASC
* 
CNVRT NOP 
      CLE 
      JSB O2ASC,I 
      JMP CNVRT,I 
* 
*     TTYCK 
*      RETURN IF TTY NOT AVAILABLE FOR NON-ERROR MESSAGES 
*      INCREMENT RETURN ADDRESS IF PRINTOUT OK
* 
TTYCK NOP 
      JSB SWR       LOAD SWITCH REGISTER
      AND B6000 
      SZA,RSS       IS TTY AVAILABLE? 
      ISZ TTYCK     YES 
      JMP TTYCK,I   RETURN
      HED DECIN,DCIN1,DCIN2,SWR4
* 
*     DECIN 
*      CONVERTS DECIMAL INTEGERS TO ASCII 
*      A=VALUE ON INPUT 
*      CVT1 = MIDDLE TWO DIGITS ON EXIT 
*      CVT2 = LAST TWO DIGITS ON EXIT 
* 
DECIN NOP 
      CLE 
      LDB CVT       TEMPORARY STORAGE BUFFER
      JSB I2ASC,I 
      JMP DECIN,I 
* 
* 
*     DCIN1 
*      STORE ONE WORD OF CONVERTED A AT B 
* 
DCIN1 NOP 
      STB LOCAL     SAVE POINTER
      JSB DECIN     CONVERT TO ASCII
      LDA CVT2      STORE 
      STA LOCAL,I    INTO MESSAGE 
      JMP DCIN1,I 
* 
*     DCIN2 
*      STORE TWO WORDS OF CONVERTED A STARTING AT B 
* 
DCIN2 NOP 
      STB LOCAL     SAVE POINTER
      JSB DECIN     CONVERT TO ASCII
      LDA CVT1      STORE 
      LDB LOCAL      TWO
      STA B,I         WORDS 
      INB              INTO 
      LDA CVT2          MESSAGE 
      STA B,I 
      JMP DCIN2,I 
* 
* 
*     SWR4
*      INPUT SWITCH REGISTER IF SFLAG = 0 (S1,S2,S3)
*      USE STORED VERSION IF SFLAG = 1 (S4,S5)
* 
SWR4  NOP 
      LDA SFLAG     IS FLAG = O?
      SZA 
      JMP SWR4A     NO
      JSB SWR       YES,USE SWITCH REGISTER 
      JMP SWR4,I
SWR4A LDA S400      USE 
      ADA UNIT       STORED 
      LDA A,I         VALUE 
      JMP SWR4,I
      HED DCHK,WCHK 
* 
* 
*         THE DCHK ROUTINE IS CALLED AFTER A READ.
*     IT COMPARES THE READ AND WRITE BUFFERS. 
* 
*         THE WCHK ROUTINE IS CALLED AFTER A WRITE. 
*     IT CHECKS ONLY THE STATUS.
*     THE WRERX AND WRERZ ENTRIES ARE USED BY THE 
*     OTHER ROUTINES TO DO THEIR STATUS CHECK.
* 
* 
*         THE PCHK ROUTINE IS CALLED AFTER A READ.
*     IT COMPARES THE READ BUFFER TO A PATTERN WORD.
* 
*         THE RCHK ROUTINE IS CALLED AFTER A READ.
*     IT CHECKS THE CHECKSUMMED SECTOR IN 
*     THE READ BUFFER.
* 
*         THEY COMPARE THE CURRENT STATUS ( STAUS ) WITH THE
*     PREDICTED STATUS ( SHTAS ) BY CALLING THE ERRAN ROUTINE.
* 
* 
*         THE ROUTINES GIVE A NORMAL RETURN IF NO ERRORS ARE
*     DETECTED.  IF AN ERROR OCCURS, THE ROUTINES GENERATE AN 
*     ERROR MESSAGE AND CHECK FOR HALT OR CONTINUE. 
* 
* 
DCHK  NOP                TO CHECK FOR ERRORS IN 
*                                  READ AND TO COMPARE READ 
*                                  AND WRITE BUFFERS
      LDA DCHK     LOAD RETURN ADDRESS
      STA WCHK     SAVE FOR POSSIBLE CALL 
* 
* 
*         COMPARES THE BUFAD AND BUFAE BUFFERS USING WCNT 
*     FOR BUFFER LENGTH.
* 
* 
      LDA BUFAD    LOAD FIRST BUFFER ADDRESS
      STA TEMP1 
      LDA BUFAE    LOAD SECOND BUFFER ADDRESS 
      STA TEMP2 
      LDA WCNT
      CMA,INA 
      STA TEMP3    SET ISZ COUNTER
DCM   EQU * 
      LDA TEMP1,I 
      CPA TEMP2,I 
      JMP DCL      EQUAL COMPARE
* 
      LDA TEMP3 
      ADA WCNT     GENERATE RELATIVE LOCATION 
EE101 LDB P047A     LOAD POINTER
      JSB DCIN2     CALL CONVERT ROUTINE
      LDA TEMP1,I  LOAD WHAT WORD SHOULD BE 
      LDB P047C     LOAD POINTER
      JSB CNVRT     CALL CONVERT AND MOVE ROUTINE 
      LDA TEMP2,I  LOAD WHAT WORD ACTUALLY WAS
      LDB P047B     LOAD POINTER
      JSB CNVRT     CONVERT TO ASCII
      LDA NUMP      DECREMENT 
      ADA MM1        PRINTOUT COUNT 
      SZA,RSS 
      JMP DCLA      IF 1 LEAVE AT 1 AND EXIT
      STA NUMP
E47   JSB ERROR     DATA WORD XXXX IS YYYYYY SHOULD 
*                                   BE ZZZZZZ 
      JMP DCL 
DCLA  EQU * 
      LDB B47       DATA WORD XXXX IS YYYYYY SHOULD 
*                                   BE ZZZZZZ 
      STB ELOC      SAVE FOR ERHLT
      STB STRF
      JMP WRERZ    GO ANALYZE ERRORS
* 
* 
DCL   EQU * 
      ISZ TEMP1    COUNT UP BUFFER
      ISZ TEMP2    ADDRESSES AND
      ISZ TEMP3    CHECK FOR COMPLETION 
      JMP DCM 
      JMP WRERX    BUFFERS OKAY, NORMAL STATUS CHECK
      SKP 
* 
* 
WCHK  NOP                TO CHECK FOR ERRORS ON 
*                                  NON-READ OPERATIONS
WRERX EQU * 
      JSB ERRAN    CALL ERROR COMPARITOR
      SZA          SKIP IF NO ERROR 
      JMP WRERZ     REPORT ERROR
      LDA DMRF     CHECK FOR DMA NOT FINISHED 
      SZA,RSS      SKIP IF ERROR
      JMP WOUT      RETURN IF NO TROUBLE
      JSB PCOP     PRINT CURRENT OPERATION MESSAGE
      JSB DMERQ    PRINT DMA ERROR MESSAGE
WROUT JSB ADDOI,I 
WOUT  JMP WCHK,I    RETURN
* 
* 
WRERZ EQU * 
      JSB PCOP     PRINT CURRENT OPERATION MESSAGE
      JSB DMERQ    CHECK FOR DMA ERROR
      JSB ERRAN    CHECK FOR STATUS ERRORS
      SZA          SKIP IF STATUS OKAY
      JSB FPRNT     PRINT OUT ERROR MESSAGE 
      LDA STRF      CHECK FOR BUFFER ERRORS 
      SZA           SKIP IF NO SUCH ERRORS
      JSB FPRNT     PRINT OUT ERROR MESSAGE 
      CLB 
      STB STRF     CLEAR OUT POINTER WORD 
      JMP WROUT 
      HED ERRAN 
ERRAN NOP           ROUTINE TO PERFORM ERROR ANAL.
      LDA STAUS 
      XOR SHTAS    IS ALL AS SHOULD BE
      SZA,RSS 
      JMP ERRAN,I  EVERYTHING IS FINE 
      LDA STAUS    LOAD CURRENT STATUS
      LDB P064A     AND ADDRESS FOR ASCII 
      JSB CNVRT     CONVERT TO OCTAL AND MOVE 
      LDA SHTAS    LOAD WHAT STATUS SHOULD BE 
      LDB P064B     AND ADDRESS FOR ASCII 
      JSB CNVRT     CONVERT TO OCTAL AND MOVE 
E64   LDA B64       STATUS IS XXXXXX SHOULD BE XXXXXX 
      STA ELOC      SAVE FOR ERHLT
*                                  A MUST BE NON-ZERO AT THIS POINT 
      JMP ERRAN,I  RETURN 
      HED DGEN,RFNE,CYCK,DMRFC,ENDST
*         DGEN
*     THIS ROUTINE FILLS UP THE BUFFER WITH RAW RANDOM DATA 
*     USES WCNT AS A LENGTH 
*     USES BUFAD FOR ADDRESS
* 
* 
DGEN  NOP 
      LDA WCNT
      CMA,INA 
      STA TEMP1    NEGATIVE WORD COUNT
      LDA BUFAD 
      STA TEMP2 
DGL   EQU * 
      JSB RAND     GET RANDOM NUMBER
      STA TEMP2,I 
      ISZ TEMP2    COUNT UP ADDRESS 
      ISZ TEMP1    COUNT
      JMP DGL 
      JMP DGEN,I
* 
*     RFNE
*      ISSUE REFINE COMMAND 
* 
RFNE  NOP 
      LDB B60       SET UP CURRENT OPERATION
      LDA RFINE     REFINE COMMAND
      JSB COMMD     ISSUE COMMAND 
      JSB WAITS     WAIT FOR COMPLETION 
      JMP RFNE,I    RETURN
* 
*     CYCK
*      ISSUE CYCLIC CHECK COMMAND 
* 
CYCK  NOP 
      LDB B22       SET UP CURRENT OPERATION
      JSB DADO      A = NUMBER OF SECTORS ON ENTRY
      LDA CYCHK     CYCLIC CHECK COMMAND
      JSB COMMD     ISSUE COMMAND 
      JSB WAITS     WAIT FOR COMPLETION 
      JMP CYCK,I    RETURN
* 
*     DMRFC 
*      REMOVE BIT 15 FROM DMRF
* 
DMRFC NOP 
      LDA DMRF
      AND H7777     =77777B 
      STA DMRF
      JMP DMRFC,I 
* 
*     ENDST 
*      END OF STEP ROUTINE
* 
ENDST NOP 
      JSB SWR       GET SWITCH REGISTER 
      SSA 
      HLT 4         HALT IF BIT 15 SET
      JSB SWR       GET FRESH COPY OF SWITCH REG. 
      AND BIT1
      SZA 
      JMP END1      SKIP
      JSB SWR 
      AND BIT13 
      SZA,RSS 
      JMP ENDST,I 
      JMP COPR,I    LOOP IF BIT 13 SET
END1  EQU * 
      LDA STEPN     INCREMENT 
      CPA D51        S4BUG
      RSS             FOR STEPS 
      CPA D52          51 AND 
      ISZ S4BUG         52
      JMP SKIPI,I 
      HED  DMR,DMW,DMALL
* 
* 
*         THESE ROUTINES SET UP DMA AND START THE DATA CHANNEL. 
* 
*     THE DMR ROUTINE SETS UP A READ INTO THE INPUT 
*     BUFFER ( ADDRESS IN BUFAE, COUNT IN WCNT )
* 
*     THE DMW ROUTINE SETS UP A WRITE FROM THE OUTPUT 
*     BUFFER ( ADDRESS IN BUFAD, COUNT IN WCNT )
* 
* 
DMR   NOP           SET UP DMA READ OPERATION 
     JMP DMRI,I 
DMRI DEF DMRR 
* 
* 
DMW   NOP 
      JMP DMWI,I
DMWI  DEF DMWW
* 
DMALL NOP       (A = MEMORY ADDRESS)
      LDB  DMACW      LOAD DMA COMMAND WORD 
DM6A  OTB  DMAD       SEND TO DATA CHANNEL
DM2A  CLC  DMAC       PREPARE TO LOAD ADDRESS 
DM2B  OTA  DMAC       OUTPUT MEMORY ADDRESS 
DM2C  STC  DMAC       PREPARE TO LOAD COUNT 
      LDA  WCNT       AND 
      CMA,INA         OUTPUT TWOS COMPLEMENT OF 
DM2D  OTA  DMAC       WORD COUNT
      JMP  DMALL,I
      HED READ,WRITE
* 
* 
*         READ AND WRITE
* 
*     THESE ROUTINES ARE CALLED TO INITIALIZE ALL 
*     DMA TRANSFERS TO AND FROM THE DISK. 
* 
*     THEY ASSUME THAT
*         THE WORD COUNT IS IN WCNT 
*         READ ASSUMES BUFFER ADDRESS IN BUFAE
*         WRITE ASSUMES BUFFER ADDRESS IN BUFAD 
* 
* 
READ  NOP 
      JSB DMR      SET UP DMA READ OPERATION
      LDB  B46       SET UP CURRENT OPERATION 
      LDA READC    LOAD READ COMMAND
      JSB COMMD    OUTPUT COMMAND 
      JSB DMAT
      JSB STAT     GET STATUS 
      JMP READ,I   RETURN 
* 
* 
* 
WRITE NOP 
      JSB DMW      SET UP DMA WRITE OPERATION 
      LDB  B45       SET UP CURRENT OPERATION 
      LDA WRITC    LOAD WRITE COMMAND 
      JSB COMMD    OUTPUT COMMAND 
      JSB DMAT
      JSB STAT     GET STATUS 
      JMP WRITE,I 
      HED DMAT
* 
* 
* 
*     THIS SECTION SHOULD BE CALLED FOR EACH TRANSFER USING THE 
*     DMA.  IT CONTINUOUSLY CHECKS FOR THE FLAG TO BE SET ON THE
*     COMMAND CHANNEL WHILE MONITORING THE DATA TRANSFER AND
*     CHECKING FOR OVERTIME.
* 
* 
* 
DMAT  NOP 
      LDA MM650     ALLOW 650 MSEC WORST CASE 
      STA LCNT     SET EXTRA CLOCK
      LDA DMSP      WILL THIS DMA TRANSFER
      SZA,RSS        BE INTERRUPTED?
      JMP DMSL      NO
DM2I  LIA DMAC      LOAD CURRENT WORD COUNT 
      STA TEMP1    AND SAVE IT FOR COMPARISON 
      LDB  BIT15     ALLOWS LOTS OF TIME
DMBL  EQU * 
      INB 
      SZB,RSS       WAITED LONG ENOUGH? 
      JMP DMSP      YES 
DM2J  LIA DMAC      LOAD CURRENT WORD COUNT 
      CPA TEMP1    CHECK FOR START OF OPERATION 
      JMP DMBL     IF OPERATION HAS NOT STARTED DATA
* 
*                  THIS LOCATION IS USED BY ROUTINES THAT 
*                  MUST INTERRUPT THE DMA TRANSFER. 
DMSP  NOP           *** 
* 
DMSL  EQU *         RUNS AROUND CHECKING FOR END
*                                  OF OPERATION FLAG. 
*                                  TIMES OUT WHEN LCNT GOES POSITIVE
      CLA,INA 
      JSB TMR,I     DELAY FOR ONE MSEC
      ISZ LCNT
      CLA,RSS 
      JMP TOUT     TIME OUT 
CC04  SFS CC
      JMP DMSL      NO FLAG YET.
DM6G  SFC DMAD      SKIP IF DMA NOT DONE
      JMP DMAT,I    EVERYTHING IS ALRIGHT 
      JMP FTCX     CALL WORD COUNT CONVERTER
* 
TOUT  EQU * 
      CLA,INA 
DM6H  SFS DMAD      CHECK FOR FLAG ON DMA CHANNEL 
FTCX  EQU * 
      IOR BIT15    TRANSFER NOT COMPLETE BIT
      STA DMRF     SAVE FOR LATER CHECK 
      JSB MC       TROUBLE.  BOMB OUT CARDS 
DM2K  LIA DMAC      LOAD CURRENT WORD COUNT 
      SZA,RSS       RESIDUE = 0?
      JMP DMATA     YES-DISABLE E13,CHECK FOR E43 
      ADA WCNT     MAKE INTO POSITIVE WORD COUNT
      AND B7777     MASK OFF UPPER THREE BITS 
      LDB P013A     LOAD POINTER FOR ASCII STORE
      JSB DCIN2     CALL CONVERT ROUTINE
      JMP DMAT,I   RETURN AND WAIT FOR VERDICT
DMATA EQU * 
      LDA DMRF
      SSA 
      XOR PALT      =130000B - BIT 15 OFF,BIT 13 ON 
      STA DMRF
      JMP DMAT,I
* 
* 
MC    NOP           MASTER CLEAR
DM6E  CLC DMAD
DM6F  STF DMAD      KILL DMA TRANSFER 
CC06  CLC CC
DC11  CLC DC
DC22  STF DC
      JMP MC,I
* 
* 
DMERQ NOP 
      LDB DMRF      CHECK FOR ACTUAL ERROR
      SZB,RSS       SKIP IF ERROR CONDITION EXISTS
      JMP DMERQ,I  EXIT IF NO ERROR 
      SLB           SKIP IF NOT TIME OUT
E14   JSB ERROR     NO COMMAND FLAG ON DMA OPERATION
      LDB DMRF
      RBL,RBL 
      SSB           SKIP IF BIT 13 = 0
E43   JSB ERROR     DMA MISSING 
      LDB DMRF
      CLA 
      STA DMRF     CLEAR ERROR INDICATOR
      SSB,RSS      SKIP IF DMA FLAG WAS NOT SET 
      JMP DMERQ,I  RETURN 
* 
      LDA WCNT     LOAD THE EXPECTED WORD COUNT 
      LDB P013B     LOAD POINTER FOR ASCII STORE
      JSB DCIN2     CALL CONVERT ROUTINE
E13   JSB ERROR     XXXX WORDS TRANSFERRED YYYY 
*                                   EXPECTED
      JMP DMERQ,I  RETURN 
      HED CHAR,DCHAR,OCHAR,HIN,H31
* 
* 
*     CHAR
*      GET NEXT NON-BLANK CHARACTER 
*      WONT SKIP IF BUFFER EMPTY
* 
CHAR  NOP 
CHAR1 ISZ CCNT      DONE? 
PPT3  RSS           NO
      JMP CHAR,I    YES 
      LDA BPTRA,I   TTY WORD
      ISZ IFRST 
      JMP SEC 
      ALF,ALF       USE LEFT HALF 
      JMP COUT
SEC   CCB           USE RIGHT HALF
      STB IFRST 
      ISZ BPTRA     BUMP WORD POINTER 
COUT  AND B377
      STA CCHAR     SAVE IT 
      XOR B40       IS IT BLANK 
      SZA,RSS       SKIP IF NO
      JMP CHAR1     IGNORE BLANKS 
      LDA CCHAR 
      ISZ CHAR
      JMP CHAR,I
* 
* 
*     DCHAR 
*      GET DECIMAL VALUE
*      SKIPS ON EXIT IF NOT DONE
* 
DCHAR NOP 
      LDA MM58      UPPER LIMIT 
      LDB VAL       POINTS TO VALUE 
DCHR1 STA VAL2
      STB VAL1
      LDA MM1 
      STA DFLT      DFLT = -1 
      CLA           INITIALIZE TO ZERO
DCHR2 STA VALUE     STORE VALUE 
      JSB CHAR      GET NEXT CHARACTER
      JMP DOUT2     DONE
      XOR B54       IS CHARACTER
      SZA,RSS        A COMMA
      JMP DOUT1     YES,DONE
      LDA VAL2      CHECK 
      ADA CCHAR      VALIDITY 
      SSA             OF
      JMP *+3          CHARACTER
CCERR JSB H31       BAD INPUT 
      JMP DOUT2 
      LDA CCHAR 
      ADA MM48      LOWER LIMIT 
      SSA 
      JMP CCERR 
      STA DFLT      DFLT # -1 
      LDB VALUE     OK,BUILD
      BLF,RBR        UP 
      ADB VAL1,I    VALUE 
      ADB VAL1,I
      ADA B 
      JMP DCHR2     CONTINUE
DOUT1 ISZ DCHAR     NORMAL EXIT 
DOUT2 LDA VALUE     ERROR OR END OF READ BUFFER 
      JMP DCHAR,I 
* 
* 
*     OCHAR 
*      GET OCTAL VALUE
*      SKIPS ON EXIT IF NOT DONE
* 
OCHAR NOP 
      LDA OCHAR 
      STA DCHAR     SET RETURN
      LDA MM56      UPPER LIMIT 
      LDB DDD       POINTS TO D0
      JMP DCHR1 
* 
* 
*     HIN 
*      INPUT FROM TTY 
* 
HIN   NOP 
      LDA D72       CHARACTER COUNT 
      LDB BINA      BUFFER ADDRESS
      JSB 104B,I    TTY INPUT DRIVER
      SZA,RSS       WERE ZERO WORDS INPUT?
      JMP HIN+1     YES,TRY AGAIN 
      CMA 
      STA CCNT      SAVE CHARACTER COUNT
      CCA 
      STA IFRST     FLAG = -1 
      LDA BINA
      STA BPTRA     SET POINTER 
      JMP HIN,I 
BINA  DEF BUFB
* 
* 
H31   NOP 
      LDA B31       BAD INPUT 
      JSB PRINT 
      JMP H31,I 
* 
      HED OVJ,ASK 
OVIJS JMP OVJ 
OVJ   EQU * 
      LDA C0001     OVBIT+AEBIT 020001
      STA SHTAS     WHAT STATUS SHOULD BE 
      CLA 
      STA DMSP      SET BACK TO NO-OP 
      LDA M256      ALLOW A SHORT WAIT FOR THE FLAG 
OVJR  EQU * 
      SSA,INA,RSS   DON'T HANG FOREVER
      JMP OVJX      PRETEND FLAG SET
DM6I  SFS DMAD      SKIP WHEN DMA DONE
      JMP OVJR      BACK IF NOT DONE
      JSB DADO      OUTPUT ONE EXTRA WORD . . . LATE
OVJX  EQU * 
      JMP DMSL
* 
*     ASK 
*      ASK OPERATOR IF HE WISHES TO CHANGE TABLE
* 
ASK   NOP 
H25   LDA B25       DO YOU WISH TO CHANGE TABLE?
      JSB PRINT 
      JSB HIN       INPUT FROM KEYBOARD 
      LDA BINA,I    INPUT BUFFER
      AND P7400 
      XOR NN        =47000B IS FIRST CHARACTER N? 
      SZA,RSS       SKIP IF NO
      JMP ASK,I 
      XOR YY        =13400B IS FIRST CHARACTER Y? 
      SZA 
      JMP H25       TRY AGAIN 
      ISZ ASK 
      JMP ASK,I 
      ORG 1777B 
DONE  NOP           ALLOW JUMP FROM ANY PAGE
                                                                                                                                                                                                                                    