547 lines
5.6 KiB
ArmAsm
547 lines
5.6 KiB
ArmAsm
/ ar -- archive/library
|
|
|
|
mov (sp)+,r0
|
|
sub $2,r0
|
|
ble userr
|
|
tst (sp)+
|
|
mov (sp)+,r1
|
|
clr r2
|
|
1:
|
|
tstb (r1)
|
|
beq 1f
|
|
cmpb (r1),$'v
|
|
bne 2f
|
|
inc r1
|
|
incb vflg
|
|
br 1b
|
|
2:
|
|
tst r2
|
|
bne userr
|
|
movb (r1)+,r2
|
|
br 1b
|
|
1:
|
|
tst r2
|
|
beq userr
|
|
mov $arglst,r1
|
|
1:
|
|
mov (sp)+,(r1)+
|
|
dec r0
|
|
bgt 1b
|
|
clr (r1)+
|
|
mov $swlst,r1
|
|
1:
|
|
cmp r2,(r1)+
|
|
beq 1f
|
|
tst (r1)+
|
|
bne 1b
|
|
br userr
|
|
1:
|
|
jmp *(r1)
|
|
|
|
swlst:
|
|
'r; comr
|
|
'u; comu
|
|
'd; comd
|
|
'x; comx
|
|
't; comt
|
|
0; 0
|
|
|
|
userr:
|
|
jsr r5,diag
|
|
<bad usage\n\0>
|
|
.even
|
|
|
|
putc:
|
|
movb r0,ch
|
|
mov $1,r0
|
|
sys write; ch; 1
|
|
rts r5
|
|
|
|
print:
|
|
movb (r1)+,r0
|
|
beq 1f
|
|
jsr r5,putc
|
|
br print
|
|
1:
|
|
rts r5
|
|
|
|
diag:
|
|
mov r5,r1
|
|
jsr r5,print
|
|
tst tfo
|
|
beq 1f
|
|
sys unlink; tfil
|
|
1:
|
|
sys exit
|
|
|
|
getaf:
|
|
mov arglst,0f
|
|
sys open; 0:..; 0
|
|
bes 1f
|
|
mov r0,afi
|
|
sys read; buf; 2
|
|
cmp buf,magic
|
|
bne magerr
|
|
tst (r5)+
|
|
1:
|
|
rts r5
|
|
|
|
magerr:
|
|
mov arglst,r1
|
|
jsr r5,print
|
|
jsr r5,diag
|
|
< -- not in archive format\n\0>
|
|
.even
|
|
|
|
mktmp:
|
|
sys stat; tfil; buf
|
|
bes 1f
|
|
incb tfil+8
|
|
cmpb tfil+8,$'z
|
|
blo mktmp
|
|
br tferr
|
|
1:
|
|
sys signal; 2; 1
|
|
ror r0
|
|
bcs 1f
|
|
sys signal; 2; done
|
|
1:
|
|
sys creat; tfil; 600
|
|
bes tferr
|
|
mov r0,tfo
|
|
sys open; tfil; 0
|
|
bes tferr
|
|
mov r0,tfi
|
|
rts r5
|
|
|
|
tferr:
|
|
jsr r5,diag
|
|
<cannot open temp file\n\0>
|
|
.even
|
|
|
|
getdir:
|
|
mov afi,r0
|
|
sys read; dir; 16.
|
|
cmp r0,$16.
|
|
bne 1f
|
|
jsr r5,mvname
|
|
tst (r5)+
|
|
1:
|
|
rts r5
|
|
|
|
mvname:
|
|
mov name,rname
|
|
mov name+2,rname+2
|
|
mov name+4,rname+4
|
|
mov name+6,rname+6
|
|
rts r5
|
|
|
|
skip:
|
|
mov size,r0
|
|
inc r0
|
|
bic $1,r0
|
|
mov r0,0f
|
|
mov afi,r0
|
|
sys seek; 0:..; 1
|
|
rts r5
|
|
|
|
trim:
|
|
mov r0,r2
|
|
1:
|
|
tstb (r0)
|
|
beq 1f
|
|
cmpb (r0)+,$'/
|
|
beq trim
|
|
br 1b
|
|
1:
|
|
rts r5
|
|
|
|
match:
|
|
mov $arglst+2,r1
|
|
1:
|
|
mov (r1)+,r0
|
|
beq 1f
|
|
cmp r0,$-1
|
|
beq 1b
|
|
jsr r5,trim
|
|
mov $name,r0
|
|
2:
|
|
cmp r0,$name+8.
|
|
beq 2f
|
|
cmpb (r0),(r2)+
|
|
bne 1b
|
|
tstb (r0)+
|
|
bne 2b
|
|
2:
|
|
cmp (r5)+,-(r1)
|
|
1:
|
|
rts r5
|
|
|
|
mvfil:
|
|
mov (r1),9f
|
|
mov (r1),0f
|
|
sys stat; 0:..; buf
|
|
bes operr
|
|
sys open; 9:..; 0
|
|
bes operr
|
|
mov r0,fio
|
|
mov (r1),r0
|
|
mov $-1,(r1)
|
|
jsr r5,trim
|
|
mov $name,r0
|
|
1:
|
|
cmp r0,$name+8.
|
|
beq 1f
|
|
movb (r2)+,(r0)+
|
|
bne 1b
|
|
1:
|
|
mov buf+32.,mtim
|
|
mov buf+34.,mtim+2
|
|
movb buf+7.,ouid
|
|
movb buf+4.,mode
|
|
mov buf+10.,size
|
|
mov tfo,r0
|
|
sys write; dir; 16.
|
|
mov size,r2
|
|
1:
|
|
mov fio,r0
|
|
sys read; buf; 512.
|
|
sub r0,r2
|
|
mov r0,0f
|
|
beq 1f
|
|
mov tfo,r0
|
|
sys write; buf; 0:..
|
|
br 1b
|
|
1:
|
|
tst r2
|
|
bne phserr
|
|
bit $1,size
|
|
beq 1f
|
|
mov tfo,r0
|
|
sys seek; 1; 1
|
|
1:
|
|
mov fio,r0
|
|
sys close
|
|
jsr r5,mvname
|
|
rts r5
|
|
|
|
operr:
|
|
mov 9b,r1
|
|
jsr r5,print
|
|
jsr r5,diag
|
|
< -- cannot open\n\0>
|
|
.even
|
|
|
|
phserr:
|
|
mov 9b,r1
|
|
jsr r5,print
|
|
jsr r5,diag
|
|
< -- phase error\n\0>
|
|
.even
|
|
|
|
copyfl:
|
|
mov tfo,r0
|
|
sys write; dir; 16.
|
|
mov size,r1
|
|
mov $rname,9b
|
|
1:
|
|
mov r1,0f
|
|
beq 1f
|
|
cmp r1,$512.
|
|
blo 2f
|
|
mov $512.,0f
|
|
2:
|
|
mov afi,r0
|
|
sys read; buf; 0:..
|
|
sub r0,r1
|
|
mov r0,0f
|
|
beq phserr
|
|
mov tfo,r0
|
|
sys write; buf; 0:..
|
|
br 1b
|
|
1:
|
|
bit $1,size
|
|
beq 1f
|
|
mov afi,r0
|
|
sys seek; 1; 1
|
|
mov tfo,r0
|
|
sys seek; 1; 1
|
|
1:
|
|
rts r5
|
|
|
|
xtract:
|
|
/ movb mode,0f
|
|
sys creat; rname; 0:666
|
|
bes noxerr
|
|
mov r0,fio
|
|
mov size,r1
|
|
mov $rname,9b
|
|
1:
|
|
mov r1,0f
|
|
beq 1f
|
|
cmp r1,$512.
|
|
blo 2f
|
|
mov $512.,0f
|
|
2:
|
|
mov afi,r0
|
|
sys read; buf; 0:..
|
|
sub r0,r1
|
|
mov r0,0f
|
|
beq phserr
|
|
mov fio,r0
|
|
sys write; buf; 0:..
|
|
br 1b
|
|
1:
|
|
mov fio,r0
|
|
sys close
|
|
bit $1,size
|
|
beq 1f
|
|
mov afi,r0
|
|
sys seek; 1; 1
|
|
1:
|
|
mov r0,-(sp)
|
|
mov r1,-(sp)
|
|
mov mtim+2,r1
|
|
mov mtim,r0
|
|
/ sys mdate
|
|
mov (sp)+,r1
|
|
mov (sp)+,r1
|
|
rts r5
|
|
|
|
noxerr:
|
|
mov $rname,r1
|
|
jsr r5,print
|
|
jsr r5,diag
|
|
< -- cannot create\n\0>
|
|
.even
|
|
|
|
table:
|
|
mov $rname,r1
|
|
jsr r5,print
|
|
mov $'\n,r0
|
|
jsr r5,putc
|
|
rts r5
|
|
|
|
mesg:
|
|
mov r1,-(sp)
|
|
mov (r5)+,r0
|
|
tstb vflg
|
|
beq 1f
|
|
jsr r5,putc
|
|
mov $' ,r0
|
|
jsr r5,putc
|
|
mov $rname,r1
|
|
jsr r5,print
|
|
mov $'\n,r0
|
|
jsr r5,putc
|
|
1:
|
|
mov (sp)+,r1
|
|
rts r5
|
|
|
|
oldnew:
|
|
sys stat; rname; buf
|
|
bes 1f
|
|
cmp buf+32.,mtim
|
|
blo 1f
|
|
bhi 2f
|
|
cmp buf+34.,mtim+2
|
|
blos 1f
|
|
2:
|
|
tst (r5)+
|
|
mov $rname,tname
|
|
mov $tname,r1
|
|
1:
|
|
rts r5
|
|
|
|
comr:
|
|
jsr r5,mktmp
|
|
jsr r5,getaf
|
|
br copfl
|
|
1:
|
|
jsr r5,getdir
|
|
br copfl
|
|
jsr r5,match
|
|
br 2f
|
|
jsr r5,mesg; 'r
|
|
jsr r5,skip
|
|
jsr r5,mvfil
|
|
br 1b
|
|
2:
|
|
jsr r5,copyfl
|
|
jsr r5,mesg; 'c
|
|
br 1b
|
|
|
|
comu:
|
|
jsr r5,mktmp
|
|
jsr r5,getaf
|
|
br noaf
|
|
1:
|
|
jsr r5,getdir
|
|
br copfl
|
|
tst arglst+2
|
|
beq 2f
|
|
jsr r5,match
|
|
br 3f
|
|
mov $-1,(r1)
|
|
2:
|
|
jsr r5,oldnew
|
|
br 3f
|
|
jsr r5,mesg; 'r
|
|
jsr r5,skip
|
|
jsr r5,mvfil
|
|
br 1b
|
|
3:
|
|
jsr r5,copyfl
|
|
jsr r5,mesg; 'c
|
|
br 1b
|
|
|
|
comd:
|
|
jsr r5,mktmp
|
|
jsr r5,getaf
|
|
br noaf
|
|
1:
|
|
jsr r5,getdir
|
|
br 1f
|
|
jsr r5,match
|
|
br 2f
|
|
mov $-1,(r1)
|
|
jsr r5,skip
|
|
jsr r5,mesg; 'd
|
|
br 1b
|
|
2:
|
|
jsr r5,copyfl
|
|
jsr r5,mesg; 'c
|
|
br 1b
|
|
1:
|
|
jsr r5,nfound
|
|
br copfl
|
|
|
|
noaf:
|
|
jsr r5,diag
|
|
<no archive file\n\0>
|
|
.even
|
|
|
|
crterr:
|
|
jsr r5,diag
|
|
<cannot create archive file\n\0>
|
|
.even
|
|
|
|
copfl:
|
|
mov $arglst,r1
|
|
mov (r1)+,0f
|
|
1:
|
|
tst (r1)+
|
|
beq 1f
|
|
cmp -2(r1),$-1
|
|
beq 1b
|
|
tst -(r1)
|
|
jsr r5,mvfil
|
|
jsr r5,mesg; 'a
|
|
br 1b
|
|
1:
|
|
sys signal; 2; 1 / no interrupts during copy back
|
|
sys creat; 0:..; 666
|
|
bes crterr
|
|
mov r0,afo
|
|
sys write; magic; 2
|
|
1:
|
|
mov tfi,r0
|
|
sys read; buf; 512.
|
|
mov r0,0f
|
|
beq done
|
|
mov afo,r0
|
|
sys write; buf; 0:..
|
|
br 1b
|
|
|
|
done:
|
|
jsr r5,diag
|
|
<\0>
|
|
.even
|
|
|
|
comx:
|
|
jsr r5,getaf
|
|
br noaf
|
|
1:
|
|
jsr r5,getdir
|
|
br 1f
|
|
tst arglst+2
|
|
beq 3f
|
|
jsr r5,match
|
|
br 2f
|
|
mov $-1,(r1)
|
|
3:
|
|
jsr r5,xtract
|
|
jsr r5,mesg; 'x
|
|
br 1b
|
|
2:
|
|
jsr r5,skip
|
|
br 1b
|
|
1:
|
|
jsr r5,nfound
|
|
br done
|
|
|
|
comt:
|
|
jsr r5,getaf
|
|
br noaf
|
|
1:
|
|
jsr r5,getdir
|
|
br 1f
|
|
tst arglst+2
|
|
beq 2f
|
|
jsr r5,match
|
|
br 3f
|
|
mov $-1,(r1)
|
|
2:
|
|
jsr r5,table
|
|
3:
|
|
jsr r5,skip
|
|
br 1b
|
|
1:
|
|
jsr r5,nfound
|
|
br done
|
|
|
|
nfound:
|
|
mov $arglst+2,r2
|
|
1:
|
|
mov (r2)+,r1
|
|
beq 1f
|
|
cmp r1,$-1
|
|
beq 1b
|
|
mov $-1,-(r2)
|
|
jsr r5,print
|
|
mov $notfnd,r1
|
|
jsr r5,print
|
|
br 1b
|
|
1:
|
|
rts r5
|
|
|
|
notfnd:
|
|
< -- not found\n\0>
|
|
.even
|
|
|
|
tfil: </tmp/vtma\0>
|
|
.even
|
|
magic: -147.
|
|
|
|
.bss
|
|
|
|
afi: .=.+2
|
|
afo: .=.+2
|
|
tfi: .=.+2
|
|
tfo: .=.+2
|
|
fio: .=.+2
|
|
rname: .=.+9.
|
|
ch: .=.+1
|
|
vflg: .=.+1
|
|
.even
|
|
tname: .=.+2
|
|
dir:
|
|
name: .=.+8.
|
|
mtim: .=.+4
|
|
ouid: .=.+1
|
|
mode: .=.+1
|
|
size: .=.+2
|
|
arglst: .=.+200.
|
|
buf: .=.+512.
|
|
|