Add original unix v6
This commit is contained in:
+203
@@ -0,0 +1,203 @@
|
||||
/ lpd -- Line Printer daemon
|
||||
|
||||
.globl fopen, getc
|
||||
.globl fcreat, putc, flush
|
||||
.globl switch
|
||||
|
||||
sys signal; 1; 1
|
||||
sys signal; 2; 1
|
||||
sys signal; 3; 1 / ignore quit,intr,hup
|
||||
sys stat; lock; buf
|
||||
bec 2f
|
||||
sys creat; lock; 0
|
||||
bes 2f
|
||||
sys open; lpd; 0
|
||||
bes 3f
|
||||
mov r0,r1
|
||||
1:
|
||||
mov r1,r0
|
||||
sys read; dbuf; 16.
|
||||
bes 3f
|
||||
tst r0
|
||||
beq 3f
|
||||
tst dbuf
|
||||
beq 1b
|
||||
cmp dbuf+2,$"df
|
||||
bne 1b
|
||||
sys fork
|
||||
br retry
|
||||
sys exit
|
||||
3:
|
||||
sys unlink; lock
|
||||
2:
|
||||
sys exit
|
||||
|
||||
/ get line printer
|
||||
retry:
|
||||
jsr r5,aclose
|
||||
mov $lpr,r0
|
||||
jsr r5,fcreat; print
|
||||
bes error
|
||||
sys chdir; lpd
|
||||
bes error
|
||||
sys open; lpd; 0
|
||||
bes error
|
||||
mov r0,dfi
|
||||
br loop
|
||||
|
||||
done:
|
||||
sys unlink; lock
|
||||
sys exit
|
||||
|
||||
error:
|
||||
jsr r5,aclose
|
||||
mov $10.,r0
|
||||
sys sleep
|
||||
sys stat; lock; buf
|
||||
bes done / die if lock is gone
|
||||
br retry
|
||||
|
||||
/ look in directory for work
|
||||
loop:
|
||||
mov dfi,r0
|
||||
sys seek; 0; 0
|
||||
|
||||
1:
|
||||
mov dfi,r0
|
||||
sys read; dbuf; 16.
|
||||
bes error
|
||||
tst r0
|
||||
beq done / only non-error return
|
||||
tst dbuf
|
||||
beq 1b
|
||||
mov $dbuf+2,r0
|
||||
cmp (r0),$"df / look for daemon file
|
||||
bne 1b
|
||||
|
||||
/ found prototype file
|
||||
jsr r5,fopen; proto
|
||||
bes 1b
|
||||
|
||||
/ copy a line into buf
|
||||
/ only work is expansion of tabs
|
||||
loop1:
|
||||
mov $buf,r1
|
||||
1:
|
||||
jsr r5,getc; proto
|
||||
bes eloop1
|
||||
movb r0,(r1)
|
||||
cmp r0,$'\t
|
||||
beq 2f
|
||||
cmpb (r1)+,$'\n
|
||||
bne 1b
|
||||
br 1f
|
||||
2:
|
||||
movb $' ,(r1)+
|
||||
cmp r1,$buf+8.
|
||||
beq 1b
|
||||
cmp r1,$buf+16.
|
||||
bhis 1b
|
||||
br 2b
|
||||
1:
|
||||
movb buf,r0
|
||||
jsr r5,switch; sptab
|
||||
|
||||
/ done with a prototype file
|
||||
/ look for U's in second pass
|
||||
eloop1:
|
||||
mov proto,r0
|
||||
sys seek; 0; 0
|
||||
br 2f
|
||||
1:
|
||||
jsr r5,getc; proto
|
||||
bes 1f
|
||||
3:
|
||||
cmp r0,$'\n
|
||||
bne 1b
|
||||
2:
|
||||
jsr r5,getc; proto
|
||||
bes 1f
|
||||
cmp r0,$'U
|
||||
bne 3b
|
||||
mov $buf,r1
|
||||
3:
|
||||
jsr r5,getc; proto
|
||||
bes 1f
|
||||
movb r0,(r1)+
|
||||
cmp r0,$'\n
|
||||
bne 3b
|
||||
clrb -(r1)
|
||||
sys unlink; buf
|
||||
br 2b
|
||||
1:
|
||||
mov proto,r0
|
||||
sys close
|
||||
sys unlink; dbuf+2
|
||||
br loop
|
||||
|
||||
/ list of special characters
|
||||
/ switchout
|
||||
sptab:
|
||||
'L; literal
|
||||
'B; binary
|
||||
'F; form
|
||||
'U; loop1 / unlink on second pass
|
||||
0; 0
|
||||
|
||||
|
||||
literal:
|
||||
jmp loop1
|
||||
|
||||
form:
|
||||
clrb -(r1)
|
||||
mov $buf+1,r0
|
||||
jsr r5,fopen; insert
|
||||
bes loop1
|
||||
mov $14,r0
|
||||
jsr r5,putc; print
|
||||
br 1f
|
||||
|
||||
binary:
|
||||
clrb -(r1)
|
||||
mov $buf+1,r0
|
||||
jsr r5,fopen; insert
|
||||
bes loop1
|
||||
|
||||
1:
|
||||
jsr r5,getc; insert
|
||||
bes 1f
|
||||
jsr r5,putc; print
|
||||
br 1b
|
||||
1:
|
||||
jsr r5,flush; print
|
||||
mov insert,r0
|
||||
sys close
|
||||
br loop1
|
||||
|
||||
aclose:
|
||||
mov $9.,r1
|
||||
1:
|
||||
mov r1,r0
|
||||
sys close
|
||||
dec r1
|
||||
bge 1b
|
||||
rts r5
|
||||
|
||||
lpr:
|
||||
</dev/lp\0>
|
||||
lock:
|
||||
</usr/lpd/lock\0>
|
||||
lpd:
|
||||
</usr/lpd\0>
|
||||
.even
|
||||
.bss
|
||||
|
||||
ch: .=.+2
|
||||
dfi: .=.+2
|
||||
dbuf: .=.+18.
|
||||
print: .=.+518.
|
||||
proto: .=.+518.
|
||||
insert: .=.+518.
|
||||
buf: .=.+400.
|
||||
sleep = 35.
|
||||
signal = 48.
|
||||
Reference in New Issue
Block a user