/ 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 .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 .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 .even crterr: jsr r5,diag .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: .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.