517 lines
5.0 KiB
ArmAsm
517 lines
5.0 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ roff4 -- runoff
|
|
|
|
text:
|
|
/ inc tottext
|
|
clr ulstate
|
|
clr wch
|
|
clr wne
|
|
tst ce
|
|
bne nofill
|
|
tst fi
|
|
beq nofill
|
|
jsr pc,getchar
|
|
2:
|
|
mov r0,ch
|
|
cmp $' ,r0
|
|
bne 2f
|
|
jsr pc,rbreak
|
|
1:
|
|
jsr pc,getchar
|
|
cmp $' ,r0
|
|
bne 2b
|
|
inc un
|
|
br 1b
|
|
2:
|
|
cmp r0,$'\n
|
|
bne 2f
|
|
jsr pc,rbreak
|
|
clr ch
|
|
jsr pc,nline
|
|
br 4f
|
|
2:
|
|
tst wch
|
|
bne 3f
|
|
jsr pc,getword
|
|
br 4f
|
|
3:
|
|
jsr pc,movword
|
|
bne 2b
|
|
jsr pc,adjust
|
|
br 2b
|
|
4:
|
|
dec ul
|
|
bge 1f
|
|
clr ul
|
|
1:
|
|
rts pc
|
|
|
|
nofill:
|
|
jsr pc,rbreak
|
|
1:
|
|
jsr pc,gettchar
|
|
cmp r0,$'\n
|
|
beq 1f
|
|
jsr pc,width
|
|
add r1,ne
|
|
jsr pc,storeline
|
|
br 1b
|
|
1:
|
|
tst ce
|
|
ble 2f
|
|
dec ce
|
|
mov nel,r0
|
|
asr r0
|
|
bpl 1f
|
|
clr r0
|
|
1:
|
|
add r0,un
|
|
tst numbmod
|
|
beq 2f
|
|
add $2,un
|
|
2:
|
|
clr fac
|
|
clr fmq
|
|
mov $1000,nwd
|
|
mov $' ,r0
|
|
jsr pc,storeline
|
|
jsr pc,rbreak
|
|
dec ul
|
|
bpl 2f
|
|
clr ul
|
|
2:
|
|
rts pc
|
|
|
|
adjust:
|
|
mov r2,-(sp)
|
|
mov r3,-(sp)
|
|
clr r2
|
|
clr r3
|
|
tst ad
|
|
beq 1f
|
|
mov nwd,r0
|
|
dec r0
|
|
ble 1f
|
|
mov nel,r3
|
|
ble 1f
|
|
dvd r0,r2
|
|
1:
|
|
mov r3,fac
|
|
mov r2,fmq
|
|
mov (sp)+,r3
|
|
mov (sp)+,r2
|
|
jsr pc,rbreak
|
|
rts pc
|
|
|
|
fill:
|
|
mov fmq,r0
|
|
1:
|
|
inc r0
|
|
dec nc
|
|
cmpb (r2)+,$'
|
|
beq 1b
|
|
dec r2
|
|
bit $1,totout
|
|
beq 2f
|
|
inc fac
|
|
cmp fac,nwd
|
|
blt 1f
|
|
inc r0
|
|
br 1f
|
|
2:
|
|
dec fac
|
|
bmi 1f
|
|
inc r0
|
|
1:
|
|
jsr pc,space
|
|
movb (r2),r0
|
|
rts pc
|
|
|
|
movword:
|
|
mov wch,wordend
|
|
mov wordp,r4
|
|
add r4,wordend
|
|
tst nwd
|
|
bne 2f
|
|
1:
|
|
movb (r4)+,r0
|
|
cmp r0,$'
|
|
bne 1f
|
|
dec wch
|
|
jsr pc,width
|
|
sub r1,wne
|
|
br 1b
|
|
1:
|
|
dec r4
|
|
2:
|
|
cmp wne,nel
|
|
ble 1f
|
|
cmp nel,$4
|
|
ble 1f
|
|
mov ls,r0
|
|
add nl,r0
|
|
cmp r0,bl
|
|
bgt 2f
|
|
mov ls,r0
|
|
asl r0
|
|
add nl,r0
|
|
cmp r0,bl
|
|
bgt 1f
|
|
2:
|
|
jsr pc,hyphen
|
|
1:
|
|
clr nhyph
|
|
mov wch,-(sp)
|
|
1:
|
|
movb (r4)+,r0
|
|
cmp r0,$'-
|
|
bne 2f
|
|
movb (r4),r2
|
|
jsr pc,alph2
|
|
bne 2f
|
|
bisb $200,(r4)
|
|
2:
|
|
tst r0
|
|
bpl 2f
|
|
bic $!177,r0
|
|
mov r4,r3
|
|
sub $4,r3
|
|
cmp r3,$word
|
|
blo 2f
|
|
movb (r3),r2
|
|
bic $!177,r2
|
|
jsr pc,alph2
|
|
beq 3f
|
|
cmp nel,$2
|
|
ble 2f
|
|
3:
|
|
mov r0,-(sp)
|
|
clr r0
|
|
jsr pc,storeline
|
|
mov (sp)+,r0
|
|
inc nhyph
|
|
2:
|
|
jsr pc,width
|
|
sub r1,wne
|
|
jsr pc,storeline
|
|
dec wch
|
|
bne 1b
|
|
tst nel
|
|
blt 1f
|
|
inc nwd
|
|
tst (sp)+
|
|
clz
|
|
rts pc
|
|
1:
|
|
mov linep,r3
|
|
1:
|
|
tst nhyph
|
|
bne 2f
|
|
tst nwd
|
|
beq 3f
|
|
cmp wch,(sp)
|
|
beq 4f
|
|
2:
|
|
movb -(r3),r0
|
|
bne 2f
|
|
dec nhyph
|
|
bne 5f
|
|
tst nwd
|
|
beq 6f
|
|
5:
|
|
tst nel
|
|
ble 2f
|
|
6:
|
|
cmpb -1(r3),$'-
|
|
beq 3f
|
|
movb $'-,(r3)
|
|
dec nel
|
|
inc ne
|
|
br 3f
|
|
2:
|
|
dec nc
|
|
tstb (r3)
|
|
beq 1b
|
|
jsr pc,width
|
|
sub r1,ne
|
|
add r1,nel
|
|
inc wch
|
|
dec r4
|
|
add r1,wne
|
|
br 1b
|
|
3:
|
|
inc nwd
|
|
4:
|
|
mov r4,wordp
|
|
bicb $!177,(r4)
|
|
cmp r4,$word
|
|
bge 4f
|
|
4
|
|
4:
|
|
tst (sp)+
|
|
sez
|
|
rts pc
|
|
|
|
topbot:
|
|
mov pl,r0
|
|
bne 1f
|
|
clr bl
|
|
rts pc
|
|
1:
|
|
sub ma3,r0
|
|
sub ma4,r0
|
|
sub hx,r0
|
|
mov r0,bl
|
|
mov ma1,r0
|
|
add ma2,r0
|
|
add hx,r0
|
|
cmp r0,bl
|
|
blt 1f
|
|
mov $2,r0
|
|
mov r0,ma1
|
|
mov r0,ma2
|
|
mov r0,ma3
|
|
mov r0,ma4
|
|
mov $66.,pl
|
|
br topbot
|
|
1:
|
|
cmp nl,bl
|
|
ble 1f
|
|
mov bl,nl
|
|
1:
|
|
rts pc
|
|
|
|
width:
|
|
cmp r0,ohc
|
|
beq 2f
|
|
tst r0
|
|
beq 2f
|
|
cmp r0,$0177
|
|
beq 2f
|
|
cmp r0,$010
|
|
bne 1f
|
|
mov $-1,r1
|
|
rts pc
|
|
1:
|
|
cmp $' ,r0
|
|
bgt 2f
|
|
mov $1,r1
|
|
rts pc
|
|
2:
|
|
clr r1
|
|
rts pc
|
|
|
|
headin:
|
|
jsr pc,skipcont
|
|
mov nextb,r1
|
|
mov r1,*(r5)+
|
|
jsr pc,gettchar
|
|
cmp r0,$'\n
|
|
beq 2f
|
|
mov r0,r2
|
|
1:
|
|
jsr pc,gettchar
|
|
cmp r0,$'\n
|
|
beq 2f
|
|
cmp r0,r2
|
|
bne 3f
|
|
clr r0
|
|
3:
|
|
jsr pc,wbf
|
|
br 1b
|
|
2:
|
|
clr r0
|
|
jsr pc,wbf
|
|
mov r1,nextb
|
|
mov ll,llh
|
|
rts r5
|
|
|
|
headout:
|
|
tst hx
|
|
bne 0f
|
|
tst (r5)+
|
|
rts r5
|
|
0:
|
|
clr -(sp)
|
|
mov *(r5),r2
|
|
mov ibf1,nfile
|
|
jsr r5,headseg; width
|
|
mov r0,-(sp)
|
|
jsr r5,headseg; width
|
|
mov r0,-(sp)
|
|
jsr r5,headseg; width
|
|
mov r0,-(sp)
|
|
mov po,r0
|
|
jsr pc,space
|
|
tst numbmod
|
|
beq 1f
|
|
mov $5,r0
|
|
add ni,r0
|
|
mov r0,6(sp)
|
|
1:
|
|
mov *(r5)+,r2
|
|
jsr r5,headseg; putchar
|
|
mov llh,r0
|
|
add 6(sp),r0
|
|
sub 2(sp),r0
|
|
asr r0
|
|
sub 4(sp),r0
|
|
bge 1f
|
|
clr r0
|
|
1:
|
|
mov r0,-(sp)
|
|
jsr pc,space
|
|
jsr r5,headseg; putchar
|
|
mov llh,r0
|
|
sub (sp)+,r0
|
|
sub (sp)+,r0
|
|
sub (sp)+,r0
|
|
sub (sp)+,r0
|
|
add (sp)+,r0
|
|
jsr pc,space
|
|
jsr r5,headseg; putchar
|
|
jsr pc,newline
|
|
rts r5
|
|
|
|
headseg:
|
|
clr -(sp)
|
|
1:
|
|
mov r1,-(sp)
|
|
mov r2,r1
|
|
inc r2
|
|
jsr pc,rdsufb
|
|
mov (sp)+,r1
|
|
tstb r0
|
|
beq 1f
|
|
cmp r0,$'%
|
|
beq 2f
|
|
jsr pc,*(r5)
|
|
add r1,(sp)
|
|
br 1b
|
|
2:
|
|
mov pn,r0
|
|
clr r1
|
|
tst ro
|
|
beq 2f
|
|
mov $ones,onesp
|
|
mov $fives,fivesp
|
|
jsr pc,roman
|
|
add r1,(sp)
|
|
br 1b
|
|
2:
|
|
jsr pc,decml
|
|
add r1,(sp)
|
|
br 1b
|
|
1:
|
|
mov (sp)+,r0
|
|
tst (r5)+
|
|
rts r5
|
|
|
|
space:
|
|
jsr r5,nlines; putchar
|
|
rts pc
|
|
|
|
nlines:
|
|
mov r0,-(sp)
|
|
1:
|
|
dec (sp)
|
|
blt 1f
|
|
mov $' ,r0
|
|
jsr pc,*(r5)
|
|
br 1b
|
|
1:
|
|
cmp (r5)+,(sp)+
|
|
rts r5
|
|
|
|
decimal:
|
|
jsr pc,decml
|
|
tst (r5)+
|
|
rts r5
|
|
|
|
decml:
|
|
mov r2,-(sp)
|
|
mov r3,-(sp)
|
|
jsr pc,decml1
|
|
mov (sp)+,r3
|
|
mov (sp)+,r2
|
|
rts pc
|
|
|
|
decml1:
|
|
mov r1,-(sp)
|
|
clr r2
|
|
mov r0,r3
|
|
dvd $10.,r2
|
|
mov r3,-(sp)
|
|
mov r2,r0
|
|
beq 1f
|
|
jsr pc,decml
|
|
mov r1,2(sp)
|
|
1:
|
|
mov (sp)+,r0
|
|
add $'0,r0
|
|
jsr pc,*(r5)
|
|
add (sp)+,r1
|
|
rts pc
|
|
|
|
roman:
|
|
mov r2,-(sp)
|
|
mov r3,-(sp)
|
|
jsr pc,roman1
|
|
mov (sp)+,r3
|
|
mov (sp)+,r2
|
|
rts pc
|
|
roman1:
|
|
clr r2
|
|
mov r0,r3
|
|
bne .+4
|
|
rts pc
|
|
mov r1,-(sp)
|
|
dvd $10.,r2
|
|
mov r3,-(sp)
|
|
mov r2,r0
|
|
inc onesp
|
|
inc fivesp
|
|
jsr pc,roman
|
|
mov r1,2(sp)
|
|
dec onesp
|
|
dec fivesp
|
|
clr r2
|
|
mov (sp)+,r3
|
|
dvd $5.,r2
|
|
cmp r3,$4
|
|
bne 1f
|
|
movb *onesp,r0
|
|
jsr pc,*(r5)
|
|
add r1,(sp)
|
|
tst r2
|
|
beq 2f
|
|
inc onesp
|
|
movb *onesp,r0
|
|
dec onesp
|
|
br 3f
|
|
2:
|
|
movb *fivesp,r0
|
|
3:
|
|
jsr pc,*(r5)
|
|
add (sp)+,r1
|
|
rts pc
|
|
1:
|
|
tst r2
|
|
beq 2f
|
|
movb *fivesp,r0
|
|
jsr pc,*(r5)
|
|
add r1,(sp)
|
|
2:
|
|
dec r3
|
|
blt 1f
|
|
movb *onesp,r0
|
|
jsr pc,*(r5)
|
|
add r1,(sp)
|
|
br 2b
|
|
1:
|
|
mov (sp)+,r1
|
|
rts pc
|
|
|