;›; tiny printf etc.›;›; utils›cconout: ; out char in a. bash regs› ldx #0› pha ; save the char› txa ; get a zero› sta icbal,x ; zap buf addr› sta icbah,x› sta icbll,x ; and buf len› sta icblh,x› lda #putchr ; say put a byte› sta iccom,x› pla ; get the byte again› jsr ciov ; go do it› rts››pf_incs: ; inc str ptr› inc ptr1› beq *+3› rts› inc ptr1+1› rts››pf_nxta: ; get next arg› sec ; dec arg ptr by 2› lda ptr2› sbc #2› sta ptr2› lda ptr2+1› sbc #0› sta ptr2+1› ldy #1› lda (ptr2),y ; get hi byte› tax ; into x› dey› lda (ptr2),y ; get lo byte› rts›› .globl _tprintf ›_tprintf:› sty argcnt ; save arg count› lda argcnt› asl A ; make an offset› clc› adc sp ; compute addr of ctl str + 2› sta ptr2› lda sp+1› adc #0› sta ptr2+1›;› jsr pf_nxta ; get control string› sta ptr1› stx ptr1+1›;›; main loop.›;›printf0:› ldy #0› lda (ptr1),y ; get a char› bne *+5› jmp printf9 ; eos? go home› cmp #'% ; a percent?› bne printf1 ; no, go print it› jsr pf_incs ; bump control string ptr› lda (ptr1),y ; get control char›;›; see what we have›;› cmp #'s ; string?› beq pf_str› cmp #'d ; decimal?› beq pf_dec› cmp #'x ; hex?› beq pf_hex› cmp #'o ; octal?› beq pf_oct›; more later›printf1:› jsr cconout ; out the char›printf2:› jsr pf_incs ; bump control str› jmp printf0 ; and go back for more›pf_str:› jsr pf_nxta ; get next arg› sta ptr3› stx ptr3+1›pf_str1:› ldy #0› lda (ptr3),y ; get a char› beq printf2 ; done, go home› inc ptr3› bne *+4› inc ptr3+1› jsr cconout› jmp pf_str1›pf_hex:› jsr pf_nxta ; get arg› sta ptr3› stx ptr3+1› lda #4› sta tmp1›pf_hex1:› lda ptr3+1› lsr A› lsr A› lsr A› lsr A› and #$0F› tax› lda hex,x› jsr cconout› dec tmp1 ; dec counter› beq pf_hex9 ; done!› asl ptr3› rol ptr3+1› asl ptr3› rol ptr3+1› asl ptr3› rol ptr3+1› asl ptr3› rol ptr3+1› jmp pf_hex1›pf_hex9:› jmp printf2›pf_oct:› jmp printf2›pf_dec:› jsr pf_nxta ; get an arg› sta fr0› stx fr0+1 ; set up to floatify› cpx #0 ; neg?› bpl pf_dec1› jsr negax› sta fr0 ; store it again› stx fr0+1› lda #'-› jsr cconout›pf_dec1:› jsr ifp› jsr fasc ; ascify it› ldy #0› sty tmp1›pf_dec2:› ldy tmp1 ; get idx› lda (inbuff),y ; get a byte› bmi pf_dec3 ; hi bit set? ok, done› inc tmp1› jsr cconout› jmp pf_dec2›pf_dec3:› and #$7F ; mask it› jsr cconout› jmp printf2›printf9:› lda argcnt ; get arg count› asl A ; make it a byte count› tay› jmp addysp ; pop stack and return›; rts›hex:› .byte "0123456789ABCDEF"›; that's all›