dmgtris/src/main.asm

182 lines
3.7 KiB
NASM
Raw Normal View History

2023-10-10 08:32:24 +00:00
INCLUDE "globals.asm"
2023-10-13 06:38:10 +00:00
INCLUDE "memory.asm"
2023-10-10 08:32:24 +00:00
INCLUDE "interrupts.asm"
2023-10-11 06:18:12 +00:00
INCLUDE "sprites.asm"
2023-10-13 06:38:10 +00:00
INCLUDE "rng.asm"
2023-10-10 08:32:24 +00:00
INCLUDE "res/tiles.inc"
INCLUDE "res/gameplay_map.inc"
SECTION "Code Entry Point", ROM0
2023-10-13 06:38:10 +00:00
Main::
2023-10-10 08:32:24 +00:00
; Turn off LCD during initialization.
2023-10-13 06:38:10 +00:00
wait_vram
xor a, a
ldh [rLCDC], a
2023-10-11 06:18:12 +00:00
; Save some power and turn off the audio.
2023-10-13 06:38:10 +00:00
xor a, a
ldh [rNR52], a
2023-10-10 08:32:24 +00:00
; We use a single set of tiles for the entire game, so we copy it at the start.
ld de, Tiles
2023-10-11 06:18:12 +00:00
ld hl, _VRAM
2023-10-10 08:32:24 +00:00
ld bc, TilesEnd - Tiles
call UnsafeMemCopy
2023-10-11 06:18:12 +00:00
; 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.
2023-10-13 06:38:10 +00:00
ldh a, [rLCDC]
or LCDCF_BLK01
ldh [rLCDC], a
2023-10-11 06:18:12 +00:00
2023-10-10 08:32:24 +00:00
; The tilemap is just for testing for now.
ld de, GameplayTilemap
ld hl, $9800
ld bc, GameplayTilemapEnd - GameplayTilemap
call UnsafeMemCopy
2023-10-11 06:18:12 +00:00
; Clear OAM.
call ClearOAM
call CopyOAMHandler
call SetNumberSpritePositions
; Set up the palettes.
2023-10-10 08:32:24 +00:00
ld a, PALETTE_REGULAR
2023-10-11 06:18:12 +00:00
set_all_palettes
2023-10-10 08:32:24 +00:00
2023-10-13 06:38:10 +00:00
; Get the timer going. It's used for RNG.
xor a, a
ldh [rTMA], a
ld a, TACF_262KHZ | TACF_START
2023-10-11 06:18:12 +00:00
; Zero out the ram where needed.
2023-10-10 08:32:24 +00:00
call InitializeVariables
2023-10-11 06:18:12 +00:00
; Set up the interrupt handlers.
2023-10-10 08:32:24 +00:00
call InitializeLCDCInterrupt
2023-10-11 06:18:12 +00:00
; And turn the LCD back on before we start.
2023-10-13 06:38:10 +00:00
ldh a, [rLCDC]
or LCDCF_ON | LCDCF_BGON | LCDCF_OBJON
ldh [rLCDC], a
2023-10-10 08:32:24 +00:00
; Make sure the first game loop starts just like all the future ones.
wait_vblank
wait_vblank_end
2023-10-13 06:38:10 +00:00
; TEMP: Set up the game.
call StartNewGame
2023-10-10 08:32:24 +00:00
GameLoop::
call GetInput
call HandleTimers
; Handle gameplay here
; TODO
2023-10-13 06:38:10 +00:00
ldh a, [hCtr]
inc a
and a, $1F
ldh [hCtr], a
jr nz, :+
call GetNextPiece
: ld a, [wNextPiece]
2023-10-11 06:18:12 +00:00
call ApplyNext
2023-10-10 08:32:24 +00:00
2023-10-13 06:38:10 +00:00
ld a, [wNextPiece]
2023-10-11 06:18:12 +00:00
call ApplyHold
2023-10-10 08:32:24 +00:00
2023-10-11 06:18:12 +00:00
ld hl, wSPRScore1
ld de, hScore
call ApplyNumbers
ld hl, wSPRCLevel1
ld de, hCLevel
call ApplyNumbers
ld hl, wSPRNLevel1
ld de, hNLevel
call ApplyNumbers
2023-10-10 08:32:24 +00:00
GameLoopEnd:
wait_vblank
2023-10-11 06:18:12 +00:00
call hOAMDMA
2023-10-10 08:32:24 +00:00
call BlitField
jp GameLoop
; *****************************************************************************
; * *
; * Functions *
; * *
; *****************************************************************************
SECTION "Functions", ROM0
InitializeVariables:
xor a, a
ld [wLCDCCtr], a
2023-10-11 06:18:12 +00:00
ld hl, wField
ld bc, 10*22
ld d, TILE_FIELD_EMPTY
call UnsafeMemSet
ld hl, hScore
ld bc, (6*3)
ld d, 0
call UnsafeMemSet
2023-10-10 08:32:24 +00:00
ret
BlitField:
2023-10-11 06:18:12 +00:00
; The first 14 rows can be blitted without checking for vram access.
ld de, wField + (2*10)
2023-10-10 08:32:24 +00:00
DEF row = 0
2023-10-11 06:18:12 +00:00
REPT 14
ld hl, FIELD_TOP_LEFT+(32*row)
2023-10-10 08:32:24 +00:00
REPT 10
ld a, [de]
ld [hl+], a
inc de
ENDR
DEF row += 1
ENDR
2023-10-11 06:18:12 +00:00
; The last 6 rows need some care.
REPT 6
ld hl, FIELD_TOP_LEFT+(32*row)
2023-10-10 08:32:24 +00:00
REPT 2
: ldh a, [rSTAT]
and STATF_LCD
cp STATF_HBL
jr z, :-
: ldh a, [rSTAT]
and STATF_LCD
cp STATF_HBL
jr nz, :-
REPT 5
ld a, [de]
ld [hl+], a
inc de
ENDR
ENDR
DEF row += 1
ENDR
ret
GetInput:
ret
HandleTimers:
ld a, [wEvenFrame]
inc a
and 1
ld [wEvenFrame], a
ret