improved 32-bit (well, smartport is 24-bit) block support

This commit is contained in:
Kelvin Sherlock 2021-08-11 22:10:11 -04:00
parent 7fc041289f
commit 44a6544242
2 changed files with 132 additions and 43 deletions

View File

@ -68,7 +68,7 @@ blockNumber ds.b 2
buffer equ $2000
entry read_block, read_block_abs, read_extent_block
entry read_block_abs, read_extent_block
entry vector
entry extent_to_extent
@ -151,6 +151,7 @@ ok
lda #buffer
sta pro.dataBuffer
endif
ldx #0
lda #2
jsr read_block_abs
@ -350,8 +351,8 @@ blockNumber dc.l 1 ; actually 24-bit
endif
read_block proc
entry read_block_abs
read_block_abs proc
entry read_block_abs_long
entry vector
; input
@ -359,17 +360,19 @@ read_block proc
; will be adjusted for allocation block offset
;
with zp
clc
adc startingBlock
; clc
; adc startingBlock
read_block_abs
;read_block_abs
if __smartport__ then
sta sp.blockNumber
stx sp.blockNumber+2
else
sta pro.blockNumber
endif
read_block_abs_long
php
sec
xce
@ -387,36 +390,61 @@ vector dc.w $ffff
@fail brk $ea
endp
macro
ifcs &p1,&p2
bcc @0
&p1 &p2
@0
mend
read_extent_block proc
; a = block #
; This doesn't check beyond the 3rd extent
with zp,ExtendedExtent
import read_block_abs_long
; TODO - not yet 32-bit clean.
with zp,ExtendedExtent
@0
cmp extents+(sizeof*0)+blockCount
bcs @1
; clc
adc extents+(sizeof*0)+startBlock
bra read_block
ldx #sizeof*0+startBlock
bra found
@1 sbc extents+(sizeof*0)+blockCount
cmp extents+(sizeof*1)+blockCount
bcs @2
; clc
adc extents+(sizeof*1)+startBlock
bra read_block
ldx #sizeof*1+startBlock
bra found
@2 sbc extents+(sizeof*1)+blockCount
cmp extents+(sizeof*2)+blockCount
bcs @3
adc extents+(sizeof*2)+startBlock
bra read_block
ldx #sizeof*2+startBlock
bra found
@3 brk $ea
found ;
clc
adc extents,x
sta sp.blockNumber
lda #0
adc extents+2,x
sta sp.blockNumber+2
clc
lda startingBlock
adc sp.blockNumber
sta sp.blockNumber
lda #0
adc sp.blockNumber+2
sta sp.blockNumber+2
bra read_block_abs_long
endp
@ -457,7 +485,8 @@ rts rts
extent_to_extent proc
; y = offset into buffer.
; clobbers x, y
with zp
with zp,ExtendedExtent
import multiply
ldx #0
@ -472,15 +501,15 @@ loop1
inx
inx
inx
cpx #3*4*2
cpx #sizeof*3
blt loop1
; now multiply...
lda blockMultiplier
dec a
beq rts
beq offset
ldx #3*4*2-4
ldx #sizeof*3-4
loop2
lda blockMultiplier
sta m1
@ -500,7 +529,35 @@ loop2
bpl loop2
rts rts
offset
if 0 then
; now add the block offset to the starting block.
lda startingBlock
clc
adc extents+(ExtendedExtent.sizeof*0)+startBlock
sta extents+(ExtendedExtent.sizeof*0)+startBlock
lda #0
adc extents+(ExtendedExtent.sizeof*0)+startBlock+2
sta extents+(ExtendedExtent.sizeof*0)+startBlock+2
lda startingBlock
clc
adc extents+(ExtendedExtent.sizeof*1)+startBlock
sta extents+(ExtendedExtent.sizeof*1)+startBlock
lda #0
adc extents+(ExtendedExtent.sizeof*1)+startBlock+2
sta extents+(ExtendedExtent.sizeof*1)+startBlock+2
lda startingBlock
clc
adc extents+(ExtendedExtent.sizeof*2)+startBlock
sta extents+(ExtendedExtent.sizeof*2)+startBlock
lda #0
adc extents+(ExtendedExtent.sizeof*2)+startBlock+2
sta extents+(ExtendedExtent.sizeof*2)+startBlock+2
endif
rts
endp

