summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2024-05-03 12:17:36 -0600
committerGitHub <noreply@github.com>2024-05-03 12:17:36 -0600
commit15485120841f9b5fb3941c155f59bea313151f6b (patch)
treebd4474be0a9e5ccd3ba37cca4ced31026d26730b
parent6a6a78f719e12b9d7f8108de9d17d4fcc3d46788 (diff)
First Compile (#7)
* Update torch * A lot of fixes * First compile
-rw-r--r--include/decode.h2
-rw-r--r--include/segments.h64
-rw-r--r--include/stubs.h24
-rw-r--r--src/audio/heap.c1
-rw-r--r--src/audio/load.c76
-rw-r--r--src/audio/mixer.c78
-rw-r--r--src/audio/mixer.h12
-rw-r--r--src/audio/synthesis.c1
-rw-r--r--src/code_8006E9C0.c22
-rw-r--r--src/code_80091750.c188
-rw-r--r--src/code_80091750.h5
-rw-r--r--src/crash_screen.c442
-rw-r--r--src/ending/code_80280000.c2
-rw-r--r--src/ending/code_80281780.c4
-rw-r--r--src/kart_dma.c254
-rw-r--r--src/kart_dma.h2
-rw-r--r--src/main.c118
-rw-r--r--src/port/Variables.cpp2
-rw-r--r--src/racing/memory.c58
-rw-r--r--src/render_player.c1
-rw-r--r--src/save.c1
-rw-r--r--src/spawn_players.c1
-rw-r--r--src/staff_ghosts.c4
-rw-r--r--src/stubs.c90
-rw-r--r--src/update_objects.c2
-rw-r--r--yamls/us/common_data.yml114
26 files changed, 832 insertions, 736 deletions
diff --git a/include/decode.h b/include/decode.h
index 0ea4f7b91..d8d644f26 100644
--- a/include/decode.h
+++ b/include/decode.h
@@ -3,8 +3,6 @@
#include "common_structs.h"
-void mio0decode(u8* arg0, u8* arg1);
-
// Unused mio0decode function.
void func_80040030(u8* arg0, u8* arg1);
diff --git a/include/segments.h b/include/segments.h
index ec34b6d64..9c3d8d673 100644
--- a/include/segments.h
+++ b/include/segments.h
@@ -47,38 +47,38 @@ extern u8 _startupLogoSegmentRomEnd[];
// Defines duplicated even if the same for both for easier readability
#ifdef AVOID_UB
- #define MEMORY_POOL_START (uintptr_t) &_memoryPoolSegmentNoloadStart[0]
- #define MEMORY_POOL_END (uintptr_t) &_memoryPoolSegmentNoloadEnd[0]
-
- #define SEG_ENDING (uintptr_t) &_endingSegmentStart[0]
- #define SEG_ENDING_ROM_START (uintptr_t) &_endingSegmentRomStart[0]
- /**
- * Ending segment original size is 0xDF00 but much of that remains unused.
- * This auto fits the segment to its proper size.
- */
- #define SEG_ENDING_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_endingSegmentNoloadEnd[0] - &_endingSegmentStart[0]) )
- #define SEG_ENDING_ROM_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_endingSegmentRomEnd[0] - &_endingSegmentRomStart[0]) )
-
- #define SEG_RACING (uintptr_t) &_racingSegmentStart[0]
- #define SEG_RACING_ROM_START (uintptr_t) &_racingSegmentRomStart[0]
- #define SEG_RACING_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_racingSegmentNoloadEnd[0] - &_racingSegmentStart[0]) )
- #define SEG_RACING_ROM_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_racingSegmentRomEnd[0] - &_racingSegmentRomStart[0]) )
-
- #define TRIG_TABLES (uintptr_t) &_trigTablesSegmentStart[0]
- #define TRIG_TABLES_ROM_START (uintptr_t) &_trigTablesSegmentRomStart[0]
- #define TRIG_TABLES_SIZE (size_t) _trigTablesSegmentSize
-
- #define SEG_DATA_START (uintptr_t) &_data_segment2SegmentRomStart[0]
- #define SEG_DATA_END (uintptr_t) &_data_segment2SegmentRomEnd[0]
-
- #define COMMON_TEXTURES_ROM_START (uintptr_t) &_common_texturesSegmentRomStart[0]
- #define COMMON_TEXTURES_SIZE (ptrdiff_t) (&_common_texturesSegmentRomEnd[0] - &_common_texturesSegmentRomStart[0])
-
- #define CEREMONY_DATA_ROM_START &_ceremonyDataSegmentRomStart[0]
- #define CEREMONY_DATA_ROM_END &_ceremonyDataSegmentRomEnd[0]
-
- #define STARTUP_LOGO_ROM_START &_startupLogoSegmentRomStart[0]
- #define STARTUP_LOGO_ROM_END &_startupLogoSegmentRomEnd[0]
+ // #define MEMORY_POOL_START (uintptr_t) &_memoryPoolSegmentNoloadStart[0]
+ // #define MEMORY_POOL_END (uintptr_t) &_memoryPoolSegmentNoloadEnd[0]
+
+ // #define SEG_ENDING (uintptr_t) &_endingSegmentStart[0]
+ // #define SEG_ENDING_ROM_START (uintptr_t) &_endingSegmentRomStart[0]
+ // /**
+ // * Ending segment original size is 0xDF00 but much of that remains unused.
+ // * This auto fits the segment to its proper size.
+ // */
+ // #define SEG_ENDING_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_endingSegmentNoloadEnd[0] - &_endingSegmentStart[0]) )
+ // #define SEG_ENDING_ROM_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_endingSegmentRomEnd[0] - &_endingSegmentRomStart[0]) )
+
+ // #define SEG_RACING (uintptr_t) &_racingSegmentStart[0]
+ // #define SEG_RACING_ROM_START (uintptr_t) &_racingSegmentRomStart[0]
+ // #define SEG_RACING_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_racingSegmentNoloadEnd[0] - &_racingSegmentStart[0]) )
+ // #define SEG_RACING_ROM_SIZE (size_t) ALIGN16( (ptrdiff_t) (&_racingSegmentRomEnd[0] - &_racingSegmentRomStart[0]) )
+
+ // #define TRIG_TABLES (uintptr_t) &_trigTablesSegmentStart[0]
+ // #define TRIG_TABLES_ROM_START (uintptr_t) &_trigTablesSegmentRomStart[0]
+ // #define TRIG_TABLES_SIZE (size_t) _trigTablesSegmentSize
+
+ // #define SEG_DATA_START (uintptr_t) &_data_segment2SegmentRomStart[0]
+ // #define SEG_DATA_END (uintptr_t) &_data_segment2SegmentRomEnd[0]
+
+ // #define COMMON_TEXTURES_ROM_START (uintptr_t) &_common_texturesSegmentRomStart[0]
+ // #define COMMON_TEXTURES_SIZE (ptrdiff_t) (&_common_texturesSegmentRomEnd[0] - &_common_texturesSegmentRomStart[0])
+
+ // #define CEREMONY_DATA_ROM_START &_ceremonyDataSegmentRomStart[0]
+ // #define CEREMONY_DATA_ROM_END &_ceremonyDataSegmentRomEnd[0]
+
+ // #define STARTUP_LOGO_ROM_START &_startupLogoSegmentRomStart[0]
+ // #define STARTUP_LOGO_ROM_END &_startupLogoSegmentRomEnd[0]
#else // Required for ok
diff --git a/include/stubs.h b/include/stubs.h
index 51196871c..d4a45ad14 100644
--- a/include/stubs.h
+++ b/include/stubs.h
@@ -12,4 +12,26 @@ extern u8 osAppNmiBuffer[64];
void rmonPrintf(const char* fmt, ...);
void func_80040030(u8* arg0, u8* arg1);
-void func_80040174(void*, s32, s32); \ No newline at end of file
+void func_80040174(void*, s32, s32);
+s32 osAiSetFrequency(u32 freq);
+void mio0decode(u8* arg0, u8* arg1);
+s32 mio0encode(s32 input, s32, s32);
+void tkmk00decode(u8*, u8*, u8*, s32);
+void osStartThread(OSThread* thread);
+void osCreateThread(OSThread *thread, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri pri);
+void osInitialize(void);
+void osSetThreadPri(OSThread *thread, OSPri pri);
+void osSpTaskLoad(OSTask *task);
+void osSpTaskStartGo(OSTask *task);
+void osSpTaskYield(void);
+OSYieldResult osSpTaskYielded(OSTask *task);
+s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name);
+s32 osPfsReadWriteFile(OSPfs *pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8 *data_buffer);
+s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, int file_size_in_bytes, s32 *file_no);
+void osSetTime(OSTime time);
+s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern);
+s32 osPfsInit(OSMesgQueue *queue, OSPfs *pfs, int channel);
+s32 osPfsNumFiles(OSPfs *pfs, s32 *max_files, s32 *files_used);
+s32 osPfsFileState(OSPfs *pfs, s32 file_no, OSPfsState *state);
+s32 osPfsFreeBlocks(OSPfs *pfs, s32 *bytes_not_used);
+s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, s32 *file_no); \ No newline at end of file
diff --git a/src/audio/heap.c b/src/audio/heap.c
index 53a104e06..1b04df782 100644
--- a/src/audio/heap.c
+++ b/src/audio/heap.c
@@ -1,5 +1,6 @@
#include <libultraship.h>
#include <macros.h>
+#include <stubs.h>
#include "audio/data.h"
#include "audio/effects.h"
diff --git a/src/audio/load.c b/src/audio/load.c
index 2c9e6fdfe..b18bc8fa1 100644
--- a/src/audio/load.c
+++ b/src/audio/load.c
@@ -784,9 +784,11 @@ void audio_init(void) {
gAudioLoadLock = 0;
- for (i = 0; i < gAudioHeapSize / 8; i++) {
- ((u64 *) D_803B71B0)[i] = 0;
- }
+ // for (i = 0; i < gAudioHeapSize / 8; i++) {
+ // ((u64 *) D_803B71B0)[i] = 0;
+ // }
+
+ memset(D_803B71B0, 0, gAudioHeapSize);
#ifdef TARGET_N64
// It seems boot.s doesn't clear the .bss area for audio, so do it here.
@@ -842,40 +844,40 @@ void audio_init(void) {
gAudioResetPresetIdToLoad = 0;
gAudioResetStatus = one;
audio_shut_down_and_reset_step();
- gSeqFileHeader = (ALSeqFile *) sp60;
- test = &_sequencesSegmentRomStart;
- audio_dma_copy_immediate(test, gSeqFileHeader, 0x00000010U);
- gSequenceCount = gSeqFileHeader->seqCount;
- size = gSequenceCount * sizeof(ALSeqData) + 4;
- size = ALIGN16(size);
- gSeqFileHeader = soundAlloc(&gAudioInitPool, size);
- audio_dma_copy_immediate(test, gSeqFileHeader, size);
- func_800BB43C(gSeqFileHeader, test);
- gAlCtlHeader = (ALSeqFile *) sp60;
- test = &_audio_banksSegmentRomStart;
- audio_dma_copy_immediate(test, gAlCtlHeader, 0x00000010U);
- aaa = gAlCtlHeader->seqCount;
- size = ALIGN16(aaa * sizeof(ALSeqData) + 4);
- gAlCtlHeader = soundAlloc(&gAudioInitPool, size);
- audio_dma_copy_immediate(test, gAlCtlHeader, size);
- func_800BB43C(gAlCtlHeader, test);
- gCtlEntries = soundAlloc(&gAudioInitPool, aaa * 0xC);
- for (i = 0; i < aaa; i++) {
- audio_dma_copy_immediate(gAlCtlHeader->seqArray[i].offset, sp60, 0x00000010U);
-
- gCtlEntries[i].numInstruments = sp60[0];
- gCtlEntries[i].numDrums = sp60[1];
- }
- gAlTbl = (ALSeqFile *) sp60;
- test = &_audio_tablesSegmentRomStart;
- audio_dma_copy_immediate(test, gAlTbl, 0x00000010U);
- size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
- size = ALIGN16(size);
- gAlTbl = soundAlloc(&gAudioInitPool, size);
- audio_dma_copy_immediate(test, gAlTbl, size);
- func_800BB43C(gAlTbl, test);
- gAlBankSets = soundAlloc(&gAudioInitPool, 0x00000100U);
- audio_dma_copy_immediate((u32) &_instrument_setsSegmentRomStart, gAlBankSets, 0x00000100U);
+ // gSeqFileHeader = (ALSeqFile *) sp60;
+ // test = &_sequencesSegmentRomStart;
+ // audio_dma_copy_immediate(test, gSeqFileHeader, 0x00000010U);
+ // gSequenceCount = gSeqFileHeader->seqCount;
+ // size = gSequenceCount * sizeof(ALSeqData) + 4;
+ // size = ALIGN16(size);
+ // gSeqFileHeader = soundAlloc(&gAudioInitPool, size);
+ // audio_dma_copy_immediate(test, gSeqFileHeader, size);
+ // func_800BB43C(gSeqFileHeader, test);
+ // gAlCtlHeader = (ALSeqFile *) sp60;
+ // test = &_audio_banksSegmentRomStart;
+ // audio_dma_copy_immediate(test, gAlCtlHeader, 0x00000010U);
+ // aaa = gAlCtlHeader->seqCount;
+ // size = ALIGN16(aaa * sizeof(ALSeqData) + 4);
+ // gAlCtlHeader = soundAlloc(&gAudioInitPool, size);
+ // audio_dma_copy_immediate(test, gAlCtlHeader, size);
+ // func_800BB43C(gAlCtlHeader, test);
+ // gCtlEntries = soundAlloc(&gAudioInitPool, aaa * 0xC);
+ // for (i = 0; i < aaa; i++) {
+ // audio_dma_copy_immediate(gAlCtlHeader->seqArray[i].offset, sp60, 0x00000010U);
+
+ // gCtlEntries[i].numInstruments = sp60[0];
+ // gCtlEntries[i].numDrums = sp60[1];
+ // }
+ // gAlTbl = (ALSeqFile *) sp60;
+ // test = &_audio_tablesSegmentRomStart;
+ // audio_dma_copy_immediate(test, gAlTbl, 0x00000010U);
+ // size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
+ // size = ALIGN16(size);
+ // gAlTbl = soundAlloc(&gAudioInitPool, size);
+ // audio_dma_copy_immediate(test, gAlTbl, size);
+ // func_800BB43C(gAlTbl, test);
+ // gAlBankSets = soundAlloc(&gAudioInitPool, 0x00000100U);
+ // audio_dma_copy_immediate((u32) &_instrument_setsSegmentRomStart, gAlBankSets, 0x00000100U);
sound_alloc_pool_init(&gUnkPool1.pool, soundAlloc(&gAudioInitPool, (u32) D_800EA5D8), (u32) D_800EA5D8);
init_sequence_players();
gAudioLoadLock = 0x76557364;
diff --git a/src/audio/mixer.c b/src/audio/mixer.c
new file mode 100644
index 000000000..c72b12006
--- /dev/null
+++ b/src/audio/mixer.c
@@ -0,0 +1,78 @@
+#include <libultraship.h>
+#include "mixer.h"
+
+#pragma GCC optimize ("unroll-loops")
+
+#define ROUND_UP_64(v) (((v) + 63) & ~63)
+#define ROUND_UP_32(v) (((v) + 31) & ~31)
+#define ROUND_UP_16(v) (((v) + 15) & ~15)
+#define ROUND_UP_8(v) (((v) + 7) & ~7)
+#define ROUND_DOWN_16(v) ((v) & ~0xf)
+
+#ifdef NEW_AUDIO_UCODE
+#define BUF_SIZE 2880
+#define BUF_U8(a) (rspa.buf.as_u8 + ((a) - 0x450))
+#define BUF_S16(a) (rspa.buf.as_s16 + ((a) - 0x450) / sizeof(int16_t))
+#else
+#define BUF_SIZE 2512
+#define BUF_U8(a) (rspa.buf.as_u8 + (a))
+#define BUF_S16(a) (rspa.buf.as_s16 + (a) / sizeof(int16_t))
+#endif
+
+static struct {
+ uint16_t in;
+ uint16_t out;
+ uint16_t nbytes;
+
+#ifdef NEW_AUDIO_UCODE
+ uint16_t vol[2];
+ uint16_t rate[2];
+ uint16_t vol_wet;
+ uint16_t rate_wet;
+#else
+ int16_t vol[2];
+
+ uint16_t dry_right;
+ uint16_t wet_left;
+ uint16_t wet_right;
+
+ int16_t target[2];
+ int32_t rate[2];
+
+ int16_t vol_dry;
+ int16_t vol_wet;
+#endif
+
+ ADPCM_STATE *adpcm_loop_state;
+
+ int16_t adpcm_table[8][2][8];
+
+#ifdef NEW_AUDIO_UCODE
+ uint16_t filter_count;
+ int16_t filter[8];
+#endif
+
+ union {
+ int16_t as_s16[BUF_SIZE / sizeof(int16_t)];
+ uint8_t as_u8[BUF_SIZE];
+ } buf;
+} rspa;
+
+void aDownsampleHalfImpl(uint16_t n_samples, uint16_t in_addr, uint16_t out_addr) {
+ int16_t *in = BUF_S16(in_addr);
+ int16_t *out = BUF_S16(out_addr);
+ int n = ROUND_UP_8(n_samples);
+
+ do {
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+ *out++ = *in++; in++;
+
+ n -= 8;
+ } while (n > 0);
+} \ No newline at end of file
diff --git a/src/audio/mixer.h b/src/audio/mixer.h
new file mode 100644
index 000000000..9da283159
--- /dev/null
+++ b/src/audio/mixer.h
@@ -0,0 +1,12 @@
+#ifndef MIXER_H
+#define MIXER_H
+
+#include <libultraship.h>
+
+void aDownsampleHalfImpl(uint16_t n_samples, uint16_t in_addr, uint16_t out_addr);
+
+#undef aDownsampleHalf
+#define aDownsampleHalf(pkt, nSamples, i, o) aDownsampleHalfImpl(nSamples, i, o)
+
+
+#endif \ No newline at end of file
diff --git a/src/audio/synthesis.c b/src/audio/synthesis.c
index c433e3201..ee9fbbf6a 100644
--- a/src/audio/synthesis.c
+++ b/src/audio/synthesis.c
@@ -1,4 +1,5 @@
#include <libultraship.h>
+#include "mixer.h"
#include <macros.h>
#include "audio/synthesis.h"
#include "audio/heap.h"
diff --git a/src/code_8006E9C0.c b/src/code_8006E9C0.c
index d365c3beb..7562e2955 100644
--- a/src/code_8006E9C0.c
+++ b/src/code_8006E9C0.c
@@ -111,17 +111,17 @@ void clear_object_list() {
u8 *func_8006ED94(u8 *devAddr, u8 *baseAddress, u32 size, u32 offset)
{
- u8 **tempAddress;
- u8 *address;
- address = baseAddress + offset;
-
- size = ALIGN16(size);
- osInvalDCache(address, (size));
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t)&_other_texturesSegmentRomStart[((u32) devAddr) & 0xFFFFFF], address, size, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
- tempAddress = &address;
- mio0decode(*tempAddress, (u8 *) baseAddress);
- return baseAddress;
+ // u8 **tempAddress;
+ // u8 *address;
+ // address = baseAddress + offset;
+
+ // size = ALIGN16(size);
+ // osInvalDCache(address, (size));
+ // osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t)&_other_texturesSegmentRomStart[((u32) devAddr) & 0xFFFFFF], address, size, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
+ // tempAddress = &address;
+ // mio0decode(*tempAddress, (u8 *) baseAddress);
+ // return baseAddress;
}
void func_8006EE44(void) {
diff --git a/src/code_80091750.c b/src/code_80091750.c
index 1cb67b0da..a32a8e83f 100644
--- a/src/code_80091750.c
+++ b/src/code_80091750.c
@@ -1,6 +1,7 @@
#include <libultraship.h>
#include <macros.h>
#include <mk64.h>
+#include <stubs.h>
#include <defines.h>
#include <segments.h>
#include <libultra/types.h>
@@ -1412,7 +1413,7 @@ void func_80091B78(void) {
}
if (gMenuSelection == LOGO_INTRO_MENU) {
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
- set_segment_base_addr(6, decompress_segments((u8 *) STARTUP_LOGO_ROM_START, (u8 *) STARTUP_LOGO_ROM_END));
+ // set_segment_base_addr(6, decompress_segments((u8 *) STARTUP_LOGO_ROM_START, (u8 *) STARTUP_LOGO_ROM_END));
}
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
// Hypothetically, this should be a ptr... But only hypothetically.
@@ -3070,7 +3071,8 @@ Gfx *func_800963F0(Gfx *displayListHead, s8 arg1, s32 arg2, s32 arg3, f32 arg4,
return displayListHead;
}
-extern u8 D_0B002A00[];
+#define D_0B002A00 gTextureTitleChocoMountain
+
#ifdef NON_MATCHING
// https://decomp.me/scratch/xV83r
// Possibly a missed variable rename or just weird diffs.
@@ -3284,6 +3286,8 @@ Gfx *func_80097274(Gfx *displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4,
GLOBAL_ASM("asm/non_matchings/code_80091750/func_80097274.s")
#endif
+#undef D_0B002A00
+
Gfx *func_80097A14(Gfx *displayListHead, s8 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, u8* arg8, u32 arg9, u32 argA) {
gDPPipeSync(displayListHead++);
gDPSetCycleType(displayListHead++, G_CYC_COPY);
@@ -3491,21 +3495,21 @@ Gfx *func_80098FC8(Gfx *displayListHead, s32 ulx, s32 uly, s32 lrx, s32 lry) {
}
void dma_copy_base_729a30(u64 *arg0, size_t nbytes, void *vaddr) {
- OSIoMesg sp30;
- OSMesg sp2C;
+ // OSIoMesg sp30;
+ // OSMesg sp2C;
- osInvalDCache(vaddr, nbytes);
- osPiStartDma(&sp30, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(arg0)], vaddr, nbytes, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &sp2C, OS_MESG_BLOCK);
+ // osInvalDCache(vaddr, nbytes);
+ // osPiStartDma(&sp30, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0aSegmentRomStart[SEGMENT_OFFSET(arg0)], vaddr, nbytes, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &sp2C, OS_MESG_BLOCK);
}
void dma_copy_base_7fa3c0(u64 *arg0, size_t nbytes, void *vaddr) {
- OSIoMesg sp30;
- OSMesg sp2C;
+ // OSIoMesg sp30;
+ // OSMesg sp2C;
- osInvalDCache(vaddr, nbytes);
- osPiStartDma(&sp30, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0bSegmentRomStart[SEGMENT_OFFSET(arg0)], vaddr, nbytes, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &sp2C, OS_MESG_BLOCK);
+ // osInvalDCache(vaddr, nbytes);
+ // osPiStartDma(&sp30, OS_MESG_PRI_NORMAL, OS_READ, (uintptr_t) &_textures_0bSegmentRomStart[SEGMENT_OFFSET(arg0)], vaddr, nbytes, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &sp2C, OS_MESG_BLOCK);
}
void func_80099110(void) {
@@ -3650,7 +3654,7 @@ void func_8009952C(MkTexture *arg0) {
}
}
if (var_a1 == 0) {
- dma_copy_base_729a30(var_s1->textureData, 0x00008000U, D_8018D9B4);
+ //dma_copy_base_729a30(var_s1->textureData, 0x00008000U, D_8018D9B4);
mio0decode(D_8018D9B4, (u8*)&D_8018D9B0[gD_8018E118TotalSize]);
thing = &D_8018E118[gNumD_8018E118Entries];
@@ -3822,7 +3826,7 @@ void func_80099AEC(void) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(D_8018D9B4, var_s0);
- osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
+ //osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &sp64, 1);
while (1) {
if ((var_s1 + 1)->texture == NULL) {
@@ -3839,7 +3843,7 @@ void func_80099AEC(void) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(D_8018D9B4 + sp60*4, var_s0);
- osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4 + sp60*4, var_s0, &gDmaMesgQueue);
+ //osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4 + sp60*4, var_s0, &gDmaMesgQueue);
}
mio0decode(D_8018D9B4, (u8*)&D_8018D9B0[D_8018E118[var_s1->unk_4].offset]);
var_s1->texture = NULL;
@@ -3860,7 +3864,7 @@ void func_80099AEC(void) {
var_s0 = ((var_s0 / 8) * 8) + 8;
}
osInvalDCache(D_8018D9B4, var_s0);
- osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
+ //osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
}
mio0decode(D_8018D9B4 + sp60*4, (u8*)&D_8018D9B0[D_8018E118[var_s1->unk_4].offset]);
var_s1->texture = NULL;
@@ -3894,82 +3898,82 @@ void func_80099E60(MkTexture *arg0, s32 arg1, s32 arg2) {
// Some fakematch nonsense, may or may not be necessary
// Issue is with instruction ordering near the first `osPiStartDma` call
void func_80099EC4(void) {
- s8 var_s4;
- s32 var_s0;
- UNUSED s32 stackPadding0;
- UNUSED s32 stackPadding1;
- OSIoMesg sp68;
- OSMesg sp64;
- s32 huh;
- u8 *test;
- MkTexture *temp_s2;
- struct_8018E0E8_entry *var_s1;
-
- var_s4 = 0;
- var_s1 = D_8018E0E8;
- temp_s2 = var_s1->mk64Texture;
-
- if (temp_s2 == NULL) return;
-
- huh = temp_s2->size;
- if (huh != 0) {
- var_s0 = huh;
- } else {
- var_s0 = 0x1400;
- }
- if (var_s0 % 8) {
- var_s0 = ((var_s0 / 8) * 8) + 8;
- }
- osInvalDCache(D_8018D9B4, var_s0);
- test = &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)];
- osPiStartDma(&sp68, 0, 0, (uintptr_t)test, D_8018D9B4, var_s0, &gDmaMesgQueue);
- if ((var_s0 && var_s0) && var_s0) {}
- // osPiStartDma(&sp68, 0, 0, &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &sp64, 1);
- while (1) {
- if ((var_s1 + 1)->mk64Texture == NULL) {
- var_s4 += 1;
- } else {
- temp_s2 = (var_s1 + 1)->mk64Texture;
- huh = (var_s1 + 1)->mk64Texture->size;
- if (huh != 0) {
- var_s0 = huh;
- } else {
- var_s0 = 0x1400;
- }
- if (var_s0 % 8) {
- var_s0 = ((var_s0 / 8) * 8) + 8;
- }
- osInvalDCache(D_8018D9B4 + 0x1400, var_s0);
- osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4 + 0x1400, var_s0, &gDmaMesgQueue);
- }
- mio0decode(D_8018D9B4, D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
- var_s1->mk64Texture = NULL;
- var_s1++;
- if (var_s4 != 0) break;
- osRecvMesg(&gDmaMesgQueue, &sp64, 1);
- if ((var_s1 + 1)->mk64Texture == NULL) {
- var_s4 += 1;
- } else {
- temp_s2 = (var_s1 + 1)->mk64Texture;
- huh = (var_s1 + 1)->mk64Texture->size;
- if (huh != 0) {
- var_s0 = huh;
- } else {
- var_s0 = 0x1400;
- }
- if (var_s0 % 8) {
- var_s0 = ((var_s0 / 8) * 8) + 8;
- }
- osInvalDCache(D_8018D9B4, var_s0);
- osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
- }
- mio0decode(D_8018D9B4 + 0x1400, D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
- var_s1->mk64Texture = NULL;
- var_s1++;
- if (var_s4 != 0) break;
- osRecvMesg(&gDmaMesgQueue, &sp64, 1);
- }
+ // s8 var_s4;
+ // s32 var_s0;
+ // UNUSED s32 stackPadding0;
+ // UNUSED s32 stackPadding1;
+ // OSIoMesg sp68;
+ // OSMesg sp64;
+ // s32 huh;
+ // u8 *test;
+ // MkTexture *temp_s2;
+ // struct_8018E0E8_entry *var_s1;
+
+ // var_s4 = 0;
+ // var_s1 = D_8018E0E8;
+ // temp_s2 = var_s1->mk64Texture;
+
+ // if (temp_s2 == NULL) return;
+
+ // huh = temp_s2->size;
+ // if (huh != 0) {
+ // var_s0 = huh;
+ // } else {
+ // var_s0 = 0x1400;
+ // }
+ // if (var_s0 % 8) {
+ // var_s0 = ((var_s0 / 8) * 8) + 8;
+ // }
+ // osInvalDCache(D_8018D9B4, var_s0);
+ // test = &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)];
+ // osPiStartDma(&sp68, 0, 0, (uintptr_t)test, D_8018D9B4, var_s0, &gDmaMesgQueue);
+ // if ((var_s0 && var_s0) && var_s0) {}
+ // // osPiStartDma(&sp68, 0, 0, &_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &sp64, 1);
+ // while (1) {
+ // if ((var_s1 + 1)->mk64Texture == NULL) {
+ // var_s4 += 1;
+ // } else {
+ // temp_s2 = (var_s1 + 1)->mk64Texture;
+ // huh = (var_s1 + 1)->mk64Texture->size;
+ // if (huh != 0) {
+ // var_s0 = huh;
+ // } else {
+ // var_s0 = 0x1400;
+ // }
+ // if (var_s0 % 8) {
+ // var_s0 = ((var_s0 / 8) * 8) + 8;
+ // }
+ // osInvalDCache(D_8018D9B4 + 0x1400, var_s0);
+ // osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4 + 0x1400, var_s0, &gDmaMesgQueue);
+ // }
+ // mio0decode(D_8018D9B4, D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
+ // var_s1->mk64Texture = NULL;
+ // var_s1++;
+ // if (var_s4 != 0) break;
+ // osRecvMesg(&gDmaMesgQueue, &sp64, 1);
+ // if ((var_s1 + 1)->mk64Texture == NULL) {
+ // var_s4 += 1;
+ // } else {
+ // temp_s2 = (var_s1 + 1)->mk64Texture;
+ // huh = (var_s1 + 1)->mk64Texture->size;
+ // if (huh != 0) {
+ // var_s0 = huh;
+ // } else {
+ // var_s0 = 0x1400;
+ // }
+ // if (var_s0 % 8) {
+ // var_s0 = ((var_s0 / 8) * 8) + 8;
+ // }
+ // osInvalDCache(D_8018D9B4, var_s0);
+ // osPiStartDma(&sp68, 0, 0, (uintptr_t)&_textures_0aSegmentRomStart[SEGMENT_OFFSET(temp_s2->textureData)], D_8018D9B4, var_s0, &gDmaMesgQueue);
+ // }
+ // mio0decode(D_8018D9B4 + 0x1400, D_802BFB80.arraySize4[var_s1->unk6][var_s1->unk4 / 2][(var_s1->unk4 % 2) + 2].pixel_index_array);
+ // var_s1->mk64Texture = NULL;
+ // var_s1++;
+ // if (var_s4 != 0) break;
+ // osRecvMesg(&gDmaMesgQueue, &sp64, 1);
+ // }
}
#else
GLOBAL_ASM("asm/non_matchings/code_80091750/func_80099EC4.s")
diff --git a/src/code_80091750.h b/src/code_80091750.h
index ea1a83ebd..28c7c8a44 100644
--- a/src/code_80091750.h
+++ b/src/code_80091750.h
@@ -397,7 +397,6 @@ void func_800AF740(struct_8018D9E0_entry*);
// This really, really shouldn't be in this header file, but I don't know where else to put it
void rmonPrintf(const char *, ...);
-void tkmk00decode(u8*, u8*, u8*, s32);
/* File specific defines */
@@ -454,8 +453,8 @@ extern s32 D_8018E854;
extern s32 D_8018E858[];
extern s32 D_8018E85C;
-extern u8 _textures_0aSegmentRomStart[];
-extern u8 _textures_0bSegmentRomStart[];
+//extern u8 _textures_0aSegmentRomStart[];
+//extern u8 _textures_0bSegmentRomStart[];
extern Unk_D_800E70A0 D_800E70A0[];
extern Unk_D_800E70A0 D_800E70E8[];
diff --git a/src/crash_screen.c b/src/crash_screen.c
index bd7d177c2..f41229dd2 100644
--- a/src/crash_screen.c
+++ b/src/crash_screen.c
@@ -26,225 +26,225 @@ extern s32 osRecvMesg(OSMesgQueue *, OSMesg *, s32);
s32 sCounter = 0;
-u8 crashScreenFont[][8] = {
- #include "textures/crash_screen/crash_screen_font.ia1.inc.c"
-};
-
-u16 sCrashScreenButtonSequence[] = {
- L_TRIG, U_JPAD, L_JPAD, D_JPAD, R_JPAD, R_TRIG, L_TRIG, B_BUTTON, A_BUTTON, DRAW_CODE
-};
-
-void crash_screen_draw_glyph(u16 *framebuffer, s32 x, s32 y, s32 glyph) {
- s32 data;
- s32 ptr;
- s32 i, j;
-
- for(i = 0; i < 8; i++) {
-
- data = crashScreenFont[glyph][i];
-
- for (j = 5; j >= 0; j--) {
-
- ptr = (y + i) * 320 + (x + j);
-
- if (data & 1) {
- framebuffer[ptr] = 0xffff;
- }
- data = data >> 1;
- }
- }
-}
-
-void crash_screen_draw_square(u16 *framebuffer);
-// Functionally Equivallent.
-#ifdef NON_MATCHING
-
-// 0xRGBA (I think A maybe not).
-#define WHITE_COLOUR 0xFFFF
-#define RED_COLOUR 0xF801
-
-/**
- * The big mismatch is the handling of the '6' used in the if statement
- * In the target assembly that 6 is saved to 5 different temp registers,
- * while in this non-matching decomp its only saved to one temp register.
- * This seems to be related to how the innermost for loop is unrolled, but
- * its not clear why the target assembley would save the same immediate to
- * 5 different registers instead of just re-using one
- * There's some stack related differences too, maybe that's related?
- **/
-void crash_screen_draw_square(u16 *framebuffer)
-{
- s32 s0_end;
- s32 s2_start;
- s32 row;
- s32 column;
-
- for (s2_start = 0x28, s0_end = s2_start + 6; s0_end != 0x2C; s0_end--, s2_start++) {
- for (row = s2_start; row < s0_end; row++) {
- for (column = s2_start; column < s0_end; column++) {
- framebuffer[row * 320 + column] = s0_end - s2_start == 6 ? 0xF801 : 0xFFFF;
- }
- }
- }
-
- osWritebackDCacheAll();
- osViSwapBuffer(framebuffer);
-}
-#else
-GLOBAL_ASM("asm/non_matchings/crash_screen/crash_screen_draw_square.s")
-#endif
-
-/**
- * Draws three black boxes then prints crash info in the following format:
- * Line 1: threadId - address of faulted instruction - error code
- * Line 2: Address in the return address register
- * Line 3: Machine code of faulted instruction
- *
- * The R4300i manual discusses exceptions in more depth.
- *
- * @param framebuffer
- * @param faulted thread
- **/
-
-// 0xRGBA
-#define BLACK_COLOUR 0x0001
-
-void crash_screen_draw_info(u16 *framebuffer, OSThread *thread) {
- __OSThreadContext *context = &thread->context;
- s32 i, j, x, y, h;
- uintptr_t faultedAddr;
- u32 exception;
- s32 math;
- u32 crashInfo;
- s32 temp;
-
- // Draw three black boxes
- for (h = 0; h < 3; h++) {
-
- math = (48 + (sCounter * 24)) + h * 20;
-
- for (i = 0; i < 16; i++) {
- for (j = 0; j < 120; j++) {
- // Set pixels to black
- framebuffer[((i + math) * 320) + (j + 100)] = BLACK_COLOUR;
- }
- }
- }
-
- // Draw crash information over the black boxes.
- temp = (sCounter * 24);
- y = temp + 53;
- crash_screen_draw_glyph(framebuffer, 108, y, thread->id & 0xF);
- crash_screen_draw_glyph(framebuffer, 116, y, CHARACTER_DASH);
-
- // Address of faulted instruction.
- crashInfo = context->pc;
-
- for (x = 180; x >= 124; x -= 8) {
- crash_screen_draw_glyph(framebuffer, x, y, crashInfo & 0xF);
- crashInfo >>= 4;
- }
-
- exception = (context->cause >> 2) & 0x1F;
- crash_screen_draw_glyph(framebuffer, 188, y, CHARACTER_DASH);
- crash_screen_draw_glyph(framebuffer, 196, y, exception >> 4);
- crash_screen_draw_glyph(framebuffer, 204, y, exception & 0xF);
-
- // Address in the Return Address register.
- crashInfo = context->ra;
-
- for (x = 180; x >= 124; x -= 8) {
- crash_screen_draw_glyph(framebuffer, x, 73, crashInfo & 0xF);
- crashInfo >>= 4;
- }
-
- // Address of faulted instruction.
- faultedAddr = context->pc & (~3);
-
- // Ensure the address to the faulted instruction is a memory address.
- //! @bug if this check fails, the ra register is printed a second time.
- if ((faultedAddr > 0x80000000) && (faultedAddr < 0x803FFF7F)) {
- // Cast the address to its value; the faulty machine code.
- crashInfo = *(u32*)faultedAddr;
- }
- for (x = 180; x >= 124; x -= 4) {
- crash_screen_draw_glyph(framebuffer, x, 93, crashInfo & 0xF);
- x -= 4;
- crashInfo >>= 4;
- }
- osWritebackDCacheAll();
- osViSwapBuffer(framebuffer);
-}
-
-OSThread *get_faulted_thread(void) {
- OSThread *thread;
-
- thread = __osGetCurrFaultedThread();
- while (thread->priority != -1) {
- if (thread->priority > OS_PRIORITY_IDLE && thread->priority <= OS_PRIORITY_APPMAX
- && (thread->flags & 3) != 0) {
- return thread;
- }
- thread = thread->tlnext;
- }
- return NULL;
-}
-
-/**
- * @brief Retrieves faulted thread and displays debug info after the user inputs the button sequence.
- * Button sequence: L, Up, Left, Down, Right, R, L, B, A
- **/
-void thread9_crash_screen(UNUSED void *arg0)
-{
- static OSThread *thread;
- OSMesg mesg;
- OSMesg newMesg;
- newMesg.data16 = 16;
-
- osSetEventMesg(12, &D_80162D40, newMesg);
- osSetEventMesg(10, &D_80162D40, newMesg);
- sButtonSequenceIndex = 0;
-
- while (true) {
- osRecvMesg(&D_80162D40, &mesg, 1);
- thread = get_faulted_thread();
-
- if (thread) {
- // Run only on the first iteration.
- if (sCounter == 0) {
- crash_screen_draw_square(pFramebuffer);
-#ifndef DEBUG
- while(true)
- {
- read_controllers();
-
- if (!gControllerOne->buttonPressed) { continue; }
-
- if (gControllerOne->buttonPressed == sCrashScreenButtonSequence[sButtonSequenceIndex]) {
- sButtonSequenceIndex++;
- } else {
- sButtonSequenceIndex = 0;
- }
-
- // draws crash info when DRAW_CODE is reached
- if (sCrashScreenButtonSequence[sButtonSequenceIndex] == DRAW_CODE) {
- break;
- }
- }
-#endif
-#if DEBUG
- //crash_screen_draw(thread);
-#else
- crash_screen_draw_info(pFramebuffer, thread);
-#endif
-
- }
- if (sCounter < 5) {
- sCounter++;
- }
- }
- }
-}
+// u8 crashScreenFont[][8] = {
+// #include "textures/crash_screen/crash_screen_font.ia1.inc.c"
+// };
+
+// u16 sCrashScreenButtonSequence[] = {
+// L_TRIG, U_JPAD, L_JPAD, D_JPAD, R_JPAD, R_TRIG, L_TRIG, B_BUTTON, A_BUTTON, DRAW_CODE
+// };
+
+// void crash_screen_draw_glyph(u16 *framebuffer, s32 x, s32 y, s32 glyph) {
+// s32 data;
+// s32 ptr;
+// s32 i, j;
+
+// for(i = 0; i < 8; i++) {
+
+// data = crashScreenFont[glyph][i];
+
+// for (j = 5; j >= 0; j--) {
+
+// ptr = (y + i) * 320 + (x + j);
+
+// if (data & 1) {
+// framebuffer[ptr] = 0xffff;
+// }
+// data = data >> 1;
+// }
+// }
+// }
+
+// void crash_screen_draw_square(u16 *framebuffer);
+// // Functionally Equivallent.
+// #ifdef NON_MATCHING
+
+// // 0xRGBA (I think A maybe not).
+// #define WHITE_COLOUR 0xFFFF
+// #define RED_COLOUR 0xF801
+
+// /**
+// * The big mismatch is the handling of the '6' used in the if statement
+// * In the target assembly that 6 is saved to 5 different temp registers,
+// * while in this non-matching decomp its only saved to one temp register.
+// * This seems to be related to how the innermost for loop is unrolled, but
+// * its not clear why the target assembley would save the same immediate to
+// * 5 different registers instead of just re-using one
+// * There's some stack related differences too, maybe that's related?
+// **/
+// void crash_screen_draw_square(u16 *framebuffer)
+// {
+// s32 s0_end;
+// s32 s2_start;
+// s32 row;
+// s32 column;
+
+// for (s2_start = 0x28, s0_end = s2_start + 6; s0_end != 0x2C; s0_end--, s2_start++) {
+// for (row = s2_start; row < s0_end; row++) {
+// for (column = s2_start; column < s0_end; column++) {
+// framebuffer[row * 320 + column] = s0_end - s2_start == 6 ? 0xF801 : 0xFFFF;
+// }
+// }
+// }
+
+// osWritebackDCacheAll();
+// osViSwapBuffer(framebuffer);
+// }
+// #else
+// GLOBAL_ASM("asm/non_matchings/crash_screen/crash_screen_draw_square.s")
+// #endif
+
+// /**
+// * Draws three black boxes then prints crash info in the following format:
+// * Line 1: threadId - address of faulted instruction - error code
+// * Line 2: Address in the return address register
+// * Line 3: Machine code of faulted instruction
+// *
+// * The R4300i manual discusses exceptions in more depth.
+// *
+// * @param framebuffer
+// * @param faulted thread
+// **/
+
+// // 0xRGBA
+// #define BLACK_COLOUR 0x0001
+
+// void crash_screen_draw_info(u16 *framebuffer, OSThread *thread) {
+// __OSThreadContext *context = &thread->context;
+// s32 i, j, x, y, h;
+// uintptr_t faultedAddr;
+// u32 exception;
+// s32 math;
+// u32 crashInfo;
+// s32 temp;
+
+// // Draw three black boxes
+// for (h = 0; h < 3; h++) {
+
+// math = (48 + (sCounter * 24)) + h * 20;
+
+// for (i = 0; i < 16; i++) {
+// for (j = 0; j < 120; j++) {
+// // Set pixels to black
+// framebuffer[((i + math) * 320) + (j + 100)] = BLACK_COLOUR;
+// }
+// }
+// }
+
+// // Draw crash information over the black boxes.
+// temp = (sCounter * 24);
+// y = temp + 53;
+// crash_screen_draw_glyph(framebuffer, 108, y, thread->id & 0xF);
+// crash_screen_draw_glyph(framebuffer, 116, y, CHARACTER_DASH);
+
+// // Address of faulted instruction.
+// crashInfo = context->pc;
+
+// for (x = 180; x >= 124; x -= 8) {
+// crash_screen_draw_glyph(framebuffer, x, y, crashInfo & 0xF);
+// crashInfo >>= 4;
+// }
+
+// exception = (context->cause >> 2) & 0x1F;
+// crash_screen_draw_glyph(framebuffer, 188, y, CHARACTER_DASH);
+// crash_screen_draw_glyph(framebuffer, 196, y, exception >> 4);
+// crash_screen_draw_glyph(framebuffer, 204, y, exception & 0xF);
+
+// // Address in the Return Address register.
+// crashInfo = context->ra;
+
+// for (x = 180; x >= 124; x -= 8) {
+// crash_screen_draw_glyph(framebuffer, x, 73, crashInfo & 0xF);
+// crashInfo >>= 4;
+// }
+
+// // Address of faulted instruction.
+// faultedAddr = context->pc & (~3);
+
+// // Ensure the address to the faulted instruction is a memory address.
+// //! @bug if this check fails, the ra register is printed a second time.
+// if ((faultedAddr > 0x80000000) && (faultedAddr < 0x803FFF7F)) {
+// // Cast the address to its value; the faulty machine code.
+// crashInfo = *(u32*)faultedAddr;
+// }
+// for (x = 180; x >= 124; x -= 4) {
+// crash_screen_draw_glyph(framebuffer, x, 93, crashInfo & 0xF);
+// x -= 4;
+// crashInfo >>= 4;
+// }
+// osWritebackDCacheAll();
+// osViSwapBuffer(framebuffer);
+// }
+
+// OSThread *get_faulted_thread(void) {
+// OSThread *thread;
+
+// thread = __osGetCurrFaultedThread();
+// while (thread->priority != -1) {
+// if (thread->priority > OS_PRIORITY_IDLE && thread->priority <= OS_PRIORITY_APPMAX
+// && (thread->flags & 3) != 0) {
+// return thread;
+// }
+// thread = thread->tlnext;
+// }
+// return NULL;
+// }
+
+// /**
+// * @brief Retrieves faulted thread and displays debug info after the user inputs the button sequence.
+// * Button sequence: L, Up, Left, Down, Right, R, L, B, A
+// **/
+// void thread9_crash_screen(UNUSED void *arg0)
+// {
+// static OSThread *thread;
+// OSMesg mesg;
+// OSMesg newMesg;
+// newMesg.data16 = 16;
+
+// osSetEventMesg(12, &D_80162D40, newMesg);
+// osSetEventMesg(10, &D_80162D40, newMesg);
+// sButtonSequenceIndex = 0;
+
+// while (true) {
+// osRecvMesg(&D_80162D40, &mesg, 1);
+// thread = get_faulted_thread();
+
+// if (thread) {
+// // Run only on the first iteration.
+// if (sCounter == 0) {
+// crash_screen_draw_square(pFramebuffer);
+// #ifndef DEBUG
+// while(true)
+// {
+// read_controllers();
+
+// if (!gControllerOne->buttonPressed) { continue; }
+
+// if (gControllerOne->buttonPressed == sCrashScreenButtonSequence[sButtonSequenceIndex]) {
+// sButtonSequenceIndex++;
+// } else {
+// sButtonSequenceIndex = 0;
+// }
+
+// // draws crash info when DRAW_CODE is reached
+// if (sCrashScreenButtonSequence[sButtonSequenceIndex] == DRAW_CODE) {
+// break;
+// }
+// }
+// #endif
+// #if DEBUG
+// //crash_screen_draw(thread);
+// #else
+// crash_screen_draw_info(pFramebuffer, thread);
+// #endif
+
+// }
+// if (sCounter < 5) {
+// sCounter++;
+// }
+// }
+// }
+// }
void crash_screen_set_framebuffer(u16 *framebuffer) {
pFramebuffer = framebuffer;
@@ -253,8 +253,8 @@ void crash_screen_set_framebuffer(u16 *framebuffer) {
extern void thread9_crash_screen(void *);
void create_debug_thread(void) {
- osCreateMesgQueue(&D_80162D40, &D_80162D58, 1);
- osCreateThread((OSThread *) &D_80162790, 9, (void *)thread9_crash_screen, 0, &D_80162D40, 0x7F);
+ //osCreateMesgQueue(&D_80162D40, &D_80162D58, 1);
+ //osCreateThread((OSThread *) &D_80162790, 9, (void *)thread9_crash_screen, 0, &D_80162D40, 0x7F);
}
void start_debug_thread(void) {
diff --git a/src/ending/code_80280000.c b/src/ending/code_80280000.c
index c7351a09b..e07315460 100644
--- a/src/ending/code_80280000.c
+++ b/src/ending/code_80280000.c
@@ -138,7 +138,7 @@ void load_credits(void) {
gNextFreeMemoryAddress = gFreeMemoryResetAnchor;
load_course(gCurrentCourseId);
D_8015F730 = gNextFreeMemoryAddress;
- set_segment_base_addr(0xB, (void *) decompress_segments((u8 *) CEREMONY_DATA_ROM_START, (u8 *) CEREMONY_DATA_ROM_END));
+ //set_segment_base_addr(0xB, (void *) decompress_segments((u8 *) CEREMONY_DATA_ROM_START, (u8 *) CEREMONY_DATA_ROM_END));
gCourseMinX = -0x15A1;
gCourseMinY = -0x15A1;
diff --git a/src/ending/code_80281780.c b/src/ending/code_80281780.c
index 367241e39..fb61da51e 100644
--- a/src/ending/code_80281780.c
+++ b/src/ending/code_80281780.c
@@ -114,8 +114,8 @@ void load_ceremony_cutscene(void) {
gModeSelection = GRAND_PRIX;
load_course(gCurrentCourseId);
D_8015F730 = (s32) gNextFreeMemoryAddress;
- set_segment_base_addr(0xB, (void *) decompress_segments((u8 *) CEREMONY_DATA_ROM_START, (u8 *) CEREMONY_DATA_ROM_END));
- set_segment_base_addr(6, (void *) decompress_segments((u8 *) &_course_banshee_boardwalk_dl_mio0SegmentRomStart, (u8 *) &_course_yoshi_valley_dl_mio0SegmentRomStart));
+ //set_segment_base_addr(0xB, (void *) decompress_segments((u8 *) CEREMONY_DATA_ROM_START, (u8 *) CEREMONY_DATA_ROM_END));
+ //set_segment_base_addr(6, (void *) decompress_segments((u8 *) &_course_banshee_boardwalk_dl_mio0SegmentRomStart, (u8 *) &_course_yoshi_valley_dl_mio0SegmentRomStart));
D_8015F8E4 = -2000.0f;
gCourseMinX = -0x15A1;
diff --git a/src/kart_dma.c b/src/kart_dma.c
index 97825a528..a75e61acd 100644
--- a/src/kart_dma.c
+++ b/src/kart_dma.c
@@ -1699,65 +1699,65 @@ void load_kart_texture(Player *player, s8 playerId, s8 arg2, s8 arg3, s8 arg4) {
if (player->animFrameSelector[arg2] != 0) {
osInvalDCache(&D_802DFB80[arg4][arg3][playerId], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL, OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][playerId],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL, OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][playerId],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][playerId], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][playerId],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][playerId],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) || ((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
osInvalDCache(&D_802DFB80[arg4][arg3][playerId], 0x780U);
// player->unk_0A8 >> 8 converts an 8.8 fixed-point animation frame to a whole number.
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8]
- )],
- &D_802DFB80[arg4][arg3][playerId],
- 0x900,
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8]
+ // )],
+ // &D_802DFB80[arg4][arg3][playerId],
+ // 0x900,
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][playerId], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][playerId],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][playerId],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
@@ -1771,62 +1771,62 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
if (player->animFrameSelector[arg2] != 0) {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][arg1],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable1[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][arg1],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][arg1],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][arg1],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) ||
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000))
{
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], 0x780);
// player->unk_0A8 >> 8 converts an 8.8 fixed-point animation frame to a whole number.
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8]
- )],
- &D_802DFB80[arg4][arg3][arg1],
- 0x900,
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTumbles[player->characterId][player->unk_0A8 >> 8]
+ // )],
+ // &D_802DFB80[arg4][arg3][arg1],
+ // 0x900,
+ // &gDmaMesgQueue
+ // );
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
- )],
- &D_802DFB80[arg4][arg3][arg1],
- D_800DDEB0[player->characterId],
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartTextureTable0[player->characterId][player->animGroupSelector[arg2]][player->animFrameSelector[arg2]]
+ // )],
+ // &D_802DFB80[arg4][arg3][arg1],
+ // D_800DDEB0[player->characterId],
+ // &gDmaMesgQueue
+ // );
}
}
@@ -1842,34 +1842,34 @@ void load_kart_palette(Player *player, s8 playerId, s8 arg2, s8 arg3) {
case SCREEN_MODE_2P_SPLITSCREEN_VERTICAL:
osInvalDCache(temp_s0, sizeof(struct_D_802F1F80));
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartPalettes[player->characterId]
- )],
- temp_s0,
- sizeof(struct_D_802F1F80),
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartPalettes[player->characterId]
+ // )],
+ // temp_s0,
+ // sizeof(struct_D_802F1F80),
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
case SCREEN_MODE_3P_4P_SPLITSCREEN: // Code identical to above
osInvalDCache(temp_s0, sizeof(struct_D_802F1F80));
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
- gKartPalettes[player->characterId]
- )],
- temp_s0,
- sizeof(struct_D_802F1F80),
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(
+ // gKartPalettes[player->characterId]
+ // )],
+ // temp_s0,
+ // sizeof(struct_D_802F1F80),
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
break;
@@ -1879,15 +1879,15 @@ void load_kart_palette(Player *player, s8 playerId, s8 arg2, s8 arg3) {
void func_80027BDC(UNUSED Player *player, s32 arg1, void *vAddr, u16 size) {
osInvalDCache(vAddr, size);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)],
- vAddr,
- size,
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)],
+ // vAddr,
+ // size,
+ // &gDmaMesgQueue
+ // );
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
}
@@ -1895,13 +1895,13 @@ void func_80027BDC(UNUSED Player *player, s32 arg1, void *vAddr, u16 size) {
void func_80027C74(UNUSED Player *player, s32 arg1, void *vAddr, u16 size) {
osInvalDCache(vAddr, size);
- osPiStartDma(
- &gDmaIoMesg,
- OS_MESG_PRI_NORMAL,
- OS_READ,
- (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)],
- vAddr,
- size,
- &gDmaMesgQueue
- );
+ // osPiStartDma(
+ // &gDmaIoMesg,
+ // OS_MESG_PRI_NORMAL,
+ // OS_READ,
+ // (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(arg1)],
+ // vAddr,
+ // size,
+ // &gDmaMesgQueue
+ // );
}
diff --git a/src/kart_dma.h b/src/kart_dma.h
index 0c8fc07ae..83cc2aadb 100644
--- a/src/kart_dma.h
+++ b/src/kart_dma.h
@@ -2806,6 +2806,6 @@ extern u8 gKartDK318[];
extern u8 gKartDK319[];
extern u8 gKartDK320[];
-extern u8 _kart_texturesSegmentRomStart[];
+//extern u8 _kart_texturesSegmentRomStart[];
#endif
diff --git a/src/main.c b/src/main.c
index 460d08621..46cfa6a0b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -216,7 +216,7 @@ void main_func(void) {
create_thread(&gIdleThread, 1, &thread1_idle, NULL, gIdleThreadStack + ARRAY_COUNT(gIdleThreadStack), 100);
osStartThread(&gIdleThread);
}
-extern OSViMode osViModeTable[];
+//extern OSViMode osViModeTable[];
/**
* Initialize hardware, start main thread, then idle.
*/
@@ -226,9 +226,9 @@ void thread1_idle(void *arg) {
osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]);
#else // VERSION_US
if (osTvType == OS_TV_NTSC) {
- osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
+ //osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
} else {
- osViSetMode(&osViModeTable[OS_VI_MPAL_LAN1]);
+ //osViSetMode(&osViModeTable[OS_VI_MPAL_LAN1]);
}
#endif
osViBlack(true);
@@ -473,19 +473,19 @@ void display_and_vsync(void) {
}
void init_segment_ending_sequences(void) {
- bzero((void *) SEG_ENDING, SEG_ENDING_SIZE);
- osWritebackDCacheAll();
- dma_copy((u8 *) SEG_ENDING, (u8 *) SEG_ENDING_ROM_START, SEG_ENDING_ROM_SIZE);
- osInvalICache((void *) SEG_ENDING, SEG_ENDING_SIZE);
- osInvalDCache((void *) SEG_ENDING, SEG_ENDING_SIZE);
+ // bzero((void *) SEG_ENDING, SEG_ENDING_SIZE);
+ // osWritebackDCacheAll();
+ // dma_copy((u8 *) SEG_ENDING, (u8 *) SEG_ENDING_ROM_START, SEG_ENDING_ROM_SIZE);
+ // osInvalICache((void *) SEG_ENDING, SEG_ENDING_SIZE);
+ // osInvalDCache((void *) SEG_ENDING, SEG_ENDING_SIZE);
}
void init_segment_racing(void) {
- bzero((void *) SEG_RACING, SEG_RACING_SIZE);
- osWritebackDCacheAll();
- dma_copy((u8 *) SEG_RACING, (u8 *) SEG_RACING_ROM_START, SEG_RACING_ROM_SIZE);
- osInvalICache((void *) SEG_RACING, SEG_RACING_SIZE);
- osInvalDCache((void *) SEG_RACING, SEG_RACING_SIZE);
+ // bzero((void *) SEG_RACING, SEG_RACING_SIZE);
+ // osWritebackDCacheAll();
+ // dma_copy((u8 *) SEG_RACING, (u8 *) SEG_RACING_ROM_START, SEG_RACING_ROM_SIZE);
+ // osInvalICache((void *) SEG_RACING, SEG_RACING_SIZE);
+ // osInvalDCache((void *) SEG_RACING, SEG_RACING_SIZE);
}
void dma_copy(u8 *dest, u8 *romAddr, size_t size) {
@@ -508,51 +508,51 @@ void dma_copy(u8 *dest, u8 *romAddr, size_t size) {
* Setup main segments and framebuffers.
*/
void setup_game_memory(void) {
- UNUSED u32 pad[2];
- ptrdiff_t commonCourseDataSize; // Compressed mio0 size
- uintptr_t textureSegSize;
- ptrdiff_t textureSegStart;
- uintptr_t allocatedMemory;
- UNUSED s32 unknown_padding;
-
- init_segment_racing();
- gHeapEndPtr = SEG_RACING;
- set_segment_base_addr(0, (void *) SEG_START);
-
- // Memory pool size of 0xAB630
- initialize_memory_pool(MEMORY_POOL_START, MEMORY_POOL_END);
-
- func_80000BEC();
-
- // Initialize trig tables segment
- osInvalDCache((void *) TRIG_TABLES, TRIG_TABLES_SIZE);
- osPiStartDma(&gDmaIoMesg, 0, 0, TRIG_TABLES_ROM_START, (void *) TRIG_TABLES, TRIG_TABLES_SIZE, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
-
- set_segment_base_addr(2, (void *) load_data(SEG_DATA_START, SEG_DATA_END));
-
- commonCourseDataSize = COMMON_TEXTURES_SIZE;
- commonCourseDataSize = ALIGN16(commonCourseDataSize);
-
-#ifdef AVOID_UB
- textureSegStart = (ptrdiff_t) SEG_RACING - commonCourseDataSize;
-#else
- textureSegStart = SEG_RACING - commonCourseDataSize;
-#endif
- osPiStartDma(&gDmaIoMesg, 0, 0, COMMON_TEXTURES_ROM_START, (void *) textureSegStart, commonCourseDataSize, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
-
- textureSegSize = *(uintptr_t *)(textureSegStart + 4);
- textureSegSize = ALIGN16(textureSegSize);
- allocatedMemory = gNextFreeMemoryAddress;
- mio0decode((u8 *) textureSegStart, (u8 *) allocatedMemory);
- set_segment_base_addr(0xD, (void *) allocatedMemory);
-
- gNextFreeMemoryAddress += textureSegSize;
-
- // Common course data does not get reloaded when the race state resets.
- // Therefore, only reset the memory ptr to after the common course data.
- gFreeMemoryResetAnchor = gNextFreeMemoryAddress;
+// UNUSED u32 pad[2];
+// ptrdiff_t commonCourseDataSize; // Compressed mio0 size
+// uintptr_t textureSegSize;
+// ptrdiff_t textureSegStart;
+// uintptr_t allocatedMemory;
+// UNUSED s32 unknown_padding;
+
+// init_segment_racing();
+// gHeapEndPtr = SEG_RACING;
+// set_segment_base_addr(0, (void *) SEG_START);
+
+// // Memory pool size of 0xAB630
+// initialize_memory_pool(MEMORY_POOL_START, MEMORY_POOL_END);
+
+// func_80000BEC();
+
+// // Initialize trig tables segment
+// osInvalDCache((void *) TRIG_TABLES, TRIG_TABLES_SIZE);
+// osPiStartDma(&gDmaIoMesg, 0, 0, TRIG_TABLES_ROM_START, (void *) TRIG_TABLES, TRIG_TABLES_SIZE, &gDmaMesgQueue);
+// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
+
+// set_segment_base_addr(2, (void *) load_data(SEG_DATA_START, SEG_DATA_END));
+
+// commonCourseDataSize = COMMON_TEXTURES_SIZE;
+// commonCourseDataSize = ALIGN16(commonCourseDataSize);
+
+// #ifdef AVOID_UB
+// textureSegStart = (ptrdiff_t) SEG_RACING - commonCourseDataSize;
+// #else
+// textureSegStart = SEG_RACING - commonCourseDataSize;
+// #endif
+// osPiStartDma(&gDmaIoMesg, 0, 0, COMMON_TEXTURES_ROM_START, (void *) textureSegStart, commonCourseDataSize, &gDmaMesgQueue);
+// osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
+
+// textureSegSize = *(uintptr_t *)(textureSegStart + 4);
+// textureSegSize = ALIGN16(textureSegSize);
+// allocatedMemory = gNextFreeMemoryAddress;
+// mio0decode((u8 *) textureSegStart, (u8 *) allocatedMemory);
+// set_segment_base_addr(0xD, (void *) allocatedMemory);
+
+// gNextFreeMemoryAddress += textureSegSize;
+
+// // Common course data does not get reloaded when the race state resets.
+// // Therefore, only reset the memory ptr to after the common course data.
+// gFreeMemoryResetAnchor = gNextFreeMemoryAddress;
}
/**
@@ -992,7 +992,7 @@ void handle_vblank(void) {
/* This is where I would put my rumble code... If I had any. */
#if ENABLE_RUMBLE
- rumble_thread_update_vi();
+ // rumble_thread_update_vi();
#endif
if (gVblankHandler1 != NULL) {
diff --git a/src/port/Variables.cpp b/src/port/Variables.cpp
index f7ccf0eb6..4185287fb 100644
--- a/src/port/Variables.cpp
+++ b/src/port/Variables.cpp
@@ -3,4 +3,6 @@
extern "C" {
+u64 osClockRate = 62500000;
+
} \ No newline at end of file
diff --git a/src/racing/memory.c b/src/racing/memory.c
index 62195569b..6ce49aaed 100644
--- a/src/racing/memory.c
+++ b/src/racing/memory.c
@@ -356,7 +356,7 @@ UNUSED s32 func_802A8348(s32 arg0, s32 arg1, s32 arg2) {
newAddr = (void *) (oldAddr + offset);
pad = &newAddr;
osInvalDCache(newAddr, offset);
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], newAddr, offset, &gDmaMesgQueue);
+ //osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], newAddr, offset, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
func_80040030((u8 *) newAddr, (u8 *) oldAddr);
@@ -373,7 +373,7 @@ UNUSED u8 *func_802A841C(u8* arg0, s32 arg1, s32 arg2) {
arg2 = ALIGN16(arg2);
osInvalDCache(temp_a0, arg1);
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)],temp_a0, arg1, &gDmaMesgQueue);
+ //osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)],temp_a0, arg1, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
func_80040030((u8 *) temp_a0, temp_v0);
gNextFreeMemoryAddress += arg2;
@@ -381,36 +381,36 @@ UNUSED u8 *func_802A841C(u8* arg0, s32 arg1, s32 arg2) {
}
u8 *dma_textures(u8 texture[], size_t arg1, size_t arg2) {
- u8 *temp_v0;
- void *temp_a0;
-
- temp_v0 = (u8 *) gNextFreeMemoryAddress;
- temp_a0 = temp_v0 + arg2;
- arg1 = ALIGN16(arg1);
- arg2 = ALIGN16(arg2);
- osInvalDCache((void *) temp_a0, arg1);
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(texture)], (void *)temp_a0, arg1, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, (int) 1);
- mio0decode((u8 *) temp_a0, temp_v0);
- gNextFreeMemoryAddress += arg2;
- return temp_v0;
+ // u8 *temp_v0;
+ // void *temp_a0;
+
+ // temp_v0 = (u8 *) gNextFreeMemoryAddress;
+ // temp_a0 = temp_v0 + arg2;
+ // arg1 = ALIGN16(arg1);
+ // arg2 = ALIGN16(arg2);
+ // osInvalDCache((void *) temp_a0, arg1);
+ // osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(texture)], (void *)temp_a0, arg1, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, (int) 1);
+ // mio0decode((u8 *) temp_a0, temp_v0);
+ // gNextFreeMemoryAddress += arg2;
+ // return temp_v0;
}
u32 MIO0_0F(u8 *arg0, u32 arg1, u32 arg2) {
- u32 oldHeapEndPtr;
- void *temp_v0;
-
- arg1 = ALIGN16(arg1);
- arg2 = ALIGN16(arg2);
- oldHeapEndPtr = gHeapEndPtr;
- temp_v0 = (void *) gNextFreeMemoryAddress;
-
- osInvalDCache(temp_v0, arg1);
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], temp_v0, arg1, &gDmaMesgQueue);
- osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
- mio0decode((u8 *) temp_v0, (u8 *) oldHeapEndPtr);
- gHeapEndPtr += arg2;
- return oldHeapEndPtr;
+ // u32 oldHeapEndPtr;
+ // void *temp_v0;
+
+ // arg1 = ALIGN16(arg1);
+ // arg2 = ALIGN16(arg2);
+ // oldHeapEndPtr = gHeapEndPtr;
+ // temp_v0 = (void *) gNextFreeMemoryAddress;
+
+ // osInvalDCache(temp_v0, arg1);
+ // osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], temp_v0, arg1, &gDmaMesgQueue);
+ // osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1);
+ // mio0decode((u8 *) temp_v0, (u8 *) oldHeapEndPtr);
+ // gHeapEndPtr += arg2;
+ // return oldHeapEndPtr;
}
void func_802A86A8(CourseVtx *data, u32 arg1) {
diff --git a/src/render_player.c b/src/render_player.c
index e4b073343..720e7208a 100644
--- a/src/render_player.c
+++ b/src/render_player.c
@@ -1,6 +1,7 @@
#include <libultraship.h>
#include <macros.h>
#include <mk64.h>
+#include <stubs.h>
#include <common_structs.h>
#include <defines.h>
#include "code_800029B0.h"
diff --git a/src/save.c b/src/save.c
index 260b314e0..9d6cbdd72 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1,6 +1,7 @@
#include <libultraship.h>
#include <macros.h>
#include <defines.h>
+#include <stubs.h>
#include "save.h"
diff --git a/src/spawn_players.c b/src/spawn_players.c
index 0206569bf..9ce33bc61 100644
--- a/src/spawn_players.c
+++ b/src/spawn_players.c
@@ -1,5 +1,6 @@
#include <defines.h>
#include <mk64.h>
+#include <stubs.h>
#include "spawn_players.h"
#include "code_800029B0.h"
diff --git a/src/staff_ghosts.c b/src/staff_ghosts.c
index 45423a3ec..c0bf9ee0b 100644
--- a/src/staff_ghosts.c
+++ b/src/staff_ghosts.c
@@ -15,8 +15,6 @@
#include "code_80057C60.h"
#include "kart_dma.h"
-extern s32 mio0encode(s32 input, s32, s32);
-
u8 *D_80162D80;
s16 D_80162D84;
s16 D_80162D86;
@@ -71,7 +69,7 @@ extern StaffGhost *d_luigi_raceway_staff_ghost;
void func_80004EF0(void) {
D_80162DA4 = (u32 *) &D_802BFB80.arraySize8[0][2][3];
osInvalDCache(&D_80162DA4[0], 0x4000);
- osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(D_80162DC4)], D_80162DA4, 0x4000, &gDmaMesgQueue);
+ //osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_kart_texturesSegmentRomStart[SEGMENT_OFFSET(D_80162DC4)], D_80162DA4, 0x4000, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
D_80162D9C = (*D_80162DA4 & 0xFF0000);
D_80162DA0 = 0;
diff --git a/src/stubs.c b/src/stubs.c
index 4c1ac1093..5003d3b5e 100644
--- a/src/stubs.c
+++ b/src/stubs.c
@@ -18,4 +18,94 @@ void func_80040030(u8* arg0, u8* arg1) {
void func_80040174(void* arg0, s32 arg1, s32 arg2) {
+}
+
+s32 osAiSetFrequency(u32 freq)
+{
+ return 1;
+}
+
+void mio0decode(u8* arg0, u8* arg1) {
+
+}
+
+s32 mio0encode(s32 input, s32 arg1, s32 arg2) {
+ return 1;
+}
+
+void tkmk00decode(u8* arg0, u8* arg1, u8* arg2, s32 arg3) {
+
+}
+
+void osStartThread(OSThread* thread)
+{
+
+}
+
+void osCreateThread(OSThread *thread, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri pri) {
+
+}
+
+void osInitialize(void) {
+
+}
+
+void osSetThreadPri(OSThread *thread, OSPri pri) {
+
+}
+
+void osSpTaskLoad(OSTask *task) {
+
+}
+
+void osSpTaskStartGo(OSTask *task) {
+
+}
+
+void osSpTaskYield(void) {
+
+}
+
+OSYieldResult osSpTaskYielded(OSTask *task) {
+
+}
+
+s32 osPfsDeleteFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name) {
+
+}
+
+s32 osPfsReadWriteFile(OSPfs *pfs, s32 file_no, u8 flag, int offset, int size_in_bytes, u8 *data_buffer) {
+
+}
+
+s32 osPfsAllocateFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, int file_size_in_bytes, s32 *file_no) {
+
+}
+
+void osSetTime(OSTime time) {
+
+}
+
+s32 osPfsIsPlug(OSMesgQueue *queue, u8 *pattern) {
+
+}
+
+s32 osPfsInit(OSMesgQueue *queue, OSPfs *pfs, int channel) {
+
+}
+
+s32 osPfsNumFiles(OSPfs *pfs, s32 *max_files, s32 *files_used) {
+ return 0;
+}
+
+s32 osPfsFileState(OSPfs *pfs, s32 file_no, OSPfsState *state) {
+
+}
+
+s32 osPfsFreeBlocks(OSPfs *pfs, s32 *bytes_not_used) {
+
+}
+
+s32 osPfsFindFile(OSPfs *pfs, u16 company_code, u32 game_code, u8 *game_name, u8 *ext_name, s32 *file_no) {
+
} \ No newline at end of file
diff --git a/src/update_objects.c b/src/update_objects.c
index 1a3089b9f..46533bd42 100644
--- a/src/update_objects.c
+++ b/src/update_objects.c
@@ -1207,7 +1207,7 @@ void func_80074510(uintptr_t devAddr, void * vaddr, size_t nbytes) {
}
void func_80074574(u8 *arg0, void *arg1, u16 arg2, u16 arg3) {
- func_80074510((uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], arg1, arg2 * arg3);
+ //func_80074510((uintptr_t) &_other_texturesSegmentRomStart[SEGMENT_OFFSET(arg0)], arg1, arg2 * arg3);
}
//! @todo arg1 should likely be a u8 *
diff --git a/yamls/us/common_data.yml b/yamls/us/common_data.yml
index 29d573d84..f4ddff371 100644
--- a/yamls/us/common_data.yml
+++ b/yamls/us/common_data.yml
@@ -11,16 +11,6 @@
- '#include <libultraship.h>'
- '#include <common_structs.h>'
tables:
- common_grand_prix_human_item_curve:
- range: [0x8150, 0x840C]
- common_grand_prix_kart_ai_item_curve:
- range: [0x8470, 0x872C]
- common_versus_2_player_item_curve:
- range: [0x8790, 0x87F4]
- common_versus_3_player_item_curve:
- range: [0x8858, 0x8920]
- common_versus_4_player_item_curve:
- range: [0x8984, 0x8AB0]
common_texture_hud_place:
range: [0xD258, 0x14258]
mode: APPEND
@@ -851,110 +841,6 @@ D_0D008138:
symbol: D_0D008138
type: gfx
offset: 0x8138
-common_grand_prix_human_item_curve:
- symbol: common_grand_prix_human_item_curve
- type: mk64:item_curve
- offset: 0x8150
-common_grand_prix_human_item_curve2:
- symbol: common_grand_prix_human_item_curve2
- type: mk64:item_curve
- offset: 0x81B4
-common_grand_prix_human_item_curve3:
- symbol: common_grand_prix_human_item_curve3
- type: mk64:item_curve
- offset: 0x8218
-common_grand_prix_human_item_curve4:
- symbol: common_grand_prix_human_item_curve4
- type: mk64:item_curve
- offset: 0x827C
-common_grand_prix_human_item_curve5:
- symbol: common_grand_prix_human_item_curve5
- type: mk64:item_curve
- offset: 0x82E0
-common_grand_prix_human_item_curve6:
- symbol: common_grand_prix_human_item_curve6
- type: mk64:item_curve
- offset: 0x8344
-common_grand_prix_human_item_curve7:
- symbol: common_grand_prix_human_item_curve7
- type: mk64:item_curve
- offset: 0x83A8
-common_grand_prix_human_item_curve8:
- symbol: common_grand_prix_human_item_curve8
- type: mk64:item_curve
- offset: 0x840C
-common_grand_prix_kart_ai_item_curve:
- symbol: common_grand_prix_kart_ai_item_curve
- type: mk64:item_curve
- offset: 0x8470
-common_grand_prix_kart_ai_item_curve2:
- symbol: common_grand_prix_kart_ai_item_curve2
- type: mk64:item_curve
- offset: 0x84D4
-common_grand_prix_kart_ai_item_curve3:
- symbol: common_grand_prix_kart_ai_item_curve3
- type: mk64:item_curve
- offset: 0x8538
-common_grand_prix_kart_ai_item_curve4:
- symbol: common_grand_prix_kart_ai_item_curve4
- type: mk64:item_curve
- offset: 0x859C
-common_grand_prix_kart_ai_item_curve5:
- symbol: common_grand_prix_kart_ai_item_curve5
- type: mk64:item_curve
- offset: 0x8600
-common_grand_prix_kart_ai_item_curve6:
- symbol: common_grand_prix_kart_ai_item_curve6
- type: mk64:item_curve
- offset: 0x8664
-common_grand_prix_kart_ai_item_curve7:
- symbol: common_grand_prix_kart_ai_item_curve7
- type: mk64:item_curve
- offset: 0x86C8
-common_grand_prix_kart_ai_item_curve8:
- symbol: common_grand_prix_kart_ai_item_curve8
- type: mk64:item_curve
- offset: 0x872C
-common_versus_2_player_item_curve:
- symbol: common_versus_2_player_item_curve
- type: mk64:item_curve
- offset: 0x8790
-common_versus_2_player_item_curve2:
- symbol: common_versus_2_player_item_curve2
- type: mk64:item_curve
- offset: 0x87F4
-common_versus_3_player_item_curve:
- symbol: common_versus_3_player_item_curve
- type: mk64:item_curve
- offset: 0x8858
-common_versus_3_player_item_curve2:
- symbol: common_versus_3_player_item_curve2
- type: mk64:item_curve
- offset: 0x88BC
-common_versus_3_player_item_curve3:
- symbol: common_versus_3_player_item_curve3
- type: mk64:item_curve
- offset: 0x8920
-common_versus_4_player_item_curve:
- symbol: common_versus_4_player_item_curve
- type: mk64:item_curve
- offset: 0x8984
-common_versus_4_player_item_curve2:
- symbol: common_versus_4_player_item_curve2
- type: mk64:item_curve
- offset: 0x89E8
-common_versus_4_player_item_curve3:
- symbol: common_versus_4_player_item_curve3
- type: mk64:item_curve
- offset: 0x8A4C
-common_versus_4_player_item_curve4:
- symbol: common_versus_4_player_item_curve4
- type: mk64:item_curve
- offset: 0x8AB0
-common_battle_item_curve:
- symbol: common_battle_item_curve
- type: mk64:item_curve
- offset: 0x8B14
D_0D008B78:
symbol: D_0D008B78
type: vtx