deduplicated 'printf.s', over 200 bytes saved in BASIC segment
This commit is contained in:
1 parent
94b8e0dc29
commit
332438145c
4 files changed
+32
-201
No files matched your search
@@ -0,0 +1,7 @@
|
||||
|
||||
// Routines imported from Kernal - our private API
|
||||
|
||||
#import "KERNAL_combined.sym"
|
||||
|
||||
.label printf = KERNAL.printf
|
||||
.label printf_printhexbyte = KERNAL.printf_printhexbyte
|
||||
@@ -1,185 +0,0 @@
|
||||
// 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
|
||||
|
||||
#if HAS_BCD_SAFE_INTERRUPTS
|
||||
|
||||
// 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
|
||||
|
||||
#else
|
||||
|
||||
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
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user