View File

@ -85,7 +85,7 @@ blockNumber ds.b 2
endif
entry read_block, read_block_abs
entry read_block_abs, read_block_abs_long
entry prepare_path, cat_lookup
entry read_cat_block, read_file_block
entry extent_to_extent
@ -181,6 +181,7 @@ getbootname proc
sta pro.dataBuffer
endif
lda #2
ldx #0
jsr read_block_abs
; restore the stack. does not affect a/carry
@ -518,33 +519,50 @@ read_file_block proc
cmp file_extents+(sizeof*0)+blockCount
bcs @1
; clc
adc file_extents+(sizeof*0)+startBlock
bra read_block
ldx #sizeof*0+startBlock
bra found
@1 sbc file_extents+(sizeof*0)+blockCount
cmp file_extents+(sizeof*1)+blockCount
bcs @2
; clc
adc file_extents+(sizeof*1)+startBlock
bra read_block
ldx #sizeof*1+startBlock
bra found
@2 sbc file_extents+(sizeof*1)+blockCount
cmp file_extents+(sizeof*2)+blockCount
bcs @3
adc file_extents+(sizeof*2)+startBlock
bra read_block
ldx #sizeof*2+startBlock
bra found
@3
lda #outOfRange ; too big
sec
rts
found ;
clc
adc file_extents,x
sta sp.blockNumber
lda #0
adc file_extents+2,x
sta sp.blockNumber+2
clc
lda startingBlock
adc sp.blockNumber
sta sp.blockNumber
lda #0
adc sp.blockNumber+2
sta sp.blockNumber+2
bra read_block_abs_long
endp
read_cat_block proc
; a = block #
; TODO - not 32-bit clean yet.
with data,ExtendedExtent
@ -552,52 +570,68 @@ read_cat_block proc
cmp cat_extents+(sizeof*0)+blockCount
bcs @1
; clc
adc cat_extents+(sizeof*0)+startBlock
bra read_block
ldx #sizeof*0+startBlock
bra found
@1 sbc cat_extents+(sizeof*0)+blockCount
cmp cat_extents+(sizeof*1)+blockCount
bcs @2
; clc
adc cat_extents+(sizeof*1)+startBlock
bra read_block
ldx #sizeof*1+startBlock
bra found
@2 sbc cat_extents+(sizeof*1)+blockCount
cmp cat_extents+(sizeof*2)+blockCount
bcs @3
adc cat_extents+(sizeof*2)+startBlock
bra read_block
ldx #sizeof*2+startBlock
bra found
@3
lda #outOfRange ; too big
sec
rts
found ;
clc
adc cat_extents,x
sta sp.blockNumber
lda #0
adc cat_extents+2,x
sta sp.blockNumber+2
clc
lda startingBlock
adc sp.blockNumber
sta sp.blockNumber
lda #0
adc sp.blockNumber+2
sta sp.blockNumber+2
bra read_block_abs_long
endp
read_block proc
entry read_block_abs
read_block_abs proc
entry read_block_abs_long
entry vector
; input
; a = hfs block #
; will be adjusted for allocation block offset
;
clc
adc data.startingBlock
read_block_abs
; clc
; adc data.startingBlock
if __smartport__ then
sta sp.blockNumber
stx sp.blockNumber+2
else
sta pro.blockNumber
endif
read_block_abs_long
php
sec
xce
@ -623,8 +657,6 @@ vector dc.w $ffff
sec
rts
_stack ds.w 1
endp
@ -1031,6 +1063,7 @@ startup proc
with HFSMasterDirectoryBlock
lda #2
ldx #0
jsr read_block_abs
; shouldn't fail.
lda buffer+drAlBlSt
@ -1058,7 +1091,6 @@ startup proc
; find the root node.
lda #0
ldx #0
jsr read_cat_block
with BTHeaderRec