2020-11-20 23:17:06 +00:00
|
|
|
;license:MIT
|
|
|
|
;(c) 2019-2020 by 4am
|
|
|
|
;
|
|
|
|
!cpu 6502
|
2021-10-16 01:34:39 +00:00
|
|
|
!to "build/FX.INDEXED/DHGR.SOFT.DIAG",plain
|
2020-11-20 23:17:06 +00:00
|
|
|
*=$6000
|
|
|
|
|
2020-11-21 22:41:19 +00:00
|
|
|
src = $F0
|
|
|
|
dst = $F2
|
2020-11-21 23:26:19 +00:00
|
|
|
row = $FD
|
2020-11-21 22:41:19 +00:00
|
|
|
col = $FE
|
|
|
|
counter = $FF
|
2020-11-20 23:17:06 +00:00
|
|
|
|
2020-11-22 02:07:09 +00:00
|
|
|
!macro SET_HGR_HI_WITH_OFFSET .offset {
|
|
|
|
!if .offset > 0 {
|
|
|
|
adc #(.offset*4)
|
2020-11-21 06:52:04 +00:00
|
|
|
}
|
2020-11-22 00:02:58 +00:00
|
|
|
sta src+1
|
|
|
|
eor #$60
|
|
|
|
sta dst+1
|
2020-11-21 06:52:04 +00:00
|
|
|
}
|
|
|
|
|
2020-11-22 02:07:09 +00:00
|
|
|
!macro RESET_HGR_HI_WITH_OFFSET .offset {
|
2020-11-21 22:17:19 +00:00
|
|
|
txa
|
2020-11-22 02:07:09 +00:00
|
|
|
+SET_HGR_HI_WITH_OFFSET .offset
|
2020-11-21 06:52:04 +00:00
|
|
|
}
|
|
|
|
|
2020-11-22 02:07:09 +00:00
|
|
|
!macro COPY_WITH_MASK .copymask {
|
2020-11-21 06:52:04 +00:00
|
|
|
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
|
|
|
|
}
|
2020-11-22 02:07:09 +00:00
|
|
|
|
|
|
|
; note: .copymask is an immediate value, not an indexed array or a memory address
|
|
|
|
!macro COPY_WITH_OFFSET_AND_MASK .offset, .copymask {
|
|
|
|
+RESET_HGR_HI_WITH_OFFSET .offset
|
|
|
|
+COPY_WITH_MASK .copymask
|
2020-11-21 06:52:04 +00:00
|
|
|
}
|
|
|
|
|
2020-11-22 02:07:09 +00:00
|
|
|
!macro COPY_BYTE .offset {
|
|
|
|
+RESET_HGR_HI_WITH_OFFSET .offset
|
2020-11-21 06:52:04 +00:00
|
|
|
lda (src), y
|
|
|
|
sta (dst), y
|
2020-11-20 23:17:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
!source "src/fx/macros.a"
|
|
|
|
!source "src/fx/fx.dhgr.common.a"
|
|
|
|
|
2020-11-22 05:50:43 +00:00
|
|
|
exit=*+3
|
2020-11-22 04:08:41 +00:00
|
|
|
+COPY_TO_AUXMEM $60, $07
|
2020-11-20 23:17:06 +00:00
|
|
|
|
2020-11-22 05:50:43 +00:00
|
|
|
lda #(40+24+7) ; columns + rows + blocks per row
|
2020-11-20 23:17:06 +00:00
|
|
|
sta counter
|
|
|
|
|
2020-11-22 05:50:43 +00:00
|
|
|
lda #40
|
2020-11-20 23:17:06 +00:00
|
|
|
sta col
|
2020-11-22 05:50:43 +00:00
|
|
|
|
2020-11-20 23:17:06 +00:00
|
|
|
ColLoop
|
2020-11-22 05:50:43 +00:00
|
|
|
lda $c000
|
|
|
|
bmi exit
|
|
|
|
dec col
|
|
|
|
dec counter
|
|
|
|
beq exit
|
|
|
|
|
|
|
|
lda #24
|
2020-11-21 22:17:19 +00:00
|
|
|
sta row
|
2020-11-20 23:17:06 +00:00
|
|
|
ldy col
|
|
|
|
RowLoop
|
2020-11-22 05:50:43 +00:00
|
|
|
dec row
|
|
|
|
bmi ColLoop
|
2020-11-21 22:17:19 +00:00
|
|
|
ldx row
|
2020-11-21 22:41:19 +00:00
|
|
|
lda hgrrowlo, x
|
2020-11-21 06:52:04 +00:00
|
|
|
sta src
|
|
|
|
sta dst
|
2020-11-21 22:41:19 +00:00
|
|
|
lda hgrrowhi, x
|
2020-11-22 02:07:09 +00:00
|
|
|
tax ; X = high byte of src throughout RowLoop
|
2020-11-22 04:08:41 +00:00
|
|
|
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block2
|
2020-11-22 02:07:09 +00:00
|
|
|
+SET_HGR_HI_WITH_OFFSET 3
|
|
|
|
+COPY_WITH_MASK %10000001
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %10000001
|
2020-11-22 04:08:41 +00:00
|
|
|
@block2
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block3
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %10000110
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %10000001
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %10000001
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10010110
|
2020-11-22 04:08:41 +00:00
|
|
|
@block3
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block4
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %10000111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %10000111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %10000111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10000111
|
2020-11-22 04:08:41 +00:00
|
|
|
@block4
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block5
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %10011001
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %10000001
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %10000111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10000111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %10011001
|
2020-11-22 04:08:41 +00:00
|
|
|
@block5
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block6
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %10011111
|
2020-11-22 04:08:41 +00:00
|
|
|
@block6
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+LONG_BRANCH_IF_Y_IS_OFFSCREEN @block7
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_WITH_OFFSET_AND_MASK 0, %11100110
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %10011111
|
|
|
|
+COPY_BYTE 2
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %10011111
|
|
|
|
+COPY_BYTE 4
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %10011111
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 7, %11100110
|
2020-11-22 04:08:41 +00:00
|
|
|
@block7
|
2020-11-20 23:17:06 +00:00
|
|
|
iny
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @switchtoaux
|
2020-11-22 02:07:09 +00:00
|
|
|
+COPY_BYTE 0
|
|
|
|
+COPY_BYTE 1
|
|
|
|
+COPY_BYTE 2
|
|
|
|
+COPY_BYTE 3
|
|
|
|
+COPY_BYTE 4
|
|
|
|
+COPY_BYTE 5
|
|
|
|
+COPY_BYTE 6
|
|
|
|
+COPY_BYTE 7
|
2020-11-22 04:08:41 +00:00
|
|
|
@switchtoaux
|
2020-11-20 23:17:06 +00:00
|
|
|
sta $C003
|
|
|
|
sta $C005
|
2020-11-22 04:08:41 +00:00
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block6_aux
|
2020-11-22 04:02:16 +00:00
|
|
|
+COPY_BYTE 0
|
|
|
|
+COPY_BYTE 1
|
|
|
|
+COPY_BYTE 2
|
|
|
|
+COPY_BYTE 3
|
|
|
|
+COPY_BYTE 4
|
|
|
|
+COPY_BYTE 5
|
|
|
|
+COPY_BYTE 6
|
|
|
|
+COPY_BYTE 7
|
2020-11-22 04:08:41 +00:00
|
|
|
@block6_aux
|
|
|
|
dey
|
|
|
|
+LONG_BRANCH_IF_Y_IS_OFFSCREEN @block5_aux
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 0, %10110011
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %11111100
|
|
|
|
+COPY_BYTE 2
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11111100
|
|
|
|
+COPY_BYTE 4
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 7, %10110011
|
|
|
|
@block5_aux
|
|
|
|
dey
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block4_aux
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %11111100
|
|
|
|
@block4_aux
|
|
|
|
dey
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block3_aux
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 1, %11001100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11111100
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 6, %11001100
|
|
|
|
@block3_aux
|
|
|
|
dey
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block2_aux
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %11110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %11110000
|
|
|
|
@block2_aux
|
|
|
|
dey
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @block1_aux
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 2, %10110000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11000000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %11000000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 5, %10110000
|
|
|
|
@block1_aux
|
|
|
|
dey
|
|
|
|
+BRANCH_IF_Y_IS_OFFSCREEN @switchtomain
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 3, %11000000
|
|
|
|
+COPY_WITH_OFFSET_AND_MASK 4, %11000000
|
|
|
|
@switchtomain
|
2020-11-20 23:17:06 +00:00
|
|
|
sta $C002
|
|
|
|
sta $C004
|
2020-11-22 04:08:41 +00:00
|
|
|
iny
|
2020-11-22 05:50:43 +00:00
|
|
|
jmp RowLoop
|
2020-11-20 23:17:06 +00:00
|
|
|
|
2020-11-21 22:41:19 +00:00
|
|
|
; next table can not cross a page boundary
|
|
|
|
!if <* > $E8 {
|
|
|
|
!align 255, 0
|
|
|
|
}
|
2020-11-21 05:35:20 +00:00
|
|
|
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
|
2020-11-21 22:41:19 +00:00
|
|
|
|
|
|
|
; next table can not cross a page boundary
|
|
|
|
!if <* > $E8 {
|
|
|
|
!align 255, 0
|
|
|
|
}
|
2020-11-21 05:35:20 +00:00
|
|
|
hgrrowhi
|
2020-11-21 23:37:44 +00:00
|
|
|
!byte $40,$40,$41,$41,$42,$42,$43,$43
|
|
|
|
!byte $40,$40,$41,$41,$42,$42,$43,$43
|
|
|
|
!byte $40,$40,$41,$41,$42,$42,$43,$43
|
2020-11-21 22:41:19 +00:00
|
|
|
|
2020-11-22 04:08:41 +00:00
|
|
|
!if * > $6700 {
|
2020-11-21 22:41:19 +00:00
|
|
|
!error "Code too large, adjust COPY_TO_AUXMEM macro"
|
|
|
|
}
|