ack/mach/m68k4/libem/printf.s

78 lines
1.4 KiB
ArmAsm

.define _printf
.define _putchar
.define _getal
.define _char
.bss
_getal:
.space 12
_char:
.space 1
.data
sav:
.long 0
.text
_printf:
movem.l d0/d1/d2/a0/a1/a2/a3/a4/a5/a6,.savreg
move.l (sp)+,sav !return address
move.l sp,a6 !a6 <- address of arguments
move.l (a6)+,a5 !a5 <- address of format
clr.l d0 !d0 <- char to be printed
next: move.b (a5)+,d0
beq out
cmp.b #'%',d0
beq procnt
put: move.l d0,-(sp)
jsr _putchar !argument is long en op de stack
tst.l (sp)+
jmp next
procnt: move.b (a5)+,d0
cmp.b #'d',d0 !NOTE: %d means unsigned.
beq digit
cmp.b #'s',d0
beq string
cmp.b #'%',d0 !second % has to be printed.
beq put
tst.b -(a5) !normal char should be printed
jmp next
string: move.l (a6)+,a2 !a2 <- address of string
sloop: move.b (a2)+,d0
beq next
move.l d0,-(sp)
jsr _putchar !argument is long en op de stack
tst.l (sp)+
jmp sloop
digit: move.l (a6)+,d1 !d1 <- integer
move.l #_getal+12,a3 !a3 <- ptr to last part of buf
move.b #0,-(a3) !stringterminator
dloop: move.l d1,-(sp)
move.l #10,-(sp)
jsr .dvu !d1 <- quotient d2 <- remainder
add.l #'0',d2
move.b d2,-(a3)
tst.l d1 !if quotient = 0 then ready
bne dloop
move.l a3,a2
jmp sloop !print digitstring.
out:
move.l sav,-(sp)
movem.l .savreg,d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
rts
_putchar:
movem.l d0,.savreg
move.l 4(sp),d0
move.b d0,_char
move.l #1,-(sp)
move.l #_char,-(sp)
move.l #1,-(sp)
jsr _write
add.l #12,sp
movem.l .savreg,d0
rts
.align 2