NEW
  AUTO 3,1
*--------------------------------------
*    ERROR PRINTER
*---------------------------------
FIRM.ERROR
       SEC          SIGNAL FIRM ERROR
       .HS 24       SKIP NEXT BYTE
SOFT.ERROR
       CLC          SIGNAL SOFT ERROR
       LDA PASS     SEE IF IN ASSEMBLY
       BMI HARD.ERROR    ...NO
       PHP          SAVE CLC/SEC STATUS
       LDA RDROM
       JSR PRINT.ERROR.MESSAGE
      >INCD ERROR.COUNT
       JSR SPC
       JSR LIST.SOURCE.AT.MARGIN
       JSR CRLF
       PLP          GET SOFT/FIRM STATUS
       BCS JMP.SOFT ...FIRM, ABORT ASSEMBLY
       JMP ASM2     ...SOFT, CONTINUE ASSEMBLY
HARD.ERROR
       JSR PRINT.ERROR.MESSAGE
JMP.SOFT
       JSR RESTORE.IF.IN.INBX
       JMP SOFT
*--------------------------------
RESTORE.IF.IN.INBX
       BIT INFLAG
       BVC .1
       JSR RESTORE
.1     RTS
*--------------------------------
P.EXP.VALUE.DASH
       JSR CHECK.IF.LISTING
       JSR P.EXP.VALUE
P.DASH LDA #'-'
       .HS 2C
P.RETURN
       LDA #$0D
       .HS 2C
SPC    LDA #' '      ONE SPACE
CHO    PHA
       ORA #$80      CHAR OUT
       JSR MY.COUT    SEND THE CHARACTER
       PLA
       RTS
*---------------------------------
*      PRINT A <RETURN>
*      IF IN "SLOW" MODE, DELAY FIRST
*      CHECK KEYBOARD FOR PAUSE OR ABORT
*--------------------------------
CRLF   BIT FLAG.SPEED CHECK SLOW/FAST SPEED
       BPL .1       FAST
       LDA #0       SLOW
       JSR MON.DELAY
.1     JSR CHECK.KEYBOARD.FOR.ABORT
       BCC P.RETURN ...NO KEYPRESS
       BEQ JMP.SOFT ...ABORT
.2     JSR CHECK.KEYBOARD.FOR.ABORT
       BCC .2       WAIT FOR KEYPRESS
       BNE P.RETURN ...CONTINUE
       BEQ JMP.SOFT ...ABORT
*--------------------------------
*      RETURN .CC. AND .NE. IF NO KEYPRESS
*      RETURN .CS. AND .EQ. IF <RETURN> TYPED
*      RETURN .CS. AND .NE. IF ANY OTHER KEY
*--------------------------------
CHECK.KEYBOARD.FOR.ABORT
       CLC
       LDA $C000
       BPL .1
       STA $C010
       CMP #$8D
       SEC
.1     RTS
*--------------------------------
*      PRINT ERROR MESSAGE
*--------------------------------
PRINT.ERROR.MESSAGE
       TYA           SAVE ERROR #
       TAX               IN X-REG
       LDY #QSTARS     "*** "
       JSR QT.OUT
       TXA
       TAY
       JSR QT.OUT
       LDY #QERROR
       JMP QT.OUT
*--------------------------------
*      PRINT LOCATION COUNTER AND DASH
*--------------------------------
P.ORIGIN
       JSR CHECK.IF.LISTING
P.ORIGIN.REGARDLESS
       LDX #7       assume col. 7 after 6-digit origin
       LDY #2
       LDA ORGN+2   If > $FFFF, print 3 bytes
       BNE .1       ...orgn > $FFFF, print 3 bytes
       DEY          ...orgn <$10000, print 2 bytes
       LDX #5       will end up in col. 5
.1     STX EMIT.COLUMN
.2     LDA ORGN,Y      HIGH BYTE FIRST
       JSR MON.PHEX
       DEY
       BPL .2
       JMP P.DASH   PRINT "-"
*--------------------------------
P.EMITTED.BYTE
       JSR CHECK.IF.LISTING
       LDY EMIT.COLUMN
       BEQ .2       ...AT BEGINNING OF LINE
       LDY EMIT.MARGIN
       LDA ORGN+2
       BNE .1
       DEY
       DEY
.1     CPY EMIT.COLUMN
       BCS .3       ...STILL ROOM ON THIS LINE
       BIT LF.XTRA.BYTES
       BMI .4
       JSR CRLF.WITH.PAGING
.2     JSR P.ORIGIN
.3     LDY EMIT.COLUMN
       INY          MAKE ROOM FOR NEXT BYTE
       INY
       INY
       STY EMIT.COLUMN
       JSR SPC
       LDA OBJ.BYTE
       JMP MON.PHEX
