ack/mach/z8000/libem/printf.s
1985-02-17 00:57:20 +00:00

83 lines
1.5 KiB
ArmAsm
Executable file

.define printf
printf:
popl saveret, *RR14
ldm savereg, R4, $10
ld R3, $buff !R3 is pointer to a buffer, in which
!we built the string to be printed.
pop R2, *RR14 !R2 is pointer to format-string
prloop:
ldb RL0, 0(R2)
testb RL0
jr EQ, ready
inc R2
cpb RL0, $045 ! '%'?
jr NE, 1f
ldb RL0, 0(R2)
inc R2
cpb RL0, $0163 ! 's'?
jr EQ, 3f
cpb RL0, $0170 ! 'x'?
ld R4, $16 ! print number hexadecimal
jr EQ, 2f
cpb RL0, $0144 ! 'd'?
ld R4, $10 ! print number decimal
jr EQ, 2f
cpb RL0, $0157 ! 'o'?
ld R4, $8 ! print number octal
jr EQ, 2f
1: ldb 0(R3), RL0
inc R3
jr prloop
2: !in case of %x, %d or %o
pop R1, *RR14
test R1
jr PL, 4f
cp R4, $10
jr NE, 4f ! print only '-' in case of %d
ldb 0(R3), $055 ! '-'
inc R3
neg R1
4: calr printn
jr prloop
3: !in case of %s
pop R1, *RR14
6: ldb RL0, 0(R1)
testb RL0
jr EQ, prloop
inc R1
ldb 0(R3), RL0
inc R3
jr 6b
ready: !now really print the string we built in the buffer
ldb 0(R3), RL0 !end string with '\0'
sub R3, $buff-1 !R3 contains the number of characters
ld R1, $buff
7: ldb RL0, 0(R1)
inc R1
sc $4
djnz R3, 7b
ldm R4, savereg, $10
pushl *RR14, saveret
ret
printn:
ldk R0, $0
div RR0, R4 !%x, %d or %o determined by R4
test R1
jr EQ, 5f !if quotient is '0' printn is ready
push *RR14, R0 !push remainder onto the stack
calr printn
pop R0, *RR14
5: add R0, $060
cp R0, $071 !'9'
jr LE, 8f
add R0, $7
8: ldb 0(R3), RL0
inc R3
ret
.data
buff:
.space 256