Files
open-roms/c64/basic/printf.s
T

159 lines
2.2 KiB
ArmAsm

;; printf()-like routine for simplifying debugging
;; Prints the literal zero-terminated string that follows,
;; which may also include special tokens that allow
;; printing of hex byte and word values stored at the indicated
;; addresses.
;; .byte 1,$byte = display byte as hex
;; .byte 2,$low,$hi = display word as hex
;; .byte $f0+n,$low,$hi = display byte at $hi$lo+n as hex
printf:
;; Temporary storage is between end of screen at $0400
;; and the sprite pointers at $7f8
sta $7f0
stx $7f1
sty $7f2
php
pla
sta $7f3
;; Set up read routine
lda #$ad ; LDA $nnnn
sta $7f4
lda #$60
sta $7f7 ; RTS
;; Get PC of caller from the stack, so that
;; we can parse through it
pla
clc
adc #$01
sta $7f5
pla
adc #$00
sta $7f6
printf_loop:
jsr $7f4
cmp #$00
bne printf_continues
;; Put return address on stack and restore
;; registers
lda $7f6
pha
lda $7f5
pha
lda $7f3
pha
lda $7f0
ldx $7f1
ldy $7f2
plp
rts
printf_continues:
cmp #$01
bne not_hexbyte
;; Print a hex byte
;; Skip the token
jsr printf_advance
;; Read the low byte
jsr $7f4
;; Print as hex
jsr printf_printhexbyte
jmp printf_nextchar
not_hexbyte:
cmp #$02
bne not_hexword
;; Print a hex word
;; Skip the token
jsr printf_advance
jsr printf_advance
;; Read the high byte
jsr $7f4
;; Print as hex
jsr printf_printhexbyte
;; Skip the token
jsr printf_retreat
;; Read the low byte
jsr $7f4
;; Print as hex
jsr printf_printhexbyte
jsr printf_advance
jmp printf_nextchar
not_hexword:
cmp #$f0
bcc not_pointer
;; Treat two-byte arg as base address
;; and lower 4 bits of token as offset from
;; that location.
;; Get offset
and #$0f
tay
jsr printf_advance
jsr $7f4
sta $fd
jsr printf_advance
jsr $7f4
sta $fe
lda ($fd),y
jsr printf_printhexbyte
jmp printf_nextchar
not_pointer:
;; Print character
jsr JCHROUT
printf_nextchar:
jsr printf_advance
jmp printf_loop
printf_advance:
;; Advance pointer to next character
inc $7f5
bne +
inc $7f6
*
rts
printf_retreat:
;; Retreat pointer to previous char
lda $7f5
sec
sbc #1
sta $7f5
lda $7f6
sbc #0
sta $7f6
rts
printf_printhexbyte:
pha
lsr
lsr
lsr
lsr
ora #$30
cmp #$3A
bcc +
adc #6
* jsr JCHROUT
pla
and #$0f
ora #$30
cmp #$3A
bcc +
adc #6
* jmp JCHROUT