113 lines
2.1 KiB
NASM
113 lines
2.1 KiB
NASM
IF !DEF(MAIN_ASM)
|
|
DEF MAIN_ASM EQU 1
|
|
|
|
|
|
INCLUDE "globals.asm"
|
|
INCLUDE "res/tiles.inc"
|
|
INCLUDE "res/gameplay_map.inc"
|
|
|
|
|
|
SECTION "Globals", WRAM0
|
|
wStateEventHandler:: ds 2
|
|
wStateVBlankHandler:: ds 2
|
|
|
|
|
|
SECTION "Stack", WRAM0
|
|
wStack:
|
|
ds STACK_SIZE
|
|
wStackEnd:
|
|
|
|
|
|
SECTION "Code Entry Point", ROM0
|
|
Main::
|
|
; Turn off LCD during initialization.
|
|
wait_vram
|
|
xor a, a
|
|
ldh [rLCDC], a
|
|
|
|
; Stack
|
|
ld sp, wStackEnd
|
|
|
|
; We use a single set of tiles for the entire game, so we copy it at the start.
|
|
ld de, Tiles
|
|
ld hl, _VRAM
|
|
ld bc, TilesEnd - Tiles
|
|
call UnsafeMemCopy
|
|
|
|
; Also to the second bank of tile data.
|
|
ld de, Tiles
|
|
ld hl, _VRAM + $800
|
|
ld bc, TilesEnd - Tiles
|
|
call UnsafeMemCopy
|
|
|
|
; Make sure both sprites and bg use the same tile data.
|
|
ldh a, [rLCDC]
|
|
or LCDCF_BLK01
|
|
ldh [rLCDC], a
|
|
|
|
; Clear OAM.
|
|
call ClearOAM
|
|
call CopyOAMHandler
|
|
|
|
; Set up the palettes.
|
|
ld a, PALETTE_REGULAR
|
|
set_bg_palette
|
|
set_obj0_palette
|
|
ld a, PALETTE_LIGHTER_1
|
|
set_obj1_palette
|
|
|
|
; Get the timer going. It's used for RNG.
|
|
xor a, a
|
|
ldh [rTMA], a
|
|
ld a, TACF_262KHZ | TACF_START
|
|
|
|
; Zero out the ram where needed.
|
|
call TimeInit
|
|
call IntrInit
|
|
call InputInit
|
|
call ScoreInit
|
|
call LevelInit
|
|
call FieldInit
|
|
call SFXInit
|
|
|
|
; Set up the interrupt handlers.
|
|
call InitializeLCDCInterrupt
|
|
|
|
; Switch to gameplay state.
|
|
call SwitchToGameplay
|
|
|
|
|
|
EventLoop::
|
|
; Play the sound effect, if any.
|
|
call SFXPlay
|
|
|
|
; Wrangle inputs and timers at the start of every frame.
|
|
call GetInput
|
|
call HandleTimers
|
|
|
|
; Call the current state's event handler.
|
|
ld a, [wStateEventHandler]
|
|
ld l, a
|
|
ld a, [wStateEventHandler + 1]
|
|
ld h, a
|
|
jp hl
|
|
EventLoopPostHandler::
|
|
|
|
; Wait for vblank and update OAM.
|
|
wait_vblank
|
|
call hOAMDMA
|
|
|
|
; Call the current state's vblank handler.
|
|
ld a, [wStateVBlankHandler]
|
|
ld l, a
|
|
ld a, [wStateVBlankHandler + 1]
|
|
ld h, a
|
|
jp hl
|
|
EventLoopPostVBlankHandler::
|
|
|
|
; Jump back to the start of the event loop.
|
|
jr EventLoop
|
|
|
|
|
|
ENDC
|