convert the extent blocks into 32-bit absolute blocks when loading.

Currently the block comparisons are still 16-bit, though.
This commit is contained in:
Kelvin Sherlock 2021-08-04 23:49:15 -04:00
parent 0fabe65aca
commit 7fc041289f
2 changed files with 201 additions and 91 deletions

View File

@ -65,9 +65,7 @@ blockNumber ds.b 2
endif endif
data record $2000 buffer equ $2000
ds.b 512
endr
entry read_block, read_block_abs, read_extent_block entry read_block, read_block_abs, read_extent_block
@ -150,7 +148,7 @@ ok
stz count stz count
if not __smartport__ then if not __smartport__ then
lda #data lda #buffer
sta pro.dataBuffer sta pro.dataBuffer
endif endif
lda #2 lda #2
@ -171,23 +169,23 @@ ok
; ;
; ;
with HFSMasterDirectoryBlock with HFSMasterDirectoryBlock
lda data+drAlBlSt lda buffer+drAlBlSt
xba xba
sta startingBlock sta startingBlock
; drAlBlkSiz is actually a 32-bit number. ; drAlBlkSiz is actually a 32-bit number.
; ;
; lda data+drAlBlkSiz+2 ; lda buffer+drAlBlkSiz+2
; xba ; xba
; sta drAlBlkSiz ; sta drAlBlkSiz
; xba ; xba
lda data+drAlBlkSiz+1 lda buffer+drAlBlkSiz+1
xba xba
lsr a ; / 2 lsr a ; / 2
sta blockMultiplier ; 0 = 512 byte blocks, 1 = sta blockMultiplier ; 0 = 512 byte blocks, 1 =
; ldx #3*HFSExtentDescriptor.sizeof-2 ; ldx #3*HFSExtentDescriptor.sizeof-2
;@cloop lda data+drCTExtRec,x ;@cloop lda buffer+drCTExtRec,x
; xba ; xba
; sta extents,x ; sta extents,x
; dex ; dex
@ -211,10 +209,10 @@ ok
; block should be a btree header block. find the first leaf node. ; block should be a btree header block. find the first leaf node.
; ;
with BTHeaderRec with BTHeaderRec
; lda data+BTNodeDescriptor.sizeof+firstLeafNode ; lda buffer+BTNodeDescriptor.sizeof+firstLeafNode
; xba ; xba
; sta leaf+2 ; sta leaf+2
lda data+BTNodeDescriptor.sizeof+firstLeafNode+2 lda buffer+BTNodeDescriptor.sizeof+firstLeafNode+2
xba xba
; sta bnum ; sta bnum
@ -224,7 +222,7 @@ ok
; ;
jsr read_extent_block jsr read_extent_block
lda data+BTNodeDescriptor.numRecords ; # of records lda buffer+BTNodeDescriptor.numRecords ; # of records
beq advance beq advance
xba xba
@ -233,19 +231,19 @@ ok
again again
ldx #512-2 ; last entry ldx #512-2 ; last entry
@loop @loop
lda data,x ; entry offset lda buffer,x ; entry offset
xba xba
tay tay
lda data+HFSCatalogKey.parentID,y ; parent id lda buffer+HFSCatalogKey.parentID,y ; parent id
bne notfound bne notfound
lda data+HFSCatalogKey.parentID+2,y lda buffer+HFSCatalogKey.parentID+2,y
xba xba
cmp #2 cmp #2
blt @next blt @next
beq @name beq @name
bge notfound bge notfound
@name ; name is a p-string. @name ; name is a p-string.
lda data+HFSCatalogKey.nodeName,y lda buffer+HFSCatalogKey.nodeName,y
cmp #$2101 ; pstr ! cmp #$2101 ; pstr !
beq found beq found
bge notfound bge notfound
@ -255,7 +253,7 @@ again
dec count dec count
bne @loop bne @loop
advance ; next block! advance ; next block!
lda data+BTNodeDescriptor.fLink+2 lda buffer+BTNodeDescriptor.fLink+2
beq notfound beq notfound
xba xba
jsr read_extent_block jsr read_extent_block
@ -274,12 +272,12 @@ found
; assume < 65535 bytes :) ; assume < 65535 bytes :)
with HFSCatalogFile with HFSCatalogFile
lda data+8+recordType,y lda buffer+8+recordType,y
and #$00ff and #$00ff
cmp #kHFSFileRecord cmp #kHFSFileRecord
bne notfound bne notfound
lda data+8+dataPhysicalSize+2,y lda buffer+8+dataPhysicalSize+2,y
; xba ; xba
lsr a ; >>9 since already xba lsr a ; >>9 since already xba
and #%01111111 and #%01111111
@ -287,10 +285,10 @@ found
sta count sta count
; todo -- all extents... ; todo -- all extents...
; lda data+8+dataExtents,y ; lda buffer+8+dataExtents,y
; xba ; xba
; sta extents ; sta extents
; lda data+8+dataExtents+2,y ; lda buffer+8+dataExtents+2,y
; xba ; xba
; sta extents+2 ; sta extents+2
@ -457,14 +455,14 @@ rts rts
endp endp
extent_to_extent proc extent_to_extent proc
; y = offset into data. ; y = offset into buffer.
; clobbers x, y ; clobbers x, y
with zp with zp
import multiply import multiply
ldx #0 ldx #0
loop1 loop1
lda data,y lda buffer,y
xba xba
sta extents,x sta extents,x
stz extents+2,x stz extents+2,x

