This commit is contained in:
Warren Toomey
2016-03-03 09:52:40 +10:00
2 changed files with 80 additions and 70 deletions
+23 -17
View File
@@ -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
View File
@@ -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