MiniUnix/usr/source/s2/tp3.s
/ tap3 -- dec-tape lod/dmp
gettape:
mov $dir,r1
clr -(sp)
1:
tst (r1)
beq 2f
jsr r5,decode; name
cmp rnarg,$2
ble 4f
mov $name,r2
mov *parg,r3
3:
tstb (r3)
beq 3f
cmpb (r2)+,(r3)+
beq 3b
br 2f
3:
tstb (r2)
beq 4f
cmpb (r2),$'/
bne 2f
4:
mov r1,-(sp)
jsr pc,*(r5)
mov (sp)+,r1
inc (sp)
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
tst (sp)+
bne 2f
cmp rnarg,$2
ble 2f
mov *parg,r1
jsr pc,pstr
jsr r5,mesg
< not found\n\0>; .even
2:
dec narg
add $2,parg
cmp narg,$2
bgt gettape
tst (r5)+
rts r5
delete:
jsr r5,verify; 'd
rts pc
jsr pc,clrent
rts pc
numb:
mov r1,-(sp)
mov r0,-(sp)
clr r0
br 1f
numbx:
mov r1,-(sp)
mov r0,-(sp)
movb size0(r1),r0
1:
mov $catlb,r2
1:
mov $" ,(r2)+
cmp r2,$catlb+12.
blo 1b
cmp (r5),$2
bne 1f
mov $"00,-2(r2)
1:
mov (sp)+,r1
jsr pc,numb2
mov (r5)+,r0
sub r0,r2
mov r2,0f
mov r0,0f+2
mov $1,r0
sys 0; 9f
.data
9:
sys write; 0:..; ..
.text
mov (sp)+,r1
rts r5
numb1:
clr r0
numb2:
div $10.,r0
mov r1,-(sp)
mov r0,r1
beq 1f
jsr pc,numb1
1:
mov (sp)+,r0
add $'0,r0
movb r0,(r2)+
rts pc
update:
jsr pc,bitmap
mov $dir,r1
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
beq 2f
tstb size0(r1)
bne 9f
tst size1(r1)
beq 2f
9:
mov ndentd8,-(sp)
inc (sp)
movb size0(r1),r2
mov size1(r1),r3
add $511.,r3
adc r2
ashc $-9,r2
mov r3,size
3:
mov (sp),r2
mov size,r3
4:
jsr pc,bitcalc
inc r2
bitb (sp)+,map(r0)
bne 4f
sob r3,4b
mov (sp)+,tapea(r1)
jsr pc,setmap
br 2f
4:
inc (sp)
br 3b
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
jsr pc,wrdir
update1:
mov $dir,r1
clr -(sp)
mov $-1,-(sp)
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
beq 2f
cmp tapea(r1),(sp)
bhis 2f
mov tapea(r1),(sp)
mov r1,2(sp)
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
tst (sp)+
mov (sp)+,r1
bne 1f
rts pc
1:
bic $100000,mode(r1)
movb size0(r1),mss
mov size1(r1),r2
bne 4f
tst mss
beq update1
4:
jsr r5,decode; name
mov tapea(r1),r0
jsr pc,wseek
clr r3
sys open; name; 0
bes phserr
mov r0,r3
3:
tst mss
bne 4f
cmp r2,$512.
blo 3f
4:
mov r3,r0
sys read; tapeb; 512.
bes phserr
cmp r0,$512.
bne phserr
jsr pc,twrite
sub $512.,r2
sbc mss
br 3b
3:
mov r2,0f
beq 3f
mov r3,r0
sys 0; 9f
.data
9:
sys read; tapeb; 0:..
.text
bes phserr
cmp r0,0b
bne phserr
jsr pc,twrite
3:
mov r3,r0
sys read; tapeb; 512.
bes phserr
tst r0
bne phserr
mov r3,r0
sys close
2:
jmp update1
phserr:
mov r1,-(sp)
mov $name,r1
jsr pc,pstr
jsr r5,mesg
< -- Phase error\n\0>; .even
mov (sp)+,r1
clr time0(r1) / time
beq 2b
sys close
br 2b
bitmap:
mov $map,r0
1:
clr (r0)+
cmp r0,$emap
blo 1b
mov $dir,r1
1:
tst (r1)
beq 2f
bit $100000,mode(r1)
bne 2f
tst size1(r1)
bne 3f
tstb size0(r1)
beq 2f
3:
jsr pc,setmap
2:
add $dirsiz,r1
cmp r1,edir
blo 1b
rts pc
setmap:
movb size0(r1),r2
mov size1(r1),r3
add $511.,r3
adc r2
ashc $-9.,r2
mov tapea(r1),r2
1:
jsr pc,bitcalc
bitb (sp),map(r0)
bne maperr
bisb (sp)+,map(r0)
inc r2
sob r3,1b
rts pc
bitcalc:
mov (sp),-(sp)
cmp r2,tapsiz
bhis maperr
mov r2,r0
bic $!7,r0
mov r0,-(sp)
mov $1,r0
als (sp)+,r0
mov r0,2(sp)
mov r2,r0
ash $-3,r0
bic $160000,r0
rts pc
maperr:
jsr r5,mesg
<Tape overflow\n\0>; .even
jmp done
usage:
jsr pc,bitmap
mov $dir,r2
1:
tst (r2)
beq 2f
inc nentr
2:
add $dirsiz,r2
cmp r2,edir
blo 1b
mov ndentd8,r2
inc r2
mov tapsiz,r3
dec r3
sub ndentd8,r3
1:
jsr pc,bitcalc
bitb (sp)+,map(r0)
beq 2f
inc nused
mov r2,lused
br 3f
2:
inc nfree
tstb flm
bne 1f
3:
inc r2
sob r3,1b
1:
mov nentr,r0
jsr r5,numb; 4
jsr r5,mesg
< entries\n\0>; .even
mov nused,r0
jsr r5,numb; 4
jsr r5,mesg
< used\n\0>; .even
tstb flm
bne 1f
mov nfree,r0
jsr r5,numb; 4
jsr r5,mesg
< free\n\0>; .even
1:
mov lused,r0
jsr r5,numb; 4
jsr r5,mesg
< last\n\0>; .even
rts pc
taboc:
tstb flv
beq 4f
mov mode(r1),r0
mov r0,-(sp)
ash $-6,r0
bit $40,r0
jsr pc,pmod
mov (sp),r0
ash $-3,r0
bit $200,r0
jsr pc,pmod
mov (sp)+,r0
bit $1000,r0
jsr pc,pmod
clr r0
bisb uid(r1),r0
jsr r5,numb; 4
clr r0
bisb gid(r1),r0
jsr r5,numb; 4
mov tapea(r1),r0
jsr r5,numb; 5
mov size1(r1),r0
jsr r5,numbx; 9.
mov r1,-(sp)
add $time0,(sp)
jsr pc,_localtime
mov r0,(sp)
mov 10.(r0),r0
jsr r5,numb; 3
mov $'/,r0
jsr pc,putc
mov (sp),r0
mov 8.(r0),r0
inc r0
jsr r5,numb; 2
mov $'/,r0
jsr pc,putc
mov (sp),r0
mov 6(r0),r0
jsr r5,numb; 2
mov (sp),r0
mov 4(r0),r0
jsr r5,numb; 3
mov $':,r0
jsr pc,putc
mov (sp)+,r0
mov 2(r0),r0
jsr r5,numb; 2
mov $' ,r0
jsr pc,putc
4:
mov $name,r1
jsr pc,pstr
jsr r5,mesg
<\n\0>
rts pc
pmod:
beq 1f
mov $'s,-(sp)
br 2f
1:
bit $1,r0
beq 1f
mov $'x,-(sp)
br 2f
1:
mov $'-,-(sp)
2:
bit $2,r0
beq 1f
mov $'w,-(sp)
br 2f
1:
mov $'-,-(sp)
2:
bit $4,r0
beq 1f
mov $'r,r0
br 2f
1:
mov $'-,r0
2:
jsr pc,putc
mov (sp)+,r0
jsr pc,putc
mov (sp)+,r0
jsr pc,putc
rts pc
xtract:
movb size0(r1),mss
bne 2f
tst size1(r1)
beq 1f
2:
jsr r5,verify; 'x
rts pc
mov size1(r1),r3
mov tapea(r1),r0
jsr pc,rseek
sys unlink; name
mov mode(r1),0f
sys 0; 9f
.data
9:
sys creat; name; 0:..
.text
bes crterr
mov r0,r2
2:
tst mss
bne 3f
cmp r3,$512.
blo 2f
3:
jsr pc,tread
mov r2,r0
sys write; tapeb; 512.
bes crterr1
cmp r0,$512.
bne crterr1
sub r0,r3
sbc mss
br 2b
2:
mov r3,0f
beq 2f
jsr pc,tread
mov r2,r0
sys 0; 9f
.data
9:
sys write; tapeb; 0:..
.text
bes crterr1
cmp r0,0b
bne crterr1
2:
mov r2,r0
sys close
movb gid(r1),0f+1
movb uid(r1),0f
sys 0; 9f
.data
9:
sys chown; name; 0:..
.text
mov time0(r1),r0
mov r1,-(sp)
mov time1(r1),r1
/ sys 0; 9f
.data
9:
sys smdate; name
.text
mov (sp)+,r1
1:
rts pc
crterr1:
clr r0
mov r1,-(sp)
clr r1
/ sys smdate; name
mov (sp)+,r1
mov r2,r0
sys close
crterr:
mov $name,r1
jsr pc,pstr
jsr r5,mesg
< -- create error\n\0>; .even
rts pc