1
0
mirror of https://github.com/livingcomputermuseum/pdp7-unix.git synced 2026-04-29 21:27:09 +00:00

Add phil's simple "ls": "lsd dir" lists a directory in dd, "lsl dir": long list

(lsl should be a hard link to lsd!)
This commit is contained in:
Phil Budne
2016-03-23 15:55:07 -04:00
parent 8039301ce8
commit aa234d7de4
3 changed files with 276 additions and 1 deletions

View File

@@ -143,7 +143,7 @@ $(BINDIR)/altmkdir: $(ALTSRC)/wktmkdir.s
# The commands that did not come from the scans
others: dirs $(BINDIR)/sh $(BINDIR)/wktcat $(BINDIR)/wktcp $(BINDIR)/date \
$(BINDIR)/ln $(BINDIR)/ls $(BINDIR)/mv $(BINDIR)/stat $(BINDIR)/od \
$(BINDIR)/bc
$(BINDIR)/bc $(BINDIR)/lsd
# Alternative other commands: no dd, but . and ..
altothers: dirs $(BINDIR)/sh $(BINDIR)/wktcat $(BINDIR)/wktcp $(BINDIR)/date \
@@ -168,9 +168,15 @@ $(BINDIR)/ln: $(OTHERSRC)/wktln.s
$(BINDIR)/ls: $(OTHERSRC)/wktls.s
$(AS) $(ASARGS) -o $(BINDIR)/ls $(OTHERSRC)/wktls.s
$(BINDIR)/lsd: $(OTHERSRC)/pblsd.s
$(AS) $(ASARGS) -o $(BINDIR)/lsd $(OTHERSRC)/pblsd.s
$(BINDIR)/altls: $(ALTSRC)/wktls.s
$(AS) $(ASARGS) -o $(BINDIR)/altls $(ALTSRC)/wktls.s
$(BINDIR)/lsd: $(OTHERSRC)/pblsd.s
$(AS) $(ASARGS) -o $(BINDIR)/lsd $(OTHERSRC)/pblsd.s
$(BINDIR)/mv: $(OTHERSRC)/wktmv.s
$(AS) $(ASARGS) -o $(BINDIR)/mv $(OTHERSRC)/wktmv.s

View File

@@ -36,6 +36,8 @@ dd drwr- -1 4
init frwr- -1 bin/init
ln frwr- -1 bin/ln
ls frwr- -1 bin/ls
lsd frwr- -1 bin/lsd
lsl frwr- -1 bin/lsd
od frwr- -1 bin/od
mv frwr- -1 bin/mv
password frw-- -1 fs/password

267
src/other/pblsd.s Normal file
View File

