MiniUnix/usr/source/s7/roff1.s
/
/
/ roff1 -- text formatter
.globl ttyn
nop = 000240
signal = 48.
ibuf: /init code in ibuf+obuf
cmp sp,$end
bhi 1f
jsr r5,string; emes1
sys exit
1:
clr r0
jsr pc,mesg
sys signal; 1; place
sys signal; 2; place
jsr pc,makebf
sys open; suffil; 0
bes 1f
mov r0,suff
sys seek; 20; 0
bes 1f
mov suff,r0
sys read; suftab; 2*26.
1:
clr r0
mov (sp)+,argc
dec argc
bne 1f
jmp place
1:
tst (sp)+
mov (sp),r4
cmpb (r4)+,$'+
bne 2f
jsr r5,pnum; pfrom
br 3f
2:
cmpb -1(r4),$'-
bne 2f
cmpb (r4),$'s
bne 0f
inc stop
br 3f
0:
cmpb (r4),$'h
bne 0f
clr slow
br 3f
0:
jsr r5,pnum; pto
3:
dec argc
bgt 1b
2:
mov $nop,get1a
mov $ibuf,ibufp
mov $ibuf,eibuf
mov sp,argp
jsr pc,topbot
clr r0
1:
movb r0,trtab(r0)
inc r0
cmp r0,$128.
bne 1b
jsr pc,rbreak
jsr pc,istop
jmp loop
makebf:
sys stat; bfn; stbuf
bec 2f
sys creat; bfn; 400
bec 1f
2:
incb bfn+8
cmpb bfn+8,$'z
blos makebf
jmp place
1:
mov r0,ibf
sys write; sufbuf;128.
sys open; bfn;0
mov r0,ibf1
rts pc
string:
mov (r5)+,r1
mov r1,r2
mov r1,0f
1:
tstb (r1)+
bne 1b
sub r2,r1
mov r1,1f
mov $1,r0
sys write; 0:..; 1:..
rts r5
emes1: <Too many files.\n\0>
xxx:
.even
obuf=ibuf+512.
.=ibuf+1024.
loop:
clr nlflg
jsr pc,getchar
cmpb r0,cc
beq 2f
movb r0,ch
jsr pc,text
br loop
2:
jsr pc,control
jsr pc,flushi
br loop
mesg:
tst r0
bne setsame
jsr pc,ttyn
movb r0,ttyx+8.
sys stat; ttyx; stbuf
mov stbuf+4,0f
mov 0f,1f
bic $22,0f
sys chmod; ttyx; 0:..
rts pc
setsame:
sys chmod; ttyx; 1:..
rts pc
pnum:
mov r4,ibufp
mov $37777,eibuf
jsr r5,number1; 0
mov r0,*(r5)+
clr ch
rts r5
flushi:
clr ch
tst nlflg
bne 1f
jsr pc,getchar
br flushi
1:
rts pc
gettchar:
tst ul
ble getchar
tst ulstate
beq 3f
tst bsc
bgt 1f
tst ulc
bgt 2f
clr ulstate
br 3f
1:
dec bsc
mov $010,r0
rts pc
2:
dec ulc
mov $'_,r0
rts pc
3:
jsr pc,getchar
cmp r0,$'0
blt 1f
cmp r0,$'9
ble 2f
cmp r0,$'A
blt 1f
cmp r0,$'Z
ble 2f
cmp r0,$'a
blt 1f
cmp r0,$'z
ble 2f
1:
tst ulc
bgt 3f
rts pc
3:
mov $1,ulstate
mov r0,ch
br gettchar
2:
inc bsc
inc ulc
rts pc
getchar:
mov ch,r0
beq 1f
clr ch
rts pc
1:
tst nlflg
beq 1f
mov $'\n,r0
rts pc
1:
jsr pc,get1
cmp r0,$'\\
bne 2f
jsr pc,get1
jsr r5,switch; esctab
br 3f
2:
cmp r0,$033 /prefix
bne 3f
jsr pc,get1
jsr r5,switch; pfxtab
3:
cmp r0,$'\n
bne 3f
inc nlflg
clr column
3:
mov r1,-(sp)
jsr pc,width
add r1,column
mov (sp)+,r1
rts pc
esctab:
.byte 'd, 032 /hlf (down)
.byte 'u, 035 /hlr (up)
.byte 'r, 036 /flr (reverse)
.byte 'x, 016 /SO (extra chars)
.byte 'y, 017 /SI (normal characters)
.byte 'l, 0177 /delete
.byte 't, 011 /hor tab
.byte 'a, 0100 /at sign
.byte 'n, 043 /number sign
.byte '\\, 134 /backslash
.byte 0, 0
pfxtab:
.byte '7, 036 /flr
.byte '8, 035 /hlr
.byte '9, 032 /hlf
.byte '4, 030 /brs
.byte '3, 031 /rrs
.byte '1, 026 /set hor tabs
.byte '2, 027 /clr hor tabs
.byte 0,0
pfxtab1:
switch:
mov r1,-(sp)
mov (r5)+,r1
1:
cmpb (r1)+,r0
beq 1f
tstb (r1)+
bne 1b
cmp r1,$pfxtab
ble 0f
cmp r1,$pfxtab1
bgt 0f
mov $037,r0
0:
mov (sp)+,r1
rts r5
1:
movb (r1)+,r0
mov (sp)+,r1
rts r5
get1:
tst nspace
ble 1f
dec nspace
mov tabc,r0
rts pc
1:
mov r1,-(sp)
4:
tst ip
beq 5f
jsr pc,rbf
br 6f
5:
tst nx
bne 0f
mov ibufp,r1
cmp r1,eibuf
bne 3f
0:
mov ifile,r0
bne 2f
1:
jsr pc,nextfile
2:
clr nx
sys read; ibuf; 512.
bes done
tst r0
beq 1b
mov $ibuf,r1
add r1,r0
mov r0,eibuf
3:
movb (r1)+,r0
mov r1,ibufp
1:
cmp r0,$011 /tab
bne 6f
mov (sp)+,r1
mov $tabtab,r0
inc nspace
1:
tstb (r0)
beq get1
cmpb column,(r0)+
bge 1b
movb -(r0),nspace
sub column,nspace
br get1
6:
get1a: br 7f
tst r0
beq 4b
7:
mov (sp)+,r1
rts pc
nextfile:
mov ifile,r0
beq 1f
sys close
1:
tst nx
beq 2f
mov $nextf,0f
br 3f
2:
dec argc
blt done
mov *argp,0f
add $2,argp
3:
sys open; 0:..; 0
bes done
mov r0,ifile
rts pc
done:
jsr pc,rbreak
jsr pc,eject
jsr pc,flush
place:
sys signal; 2; 1
mov $1,r0
jsr pc,mesg
sys unlink; bfn
sys exit
rts pc
putchar:
cmp pn,pfrom
blt 2f
clr pfrom
bic $!177,r0
beq 2f
movb trtab(r0),r0
cmp r0,$'
bne 1f
inc nsp
2:
rts pc
1:
cmp r0,$'\n
bne 1f
clr nsp
clr ocol
br 2f
1:
tst nsp
beq 2f
tst slow
bne 4f
jsr pc,dsp
cmp nsp,r1
blt 4f
mov $011,3f+2
cmp r1,$1
bgt 8f
mov $040,3f+2
dec nsp
br 9f
8:
sub r1,nsp
9:
mov r0,-(sp)
3:
mov $011,r0
jsr pc,pchar1
mov (sp)+,r0
br 1b
4:
mov r0,-(sp)
mov $' ,r0
jsr pc,pchar1
mov (sp)+,r0
dec nsp
bne 4b
2:
cmp r0,$026
blt 2f
cmp r0,$037
beq 3f
bgt 2f
mov r0,-(sp)
jsr r5, switch; unpfx
cmp (sp)+,r0
beq 2f
mov r0,-(sp)
mov $033,r0 /prefix
jsr pc,pchar1
dec ocol
mov (sp)+,r0
2:
pchar1:
cmp r0,$011
bne 1f
jsr pc,dsp
br 2f
1:
jsr pc,width
2:
add r1,ocol
movb r0,*obufp
inc obufp
cmp obufp,$obuf+128.
beq flush
3:
rts pc
dsp:
clr r1
1:
add $8.,r1
cmp ocol,r1
bgt 1b
sub ocol,r1
bne 2f
mov $8.,r1
2:
rts pc
unpfx:
.byte 032, '9
.byte 035, '8
.byte 036, '7
.byte 031, '3
.byte 030, '4
.byte 026, '1
.byte 027, '2
.byte 0,0
flush:
mov obufp,r0
sub $obuf,r0
mov r0,0f
mov $1,r0
sys write; obuf; 0:0
mov $obuf,obufp
rts pc
control:
jsr pc,getchar
mov r0,-(sp)
jsr pc,getchar
swab r0
bis (sp),r0
mov $contab,r1
1:
mov (r1)+,(sp)
bic $100000,(sp)
cmp r0,(sp)
bne 4f
mov (r1),(sp)
tst -(r1)
bpl 3f
jsr pc,flushi
cmp ilistp,$iliste
bgt 5f
mov ip,*ilistp
add $2,ilistp
mov (sp),ip
br 5f
3:
jmp *(sp)+
4:
cmp (r1)+,$-1
bne 1b
5:
tst (sp)+
rts pc
contab:
<ad>; casead
<bp>; casebp
<br>; casebr
<cc>; casecc
<ce>; casece
<ds>; caseds
<fi>; casefi
<in>; casein
<ix>; caseix
<li>; caseli
<ll>; casell
<ls>; casels
<na>; casena
<ne>; casene
<nf>; casenf
<pa>; casepa
<bl>; casebl
<pl>; casepl
<sk>; casesk
<sp>; casesp
<ss>; casess
<ta>; caseta
<ti>; caseti
<tr>; casetr
<ul>; caseul
<un>; caseun
<he>; casehe
<hx>; casehx
<fo>; casefo
<eh>; caseeh
<oh>; caseoh
<ef>; caseef
<of>; caseof
<m1>; casem1
<m2>; casem2
<m3>; casem3
<m4>; casem4
<hc>; casehc
<hy>; casehy
<n1>; casen1
<n2>; casen2
<nn>; casenn
<ni>; caseni
<jo>; casejo
<ar>; casear
<ro>; casero
<nx>; casenx
<po>; casepo
<de>; casede
<ig>; caseig
<tc>; casetc
<mk>; casemk
bnames: .=.+100.
-1; -1