2.11BSD/src/ucb/pascal/px/30write.s
.globl _pwril, _pwrite, csv, cret
.text
/
/ pwril(w, lint)
/ int w;
/ long lint;
/
/ This routine writes the character representation of lint
/ in a field at least w characters wide using pwrite.
/
_pwril:
jsr r5,csv
mov r5,r3
add $6,r3 / 2(r3) = low, (r3) = high
mov sp,r2
sub $14.,sp
clr (r2)
mov (r3),r1
bpl pwril
neg r1
neg 2(r3)
sbc r1
inc (r2)
pwril:
clr r0
div $10.,r0
mov r0,(r3)
mov r1,r0
asl r0
asl r0
add $pw_tab,r0
mov (r0)+,r1
mov r0,-(sp)
clr r0
add 2(r3),r1
adc r0
div $10.,r0
add $'0,r1
movb r1,-(r2)
add *(sp)+,r0
adc (r3)
beq 1f
mov r0,2(r3)
mov (r3),r1
br pwril
1:
mov r0,r1
beq 1f
pwrsl:
clr r0
div $10.,r0
add $'0,r1
movb r1,-(r2)
mov r0,r1
bne pwrsl
1:
mov r2,r4
sub sp,r2
sub $14.,r2
neg r2
mov -2(r3),r3
sub r2,r3
tst 14.(sp)
beq 1f
dec r3
1:
dec r3
bmi 1f
mov $' ,r0
jsr pc,2f
br 1b
1:
tst 14.(sp)
beq 1f
mov $'-,r0
jsr pc,2f
1:
dec r2
bmi 1f
movb (r4)+,r0
jsr pc,2f
br 1b
1:
add $14.,sp
jmp cret
2:
mov r0,-(sp) / routine to call _pwrite with a char
clr -(sp)
mov $O_WRITC,-(sp)
jsr pc,_pwrite
add $6,sp
rts pc
/
/ Table of quotients and remainders of dividing integer high
/ words and zero low words by 10. Table was generated using dc.
/
.data
pw_tab:
0; 0
6; 14631
2; 31463
10; 46314
4; 63146
0; 100000
6; 114631
2; 131463
10; 146314
4; 163146
.text