;HEX/DEC by J.MATTHEWS, MD 2/28/87
ORG $4000
OBJ $4000
MSB ON
DEC0 EQU $06
DEC1 EQU DEC0+1
DEC2 EQU DEC0+2
CH EQU $24 ;cursor hor. pos.
CV EQU $25 ;cursor vert. pos.
YSAVE EQU $2E
INDEX EQU $2F ;to BUF
TEXTPT EQU $3A
A1 EQU $3C
A2 EQU $3E
MP EQU $50 ;multiplier/result of MUL
ML EQU $54 ;multiplicand
BUF EQU $200 ;keyboard buffer
PRYX EQU $F940 ;print YX as 4 hex digits
BASCL EQU $FBC1 ;form screen base address
HOME EQU $FC58 ;home and clear screen
GETLN EQU $FD6F ;get a line, no prompt
CROUT EQU $FD8E ;print <CR>
PRBYT EQU $FDDA ;print A as 2 hex digits
COUT EQU $FDED ;print A as ascii
GETNM EQU $FFA7 ;get hex number
ZMODE EQU $FFC7 ;set mode 0 for GETNM
;
JSR HOME
JSR PRTEXT
ASC 'HEX/DEC Conversion by '
ASC 'J. Matthews, M.D.'
DFB $8D
ASC '-------------------------'
ASC '--------------'
DFB $8D
ASC 'Enter number to be converted '
ASC '& press'
DFB $8D
ASC '<return>; preceed hex with $; '
ASC 'Q quits.'
DFB $00
PROMPT JSR CROUT
JSR CROUT
JSR PRTEXT
ASC '# '
DFB $00
JSR GETLN
STX INDEX
DEC CV ;stay on input line
LDA CV
JSR BASCL
INX ;advance CH
INX
STX CH
LDY #$00
LDA BUF,Y
CMP #'Q
BEQ BASIC
CMP #'q
BEQ BASIC
CMP #'$
BNE DEC ;no $ so must be decimal
JSR ZMODE
INY ;skip the $ sign
JSR GETNM
JSR PRTEXT
ASC ' = '
DFB $00
LDX A1
LDA A1+1
JSR PRDEC
LDA A1+1
CMP #$80
BCC PROMPT ;>32767 output 2's complement
JSR PRTEXT
ASC ' = -'
DFB $00
SEC
LDA #$00
SBC A1
STA A1
LDA #$00
SBC A1+1
LDX A1
JSR PRDEC
TOPROM JMP PROMPT
BASIC JSR CROUT
JMP $3D0
DEC LDY #$00
STY A1
STY A1+1
LDX INDEX
DEX
NXTDIG LDA BUF,X
CMP #$AD ;'-'
BEQ NEG
SEC
SBC #$B0
STA ML
LDA #$00
STA ML+1
STA MP+2
STA MP+3
LDA PWR,Y
STA MP
INY
LDA PWR,Y
STA MP+1
TYA
PHA
TXA
PHA
JSR MUL
PLA
TAX
PLA
TAY
CLC
LDA MP
ADC A1
STA A1
LDA MP+1
ADC A1+1
STA A1+1
INY
DEX
BPL NXTDIG
HEX JSR PRTEXT
ASC ' = $'
DFB $00
LDX A1
LDY A1+1
JSR PRYX
LDA #$00
BEQ TOPROM
NEG JSR PRTEXT
ASC ' = '
DFB $00
SEC
LDA #$00
SBC A1
STA A1
LDA #$00
SBC A1+1
STA A1+1
LDX A1
JSR PRDEC
JMP HEX
PWR DFB $01,$00,$0A,$00,$64,$00,$E8,$03,$10,$27
;
; PRTEXT (relocatable)
;
; Print text starting after
; JSR PRTEXT and ending #$00
; A reg destroyed; X&Y intact.
;
PRTEXT PLA ;get return address
STA TEXTPT ;as text pointer.
PLA
STA TEXTPT+1
STY YSAVE
LDY #$00
NXTCHR INC TEXTPT
BNE CHROUT
INC TEXTPT+1
CHROUT LDA (TEXTPT),Y
BEQ RSTR
JSR COUT
CLC
BCC NXTCHR
RSTR LDY YSAVE
LDA TEXTPT+1
PHA
LDA TEXTPT
PHA
RTS
;
; MULTIPLY MP by ML and save in MP
;
MUL LDY #$10
MUL2 LDA MP
LSR A
BCC MUL4
CLC
LDX #$FE
MUL3 LDA ML,X
ADC ML+2,X
STA ML,X
INX
BNE MUL3
MUL4 LDX #$03
MUL5 ROR MP,X
DEX
BPL MUL5
DEY
BNE MUL2
RTS
;
; PRDEC X=LO, A=HI
;
PRDEC STX A2
STA A2+1
LDA #$00
STA DEC0
STA DEC1
SED
LDY #$10
LOOP ASL A2
ROL A2+1
LDA DEC0
ADC DEC0
STA DEC0
LDA DEC1
ADC DEC1
STA DEC1
ROL DEC2
DEY
BNE LOOP
CLD
LDA DEC2
JSR $FDE5
LDA DEC1
JSR PRBYT
LDA DEC0
JSR PRBYT
RTS