4cade/src/fx/fx.hgr.soft.r.a

249 lines
5.2 KiB
Plaintext
Raw Normal View History

2019-10-19 14:47:34 +00:00
;license:MIT
;(c) 2019 by 4am
;
!cpu 6502
!to "build/FX/SOFT.R",plain
*=$6000
y = $fc
row = $fd
col = $fe
counter = $ff
!source "src/fx/macros.a"
+INIT_MASKS sourcemasks1, copymasks1
+INIT_MASKS sourcemasks2, copymasks2
+INIT_MASKS sourcemasks3, copymasks3
+INIT_MASKS sourcemasks4, copymasks4
+INIT_MASKS sourcemasks5, copymasks5
+INIT_MASKS sourcemasks6, copymasks6
lda #(40+7-1) ; columns + blocks per row - 1
sta counter
lda #0
sta col
ColLoop
lda #23
sta row
2019-10-20 00:30:48 +00:00
jsr WaitForVBL
2019-10-19 14:47:34 +00:00
RowLoop
; [speedopt] calculate HGR base addresses once per row
lda row
asl
asl
asl
+HGR_CALC
ldy col
+IS_Y_OFFSCREEN
bcs @block2
; [speedopt] HGRBlockCopyWithMask but hardcoded for this block's masks
ldx #7
- lda ($26),y
and sourcemasks1,x
sta $00
lda ($3c),y
and copymasks1,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
; [speedopt] reset HGR base addresses instead of recalculating them from scratch
+RESET_HGR_CALC
@block2
dey
+IS_Y_OFFSCREEN
bcs @block3
ldx #7
- lda ($26),y
and sourcemasks2,x
sta $00
lda ($3c),y
and copymasks2,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
+RESET_HGR_CALC
@block3
dey
+IS_Y_OFFSCREEN
bcs @block4
ldx #7
- lda ($26),y
and sourcemasks3,x
sta $00
lda ($3c),y
and copymasks3,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
+RESET_HGR_CALC
@block4
dey
+IS_Y_OFFSCREEN
bcs @block5
ldx #7
- lda ($26),y
and sourcemasks4,x
sta $00
lda ($3c),y
and copymasks4,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
+RESET_HGR_CALC
@block5
dey
+IS_Y_OFFSCREEN
bcs @block6
ldx #7
- lda ($26),y
and sourcemasks5,x
sta $00
lda ($3c),y
and copymasks5,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
+RESET_HGR_CALC
@block6
dey
+IS_Y_OFFSCREEN
bcs @block7
ldx #7
- lda ($26),y
and sourcemasks6,x
sta $00
lda ($3c),y
and copymasks6,x
ora $00
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
+RESET_HGR_CALC
@block7
dey
+IS_Y_OFFSCREEN
bcs @nextrow
; [speedopt] HGRBlockCopy but inlined
ldx #7
- lda ($3c),y
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl -
; don't need RESET_HGR_CALC here because we're done with this row
@nextrow
dec row
+LBPL RowLoop
lda $c000
bmi @exit
inc col
dec counter
+LBNE ColLoop
@exit rts
sourcemasks1
!byte 0,0,0,0,0,0,0,0 ; SMC
sourcemasks2
!byte 0,0,0,0,0,0,0,0 ; SMC
sourcemasks3
!byte 0,0,0,0,0,0,0,0 ; SMC
sourcemasks4
!byte 0,0,0,0,0,0,0,0 ; SMC
sourcemasks5
!byte 0,0,0,0,0,0,0,0 ; SMC
sourcemasks6
!byte 0,0,0,0,0,0,0,0 ; SMC
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
!source "src/wait.a"
!source "src/fx/fx.hgr.common.a"
2019-10-20 00:30:48 +00:00
!source "src/fx/hw.vbl.a"