211 lines
2.1 KiB
ArmAsm
211 lines
2.1 KiB
ArmAsm
/ C library -- unprintf
|
|
|
|
|
|
.globl _unprintf
|
|
.globl ndigix
|
|
|
|
.globl pfloat
|
|
.globl pscien
|
|
.globl _IEH3revp
|
|
.globl _IEH3bcko
|
|
|
|
_unprintf:
|
|
mov r5,-(sp)
|
|
mov sp,r5
|
|
mov 4(r5),formp / format
|
|
mov r5,r4
|
|
add $6,r4 / arglist
|
|
sub $128.,sp / buffer
|
|
loop:
|
|
movb *formp,r0
|
|
beq 1f
|
|
inc formp
|
|
cmp r0,$'%
|
|
beq 2f
|
|
3:
|
|
mov r4,-(sp)
|
|
mov r0,-(sp)
|
|
jsr pc,*$_IEH3revp
|
|
tst (sp)+
|
|
mov (sp)+,r4
|
|
br loop
|
|
1:
|
|
add $128.,sp
|
|
mov (sp)+,r5
|
|
jsr pc,_IEH3bcko
|
|
rts pc
|
|
2:
|
|
clr rjust
|
|
clr ndigix
|
|
cmpb *formp,$'-
|
|
bne 2f
|
|
inc formp
|
|
inc rjust
|
|
2:
|
|
jsr r3,gnum; width
|
|
clr ndfnd
|
|
cmp r0,$'.
|
|
bne 1f
|
|
jsr r3,gnum; ndigix
|
|
1:
|
|
mov sp,r3
|
|
mov $swtab,r1
|
|
1:
|
|
mov (r1)+,r2
|
|
beq 3b
|
|
cmp r0,(r1)+
|
|
bne 1b
|
|
jmp (r2)
|
|
swtab:
|
|
decimal; 'd
|
|
octal; 'o
|
|
float; 'f
|
|
scien; 'e
|
|
charac; 'c
|
|
string; 's
|
|
logical; 'l
|
|
0; 0
|
|
|
|
decimal:
|
|
mov (r4)+,r1
|
|
bge 1f
|
|
neg r1
|
|
movb $'-,(r3)+
|
|
br 1f
|
|
|
|
logical:
|
|
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
|
|
|
|
charac:
|
|
movb (r4)+,(r3)+
|
|
bne 1f
|
|
dec r3
|
|
1:
|
|
movb (r4)+,(r3)+
|
|
br prbuf
|
|
|
|
string:
|
|
mov ndigix,r1
|
|
1:
|
|
mov (r4)+,r2
|
|
1:
|
|
movb (r2)+,(r3)+
|
|
beq prbuf
|
|
sob r1,1b
|
|
br prbuf
|
|
|
|
octal:
|
|
mov (r4)+,r1
|
|
jsr pc,1f
|
|
br prbuf
|
|
1:
|
|
mov r1,-(sp)
|
|
beq 1f
|
|
ash $-3,r1
|
|
bic $!17777,r1
|
|
jsr pc,1b
|
|
1:
|
|
mov (sp)+,r0
|
|
bic $!7,r0
|
|
add $'0,r0
|
|
movb r0,(r3)+
|
|
rts pc
|
|
|
|
float:
|
|
mov ndfnd,r2
|
|
jsr pc,pfloat
|
|
br prbuf
|
|
|
|
scien:
|
|
mov ndfnd,r2
|
|
jsr pc,pscien
|
|
br prbuf
|
|
|
|
prbuf:
|
|
cmp r3,sp
|
|
blos 1f
|
|
tstb -1(r3)
|
|
bne 1f
|
|
dec r3
|
|
br prbuf
|
|
1:
|
|
mov sp,r2
|
|
mov r4,-(sp)
|
|
mov $' ,-(sp)
|
|
mov width,r1
|
|
sub r3,r1
|
|
clrb (r3)+
|
|
add r2,r1
|
|
mov r1,spaces
|
|
ble 1f
|
|
tst rjust
|
|
bne 1f
|
|
2:
|
|
jsr pc,*$_IEH3revp
|
|
dec spaces
|
|
bne 2b
|
|
1:
|
|
mov r2,bufp
|
|
1:
|
|
movb *bufp,(sp)
|
|
beq 1f
|
|
inc bufp
|
|
jsr pc,*$_IEH3revp
|
|
br 1b
|
|
1:
|
|
tst spaces
|
|
ble 1f
|
|
tst rjust
|
|
beq 1f
|
|
mov $' ,(sp)
|
|
2:
|
|
jsr pc,*$_IEH3revp
|
|
dec spaces
|
|
bne 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,$9.
|
|
bhi 1f
|
|
inc ndfnd
|
|
mul $10.,r1
|
|
add r0,r1
|
|
br 1b
|
|
1:
|
|
add $'0,r0
|
|
mov r1,*(r3)+
|
|
rts r3
|
|
|
|
.bss
|
|
ndigix: .=.+2
|
|
width: .=.+2
|
|
formp: .=.+2
|
|
rjust: .=.+2
|
|
ndfnd: .=.+2
|
|
bufp: .=.+2
|
|
spaces: .=.+2
|