Merge pull request #20 from philbudne/master
kernel comments: betwen and pget
This commit is contained in:
+23
-17
@@ -63,27 +63,33 @@ laci: 0
|
|||||||
|
|
||||||
"** 01-s1.pdf page 22
|
"** 01-s1.pdf page 22
|
||||||
|
|
||||||
|
" skip if AC between two values (inclusive)
|
||||||
|
" jms betwen; low_ptr; high_ptr
|
||||||
|
" <not between>
|
||||||
|
" <between>
|
||||||
|
" listing has an alternate written in
|
||||||
|
" (which would require 'lac ptr' instead of 'ptr' args?)
|
||||||
betwen: 0
|
betwen: 0
|
||||||
lmq cmq
|
lmq cmq " get ~AC in MQ
|
||||||
lac betwen i
|
lac betwen i " get low_ptr
|
||||||
dac 9f+t
|
dac 9f+t
|
||||||
isz betwen
|
isz betwen " skip low_ptr
|
||||||
lacq
|
lacq " get ~AC (-AC-1) from MQ
|
||||||
tad 9f+t i
|
tad 9f+t i " get low-AC-1
|
||||||
sma
|
sma " negative (AC >= low)?
|
||||||
jmp 1f
|
jmp 1f " no, return w/o skip
|
||||||
lac betwen i
|
lac betwen i " fetch high_ptr
|
||||||
dac 9f+t
|
dac 9f+t
|
||||||
isz betwen
|
isz betwen " skip high_ptr
|
||||||
lacq
|
lacq " get -AC-1
|
||||||
tad 9f+t i
|
tad 9f+t i " add to high value (high-AC-1)
|
||||||
cma
|
cma " complement (AC-high)
|
||||||
spa sna
|
spa sna " AC-high <= 0?
|
||||||
1:
|
1:
|
||||||
isz betwen
|
isz betwen " no: give happy return
|
||||||
lacq
|
lacq " restore ~AC
|
||||||
cma
|
cma " restore AC
|
||||||
jmp betwen i
|
jmp betwen i " return w/o skip
|
||||||
|
|
||||||
copy: 0
|
copy: 0
|
||||||
-1
|
-1
|
||||||
|
|||||||
+57
-53
@@ -185,69 +185,73 @@ dput: 0
|
|||||||
|
|
||||||
t = t+3
|
t = t+3
|
||||||
|
|
||||||
|
" allocate a block for a file, returns disk block number
|
||||||
|
" AC/ file offset
|
||||||
|
" jms pget
|
||||||
|
" AC/ disk block number
|
||||||
pget: 0
|
pget: 0
|
||||||
lrss 6
|
lrss 6 " convert offset to block
|
||||||
dac 9f+t
|
dac 9f+t " save as t0
|
||||||
lac i.flags
|
lac i.flags
|
||||||
|
|
||||||
"** 01-s1.pdf page 37
|
"** 01-s1.pdf page 37
|
||||||
|
|
||||||
and o200000
|
and o200000
|
||||||
sza
|
sza " large file bit set?
|
||||||
jmp 2f
|
jmp 2f " yes
|
||||||
lac 9f+t
|
lac 9f+t " no: small file
|
||||||
jms betwen; d0; d6
|
jms betwen; d0; d6 " block 0..6?
|
||||||
jmp 1f
|
jmp 1f " no
|
||||||
tad idskpp
|
tad idskpp " make into block number pointer
|
||||||
dac 9f+t
|
dac 9f+t " save in t0
|
||||||
lac 9f+t i
|
lac 9f+t i " get disk block number
|
||||||
sna
|
sna " allocated?
|
||||||
jms alloc
|
jms alloc " no: allocate now
|
||||||
dac 9f+t i
|
dac 9f+t i " save (new) disk block number
|
||||||
jmp pget i
|
jmp pget i " return disk block number
|
||||||
1:
|
1: " here when file block>=7, not "large"
|
||||||
jms alloc
|
jms alloc " allocate indirect block
|
||||||
dac 9f+t+1
|
dac 9f+t+1 " save as t1
|
||||||
jms copy; i.dskps; dskbuf; 7
|
jms copy; i.dskps; dskbuf; 7 " copy all the disk block numbers
|
||||||
jms copyz; dskbuf+7; 64-7
|
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
|
lac 9f+t+1
|
||||||
jms dskwr
|
dac i.dskps " save indirect as new first block
|
||||||
lac 9f+t+1
|
jms copyz; i.dskps+1; 6 " zero rest of block pointers
|
||||||
dac i.dskps
|
|
||||||
jms copyz; i.dskps+1; 6
|
|
||||||
lac i.flags
|
lac i.flags
|
||||||
xor o200000
|
xor o200000 " set "large file"
|
||||||
dac i.flags
|
dac i.flags
|
||||||
2:
|
2: " here with "large file"
|
||||||
lac 9f+t
|
lac 9f+t " get file block number
|
||||||
lrss 6
|
lrss 6 " divide by 64 (indirects/block)
|
||||||
jms betwen; d0; d6
|
jms betwen; d0; d6 " ok now?
|
||||||
jms halt " file too big
|
jms halt " file too big " no, you lose!
|
||||||
tad idskpp
|
tad idskpp " yes: get indirect block pointer
|
||||||
dac 9f+t+1
|
dac 9f+t+1 " save in t1
|
||||||
lac 9f+t+1 i
|
lac 9f+t+1 i " get indirect block number
|
||||||
sna
|
sna " allocated?
|
||||||
jms alloc
|
jms alloc " no, get it now
|
||||||
dac 9f+t+1 i
|
dac 9f+t+1 i " save (new) indirect block
|
||||||
dac 9f+t+2
|
dac 9f+t+2 " save as t2
|
||||||
jms dskrd
|
jms dskrd " read indirect block
|
||||||
lac 9f+t
|
lac 9f+t " get original block number
|
||||||
and o77
|
and o77 " mod by 64
|
||||||
tad dskbufp
|
tad dskbufp " get pointer to disk block number
|
||||||
dac 9f+t+1
|
dac 9f+t+1 " save as t1
|
||||||
lac 9f+t+1 i
|
lac 9f+t+1 i " fetch disk block number
|
||||||
sza
|
sza " allocated?
|
||||||
jmp pget i
|
jmp pget i " yes: return
|
||||||
jms alloc
|
jms alloc " no: allocate data block
|
||||||
dac 9f+t
|
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
|
lac 9f+t+2
|
||||||
jms dskrd
|
jms dskwr " write indirect block back
|
||||||
lac 9f+t
|
lac 9f+t " get data block back
|
||||||
dac 9f+t+1 i
|
jmp pget i " return it
|
||||||
lac 9f+t+2
|
|
||||||
jms dskwr
|
|
||||||
lac 9f+t
|
|
||||||
jmp pget i
|
|
||||||
t = t+3
|
t = t+3
|
||||||
|
|
||||||
iwrite: 0
|
iwrite: 0
|
||||||
|
|||||||
Reference in New Issue
Block a user