From 44a654424213382fea8d9c896051abaa3a6c5808 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Wed, 11 Aug 2021 22:10:11 -0400 Subject: [PATCH] improved 32-bit (well, smartport is 24-bit) block support --- bootblock.aii | 95 ++++++++++++++++++++++++++++++++++++++++----------- loader.aii | 80 ++++++++++++++++++++++++++++++------------- 2 files changed, 132 insertions(+), 43 deletions(-) diff --git a/bootblock.aii b/bootblock.aii index b3a27bd..85bab33 100644 --- a/bootblock.aii +++ b/bootblock.aii @@ -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 diff --git a/loader.aii b/loader.aii index 21be8f3..3256b58 100644 --- a/loader.aii +++ b/loader.aii @@ -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