154 lines
3.1 KiB
NASM
154 lines
3.1 KiB
NASM
; DMGTRIS
|
|
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
|
|
|
|
; This program is free software: you can redistribute it and/or modify
|
|
; it under the terms of the GNU General Public License as published by
|
|
; the Free Software Foundation, either version 3 of the License, or
|
|
; (at your option) any later version.
|
|
|
|
; This program is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
; GNU General Public License for more details.
|
|
|
|
; You should have received a copy of the GNU General Public License
|
|
; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
IF !DEF(MAIN_ASM)
|
|
DEF MAIN_ASM EQU 1
|
|
|
|
|
|
INCLUDE "globals.asm"
|
|
INCLUDE "res/other_data.inc"
|
|
|
|
|
|
SECTION "High Globals", HRAM
|
|
hGameState:: ds 1
|
|
|
|
|
|
SECTION "Globals", WRAM0
|
|
wSwapABState:: ds 1
|
|
wRNGModeState:: ds 1
|
|
wRotModeState:: ds 1
|
|
wDropModeState:: ds 1
|
|
wSpeedCurveState:: ds 1
|
|
wAlways20GState:: ds 1
|
|
wInitialA:: ds 1
|
|
wInitialB:: ds 1
|
|
wInitialC:: ds 1
|
|
|
|
|
|
SECTION "Stack", WRAM0
|
|
wStack::
|
|
ds STACK_SIZE + 1
|
|
wStackEnd::
|
|
|
|
|
|
SECTION "Code Entry Point", ROM0
|
|
; Main entry point. Does some set up and then goes into an infinite event loop initialized on the title screen.
|
|
Main::
|
|
; Load the initial registers. For reasons.
|
|
ld [wInitialA], a
|
|
ld a, b
|
|
ld [wInitialB], a
|
|
ld a, c
|
|
ld [wInitialC], a
|
|
|
|
; Initialize the mapper.
|
|
ld a, CART_SRAM_ENABLE
|
|
ld [rRAMG], a
|
|
xor a, a
|
|
ld [rRAMB], a
|
|
ld a, BANK_OTHER
|
|
ld [rROMB0], a
|
|
|
|
; Set up stack
|
|
ld sp, wStackEnd-1
|
|
|
|
; GBC? Double speed.
|
|
ld a, [wInitialA]
|
|
cp a, $11
|
|
jr nz, .notgbc
|
|
ld a, KEY1F_PREPARE
|
|
ldh [rKEY1], a
|
|
stop
|
|
.notgbc
|
|
|
|
; Harvest entropy
|
|
call HarvestEntropy
|
|
|
|
; Let the DMG have some fun with the initial screen.
|
|
call DoDMGEffect
|
|
|
|
; Turn off LCD during initialization.
|
|
wait_vram
|
|
xor a, a
|
|
ldh [rLCDC], a
|
|
|
|
; Clear OAM.
|
|
call ClearOAM
|
|
call SetNumberSpritePositions
|
|
call CopyOAMHandler
|
|
|
|
; Other initialization.
|
|
call RestoreSRAM
|
|
call TimeInit
|
|
call InputInit
|
|
call SFXInit
|
|
call BankingInit
|
|
|
|
xor a, a
|
|
ldh [hMode], a
|
|
|
|
; Switch to title state.
|
|
call SwitchToTitle
|
|
|
|
|
|
; Event loop time!
|
|
EventLoop::
|
|
; Play the sound effect, if any.
|
|
call SFXPlay
|
|
call SFXPlayNoise
|
|
|
|
; Wrangle inputs and timers at the start of every frame.
|
|
call GetInput
|
|
call HandleTimers
|
|
|
|
; Call the current state's event handler.
|
|
ld hl, .eventloopjumps
|
|
ldh a, [hGameState]
|
|
ld b, 0
|
|
ld c, a
|
|
add hl, bc
|
|
jp hl
|
|
|
|
.eventloopjumps
|
|
jp TitleEventLoopHandler
|
|
jp GamePlayEventLoopHandler
|
|
jp GamePlayBigEventLoopHandler
|
|
EventLoopPostHandler::
|
|
|
|
; Wait for vblank.
|
|
wait_vblank
|
|
|
|
; Do OAM DMA.
|
|
call hOAMDMA
|
|
|
|
; Call the current state's vblank handler.
|
|
ld hl, .vblankjumps
|
|
ldh a, [hGameState]
|
|
ld b, 0
|
|
ld c, a
|
|
add hl, bc
|
|
jp hl
|
|
|
|
.vblankjumps
|
|
jp TitleVBlankHandler
|
|
jp BlitField
|
|
jp BigBlitField
|
|
; The VBlank Handler is expected to end with jp EventLoop.
|
|
|
|
|
|
ENDC
|