@@ -0,0 +1,267 @@
" "lsd" -- phil's (minimal) "ls directory"
" for UNIX-7 without "." links (requires a dirname argument)
" adapted from warren's "historic version of ls"
" Usage: lsd dirname
" lsl dirname
"
" with "lsl" displays long listing:
" inum [dcl-][r-][w-][r-][w-] nlink uid size name
" with numbers in octal
argptr=017777 " pointer to argc, argv
argc=argptr i
main:
lac argptr " get pointer to argc, names
tad d2 " point to second word of command name
dac nextarg
lac nextarg i " fetch it
dac longopt " save (for long check)
-4 " check for second arg
tad argc
spa
jmp nodir " no second arg
lac nextarg
tad d3 " skip rest of argv[0]
dac dirname " save for dir status
dac dirname2 " save for dir open
dac dirname3 " save for file status
lac statbufptr " stat the dir
sys status; dd; dirname: 0
spa
jmp error
lac s.flags
and dirflg " get dir bit
sna " a directory?
jmp error " no: not a dir
sys chdir; dd " chdir to "dd" so we can open directory
spa
jmp error
sys open; dirname2:0; 0 " open the directory
spa
jmp error
dac dirfd " save the fd
" loop reading blocks from directory file
blkloop:
lac dirfd; sys read; dbuf; 64 " read block from directory
spa sna " OK?
jmp fileend " no: EOF or error
dac dcount " save word count
lac idirptr " reset dirptr
dac dirptr
" loop reading 8-word directory entries:
" word 0 is i-number, words 1-4 are the file name
dentloop:
lac dirptr i " get i-number
sna " i-num non-zero (in use)?
jmp nextdent " no, skip to the next directory entry
lac lbufp " get line buffer pointer
dac 8 " save in index register
lac longopt
sad deesp " short output?
jmp prname " yes: just print name
" long output: "stat(us)" the file:
lac dirptr " get pointer to name
tad d1
dac fname " save for status call
lac statbufptr " stat the file
sys status; dirname3: 0; fname: 0
spa
jms fileend " exit if the status call fails
lac s.inum; jms octal; -5 " format i-number
" loop for file types: output one char or dash
law types-1
dac 9
lac mntypes
dac c
tloop:
lac s.flags " get mode bits
and 9 i " check bit
sna
jmp 1f " not set
lac 9 i " bit set: get char
jmp foundtype
1: isz 9 " skip char
isz c " more bits?
jmp tloop " yes, loop and check
lac dash " no type found ("small" file) output '-'
foundtype:
dac 8 i " save in buffer
" loop for permission bits. for each bit, output either char or dash
law perms-1
dac 9
lac mnperms
dac c
ploop:
lac s.flags " get flags
and 9 i " bit set?
sna
jmp 1f " no: output dash
lac 9 i " yes: get char
jmp 2f
1: lac dash
isz 9 " skip char
2: dac 8 i " put char or dash in buffer
isz c " more bits?
jmp ploop " yes, loop
putsp:
lac o40 " put space
dac 8 i
lac s.nlks " format link count
cma " negate
tad d1
jms octal; -2
lac s.uid " format owner
jms octal; -3
lac s.size " format size
jms octal; -5
prname:
lac dirptr " get pointer to "dnode" (one before name)
dac 9
-4 " get word count
dac c " in c
1: lac 9 i " copy name
dac 8 i
isz c
jmp 1b
lac o12 " add newline
dac 8 i
wr: " breakpoint
lac lbufp " negate starting pointer
cma
tad d1
tad 8 " add ending pointer
dac 1f
lac d1; sys write; lbuf; 1: 0 " output line
nextdent:
lac dirptr " advance to next "dnode"
tad d8
dac dirptr
-8
tad dcount " Decrement the count of words in the buffer by 8
dac dcount
sza " Anything left in the buffer?
jmp dentloop " yes: keep going
jmp blkloop " no: try reading some more
fileend:
nop
lac dirfd
sys close " close dir fd
sys exit
" octal print from ds.s
octal: 0
lmq " get number to print in MQ
lac d5 " get octal "digits" (oits) to lose:
tad octal i " 5-oits
cma " get -(6-oits)
dac c " save as loop count
1: llss 3 " Lose top 3 bits of the MQ
isz c " nothing left to lose?
jmp 1b " no: lose some more
lac octal i " get negative oit count
dac c " save as loop count
1: cla " clear AC
llss 3 " slide an oit's worth up into AC
tad o60 " make ASCII
dac 8 i " output
isz c " more?
jmp 1b " yes, loop
lac o40 " output space
dac 8 i
isz octal " skip the oits argument
jmp octal i " and return
nodir:
lac d1; sys write; nodirs; 5
sys exit
error:
lac dirname
dac 1f
lac d1; sys write; 1:0; 4 " Write out the bad dirname
lac d1; sys write; qnl; 1 " write ? NL
sys exit
" constants
nodirs: <di>; <r 040; <na>; <me>
qnl: <? 012
" file type bits, each followed by character to tag with
types:
dirflg:020; 0144 " directory: d
o40:040; 0143 " character device: c
0200000; 0154 " large file: l
mntypes: -3 " negative number of types
perms:
d8:000010; 0162 " user read: r
000004; 0167 " user write: w
d2:000002; 0162 " other read: r
d1:000001; 0167 " other write: w
mnperms: -4 " minus number of perms
d3: 3
d5: 5
d7: 7
o12: 012
dash: 055
o60: 060
dd: <dd>; 040040; 040040; 040040
deesp: <d 040
idirptr: dbuf " Constant pointer to the directory buffer
statbufptr: statbuf " Pointer to the statbuf
lbufp: lbuf-1 " initial index pointer to line buf
" variables
longopt: 0 " User set the -l option when this is 1
nextarg: .=.+1 " Pointer to the next argument
dirptr: .=.+1 " Pointer into dirbuf
dirfd: .=.+1 " File descriptor for the directory
dcount: .=.+1 " Count of words left in dbut
c: .=.+1 " loop counter
dbuf: .=.+64 " Directory buffer
statbuf: " status buffer:
s.flags: .=.+1 " type/permission bits
s.dskps: .=.+7 " block numbers
s.uid: .=.+1
s.nlks: .=.+1 " negative count of links
s.size: .=.+1 " size in words
s.uniq: .=.+1
s.inum: .=.+1 " i-number: not in inode!
lbuf: " buffer a line of output (using location 8 as index)