;license:MIT ;(c) 2019 by 4am ; !cpu 6502 !to "build/FX.INDEXED/SOFT.DIAGONAL",plain *=$6000 y = $fc row = $fd col = $fe counter = $ff hgrlo = $0200 ; [$C0 bytes] hgr1hi = $0300 ; [$C0 bytes] !source "src/fx/macros.a" !macro RESET_HGR_CALC_BY_7 { lda $27 sec sbc #$1c sta $27 eor #$60 sta $3d } +BUILD_HGR_LOOKUP_TABLES hgrlo, hgr1hi lda #(40+24+7-1) ; columns + rows + blocks per row - 1 sta counter lda #39 sta col ColLoop lda #23 sta row ldy col sty y RowLoop ; [speedopt] calculate HGR base addresses once per row lda row asl asl asl tax lda hgrlo, x sta $26 sta $3c lda hgr1hi, x sta $27 eor #$60 sta $3d ldy y +IS_Y_OFFSCREEN +LBCS @block2 ; [speedopt] HGRBlockCopyWithMask but hardcoded for this block's masks ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks1 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } ; [speedopt] reset HGR base addresses instead of recalculating them from scratch +RESET_HGR_CALC_BY_7 @block2 iny +IS_Y_OFFSCREEN +LBCS @block3 ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks2 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } +RESET_HGR_CALC_BY_7 @block3 iny +IS_Y_OFFSCREEN +LBCS @block4 ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks3 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } +RESET_HGR_CALC_BY_7 @block4 iny +IS_Y_OFFSCREEN +LBCS @block5 ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks4 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } +RESET_HGR_CALC_BY_7 @block5 iny +IS_Y_OFFSCREEN +LBCS @block6 ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks5 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } +RESET_HGR_CALC_BY_7 @block6 iny +IS_Y_OFFSCREEN +LBCS @block7 ldx #7 clc !for i, 0, 7 { +COPY_BIT $3c, $26, copymasks6 !if i < 7 { dex +HGR_INC_WITHIN_BLOCK } } +RESET_HGR_CALC_BY_7 @block7 iny +IS_Y_OFFSCREEN +LBCS @nextrow ; [speedopt] HGRBlockCopy but inlined clc !for i, 0, 7 { lda ($3c),y sta ($26),y !if i < 7 { +HGR_INC_WITHIN_BLOCK } } ; don't need RESET_HGR_CALC_BY_7 here because we're done with this row @nextrow ldy y iny sty y dec row +LBPL RowLoop lda $c000 bmi @exit dec col dec counter +LBNE ColLoop @exit rts copymasks1 !byte %10000000 !byte %10000000 !byte %10000000 !byte %10001000 !byte %10001000 !byte %10000000 !byte %10000000 !byte %10000000 copymasks2 !byte %10000000 !byte %10000000 !byte %10010100 !byte %10001000 !byte %10001000 !byte %10010100 !byte %10000000 !byte %10000000 copymasks3 !byte %10000000 !byte %10000000 !byte %10011100 !byte %10011100 !byte %10011100 !byte %10011100 !byte %10000000 !byte %10000000 copymasks4 !byte %10000000 !byte %10101010 !byte %10011100 !byte %10111110 !byte %10011100 !byte %10011100 !byte %10101010 !byte %10000000 copymasks5 !byte %10000000 !byte %10111110 !byte %10111110 !byte %10111110 !byte %10111110 !byte %10111110 !byte %10111110 !byte %10000000 copymasks6 !byte %11010101 !byte %10111110 !byte %11111111 !byte %10111110 !byte %11111111 !byte %10111110 !byte %10111110 !byte %11010101