4cade/src/fx/fx.dhgr.soft.diagonal.a

382 lines
7.6 KiB
Plaintext
Raw Normal View History

2020-11-20 23:17:06 +00:00
;license:MIT
;(c) 2019-2020 by 4am
;
!cpu 6502
!to "build/FX/DHGR.SOFT.DIAG",plain
*=$6000
2020-11-21 04:59:45 +00:00
y = $9C
row = $9D
col = $9E
counter = $9F
zpcopymasks1 = $A0
zpcopymasks2 = $A8
zpcopymasks3 = $B0
zpcopymasks4 = $B8
zpcopymasks5 = $C0
zpcopymasks6 = $C8
zpcopymasks1_aux = $D0
zpcopymasks2_aux = $D8
zpcopymasks3_aux = $E0
zpcopymasks4_aux = $E8
zpcopymasks5_aux = $F0
zpcopymasks6_aux = $F8
2020-11-21 05:11:40 +00:00
hgrlo = $BE00 ; [$C0 bytes, main memory only]
hgr1hi = $BF00 ; [$C0 bytes, main memory only]
2020-11-20 23:17:06 +00:00
!macro RESET_HGR_CALC_BY_7 {
2020-11-21 05:11:40 +00:00
lda hgr1hi, x
2020-11-20 23:17:06 +00:00
sta $27
eor #$60
sta $3d
}
2020-11-21 04:59:45 +00:00
; .copymask must be in zero page and must be the exact address
; (it is not indexed by X)
2020-11-21 04:33:59 +00:00
!macro COPY_BIT_BY .src1, .dest1, .copymask {
2020-11-21 04:59:45 +00:00
lda <.copymask
beq +
2020-11-21 04:33:59 +00:00
lda (.src1),y
eor (.dest1),y ; merge source and destination bits
2020-11-21 04:59:45 +00:00
and <.copymask ; isolate the bits to replace, zero the rest
2020-11-21 04:33:59 +00:00
eor (.dest1),y ; unmerge source and destination bits, leaves 'to keep' destination bits intact
sta (.dest1),y ; write the result
2020-11-21 04:59:45 +00:00
+
2020-11-21 04:33:59 +00:00
}
2020-11-20 23:17:06 +00:00
!source "src/fx/macros.a"
!source "src/fx/fx.dhgr.common.a"
2020-11-21 04:59:45 +00:00
ldx #$60
- lda copymasks1-1, x
sta zpcopymasks1-1, x
2020-11-20 23:17:06 +00:00
dex
bne -
+BUILD_HGR_LOOKUP_TABLES_X_IS_ALREADY_0 hgrlo, hgr1hi
2020-11-21 05:11:40 +00:00
+COPY_SELF_TO_AUXMEM
2020-11-20 23:17:06 +00:00
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
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
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks1+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block2
iny
+IS_Y_OFFSCREEN
+LBCS @block3
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks2+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block3
iny
+IS_Y_OFFSCREEN
+LBCS @block4
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks3+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block4
iny
+IS_Y_OFFSCREEN
+LBCS @block5
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks4+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block5
iny
+IS_Y_OFFSCREEN
+LBCS @block6
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks5+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block6
iny
+IS_Y_OFFSCREEN
+LBCS @block7
!for i, 0, 7 {
2020-11-21 04:59:45 +00:00
+COPY_BIT_BY $3c, $26, zpcopymasks6+i
2020-11-20 23:17:06 +00:00
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block7
iny
+IS_Y_OFFSCREEN
+LBCS @nextrow
!for i, 0, 7 {
lda ($3c),y
sta ($26),y
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@nextrow
sta $C003
sta $C005
2020-11-21 04:59:45 +00:00
ldy y
+IS_Y_OFFSCREEN
+LBCS @block2_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks1_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block2_aux
iny
+IS_Y_OFFSCREEN
+LBCS @block3_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks2_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block3_aux
iny
+IS_Y_OFFSCREEN
+LBCS @block4_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks3_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block4_aux
iny
+IS_Y_OFFSCREEN
+LBCS @block5_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks4_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block5_aux
iny
+IS_Y_OFFSCREEN
+LBCS @block6_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks5_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block6_aux
iny
+IS_Y_OFFSCREEN
+LBCS @block7_aux
!for i, 0, 7 {
+COPY_BIT_BY $3c, $26, zpcopymasks6_aux+i
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
+RESET_HGR_CALC_BY_7
@block7_aux
iny
+IS_Y_OFFSCREEN
+LBCS @nextrow_aux
!for i, 0, 7 {
lda ($3c),y
sta ($26),y
!if i < 7 {
+HGR_INC_WITHIN_BLOCK
}
}
@nextrow_aux
2020-11-20 23:17:06 +00:00
sta $C002
sta $C004
ldy y
iny
sty y
dec row
+LBPL RowLoop
lda $c000
bmi @exit
dec col
dec counter
+LBNE ColLoop
@exit rts
;1GFEDCBA ->
;1GGFFEED (main) +
;1DCCBBAA (aux)
copymasks1
!byte %00000000
!byte %00000000
!byte %00000000
!byte %10000001
!byte %10000001
!byte %00000000
!byte %00000000
!byte %00000000
copymasks2
!byte %00000000
!byte %00000000
!byte %10000110
!byte %10000001
!byte %10000001
!byte %10010110
!byte %00000000
!byte %00000000
copymasks3
!byte %00000000
!byte %00000000
!byte %10000111
!byte %10000111
!byte %10000111
!byte %10000111
!byte %10000000
!byte %10000000
copymasks4
!byte %00000000
!byte %10011001
!byte %10000001
!byte %10011111
!byte %10000111
!byte %10000111
!byte %10011001
!byte %00000000
copymasks5
!byte %00000000
!byte %10011111
!byte %10011111
!byte %10011111
!byte %10011111
!byte %10011111
!byte %10011111
!byte %00000000
copymasks6
!byte %11100110
!byte %10011111
!byte %11111111
!byte %10011111
!byte %11111111
!byte %10011111
!byte %10011111
!byte %11100110
copymasks1_aux
!byte %00000000
!byte %00000000
!byte %00000000
!byte %11000000
!byte %11000000
!byte %00000000
!byte %00000000
!byte %00000000
copymasks2_aux
!byte %00000000
!byte %00000000
!byte %10110000
!byte %11000000
!byte %11000000
!byte %10110000
!byte %00000000
!byte %00000000
copymasks3_aux
!byte %00000000
!byte %00000000
!byte %11110000
!byte %11110000
!byte %11110000
!byte %11110000
!byte %00000000
!byte %00000000
copymasks4_aux
!byte %00000000
!byte %11001100
!byte %11110000
!byte %11111100
!byte %11110000
!byte %11110000
!byte %11001100
!byte %00000000
copymasks5_aux
!byte %00000000
!byte %11111100
!byte %11111100
!byte %11111100
!byte %11111100
!byte %11111100
!byte %11111100
!byte %00000000
copymasks6_aux
!byte %10110011
!byte %11111100
!byte %11111111
!byte %11111100
!byte %11111111
!byte %11111100
!byte %11111100
!byte %10110011