     .OUTPI ALFRES
     .ENTRY HEXATA,DECNV,HEXCNV,EHEXCV
     .ENTRY DECRES,HEXNUM,DECNUM

;Updated 04/01/88
;HEXATA - CONVERTS A HEX BYTE TO ITS ATASCII EQUIVALENT
;RESULT RETURNED IN X/Y REGISTERS
HEXATA   TAX         ;SHIFT TO SAVE
         AND #$0F    ;MASK HI BITS
         JSR HXA     ;CONVERT
         TAY         ;SHIFT TO Y REG
         TXA 
         AND #$F0    ;MASK OUT LOW BITS
         LSR A
         LSR A
         LSR A
         LSR A
         JSR HXA
         TAX         ;SHIFT MSB TO X REG
         RTS 
HXA      CMP #$0A
         BCS HXAA    ;BRANCH TO ALPHA
         ADC #48
         RTS 
HXAA     ADC #54     ;ADD 65 TO HEX
         RTS 
;New hex converter, has two entry points
;Entry: HEXCNV  used for 2 byte integers
;Entry: EHEXCV  used for 3 byte integers
;HEXNUM is where the result and target are stored
;
HEXNUM   .BYTE 0,0,0,0,0,0,0,0 ;Source and result area
HEXSAV   .BYTE 0,0,0 ;Temp save area
EDCTAB   .BYTE $80,$96,$98 ;x=10,000,000
         .BYTE $40,$42,$0F ;x=1,000,000
         .BYTE $A0,$86,$01 ;x=100,000
         .BYTE $10,$27,0 ;x=10,000
         .BYTE $E8,$03,0 ;x=1000
         .BYTE $64,0,0 ;x=100
         .BYTE $0A,0,0 ;x=10
         .BYTE 1,0,0 ;x=1 ;Label for Decnv
ECPASS   .BYTE 0     ;pass counter
ECXREG   .BYTE 0     ;old x reg
ECYREG   .BYTE 0     ;old x reg
;
HEXCNV    LDA #0
          STA HEXNUM+2
EHEXCV    LDA HEXNUM ;copy full word
          STA HEXSAV
          LDA HEXNUM+1
          STA HEXSAV+1
          LDA HEXNUM+2
          STA HEXSAV+2
HEXC01  LDY #7
         LDA #'0'
HEXC02  STA HEXNUM,Y ;Zero the output
         DEY 
         BPL HEXC02
         LDA #2
          STA ECXREG
          LDA #7
          STA ECPASS ;8 elements in table
          LDA #0
          STA ECYREG ;Point to highest digit
HEXC03  LDX ECXREG
         LDA HEXSAV+2 ;Get msb of data byte
         CMP EDCTAB,X ;Still room to go
         BCC HEXC05 ;No, smaller than table
         BEQ HEXC09 ;Check lsb
         DEX         ;Yes, so subtract
         DEX 
HEXC04  SEC 
         LDA HEXSAV
         SBC EDCTAB,X
         STA HEXSAV
         INX 
         LDA HEXSAV+1
         SBC EDCTAB,X
         STA HEXSAV+1
         INX 
         LDA HEXSAV+2
         SBC EDCTAB,X
         STA HEXSAV+2
         LDX ECYREG
         INC HEXNUM,X ;Raise the digit
         JMP HEXC03 ;Loop through again
HEXC05  DEC ECPASS  ;Next entry
         BPL HEXC08
         LDY #0
         LDX #6
HEXC06  LDA HEXNUM,Y ;Blank leading zeros
         CMP #'0'
         BNE HEXIT
         LDA #32
         STA HEXNUM,Y
HEXC07  INY 
         DEX 
         BPL HEXC06
HEXIT   RTS         ;Return to caller
HEXC08  INC ECYREG
         INC ECXREG  ;Next table entry
         INC ECXREG
         INC ECXREG
         JMP HEXC03 ;Loop through again
HEXC09  DEX 
         LDA HEXSAV+1
         CMP EDCTAB,X
         BCC HEXC05
         BEQ HEXC0A
         DEX 
         JMP HEXC04 ;Go run conversion
HEXC0A  DEX 
         LDA HEXSAV
         CMP EDCTAB,X
         BCC HEXC05
         JMP HEXC04
;DECNV converts Atascii strings to three byte internal hex format
;Decnum must be loaded with the number, in normal L->R reading style.
;Acc on entry has number of digits
;On Exit, Carry set if conversion failed. Decres will normally contain
;the converted bytes
;
DECNUM   .BYTE 0,0,0,0,0,0,0,0
DECRES   .BYTE 0,0,0
DECNV    TAY         ;Save offset
         LDA #0
         STA DECRES
          STA DECRES+1
          STA DECRES+2
         STY ECYREG
         LDA ECYREG  ;Check stats
         BNE DECV01
DECV00  SEC 
         RTS 
DECV01  CMP #9      ;8 or less ?
         BCS DECV00
         DEY         ;Down to the char
         LDX #21     ;Point to tabletop
DECV03  LDA DECNUM,Y ;Get digit
         CMP #'0'
         BCC DECV00
         BEQ DECV05
         CMP #'9'
         BCC DECV04
         BEQ DECV04
         BCS DECV00 ;Failed
DECV04  LDA EDCTAB,X
         CLC 
         ADC DECRES
         STA DECRES
         LDA EDCTAB+1,X
         ADC DECRES+1
         STA DECRES+1
         LDA EDCTAB+2,X
         ADC DECRES+2
         STA DECRES+2
         LDA DECNUM,Y ;One off
         SEC 
         SBC #1
         STA DECNUM,Y
         BCC DECV03
         BCS DECV03 ;Branch back
DECV05  DEX 
         DEX 
         DEX         ;Shift down
         DEY         ;Next char
         BPL DECV03
         CLC 
         RTS 
