aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-08-06 21:00:27 +0200
committerAstatin <[email protected]>2025-08-06 21:00:27 +0200
commit8b7594415a4ca28b0193d24d59c3089f046a3be1 (patch)
treecc73c7f8b59ff5a30d9989bc99508de8b7241c08
parent4db56b6d877ee88a672f5361bbe372783086353d (diff)
Add click sound effect on menu open, dialogue next & menu arrow moves
-rw-r--r--Makefile2
-rw-r--r--definitions.gbasm14
-rw-r--r--gui.gbasm13
-rw-r--r--main.gbasm10
-rw-r--r--modes/dialoguemenu.gbasm1
-rw-r--r--modes/dungeon.gbasm3
-rw-r--r--modes/dungeongeneration.gbasm6
-rw-r--r--modes/loading.gbasm1
-rw-r--r--modes/titlescreen.gbasm40
-rw-r--r--music/load.gbasm172
-rw-r--r--music/morning-forest.furbin765 -> 773 bytes
-rw-r--r--music/morning-forest.vgmbin7127 -> 7022 bytes
-rw-r--r--music/soundeffects.gbasm34
-rw-r--r--music/soundeffects/click.gbasm36
-rw-r--r--music/title-screen-music.furbin708 -> 707 bytes
-rw-r--r--music/title-screen.vgmbin0 -> 6221 bytes
-rw-r--r--utils.gbasm16
17 files changed, 322 insertions, 26 deletions
diff --git a/Makefile b/Makefile
index f130a43..d43ed01 100644
--- a/Makefile
+++ b/Makefile
@@ -58,7 +58,7 @@ build/game_linux_x86-64: build/makeself/start.sh build/makeself/main.rom build/m
run: build/main.rom
mkdir -p recordings
- gb $< --record-input "./recordings/$(shell date -Iseconds).record" -v infos,errors,debug,halt_cycles
+ gb $< --record-input "./recordings/$(shell date -Iseconds).record" -v infos,errors,debug # ,halt_cycles
sameboy: build/main.rom
sameboy build/main.rom
diff --git a/definitions.gbasm b/definitions.gbasm
index d5f4bbb..7e9cecf 100644
--- a/definitions.gbasm
+++ b/definitions.gbasm
@@ -173,6 +173,20 @@
.DEFINE mem_current_vgm_pc $c070 ; Takes $c070 to $c072 (bank + ptr)
+.DEFINE mem_current_vgm_header $c073 ; Takes $c073 to $c075 (bank + ptr)
+
+.DEFINE mem_sound_flags ($c076)
+; bit 0 = 1 => music playing
+; bit 1 = 1 => sound effect playing on channel 1 (music should not use it)
+; bit 2 = 1 => sound effect playing on channel 2 (music should not use it)
+; bit 3 = 1 => sound effect playing on channel 3 (music should not use it)
+; bit 4 = 1 => sound effect playing on channel 4 (music should not use it)
+; bit 5 = 1 => $mem_sound_effect_frame_count is going down
+
+.DEFINE mem_sound_effect_frame_count ($c077)
+
+.DEFINE mem_sound_effect_pc $c078 ; Takes $c078 - $c07a (bank + ptr)
+
; ## WARNING THE SPACE BETWEEN $c400 and $c800 is used as a buffer for the loading map function during dungeon generation
.DEFINE mem_map_loading_buffer $c400
diff --git a/gui.gbasm b/gui.gbasm
index 1cc94c4..6f1e2b2 100644
--- a/gui.gbasm
+++ b/gui.gbasm
@@ -181,6 +181,8 @@ Move_dialogue_cursor:
CP B
RET Z
+ .SET_SOUND_EFFECT =_sound_effect_Click
+
DEC A
BIT 1, A
JR Z, =.Vertical_axis
@@ -258,8 +260,8 @@ Check_dialogue_action:
CP $00
RET Z
BIT 0, A
+ .SET_SOUND_EFFECT =_sound_effect_Click
JP NZ, =Dialogue_script_step
- RET
.Dungeon_Menu:
LD A, $mem_button_action
@@ -274,6 +276,9 @@ Check_dialogue_action:
BIT 0, A
RET Z
+ LD A, $mem_menu_cursor_position
+ LD D, A
+
LD A, $mem_current_focused_attack_ep_cost
LD B, A
LD A, $mem_bunny_mana
@@ -290,6 +295,11 @@ Check_dialogue_action:
ADD L
LD L, A
+ LD A, $mem_menu_cursor_position
+ CP D
+ JR NZ, =.moved_sound_effect
+ .SET_SOUND_EFFECT =_sound_effect_Click
+ .moved_sound_effect:
LD A, (HL+)
LD D, A
LD A, (HL+)
@@ -345,6 +355,7 @@ Open_dialogue_on_dungeon_menu_mode:
AND $40 ; Keeping object additional tile
OR $0d
LD $mem_display_flag, A
+ .SET_SOUND_EFFECT =_sound_effect_Click
RET
diff --git a/main.gbasm b/main.gbasm
index b666e77..c480918 100644
--- a/main.gbasm
+++ b/main.gbasm
@@ -4,6 +4,8 @@
Entrypoint:
CALL =Initialize_RNG
+ LD A, $ff
+ LD ($mem_sound_effect_pc), A
LD HL, $mem_bunny_attacks
LD A, $01
@@ -23,13 +25,13 @@ Entrypoint:
LD A, L
LD ($mem_dungeon+2), A
- CALL =Load_Music
-
; JP =New_Dungeon
.LOAD_BANK_OF =Title_Screen
JP ptr(=Title_Screen)
.INCLUDE "tiles.gbasm"
+.INCLUDE "music/load.gbasm"
+.INCLUDE "music/soundeffects.gbasm"
.INCLUDE "rng.gbasm"
.INCLUDE "dialogues/utils.gbasm"
.INCLUDE "buttons.gbasm"
@@ -53,7 +55,6 @@ Entrypoint:
.INCLUDE "enemiesattacks.gbasm"
.INCLUDE "dialogues/functions.gbasm"
.INCLUDE "map/loading/dungeoninfos.gbasm"
-.INCLUDE "music/load.gbasm"
.PADTO $4000
.INCLUDE "modes/titlescreen.gbasm"
@@ -62,6 +63,9 @@ Entrypoint:
.INCLUDE "dialogues/dialogues.gbasm"
.INCLUDE "map/maps.gbasm"
.INCLUDE "map/dungeons.gbasm"
+.INCLUDE "music/soundeffects/click.gbasm"
_music_Dungeon:
.INCLUDEBIN "music/morning-forest.vgm"
+_music_TitleScreen:
+.INCLUDEBIN "music/title-screen.vgm"
diff --git a/modes/dialoguemenu.gbasm b/modes/dialoguemenu.gbasm
index 306ea50..126495b 100644
--- a/modes/dialoguemenu.gbasm
+++ b/modes/dialoguemenu.gbasm
@@ -49,6 +49,7 @@ Dialogue_VBLANK_Entrypoint:
LD $mem_loop_frame_timer, A
CALL =Play_Music
+ CALL =Play_Sound_Effect
.ENABLE_VBLANK_INTERRUPTS
RETI
diff --git a/modes/dungeon.gbasm b/modes/dungeon.gbasm
index 9062425..e67847b 100644
--- a/modes/dungeon.gbasm
+++ b/modes/dungeon.gbasm
@@ -170,8 +170,8 @@ Dungeon_VBLANK_Entrypoint:
CALL =Animation_Wait_Mode
CALL =Update_Blinking_Counter
- CALL =Update_Animation_Steps
CALL =Check_Open_Menu_button
+ CALL =Update_Animation_Steps
LD HL, $mem_entities_list
CALL =Center_viewport_around_entity
@@ -188,6 +188,7 @@ Dungeon_VBLANK_Entrypoint:
LD $mem_loop_frame_timer, A
CALL =Play_Music
+ CALL =Play_Sound_Effect
.ENABLE_VBLANK_INTERRUPTS
RETI
diff --git a/modes/dungeongeneration.gbasm b/modes/dungeongeneration.gbasm
index 11824de..b7affed 100644
--- a/modes/dungeongeneration.gbasm
+++ b/modes/dungeongeneration.gbasm
@@ -31,6 +31,9 @@
.END
New_Dungeon:
+ .LOAD_MUSIC =_music_Dungeon
+ CALL =Start_Music
+
LD A, $20
LD $mem_bunny_health, A
LD A, $30
@@ -222,6 +225,9 @@ Dungeon_generation_VBlank:
CALL =Reset_Entities_Collision_Map
+ CALL =Reset_Music_Channels
+ LD A, $01
+ LD $mem_sound_flags, A
DI
.DISABLE_MODE_2_INTERRUPT
CALL =Update_VBlank_Handler
diff --git a/modes/loading.gbasm b/modes/loading.gbasm
index 649d474..aad23bd 100644
--- a/modes/loading.gbasm
+++ b/modes/loading.gbasm
@@ -33,6 +33,7 @@ Loading_VBLANK_Entrypoint:
LD $mem_loop_frame_timer, A
CALL =Play_Music
+ CALL =Play_Sound_Effect
.ENABLE_VBLANK_INTERRUPTS
RETI
diff --git a/modes/titlescreen.gbasm b/modes/titlescreen.gbasm
index 22640b2..2a53f48 100644
--- a/modes/titlescreen.gbasm
+++ b/modes/titlescreen.gbasm
@@ -2,6 +2,11 @@ Title_Screen:
.ASSERT bank(.) bank(=Title_Screen_Sprite_Data)
.ASSERT bank(.) bank(=Title_Screen_Sprite_Data.end)
+ .LOAD_MUSIC =_music_TitleScreen
+ .CALL_SAVE_BANK =Start_Music
+ LD A, $01
+ LD $mem_sound_flags, A
+
LD HL, $9010
LD DE, ptr(=Title_Screen_Sprite_Data)
LD BC, $07f0
@@ -55,19 +60,19 @@ Title_Screen:
LD A, $lcdc_mapbg_tilemap
LD $reg_lcd_controller, A
- LD A, $80
+ LD A, $00
.blink:
.blink.loop1:
CALL =Check_Frame_stuff
INC A
- CP $20
+ CP $48
JR NZ =.blink.loop1
CALL =.blink.draw_text
LD A, $00
.blink.loop2:
CALL =Check_Frame_stuff
INC A
- CP $20
+ CP $48
JR NZ =.blink.loop2
CALL =.blink.undraw_text
LD A, $00
@@ -94,9 +99,16 @@ Title_Screen:
RET
Check_Frame_stuff:
+ PUSH AF
+ PUSH BC
+ PUSH DE
+ PUSH HL
CALL =RNG_Step
CALL =Pad_Button_Check
- PUSH AF
+ .CALL_SAVE_BANK =Play_Music
+ POP HL
+ POP DE
+ POP BC
LD A, $mem_button_action
BIT 3, A
JR NZ, =Title_Screen_Start_Pressed
@@ -107,6 +119,26 @@ Check_Frame_stuff:
Title_Screen_Start_Pressed:
LD A, $00
+ LD $mem_sound_flags, A
+ CALL =Reset_Music_Channels
+
+ ; Magic sound effect stuff
+ LD A, $8f
+ LD ($26), A
+ LD A, $ee
+ LD ($25), A
+ LD A, $ff
+ LD ($24), A
+ LD A, $3f
+ LD ($20), A
+ LD A, $f2
+ LD ($21), A
+ LD A, $01
+ LD ($22), A
+ LD A, $80
+ LD ($23), A
+
+ LD A, $00
.loop:
CALL =Next_VBlank_Wait
INC A
diff --git a/music/load.gbasm b/music/load.gbasm
index 0634a2b..eac38ac 100644
--- a/music/load.gbasm
+++ b/music/load.gbasm
@@ -1,15 +1,57 @@
-Load_Music:
- .LOAD_BANK_OF =_music_Dungeon
+.MACRODEF LOAD_MUSIC =music_addr
+ LD A, bank(=music_addr)
+ LD ($mem_current_vgm_header), A
+ LD A, high(ptr(=music_addr))
+ LD ($mem_current_vgm_header+1), A
+ LD A, low(ptr(=music_addr))
+ LD ($mem_current_vgm_header+2), A
+.END
- LD HL, ptr(=_music_Dungeon+52)
+Reset_Music_Channels:
+ LD A, $00
+ LD ($11), A
+ LD ($12), A
+ LD ($13), A
+ LD ($14), A
+ LD ($16), A
+ LD ($17), A
+ LD ($18), A
+ LD ($19), A
+ LD ($1A), A
+ LD ($1B), A
+ LD ($1C), A
+ LD ($1D), A
+ LD ($1E), A
+ LD ($20), A
+ LD ($21), A
+ LD ($22), A
+ LD ($23), A
+ RET
+
+Start_Music:
+ LD A, ($mem_current_vgm_header)
+ .CHANGE_BANK_TO_A
+ LD A, ($mem_current_vgm_header+1)
+ LD H, A
+ LD A, ($mem_current_vgm_header+2)
+ LD L, A
+
+ LD A, L
+ ADD $34
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+ CALL =Fix_HL_Bank
LD A, L
ADD (HL)
LD L, A
LD A, H
ADC $00
LD H, A
+ CALL =Fix_HL_Bank
- LD A, bank(=_music_Dungeon)
+ LD A, $saved_rom_bank
LD ($mem_current_vgm_pc), A
LD A, H
LD ($mem_current_vgm_pc+1), A
@@ -18,23 +60,39 @@ Load_Music:
RET
Loop_Music:
- .LOAD_BANK_OF =_music_Dungeon
+ LD A, ($mem_current_vgm_header)
+ .CHANGE_BANK_TO_A
+ LD A, ($mem_current_vgm_header+1)
+ LD H, A
+ LD A, ($mem_current_vgm_header+2)
+ LD L, A
- LD HL, ptr(=_music_Dungeon+28)
- LD BC, ptr(=_music_Dungeon+28)
- LD E, bank(=_music_Dungeon+28)
+ LD A, L
+ ADD $1c
+ LD L, A
+ LD A, H
+ ADC $00
+ LD H, A
+ CALL =Fix_HL_Bank
+ LD B, H
+ LD C, L
+ LD A, $saved_rom_bank
+ LD E, A
LD A, B
SUB $40
LD B, A
- LD A, (HL+)
+ LD A, (HL)
+ CALL =Inc_HL_Fix_Bank
ADD C
LD C, A
- LD A, (HL+)
+ LD A, (HL)
+ CALL =Inc_HL_Fix_Bank
ADC B
LD B, A
- LD A, (HL+)
+ LD A, (HL)
+ CALL =Inc_HL_Fix_Bank
ADC E
LD E, A
@@ -60,6 +118,11 @@ Loop_Music:
Inc_HL_Fix_Bank:
PUSH AF
INC HL
+ CALL =Fix_HL_Bank
+ POP AF
+ RET
+
+Fix_HL_Bank:
LD A, H
CP $80
JR C, =.end
@@ -71,10 +134,80 @@ Inc_HL_Fix_Bank:
.CHANGE_BANK_TO_A
.end:
- POP AF
+ RET
+
+Check_Channel_Available:
+ ; TODO: Channel panning register in $FF25 is still impacted by music
+ CP $24
+ RET NC
+
+ PUSH BC
+
+ CP $1A
+ JR NC =.channel_3_4
+ .channel_1_2:
+ CP $16
+ JR NC, =.channel_2
+
+ .channel_1:
+ LD C, A
+ LD A, $mem_sound_flags
+ BIT 1, A
+ LD A, C
+ JR Z, =.end
+ LD A, $00
+ JR =.end
+
+ .channel_2:
+ LD C, A
+ LD A, $mem_sound_flags
+ BIT 2, A
+ LD A, C
+ JR Z, =.end
+ LD A, $00
+ JR =.end
+
+ .channel_3_4:
+ CP $20
+ JR NC, =.channel_4
+
+ .channel_3:
+ LD C, A
+ LD A, $mem_sound_flags
+ BIT 3, A
+ LD A, C
+ JR Z, =.end
+ LD A, $00
+ JR =.end
+
+ .channel_4:
+ LD C, A
+ LD A, $mem_sound_flags
+ BIT 4, A
+ LD A, C
+ JR Z, =.end
+ LD A, $00
+
+ .end:
+ POP BC
RET
Play_Music:
+ LD A, $mem_sound_flags
+ BIT 0, A
+ RET Z
+ BIT 5, A
+ JR Z, =.sound_effect_frame_count_dec_skip
+ LD A, $mem_sound_effect_frame_count
+ DEC A
+ LD $mem_sound_effect_frame_count, A
+ CP $00
+ JR NZ, =.sound_effect_frame_count_dec_skip
+
+ LD A, $mem_sound_flags
+ AND 0b11000001
+ LD $mem_sound_flags, A
+ .sound_effect_frame_count_dec_skip:
LD A, ($mem_current_vgm_pc)
.CHANGE_BANK_TO_A
LD A, ($mem_current_vgm_pc+1)
@@ -90,10 +223,19 @@ Play_Music:
.set_register:
LD A, (HL)
CALL =Inc_HL_Fix_Bank
- ADD $10
LD C, A
- LD A, (HL)
+
+ LD B, (HL)
CALL =Inc_HL_Fix_Bank
+
+ LD A, C
+ ADD $10
+ CALL =Check_Channel_Available
+ CP $00
+ JR Z, =.next
+ LD C, A
+
+ LD A, B
LD (C), A
JR =.next
.set_register.end:
@@ -113,7 +255,7 @@ Play_Music:
.the61thingy.end:
.panic:
- DBG
+ LD A, $saved_rom_bank
STOP
.panic.end:
diff --git a/music/morning-forest.fur b/music/morning-forest.fur
index f5c4e0c..bb9b8d4 100644
--- a/music/morning-forest.fur
+++ b/music/morning-forest.fur
Binary files differ
diff --git a/music/morning-forest.vgm b/music/morning-forest.vgm
index fbedcce..b3f423d 100644
--- a/music/morning-forest.vgm
+++ b/music/morning-forest.vgm
Binary files differ
diff --git a/music/soundeffects.gbasm b/music/soundeffects.gbasm
new file mode 100644
index 0000000..f320aaf
--- /dev/null
+++ b/music/soundeffects.gbasm
@@ -0,0 +1,34 @@
+Wait_Next_Frame:
+ POP DE
+ LD A, $saved_rom_bank
+ LD ($mem_sound_effect_pc), A
+ LD A, D
+ LD ($mem_sound_effect_pc+1), A
+ LD A, E
+ LD ($mem_sound_effect_pc+2), A
+ RET
+
+.MACRODEF RET_WAIT_NEXT_FRAME
+ CALL =Wait_Next_Frame
+.END
+
+Play_Sound_Effect:
+ LD A, ($mem_sound_effect_pc)
+ CP $ff
+ RET Z
+ .CHANGE_BANK_TO_A
+ LD A, ($mem_sound_effect_pc+1)
+ LD D, A
+ LD A, ($mem_sound_effect_pc+2)
+ LD E, A
+ PUSH DE
+ RET
+
+.MACRODEF SET_SOUND_EFFECT =addr
+ LD A, bank(=addr)
+ LD ($mem_sound_effect_pc), A
+ LD A, high(ptr(=addr))
+ LD ($mem_sound_effect_pc+1), A
+ LD A, low(ptr(=addr))
+ LD ($mem_sound_effect_pc+2), A
+.END
diff --git a/music/soundeffects/click.gbasm b/music/soundeffects/click.gbasm
new file mode 100644
index 0000000..8b811db
--- /dev/null
+++ b/music/soundeffects/click.gbasm
@@ -0,0 +1,36 @@
+_sound_effect_Click:
+ LD A, $mem_sound_flags
+ SET 2, A
+ LD $mem_sound_flags, A
+
+ ; LD A, $3f
+ LD A, $80
+ LD ($16), A
+ ; LD A, $a1
+ LD A, $f3
+ LD ($17), A
+ ; LD A, $16
+ LD A, $83
+ LD ($18), A
+ ; LD A, $84
+ LD A, $87
+ LD ($19), A
+
+ .RET_WAIT_NEXT_FRAME
+ ; .RET_WAIT_NEXT_FRAME
+ ; .RET_WAIT_NEXT_FRAME
+ ; .RET_WAIT_NEXT_FRAME
+
+ LD A, $08
+ LD ($17), A
+ LD A, $16
+ LD ($18), A
+ LD A, $84
+ LD ($19), A
+
+ LD A, $mem_sound_flags
+ AND 0b11000001
+ LD $mem_sound_flags, A
+ LD A, $ff
+ LD ($mem_sound_effect_pc), A
+ RET
diff --git a/music/title-screen-music.fur b/music/title-screen-music.fur
index f20eff8..9a474c5 100644
--- a/music/title-screen-music.fur
+++ b/music/title-screen-music.fur
Binary files differ
diff --git a/music/title-screen.vgm b/music/title-screen.vgm
new file mode 100644
index 0000000..4c6725b
--- /dev/null
+++ b/music/title-screen.vgm
Binary files differ
diff --git a/utils.gbasm b/utils.gbasm
index 5d6f9e7..5c50ed3 100644
--- a/utils.gbasm
+++ b/utils.gbasm
@@ -409,7 +409,6 @@ VBlank_Wait:
POP AF
RET
-
.MACRODEF CHANGE_BANK_TO_A
LD $reg_rom_bank, A
LD $saved_rom_bank, A
@@ -430,6 +429,21 @@ VBlank_Wait:
CALL ptr(=addr)
.END
+Call_Save_Bank: ; Address in DE (bank 0) ; Breaks A
+ LD A, $saved_rom_bank
+ PUSH AF
+ .CALL_DE
+ LD A, $saved_rom_bank
+ POP AF
+ .CHANGE_BANK_TO_A
+ RET
+
+.MACRODEF CALL_SAVE_BANK =addr
+ .ASSERT bank(=addr) $00
+ LD DE, ptr(=addr)
+ CALL =Call_Save_Bank
+.END
+
.MACRODEF COPY_4BYTES dest src
LD A, ($src)
LD ($dest), A