dos33fsprogs/graphics/hgr/wipes/diamond_stripes/fx.hgr.diamond.stripes.s
2024-11-12 00:44:26 -05:00

154 lines
4.1 KiB
ArmAsm

;license:MIT
;(c) 2021 by 4am
;
;!cpu 6502
;!to "build/FX.INDEXED/DIAMOND.STRIPES",plain
;*=$6000
;hgrlo = $0201 ; [$C0 bytes] HGR base addresses (defined in constants.a)
;hgrhi = $0301 ; [$C0 bytes] HGR base addresses (defined in constants.a)
src = $F0
dst = $F2
row1 = $F4
row2 = $F5
mask1 = $F6
mask2 = $F7
; !source "src/fx/macros.a"
; !source "src/constants.a"
.include "../macros.s"
.include "../constants.s"
do_wipe_diamond_stripes:
jsr BuildHGRTables
; jsr iBuildHGRTables
lda #$00
sta row1
lda #$C0
sta row2
lda #0
sta mask1
ldy #15
sty mask2
dsm1: lda copymasks_even2, y
eor #$7F
sta copymasks_even1, y
lda copymasks_odd2, y
eor #$7F
sta copymasks_odd1, y
dey
bpl dsm1
RowLoop:
ldx row1
lda hgrlo, x
sta src
sta dst
lda hgrhi, x
sta dst+1
eor #$60
sta src+1
ldx mask1
ldy #39
dsm2: lda (src), y
eor (dst), y ; merge source and destination bits
and copymasks_odd1, x ; 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
dey
lda (src), y
eor (dst), y ; merge source and destination bits
and copymasks_even1, x ; 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
dey
bpl dsm2
ldx row2
lda hgrlo-1, x ; row2 is off-by-1 so we can use a BEQ to terminate
sta src
sta dst
lda hgrhi-1, x
sta dst+1
eor #$60
sta src+1
ldx mask2
ldy #39
dsm3: lda (src), y
eor (dst), y ; merge source and destination bits
and copymasks_odd2, x ; 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
dey
lda (src), y
eor (dst), y ; merge source and destination bits
and copymasks_even2, x ; 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
dey
bpl dsm3
inc mask1
lda mask1
cmp #16
bne dsp1
lda #0
sta mask1
dsp1:
dec mask2
bpl dsp2
lda #15
sta mask2
dsp2:
bit KBD
bmi Exit
inc row1
dec row2
LBNE RowLoop
Exit: rts
copymasks_even2:
.byte %10000000
.byte %11000000
.byte %11100000
.byte %11110000
.byte %11111000
.byte %11111100
.byte %11111110
.byte %11111111
.byte %11111111
.byte %11111110
.byte %11111100
.byte %11111000
.byte %11110000
.byte %11100000
.byte %11000000
.byte %10000000
copymasks_odd2:
.byte %10000000
.byte %10000001
.byte %10000011
.byte %10000111
.byte %10001111
.byte %10011111
.byte %10111111
.byte %11111111
.byte %11111111
.byte %10111111
.byte %10011111
.byte %10001111
.byte %10000111
.byte %10000011
.byte %10000001
.byte %10000000
copymasks_even1=*
copymasks_odd1=*+16