mirror of
https://github.com/DoctorWkt/pdp7-unix.git
synced 2026-04-29 13:22:14 +00:00
364 lines
6.8 KiB
ArmAsm
364 lines
6.8 KiB
ArmAsm
"** 01-s1.pdf page 34
|
|
" s6
|
|
|
|
itrunc: 0
|
|
-7 " loop 7 times
|
|
dac 9f+t " in t0
|
|
lac idskpp " pointer to inode block numbers
|
|
dac 9f+t+1 " save in t1
|
|
1: " top of loop for inode blocks
|
|
lac 9f+t+1 i " fetch next block number
|
|
sna " allocated?
|
|
jmp 4f " no
|
|
lac i.flags " check flags
|
|
and o200000
|
|
sna " large file?
|
|
jmp 3f " no
|
|
-64 " loop 64 times
|
|
dac 9f+t+2 " save count in t2
|
|
lac dskbufp " get pointer to dskbuf
|
|
dac 9f+t+3 " in t3
|
|
2: " inner loop for indirect blocks
|
|
lac 9f+t+1 i " get indirect block number
|
|
jms dskrd " read it
|
|
lac 9f+t+3 i " read block number from indirect
|
|
sza " free?
|
|
jms free " no: free it
|
|
isz 9f+t+3 " increment pointer into indirect block
|
|
isz 9f+t+2 " increment loop counter, skip if done
|
|
jmp 2b " not done: loop
|
|
3: " here with small file
|
|
lac 9f+t+1 i " load block number
|
|
jms free " free it
|
|
dzm 9f+t+1 i " clear block number
|
|
4: " bottom of loop for inode block ptrs
|
|
isz 9f+t+1 " increment block pointer
|
|
isz 9f+t " increment count, skip if done
|
|
jmp 1b " not done
|
|
lac i.flags
|
|
and o577777 " clear large file flag
|
|
dac i.flags
|
|
jmp itrunc i
|
|
t = t+4
|
|
|
|
namei: 0
|
|
jms iget
|
|
-1
|
|
tad namei i
|
|
dac 9f+t+1
|
|
isz namei
|
|
lac i.flags
|
|
and o20
|
|
sna
|
|
jmp namei i
|
|
-8
|
|
tad i.size
|
|
cma
|
|
lrss 3
|
|
dac 9f+t
|
|
sna
|
|
jmp namei i
|
|
dzm di
|
|
1:
|
|
lac di
|
|
|
|
"** 01-s1.pdf page 35
|
|
|
|
jms dget
|
|
lac d.i
|
|
sna
|
|
jmp 2f
|
|
lac 9f+t+1
|
|
dac 8
|
|
lac d.name
|
|
sad 8 i
|
|
skp
|
|
jmp 2f
|
|
lac d.name+1
|
|
sad 8 i
|
|
skp
|
|
jmp 2f
|
|
lac d.name+2
|
|
sad 8 i
|
|
skp
|
|
jmp 2f
|
|
lac d.name+3
|
|
sad 8 i
|
|
skp
|
|
jmp 2f
|
|
lac d.i
|
|
isz namei
|
|
jmp namei i
|
|
2:
|
|
isz di
|
|
isz 9f+t
|
|
jmp 1b
|
|
jmp namei i
|
|
t = t+2
|
|
|
|
iget: 0
|
|
dac ii
|
|
cll; idiv; 5
|
|
dac 9f+t
|
|
lacq
|
|
tad d2
|
|
dac 9f+t+1
|
|
jms dskrd
|
|
lac 9f+t
|
|
cll; mul; 12
|
|
lacq
|
|
tad dskbufp
|
|
dac 9f+t
|
|
dac .+2
|
|
jms copy; ..; inode; 12
|
|
jmp iget i
|
|
|
|
iput: 0
|
|
lac 9f+t+1
|
|
jms dskrd
|
|
law inode-1
|
|
dac 8
|
|
-1
|
|
tad 9f+t
|
|
dac 9
|
|
-12
|
|
dac 9f+t+2
|
|
1:
|
|
lac 8 i
|
|
|
|
"** 01-s1.pdf page 36
|
|
|
|
sad 9 i
|
|
skp
|
|
jmp 2f
|
|
isz 9f+t+2
|
|
jmp 1b
|
|
jmp iput i
|
|
2:
|
|
-1
|
|
tad 8
|
|
dac 8
|
|
-1
|
|
tad 9
|
|
dac 9
|
|
1:
|
|
lac 8 i
|
|
dac 9 i
|
|
isz 9f+t+2
|
|
jmp 1b
|
|
lac 9f+t+1
|
|
jms dskwr
|
|
jmp iput i
|
|
t = t+3
|
|
|
|
dget: 0
|
|
dac di
|
|
alss 3
|
|
dac 9f+t
|
|
jms pget
|
|
dac 9f+t+1
|
|
jms dskrd
|
|
lac 9f+t
|
|
and o77
|
|
tad dskbufp
|
|
dac 9f+t+2
|
|
dac .+2
|
|
jms copy; ..; dnode; 8
|
|
lac 9f+t
|
|
tad d8
|
|
jms betwen; d0; i.size
|
|
skp
|
|
jmp dget i
|
|
jms dacisize
|
|
dzm d.i
|
|
jmp dget i
|
|
|
|
dput: 0
|
|
lac 9f+t+1
|
|
jms dskrd
|
|
lac 9f+t+2
|
|
dac .+3
|
|
jms copy; dnode; ..; 8
|
|
lac 9f+t+1
|
|
jms dskwr
|
|
jmp dput i
|
|
|
|
t = t+3
|
|
|
|
" allocate a block for a file, returns disk block number
|
|
" AC/ file offset
|
|
" jms pget
|
|
" AC/ disk block number
|
|
pget: 0
|
|
lrss 6 " convert offset to block
|
|
dac 9f+t " save as t0
|
|
lac i.flags
|
|
|
|
"** 01-s1.pdf page 37
|
|
|
|
and o200000
|
|
sza " large file bit set?
|
|
jmp 2f " yes
|
|
lac 9f+t " no: small file
|
|
jms betwen; d0; d6 " block 0..6?
|
|
jmp 1f " no
|
|
tad idskpp " make into block number pointer
|
|
dac 9f+t " save in t0
|
|
lac 9f+t i " get disk block number
|
|
sna " allocated?
|
|
jms alloc " no: allocate now
|
|
dac 9f+t i " save (new) disk block number
|
|
jmp pget i " return disk block number
|
|
1: " here when file block>=7, not "large"
|
|
jms alloc " allocate indirect block
|
|
dac 9f+t+1 " save as t1
|
|
jms copy; i.dskps; dskbuf; 7 " copy all the disk block numbers
|
|
jms copyz; dskbuf+7; 64-7 " zero rest of indirect block
|
|
lac 9f+t+1 " get indirect block number back
|
|
jms dskwr " write indirect block to disk
|
|
lac 9f+t+1
|
|
dac i.dskps " save indirect as new first block
|
|
jms copyz; i.dskps+1; 6 " zero rest of block pointers
|
|
lac i.flags
|
|
xor o200000 " set "large file"
|
|
dac i.flags
|
|
2: " here with "large file"
|
|
lac 9f+t " get file block number
|
|
lrss 6 " divide by 64 (indirects/block)
|
|
jms betwen; d0; d6 " ok now?
|
|
jms halt " file too big " no, you lose!
|
|
tad idskpp " yes: get indirect block pointer
|
|
dac 9f+t+1 " save in t1
|
|
lac 9f+t+1 i " get indirect block number
|
|
sna " allocated?
|
|
jms alloc " no, get it now
|
|
dac 9f+t+1 i " save (new) indirect block
|
|
dac 9f+t+2 " save as t2
|
|
jms dskrd " read indirect block
|
|
lac 9f+t " get original block number
|
|
and o77 " mod by 64
|
|
tad dskbufp " get pointer to disk block number
|
|
dac 9f+t+1 " save as t1
|
|
lac 9f+t+1 i " fetch disk block number
|
|
sza " allocated?
|
|
jmp pget i " yes: return
|
|
jms alloc " no: allocate data block
|
|
dac 9f+t " save as t0
|
|
lac 9f+t+2 " get indirect block number
|
|
jms dskrd " read it in
|
|
lac 9f+t " get data block number
|
|
dac 9f+t+1 i " save data block number
|
|
lac 9f+t+2
|
|
jms dskwr " write indirect block back
|
|
lac 9f+t " get data block back
|
|
jmp pget i " return it
|
|
t = t+3
|
|
|
|
iwrite: 0
|
|
dac 9f+t " save arg in t0
|
|
lac iwrite " load return address
|
|
|
|
"** 01-s1.pdf page 38
|
|
|
|
dac iread " save as iread return addr
|
|
lac cskp " load skip instruction
|
|
dac iwrite " save as iwrite instruction
|
|
jmp 1f
|
|
|
|
" iread from file referenced by loaded inode
|
|
" AC/ file offset
|
|
" jms iread; addr; count
|
|
iread: 0
|
|
dac 9f+t " save offset in t0
|
|
lac cnop " get nop
|
|
dac iwrite " save as iwrite instruction
|
|
1:
|
|
-1
|
|
tad iread i " get word before return addr
|
|
dac 10 " store in index 10 & 11
|
|
dac 11
|
|
isz iread " increment return addr
|
|
lac iread i " load addr
|
|
dac 9f+t+1 " save in t1
|
|
isz iread " increment return addr
|
|
lac o70000
|
|
xct iwrite " skip if write
|
|
lac i.size " read: get file size
|
|
cma
|
|
tad 9f+t " add offset
|
|
cma
|
|
jms betwen; d0; 9f+t+1
|
|
lac 9f+t+1
|
|
dac 9f+t+2
|
|
cma
|
|
tad d1
|
|
sna
|
|
jmp iread i
|
|
dac 9f+t+1
|
|
1:
|
|
lac 9f+t
|
|
jms pget
|
|
dac 9f+t+3
|
|
jms dskrd
|
|
lac 9f+t
|
|
and o77
|
|
tad dskbufp
|
|
tad dm1
|
|
xct iwrite
|
|
jmp .+3
|
|
dac 10
|
|
cskp:
|
|
skp
|
|
dac 11
|
|
2:
|
|
lac 11 i
|
|
dac 10 i
|
|
isz 9f+t
|
|
isz 9f+t+1
|
|
jmp 3f
|
|
xct iwrite
|
|
jmp 4f
|
|
lac 9f+t
|
|
jms betwen; d0; i.size
|
|
dac i.size
|
|
lac 9f+t+3
|
|
jms dskwr
|
|
4:
|
|
"** 01-s1.pdf page 38
|
|
lac 9f+t+2
|
|
jmp iread i
|
|
3:
|
|
lac 9f+t
|
|
and o77
|
|
sza
|
|
jmp 2b
|
|
xct iwrite
|
|
jmp 1b
|
|
lac 9f+t+3
|
|
jms dskwr
|
|
jmp 1b
|
|
t = t+4
|
|
|
|
" system call helper
|
|
" AC/ fd
|
|
" jms finac
|
|
" return with: fnode and inode loaded
|
|
" or makes error return to user
|
|
finac: 0
|
|
lac u.ac
|
|
jms fget
|
|
jms error
|
|
lac f.flags
|
|
sma
|
|
jms error
|
|
lac f.i
|
|
jms iget
|
|
jmp finac i
|
|
|
|
" update inode file size with value in AC
|
|
dacisize: 0
|
|
dac i.size
|
|
jms iput
|
|
lac i.size
|
|
jmp dacisize i
|