;›; 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›