dmgtris/src/main.asm

85 lines
1.5 KiB
NASM

IF !DEF(MAIN_ASM)
DEF MAIN_ASM EQU 1
INCLUDE "globals.asm"
INCLUDE "res/tiles.inc"
INCLUDE "res/gameplay_map.inc"
INCLUDE "res/title_map.inc"
SECTION "Globals", HRAM
hGameState:: ds 1
hSwapAB:: ds 1
SECTION "Stack", WRAM0
wStack::
ds STACK_SIZE + 1
wStackEnd::
SECTION "Code Entry Point", ROM0
Main::
; Turn off LCD during initialization.
wait_vram
xor a, a
ldh [rLCDC], a
; Set up stack
ld sp, wStackEnd-1
; 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
; Clear OAM.
call ClearOAM
call SetNumberSpritePositions
call CopyOAMHandler
; Zero out the ram where needed.
xor a, a
ldh [hSwapAB], a
call TimeInit
call IntrInit
call InputInit
call SFXInit
; Set up the interrupt handlers.
call InitializeLCDCInterrupt
; Switch to gameplay state.
call SwitchToTitle
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 b, 0
ldh a, [hGameState]
cp a, b
jp nz, GamePlayEventLoopHandler
jp TitleEventLoopHandler
EventLoopPostHandler::
; Wait for vblank.
wait_vblank
; Do OAM DMA.
; This will chain jump into the vblank handler.
jp hOAMDMA
; The VBlank Handler is expected to end with jp EventLoop.
ENDC