.4     RTS
*--------------------------------
P.MARGIN
       SEC
       LDA EMIT.MARGIN
       SBC EMIT.COLUMN
       TAX
       LDA ORGN+2
       BEQ .1
       INX
       INX
.1     JMP MON.PRBL2
*--------------------------------
P.EXP.VALUE
       LDY #3       EXP.VALUE IS 4 BYTES
.1     LDA EXP.VALUE,Y   TRIM LEADING ZERO BYTES
       BNE .2            ...FIRST NON-ZERO BYTE
       DEY
       BNE .1            ...STILL NOT LAST BYTE
.2     TYA
       ASL
       ADC #3
       STA EMIT.COLUMN
.3     LDA EXP.VALUE,Y   PRINT REST OF EXP.VALUE
       JSR MON.PHEX
       DEY
       BPL .3
       RTS
*--------------------------------
CHECK.IF.LISTING
       LDA PASS
       BEQ .1       ...NO LISTING IN PASS 1
       LDA LF.ALL
       BPL .2       ...YES, LIST
.1     PLA          POP RETURN
       PLA
.2     RTS
*--------------------------------
LIST.LINE.BOTH.PASSES
       LDA PASS
       BEQ .1       DEFINITE IN PASS 1
       LDA LF.ALL
       BPL .2       ...ALREADY DID CRLF
.1     JSR CRLF.WITH.PAGING
.2     JSR P.ORIGIN.REGARDLESS
       JMP LIST.SOURCE.REGARDLESS
*---------------------------------
*      CONVERT LINE NUMBER
*      (CURRENT.LINE.NUMBER) = NUMBER TO USE
*---------------------------------
CONVERT.LINE.NUMBER.BOTH
       LDA #$C0     PRINT FLAG ON, STORE FLAG ON
       .HS 2C       SKIP NEXT 2 BYTES
CONVERT.LINE.NUMBER.STORE
       LDA #$80     PRINT FLAG OFF, STORE FLAG ON
       .HS 2C       SKIP NEXT 2 BYTES
CONVERT.LINE.NUMBER.PRINT
       LDA #$40     PRINT FLAG ON, STORE FLAG OFF
       PHA
       LDX #3       CONVERT 4 DIGITS
       LDA CURRENT.LINE.NUMBER
       CMP #10000
       LDA CURRENT.LINE.NUMBER+1
       SBC /10000
       BCC .1       4 DIGITS WILL DO IT
       INX          5 DIGITS
.1     PLA
*--------------------------------
*   CONVERT (CURRENT.LINE.NUMBER)
*      (X) = ONE LESS THAN NUMBER OF DIGITS
*      (A) = FLAGS:  BIT 7 = 1 MEANS TO STORE AT WBUF,Y
*                    BIT 6 = 1 MEANS TO PRINT
*--------------------------------
CONVERT.LINE.NUMBER
       STA CONV.CTRL
.5     LDA #$B0     SET DIGIT TO ASCII ZERO
.1     PHA          PUSH DIGIT ON STACK
       SEC          SUBTRACT CURRENT DIVISOR
       LDA CURRENT.LINE.NUMBER
       SBC PLNTBL,X
       PHA          SAVE BYTE ON STACK
       LDA CURRENT.LINE.NUMBER+1
       SBC PLNTBH,X
       BCC .2       LESS THAN DIVISOR
       STA CURRENT.LINE.NUMBER+1
       PLA          GET LOW BYTE OFF STACK
       STA CURRENT.LINE.NUMBER
       PLA          GET DIGIT FROM STACK
       ADC #0       INCREMENT DIGIT
       BNE .1       ...ALWAYS
.2     PLA          DISCARD BYTE FROM STACK
       PLA          GET DIGIT FROM STACK
       BIT CONV.CTRL
       BVC .3       NO PRINT
       JSR MON.COUT PRINT CHARACTER
.3     BIT CONV.CTRL      TEST BUFFER STORAGE FLAG
       BPL .4       OFF, DO NOT STORE IN BUFFER 
       STA WBUF,Y
       INY
.4     DEX          NEXT DIGIT
       BPL .5
       RTS          RETURN
*---------------------------------
PLNTBL .DA #1
       .DA #10
       .DA #100
       .DA #1000
       .DA #10000
PLNTBH .DA /1
       .DA /10
       .DA /100
       .DA /1000
       .DA /10000
*--------------------------------------
MAN
SAVE usr/src/scmasm.30/scmasm.s.output
LOAD usr/src/scmasm.30/scmasm.s
ASM
