158 lines
2.3 KiB
ArmAsm
158 lines
2.3 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:
|
|
// Print the hex value in .A as two digits, idea by Haubitze
|
|
sed
|
|
pha
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
cmp #$0A
|
|
adc #$30
|
|
jsr JCHROUT
|
|
pla
|
|
and #$0F
|
|
cmp #$0A
|
|
adc #$30
|
|
cld
|
|
jmp JCHROUT
|