mirror of
https://github.com/DoctorWkt/unix-jun72.git
synced 2026-04-12 15:16:44 +00:00
585 lines
6.5 KiB
ArmAsm
585 lines
6.5 KiB
ArmAsm
/ ls -- list file or directory
|
|
|
|
.globl flush
|
|
.globl fopen
|
|
.globl getw
|
|
.globl getc
|
|
.globl putc
|
|
.globl ctime
|
|
.globl end
|
|
|
|
sys break; end+512.
|
|
mov $1,obuf
|
|
mov sp,r5
|
|
mov (r5)+,count
|
|
tst (r5)+
|
|
dec count
|
|
mov count,ocount
|
|
bgt loop
|
|
mov $dotp,r5
|
|
loop:
|
|
mov (r5)+,r4
|
|
cmpb (r4)+,$'-
|
|
bne 1f
|
|
dec ocount
|
|
3:
|
|
movb (r4)+,r0
|
|
beq eloop
|
|
cmp r0,$'l
|
|
bne 4f
|
|
inc longf
|
|
br 3b
|
|
4:
|
|
cmpb r0,$'t
|
|
bne 4f
|
|
mov $14.,sortoff
|
|
br 3b
|
|
4:
|
|
cmpb r0,$'a
|
|
bne 4f
|
|
inc allflg
|
|
br 3b
|
|
4:
|
|
cmpb r0,$'s
|
|
bne 4f
|
|
incb longf+1
|
|
br 3b
|
|
4:
|
|
cmpb r0,$'d
|
|
bne 3b
|
|
inc dirflg
|
|
br 3b
|
|
1:
|
|
dec r4
|
|
jsr pc,do
|
|
eloop:
|
|
dec count
|
|
bgt loop
|
|
tst dnp
|
|
bne 1f
|
|
mov $dotp,r5
|
|
br loop
|
|
1:
|
|
jsr r5,flush; obuf
|
|
sys exit
|
|
|
|
do:
|
|
clr tblocks
|
|
mov $end,r1
|
|
mov $filnam,r3
|
|
mov r4,dnp
|
|
clr isadir
|
|
tst dirflg
|
|
bne nondir
|
|
sys stat; dnp: 0; statb
|
|
bec 1f
|
|
jsr r5,questf; < nonexistent\n\0>; .even
|
|
rts pc
|
|
1:
|
|
bit $40000,statb+2 /test directory
|
|
beq nondir
|
|
inc isadir
|
|
mov r4,r0
|
|
jsr r5,fopen; dbuf
|
|
bcc 1f
|
|
jsr r5,questf; < unreadable\n\0>; .even
|
|
rts pc
|
|
1:
|
|
movb (r4)+,(r3)+
|
|
bne 1b
|
|
dec r3
|
|
cmpb -1(r3),$'/
|
|
beq 1f
|
|
movb $'/,(r3)+
|
|
1:
|
|
jsr r5,getw; dbuf
|
|
bcs pass2
|
|
mov $4,-(sp)
|
|
tst r0
|
|
bne 2f
|
|
3:
|
|
jsr r5,getw; dbuf
|
|
dec (sp)
|
|
bne 3b
|
|
tst (sp)+
|
|
br 1b
|
|
2:
|
|
mov r3,r2
|
|
2:
|
|
jsr r5,getw; dbuf
|
|
mov r0,(r1)+
|
|
movb r0,(r2)+
|
|
swab r0
|
|
movb r0,(r2)+
|
|
dec (sp)
|
|
bne 2b
|
|
tst (sp)+
|
|
clrb (r2)+
|
|
tst allflg
|
|
bne 2f
|
|
cmpb (r3),$'.
|
|
bne 2f
|
|
sub $8.,r1
|
|
br 1b
|
|
2:
|
|
jsr r5,gstat
|
|
br 1b
|
|
nondir:
|
|
mov r3,r2
|
|
1:
|
|
movb (r4)+,(r2)+
|
|
bne 1b
|
|
1:
|
|
cmp r2,r3
|
|
blos 1f
|
|
cmpb -(r2),$'/
|
|
bne 1b
|
|
inc r2
|
|
1:
|
|
mov $8.,-(sp)
|
|
1:
|
|
movb (r2)+,(r1)+
|
|
bne 2f
|
|
dec r2
|
|
2:
|
|
dec (sp)
|
|
bne 1b
|
|
jsr r5,gstat
|
|
tst (sp)+
|
|
|
|
pass2:
|
|
mov dbuf,r0
|
|
sys close
|
|
mov $end,r2
|
|
cmp r1,r2
|
|
bne 1f
|
|
rts pc
|
|
1:
|
|
mov r5,-(sp)
|
|
mov r1,-(sp)
|
|
add sortoff,r2
|
|
1:
|
|
mov r2,(r1)+
|
|
add $20.,r2
|
|
cmp r2,(sp)
|
|
blo 1b
|
|
mov (sp),r2
|
|
tst -(r1)
|
|
1:
|
|
mov r2,r3
|
|
2:
|
|
tst (r3)+
|
|
cmp r3,r1
|
|
bhi 2f
|
|
mov (r2),r4
|
|
mov (r3),r5
|
|
tst sortoff
|
|
beq 4f
|
|
cmp (r4)+,(r5)+
|
|
blo 3f
|
|
bhi 2b
|
|
cmp (r4)+,(r5)+
|
|
blo 3f
|
|
br 2b
|
|
4:
|
|
4:
|
|
cmpb (r4)+,(r5)+
|
|
bhi 3f
|
|
blo 2b
|
|
dec r0
|
|
br 4b
|
|
3:
|
|
mov (r2),-(sp)
|
|
mov (r3),(r2)
|
|
mov (sp)+,(r3)
|
|
br 2b
|
|
2:
|
|
tst (r2)+
|
|
cmp r2,r1
|
|
blo 1b
|
|
1:
|
|
mov (sp)+,r2
|
|
mov (sp)+,r5
|
|
|
|
pass3:
|
|
cmp ocount,$1
|
|
ble 1f
|
|
tst isadir
|
|
beq 2f
|
|
mov dnp,0f
|
|
jsr r5,pstring; 0:..
|
|
jsr r5,pstring; colon
|
|
1:
|
|
tst longf
|
|
beq 1f
|
|
jsr r5,pstring; totmes
|
|
mov tblocks,r0
|
|
jsr r5,decimal; 4
|
|
jsr r5,pstring; nl
|
|
2:
|
|
tstb longf
|
|
beq 1f
|
|
mov $passwd,r0
|
|
jsr r5,fopen; iobuf
|
|
bes 1f
|
|
mov $uidbuf,r3
|
|
3:
|
|
2:
|
|
jsr r5,getc; iobuf
|
|
bes 3f
|
|
movb r0,(r3)+
|
|
cmpb r0,$':
|
|
bne 2b
|
|
2:
|
|
jsr r5,getc; iobuf
|
|
cmpb r0,$':
|
|
bne 2b
|
|
2:
|
|
jsr r5,getc; iobuf
|
|
cmpb r0,$':
|
|
beq 2f
|
|
movb r0,(r3)+
|
|
br 2b
|
|
2:
|
|
movb $'\n,(r3)+
|
|
cmp r3,$euidbuf
|
|
bhis 3f
|
|
2:
|
|
jsr r5,getc; iobuf
|
|
cmpb r0,$'\n
|
|
bne 2b
|
|
br 3b
|
|
3:
|
|
mov r3,euids
|
|
sys close
|
|
1:
|
|
cmp r2,r1
|
|
bhi 1f
|
|
mov (r2)+,r3
|
|
sub sortoff,r3
|
|
jsr r5,pentry
|
|
mov $8.,-(sp)
|
|
2:
|
|
movb (r3)+,r0
|
|
beq 2f
|
|
jsr r5,putc; obuf
|
|
dec (sp)
|
|
bne 2b
|
|
2:
|
|
tst (sp)+
|
|
jsr r5,pstring; nl
|
|
br 1b
|
|
1:
|
|
cmp ocount,$1
|
|
ble 1f
|
|
tst isadir
|
|
beq 1f
|
|
jsr r5,pstring; nl
|
|
1:
|
|
rts pc
|
|
|
|
pentry:
|
|
mov r2,-(sp)
|
|
tstb longf
|
|
bne listl
|
|
tstb longf+1
|
|
bne 2f
|
|
mov (sp)+,r2
|
|
rts r5
|
|
2:
|
|
mov 12.(r3),r0
|
|
jsr r5,calcb
|
|
jsr r5,decimal; 3
|
|
jsr r5,pstring; space
|
|
mov (sp)+,r2
|
|
rts r5
|
|
pstring:
|
|
mov r5,-(sp)
|
|
mov (r5),r5
|
|
1:
|
|
movb (r5)+,r0
|
|
beq 1f
|
|
jsr r5,putc; obuf
|
|
br 1b
|
|
1:
|
|
mov (sp)+,r5
|
|
tst (r5)+
|
|
rts r5
|
|
|
|
questf:
|
|
mov r4,0f
|
|
jsr r5,pstring; 0:..
|
|
mov r5,0f
|
|
jsr r5,pstring; 0:..
|
|
1:
|
|
tstb (r5)+
|
|
bne 1b
|
|
inc r5
|
|
bic $1,r5
|
|
rts r5
|
|
listl:
|
|
mov 18.(r3),r0 / inode
|
|
jsr r5,decimal; 4
|
|
jsr r5,pstring; space
|
|
mov r3,r4
|
|
add $8.,r4 / get to flags
|
|
bit $10000,(r4) /large
|
|
beq 2f
|
|
jsr r5,mode; 'l
|
|
br 3f
|
|
2:
|
|
jsr r5,mode; 's
|
|
3:
|
|
bit $40000,(r4) /directory
|
|
beq 2f
|
|
jsr r5,mode; 'd
|
|
br 3f
|
|
2:
|
|
bit $40,(r4) /set uid
|
|
beq 2f
|
|
jsr r5,mode; 'u
|
|
br 3f
|
|
2:
|
|
bit $20,(r4) /executable
|
|
beq 2f
|
|
jsr r5,mode; 'x
|
|
br 3f
|
|
2:
|
|
jsr r5,mode; '-
|
|
3:
|
|
bit $10,(r4) /read owner
|
|
beq 2f
|
|
jsr r5,mode; 'r
|
|
br 3f
|
|
2:
|
|
jsr r5, mode; '-
|
|
3:
|
|
bit $4,(r4) /write owner
|
|
beq 2f
|
|
jsr r5,mode; 'w
|
|
br 3f
|
|
2:
|
|
jsr r5,mode; '-
|
|
3:
|
|
bit $2,(r4) /read non-owner
|
|
beq 2f
|
|
jsr r5,mode; 'r
|
|
br 3f
|
|
2:
|
|
jsr r5,mode; '-
|
|
3:
|
|
bit $1,(r4)+ /write non-owner
|
|
beq 2f
|
|
jsr r5,mode; 'w
|
|
br 3f
|
|
2:
|
|
jsr r5,mode; '-
|
|
3:
|
|
jsr r5,pstring; space
|
|
movb (r4)+,r0
|
|
jsr r5,decimal; 2
|
|
movb (r4)+,r2
|
|
jsr pc,puid
|
|
mov (r4)+,r0
|
|
jsr r5,decimal; 5
|
|
jsr r5,pstring; space
|
|
mov r1,-(sp)
|
|
mov (r4)+,r0
|
|
mov (r4)+,r1
|
|
sub $16.,sp
|
|
mov sp,r2
|
|
jsr pc,ctime
|
|
mov sp,r2
|
|
mov $15.,-(sp)
|
|
1:
|
|
movb (r2)+,r0
|
|
jsr r5,putc; obuf
|
|
dec (sp)
|
|
bne 1b
|
|
add $18.,sp
|
|
mov (sp)+,r1
|
|
jsr r5,pstring; space
|
|
mov (sp)+,r2
|
|
rts r5
|
|
|
|
puid:
|
|
mov r1,-(sp)
|
|
mov $uidbuf,r1
|
|
1:
|
|
cmp r1,euids
|
|
bhis 1f
|
|
mov r1,0f
|
|
2:
|
|
tstb (r1)+
|
|
beq 3f
|
|
cmpb -1(r1),$':
|
|
bne 2b
|
|
clrb -1(r1)
|
|
3:
|
|
clr -(sp)
|
|
3:
|
|
movb (r1)+,r0
|
|
sub $'0,r0
|
|
cmp r0,$9.
|
|
bhi 3f
|
|
mov r1,-(sp)
|
|
mov 2(sp),r1
|
|
mpy $10.,r1
|
|
add r0,r1
|
|
mov r1,2(sp)
|
|
mov (sp)+,r1
|
|
br 3b
|
|
3:
|
|
mov (sp)+,r0
|
|
cmp r0,r2
|
|
bne 1b
|
|
jsr r5,pstring; space
|
|
jsr r5,pstring; 0:..
|
|
mov 0b,r1
|
|
mov $6,-(sp)
|
|
3:
|
|
tstb (r1)+
|
|
beq 3f
|
|
dec (sp)
|
|
br 3b
|
|
3:
|
|
jsr r5,pstring; space
|
|
dec (sp)
|
|
bgt 3b
|
|
tst (sp)+
|
|
mov (sp)+,r1
|
|
rts pc
|
|
1:
|
|
jsr r5,pstring; space
|
|
mov r2,r0
|
|
jsr r5,decimal; 3
|
|
jsr r5,pstring; space3
|
|
mov (sp)+,r1
|
|
rts pc
|
|
|
|
mode:
|
|
mov (r5)+,r0
|
|
jsr r5,putc; obuf
|
|
rts r5
|
|
|
|
|
|
gstat:
|
|
mov r1,-(sp)
|
|
add $512.,r1
|
|
cmp r1,0f
|
|
blo 1f
|
|
mov r1,0f
|
|
sys break; 0: end+512.
|
|
1:
|
|
mov (sp)+,r1
|
|
tst longf
|
|
bne 2f
|
|
tst sortoff
|
|
beq 1f
|
|
2:
|
|
sys stat; filnam; statb
|
|
bec 2f
|
|
mov r4,-(sp)
|
|
mov $filnam,r4
|
|
jsr r5,questf; < unstatable\n\0>; .even
|
|
mov (sp)+,r4
|
|
add $12.,r1
|
|
rts r5
|
|
2:
|
|
mov $statb+2,r0
|
|
mov (r0)+,(r1)+ /flags
|
|
mov (r0)+,(r1)+ /nlinks, uid
|
|
mov r0,-(sp)
|
|
mov (r0),r0
|
|
jsr r5,calcb
|
|
add r0,tblocks
|
|
mov (sp)+,r0
|
|
mov (r0)+,(r1)+ /size
|
|
add $20.,r0 /dska, ctim
|
|
mov (r0)+,(r1)+ /mtim
|
|
mov (r0)+,(r1)+
|
|
mov statb,(r1)+ /inode
|
|
rts r5
|
|
1:
|
|
add $12.,r1
|
|
rts r5
|
|
|
|
decimal:
|
|
mov r1,-(sp)
|
|
mov r2,-(sp)
|
|
mov r3,-(sp)
|
|
mov $6,r2
|
|
mov $numbuf+6,r3
|
|
1:
|
|
mov r0,r1
|
|
clr r0
|
|
dvd $10.,r0
|
|
add $'0,r1
|
|
movb r1,-(r3)
|
|
sob r2,1b
|
|
1:
|
|
cmp r3,$numbuf+5
|
|
beq 1f
|
|
cmpb (r3),$'0
|
|
bne 1f
|
|
movb $' ,(r3)+
|
|
br 1b
|
|
1:
|
|
mov $numbuf+6,r1
|
|
sub (r5),r1
|
|
mov (r5)+,-(sp)
|
|
1:
|
|
movb (r1)+,r0
|
|
jsr r5,putc; obuf
|
|
dec (sp)
|
|
bne 1b
|
|
tst (sp)+
|
|
mov (sp)+,r3
|
|
mov (sp)+,r2
|
|
mov (sp)+,r1
|
|
rts r5
|
|
|
|
calcb:
|
|
add $511.,r0
|
|
clrb r0
|
|
swab r0
|
|
asr r0
|
|
cmp r0,$8
|
|
blo 1f
|
|
inc r0
|
|
1:
|
|
1:
|
|
rts r5
|
|
|
|
|
|
dotp: dot
|
|
euids: uidbuf
|
|
|
|
dot: <.\0>
|
|
nl: <\n\0>
|
|
totmes: <total \0>
|
|
space3: < >
|
|
space: < \0>
|
|
passwd: </etc/passwd\0>
|
|
colon: <:\n\0>
|
|
.even
|
|
|
|
.bss
|
|
|
|
count: .=.+2
|
|
ocount: .=.+2
|
|
longf: .=.+2
|
|
sortoff: .=.+2
|
|
allflg: .=.+2
|
|
dirflg: .=.+2
|
|
isadir: .=.+2
|
|
filnam: .=.+32.
|
|
statb: .=.+34.
|
|
dbuf: .=.+518.
|
|
obuf: .=.+518.
|
|
numbuf: .=.+6
|
|
tblocks: .=.+2
|
|
uidbuf: .=.+1024.
|
|
euidbuf:
|
|
iobuf: .=.+518.
|