;license:MIT ;(c) 2019-2020 by 4am ; !cpu 6502 !to "build/FX/DHGR.SOFT.DIAG",plain *=$6000 src = $C9 dst = $CB y = $CD col = $CE counter = $CF zphgrrowlo = $D0 zphgrrowhi = $E8 !macro INC_HGR_HI_BY .blocks { lda dst+1 adc #(.blocks*4) sta dst+1 eor #$60 sta src+1 } !macro INC_HGR_HI { +INC_HGR_HI_BY 1 } !macro RESET_HGR_HI { lda zphgrrowhi, x sta dst+1 eor #$60 sta src+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 +INC_HGR_HI } !macro COPY_BYTE { lda (src), y sta (dst), y } !macro COPY_BYTE_AND_INC { +COPY_BYTE +INC_HGR_HI } !source "src/fx/macros.a" !source "src/fx/fx.dhgr.common.a" +COPY_SELF_TO_AUXMEM ldx #$30 - lda hgrrowlo-1, x sta zphgrrowlo-1, x dex bne - lda #(40+24+7-1) ; columns + rows + blocks per row - 1 sta counter lda #39 sta col ColLoop ldx #23 ldy col sty y RowLoop lda zphgrrowlo, x sta src sta dst +RESET_HGR_HI tya +BRANCH_IF_Y_IS_OFFSCREEN @block2 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_BY 3 +COPY_WITH_MASK_IMM_AND_INC %10000001 +COPY_WITH_MASK_IMM_AND_INC %10000001 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block2 iny +BRANCH_IF_Y_IS_OFFSCREEN @block3 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_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_AND_INC %10010110 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block3 iny +BRANCH_IF_Y_IS_OFFSCREEN @block4 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_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_AND_INC %10000111 ; +COPY_WITH_MASK_IMM_AND_INC %10000000 ; +COPY_WITH_MASK_IMM %10000000 +RESET_HGR_HI @block4 iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block5 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI +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_AND_INC %10011001 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block5 iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block6 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI +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_AND_INC %10011111 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block6 iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block7 +COPY_WITH_MASK_IMM_AND_INC %11100110 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %11111111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %11111111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM_AND_INC %10011111 +COPY_WITH_MASK_IMM %11100110 +RESET_HGR_HI @block7 iny +BRANCH_IF_Y_IS_OFFSCREEN @switchtoaux +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 +RESET_HGR_HI @switchtoaux sta $C003 sta $C005 ldy y +BRANCH_IF_Y_IS_OFFSCREEN @block2_aux ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_BY 3 +COPY_WITH_MASK_IMM_AND_INC %11000000 +COPY_WITH_MASK_IMM_AND_INC %11000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block2_aux iny +BRANCH_IF_Y_IS_OFFSCREEN @block3_aux ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_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_AND_INC %10110000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block3_aux iny +BRANCH_IF_Y_IS_OFFSCREEN @block4_aux ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI_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_AND_INC %11110000 ; +COPY_WITH_MASK_IMM_AND_INC %00000000 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block4_aux iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block5_aux ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI +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_AND_INC %11001100 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block5_aux iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block6_aux ; +COPY_WITH_MASK_IMM_AND_INC %00000000 +INC_HGR_HI +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_AND_INC %11111100 ; +COPY_WITH_MASK_IMM %00000000 +RESET_HGR_HI @block6_aux iny +LONG_BRANCH_IF_Y_IS_OFFSCREEN @block7_aux +COPY_WITH_MASK_IMM_AND_INC %10110011 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111111 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111111 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM_AND_INC %11111100 +COPY_WITH_MASK_IMM %10110011 +RESET_HGR_HI @block7_aux iny +BRANCH_IF_Y_IS_OFFSCREEN @switchtomain +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 @switchtomain sta $C002 sta $C004 ldy y iny sty y dex +LBPL RowLoop lda $c000 bmi @exit dec col dec counter +LBNE ColLoop @exit rts 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 hgrrowhi !byte $20,$20,$21,$21,$22,$22,$23,$23 !byte $20,$20,$21,$21,$22,$22,$23,$23 !byte $20,$20,$21,$21,$22,$22,$23,$23