4cade/src/fx/fx.hgr.48boxes.common.a

561 lines
18 KiB
Plaintext
Raw Normal View History

2020-10-26 02:38:52 +00:00
;license:MIT
2020-10-24 22:44:39 +00:00
;(c) 2020 by 4am & qkumba
;
2020-10-26 02:31:08 +00:00
; The screen is separated into 48 boxes.
; Boxes are laid out in a grid, left-to-right, top-down:
;
; 0 1 2 3 4 5 6 7
; 8 9 10 11 12 13 14 15
; 16 17 18 19 20 21 22 23
; 24 25 26 27 28 29 30 31
; 32 33 34 35 36 37 38 39
; 40 41 42 43 44 45 46 47
;
; Each box is 35x32 pixels, so each row of each box is 5 consecutive
; bytes in memory once you calculate the HGR base address for that row.
;
; |BoxInitialStages| defines the initial grid of stages for each box.
2021-12-02 03:52:15 +00:00
; Each stage is used as an index into the |StagesHi| array
2020-10-26 04:52:58 +00:00
; to find the drawing routine for that stage (if any).
2020-10-26 02:31:08 +00:00
; Each box's stage is incremented after each iteration through the main loop.
; When the main loop iterates through all 48 boxes without drawing anything,
; the program exits.
;
; There are 16 clear routines that set certain bits to 0 (black),
; labeled clear00..clear0F. clear00 clears the inner-most box, and
; clear0F clears the outermost box (see diagram).
; There are 16 copy routines that copy certain bits from the source
; image on page 2 to the destination image on page 1, labeled copy00..copy0F.
;
; row| bits
; ---+---------------------------------------
; 00 |FFFFFFF|FFFFFFF|FFFFFFF|FFFFFFF|FFFFFFF
; 01 |FEEEEEE|EEEEEEE|EEEEEEE|EEEEEEE|EEEEEEF
; 02 |FEDDDDD|DDDDDDD|DDDDDDD|DDDDDDD|DDDDDEF
; 03 |FEDCCCC|CCCCCCC|CCCCCCC|CCCCCCC|CCCCDEF
; 04 |FEDCBBB|BBBBBBB|BBBBBBB|BBBBBBB|BBBCDEF
; 05 |FEDCBAA|AAAAAAA|AAAAAAA|AAAAAAA|AABCDEF
; 06 |FEDCBA9|9999999|9999999|9999999|9ABCDEF
; 07 |FEDCBA9|8888888|8888888|8888888|9ABCDEF
; ---+-------+-------+-------+-------+-------
; 08 |FEDCBA9|8777777|7777777|7777778|9ABCDEF
; 09 |FEDCBA9|8766666|6666666|6666678|9ABCDEF
; 0A |FEDCBA9|8765555|5555555|5555678|9ABCDEF
; 0B |FEDCBA9|8765444|4444444|4445678|9ABCDEF
; 0C |FEDCBA9|8765433|3333333|3345678|9ABCDEF
; 0D |FEDCBA9|8765432|2222222|2345678|9ABCDEF
; 0E |FEDCBA9|8765432|1111111|2345678|9ABCDEF
; 0F |FEDCBA9|8765432|1000001|2345678|9ABCDEF
; ---+-------+-------+-------+-------+-------
; 10 |FEDCBA9|8765432|1000001|2345678|9ABCDEF
; 11 |FEDCBA9|8765432|1111111|2345678|9ABCDEF
; 12 |FEDCBA9|8765432|2222222|2345678|9ABCDEF
; 13 |FEDCBA9|8765433|3333333|3345678|9ABCDEF
; 14 |FEDCBA9|8765444|4444444|4445678|9ABCDEF
; 15 |FEDCBA9|8765555|5555555|5555678|9ABCDEF
; 16 |FEDCBA9|8766666|6666666|6666678|9ABCDEF
; 17 |FEDCBA9|8777777|7777777|7777778|9ABCDEF
; ---+-------+-------+-------+-------+-------
; 18 |FEDCBA9|8888888|8888888|8888888|9ABCDEF
; 19 |FEDCBA9|9999999|9999999|9999999|9ABCDEF
; 1A |FEDCBAA|AAAAAAA|AAAAAAA|AAAAAAA|AABCDEF
; 1B |FEDCBBB|BBBBBBB|BBBBBBB|BBBBBBB|BBBCDEF
; 1C |FEDCCCC|CCCCCCC|CCCCCCC|CCCCCCC|CCCCDEF
; 1D |FEDDDDD|DDDDDDD|DDDDDDD|DDDDDDD|DDDDDEF
; 1E |FEEEEEE|EEEEEEE|EEEEEEE|EEEEEEE|EEEEEEF
; 1F |FFFFFFF|FFFFFFF|FFFFFFF|FFFFFFF|FFFFFFF
;
2020-10-24 22:44:39 +00:00
2020-10-26 14:37:53 +00:00
!ifndef USES_CLEAR {
2020-10-26 21:59:06 +00:00
; if an effect doesn't use any clear stages, you can reduce code size
; by setting USES_CLEAR=0 before including this file
2020-10-26 14:37:53 +00:00
USES_CLEAR = 1
}
2020-10-26 02:31:08 +00:00
src = $00 ; [word][must be at $00] used by drawing routines
dst = $02 ; [word] used by drawing routines
2020-10-26 14:37:53 +00:00
rowcount = $04 ; [byte] used by drawing routines
2021-12-02 23:17:39 +00:00
hgrhi = $200 ; [$C0 bytes] HGR base addresses
2020-10-26 02:31:08 +00:00
hgrlo = $300 ; [$C0 bytes] HGR base addresses
2021-12-02 23:17:39 +00:00
BoxesX = $90 ; [$30 bytes] starting row for each box
BoxesY = $C0 ; [$30 bytes] starting byte offset for each box
2020-10-26 02:31:08 +00:00
2020-10-26 21:59:06 +00:00
; High bytes of drawing routines for each stage (actual routines will be page-aligned).
; To minimize code size, we build drawing routines in this order:
; - copy01 (STAGE1 template)
; - copy00 (STAGE0 template)
; - copy0F..copy09 (OUTER_STAGE template)
; - copy08..copy02 (MIDDLE_STAGE template)
; - change some opcodes to turn the 'copy' routines into 'clear' routines
; - clear0F..clear08 (OUTER_STAGE)
; - clear07..clear02 (MIDDLE_STAGE)
; - clear01 (STAGE1)
; - clear00 (STAGE0)
2021-12-02 23:17:39 +00:00
clear00 = $80
clear01 = $81
clear02 = $82
clear03 = $83
clear04 = $84
clear05 = $85
clear06 = $86
clear07 = $87
clear08 = $88
clear09 = $89
clear0A = $8A
clear0B = $8B
clear0C = $8C
clear0D = $8D
clear0E = $8E
clear0F = $8F
copy02 = $90
copy03 = $91
copy04 = $92
copy05 = $93
copy06 = $94
copy07 = $95
copy08 = $96
copy09 = $97
copy0A = $98
copy0B = $99
copy0C = $9A
copy0D = $9B
copy0E = $9C
copy0F = $9D
copy00 = $9E
copy01 = $9F
2020-10-26 02:31:08 +00:00
; tokens for code generation
2020-10-26 21:59:06 +00:00
; used as indexes into |codegen_pieces| and |codegen_piece_lengths|,
; so keep all three in sync
k_rts = 0 ; must be 0
2020-10-26 02:31:08 +00:00
k_inx_and_recalc = 1
k_recalc = 2
k_recalc_and_iny = 3
2020-10-26 04:10:09 +00:00
k_stage_init = 4
k_maskcopy_pre = 5
k_maskcopy_post_and_iny = 6
k_maskcopy_post = 7
k_copy_and_iny = 8
k_copy = 9
k_dey2 = 10
k_iny2 = 11
k_middle_branches = 12
k_outer_branches = 13
k_edge_left_mask = 14
k_edge_right_mask = 15
k_left_mask = 16
k_right_mask = 17
2020-10-24 22:44:39 +00:00
!source "src/fx/macros.a"
; actual code starts here
2020-10-26 02:31:08 +00:00
2021-12-02 23:17:39 +00:00
; drawing routines for each stage are constructed dynamically
; and stored at copy00..copy0F and clear00..clear0F
jsr BuildDrawingRoutines
; set up zero page for drawing phase
; A=0 here
tax
- ldy start-5, x
sty $00, x
sta EndStagesHi, x
inx
bne -
; X=0 here
+BUILD_HGR_LOOKUP_TABLES_X_IS_ALREADY_0 hgrlo, hgrhi
2020-10-26 02:31:08 +00:00
; Generate |BoxesX| and |BoxesY| arrays
; BoxesX (starting row for each box)
; $00,$00,$00,$00,$00,$00,$00,$00
; $20,$20,$20,$20,$20,$20,$20,$20
; $40,$40,$40,$40,$40,$40,$40,$40
; $60,$60,$60,$60,$60,$60,$60,$60
; $80,$80,$80,$80,$80,$80,$80,$80
; $A0,$A0,$A0,$A0,$A0,$A0,$A0,$A0
; BoxesY (starting byte offset for each box)
; $00,$05,$0A,$0F,$14,$19,$1E,$23
; $00,$05,$0A,$0F,$14,$19,$1E,$23
; $00,$05,$0A,$0F,$14,$19,$1E,$23
; $00,$05,$0A,$0F,$14,$19,$1E,$23
; $00,$05,$0A,$0F,$14,$19,$1E,$23
; $00,$05,$0A,$0F,$14,$19,$1E,$23
2020-10-25 03:44:19 +00:00
ldx #48
ldy #$A0
lda #$23
pha
- tya
2020-10-26 02:31:08 +00:00
sta BoxesX-1, x
2020-10-25 03:44:19 +00:00
pla
2020-10-26 02:31:08 +00:00
sta BoxesY-1, x
2020-10-25 03:44:19 +00:00
sec
sbc #5
bcs +
lda #$23
+ pha
dex
txa
and #7
bne -
tya
sec
sbc #$20
tay
txa
bne -
pla
2021-12-02 23:17:39 +00:00
jmp MainLoop
2020-10-26 21:59:06 +00:00
; These are all the pieces of code we need to construct the drawing routines.
; There are 32 drawing routines (16 if USES_CLEAR=0), which we construct from
; four templates (below). Templates use tokens to refer to these code pieces.
; Note that several pieces overlap in order to minimize code size.
; Everything from CODEGEN_COPY_START and onward is copied to zero page for
; the code generation phase on program startup.
2020-10-26 04:10:09 +00:00
CODEGEN_COPY_START
2020-10-26 02:31:08 +00:00
!pseudopc 0 {
RTS0 ; 1 byte
2021-12-02 23:17:39 +00:00
rts
RTS0_E
2020-10-26 02:31:08 +00:00
INX_AND_RECALC ; 16 bytes
inx
RECALC_AND_INY ; 16 bytes
2020-10-26 04:10:09 +00:00
RECALC ; 15 bytes
2020-10-26 02:31:08 +00:00
lda hgrlo, x
2021-12-02 23:17:39 +00:00
sta <src
sta <dst
2020-10-26 02:31:08 +00:00
lda hgrhi, x
2021-12-02 23:17:39 +00:00
sta <dst+1
2020-10-26 02:31:08 +00:00
eor #$60
2021-12-02 23:17:39 +00:00
sta <src+1
RECALC_E
INX_AND_RECALC_E
2020-10-26 02:31:08 +00:00
iny
RECALC_AND_INY_E
2020-10-26 02:31:08 +00:00
STAGE_INIT ; 8 bytes
ROW_COUNT=*+1
2021-12-02 21:47:45 +00:00
ldx #$1F ; SMC
2021-12-02 23:17:39 +00:00
stx <rowcount
2020-10-26 02:31:08 +00:00
FIRST_ROW=*+1
2020-10-26 04:10:09 +00:00
adc #$0E ; SMC
2020-10-24 22:44:39 +00:00
tax
STAGE_INIT_E
2020-10-26 02:31:08 +00:00
MASKCOPY_PRE ; 5 bytes
2020-10-24 22:44:39 +00:00
lda (dst), y
2020-10-26 02:31:08 +00:00
BIT_FOR_CLEAR
eor (src), y
!byte $29 ; (AND #$44 opcode)
MASKCOPY_PRE_E
2020-10-26 02:31:08 +00:00
MASKCOPY_POST_AND_INY ; 5 bytes
MASKCOPY_POST ; 4 bytes
2020-10-24 22:44:39 +00:00
eor (dst), y
sta (dst), y
MASKCOPY_POST_E
2020-10-24 22:44:39 +00:00
iny
MASKCOPY_POST_AND_INY_E
2020-10-26 02:31:08 +00:00
COPY_AND_INY ; 5 bytes
COPY ; 4 bytes
2020-10-24 22:44:39 +00:00
lda (src), y
sta (dst), y
COPY_E
2020-10-26 02:31:08 +00:00
INY2 ; 2 bytes
2020-10-24 22:44:39 +00:00
iny
COPY_AND_INY_E
2020-10-24 22:44:39 +00:00
iny
INY2_E
2020-10-26 02:31:08 +00:00
DEY2 ; 2 bytes
2020-10-24 22:44:39 +00:00
dey
dey
DEY2_E
2020-10-26 02:31:08 +00:00
MIDDLE_BRANCHES ; 6 bytes
2021-12-02 23:17:39 +00:00
dec <rowcount
; these monsters avoid hard-coded branching
; trailing -2 for dec rowcount, -2 for branch itself
!byte $F0,MASKCOPY_PRE-MASKCOPY_PRE_E+EDGE_LEFT_MASK-EDGE_LEFT_MASK_E+MASKCOPY_POST_AND_INY-MASKCOPY_POST_AND_INY_E+COPY_AND_INY-COPY_AND_INY_E+MASKCOPY_PRE-MASKCOPY_PRE_E+EDGE_RIGHT_MASK-EDGE_RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+LEFT_MASK-LEFT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+INY2-INY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+RIGHT_MASK-RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+INX_AND_RECALC-INX_AND_RECALC_E-2-2
; another -2 for the previous branch as well
!byte $10,MASKCOPY_PRE-MASKCOPY_PRE_E+LEFT_MASK-LEFT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+INY2-INY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+RIGHT_MASK-RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+INX_AND_RECALC-INX_AND_RECALC_E-2-2-2
MIDDLE_BRANCHES_E
2020-10-26 02:31:08 +00:00
OUTER_BRANCHES ; 6 bytes
2021-12-02 23:17:39 +00:00
dec <rowcount
; these monsters avoid hard-coded branching
; trailing -2 for dec rowcount, -2 for branch itself
!byte $F0,MASKCOPY_PRE-MASKCOPY_PRE_E+EDGE_LEFT_MASK-EDGE_LEFT_MASK_E+MASKCOPY_POST_AND_INY-MASKCOPY_POST_AND_INY_E+COPY_AND_INY-COPY_AND_INY_E+COPY_AND_INY-COPY_AND_INY_E+COPY_AND_INY-COPY_AND_INY_E+MASKCOPY_PRE-MASKCOPY_PRE_E+EDGE_RIGHT_MASK-EDGE_RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+DEY2-DEY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+LEFT_MASK-LEFT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+INY2-INY2_E+INY2-INY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+RIGHT_MASK-RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+DEY2-DEY2_E+INX_AND_RECALC-INX_AND_RECALC_E-2-2
; another -2 for the previous branch as well
!byte $10,MASKCOPY_PRE-MASKCOPY_PRE_E+LEFT_MASK-LEFT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+INY2-INY2_E+INY2-INY2_E+MASKCOPY_PRE-MASKCOPY_PRE_E+RIGHT_MASK-RIGHT_MASK_E+MASKCOPY_POST-MASKCOPY_POST_E+DEY2-DEY2_E+DEY2-DEY2_E+INX_AND_RECALC-INX_AND_RECALC_E-2-2-2
OUTER_BRANCHES_E
2021-12-02 23:32:52 +00:00
EDGE_LEFT_MASK = $FC
EDGE_LEFT_MASK_E = $FD
EDGE_RIGHT_MASK = $FD
EDGE_RIGHT_MASK_E = $FE
LEFT_MASK = $FE
LEFT_MASK_E = $FF
RIGHT_MASK = $FF
RIGHT_MASK_E = $100
2020-10-26 02:31:08 +00:00
2020-10-26 21:59:06 +00:00
codegen_piece_lengths ; length of each of the pieces
!byte RTS0_E-RTS0
!byte INX_AND_RECALC_E-INX_AND_RECALC
!byte RECALC_E-RECALC
!byte RECALC_AND_INY_E-RECALC_AND_INY
!byte STAGE_INIT_E-STAGE_INIT
!byte MASKCOPY_PRE_E-MASKCOPY_PRE
!byte MASKCOPY_POST_AND_INY_E-MASKCOPY_POST_AND_INY
!byte MASKCOPY_POST_E-MASKCOPY_POST
!byte COPY_AND_INY_E-COPY_AND_INY
!byte COPY_E-COPY
!byte DEY2_E-DEY2
!byte INY2_E-INY2
!byte MIDDLE_BRANCHES_E-MIDDLE_BRANCHES
!byte OUTER_BRANCHES_E-OUTER_BRANCHES
!byte EDGE_LEFT_MASK_E-EDGE_LEFT_MASK
!byte EDGE_RIGHT_MASK_E-EDGE_RIGHT_MASK
!byte LEFT_MASK_E-LEFT_MASK
!byte RIGHT_MASK_E-RIGHT_MASK
2020-10-26 02:31:08 +00:00
2020-10-26 21:59:06 +00:00
codegen_pieces ; address of each of the pieces (on zero page, so 1 byte)
2020-10-26 02:31:08 +00:00
!byte <RTS0
!byte <INX_AND_RECALC
!byte <RECALC
!byte <RECALC_AND_INY
!byte <STAGE_INIT
!byte <MASKCOPY_PRE
!byte <MASKCOPY_POST_AND_INY
!byte <MASKCOPY_POST
!byte <COPY_AND_INY
!byte <COPY
!byte <DEY2
!byte <INY2
!byte <MIDDLE_BRANCHES
!byte <OUTER_BRANCHES
!byte <EDGE_LEFT_MASK
!byte <EDGE_RIGHT_MASK
!byte <LEFT_MASK
!byte <RIGHT_MASK
2020-10-24 22:44:39 +00:00
2020-10-26 21:59:06 +00:00
; Template for 'stage 0' routine (copy00), which copies the innermost
; part of the box (labeled '0' in diagram above).
2020-10-26 04:10:09 +00:00
STAGE0
!byte k_stage_init
2020-10-26 02:31:08 +00:00
!byte k_recalc
!byte k_iny2
2020-10-26 04:10:09 +00:00
!byte k_maskcopy_pre, k_left_mask, k_maskcopy_post
!byte k_inx_and_recalc
!byte k_maskcopy_pre, k_left_mask, k_maskcopy_post
2020-10-26 21:59:06 +00:00
!byte k_rts ; also serves as an end-of-template marker
; Template for 'stage 1' routine (copy01), which copies the pixels
; around the innermost box (labeled '1' in diagram above).
2020-10-26 04:10:09 +00:00
STAGE1
!byte k_stage_init
2020-10-26 02:31:08 +00:00
!byte k_recalc
2020-10-26 04:10:09 +00:00
!byte k_iny2
!byte k_copy
!byte k_inx_and_recalc
!byte k_copy
!byte k_inx_and_recalc
!byte k_copy
!byte k_inx_and_recalc
!byte k_copy
2020-10-26 21:59:06 +00:00
!byte k_rts ; also serves as an end-of-template marker
; Template for stages 2-8 (copy02..copy08)
2020-10-26 02:31:08 +00:00
MIDDLE_STAGE
!byte k_stage_init
!byte k_recalc_and_iny
!byte k_maskcopy_pre, k_edge_left_mask, k_maskcopy_post_and_iny
!byte k_copy_and_iny
!byte k_maskcopy_pre, k_edge_right_mask, k_maskcopy_post
!byte k_dey2
!byte k_maskcopy_pre, k_left_mask, k_maskcopy_post
!byte k_iny2
!byte k_maskcopy_pre, k_right_mask, k_maskcopy_post
!byte k_dey2
!byte k_inx_and_recalc
!byte k_middle_branches
2020-10-26 21:59:06 +00:00
!byte k_rts ; also serves as an end-of-template marker
; Template for stages 9-15 (copy09..copy0F)
2020-10-24 22:44:39 +00:00
OUTER_STAGE
2020-10-26 02:31:08 +00:00
!byte k_stage_init
!byte k_recalc
!byte k_maskcopy_pre, k_edge_left_mask, k_maskcopy_post_and_iny
!byte k_copy_and_iny
!byte k_copy_and_iny
!byte k_copy_and_iny
!byte k_maskcopy_pre, k_edge_right_mask, k_maskcopy_post
!byte k_dey2
!byte k_dey2
!byte k_maskcopy_pre, k_left_mask, k_maskcopy_post
!byte k_iny2
!byte k_iny2
!byte k_maskcopy_pre, k_right_mask, k_maskcopy_post
!byte k_dey2
!byte k_dey2
!byte k_inx_and_recalc
!byte k_outer_branches
2020-10-26 21:59:06 +00:00
!byte k_rts ; also serves as an end-of-template marker
2020-10-26 02:31:08 +00:00
2020-10-24 22:44:39 +00:00
EdgeRightMasks
!byte %10000001
!byte %10000011
!byte %10000111
!byte %10001111
!byte %10011111
!byte %10111111
!byte %11111111
LeftMasks
!byte %11000000
!byte %10100000
!byte %10010000
!byte %10001000
!byte %10000100
!byte %10000010
RightMasks
2020-10-26 02:31:08 +00:00
!byte %10000001 ; also the last item in LeftMasks
2020-10-24 22:44:39 +00:00
!byte %10000010
!byte %10000100
!byte %10001000
!byte %10010000
!byte %10100000
2020-10-26 02:31:08 +00:00
EdgeLeftMasks
!byte %11000000 ; also the last item in RightMasks
!byte %11100000
!byte %11110000
!byte %11111000
!byte %11111100
!byte %11111110
2020-10-26 04:10:09 +00:00
!byte %11111111
2020-10-26 04:38:16 +00:00
codegen_stage
!byte 27
codegen_maskindex
!byte 0
2020-10-26 14:37:53 +00:00
BuildDrawingRoutineFrom
sta <codegen_token_src
BuildDrawingRoutine
ldy #0
sty <codegen_token_x
BuildTokenLoop
2020-10-26 04:38:16 +00:00
codegen_token_x=*+1
ldx #$00
codegen_token_src=*+1
lda <OUTER_STAGE, x
inc <codegen_token_x
2020-10-26 14:37:53 +00:00
pha
tax
lda <codegen_piece_lengths, x
sta <piece_length
lda <codegen_pieces, x
sta <piece_src
ldx #0
BuildPieceLoop
piece_src=*+1
lda $FD, x ; SMC
2020-10-26 04:38:16 +00:00
!byte $99,$00 ; STA $4400, Y
codegen_dst
2020-10-26 21:59:06 +00:00
!byte copy01 ; SMC
2020-10-26 14:37:53 +00:00
iny
inx
piece_length=*+1
cpx #$FD ; SMC
bcc BuildPieceLoop
pla
bne BuildTokenLoop
dec <codegen_dst
inc <FIRST_ROW
2020-10-26 04:38:16 +00:00
rts
2020-10-26 02:31:08 +00:00
}
2020-10-24 22:44:39 +00:00
2020-10-26 21:59:06 +00:00
BuildDrawingRoutines
2020-10-26 14:37:53 +00:00
; copy codegen data to zero page
2021-12-02 23:17:39 +00:00
ldx #0
2020-10-26 14:37:53 +00:00
- lda CODEGEN_COPY_START, x
sta $00, x
inx
bne -
; generate drawing routines for copy01, then copy00
2020-10-26 21:59:06 +00:00
jsr BuildStage1And0
2020-10-26 14:37:53 +00:00
; A=0 here
sta <FIRST_ROW
; generate drawing routines for copy0F..copy02, then clear0F..clear02
lda #<MIDDLE_STAGE
--- eor #(<OUTER_STAGE XOR <MIDDLE_STAGE)
sta <codegen_token_src
ldx #6
-- stx <codegen_maskindex
lda <EdgeLeftMasks, x
sta <EDGE_LEFT_MASK
lda <EdgeRightMasks, x
sta <EDGE_RIGHT_MASK
lda <LeftMasks, x
sta <LEFT_MASK
lda <RightMasks, x
sta <RIGHT_MASK
jsr BuildDrawingRoutine
dec <ROW_COUNT
dec <ROW_COUNT
dec <codegen_stage
2020-10-26 21:59:06 +00:00
bmi BuildStage1And0
2020-10-26 14:37:53 +00:00
lda <codegen_stage
eor #13
bne +
!if USES_CLEAR {
; reset counts and switch from copy to clear
sta <FIRST_ROW
lda #$1F
sta <ROW_COUNT
lda #$A9
sta <COPY
lda #$24
sta <BIT_FOR_CLEAR
} else {
rts
}
+ lda <codegen_token_src
ldx <codegen_maskindex
dex
bmi ---
bpl -- ; always branches
2020-10-26 21:59:06 +00:00
; generate drawing routines for copy01, copy00 (or clear01, clear00)
BuildStage1And0
2020-10-26 14:37:53 +00:00
lda #%10111110
sta <LEFT_MASK
lda #<STAGE1
jsr BuildDrawingRoutineFrom
lda #<STAGE0
jmp BuildDrawingRoutineFrom
2021-12-02 23:17:39 +00:00
start
!pseudopc 5 {
MainLoop ldx #47
BoxLoop ldy <BoxStages, x ; for each box, get its current stage
inc <BoxStages, x ; increment every box's stage every time through the loop
lda StagesHi, y
beq <NextBox ; if stage's drawing routine is 0, nothing to do
sta <j+2
lda <BoxesX, x ; A = starting HGR row for this box
ldy <BoxesY, x ; Y = starting byte offset for this box
clc
stx <ReBox+1
j jsr $0000 ; [SMC] call drawing routine for this stage
ReBox ldx #$FD ; [SMC]
NextBox dex
bpl <BoxLoop
lda <j+2
bpl + ; if we didn't draw anything in any box, we're done
lda $C000
sta <j+2
bpl <MainLoop
+ rts
BoxStages
}
2020-10-24 22:44:39 +00:00
BoxInitialStages