-.define _printn
.define _printf
-.extern _printf
-.sect .text;.sect .rom;.sect .data;.sect .bss
.sect .text
-_putchar:
-move.l #1,-(sp)
-lea 8(sp),a0
-move.l 8(sp),d0
-move.b d0,(a0)
-move.l a0,-(sp)
-move.l #1,-(sp)
-jsr _write
-add.l #12,sp
-rts
-_printf:
-tst.b -56(sp)
-link a6,#-16
-!Local -4 into d7
-!Local -12 into d6
-!Local -8 into a5
-!Local 8 into a4
-!Local -16 into a3
-movem.l d7/d6/a5/a4/a3,-(sp)
-move.l 8(a6),a4
-lea 12(a6),a1
-move.l a1, a5
-I0014:
-move.l a4, a0
-add.l #1,a4
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-cmp.l #37,d7
-beq I0015
-tst.l d7
-beq I0012
-move.l d7,-(sp)
-jsr _putchar
-add #4,sp
-jmp I0014
-I0015:
-move.l a4, a0
-add.l #1,a4
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-cmp.l #100,d7
-beq I0018
-cmp.l #117,d7
-bne I0017
-I0018:
-move.l a5, a0
-add.l #4,a5
-move.l (a0), d6
-cmp.l #100,d7
-bne I0019
-tst.l d6
-bge I0019
-clr.l d2
-sub.l d6,d2
-move.l d2, d6
-pea 45
-jsr _putchar
-add #4,sp
-I0019:
-move.l d6,-(sp)
-jsr _printn
-add #4,sp
-jmp I0014
-I0017:
-cmp.l #115,d7
-bne I0014
-move.l a5, a0
-add.l #4,a5
-move.l (a0), a3
-I001c:
-move.l a3, a0
-add.l #1,a3
-clr.l d0
-move.b (a0),d0
-move.l d0, d7
-tst.l d7
-beq I0014
-move.l d7,-(sp)
-jsr _putchar
-add #4,sp
-jmp I001c
-I0012:
-movem.l (sp)+,d7/d6/a5/a4/a3
-unlk a6
-rts
-.extern _printn
-_printn:
-tst.b -44(sp)
-link a6,#-4
-!Local -4 into d7
-move.l d7,-(sp)
+.sect .rom
+.sect .data
+.sect .bss
+.sect .bss
+_getal:
+ .space 12
+_char:
+ .space 1
+ .align 4
.sect .data
-_14:
-.data4 808530483
-.data4 875902519
-.data4 943259648
+hexs:
+ .ascii "0123456789abcdef"
+ .align 4
.sect .text
-move.l 8(a6),-(sp)
-pea 10
-jsr .dvu
-move.l d1, d7
-tst.l d7
-beq I0023
-move.l d7,-(sp)
-jsr _printn
-add #4,sp
-I0023:
-pea _14
-move.l 8(a6),-(sp)
-pea 10
-jsr .dvu
-move.l (sp)+,a1
-add.l d2,a1
-clr.l d0
-move.b (a1),d0
-move.l d0,-(sp)
-jsr _putchar
-add #4,sp
-move.l (sp)+,d7
-unlk a6
-rts
+_printf:
+ movem.l d0/d1/d2/a0/a1/a2/a3/a4/a5/a6, -(sp)
+ lea 44(sp), a6 ! a6 <- address of arguments
+ move.l (a6)+, a5 ! a5 <- address of format
+next: move.b (a5)+, d0
+ beq out
+ cmp.b #'%', d0
+ beq procnt
+put: move.l d0, -(sp)
+ jsr _putchar ! long argument on stack
+ tst.l (sp)+
+ bra next
+
+procnt: move.b (a5)+, d0
+ cmp.b #'d', d0 ! NOTE: %d means unsigned.
+ beq digit
+ cmp.b #'x', d0
+ beq hex
+ cmp.b #'s', d0
+ beq string
+ cmp.b #'%', d0 ! second % has to be printed.
+ beq put
+ tst.b -(a5) ! normal char should be printed
+ bra next
+
+string: move.l (a6)+, a2 ! a2 <- address of string
+sloop: move.b (a2)+, d0
+ beq next
+ move.l d0, -(sp)
+ jsr _putchar ! long argument on stack
+ tst.l (sp)+
+ bra sloop
+
+digit: move.l (a6)+, d1 ! d1 <- integer
+ move.l #_getal+12, a2 ! a2 <- ptr to last part of buf
+ clr.b -(a2) ! stringterminator
+1:
+ move.l d1,-(sp)
+ move.l #10,-(sp)
+ jsr .dvu ! d1 <- qotient; d0 <- remainder
+ add.l #'0', d0
+ move.b d0, -(a2)
+ tst.l d1 ! if quotient = 0 then ready
+ bne 1b
+ bra sloop ! print digitstring.
+
+hex: move.l (a6)+, d1 ! d1 <- integer
+ move.l #_getal+12, a2 ! a2 <- ptr to last part of buf
+ clr.b -(a2) ! stringterminator
+ move.l #7, d2 ! loop control
+1: move.l d1, d0
+ and.l #15, d0
+ move.l #hexs,a0
+ add.l d0,a0
+ move.b (a0), -(a2) ! hex digit
+ asr.l #4, d1
+ dbf d2, 1b
+ bra sloop
+
+out:
+ movem.l (sp)+, d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
+ rts
+
+
+_putchar:
+ move.l #1, -(sp)
+ pea 11(sp)
+ move.l #1, -(sp)
+ jsr _write
+ lea 12(sp), sp
+ rts
+.align 2