diff options
| -rw-r--r-- | include/c_keyframe.h | 1 | ||||
| -rw-r--r-- | include/fault.h | 2 | ||||
| -rw-r--r-- | include/segment_symbols.h | 2 | ||||
| -rw-r--r-- | include/tables/dmatables/dmadata_table_jp.h | 2 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_code.txt | 12 | ||||
| -rw-r--r-- | src/code/sys_initial_check.c | 82 | ||||
| -rw-r--r-- | yamls/jp/assets.yaml | 4 | ||||
| -rw-r--r-- | yamls/jp/code.yaml | 6 |
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] |
