4sports/src/fx/fx.hgr.soft.diagonal.a
2022-08-22 22:04:55 -04:00

227 lines
4.3 KiB
Plaintext

;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