MiniUnix/usr/source/s7/roff4.s
/
/
/ 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