mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2025-02-18 07:30:30 +00:00
271 lines
6.7 KiB
ArmAsm
271 lines
6.7 KiB
ArmAsm
; Large, unrolled loops for setting values in the code field that would be used by the Horz.s
|
|
; and Vert.s code.
|
|
;
|
|
; The utility of these functions is that they do not need to do any sort of bank switching and
|
|
; can update all of the play field lines in a single call. The downside is that they take up
|
|
; significantly more space, need large auxiliary tables, and must be patched after the code
|
|
; field memory is allocated.
|
|
;
|
|
; Probably still worth it....
|
|
|
|
BlitBuff EXT
|
|
|
|
; Patch the fast copy routines with the allocated memory addresses
|
|
InitFastCopies
|
|
|
|
; Fist, patch the cttc routine
|
|
|
|
ldy #0
|
|
ldx #0
|
|
|
|
:loop1
|
|
lda BlitBuff+2,y ; Get the bank of each in the accumulatow low byte
|
|
|
|
sep #$20
|
|
]line equ 0
|
|
lup 16
|
|
stal cttc_start+{]line*7}+4,x
|
|
stal cttc_start+{{]line+208}*7}+4,x
|
|
]line equ ]line+1
|
|
--^
|
|
rep #$20
|
|
|
|
txa
|
|
clc
|
|
adc #7*16
|
|
tax
|
|
|
|
tya
|
|
clc
|
|
adc #4
|
|
tay
|
|
|
|
cpy #13*4
|
|
bcs *+5
|
|
brl :loop1
|
|
|
|
; Next, patch the two store routines
|
|
|
|
ldy #0
|
|
ldx #0
|
|
|
|
:loop2
|
|
lda BlitBuff+2,y ; Get the bank of each in the accumulatow low byte
|
|
|
|
sep #$20
|
|
]line equ 0
|
|
lup 16
|
|
stal store_start+{]line*4}+1,x
|
|
stal store_start+{{]line+208}*4}+1,x
|
|
]line equ ]line+1
|
|
--^
|
|
rep #$20
|
|
|
|
txa
|
|
clc
|
|
adc #4*16
|
|
tax
|
|
|
|
tya
|
|
clc
|
|
adc #4
|
|
tay
|
|
|
|
cpy #13*4
|
|
bcs *+5
|
|
brl :loop2
|
|
|
|
rtl
|
|
|
|
|
|
; Function to load data from an array and store in the code field. Assume that the
|
|
; bank register is already set to the bank of the srcAddr data
|
|
srcAddr equ 0
|
|
destOffset equ 2
|
|
|
|
CopyTblToCode
|
|
ldal entry_7,x ; This is the entry point
|
|
stal cttc_jump+1
|
|
|
|
txa ; Set the Y register to srcAddr - 2*start to compensate for the
|
|
eor #$FFFF ; offset in the code. This does mean that the array we are copying
|
|
sec ; cannot by near the beginning of the bank
|
|
adc srcAddr
|
|
tyx ; put the ending offset in X
|
|
tay
|
|
|
|
ldal entry_7,x
|
|
tax
|
|
lda #$0060
|
|
stal {cttc_start&$FF0000}+3,x ; patch at the next STAL instruction because the high byte is always zero
|
|
|
|
ldx destOffset ; byte offset within each line
|
|
cttc_jump jsr $0000
|
|
|
|
lda #$009F ; restore the STAL opcode
|
|
stal {cttc_start&$FF0000}+3,x
|
|
|
|
rtl
|
|
|
|
; Define the 416 addresses for each copy
|
|
entry_7
|
|
]line equ 0
|
|
lup 416
|
|
da cttc_start+{]line*7}
|
|
]line equ ]line+1
|
|
--^
|
|
|
|
; Generate the code that performs the copy.
|
|
cttc_unit mac
|
|
lda: {]1*32}+{]2*2},y
|
|
stal $000000+{]2*$1000},x
|
|
<<<
|
|
|
|
cttc_start
|
|
]bank equ 0
|
|
lup 26
|
|
cttc_unit ]bank;0
|
|
cttc_unit ]bank;1
|
|
cttc_unit ]bank;2
|
|
cttc_unit ]bank;3
|
|
cttc_unit ]bank;4
|
|
cttc_unit ]bank;5
|
|
cttc_unit ]bank;6
|
|
cttc_unit ]bank;7
|
|
cttc_unit ]bank;8
|
|
cttc_unit ]bank;9
|
|
cttc_unit ]bank;10
|
|
cttc_unit ]bank;11
|
|
cttc_unit ]bank;12
|
|
cttc_unit ]bank;13
|
|
cttc_unit ]bank;14
|
|
cttc_unit ]bank;15
|
|
]bank equ ]bank+1
|
|
--^
|
|
rts
|
|
|
|
Store8Bits
|
|
txa
|
|
asl
|
|
adc #store_start
|
|
stal s8b_jump+1
|
|
|
|
tya
|
|
asl
|
|
tax
|
|
lda #$0060
|
|
stal {store_start&$FF0000},x
|
|
|
|
ldx destOffset ; byte offset within each line
|
|
lda srcAddr
|
|
sep #$20
|
|
s8b_jump jsr $0000
|
|
|
|
lda #$9F ; restore the STAL opcode
|
|
stal {store_start&$FF0000},x
|
|
rep #$20
|
|
|
|
rtl
|
|
|
|
Store16Bits
|
|
txa
|
|
asl
|
|
adc #store_start
|
|
stal s16b_jump+1
|
|
|
|
tya
|
|
asl
|
|
tax
|
|
lda #$0060
|
|
stal {store_start&$FF0000},x
|
|
|
|
ldx destOffset ; byte offset within each line
|
|
lda srcAddr
|
|
s16b_jump jsr $0000
|
|
|
|
lda #$009F ; restore the STAL opcode
|
|
stal {store_start&$FF0000},x
|
|
rtl
|
|
|
|
store_start
|
|
lup 26
|
|
stal $000000,x
|
|
stal $001000,x
|
|
stal $002000,x
|
|
stal $003000,x
|
|
stal $004000,x
|
|
stal $005000,x
|
|
stal $006000,x
|
|
stal $007000,x
|
|
stal $008000,x
|
|
stal $009000,x
|
|
stal $00A000,x
|
|
stal $00B000,x
|
|
stal $00C000,x
|
|
stal $00D000,x
|
|
stal $00E000,x
|
|
stal $00F000,x
|
|
--^
|
|
rts
|
|
|
|
|
|
CodeCopy8
|
|
txa
|
|
asl
|
|
adc #store_start
|
|
stal cc8_jump+1
|
|
|
|
tya
|
|
asl
|
|
tax
|
|
lda #$0060
|
|
stal {store8_start&$FF0000},x
|
|
|
|
ldx destOffset ; byte offset within each line
|
|
lda srcAddr
|
|
cc8_jump jsr $0000
|
|
|
|
lda #$009F ; restore the STAL opcode
|
|
stal {store8_start&$FF0000},x
|
|
rtl
|
|
|
|
store8_start
|
|
lup 26
|
|
pea $0000
|
|
plb
|
|
plb
|
|
|
|
lda $0000,y
|
|
stal $000000,x
|
|
lda $0000,y
|
|
stal $001000,x
|
|
lda $0000,y
|
|
stal $002000,x
|
|
lda $0000,y
|
|
stal $003000,x
|
|
lda $0000,y
|
|
stal $004000,x
|
|
lda $0000,y
|
|
stal $005000,x
|
|
lda $0000,y
|
|
stal $006000,x
|
|
lda $0000,y
|
|
stal $007000,x
|
|
lda $0000,y
|
|
stal $008000,x
|
|
lda $0000,y
|
|
stal $009000,x
|
|
lda $0000,y
|
|
stal $00A000,x
|
|
lda $0000,y
|
|
stal $00B000,x
|
|
lda $0000,y
|
|
stal $00C000,x
|
|
lda $C000,y
|
|
stal $00D000,x
|
|
lda $E000,y
|
|
stal $00E000,x
|
|
lda $F000,y
|
|
stal $00F000,x
|
|
--^
|
|
rts |