diff --git a/src/main.asm b/src/main.asm index 7eb3ce0..6e8bcc4 100644 --- a/src/main.asm +++ b/src/main.asm @@ -19,10 +19,6 @@ Main:: xor a, a ldh [rLCDC], a - ; Save some power and turn off the audio. - xor a, a - ldh [rNR52], a - ; We use a single set of tiles for the entire game, so we copy it at the start. ld de, Tiles ld hl, _VRAM @@ -67,6 +63,9 @@ Main:: EventLoop:: + ; Play the sound effect, if any. + call SFXPlay + ; Wrangle inputs and timers at the start of every frame. call GetInput call HandleTimers @@ -109,6 +108,7 @@ InitializeVariables: call ScoreInit call LevelInit call FieldInit + call SFXInit ret diff --git a/src/res/sources/sfx.fur b/src/res/sources/sfx.fur new file mode 100644 index 0000000..e639e6a Binary files /dev/null and b/src/res/sources/sfx.fur differ diff --git a/src/res/sources/sfx.vgm b/src/res/sources/sfx.vgm new file mode 100644 index 0000000..320cfbd Binary files /dev/null and b/src/res/sources/sfx.vgm differ diff --git a/src/res/sources/sfxregs.txt b/src/res/sources/sfxregs.txt new file mode 100644 index 0000000..c3b74fd --- /dev/null +++ b/src/res/sources/sfxregs.txt @@ -0,0 +1,279 @@ +$02, $00, +$04, $80, +$07, $00, +$09, $80, +$0C, $00, +$0E, $80, +$11, $00, +$13, $80, +$00, $00, +$16, $8F, +$15, $FF, +$14, $77, +$02, $F0, +$07, $F0, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $AC, +$04, $85, +$06, $7F, +$06, $7F, +$07, $80, +$08, $14, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $ED, +$04, $85, +$06, $7F, +$06, $7F, +$07, $80, +$08, $2D, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $27, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $44, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $AC, +$04, $85, +$06, $7F, +$06, $7F, +$07, $80, +$08, $14, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $ED, +$04, $85, +$06, $7F, +$06, $7F, +$07, $80, +$08, $2D, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $27, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $44, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $5B, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $59, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $AC, +$04, $85, +$06, $7F, +$06, $7F, +$07, $80, +$08, $14, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $27, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $44, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $72, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $62, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $D6, +$04, $86, +$06, $7F, +$06, $7F, +$07, $80, +$08, $8A, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $14, +$04, $87, +$06, $7F, +$06, $7F, +$07, $80, +$08, $A2, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $39, +$04, $87, +$06, $7F, +$06, $7F, +$07, $80, +$08, $B1, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $4F, +$04, $87, +$06, $7F, +$06, $7F, +$07, $80, +$08, $BA, +$09, $87, +$FF, +$FF, +$01, $BF, +$01, $BF, +$02, $F0, +$03, $62, +$04, $87, +$06, $7F, +$06, $7F, +$07, $80, +$08, $C1, +$09, $87, +$FF, +$FF, +$07, $F0, +$01, $BF, +$01, $BF, +$02, $D0, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $D0, +$08, $39, +$09, $87, +$FF, $FF, +$01, $BF, +$01, $BF, +$02, $D0, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $D0, +$08, $39, +$09, $87, +$FF, $FF, +$01, $BF, +$01, $BF, +$02, $D0, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $D0, +$08, $39, +$09, $87, +$FF, $FF, $FF, $FF, $FF, $FF, +$01, $BF, +$01, $BF, +$02, $10, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $10, +$08, $39, +$09, $87, +$FF, $FF, +$01, $BF, +$01, $BF, +$02, $10, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $10, +$08, $39, +$09, $87, +$FF, $FF, +$01, $BF, +$01, $BF, +$02, $10, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $10, +$08, $39, +$09, $87, +$FF, $FF, $FF, $FF, +$01, $BF, +$01, $BF, +$02, $00, +$03, $6B, +$04, $87, +$06, $BF, +$06, $BF, +$07, $00, +$08, $39, +$09, $87, +$FF, $FF, $FF, $FF, +$02, $08, +$03, $6B, +$04, $87, +$07, $08, +$08, $39, +$09, $87, +$FF, $FE, diff --git a/src/sfx.asm b/src/sfx.asm new file mode 100644 index 0000000..092b69c --- /dev/null +++ b/src/sfx.asm @@ -0,0 +1,100 @@ +IF !DEF(SFX_ASM) +DEF SFX_ASM EQU 1 + + +INCLUDE "globals.asm" + + +SECTION "Sound Effect Data", ROM0 +sSFXNextPieceI:: + db $02, $F0, $07, $F0, $01, $BF, $01, $BF, $02, $F0, $03, $AC, $04, $85, $06, $7F, $06, $7F, $07, $80, $08, $14, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $ED, $04, $85, + db $06, $7F, $06, $7F, $07, $80, $08, $2D, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $27, $04, $86, $06, $7F, $06, $7F, $07, $80, $08, $44, $09, $87, $FF, $FF, $01, $BF, + db $01, $BF, $02, $F0, $03, $AC, $04, $85, $06, $7F, $06, $7F, $07, $80, $08, $14, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $ED, $04, $85, $06, $7F, $06, $7F, $07, $80, + db $08, $2D, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $27, $04, $86, $06, $7F, $06, $7F, $07, $80, $08, $44, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $5B, + db $04, $86, $06, $7F, $06, $7F, $07, $80, $08, $59, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $AC, $04, $85, $06, $7F, $06, $7F, $07, $80, $08, $14, $09, $87, $FF, $FF, + db $01, $BF, $01, $BF, $02, $F0, $03, $27, $04, $86, $06, $7F, $06, $7F, $07, $80, $08, $44, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $72, $04, $86, $06, $7F, $06, $7F, + db $07, $80, $08, $62, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $D6, $04, $86, $06, $7F, $06, $7F, $07, $80, $08, $8A, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, + db $03, $14, $04, $87, $06, $7F, $06, $7F, $07, $80, $08, $A2, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $39, $04, $87, $06, $7F, $06, $7F, $07, $80, $08, $B1, $09, $87, + db $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $4F, $04, $87, $06, $7F, $06, $7F, $07, $80, $08, $BA, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $F0, $03, $62, $04, $87, $06, $7F, + db $06, $7F, $07, $80, $08, $C1, $09, $87, $FF, $FF, $07, $F0, $01, $BF, $01, $BF, $02, $D0, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $D0, $08, $39, $09, $87, $FF, $FF, $01, $BF, + db $01, $BF, $02, $D0, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $D0, $08, $39, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $D0, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $D0, + db $08, $39, $09, $87, $FF, $FF, $FF, $FF, $FF, $FF, $01, $BF, $01, $BF, $02, $10, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $10, $08, $39, $09, $87, $FF, $FF, $01, $BF, $01, $BF, + db $02, $10, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $10, $08, $39, $09, $87, $FF, $FF, $01, $BF, $01, $BF, $02, $10, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $10, $08, $39, + db $09, $87, $FF, $FF, $FF, $FF, $01, $BF, $01, $BF, $02, $00, $03, $6B, $04, $87, $06, $BF, $06, $BF, $07, $00, $08, $39, $09, $87, $FF, $FF, $FF, $FF, $02, $08, $03, $6B, $04, $87, + db $07, $08, $08, $39, $09, $87, $FE + + +SECTION "SFX Variables", HRAM +hPlayhead:: ds 2 + + +SECTION "SFX Functions", ROM0 +SFXInit:: + ; Audio on, volume on, and enable all channels. + ld a, $80 + ldh [rNR52], a + ld a, $FF + ldh [rNR51], a + ld a, $77 + ldh [rNR50], a + + ;xor a, a + ;ldh [hPlayhead], a + ;ldh [hPlayhead+1], a + + ld a, LOW(sSFXNextPieceI) + ldh [hPlayhead], a + ld a, HIGH(sSFXNextPieceI) + ldh [hPlayhead+1], a + ret + + +SFXPlay:: + ; Load the playhead position into HL. + ldh a, [hPlayhead] + ld l, a + ldh a, [hPlayhead+1] + ld h, a + + ; Nothing to do if it's a null ptr. + or a, l + ret z + + ; Otherwise, get the register to write to. +.getRegister + ld a, [hl] + inc hl + + ; If it's $FE, then we're done. + cp a, $FE + jr nz, :+ + xor a, a + ldh [hPlayhead], a + ldh [hPlayhead+1], a + ret + + ; If it's $FF, then we're done for this frame. +: cp a, $FF + jr z, .savePlayhead + + ; Otherwise, put the register in C. + add a, $10 + ld c, a + + ; Get the value to write. + ld a, [hl] + inc hl + + ; Write it and loop. + ldh [$ff00+c], a + jr .getRegister + +.savePlayhead + ld a, l + ldh [hPlayhead], a + ld a, h + ldh [hPlayhead+1], a + ret + + +ENDC diff --git a/tools/Emulicious.ini b/tools/Emulicious.ini index 3fd4e15..8824e4c 100644 --- a/tools/Emulicious.ini +++ b/tools/Emulicious.ini @@ -1,5 +1,5 @@ #Emulicious settings file -#Mon Oct 16 07:51:58 CEST 2023 +#Mon Oct 16 13:24:33 CEST 2023 WindowEventViewerWindowHeight=861 WindowEventViewerWindowDivider=309 WindowMemoryTracerWindowY=631 @@ -72,7 +72,7 @@ InterruptBreakpointEnabled=false OutlineWidth=425 DebuggerEventFiltersGameBoy= GameBoyErrorBreakpointSuspend9=true -WindowMemoryEditorOpen=true +WindowMemoryEditorOpen=false GameBoyErrorBreakpointSuspend8=true GameBoyErrorBreakpointSuspend7=true WindowPaletteViewerY=619 @@ -99,7 +99,7 @@ Gamepad1Key30=-1 BankSwapAtPCBreakpointEnabled=false DebuggerMemorySelectedTab=HRAM WindowVideoViewerOpen=false -WindowMemoryEditorTabVisibleRect=0,160,583,384 +WindowMemoryEditorTabVisibleRect=0,0,583,128 Gamepad1Key29=-1 Gamepad1Key28=-1 Gamepad1Key27=-1 @@ -135,7 +135,7 @@ Gamepad1Key13=-1 Gamepad1Key12=-1 Gamepad1Key11=-1 Gamepad1Key10=-1 -WindowMemoryEditorSelectedAddress=160 +WindowMemoryEditorSelectedAddress=16 WindowMemoryEditorWidth=665 GameBoyErrorBreakpointCondition9= GameBoyErrorBreakpointCondition8= @@ -154,7 +154,7 @@ Gamepad0Key35=-1 Gamepad0Key34=-1 Gamepad0Key33=-1 Gamepad0Key32=-1 -WindowMemoryEditorSelectedTab=RAM +WindowMemoryEditorSelectedTab=I/O Gamepad0Key31=-1 Gamepad0Key30=-1 SMSGamepadAThreshold=50