improved printf
This commit is contained in:
parent
673679e5eb
commit
81e724d4f6
1 changed files with 84 additions and 124 deletions
|
@ -1,128 +1,88 @@
|
|||
.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
|
||||
_14:
|
||||
.data4 808530483
|
||||
.data4 875902519
|
||||
.data4 943259648
|
||||
.sect .bss
|
||||
.sect .bss
|
||||
_getal:
|
||||
.space 12
|
||||
_char:
|
||||
.space 1
|
||||
.align 4
|
||||
.sect .data
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue