Implement input and clean up.

This commit is contained in:
Randy Thiemann 2023-10-13 11:20:28 +02:00
parent 9cedde3ed7
commit 134e1b559e
11 changed files with 441 additions and 106 deletions

View File

@ -313,30 +313,10 @@ DEF PALETTE_LIGHTER_0 EQU %11100100
DEF PALETTE_LIGHTER_1 EQU %10010000 DEF PALETTE_LIGHTER_1 EQU %10010000
DEF PALETTE_LIGHTER_2 EQU %01000000 DEF PALETTE_LIGHTER_2 EQU %01000000
DEF PALETTE_LIGHTER_3 EQU %00000000 DEF PALETTE_LIGHTER_3 EQU %00000000
DEF FIELD_TOP_LEFT EQU $9800+(0*32)+1 DEF FIELD_TOP_LEFT EQU $9800+(1*32)+1
DEF FIELD_ROW_1 EQU $9800+(0*32)+1
DEF FIELD_ROW_2 EQU $9800+(1*32)+1
DEF FIELD_ROW_3 EQU $9800+(2*32)+1
DEF FIELD_ROW_4 EQU $9800+(3*32)+1
DEF FIELD_ROW_5 EQU $9800+(4*32)+1
DEF FIELD_ROW_6 EQU $9800+(5*32)+1
DEF FIELD_ROW_7 EQU $9800+(6*32)+1
DEF FIELD_ROW_8 EQU $9800+(7*32)+1
DEF FIELD_ROW_9 EQU $9800+(8*32)+1
DEF FIELD_ROW_10 EQU $9800+(9*32)+1
DEF FIELD_ROW_11 EQU $9800+(10*32)+1
DEF FIELD_ROW_12 EQU $9800+(11*32)+1
DEF FIELD_ROW_13 EQU $9800+(12*32)+1
DEF FIELD_ROW_14 EQU $9800+(13*32)+1
DEF FIELD_ROW_15 EQU $9800+(14*32)+1
DEF FIELD_ROW_16 EQU $9800+(15*32)+1
DEF FIELD_ROW_17 EQU $9800+(16*32)+1
DEF FIELD_ROW_18 EQU $9800+(17*32)+1
DEF FIELD_ROW_19 EQU $9800+(18*32)+1
DEF FIELD_ROW_20 EQU $9800+(19*32)+1
DEF TILE_FIELD_EMPTY EQU 7 DEF TILE_FIELD_EMPTY EQU 7
DEF TILE_PIECE_0 EQU 10 DEF TILE_PIECE_0 EQU 10
DEF TILE_0 EQU 110 DEF TILE_0 EQU 100
DEF NEXT_BASE_X EQU 120 DEF NEXT_BASE_X EQU 120
DEF NEXT_BASE_Y EQU 40 DEF NEXT_BASE_Y EQU 40
DEF HOLD_BASE_X EQU 120 DEF HOLD_BASE_X EQU 120

55
src/include/field.asm Normal file
View File

@ -0,0 +1,55 @@
IF !DEF(FIELD_ASM)
DEF FIELD_ASM EQU 1
SECTION "Field Variables", WRAM0
wField:: ds (10*21)
SECTION "Field Functions", ROM0
FieldInit::
ld hl, wField
ld bc, 10*21
ld d, TILE_FIELD_EMPTY
call UnsafeMemSet
ret
BlitField::
; The first 14 rows can be blitted without checking for vram access.
ld de, wField + (1*10)
DEF row = 0
REPT 14
ld hl, FIELD_TOP_LEFT+(32*row)
REPT 10
ld a, [de]
ld [hl+], a
inc de
ENDR
DEF row += 1
ENDR
; The last 6 rows need some care.
REPT 6
ld hl, FIELD_TOP_LEFT+(32*row)
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
ENDC

View File

@ -7,17 +7,8 @@ INCLUDE "vendor/structs.asm"
INCLUDE "constants.asm" INCLUDE "constants.asm"
SECTION "General Game Variables", WRAM0
wLCDCCtr:: db
wEvenFrame:: db
wField:: ds (10*22)
SECTION "Important Game Variables", HRAM SECTION "Important Game Variables", HRAM
hCtr:: ds 1 hCtr:: ds 1
hScore:: ds 6
hCLevel:: ds 6
hNLevel:: ds 6
; Waits for VRAM to be safe to access. (Includes hblank.) ; Waits for VRAM to be safe to access. (Includes hblank.)
@ -69,9 +60,9 @@ ENDM
; Sets all palettes to A. ; Sets all palettes to A.
MACRO set_all_palettes MACRO set_all_palettes
set_bg_palette a set_bg_palette
set_obj0_palette a set_obj0_palette
set_obj1_palette a set_obj1_palette
ENDM ENDM

