aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2025-02-06 19:22:00 +0900
committerAstatin <[email protected]>2025-02-06 19:22:00 +0900
commit674d876aeff3eaaec1cf0226e45a6f649baca471 (patch)
treedd589d4de2b4eaa2cac8ff6718f6211fa19c72fd
parentca26030e800318d48aec501e6f470eea8d4299c0 (diff)
Stop changing window lcdc values mid-frame to avoid UB
-rw-r--r--definitions.gbasm11
-rw-r--r--gui.gbasm32
-rw-r--r--init.gbasm4
-rw-r--r--main.gbasm57
-rw-r--r--tiles.gbasm10
-rw-r--r--utils.gbasm73
6 files changed, 106 insertions, 81 deletions
diff --git a/definitions.gbasm b/definitions.gbasm
index 72eca2e..832377d 100644
--- a/definitions.gbasm
+++ b/definitions.gbasm
@@ -161,10 +161,10 @@
.DEFINE dialogue_menu_choice3 $cac5
.DEFINE dialogue_menu_choice4 $cace
-.DEFINE dialogue_menu_choice1_cursor ($9dc1)
-.DEFINE dialogue_menu_choice2_cursor ($9dca)
-.DEFINE dialogue_menu_choice3_cursor ($9e01)
-.DEFINE dialogue_menu_choice4_cursor ($9e0a)
+.DEFINE dialogue_menu_choice1_cursor ($9cb4)
+.DEFINE dialogue_menu_choice2_cursor ($9cbd)
+.DEFINE dialogue_menu_choice3_cursor ($9cf4)
+.DEFINE dialogue_menu_choice4_cursor ($9cfd)
.DEFINE mem_last_animation_low_pointer ($cadf)
@@ -215,8 +215,7 @@
.DEFINE obj_palette_frozen $ab
.DEFINE lcdc_guibg_tilemap $8d
-.DEFINE lcdc_mapbg_no_window_tilemap $87
-.DEFINE lcdc_mapbg_window_tilemap $e7
+.DEFINE lcdc_mapbg_tilemap $87
; HIGH_RAM:
;
diff --git a/gui.gbasm b/gui.gbasm
index 957b67d..a253a13 100644
--- a/gui.gbasm
+++ b/gui.gbasm
@@ -17,20 +17,20 @@ Copy_Dialogue_Buffer:
RET Z
RES 2, A
LD $mem_display_flag, A
- LD HL, $9dc1
+ LD HL, $9cb4
LD DE, $dialogue_first_line
- LD BC, $12
- CALL =memcpy
+ LD C, $12
+ CALL =tilemap_memcpy
- ; LD HL, $9de1
+ ; LD HL, $9cd4
; LD DE, $dialogue_second_line
- ; LD BC, $12
- ; CALL =memcpy
+ ; LD C, $12
+ ; CALL =tilemap_memcpy
- LD HL, $9e01
+ LD HL, $9cf4
LD DE, $dialogue_third_line
- LD BC, $12
- JP =memcpy
+ LD C, $12
+ JP =tilemap_memcpy
Init_Menu:
LD HL, $dialogue_menu_choice1
@@ -207,9 +207,19 @@ Check_Open_Menu_button:
CALL =Init_Menu
+ LD A, $enum_dungeon_menu_mode
+ LD $mem_requested_mode, A
+ RET
+
+Open_dialogue_on_dungeon_menu_mode:
+ LD A, $mem_current_mode
+ CP $enum_dungeon_menu_mode
+ RET NZ
+ LD A, $mem_requested_mode
+ CP $enum_dungeon_menu_mode
+ RET NZ
+
LD A, $0d
LD $mem_display_flag, A
- LD A, $enum_dungeon_menu_mode
- LD $mem_requested_mode, A
RET
diff --git a/init.gbasm b/init.gbasm
index 798a545..1115f70 100644
--- a/init.gbasm
+++ b/init.gbasm
@@ -75,11 +75,11 @@ Initialize_Window_GUI:
LD (HL+), A
LD A, L
- CP $40
+ CP $94
LD $reg_lcd_status, A
JR NZ, =.top_bar_loop
- LD HL, $9da0
+ LD HL, $9c80
LD BC, $00a0
LD DE, =Dialogue_Box_Tilemap_data
CALL =memcpy
diff --git a/main.gbasm b/main.gbasm
index b676844..e09949c 100644
--- a/main.gbasm
+++ b/main.gbasm
@@ -13,6 +13,15 @@
$HBlank_Wait.End:
.END
+.MACRODEF SET_WINDOW_LCDC_E
+ LD A, $mem_display_flag
+ BIT 3, A
+ LD E, $00
+ JR Z, =$No_Window
+ LD E, $60
+ $No_Window:
+.END
+
.MACRODEF ENABLE_TOP_BAR
XOR A
LD $reg_viewport_x, A
@@ -20,38 +29,23 @@
LD $reg_viewport_y, A
LD A, $lcdc_guibg_tilemap
+ OR E
LD $reg_lcd_controller, A
.END
.MACRODEF ENABLE_DIALOGUE
.HBLANK_WAIT
- XOR A
+ LD A, $98
LD $reg_viewport_x, A
+ LD A, $b8
LD $reg_viewport_y, A
LD A, $lcdc_guibg_tilemap
+ OR E
LD $reg_lcd_controller, A
.END
-.MACRODEF DISABLE_DIALOGUE_NO_WINDOW
- PUSH BC
- LD A, $mem_prepared_viewport_x
- LD B, A
- LD A, $mem_prepared_viewport_y
- LD C, A
- .HBLANK_WAIT
- LD A, B
- LD $reg_viewport_x, A
- LD A, C
- LD $reg_viewport_y, A
- LD A, $mem_prepared_color_palette
- LD $reg_bg_palette, A
- LD A, $lcdc_mapbg_no_window_tilemap
- LD $reg_lcd_controller, A
- POP BC
-.END
-
-.MACRODEF DISABLE_DIALOGUE_WINDOW
+.MACRODEF DISABLE_DIALOGUE
PUSH BC
LD A, $mem_prepared_viewport_x
LD B, A
@@ -64,7 +58,8 @@
LD $reg_viewport_y, A
LD A, $mem_prepared_color_palette
LD $reg_bg_palette, A
- LD A, $lcdc_mapbg_window_tilemap
+ LD A, $lcdc_mapbg_tilemap
+ OR E
LD $reg_lcd_controller, A
POP BC
.END
@@ -131,6 +126,7 @@ New_Dungeon:
LD A, $6a
LD ($9d66), A
+ .SET_WINDOW_LCDC_E
.ENABLE_TOP_BAR
.ENABLE_VBLANK_INTERRUPTS
EI
@@ -140,6 +136,7 @@ New_Dungeon:
JP =Wait_for_Interrupt.loop
VBLANK_Entrypoint:
+ .SET_WINDOW_LCDC_E
.ENABLE_TOP_BAR
LD A, $palette_bold_font
@@ -205,6 +202,7 @@ VBLANK_Entrypoint:
CALL =Loading_Mode_Regular
CALL =Animation_Wait_Mode
CALL =Update_Animation_Steps
+ CALL =Open_dialogue_on_dungeon_menu_mode
CALL =Check_Open_Menu_button
CALL =Move_dialogue_cursor
CALL =Check_dialogue_action
@@ -219,6 +217,9 @@ VBLANK_Entrypoint:
STAT_Entrypoint:
PUSH AF
+ PUSH DE
+ .SET_WINDOW_LCDC_E
+
LD A, $reg_lyc
CP $0a
JR Z, =.End_Top_Bar
@@ -242,28 +243,22 @@ STAT_Entrypoint:
LD A, $77
LD $reg_lyc, A
.RESET_STAT_INTERRUPT
+ POP DE
POP AF
RETI
.skip_dialogue:
.DISABLE_LYC_INTERRUPT
+ POP DE
POP AF
RET
.End_Top_Bar:
- LD A, $mem_display_flag
- BIT 3, A
- JR Z, =.No_Window
- .Window:
- .DISABLE_DIALOGUE_WINDOW
- JR =.Setup_dialogue_lyc
- .No_Window:
- .DISABLE_DIALOGUE_NO_WINDOW
-
- .Setup_dialogue_lyc:
+ .DISABLE_DIALOGUE
LD A, $67
LD $reg_lyc, A
.RESET_STAT_INTERRUPT
+ POP DE
POP AF
RETI
diff --git a/tiles.gbasm b/tiles.gbasm
index 449f9b9..da3d821 100644
--- a/tiles.gbasm
+++ b/tiles.gbasm
@@ -78,11 +78,11 @@ Reload_Entities_Tile_Data:
RET
Dialogue_Box_Tilemap_data:
- .DB 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .DB 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- .DB 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ .DB 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
+ .DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ .DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ .DB 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ .DB 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18
Cost_Window_Tilemap_data:
.DB 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
diff --git a/utils.gbasm b/utils.gbasm
index 4f7e7f7..47fec5a 100644
--- a/utils.gbasm
+++ b/utils.gbasm
@@ -1,26 +1,47 @@
memcpy: ; src = DE, dest = HL, n = BC
- memcpy.loop:
+ .loop:
LD A, (DE)
LD (HL+), A
INC DE
DEC BC
XOR A
CP B
- JR NZ =memcpy.loop
+ JR NZ =.loop
+ CP C
+ JR NZ =.loop
+ RET
+
+tilemap_memcpy: ; src = DE, dest = HL, n = C
+ .loop:
+ LD A, (DE)
+ LD (HL), A
+ LD A, L
+
+ INC A
+ AND $1f
+ LD B, A
+ LD A, L
+ AND $e0
+ OR B
+ LD L, A
+
+ INC DE
+ DEC C
+ XOR A
CP C
- JR NZ =memcpy.loop
+ JR NZ =.loop
RET
bzero: ; dest = HL, n = BC
LD A, $00
- bzero.loop:
+ .loop:
LD (HL+), A
INC DE
DEC BC
CP B
- JR NZ =bzero.loop
+ JR NZ =.loop
CP C
- JR NZ =bzero.loop
+ JR NZ =.loop
RET
.MACRODEF ABS
@@ -168,16 +189,16 @@ Print_str: ; Memory Tilemap position in HL, Text address in BC, FF ended
PUSH AF
PUSH BC
- Print_str.loop:
+ .loop:
LD A, (BC)
CP $ff
- JR Z, =Print_str.end
+ JR Z, =.end
LD (HL+), A
INC BC
- JR =Print_str.loop
+ JR =.loop
- Print_str.end:
+ .end:
POP BC
POP AF
RET
@@ -187,65 +208,65 @@ MUL: ; B x C => EA
LD E, $00
BIT 7, B
- JR Z, =MUL.bit7
+ JR Z, =.bit7
ADD C
- MUL.bit7:
+ .bit7:
SLA A
RL E
BIT 6, B
- JR Z, =MUL.bit6
+ JR Z, =.bit6
ADD C
- MUL.bit6:
+ .bit6:
SLA A
RL E
BIT 5, B
- JR Z, =MUL.bit5
+ JR Z, =.bit5
ADD C
- MUL.bit5:
+ .bit5:
SLA A
RL E
BIT 4, B
- JR Z, =MUL.bit4
+ JR Z, =.bit4
ADD C
- MUL.bit4:
+ .bit4:
SLA A
RL E
BIT 3, B
- JR Z, =MUL.bit3
+ JR Z, =.bit3
ADD C
- MUL.bit3:
+ .bit3:
SLA A
RL E
BIT 2, B
- JR Z, =MUL.bit2
+ JR Z, =.bit2
ADD C
- MUL.bit2:
+ .bit2:
SLA A
RL E
BIT 1, B
- JR Z, =MUL.bit1
+ JR Z, =.bit1
ADD C
- MUL.bit1:
+ .bit1:
SLA A
RL E
BIT 0, B
- JR Z, =MUL.bit0
+ JR Z, =.bit0
ADD C
- MUL.bit0:
+ .bit0:
RET
VBlank_Wait: