567 lines
6.3 KiB
ArmAsm
567 lines
6.3 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ 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
|