V5/usr/mdec/dli.s
/ dli -- DEC format tape interpreter
.globl fopen, fcreat, getc, putc, flush, mesg
mov (sp)+,r5
cmp r5,$1
bne 1f
jsr r5,mesg; <Arg count\n\0>; .even
sys exit
1:
tst (sp)+
mov (sp)+,r0
jsr r5,fcreat; obuf
bec 1f
jsr r5,mesg; <Cannot create\n\0>; .even
1:
mov $ppt,r0
cmp r5,$3
blt 1f
mov (sp)+,r0
1:
jsr r5,fopen; ibuf
bec 1f
jsr r5,mesg; <Cannot open\n\0>; .even
sys exit
1:
jsr pc,get
tst r0
beq 1b
cmp r0,$1
bne err
jsr pc,get
jsr pc,get
mov r0,-(sp)
jsr pc,get
swab r0
bis r0,(sp)
jsr pc,get
mov r0,r1
jsr pc,get
swab r0
bis r0,r1
sub $6,(sp)
ble 2f
cmp r1,origin
beq 3f
mov r1,origin
jsr r5,flush; obuf
mov obuf,r0
sys seek; origin: 0; 0
3:
jsr pc,get
jsr pc,put
dec (sp)
bgt 3b
tst (sp)+
jsr pc,get
br 1b
2:
jsr r5,flush; obuf
sys exit
put:
jsr r5,putc; obuf
inc origin
rts pc
get:
jsr r5,getc; ibuf
bec 1f
err:
jsr r5,flush; obuf
mov icount,r0
jsr pc,decml
jsr r5,mesg; < Input error\n\0>; .even
sys exit
1:
inc icount
rts pc
decml:
mov r0,r1
clr r0
div $10.,r0
mov r1,-(sp)
tst r0
beq 1f
jsr pc,decml
1:
mov (sp)+,r0
add $'0,r0
mov r0,icount
mov $1,r0
sys write; icount; 1
rts pc
ppt:
</dev/ppt\0>
.even
.bss
count: .=.+2
ch: .=.+2
icount: .=.+2
ibuf: .=.+520.
obuf: .=.+520.