2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
include 'hfs.aii'
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
string asis
|
|
|
|
blanks on
|
|
|
|
|
|
|
|
zp record 0
|
|
|
|
slot ds.w 1
|
|
|
|
vector ds.w 1
|
|
|
|
|
|
|
|
offset ds.w 1
|
|
|
|
bnum ds.w 1
|
|
|
|
count ds.w 1
|
|
|
|
extents ds.b 3*HFSExtentDescriptor.sizeof
|
|
|
|
|
|
|
|
endr
|
|
|
|
|
|
|
|
pro record $42
|
|
|
|
cmd ds.b 1
|
|
|
|
unit ds.b 1
|
|
|
|
buffer ds.b 2
|
|
|
|
block ds.b 2
|
|
|
|
endr
|
|
|
|
|
|
|
|
data record $2000
|
|
|
|
ds.b 512
|
|
|
|
endr
|
|
|
|
|
|
|
|
|
|
|
|
entry read_block, read_block_abs, read_extent_block
|
|
|
|
|
2021-07-17 04:21:31 +00:00
|
|
|
boot proc
|
2021-07-17 16:10:06 +00:00
|
|
|
longi off
|
|
|
|
longa off
|
2021-07-17 04:21:31 +00:00
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
with zp
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
dc.b $01 ; prodos boot id :D
|
|
|
|
|
|
|
|
|
|
|
|
stx pro.unit
|
|
|
|
txa
|
|
|
|
lsr a
|
|
|
|
lsr a
|
|
|
|
lsr a
|
|
|
|
lsr a
|
|
|
|
ora #$c0
|
|
|
|
sta vector+1
|
|
|
|
sta slot+1
|
|
|
|
stz slot
|
|
|
|
; check for prodos block-device signature bytes
|
|
|
|
; todo -- switch to extended smartport? needed for second stage.
|
|
|
|
ldy #1
|
|
|
|
lda (slot),y
|
|
|
|
cmp #$20
|
|
|
|
bne noboot
|
|
|
|
ldy #3
|
|
|
|
lda (slot),y
|
|
|
|
bne noboot
|
|
|
|
ldy #5
|
|
|
|
bne noboot
|
|
|
|
; smartport - ,7 = 00
|
|
|
|
ldy #$ff
|
|
|
|
lda (slot),y
|
|
|
|
sta vector
|
|
|
|
bra ok
|
|
|
|
|
|
|
|
noboot brk $ea
|
|
|
|
|
|
|
|
ok
|
|
|
|
lda #1 ; prodos read block
|
|
|
|
sta pro.cmd
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
clc
|
2021-07-17 16:10:06 +00:00
|
|
|
xce
|
|
|
|
rep #$30
|
|
|
|
longi on
|
|
|
|
longa on
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
stz offset
|
|
|
|
stz bnum
|
|
|
|
stz count
|
|
|
|
lda #data
|
|
|
|
sta pro.buffer
|
|
|
|
lda #2
|
|
|
|
jsr read_block_abs
|
|
|
|
|
2021-07-17 04:21:31 +00:00
|
|
|
;
|
2021-07-17 16:10:06 +00:00
|
|
|
; assumes 512-byte blocks (max size = 64MB)
|
2021-07-17 04:21:31 +00:00
|
|
|
;
|
|
|
|
; wait a minute... max 65535 blocks, therefore high word of allocation block, etc, always 0.
|
2021-07-17 16:10:06 +00:00
|
|
|
; i assume hfs use 32-bit links in the btree for in-memory use (24-bit or 32 pointers)
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
;
|
|
|
|
; search for a file named ! in the root directory.
|
|
|
|
; ! is ascii char $21 so it should sort early.
|
|
|
|
;
|
|
|
|
;
|
2021-07-17 16:10:06 +00:00
|
|
|
with HFSMasterDirectoryBlock
|
|
|
|
lda data+drAlBlSt
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
|
|
|
sta offset
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+drCTExtRec ; 1st allocation block
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
sta extents
|
|
|
|
lda data+drCTExtRec+2 ; # of allocation blocks
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
sta extents+2
|
2021-07-17 04:21:31 +00:00
|
|
|
;
|
|
|
|
; need to do all 3?
|
|
|
|
;
|
2021-07-17 16:10:06 +00:00
|
|
|
endwith
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
; lda offset
|
|
|
|
; clc
|
2021-07-17 16:10:06 +00:00
|
|
|
; adc extents
|
|
|
|
lda extents
|
2021-07-17 04:21:31 +00:00
|
|
|
jsr read_block
|
|
|
|
|
|
|
|
;
|
|
|
|
; block should be a btree header block. find the first leaf node.
|
|
|
|
;
|
2021-07-17 16:10:06 +00:00
|
|
|
with BTHeaderRec
|
|
|
|
; lda data+BTNodeDescriptor.sizeof+firstLeafNode
|
|
|
|
; xba
|
|
|
|
; sta leaf+2
|
|
|
|
lda data+BTNodeDescriptor.sizeof+firstLeafNode+2
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
; sta bnum
|
|
|
|
|
|
|
|
endwith
|
2021-07-17 04:21:31 +00:00
|
|
|
;
|
|
|
|
; assert leaf < # allocated lbocks?
|
|
|
|
;
|
|
|
|
;lda leaf
|
2021-07-17 16:10:06 +00:00
|
|
|
; s/b leaf + cat extent + offset; todo - this offset is in terms of the catalog extent
|
|
|
|
jsr read_extent_block
|
2021-07-17 04:21:31 +00:00
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+BTNodeDescriptor.numRecords ; # of records
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
|
|
|
; asl a ; x 2
|
|
|
|
; sec
|
|
|
|
; sbc #512
|
|
|
|
; eor #-1
|
|
|
|
; inc a
|
|
|
|
; adc #-513 ; carry will be clear. +1 to avoid inc
|
|
|
|
; eor #-1
|
|
|
|
sta count
|
|
|
|
beq advance
|
|
|
|
|
|
|
|
again
|
|
|
|
ldx #512-2 ; last entry
|
|
|
|
@loop
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data,x
|
2021-07-17 04:21:31 +00:00
|
|
|
tay
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+HFSCatalogKey.parentID,y ; parent id
|
2021-07-17 04:21:31 +00:00
|
|
|
bne notfound
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+HFSCatalogKey.parentID+2,y
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
|
|
|
cmp #2
|
|
|
|
blt @next
|
|
|
|
beq @name
|
|
|
|
bge notfound
|
|
|
|
@name ; name is a p-string.
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+HFSCatalogKey.nodeName,y
|
|
|
|
cmp #$2101 ; pstr !
|
|
|
|
beq found
|
2021-07-17 04:21:31 +00:00
|
|
|
bge notfound
|
2021-07-17 16:10:06 +00:00
|
|
|
|
2021-07-17 04:21:31 +00:00
|
|
|
@next dex
|
|
|
|
dex
|
|
|
|
dec count
|
|
|
|
bne @loop
|
|
|
|
advance ; next block!
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+BTNodeDescriptor.fLink+2
|
2021-07-17 04:21:31 +00:00
|
|
|
beq notfound
|
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
jsr read_extent_block
|
2021-07-17 04:21:31 +00:00
|
|
|
bra again
|
|
|
|
|
|
|
|
notfound
|
|
|
|
brk $ea
|
|
|
|
|
|
|
|
found
|
|
|
|
; y = offset in block
|
|
|
|
;
|
|
|
|
; only works with contiguous files....
|
|
|
|
; first block?
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
; 8 is magic offset for a key named !
|
|
|
|
|
2021-07-17 04:21:31 +00:00
|
|
|
; assume < 65535 bytes :)
|
2021-07-17 16:10:06 +00:00
|
|
|
with HFSCatalogFile
|
|
|
|
lda data+8+recordType,y
|
|
|
|
and #$00ff
|
|
|
|
cmp #kHFSFileRecord
|
|
|
|
bne notfound
|
|
|
|
|
|
|
|
lda data+8+dataPhysicalSize+2,y
|
2021-07-17 04:21:31 +00:00
|
|
|
; xba
|
|
|
|
lsr a ; >>9 since already xba
|
|
|
|
and #%01111111
|
|
|
|
beq notfound
|
|
|
|
sta count
|
2021-07-17 16:10:06 +00:00
|
|
|
lda data+8+dataExtents,y
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
sta extents
|
|
|
|
lda data+8+dataExtents+2,y
|
2021-07-17 04:21:31 +00:00
|
|
|
xba
|
2021-07-17 16:10:06 +00:00
|
|
|
sta extents+2
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
; now load the blocks and
|
|
|
|
lda #$2000
|
2021-07-17 16:10:06 +00:00
|
|
|
sta pro.buffer
|
|
|
|
stz bnum
|
2021-07-17 04:21:31 +00:00
|
|
|
@loop
|
2021-07-17 16:10:06 +00:00
|
|
|
lda bnum
|
|
|
|
jsr read_extent_block
|
|
|
|
inc bnum
|
2021-07-17 04:21:31 +00:00
|
|
|
lda #512
|
|
|
|
clc
|
2021-07-17 16:10:06 +00:00
|
|
|
adc pro.buffer
|
|
|
|
sta pro.buffer
|
2021-07-17 04:21:31 +00:00
|
|
|
dec count
|
|
|
|
bne @loop
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
lda vector ; pass in
|
2021-07-17 04:21:31 +00:00
|
|
|
jmp $2000 ; kiss of life.
|
|
|
|
|
|
|
|
|
|
|
|
endp
|
|
|
|
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
read_block proc
|
|
|
|
entry read_block_abs
|
|
|
|
|
|
|
|
; input
|
|
|
|
; a = hfs block #
|
|
|
|
; will be adjusted for allocation block offset
|
|
|
|
;
|
|
|
|
with zp
|
|
|
|
clc
|
|
|
|
adc offset
|
|
|
|
|
|
|
|
read_block_abs
|
|
|
|
|
|
|
|
sta pro.block
|
|
|
|
sep #$30
|
|
|
|
jmp (vector)
|
|
|
|
rep #$30
|
|
|
|
bcs @fail
|
|
|
|
; bcs error...
|
|
|
|
rts
|
|
|
|
@fail brk $ea
|
|
|
|
endp
|
|
|
|
|
|
|
|
read_extent_block proc
|
|
|
|
; a = block #
|
|
|
|
|
|
|
|
; This doesn't check beyond the 3rd extent
|
|
|
|
|
|
|
|
with zp,HFSExtentDescriptor
|
|
|
|
|
|
|
|
@0
|
|
|
|
cmp extents+0+blockCount
|
|
|
|
bcs @1
|
|
|
|
; clc
|
|
|
|
adc extents+0+startBlock
|
|
|
|
bra read_block
|
|
|
|
|
|
|
|
@1 sbc extents+0+blockCount
|
|
|
|
cmp extents+4+blockCount
|
|
|
|
bcs @2
|
|
|
|
; clc
|
|
|
|
adc extents+4+startBlock
|
|
|
|
bra read_block
|
|
|
|
|
|
|
|
@2 sbc extents+4+blockCount
|
|
|
|
cmp extents+8+blockCount
|
|
|
|
bcs @3
|
|
|
|
adc extents+8+startBlock
|
|
|
|
bra read_block
|
|
|
|
|
|
|
|
@3 brk $ea
|
|
|
|
endp
|
|
|
|
|
2021-07-17 04:21:31 +00:00
|
|
|
|
|
|
|
|
2021-07-17 16:10:06 +00:00
|
|
|
end
|