AUSAM/source/S/dtpress.s
/
/ designed exclusively for compressing and expanding
/ outputs from 'dtp' with the verbose flag on.
/
/ Syntax: dtpress [file | -] [file]
/
.globl getc,putc,flush
/
getp = r3
putp = r4
/
mov (sp)+,r1
cmp $3,r1
jlo uerr
tst (sp)+
cmp $1,r1
beq 1f
mov (sp)+,r2 / name of standard input
cmpb (r2),$'-
bne 2f
tstb 1(r2)
beq 3f
2:
mov r2,2f+2
sys indir;2f
.data
2: sys open; 0; 0
.text
jes oerr
mov r0,ib
3:
cmp $3,r1
bne 1f
mov (sp)+,2f+2
sys indir;2f
.data
2: sys creat; 0; 604
.text
jes cerr
mov r0,ob
br 0f
1:
mov $1,ob
0:
mov $getc,getp
mov $putc,putp
mov $line,r1
clr r2 / line repetition counter
jsr r5,*getp; ib / look for leading null
jes eof
tst r0
jeq expand
jbr 4f
0:
mov $line,r1
clr r2
1:
jsr r5,*getp; ib
jes eof
cmpb r0,(r1)+
bne 1f
inc r2
br 1b
1:
dec r1
4:
mov r0,-(sp)
mov r2,r0
jsr r5,*putp; ob / output similarity count
mov (sp)+,r0
1:
cmp r0,$'\n
beq 1f
movb r0,(r1)+
jsr r5,*putp; ob
jsr r5,*getp; ib
bec 1b
jbr eof1
1:
jsr r5,*putp; ob
jbr 0b
eof:
mov r2,r0
jsr r5,*putp; ob
eof1:
jsr r5,flush; ob
clr r0
sys exit
uerr:
mov $usage,r0
mov $usl,r1
jbr error
.data
usage: <Usage: dtpress [file | -] [file]\n\0>
usl = . - usage
.text
oerr:
mov $openf,r0
mov $opl,r1
jbr error
.data
openf: <Cannot open input\n\0>
opl = . - openf
.text
cerr:
mov $crate,r0
mov $crl,r1
jbr error
.data
crate: <Cannot create output\n\0>
crl = . - crate
.text
error:
mov r0,2f+2
mov r1,2f+4
mov $2,r0
sys indir;2f
.data
2: sys write; 0; 0
.text
mov $1,r0
sys exit
/
/ code for expansion
/ called when first char is a 'null'
/
expand:
tst r2
beq 1f
0:
movb (r1)+,r0
jsr r5,*putp; ob
sob r2,0b
1:
jsr r5,*getp; ib
jes eof1
cmpb r0,$'\n
beq 2f
movb r0,(r1)+
jsr r5,*putp; ob
jbr 1b
2:
jsr r5,*putp; ob
jsr r5,*getp; ib
jes eof1
mov $line,r1
mov r0,r2
bne 0b
jbr 1b
.bss
ib: .=.+518.
ob: .=.+518.
line: .=.+256.