View File

@ -23,9 +23,19 @@ __smartport__ set 1
include 'smartport.aii' include 'smartport.aii'
endif endif
;
; 32-bit version large volumes.
ExtendedExtent RECORD 0
startBlock ds.l 1 ; offset: $0 (0) ; first allocation block
blockCount ds.l 1 ; offset: $4 (8) ; number of allocation blocks
sizeof EQU * ; size: $8 (8)
ENDR
buffer equ $3000 buffer equ $3000
dp record 0 zp record 0
ptr ds.l 1 ptr ds.l 1
path ds.l 1 path ds.l 1
@ -43,6 +53,22 @@ at ds.w 1
st ds.w 1 st ds.w 1
file_id ds.l 1 file_id ds.l 1
extents ds.b 3*ExtendedExtent.sizeof
; multiplication stuff
m1 ds.w 1
m2 ds.l 1
m3 ds.l 1
; too much zp space...
if not __smartport__ and * >= $42 then
aerror 'too much zero-page space'
endif
endr endr
@ -62,6 +88,7 @@ blockNumber ds.b 2
entry read_block, read_block_abs entry read_block, read_block_abs
entry prepare_path, cat_lookup entry prepare_path, cat_lookup
entry read_cat_block, read_file_block entry read_cat_block, read_file_block
entry extent_to_extent
header proc header proc
@ -87,10 +114,12 @@ data record
;unit dc.w 0 ;unit dc.w 0
;vector dc.w 0 ;vector dc.w 0
block_offset dc.w 0 startingBlock dc.w 0
blockMultiplier dc.w 0
cat_extents dcb.w 6, 0
file_extents dcb.w 6, 0 cat_extents ds.b 3*ExtendedExtent.sizeof
file_extents ds.b 3*ExtendedExtent.sizeof
cat_root dc.w 0 cat_root dc.w 0
@ -126,7 +155,7 @@ getbootname proc
; getbootname(GSString *) ; getbootname(GSString *)
; return string needs a leading colon. ; return string needs a leading colon.
with dp with zp
plx ; rts plx ; rts
ply ply
@ -194,7 +223,7 @@ exit
getfstname proc getfstname proc
; getfstname(GSString *) ; getfstname(GSString *)
with dp with zp
plx ; rts plx ; rts
ply ply
@ -229,7 +258,7 @@ name str.w 'hfs.fst'
readfile proc readfile proc
; (eof, aux type, file type) readfile(GSString *, void *) ; (eof, aux type, file type) readfile(GSString *, void *)
with dp with zp
plx ; rts plx ; rts
ply ply
@ -335,7 +364,7 @@ exit
prepare_path proc prepare_path proc
with dp, data with zp, data
; optimism ; optimism
stz r0 ; offset into path stz r0 ; offset into path
@ -483,26 +512,26 @@ s3 dc.b 'xxSYSTEM:FSTS:'
read_file_block proc read_file_block proc
; a = block # ; a = block #
with data,HFSExtentDescriptor with data,ExtendedExtent
@0 @0
cmp file_extents+0+blockCount cmp file_extents+(sizeof*0)+blockCount
bcs @1 bcs @1
; clc ; clc
adc file_extents+0+startBlock adc file_extents+(sizeof*0)+startBlock
bra read_block bra read_block
@1 sbc file_extents+0+blockCount @1 sbc file_extents+(sizeof*0)+blockCount
cmp file_extents+4+blockCount cmp file_extents+(sizeof*1)+blockCount
bcs @2 bcs @2
; clc ; clc
adc file_extents+4+startBlock adc file_extents+(sizeof*1)+startBlock
bra read_block bra read_block
@2 sbc file_extents+4+blockCount @2 sbc file_extents+(sizeof*1)+blockCount
cmp file_extents+8+blockCount cmp file_extents+(sizeof*2)+blockCount
bcs @3 bcs @3
adc file_extents+8+startBlock adc file_extents+(sizeof*2)+startBlock
bra read_block bra read_block
@3 @3
@ -515,26 +544,28 @@ read_file_block proc
read_cat_block proc read_cat_block proc
; a = block # ; a = block #
with data,HFSExtentDescriptor ; TODO - not 32-bit clean yet.
with data,ExtendedExtent
@0 @0
cmp cat_extents+0+blockCount cmp cat_extents+(sizeof*0)+blockCount
bcs @1 bcs @1
; clc ; clc
adc cat_extents+0+startBlock adc cat_extents+(sizeof*0)+startBlock
bra read_block bra read_block
@1 sbc cat_extents+0+blockCount @1 sbc cat_extents+(sizeof*0)+blockCount
cmp cat_extents+4+blockCount cmp cat_extents+(sizeof*1)+blockCount
bcs @2 bcs @2
; clc ; clc
adc cat_extents+4+startBlock adc cat_extents+(sizeof*1)+startBlock
bra read_block bra read_block
@2 sbc cat_extents+4+blockCount @2 sbc cat_extents+(sizeof*1)+blockCount
cmp cat_extents+8+blockCount cmp cat_extents+(sizeof*2)+blockCount
bcs @3 bcs @3
adc cat_extents+8+startBlock adc cat_extents+(sizeof*2)+startBlock
bra read_block bra read_block
@3 @3
@ -555,9 +586,8 @@ read_block proc
; a = hfs block # ; a = hfs block #
; will be adjusted for allocation block offset ; will be adjusted for allocation block offset
; ;
with dp
clc clc
adc data.block_offset adc data.startingBlock
read_block_abs read_block_abs
@ -606,9 +636,9 @@ cat_lookup proc
with data with data
bnum equ dp.r0 bnum equ zp.r0
prev equ dp.r1 prev equ zp.r1
count equ dp.r2 count equ zp.r2
; search for a file and a parent directory. ; search for a file and a parent directory.
@ -816,7 +846,7 @@ match proc
; a match! ; a match!
; store the file type, aux type, eof, and extent pointers. ; store the file type, aux type, eof, and extent pointers.
with dp, data with zp, data
lda buffer+HFSCatalogKey.keyLength,y lda buffer+HFSCatalogKey.keyLength,y
; and #$ff ; and #$ff
@ -851,7 +881,7 @@ folder
sta ft sta ft
lda #$0d lda #$0d
sta st ; storage type sta st ; storage type
ldx #12-2 ldx #3*ExtendedExtent.sizeof-2
@eloop @eloop
stz file_extents,x stz file_extents,x
dex dex
@ -892,30 +922,19 @@ file
lda #1 lda #1
sta st ; storage type sta st ; storage type
phy ; save
lda buffer+dataExtents+0,y tya
xba clc
sta file_extents+0 adc #dataExtents
tay
lda buffer+dataExtents+2,y ; ldy #dataExtents
xba jsr extent_to_extent
sta file_extents+2 lda #3*ExtendedExtent.sizeof-1
ldx #extents
lda buffer+dataExtents+4,y ldy #file_extents
xba mvn $00,$00
sta file_extents+4 ; a, x, y clobbered.
ply
lda buffer+dataExtents+6,y
xba
sta file_extents+6
lda buffer+dataExtents+8,y
xba
sta file_extents+8
lda buffer+dataExtents+10,y
xba
sta file_extents+10
lda buffer+fileID+2,y lda buffer+fileID+2,y
xba xba
@ -927,7 +946,7 @@ file
; file type aux type logic. ; file type aux type logic.
; only support pdos encoding, nothing fancy. ; only support pdos encoding, nothing fancy.
; 'p' filetype aux type pdos ; 'p' filetype aux type pdos
; where filetype = 80bit, aux type = 16 bit big endian ; where filetype = 8 bit, aux type = 16 bit big endian
stz ft stz ft
stz at stz at
@ -985,7 +1004,7 @@ startup proc
; read :system:start.gsos, load into memory @ $6800 ; read :system:start.gsos, load into memory @ $6800
; aux type is stored in auxtype ; aux type is stored in auxtype
with dp, data with zp, data
; assume 16-bit, etc. ; assume 16-bit, etc.
@ -1013,26 +1032,34 @@ startup proc
with HFSMasterDirectoryBlock with HFSMasterDirectoryBlock
lda #2 lda #2
jsr read_block_abs jsr read_block_abs
; can't really fail... ; shouldn't fail.
lda buffer+drAlBlSt lda buffer+drAlBlSt
xba xba
sta block_offset sta startingBlock
ldx #3*HFSExtentDescriptor.sizeof-2 lda buffer+drAlBlkSiz+1
@cloop lda buffer+drCTExtRec,x
xba xba
sta cat_extents,x lsr a ; / 2
dex sta blockMultiplier
dex
bpl @cloop ; catalog extents
ldy #drCTExtRec ; offset
jsr extent_to_extent
lda #3*ExtendedExtent.sizeof-1
ldx #extents
ldy #cat_extents
mvn $00,$00
; a, x, y clobbered.
; save the volume name while we're at it? ; save the volume name while we're at it?
endwith endwith
; find the root node. ; find the root node.
lda cat_extents lda #0
jsr read_block ldx #0
jsr read_cat_block
with BTHeaderRec with BTHeaderRec
lda buffer+BTNodeDescriptor.sizeof+rootNode+2 lda buffer+BTNodeDescriptor.sizeof+rootNode+2
@ -1188,4 +1215,89 @@ gsos str.w 'START.GS.OS'
dcb.b 1,0 dcb.b 1,0
endp endp
multiply proc
; inputs: m1 (16-bit), m2 (32-bit)
; outputs: m3 (32-bit)
; m1, m2 clobbered
with zp
stz m3
stz m3+2
lda m1
beq rts
lda m2
ora m3
beq rts
loop
lsr m1
bcc next
add clc
lda m2
adc m3
sta m3
lda m2+2
adc m3+2
sta m3+2
next asl m2
rol m2+2
lda m1
bne loop
rts rts
endp
extent_to_extent proc
; y = offset into buffer.
; clobbers x, y
with zp, data
import multiply
ldx #0
loop1
lda buffer,y
xba
sta extents,x
stz extents+2,x
iny
iny
inx
inx
inx
inx
cpx #3*4*2
blt loop1
; now multiply...
lda blockMultiplier
dec a
beq rts
ldx #3*4*2-4
loop2
lda blockMultiplier
sta m1
lda extents+0,x
sta m2
stz m2+2
jsr multiply
lda m3
sta extents+0,x
lda m3+2
sta extents+2,x
dex
dex
dex
dex
bpl loop2
rts rts
endp
end end