.data / C library -- printf .globl _printf .globl fltused, pfloat, pscien, _atof /.globl pfloat /.globl pscien .globl _putchar .globl csv .globl cret _atof: fltused: pfloat: pscien: _printf: jsr r5,csv sub $126.,sp mov 4(r5),formp / format mov r5,r4 add $6,r4 / arglist loop: movb *formp,r0 beq 1f inc formp cmp r0,$'% beq 2f 3: mov r0,(sp) jsr pc,*$_putchar br loop 1: jmp cret 2: / clr rjust clr ndigit / cmpb *formp,$'- / bne 2f / inc formp / inc rjust 2: jsr r3,gnum mov r1,width / clr ndfnd cmp r0,$'. bne 1f jsr r3,gnum mov r1,ndigit 1: mov sp,r3 add $4,r3 mov $swtab,r1 1: mov (r1)+,r2 beq 3b cmp r0,(r1)+ bne 1b jmp (r2) .data swtab: decimal; 'd / octal; 'o / hex; 'x / float; 'f / scien; 'e charac; 'c string; 's longorunsg; 'l / unsigned; 'u / remote; 'r 0; 0 / .text decimal: mov (r4)+,r1 bge 1f neg r1 movb $'-,(r3)+ br 1f longorunsg: cmpb *formp,$'d bne unsigned inc formp br long unsigned: mov (r4)+,r1 1: jsr pc,1f br prbuf 1: clr r0 div $10.,r0 mov r1,-(sp) mov r0,r1 beq 1f jsr pc,1b 1: mov (sp)+,r0 add $'0,r0 movb r0,(r3)+ rts pc long: mov (r4)+,r2 mov (r4)+,r0 mov r4,-(sp) mov r3,r4 mov r0,r3 tst r2 bpl 1f neg r2 neg r3 sbc r2 movb $'-,(r4)+ 1: jsr pc,1f mov r4,r3 mov (sp)+,r4 br prbuf 1: clr r1 mov $32.,r0 3: ashc $1,r2 rol r1 cmp r1,$10. blo 2f sub $10.,r1 inc r3 2: sob r0,3b add $'0,r1 mov r1,-(sp) ashc $0,r2 beq 1f jsr pc,1b 1: movb (sp)+,(r4)+ rts pc charac: movb (r4)+,(r3)+ bne 1f dec r3 1: movb (r4)+,(r3)+ bne prbuf dec r3 br prbuf string: mov ndigit,r1 clr r3 mov (r4),r2 1: tstb (r2)+ beq 1f inc r3 sob r1,1b 1: mov (r4)+,r2 br prstr /hex: / mov $1f,r2 / .data /1: / -4; !17 / .text / br 2f / /octal: / mov $1f,r2 / .data /1: / -3; !7 / .text /2: / mov (r4)+,r1 / beq 2f / tst ndigit / beq 2f / movb $'0,(r3)+ /2: / clr r0 / jsr pc,1f / br prbuf /1: / mov r1,-(sp) / ashc (r2),r0 / beq 1f / jsr pc,1b /1: / mov (sp)+,r0 / bic 2(r2),r0 / add $'0,r0 / cmp r0,$'9 / ble 1f / add $'A-'0-10.,r0 /1: / movb r0,(r3)+ / rts pc / /float: / mov ndigit,r0 / mov ndfnd,r2 / jsr pc,pfloat / br prbuf / /scien: / mov ndigit,r0 / mov ndfnd,r2 / jsr pc,pscien / br prbuf / /remote: / mov (r4)+,r4 / mov (r4)+,formp / jmp loop / prbuf: mov sp,r2 add $4,r2 sub r2,r3 prstr: mov r4,-(sp) mov $' ,-(sp) mov r3,r4 neg r3 add width,r3 ble 1f / tst rjust / bne 1f 2: jsr pc,*$_putchar sob r3,2b 1: tst r4 beq 2f 1: movb (r2)+,(sp) jsr pc,*$_putchar sob r4,1b 2: tst r3 ble 1f mov $' ,(sp) 2: jsr pc,*$_putchar sob r3,2b 1: tst (sp)+ mov (sp)+,r4 jmp loop gnum: / clr ndfnd clr r1 1: movb *formp,r0 inc formp sub $'0,r0 cmp r0,$'*-'0 bne 2f mov (r4)+,r0 br 3f 2: cmp r0,$9. bhi 1f 3: / inc ndfnd mul $10.,r1 add r0,r1 br 1b 1: add $'0,r0 rts r3 .bss width: .=.+2 formp: .=.+2 /rjust: .=.+2 /ndfnd: .=.+2 ndigit: .=.+2