149
src/include/input.asm Normal file
View File

@ -0,0 +1,149 @@
IF !DEF(INPUT_ASM)
DEF INPUT_ASM EQU 1
SECTION "Input Variables", HRAM
hUpState:: ds 1
hDownState:: ds 1
hLeftState:: ds 1
hRightState:: ds 1
hAState:: ds 1
hBState:: ds 1
hStartState:: ds 1
hSelectState:: ds 1
SECTION "Input Functions", ROM0
InputInit::
xor a, a
ldh [hUpState], a
ldh [hDownState], a
ldh [hLeftState], a
ldh [hRightState], a
ldh [hAState], a
ldh [hBState], a
ldh [hStartState], a
ldh [hSelectState], a
ret
GetInput::
; Get the button state.
.btns
ld a, P1F_GET_BTN
ldh [rP1], a
ldh a, [rP1]
ldh a, [rP1]
ldh a, [rP1]
ldh a, [rP1]
ld b, a
.readA
bit 0, b ; A
jr nz, .clearA
.setA
ld a, 1
ldh [hAState], a
jr .readB
.clearA
xor a, a
ldh [hAState], a
.readB
bit 1, b ; B
jr nz, .clearB
.setB
ld a, 1
ldh [hBState], a
jr .readSelect
.clearB
xor a, a
ldh [hBState], a
.readSelect
bit 2, b ; Select
jr nz, .clearSelect
.setSelect
ld a, 1
ldh [hSelectState], a
jr .readStart
.clearSelect
xor a, a
ldh [hSelectState], a
.readStart
bit 3, b ; Start
jr nz, .clearStart
.setStart
ld a, 1
ldh [hStartState], a
jr .dpad
.clearStart
xor a, a
ldh [hStartState], a
; Get the dpad state.
.dpad
ld a, P1F_GET_DPAD
ldh [rP1], a
ldh a, [rP1]
ldh a, [rP1]
ldh a, [rP1]
ldh a, [rP1]
ld b, a
.readUp
bit 2, b ; Up
jr nz, .clearUp
.setUp
ld a, 1
ldh [hUpState], a
jr .readDown
.clearUp
xor a, a
ldh [hUpState], a
.readDown
bit 3, b ; Down
jr nz, .clearDown
.setDown
ld a, 1
ldh [hDownState], a
jr .readLeft
.clearDown
xor a, a
ldh [hDownState], a
.readLeft
bit 1, b ; Left
jr nz, .clearLeft
.setLeft
ldh a, [hLeftState]
cp $FF
jr z, .readRight
inc a
ldh [hLeftState], a
jr .readRight
.clearLeft
xor a, a
ldh [hLeftState], a
.readRight
bit 0, b ; Right
jr nz, .clearRight
.setRight
ldh a, [hRightState]
cp $FF
ret z
inc a
ldh [hRightState], a
ret
.clearRight
xor a, a
ldh [hRightState], a
ret
ENDC

View File

@ -2,7 +2,17 @@ IF !DEF(INTERRUPTS_ASM)
DEF INTERRUPTS_ASM EQU 1 DEF INTERRUPTS_ASM EQU 1
SECTION "Interrupt Variables", HRAM
hLCDCCtr:: ds 1
SECTION "Interrupt Initialization Functions", ROM0 SECTION "Interrupt Initialization Functions", ROM0
IntrInit::
xor a, a
ldh [hLCDCCtr], a
ret
InitializeLCDCInterrupt:: InitializeLCDCInterrupt::
ld a, STATF_LYC ld a, STATF_LYC
ldh [rSTAT], a ldh [rSTAT], a
@ -18,7 +28,7 @@ InitializeLCDCInterrupt::
ret ret
SECTION "LCDC Interrupt", ROM0[$0048] SECTION "LCDC Interrupt", ROM0[INT_HANDLER_STAT]
LCDCInterrupt: LCDCInterrupt:
push af push af
push hl push hl
@ -39,11 +49,11 @@ LCDCInterrupt_WaitUntilNotBusy:
ldh [rLYC], a ldh [rLYC], a
; Check our interrupt counter ; Check our interrupt counter
ld a, [wLCDCCtr] ldh a, [hLCDCCtr]
cp 21 cp 21
jp nz, LCDCInterrupt_End jp nz, LCDCInterrupt_End
ld a, 255 ld a, 255
ld [wLCDCCtr], a ldh [hLCDCCtr], a
ld a, 6 ld a, 6
ldh [rLYC], a ldh [rLYC], a
ld a, 0 ld a, 0
@ -51,7 +61,7 @@ LCDCInterrupt_WaitUntilNotBusy:
LCDCInterrupt_End: LCDCInterrupt_End:
inc a inc a
ld [wLCDCCtr], a ldh [hLCDCCtr], a
pop hl pop hl
pop af pop af
reti reti

30
src/include/level.asm Normal file
View File

@ -0,0 +1,30 @@
IF !DEF(LEVEL_ASM)
DEF LEVEL_ASM EQU 1
SECTION "Level Variables", WRAM0
wCLevel:: ds 6
wNLevel:: ds 6
SECTION "Level Functions", ROM0
LevelInit::
xor a, a
ld hl, wCLevel
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl], a
ld hl, wNLevel
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl], a
ret
ENDC

22
src/include/score.asm Normal file
View File

@ -0,0 +1,22 @@
IF !DEF(SCORE_ASM)
DEF SCORE_ASM EQU 1
SECTION "Score Variables", WRAM0
wScore:: ds 6
SECTION "Score Functions", ROM0
ScoreInit::
xor a, a
ld hl, wScore
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl+], a
ld [hl], a
ret
ENDC

View File

@ -249,92 +249,210 @@ SetNumberSpritePositions::
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRScore2 ld hl, wSPRScore2
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRScore3 ld hl, wSPRScore3
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRScore4 ld hl, wSPRScore4
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRScore5 ld hl, wSPRScore5
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRScore6 ld hl, wSPRScore6
ld [hl], SCORE_BASE_Y ld [hl], SCORE_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld a, OAMF_PAL1
ld [hl], a
ld a, DIGIT_BASE_X ld a, DIGIT_BASE_X
ld hl, wSPRCLevel1 ld hl, wSPRCLevel1
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRCLevel2 ld hl, wSPRCLevel2
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRCLevel3 ld hl, wSPRCLevel3
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRCLevel4 ld hl, wSPRCLevel4
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRCLevel5 ld hl, wSPRCLevel5
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRCLevel6 ld hl, wSPRCLevel6
ld [hl], CLEVEL_BASE_Y ld [hl], CLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld a, OAMF_PAL1
ld [hl], a
ld a, DIGIT_BASE_X ld a, DIGIT_BASE_X
ld hl, wSPRNLevel1 ld hl, wSPRNLevel1
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRNLevel2 ld hl, wSPRNLevel2
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRNLevel3 ld hl, wSPRNLevel3
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRNLevel4 ld hl, wSPRNLevel4
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRNLevel5 ld hl, wSPRNLevel5
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
inc hl
inc hl
ld b, a
ld a, OAMF_PAL1
ld [hl], a
ld a, b
add a, 8 add a, 8
ld hl, wSPRNLevel6 ld hl, wSPRNLevel6
ld [hl], NLEVEL_BASE_Y ld [hl], NLEVEL_BASE_Y
inc hl inc hl
ld [hl], a ld [hl], a
add a, 8 inc hl
inc hl
ld a, OAMF_PAL1
ld [hl], a
ret ret

23
src/include/time.asm Normal file
View File

@ -0,0 +1,23 @@
IF !DEF(TIME_ASM)
DEF TIME_ASM EQU 1
SECTION "Time Variables", HRAM
hEvenFrame:: ds 1
SECTION "Time Functions", ROM0
TimeInit::
xor a, a
ldh [hEvenFrame], a
ret
HandleTimers::
ldh a, [hEvenFrame]
inc a
and 1
ldh [hEvenFrame], a
ret
ENDC

View File

@ -3,6 +3,11 @@ INCLUDE "memory.asm"
INCLUDE "interrupts.asm" INCLUDE "interrupts.asm"
INCLUDE "sprites.asm" INCLUDE "sprites.asm"
INCLUDE "rng.asm" INCLUDE "rng.asm"
INCLUDE "input.asm"
INCLUDE "time.asm"
INCLUDE "score.asm"
INCLUDE "level.asm"
INCLUDE "field.asm"
INCLUDE "res/tiles.inc" INCLUDE "res/tiles.inc"
INCLUDE "res/gameplay_map.inc" INCLUDE "res/gameplay_map.inc"
@ -47,7 +52,10 @@ Main::
; Set up the palettes. ; Set up the palettes.
ld a, PALETTE_REGULAR ld a, PALETTE_REGULAR
set_all_palettes set_bg_palette
set_obj0_palette
ld a, PALETTE_LIGHTER_1
set_obj1_palette
; Get the timer going. It's used for RNG. ; Get the timer going. It's used for RNG.
xor a, a xor a, a
@ -95,15 +103,15 @@ GameLoop::
call ApplyHold call ApplyHold
ld hl, wSPRScore1 ld hl, wSPRScore1
ld de, hScore ld de, wScore
call ApplyNumbers call ApplyNumbers
ld hl, wSPRCLevel1 ld hl, wSPRCLevel1
ld de, hCLevel ld de, wCLevel
call ApplyNumbers call ApplyNumbers
ld hl, wSPRNLevel1 ld hl, wSPRNLevel1
ld de, hNLevel ld de, wNLevel
call ApplyNumbers call ApplyNumbers
GameLoopEnd: GameLoopEnd:
@ -121,61 +129,10 @@ GameLoopEnd:
; ***************************************************************************** ; *****************************************************************************
SECTION "Functions", ROM0 SECTION "Functions", ROM0
InitializeVariables: InitializeVariables:
xor a, a call TimeInit
ld [wLCDCCtr], a call IntrInit
ld hl, wField call InputInit
ld bc, 10*22 call ScoreInit
ld d, TILE_FIELD_EMPTY call LevelInit
call UnsafeMemSet call FieldInit
ld hl, hScore
ld bc, (6*3)
ld d, 0
call UnsafeMemSet
ret
BlitField:
; The first 14 rows can be blitted without checking for vram access.
ld de, wField + (2*10)
DEF row = 0
REPT 14
ld hl, FIELD_TOP_LEFT+(32*row)
REPT 10
ld a, [de]
ld [hl+], a
inc de
ENDR
DEF row += 1
ENDR
; The last 6 rows need some care.
REPT 6
ld hl, FIELD_TOP_LEFT+(32*row)
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 ret

View File

@ -1,5 +1,5 @@
#Emulicious settings file #Emulicious settings file
#Fri Oct 13 08:36:54 CEST 2023 #Fri Oct 13 11:18:40 CEST 2023
SouthPanelHeight=635 SouthPanelHeight=635
GameBoyErrorBreakpointMessage6= GameBoyErrorBreakpointMessage6=
GameBoyErrorBreakpointMessage5= GameBoyErrorBreakpointMessage5=
@ -184,7 +184,7 @@ GameBoyErrorBreakpointSuspend2=true
GameBoyErrorBreakpointSuspend1=true GameBoyErrorBreakpointSuspend1=true
GameBoyErrorBreakpointSuspend0=true GameBoyErrorBreakpointSuspend0=true
Scale=5.0 Scale=5.0
DebuggerMemorySelectedAddress=390 DebuggerMemorySelectedAddress=4
WindowEmuliciousWidth=816 WindowEmuliciousWidth=816
GameBoyErrorBreakpointSuspend20=true GameBoyErrorBreakpointSuspend20=true
DataExecutionBreakpointCondition= DataExecutionBreakpointCondition=
@ -217,8 +217,8 @@ WindowTilemapViewerHeight=744
GameBoyErrorBreakpointMessage20= GameBoyErrorBreakpointMessage20=
WindowTileViewerWidth=467 WindowTileViewerWidth=467
MemoryTracerDisplayFileOffsetsForROM=true MemoryTracerDisplayFileOffsetsForROM=true
WindowDebuggerY=189 WindowDebuggerY=170
WindowDebuggerX=1113 WindowDebuggerX=1172
Key37=-1 Key37=-1
Key36=-1 Key36=-1
WindowTileViewerOpen=false WindowTileViewerOpen=false
@ -275,7 +275,7 @@ BankSwapAtPCBreakpointSuspend=true
Key20=-1 Key20=-1
WindowEmuliciousY=489 WindowEmuliciousY=489
WindowEmuliciousX=666 WindowEmuliciousX=666
DebuggerMemorySelectedTab=RAM DebuggerMemorySelectedTab=HRAM
WindowDebuggerWidth=1481 WindowDebuggerWidth=1481
GameBoyErrorBreakpointMessage9= GameBoyErrorBreakpointMessage9=
GameBoyErrorBreakpointMessage8= GameBoyErrorBreakpointMessage8=