From 89e311ac5ded54ae32b5756b3e98a698448208af Mon Sep 17 00:00:00 2001 From: Randy Thiemann Date: Mon, 16 Oct 2023 13:27:08 +0200 Subject: [PATCH] Rudimentary SFX playback. --- src/main.asm | 8 +- src/res/sources/sfx.fur | Bin 0 -> 1107 bytes src/res/sources/sfx.vgm | Bin 0 -> 4111 bytes src/res/sources/sfxregs.txt | 279 ++++++++++++++++++++++++++++++++++++ src/sfx.asm | 100 +++++++++++++ tools/Emulicious.ini | 10 +- 6 files changed, 388 insertions(+), 9 deletions(-) create mode 100644 src/res/sources/sfx.fur create mode 100644 src/res/sources/sfx.vgm create mode 100644 src/res/sources/sfxregs.txt create mode 100644 src/sfx.asm 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 0000000000000000000000000000000000000000..e639e6a09d27cd284a6041a699e5dfb490627723 GIT binary patch literal 1107 zcmV-Z1g!gboXwQaZyQAv$KRV7?++*KMonk}iC7D@g##%l5QI3CIM7xBVGxPnfO?2h zQ>~iBAt7xHp|Kl9g^D7OP${Z7AaQ{sawINDy;nl{19I3?4;6nvPnhq_&Te*1p;yNK ztlyh?Z{C~t#yfsyeRX+$pPoL^t8kM9yug$~9{?abRpB?KXuXk~he`bZ5p1cjaj zivD{{Jz_k<{eLm`UrSC;#GKACH&B%yz+G?;Jcd%d0V41hXq1S42KRt)h$g@kXn`NW z@8B-@6P$C2Zh<>sACx_!m%s-29{d7+1N-1UcmN!qXc!y^AAks420P#;_zC<9?tnkQ zKDZAa0H=&DgBQVUSszD8RdQV4E2pC8|BJ|W^c1P}Dy0?DUzHY1n5%LVpJbe!U#eH8 z8_ga+jHlAl8jrm$0|6vZpadM?0uT704EjJnI0O!Z01(CSkKrG~KZbt{{}}!;{A2jX z@Q>ji!#{?94F4GZG5ob}nv8IYgHEB>vtR*KU!QsRkVzTCv1QbgUOLH%QTjKTsm)HD z!0#^VQmZPOeEvASRqZE_1b4go=%RaeT2U}Xbh_4SJu%s9%{|tGnYB-ItI_=Og~hsE zdOBNjsMd(q>ey-!TPZKuiuwjekDZ)6)lJODGxI(jxANiq`DppVL&HCpg&)qGO7v#5 zaFGs{-><%R`i3q+#g-zpzk-st2+BvgZ2CI(gTr6|905b%C>Q}xfHCl-Wz5cvSeqg1 zGhp}Vw|javhO#mBc&9p7i_%ty5e0#e7fCLWjK~TNBSTmrxlXc4a+Bm0k}V3`6qLRE zbHschi!$e*vljRo6Pgo1v zEIT?7^FODJ^N?}IrFAcmYOWs|M2Wn>5~mOCuJVEHA> zuULM~;il_ZBl@nhfE-;OcIG?Y+o_9D8Jj% zr`oVrRi9x8(Tr_Q<(!)DJDa}WRvzEZeUiTW#=z4BC>=DLecS9Yqm}itaJO?E_X52p~&EofdL zysyK{+;TZ@EDPt5g>y(z&}2bV1+7%j(&Ua94atoz%79zkY2(_Nm435=L}k4sqofnV ZX3p35O0qjA1HwZ9&TXxe{~LHng~`=e9Pa=C literal 0 HcmV?d00001 diff --git a/src/res/sources/sfx.vgm b/src/res/sources/sfx.vgm new file mode 100644 index 0000000000000000000000000000000000000000..320cfbdd96ebbd82547c23cd323025894694a135 GIT binary patch literal 4111 zcmcgvO^g&p6n-<^JKeqR;%@Kac@~gAT{x%*5)+B8?vWE1@B$7Mq#>AL-k(YQNBnye2ObFpX;z2liBAM}mC)e-QPj|hV4umyQnQYD0_tpDey;t?B z=D>+F-DjqV&b6p&Upz~6`pvQG|5x#?Adp=9!}XK&w;%cs{oZxYU0C&1I$ew$2bjj32;y?Cua zT7kR*8139)SzeEdceeQ>(xMic_jtg`MMMSD5fq8bfb)GSE?`J%6k}xbKSc5s<1QC6 z;Eq=}R_VqnU}zOEv=q9&+z%3t2*r|rD*;>sZ#PyU=xR`W8zf% zHQ?kI&9IqJjBstRVRKP4a3n$%WGhwyBUGvKt!#uURmN)u@)D}xK*TCwgeqXfYXKuv z0i#-r#MofXWlQgYF&aaYDmBp!Dwd>%$BDaZJokV%{l=Sr;4Lfs{4w7825+0=?IrJc znRg!G7e3?{zvB7pyz3tCUXv-~cp-Fo@+xmYy+RADK12-*D4$gn@zj8LTTEiOBl9K> z`>A{FUhz{8H&_QHv<}MStdqBn4Eg1X@9<#6cThs>)=9U#Cg07%-5+1fI@Cck#cWl| zxD>N1rpi?J#K;q1-d3*qCb1jE-vY28kA#sJ%T}v2UB43@r+V7RCM!MXNL7lZFAwNG*y9S`-W|3WgR1!->j~G0z=I zrX91{^U2F7L*wbccEc2f7XHhe-9`p<~pg*Xcd_ nC_vt#3$#pUfxm0;?dVU^DSDsI137EP&VwQN68>AJ9cK2w-AvQd literal 0 HcmV?d00001 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