diff --git a/bootblock.aii b/bootblock.aii index d8b6087..b3a27bd 100644 --- a/bootblock.aii +++ b/bootblock.aii @@ -65,9 +65,7 @@ blockNumber ds.b 2 endif -data record $2000 - ds.b 512 - endr +buffer equ $2000 entry read_block, read_block_abs, read_extent_block @@ -150,7 +148,7 @@ ok stz count if not __smartport__ then - lda #data + lda #buffer sta pro.dataBuffer endif lda #2 @@ -171,23 +169,23 @@ ok ; ; with HFSMasterDirectoryBlock - lda data+drAlBlSt + lda buffer+drAlBlSt xba sta startingBlock ; drAlBlkSiz is actually a 32-bit number. ; -; lda data+drAlBlkSiz+2 +; lda buffer+drAlBlkSiz+2 ; xba ; sta drAlBlkSiz ; xba - lda data+drAlBlkSiz+1 + lda buffer+drAlBlkSiz+1 xba lsr a ; / 2 sta blockMultiplier ; 0 = 512 byte blocks, 1 = ; ldx #3*HFSExtentDescriptor.sizeof-2 -;@cloop lda data+drCTExtRec,x +;@cloop lda buffer+drCTExtRec,x ; xba ; sta extents,x ; dex @@ -211,10 +209,10 @@ ok ; block should be a btree header block. find the first leaf node. ; with BTHeaderRec -; lda data+BTNodeDescriptor.sizeof+firstLeafNode +; lda buffer+BTNodeDescriptor.sizeof+firstLeafNode ; xba ; sta leaf+2 - lda data+BTNodeDescriptor.sizeof+firstLeafNode+2 + lda buffer+BTNodeDescriptor.sizeof+firstLeafNode+2 xba ; sta bnum @@ -224,7 +222,7 @@ ok ; jsr read_extent_block - lda data+BTNodeDescriptor.numRecords ; # of records + lda buffer+BTNodeDescriptor.numRecords ; # of records beq advance xba @@ -233,19 +231,19 @@ ok again ldx #512-2 ; last entry @loop - lda data,x ; entry offset + lda buffer,x ; entry offset xba tay - lda data+HFSCatalogKey.parentID,y ; parent id + lda buffer+HFSCatalogKey.parentID,y ; parent id bne notfound - lda data+HFSCatalogKey.parentID+2,y + lda buffer+HFSCatalogKey.parentID+2,y xba cmp #2 blt @next beq @name bge notfound @name ; name is a p-string. - lda data+HFSCatalogKey.nodeName,y + lda buffer+HFSCatalogKey.nodeName,y cmp #$2101 ; pstr ! beq found bge notfound @@ -255,7 +253,7 @@ again dec count bne @loop advance ; next block! - lda data+BTNodeDescriptor.fLink+2 + lda buffer+BTNodeDescriptor.fLink+2 beq notfound xba jsr read_extent_block @@ -274,12 +272,12 @@ found ; assume < 65535 bytes :) with HFSCatalogFile - lda data+8+recordType,y + lda buffer+8+recordType,y and #$00ff cmp #kHFSFileRecord bne notfound - lda data+8+dataPhysicalSize+2,y + lda buffer+8+dataPhysicalSize+2,y ; xba lsr a ; >>9 since already xba and #%01111111 @@ -287,10 +285,10 @@ found sta count ; todo -- all extents... -; lda data+8+dataExtents,y +; lda buffer+8+dataExtents,y ; xba ; sta extents -; lda data+8+dataExtents+2,y +; lda buffer+8+dataExtents+2,y ; xba ; sta extents+2 @@ -457,14 +455,14 @@ rts rts endp extent_to_extent proc - ; y = offset into data. + ; y = offset into buffer. ; clobbers x, y with zp import multiply ldx #0 loop1 - lda data,y + lda buffer,y xba sta extents,x stz extents+2,x diff --git a/loader.aii b/loader.aii index 5fdf854..21be8f3 100644 --- a/loader.aii +++ b/loader.aii @@ -23,9 +23,19 @@ __smartport__ set 1 include 'smartport.aii' 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 -dp record 0 +zp record 0 ptr ds.l 1 path ds.l 1 @@ -43,6 +53,22 @@ at ds.w 1 st ds.w 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 @@ -62,6 +88,7 @@ blockNumber ds.b 2 entry read_block, read_block_abs entry prepare_path, cat_lookup entry read_cat_block, read_file_block + entry extent_to_extent header proc @@ -87,10 +114,12 @@ data record ;unit 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 @@ -126,7 +155,7 @@ getbootname proc ; getbootname(GSString *) ; return string needs a leading colon. - with dp + with zp plx ; rts ply @@ -194,7 +223,7 @@ exit getfstname proc ; getfstname(GSString *) - with dp + with zp plx ; rts ply @@ -229,7 +258,7 @@ name str.w 'hfs.fst' readfile proc ; (eof, aux type, file type) readfile(GSString *, void *) - with dp + with zp plx ; rts ply @@ -335,7 +364,7 @@ exit prepare_path proc - with dp, data + with zp, data ; optimism stz r0 ; offset into path @@ -483,26 +512,26 @@ s3 dc.b 'xxSYSTEM:FSTS:' read_file_block proc ; a = block # - with data,HFSExtentDescriptor + with data,ExtendedExtent @0 - cmp file_extents+0+blockCount + cmp file_extents+(sizeof*0)+blockCount bcs @1 ; clc - adc file_extents+0+startBlock + adc file_extents+(sizeof*0)+startBlock bra read_block -@1 sbc file_extents+0+blockCount - cmp file_extents+4+blockCount +@1 sbc file_extents+(sizeof*0)+blockCount + cmp file_extents+(sizeof*1)+blockCount bcs @2 ; clc - adc file_extents+4+startBlock + adc file_extents+(sizeof*1)+startBlock bra read_block -@2 sbc file_extents+4+blockCount - cmp file_extents+8+blockCount +@2 sbc file_extents+(sizeof*1)+blockCount + cmp file_extents+(sizeof*2)+blockCount bcs @3 - adc file_extents+8+startBlock + adc file_extents+(sizeof*2)+startBlock bra read_block @3 @@ -515,26 +544,28 @@ read_file_block proc read_cat_block proc ; a = block # - with data,HFSExtentDescriptor +; TODO - not 32-bit clean yet. + + with data,ExtendedExtent @0 - cmp cat_extents+0+blockCount + cmp cat_extents+(sizeof*0)+blockCount bcs @1 ; clc - adc cat_extents+0+startBlock + adc cat_extents+(sizeof*0)+startBlock bra read_block -@1 sbc cat_extents+0+blockCount - cmp cat_extents+4+blockCount +@1 sbc cat_extents+(sizeof*0)+blockCount + cmp cat_extents+(sizeof*1)+blockCount bcs @2 ; clc - adc cat_extents+4+startBlock + adc cat_extents+(sizeof*1)+startBlock bra read_block -@2 sbc cat_extents+4+blockCount - cmp cat_extents+8+blockCount +@2 sbc cat_extents+(sizeof*1)+blockCount + cmp cat_extents+(sizeof*2)+blockCount bcs @3 - adc cat_extents+8+startBlock + adc cat_extents+(sizeof*2)+startBlock bra read_block @3 @@ -555,9 +586,8 @@ read_block proc ; a = hfs block # ; will be adjusted for allocation block offset ; - with dp clc - adc data.block_offset + adc data.startingBlock read_block_abs @@ -606,9 +636,9 @@ cat_lookup proc with data -bnum equ dp.r0 -prev equ dp.r1 -count equ dp.r2 +bnum equ zp.r0 +prev equ zp.r1 +count equ zp.r2 ; search for a file and a parent directory. @@ -816,7 +846,7 @@ match proc ; a match! ; store the file type, aux type, eof, and extent pointers. - with dp, data + with zp, data lda buffer+HFSCatalogKey.keyLength,y ; and #$ff @@ -851,7 +881,7 @@ folder sta ft lda #$0d sta st ; storage type - ldx #12-2 + ldx #3*ExtendedExtent.sizeof-2 @eloop stz file_extents,x dex @@ -892,30 +922,19 @@ file lda #1 sta st ; storage type - - lda buffer+dataExtents+0,y - xba - sta file_extents+0 - - lda buffer+dataExtents+2,y - xba - sta file_extents+2 - - lda buffer+dataExtents+4,y - xba - sta file_extents+4 - - 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 + phy ; save + tya + clc + adc #dataExtents + tay +; ldy #dataExtents + jsr extent_to_extent + lda #3*ExtendedExtent.sizeof-1 + ldx #extents + ldy #file_extents + mvn $00,$00 + ; a, x, y clobbered. + ply lda buffer+fileID+2,y xba @@ -927,7 +946,7 @@ file ; file type aux type logic. ; only support pdos encoding, nothing fancy. ; '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 at @@ -985,7 +1004,7 @@ startup proc ; read :system:start.gsos, load into memory @ $6800 ; aux type is stored in auxtype - with dp, data + with zp, data ; assume 16-bit, etc. @@ -1013,26 +1032,34 @@ startup proc with HFSMasterDirectoryBlock lda #2 jsr read_block_abs - ; can't really fail... + ; shouldn't fail. lda buffer+drAlBlSt xba - sta block_offset + sta startingBlock - ldx #3*HFSExtentDescriptor.sizeof-2 -@cloop lda buffer+drCTExtRec,x + lda buffer+drAlBlkSiz+1 xba - sta cat_extents,x - dex - dex - bpl @cloop + lsr a ; / 2 + sta blockMultiplier + +; 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? endwith ; find the root node. - lda cat_extents - jsr read_block + lda #0 + ldx #0 + jsr read_cat_block with BTHeaderRec lda buffer+BTNodeDescriptor.sizeof+rootNode+2 @@ -1188,4 +1215,89 @@ gsos str.w 'START.GS.OS' dcb.b 1,0 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