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

132 lines
1.8 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.
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:
;; Print character
jsr $ffd2
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 $ffd2
pla
and #$0f
ora #$30
cmp #$3A
bcc +
adc #6
* jmp $ffd2