232 lines
2.2 KiB
ArmAsm
232 lines
2.2 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ io4 -- numeric output conversion
|
|
|
|
qicv:
|
|
hicv:
|
|
jsr r5,rerr; 999.
|
|
sys exit
|
|
|
|
xicv:
|
|
jsr r5,fgetc
|
|
rts r5
|
|
|
|
gocv:
|
|
mov pc,gflg
|
|
jsr r5,getarg
|
|
mov ndig,_ndigit
|
|
jsr pc,ecvt
|
|
tst r2
|
|
bmi eocv
|
|
cmp r2,ndig
|
|
bgt eocv
|
|
sub r2,ndig
|
|
sub $4,width
|
|
jsr r5,focv
|
|
add $4,width
|
|
add $4,nspace
|
|
rts r5
|
|
|
|
eocv:
|
|
mov $'e,-(sp)
|
|
br 1f
|
|
|
|
docv:
|
|
mov $'d,-(sp)
|
|
1:
|
|
tst gflg
|
|
bne 1f
|
|
jsr r5,getarg
|
|
1:
|
|
mov ndig,r1
|
|
add $6,r1
|
|
add nflg,r1
|
|
sub width,r1
|
|
bge 2f
|
|
sub r1,nspace
|
|
2:
|
|
tst nflg
|
|
beq 2f
|
|
mov $'-,r0
|
|
jsr r5,fputcc
|
|
2:
|
|
mov ndig,r1
|
|
mov scale,r0
|
|
bgt 2f
|
|
add r0,r1
|
|
br 3f
|
|
2:
|
|
inc r1
|
|
3:
|
|
mov r1,_ndigit
|
|
jsr pc,ecvt
|
|
mov r0,r1
|
|
mov r2,-(sp)
|
|
mov scale,r2
|
|
sub r2,(sp)
|
|
tst r2
|
|
bgt 2f
|
|
mov $'0,r0
|
|
jsr r5,fputcc
|
|
br 3f
|
|
2:
|
|
movb (r1)+,r0
|
|
dec _ndigit
|
|
jsr r5,fputcc
|
|
sob r2,2b
|
|
3:
|
|
mov $'.,r0
|
|
jsr r5,fputcc
|
|
neg r2
|
|
ble 2f
|
|
3:
|
|
mov $'0,r0
|
|
jsr r5,fputcc
|
|
sob r2,3b
|
|
2:
|
|
mov _ndigit,r2
|
|
ble 2f
|
|
3:
|
|
movb (r1)+,r0
|
|
jsr r5,fputcc
|
|
sob r2,3b
|
|
2:
|
|
mov 2(sp),r0
|
|
jsr r5,fputcc
|
|
mov (sp)+,r1
|
|
bge 2f
|
|
mov $'-,r0
|
|
jsr r5,fputcc
|
|
neg r1
|
|
br 3f
|
|
2:
|
|
mov $'+,r0
|
|
jsr r5,fputcc
|
|
3:
|
|
clr r0
|
|
div $10.,r0
|
|
add $'0,r0
|
|
jsr r5,fputcc
|
|
mov r1,r0
|
|
add $'0,r0
|
|
jsr r5,fputcc
|
|
tst (sp)+
|
|
rts r5
|
|
|
|
iocv:
|
|
clr -(sp)
|
|
clr ndig
|
|
br 1f
|
|
|
|
focv:
|
|
mov $1,-(sp)
|
|
1:
|
|
clr -(sp)
|
|
tst gflg
|
|
bne 1f
|
|
jsr r5,getarg
|
|
tst 2(sp)
|
|
beq 1f
|
|
mov scale,(sp)
|
|
1:
|
|
mov ndig,_ndigit
|
|
add (sp)+,_ndigit
|
|
jsr pc,fcvt
|
|
mov r0,r1
|
|
tst (sp)
|
|
beq 1f
|
|
tst gflg
|
|
bne 1f
|
|
add scale,r2
|
|
1:
|
|
mov ndig,r0
|
|
add (sp),r0
|
|
add nflg,r0
|
|
tst r2
|
|
ble 1f
|
|
add r2,r0
|
|
br 2f
|
|
1:
|
|
inc r0
|
|
2:
|
|
sub width,r0
|
|
bge 1f
|
|
sub r0,nspace
|
|
1:
|
|
tst nflg
|
|
beq 1f
|
|
mov $'-,r0
|
|
jsr r5,fputcc
|
|
1:
|
|
tst r2
|
|
bgt 1f
|
|
mov $'0,r0
|
|
jsr r5,fputcc
|
|
br 2f
|
|
1:
|
|
movb (r1)+,r0
|
|
jsr r5,fputcc
|
|
sob r2,1b
|
|
2:
|
|
tst (sp)+
|
|
beq 1f
|
|
mov $'.,r0
|
|
jsr r5,fputcc
|
|
1:
|
|
mov ndig,-(sp)
|
|
ble 1f
|
|
tst r2
|
|
bge 1f
|
|
neg r2
|
|
2:
|
|
mov $'0,r0
|
|
jsr r5,fputcc
|
|
dec ndig
|
|
ble 1f
|
|
sob r2,2b
|
|
1:
|
|
mov ndig,r2
|
|
ble 2f
|
|
1:
|
|
movb (r1)+,r0
|
|
jsr r5,fputcc
|
|
sob r2,1b
|
|
2:
|
|
mov (sp)+,ndig
|
|
rts r5
|
|
|
|
getarg:
|
|
clr nflg
|
|
setd
|
|
cmpb itype,$'r
|
|
beq 1f
|
|
seti
|
|
cmpb ilen,$4
|
|
bne 2f
|
|
setl
|
|
2:
|
|
cmpb ilen,$1
|
|
beq 3f
|
|
movif *ilval,r0
|
|
br 2f
|
|
3:
|
|
movb *ilval,r0
|
|
movif r0,fr0
|
|
br 2f
|
|
1:
|
|
cmpb ilen,$4
|
|
bne 1f
|
|
movof *ilval,r0
|
|
br 2f
|
|
1:
|
|
movf *ilval,r0
|
|
2:
|
|
cfcc
|
|
bge 1f
|
|
absf r0
|
|
mov $1,nflg
|
|
1:
|
|
rts r5
|
|
|