mirror of
https://github.com/ksherlock/hfs-boot.git
synced 2024-12-11 09:49:29 +00:00
.
This commit is contained in:
commit
371780b11b
171
bootblock.aii
Normal file
171
bootblock.aii
Normal file
@ -0,0 +1,171 @@
|
||||
|
||||
include 'hfs.aii'
|
||||
|
||||
boot proc
|
||||
|
||||
stz offset
|
||||
lda #2
|
||||
jsr read_block
|
||||
|
||||
|
||||
endp
|
||||
|
||||
read_block proc
|
||||
; input
|
||||
; a = hfs block #
|
||||
; will be adjusted for allocation block offset
|
||||
;
|
||||
clc
|
||||
adc offset
|
||||
sta block
|
||||
phx
|
||||
phy
|
||||
|
||||
ply
|
||||
plx
|
||||
rts
|
||||
endp
|
||||
|
||||
findit proc
|
||||
;
|
||||
; assumes 512-byte blocks (max size = ....?)
|
||||
;
|
||||
; wait a minute... max 65535 blocks, therefore high word of allocation block, etc, always 0.
|
||||
;
|
||||
|
||||
;
|
||||
; search for a file named ! in the root directory.
|
||||
; ! is ascii char $21 so it should sort early.
|
||||
;
|
||||
;
|
||||
lda header+drAlBlSt
|
||||
xba
|
||||
sta offset
|
||||
|
||||
lda header+drCTExtRec ; 1st allocation block
|
||||
xba
|
||||
sta cat_extents
|
||||
lda header+drCTExtRec+2 ; # of allocation blocks
|
||||
xba
|
||||
sta cat_extents+2
|
||||
;
|
||||
; need to do all 3?
|
||||
;
|
||||
|
||||
; lda offset
|
||||
; clc
|
||||
; adc cat_extents
|
||||
lda cat_extents
|
||||
jsr read_block
|
||||
|
||||
;
|
||||
; block should be a btree header block. find the first leaf node.
|
||||
;
|
||||
lda block+$18
|
||||
xba
|
||||
sta leaf+2
|
||||
lda block+$18+2
|
||||
xba
|
||||
sta leaf
|
||||
;
|
||||
; assert leaf < # allocated lbocks?
|
||||
;
|
||||
;lda leaf
|
||||
jsr read_block
|
||||
|
||||
lda block+$a ; # of records
|
||||
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
|
||||
lda block,x
|
||||
tay
|
||||
lda block+2,y ; parent id
|
||||
bne notfound
|
||||
lda block+4,y
|
||||
xba
|
||||
cmp #2
|
||||
blt @next
|
||||
beq @name
|
||||
bge notfound
|
||||
@name ; name is a p-string.
|
||||
lda block+6+1,y
|
||||
and #$ff
|
||||
cmp #'!'
|
||||
blt @next
|
||||
beq @name2
|
||||
bge notfound
|
||||
@name2 lda block+6,y
|
||||
cmp #$2101
|
||||
bne notfound
|
||||
brl found
|
||||
@next dex
|
||||
dex
|
||||
dec count
|
||||
bne @loop
|
||||
advance ; next block!
|
||||
lda block+2
|
||||
beq notfound
|
||||
xba
|
||||
jsr read_block
|
||||
bra again
|
||||
|
||||
notfound
|
||||
brk $ea
|
||||
|
||||
found
|
||||
; y = offset in block
|
||||
;
|
||||
; only works with contiguous files....
|
||||
; first block?
|
||||
|
||||
; assume < 65535 bytes :)
|
||||
lda block+filPyLen+2,y
|
||||
; xba
|
||||
lsr a ; >>9 since already xba
|
||||
and #%01111111
|
||||
beq notfound
|
||||
sta count
|
||||
lda block+filExtRec,y
|
||||
xba
|
||||
sta extent
|
||||
lda block+filExtRec+2,y
|
||||
xba
|
||||
sta extent+2
|
||||
|
||||
; now load the blocks and
|
||||
lda #$2000
|
||||
sta dest
|
||||
lda extent
|
||||
clc
|
||||
adc offset
|
||||
sta block
|
||||
@loop
|
||||
jsr read_block2
|
||||
inc block
|
||||
lda #512
|
||||
clc
|
||||
adc dest
|
||||
sta dest
|
||||
dec count
|
||||
bne @loop
|
||||
|
||||
jmp $2000 ; kiss of life.
|
||||
|
||||
|
||||
endp
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
193
hfs.aii
Normal file
193
hfs.aii
Normal file
@ -0,0 +1,193 @@
|
||||
; borrowed from HFSVolumes.a
|
||||
|
||||
|
||||
Str31 RECORD 0
|
||||
elements ds.b 32
|
||||
sizeof EQU * ; size: $20 (32)
|
||||
ENDR
|
||||
|
||||
|
||||
Str27 RECORD 0
|
||||
elements ds.b 28
|
||||
sizeof EQU * ; size: $1C (28)
|
||||
ENDR
|
||||
|
||||
;
|
||||
; extents
|
||||
;
|
||||
|
||||
kHFSExtentDensity EQU 3
|
||||
|
||||
; HFS extent descriptor
|
||||
HFSExtentDescriptor RECORD 0
|
||||
startBlock ds.w 1 ; offset: $0 (0) ; first allocation block
|
||||
blockCount ds.w 1 ; offset: $2 (2) ; number of allocation blocks
|
||||
sizeof EQU * ; size: $4 (4)
|
||||
ENDR
|
||||
|
||||
|
||||
; HFS extent record
|
||||
HFSExtentRecord RECORD 0
|
||||
elements ds.b 3*HFSExtentDescriptor.sizeof
|
||||
sizeof EQU * ; size: $C (12)
|
||||
ENDR
|
||||
|
||||
|
||||
;
|
||||
; catalog
|
||||
;
|
||||
|
||||
kHFSRootParentID EQU 1 ; Parent ID of the root folder
|
||||
kHFSRootFolderID EQU 2 ; Folder ID of the root folder
|
||||
kHFSExtentsFileID EQU 3 ; File ID of the extents file
|
||||
kHFSCatalogFileID EQU 4 ; File ID of the catalog file
|
||||
kHFSBadBlockFileID EQU 5 ; File ID of the bad allocation block file
|
||||
kHFSAllocationFileID EQU 6 ; File ID of the allocation file (HFS Plus only)
|
||||
kHFSStartupFileID EQU 7 ; File ID of the startup file (HFS Plus only)
|
||||
kHFSAttributesFileID EQU 8 ; File ID of the attribute file (HFS Plus only)
|
||||
kHFSBogusExtentFileID EQU 15 ; Used for exchanging extents in extents file
|
||||
kHFSFirstUserCatalogNodeID EQU 16
|
||||
|
||||
kHFSFolderRecord EQU $01 ; Folder record
|
||||
kHFSFileRecord EQU $02 ; File record
|
||||
kHFSFolderThreadRecord EQU $03 ; Folder thread record
|
||||
kHFSFileThreadRecord EQU $04 ; File thread record
|
||||
|
||||
|
||||
; HFS catalog key
|
||||
HFSCatalogKey RECORD 0
|
||||
keyLength ds.b 1 ; offset: $0 (0) ; key length (in bytes)
|
||||
reserved ds.b 1 ; offset: $1 (1) ; reserved (set to zero)
|
||||
parentID ds.l 1 ; offset: $2 (2) ; parent folder ID
|
||||
nodeName ds Str31 ; offset: $6 (6) ; catalog node name
|
||||
sizeof EQU * ; size: $26 (38)
|
||||
ENDR
|
||||
|
||||
|
||||
|
||||
; HFS catalog folder record - 70 bytes
|
||||
HFSCatalogFolder RECORD 0
|
||||
recordType ds.b 1 ; offset: $0 (0) ; record type
|
||||
ds.b 1 ; reserved
|
||||
flags ds.w 1 ; offset: $2 (2) ; folder flags
|
||||
valence ds.w 1 ; offset: $4 (4) ; folder valence
|
||||
folderID ds.l 1 ; offset: $6 (6) ; folder ID
|
||||
createDate ds.l 1 ; offset: $A (10) ; date and time of creation
|
||||
modifyDate ds.l 1 ; offset: $E (14) ; date and time of last modification
|
||||
backupDate ds.l 1 ; offset: $12 (18) ; date and time of last backup
|
||||
userInfo ds.b 16 ; offset: $16 (22) ; Finder information
|
||||
finderInfo ds.b 16 ; offset: $26 (38) ; additional Finder information
|
||||
reserved ds.l 4 ; offset: $36 (54) ; reserved - set to zero
|
||||
sizeof EQU * ; size: $46 (70)
|
||||
ENDR
|
||||
|
||||
; HFS catalog file record - 102 bytes
|
||||
HFSCatalogFile RECORD 0
|
||||
recordType ds.w 1 ; offset: $0 (0) ; record type
|
||||
flags ds.b 1 ; offset: $2 (2) ; file flags
|
||||
fileType ds.b 1 ; offset: $3 (3) ; file type (unused ?)
|
||||
userInfo ds.b 16 ; offset: $4 (4) ; Finder information
|
||||
fileID ds.l 1 ; offset: $14 (20) ; file ID
|
||||
dataStartBlock ds.w 1 ; offset: $18 (24) ; not used - set to zero
|
||||
dataLogicalSize ds.l 1 ; offset: $1A (26) ; logical EOF of data fork
|
||||
dataPhysicalSize ds.l 1 ; offset: $1E (30) ; physical EOF of data fork
|
||||
rsrcStartBlock ds.w 1 ; offset: $22 (34) ; not used - set to zero
|
||||
rsrcLogicalSize ds.l 1 ; offset: $24 (36) ; logical EOF of resource fork
|
||||
rsrcPhysicalSize ds.l 1 ; offset: $28 (40) ; physical EOF of resource fork
|
||||
createDate ds.l 1 ; offset: $2C (44) ; date and time of creation
|
||||
modifyDate ds.l 1 ; offset: $30 (48) ; date and time of last modification
|
||||
backupDate ds.l 1 ; offset: $34 (52) ; date and time of last backup
|
||||
finderInfo ds.b 16 ; offset: $38 (56) ; additional Finder information
|
||||
clumpSize ds.w 1 ; offset: $48 (72) ; file clump size (not used)
|
||||
dataExtents ds HFSExtentRecord ; offset: $4A (74) ; first data fork extent record
|
||||
rsrcExtents ds HFSExtentRecord ; offset: $56 (86) ; first resource fork extent record
|
||||
reserved ds.l 1 ; offset: $62 (98) ; reserved - set to zero
|
||||
sizeof EQU * ; size: $66 (102)
|
||||
ENDR
|
||||
|
||||
; HFS catalog thread record - 46 bytes
|
||||
HFSCatalogThread RECORD 0
|
||||
recordType ds.w 1 ; offset: $0 (0) ; record type
|
||||
reserved ds.l 2 ; offset: $2 (2) ; reserved - set to zero
|
||||
parentID ds.l 1 ; offset: $A (10) ; parent ID for this catalog node
|
||||
nodeName ds Str31 ; offset: $E (14) ; name of this catalog node
|
||||
sizeof EQU * ; size: $2E (46)
|
||||
ENDR
|
||||
|
||||
|
||||
; Master Directory Block (HFS only) - 162 bytes
|
||||
; Stored at sector #2 (3rd sector)
|
||||
HFSMasterDirectoryBlock RECORD 0
|
||||
; These first fields are also used by MFS
|
||||
drSigWord ds.w 1 ; offset: $0 (0) ; volume signature
|
||||
drCrDate ds.l 1 ; offset: $2 (2) ; date and time of volume creation
|
||||
drLsMod ds.l 1 ; offset: $6 (6) ; date and time of last modification
|
||||
drAtrb ds.w 1 ; offset: $A (10) ; volume attributes
|
||||
drNmFls ds.w 1 ; offset: $C (12) ; number of files in root folder
|
||||
drVBMSt ds.w 1 ; offset: $E (14) ; first block of volume bitmap
|
||||
drAllocPtr ds.w 1 ; offset: $10 (16) ; start of next allocation search
|
||||
drNmAlBlks ds.w 1 ; offset: $12 (18) ; number of allocation blocks in volume
|
||||
drAlBlkSiz ds.l 1 ; offset: $14 (20) ; size (in bytes) of allocation blocks
|
||||
drClpSiz ds.l 1 ; offset: $18 (24) ; default clump size
|
||||
drAlBlSt ds.w 1 ; offset: $1C (28) ; first allocation block in volume
|
||||
drNxtCNID ds.l 1 ; offset: $1E (30) ; next unused catalog node ID
|
||||
drFreeBks ds.w 1 ; offset: $22 (34) ; number of unused allocation blocks
|
||||
drVN ds Str27 ; offset: $24 (36) ; volume name
|
||||
; Master Directory Block extensions for HFS
|
||||
drVolBkUp ds.l 1 ; offset: $40 (64) ; date and time of last backup
|
||||
drVSeqNum ds.w 1 ; offset: $44 (68) ; volume backup sequence number
|
||||
drWrCnt ds.l 1 ; offset: $46 (70) ; volume write count
|
||||
drXTClpSiz ds.l 1 ; offset: $4A (74) ; clump size for extents overflow file
|
||||
drCTClpSiz ds.l 1 ; offset: $4E (78) ; clump size for catalog file
|
||||
drNmRtDirs ds.w 1 ; offset: $52 (82) ; number of directories in root folder
|
||||
drFilCnt ds.l 1 ; offset: $54 (84) ; number of files in volume
|
||||
drDirCnt ds.l 1 ; offset: $58 (88) ; number of directories in volume
|
||||
drFndrInfo ds.l 8 ; offset: $5C (92) ; information used by the Finder
|
||||
drEmbedSigWord ds.w 1 ; offset: $7C (124) ; embedded volume signature (formerly drVCSize)
|
||||
drEmbedExtent ds HFSExtentDescriptor ; offset: $7E (126) ; embedded volume location and size (formerly drVBMCSize and drCtlCSize)
|
||||
drXTFlSize ds.l 1 ; offset: $82 (130) ; size of extents overflow file
|
||||
drXTExtRec ds HFSExtentRecord ; offset: $86 (134) ; extent record for extents overflow file
|
||||
drCTFlSize ds.l 1 ; offset: $92 (146) ; size of catalog file
|
||||
drCTExtRec ds HFSExtentRecord ; offset: $96 (150) ; extent record for catalog file
|
||||
sizeof EQU * ; size: $A2 (162)
|
||||
ENDR
|
||||
|
||||
|
||||
; ---------- HFS and HFS Plus B-tree structures ----------
|
||||
; BTNodeDescriptor -- Every B-tree node starts with these fields.
|
||||
BTNodeDescriptor RECORD 0
|
||||
fLink ds.l 1 ; offset: $0 (0) ; next node at this level
|
||||
bLink ds.l 1 ; offset: $4 (4) ; previous node at this level
|
||||
kind ds.b 1 ; offset: $8 (8) ; kind of node (leaf, index, header, map)
|
||||
height ds.b 1 ; offset: $9 (9) ; zero for header, map; child is one more than parent
|
||||
numRecords ds.w 1 ; offset: $A (10) ; number of records in this node
|
||||
reserved ds.w 1 ; offset: $C (12) ; reserved; set to zero
|
||||
sizeof EQU * ; size: $E (14)
|
||||
ENDR
|
||||
|
||||
; Constants for BTNodeDescriptor kind
|
||||
kBTLeafNode EQU -1
|
||||
kBTIndexNode EQU 0
|
||||
kBTHeaderNode EQU 1
|
||||
kBTMapNode EQU 2
|
||||
|
||||
|
||||
; BTHeaderRec -- The first record of a B-tree header node
|
||||
BTHeaderRec RECORD 0
|
||||
treeDepth ds.w 1 ; offset: $0 (0) ; maximum height (usually leaf nodes)
|
||||
rootNode ds.l 1 ; offset: $2 (2) ; node number of root node
|
||||
leafRecords ds.l 1 ; offset: $6 (6) ; number of leaf records in all leaf nodes
|
||||
firstLeafNode ds.l 1 ; offset: $A (10) ; node number of first leaf node
|
||||
lastLeafNode ds.l 1 ; offset: $E (14) ; node number of last leaf node
|
||||
nodeSize ds.w 1 ; offset: $12 (18) ; size of a node, in bytes
|
||||
maxKeyLength ds.w 1 ; offset: $14 (20) ; reserved
|
||||
totalNodes ds.l 1 ; offset: $16 (22) ; total number of nodes in tree
|
||||
freeNodes ds.l 1 ; offset: $1A (26) ; number of unused (free) nodes in tree
|
||||
reserved1 ds.w 1 ; offset: $1E (30) ; unused
|
||||
clumpSize ds.l 1 ; offset: $20 (32) ; reserved
|
||||
btreeType ds.b 1 ; offset: $24 (36) ; reserved
|
||||
reserved2 ds.b 1 ; offset: $25 (37) ; reserved
|
||||
attributes ds.l 1 ; offset: $26 (38) ; persistent attributes about the tree
|
||||
reserved3 ds.l 16 ; offset: $2A (42) ; reserved
|
||||
sizeof EQU * ; size: $6A (106)
|
||||
ENDR
|
Loading…
Reference in New Issue
Block a user