mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-06-11 07:29:32 +00:00
4e779e71d2
This significantly simplifies the dispatch process by creating a proper backing store for the tiles. Most values that were calcualted on the fly are now stored as constants in the tile store. Also, all tile updated are run through the dirty tile list which solved a checken-and-egg problem of which order to do sprites vs new tiles and affords a lot of optimizations since tile rendering is deferred and each tile is only drawn at most once per frame.
177 lines
6.5 KiB
ArmAsm
177 lines
6.5 KiB
ArmAsm
; Initialize the system for fun!
|
|
;
|
|
; Mostly memory allocation
|
|
;
|
|
; * 13 banks of memory for the blitter
|
|
; * 1 bank of memory for the second background
|
|
; * 1 bank of memory for the second background alt/mask
|
|
;
|
|
; * $01/2000 - $01/9FFF for the shadow screen
|
|
; * $00/2000 - $00/9FFF for the fixed background
|
|
;
|
|
; * 10 pages of direct page in Bank $00
|
|
; - 1 page for scratch space
|
|
; - 1 page for pointer to the second background
|
|
; - 8 pages for the dynamic tiles
|
|
|
|
mx %00
|
|
|
|
InitMemory PushLong #0 ; space for result
|
|
PushLong #$008000 ; size (32k)
|
|
PushWord UserId
|
|
PushWord #%11000000_00010111 ; Fixed location
|
|
PushLong #$002000
|
|
_NewHandle ; returns LONG Handle on stack
|
|
plx ; base address of the new handle
|
|
pla ; high address 00XX of the new handle (bank)
|
|
_Deref
|
|
stx Buff00
|
|
sta Buff00+2
|
|
|
|
PushLong #0 ; space for result
|
|
PushLong #$008000 ; size (32k)
|
|
PushWord UserId
|
|
PushWord #%11000000_00010111 ; Fixed location
|
|
PushLong #$012000
|
|
_NewHandle ; returns LONG Handle on stack
|
|
plx ; base address of the new handle
|
|
pla ; high address 00XX of the new handle (bank)
|
|
_Deref
|
|
stx Buff01
|
|
sta Buff01+2
|
|
|
|
PushLong #0 ; space for result
|
|
PushLong #$000A00 ; size (10 pages)
|
|
PushWord UserId
|
|
PushWord #%11000000_00010101 ; Page-aligned, fixed bank
|
|
PushLong #$000000
|
|
_NewHandle ; returns LONG Handle on stack
|
|
plx ; base address of the new handle
|
|
pla ; high address 00XX of the new handle (bank)
|
|
_Deref
|
|
stx BlitterDP
|
|
|
|
; Allocate banks of memory for BG1
|
|
jsr AllocOneBank2
|
|
sta BG1DataBank
|
|
|
|
jsr AllocOneBank2
|
|
sta BG1AltBank
|
|
|
|
; Allocate the 13 banks of memory we need and store in double-length array
|
|
]step equ 0
|
|
lup 13
|
|
jsr AllocOneBank2
|
|
sta BlitBuff+]step+2
|
|
stz BlitBuff+]step
|
|
]step equ ]step+4
|
|
--^
|
|
|
|
; Fill in a table with the adddress of all 208 scanlines across all 13 banks. Also fill in
|
|
; a shorter table that just holds the starting address of the 26 tile block rows.
|
|
|
|
ldx #0
|
|
ldy #0
|
|
:bloop
|
|
lda BlitBuff+2,y ; Copy the high word first
|
|
]step equ 0
|
|
lup 16
|
|
sta BTableHigh+]step,x ; 16 lines per bank
|
|
sta BTableHigh+]step+{208*2},x ; 16 lines per bank
|
|
]step equ ]step+2
|
|
--^
|
|
lda BlitBuff,y
|
|
sta BTableLow,x
|
|
sta BTableLow+{208*2},x
|
|
clc
|
|
]step equ 2
|
|
lup 15
|
|
adc #$1000
|
|
sta BTableLow+]step,x
|
|
sta BTableLow+]step+{208*2},x
|
|
]step equ ]step+2
|
|
--^
|
|
|
|
txa
|
|
adc #16*2 ; move to the next chunk of BTableHigh and BTableLow
|
|
tax
|
|
|
|
tya
|
|
adc #4 ; move to the next bank address
|
|
tay
|
|
cmp #4*13
|
|
bcs :exit1
|
|
brl :bloop
|
|
:exit1
|
|
|
|
ldx #0
|
|
ldy #0
|
|
:bloop2
|
|
lda BlitBuff+2,y ; Copy the high word first
|
|
|
|
sta BRowTableHigh,x ; Two rows per bank
|
|
sta BRowTableHigh+{26*2},x
|
|
sta BRowTableHigh+2,x
|
|
sta BRowTableHigh+{26*2}+2,x
|
|
|
|
lda BlitBuff,y
|
|
sta BRowTableLow,x
|
|
sta BRowTableLow+{26*2},x
|
|
clc
|
|
adc #$8000
|
|
sta BRowTableLow+2,x
|
|
sta BRowTableLow+{26*2}+2,x
|
|
|
|
txa
|
|
adc #4
|
|
tax
|
|
|
|
tya
|
|
adc #4 ; move to the next bank address
|
|
tay
|
|
cmp #4*13
|
|
bcs :exit
|
|
brl :bloop2
|
|
:exit
|
|
rts
|
|
|
|
Buff00 ds 4
|
|
Buff01 ds 4
|
|
|
|
; Bank allocator (for one full, fixed bank of memory. Can be immediately deferenced)
|
|
|
|
AllocOneBank PushLong #0
|
|
PushLong #$10000
|
|
PushWord UserId
|
|
PushWord #%11000000_00011100
|
|
PushLong #0
|
|
_NewHandle ; returns LONG Handle on stack
|
|
plx ; base address of the new handle
|
|
pla ; high address 00XX of the new handle (bank)
|
|
xba ; swap accumulator bytes to XX00
|
|
sta :bank+2 ; store as bank for next op (overwrite $XX00)
|
|
:bank ldal $000001,X ; recover the bank address in A=XX/00
|
|
rts
|
|
|
|
; Variation that returns the pointer in the X/A registers (X = low, A = high)
|
|
AllocBank ENT
|
|
phb
|
|
phk
|
|
plb
|
|
jsr AllocOneBank2
|
|
plb
|
|
rtl
|
|
|
|
AllocOneBank2 PushLong #0
|
|
PushLong #$10000
|
|
PushWord UserId
|
|
PushWord #%11000000_00011100
|
|
PushLong #0
|
|
_NewHandle
|
|
plx ; base address of the new handle
|
|
pla ; high address 00XX of the new handle (bank)
|
|
_Deref
|
|
rts
|
|
|
|
|