summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremilybrooks <emilybrooksemilybrooks@gmail.com>2024-01-02 11:14:05 -0700
committerGitHub <noreply@github.com>2024-01-02 11:14:05 -0700
commitebd97e9fd1cd8bb02a397ca8b0982bc0e2b076ae (patch)
tree7f7b0e0b67284e74a0178a384f9c85b909589971
parent72514d5aae62cc9789b2de0d3d3ba764be2c168d (diff)
sys_initial_check OK (#129)
* initial commit * almost matching, need to figure out segment stuff * fully matching * file description * m_std_dma
-rw-r--r--include/c_keyframe.h1
-rw-r--r--include/fault.h2
-rw-r--r--include/segment_symbols.h2
-rw-r--r--include/tables/dmatables/dmadata_table_jp.h2
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt12
-rw-r--r--src/code/sys_initial_check.c82
-rw-r--r--yamls/jp/assets.yaml4
-rw-r--r--yamls/jp/code.yaml6
8 files changed, 100 insertions, 11 deletions
diff --git a/include/c_keyframe.h b/include/c_keyframe.h
index 26a00c7..7226579 100644
--- a/include/c_keyframe.h
+++ b/include/c_keyframe.h
@@ -3,6 +3,7 @@
#include "ultra64.h"
#include "z64math.h"
+#include "unk.h"
struct Game_Play;
diff --git a/include/fault.h b/include/fault.h
index 6cd6e30..0e33987 100644
--- a/include/fault.h
+++ b/include/fault.h
@@ -28,6 +28,8 @@
#define FAULT_ESC '\x1A'
#define FAULT_COLOR(n) "\x1A" FAULT_COLOR_EXPAND_AND_STRINGIFY(FAULT_COLOR_ ## n)
+// Address at the end of "non-expansion" memory space
+#define FAULT_FB_ADDRESS (void*)((PHYS_TO_K0(0x400000) - SCREEN_HEIGHT * SCREEN_WIDTH * sizeof(u16)))
typedef void (*FaultClientCallback)(void*, void*);
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index 544c1b7..7d7cbc1 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -97,6 +97,8 @@ DECLARE_SEGMENT(catalog_ovl);
DECLARE_SEGMENT(ac_set_ovl_insect);
DECLARE_SEGMENT(ac_set_ovl_gyoei);
+DECLARE_SEGMENT(locerrmsg);
+
DECLARE_SEGMENT(segment_00A58000);
DECLARE_SEGMENT(segment_00E02000);
diff --git a/include/tables/dmatables/dmadata_table_jp.h b/include/tables/dmatables/dmadata_table_jp.h
index d66685b..76aa51a 100644
--- a/include/tables/dmatables/dmadata_table_jp.h
+++ b/include/tables/dmatables/dmadata_table_jp.h
@@ -1854,7 +1854,7 @@ DEFINE_DMA_ENTRY(segment_009F5000, "segment_009F5000")
DEFINE_DMA_ENTRY(segment_00A00000, "segment_00A00000")
DEFINE_DMA_ENTRY(segment_00A0B000, "segment_00A0B000")
DEFINE_DMA_ENTRY(segment_00A16000, "segment_00A16000")
-DEFINE_DMA_ENTRY(segment_00A21000, "segment_00A21000")
+DEFINE_DMA_ENTRY(locerrmsg, "locerrmsg")
DEFINE_DMA_ENTRY(gameplay_keep, "gameplay_keep")
DEFINE_DMA_ENTRY(segment_00A30000, "segment_00A30000")
DEFINE_DMA_ENTRY(segment_00A40000, "segment_00A40000")
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index 9803eee..63b1ae8 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -3564,12 +3564,12 @@ func_800D9788_jp = 0x800D9788; // type:func
func_800D97A0_jp = 0x800D97A0; // type:func
func_800D97F8_jp = 0x800D97F8; // type:func
func_800D986C_jp = 0x800D986C; // type:func
-func_800D9890_jp = 0x800D9890; // type:func
-func_800D98C0_jp = 0x800D98C0; // type:func
-func_800D9900_jp = 0x800D9900; // type:func
-func_800D99F0_jp = 0x800D99F0; // type:func
-func_800D9A6C_jp = 0x800D9A6C; // type:func
-func_800D9B44_jp = 0x800D9B44; // type:func
+Check_WriteRGBA16Pixel = 0x800D9890; // type:func
+Check_WriteI4Pixel = 0x800D98C0; // type:func
+Check_DrawI4Texture = 0x800D9900; // type:func
+Check_ClearRGBA16 = 0x800D99F0; // type:func
+Check_DrawRegionLockErrorMessage = 0x800D9A6C; // type:func
+Check_RegionIsSupported = 0x800D9B44; // type:func
reverse_u32 = 0x800D9BA0; // type:func
init_rnd = 0x800D9C30; // type:func
ffact = 0x800D9C60; // type:func
diff --git a/src/code/sys_initial_check.c b/src/code/sys_initial_check.c
new file mode 100644
index 0000000..dbaf917
--- /dev/null
+++ b/src/code/sys_initial_check.c
@@ -0,0 +1,82 @@
+/**
+ * @file sys_initial_check.c
+ * Functions for checking the TV type (PAL/NTSC/MPAL), and printing an error message to the screen if it's not NTSC
+ */
+
+#include "color.h"
+#include "macros.h"
+#include "m_std_dma.h"
+#include "segment_symbols.h"
+#include "fault.h"
+
+void Check_WriteRGBA16Pixel(u16* buffer, u32 x, u32 y, u32 value) {
+ if (value & RGBA16_PIXEL_OPAQUE) {
+ (&buffer[x])[y * SCREEN_WIDTH] = value;
+ }
+}
+
+void Check_WriteI4Pixel(u16* buffer, u32 x, u32 y, u32 value) {
+ Check_WriteRGBA16Pixel(buffer, x, y, value * GPACK_RGBA5551(16, 16, 16, 0) + GPACK_RGBA5551(12, 12, 12, 1));
+}
+
+void Check_DrawI4Texture(u16* buffer, s32 x, s32 y, s32 width, s32 height, u8* texture) {
+ s32 v;
+ s32 u;
+ u8 pixelPair;
+ u8* pixelPairPointer = texture;
+
+ for (v = 0; v < height; v++) {
+ for (u = 0; u < width; u += 2, pixelPairPointer++) {
+ pixelPair = *pixelPairPointer;
+ Check_WriteI4Pixel(buffer, x + u, y + v, pixelPair >> 4);
+ pixelPair = *pixelPairPointer;
+ Check_WriteI4Pixel(buffer, x + u + 1, y + v, pixelPair & 0xF);
+ }
+ }
+}
+
+void Check_ClearRGBA16(u16* buffer) {
+ u32 x;
+ u32 y;
+
+ for (y = 0; y < SCREEN_HEIGHT; y++) {
+ for (x = 0; x < SCREEN_WIDTH; x++) {
+ Check_WriteRGBA16Pixel(buffer, x, y, 1);
+ }
+ }
+}
+
+#define ERROR_TEXTURE_WIDTH 208
+#define ERROR_TEXTURE_HEIGHT 16
+#define ERROR_TEXTURE_SIZE (ERROR_TEXTURE_WIDTH * ERROR_TEXTURE_HEIGHT / 2)
+#define ERROR_TEXTURE_VRAM (u8*)((uintptr_t)FAULT_FB_ADDRESS - ERROR_TEXTURE_SIZE)
+u8 Check_ErrorTextureYCoords[] = { 112, 0 };
+
+void Check_DrawRegionLockErrorMessage(void) {
+ s32 i;
+
+ DmaMgr_RequestSyncDebug(ERROR_TEXTURE_VRAM, SEGMENT_ROM_START(locerrmsg), SEGMENT_VRAM_SIZE(locerrmsg),
+ "../sys_initial_check.c", 130);
+ Check_ClearRGBA16(FAULT_FB_ADDRESS);
+ for (i = 0; i < 1; i++) {
+ Check_DrawI4Texture(FAULT_FB_ADDRESS, 56, Check_ErrorTextureYCoords[i], ERROR_TEXTURE_WIDTH,
+ ERROR_TEXTURE_HEIGHT, ERROR_TEXTURE_VRAM + i * ERROR_TEXTURE_SIZE);
+ }
+ osWritebackDCacheAll();
+ osViSwapBuffer(FAULT_FB_ADDRESS);
+ osViBlack(false);
+}
+
+void Check_RegionIsSupported(void) {
+ s32 regionSupported = false;
+
+ if (osTvType == OS_TV_NTSC) {
+ regionSupported = true;
+ }
+
+ if (!regionSupported) {
+ Check_DrawRegionLockErrorMessage();
+ osDestroyThread(NULL);
+ while (true) {};
+ }
+}
diff --git a/yamls/jp/assets.yaml b/yamls/jp/assets.yaml
index 739f34c..92e3a40 100644
--- a/yamls/jp/assets.yaml
+++ b/yamls/jp/assets.yaml
@@ -62,10 +62,10 @@
align: 0x1000
- [0xA20010]
- - name: segment_00A21000
+ - name: locerrmsg
type: bin
start: 0xA21000
- # vram:
+ vram: 0x01000000
compress: True
align: 0x1000
- [0xA21680]
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 36cd56c..b7be5bf 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -104,7 +104,7 @@
- [0x6FB340, asm, code/6FB340]
- [0x6FC540, asm, code/speed_meter]
- [0x6FD190, asm, code/6FD190]
- - [0x6FD530, asm, code/sys_initial_check]
+ - [0x6FD530, c, code/sys_initial_check]
- [0x6FD840, asm, code/sys_math]
- [0x6FDC40, asm, code/sys_math3d]
- [0x703C30, c, code/sys_math_atan]
@@ -169,6 +169,8 @@
- [0x732C70, .data, code/lb_rtc]
- [0x732C80, .data, code/lb_reki]
- [0x733080, data, code/733080]
+ - [0x7330F0, .data, code/sys_initial_check]
+ - [0x733100, data, code/733100]
- [0x733160, .data, code/sys_math_atan]
- [0x733970, .data, code/sys_matrix]
- [0x7339F0, .data, code/sys_ucode]
@@ -242,7 +244,7 @@
- [0x73BB80, rodata, code/73BB80]
- [0x73BCA0, rodata, code/73BCA0]
- [0x73BD20, rodata, code/73BD20]
- - [0x73BD30, rodata, code/73BD30]
+ - [0x73BD30, .rodata, code/sys_initial_check]
- [0x73BD50, rodata, code/73BD50]
- [0x73BD70, rodata, code/sys_math3d]
- [0x73BE00, .rodata, code/sys_math_atan]