;license:MIT ;(c) 2019-2020 by 4am ; !cpu 6502 !to "build/FX/DHGR.SOFT.DIAG",plain *=$6000 src = $F0 dst = $F2 row = $FD col = $FE counter = $FF !macro INC_HGR_HI_BY .blocks { ; lda dst+1 adc #(.blocks*4) sta dst+1 eor #$60 sta src+1 } !macro SET_HGR_HI { sta src+1 eor #$60 sta dst+1 } !macro RESET_HGR_HI { txa +SET_HGR_HI } !macro RESET_HGR_HI_AND_INC_BY .blocks { txa adc #(.blocks*4) sta src+1 eor #$60 sta dst+1 } ; note: .copymask is an immediate value, not an indexed array or a memory address !macro COPY_WITH_MASK_IMM .copymask { lda (src), y eor (dst), y ; merge source and destination bits and #.copymask ; isolate the bits to replace, zero the rest eor (dst), y ; unmerge source and destination bits, leaves 'to keep' destination bits intact sta (dst), y ; write the result } !macro COPY_WITH_MASK_IMM_AND_INC .copymask { +COPY_WITH_MASK_IMM .copymask lda dst+1 +INC_HGR_HI_BY 1 } !macro COPY_BYTE { lda (src), y sta (dst), y } !macro COPY_BYTE_AND_INC { +COPY_BYTE lda dst+1 +INC_HGR_HI_BY 1 } !source "src/fx/macros.a" !source "src/fx/fx.dhgr.common.a" +COPY_TO_AUXMEM $60, $07 lda #(40+24+7-1) ; columns + rows + blocks per row - 1 sta counter lda #39 sta col ColLoop lda #23 sta row ldy col RowLoop ldx row lda hgrrowlo, x sta src sta dst lda hgrrowhi, x tax +SET_HGR_HI +BRANCH_IF_Y_IS_OFFSCREEN @block2 +INC_HGR_HI_BY 3 +COPY_WITH_MASK_IMM_AND_INC %10000001 +COPY_WITH_MASK_IMM %10000001 @block2 iny +BRANCH_IF_Y_IS_OFFSCREEN @block3 +RESET_HGR_HI_AND_INC_BY 2 +COPY_WITH_MASK_IMM_AND_INC %10000110 +COPY_WITH_MASK_IMM_AND_INC %10000001 +COPY_WITH_MASK_IMM_AND_INC %10000001 +COPY_WITH_MASK_IMM %10010110 @block3 iny +BRANCH_IF_Y_IS_OFFSCREEN @block4 +RESET_HGR_HI_AND_INC_BY 2 +COPY_WITH_MASK_IMM_AND_INC %10000111 +COPY_WITH_MASK_IMM_AND_INC %10000111 +COPY_WITH_MASK_IMM_AND_INC %10000111 +COPY_WITH_MASK_IMM %10000111 @block4 iny +BRANCH_IF_Y_IS_OFFSCREEN @block5 +RESET_HGR_HI_AND_INC_BY 1 +COPY_WITH_MASK_IMM_AND_INC %10011001 +COPY_WITH_MASK_IMM_AND_INC %10000001 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10000111 +COPY_WITH_MASK_IMM_AND_INC %10000111 +COPY_WITH_MASK_IMM %10011001 @block5 iny +BRANCH_IF_Y_IS_OFFSCREEN @block6 +RESET_HGR_HI_AND_INC_BY 1 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM %10011111 @block6 iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block7 +RESET_HGR_HI +COPY_WITH_MASK_IMM_AND_INC %11100110 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_BYTE_AND_INC +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_BYTE_AND_INC +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM %11100110 @block7 iny +BRANCH_IF_Y_IS_OFFSCREEN @switchtoaux +RESET_HGR_HI +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE @switchtoaux sta $C003 sta $C005 +BRANCH_IF_Y_IS_OFFSCREEN @block6_aux +RESET_HGR_HI +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE_AND_INC +COPY_BYTE @block6_aux dey +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block5_aux +RESET_HGR_HI +COPY_WITH_MASK_IMM_AND_INC %10110011 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_BYTE_AND_INC +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_BYTE_AND_INC +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM %10110011 @block5_aux dey +BRANCH_IF_Y_IS_OFFSCREEN @block4_aux +RESET_HGR_HI_AND_INC_BY 1 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM %11111100 @block4_aux dey +BRANCH_IF_Y_IS_OFFSCREEN @block3_aux +RESET_HGR_HI_AND_INC_BY 1 +COPY_WITH_MASK_IMM_AND_INC %11001100 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM %11001100 @block3_aux dey +BRANCH_IF_Y_IS_OFFSCREEN @block2_aux +RESET_HGR_HI_AND_INC_BY 2 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM_AND_INC %11110000 +COPY_WITH_MASK_IMM %11110000 @block2_aux dey +BRANCH_IF_Y_IS_OFFSCREEN @block1_aux +RESET_HGR_HI_AND_INC_BY 2 +COPY_WITH_MASK_IMM_AND_INC %10110000 +COPY_WITH_MASK_IMM_AND_INC %11000000 +COPY_WITH_MASK_IMM_AND_INC %11000000 +COPY_WITH_MASK_IMM %10110000 @block1_aux dey +BRANCH_IF_Y_IS_OFFSCREEN @switchtomain +RESET_HGR_HI_AND_INC_BY 3 +COPY_WITH_MASK_IMM_AND_INC %11000000 +COPY_WITH_MASK_IMM %11000000 @switchtomain sta $C002 sta $C004 iny dec row +LBPL RowLoop lda $c000 bmi @exit dec col dec counter +LBNE ColLoop @exit rts ; next table can not cross a page boundary !if <* > $E8 { !align 255, 0 } hgrrowlo !byte $00,$80,$00,$80,$00,$80,$00,$80 !byte $28,$A8,$28,$A8,$28,$A8,$28,$A8 !byte $50,$D0,$50,$D0,$50,$D0,$50,$D0 ; next table can not cross a page boundary !if <* > $E8 { !align 255, 0 } hgrrowhi !byte $40,$40,$41,$41,$42,$42,$43,$43 !byte $40,$40,$41,$41,$42,$42,$43,$43 !byte $40,$40,$41,$41,$42,$42,$43,$43 !if * > $6700 { !error "Code too large, adjust COPY_TO_AUXMEM macro" }