Doc setup_game_memory, label syms, add osSyncPrintf support, match funcs (#444)

* Doc setup_game_memory and label syms

* match func_800132F4

* match func label defines

* fix some fake ptrs

* match more code

* Matches

* Add osSyncPrintf support and matches

* Add func equiv to draw_square and add comment to is_debug
This commit is contained in:
MegaMech
2023-10-06 00:19:09 -06:00
committed by GitHub
parent 274fc21ffa
commit 2b74bbbcef
50 changed files with 971 additions and 3667 deletions
+4 -4
View File
@@ -85,11 +85,11 @@ u16 D_8015F702;
f32 D_8015F704;
Vec3f D_8015F708;
UNUSED u32 D_8015F718[3]; // Likely held ptrs to segmented data.
u32 gFreeMemorySize;
u32 gNextFreeMemoryAddress;
u32 gHeapEndPtr;
size_t gFreeMemorySize;
uintptr_t gNextFreeMemoryAddress;
uintptr_t gHeapEndPtr;
u32 D_8015F730;
u32 gFreeMemoryResetAnchor;
uintptr_t gFreeMemoryResetAnchor;
Vec3f D_8015F738;
Vec3f D_8015F748;
Vec3f D_8015F758;
+4 -4
View File
@@ -49,12 +49,12 @@ extern u16 D_8015F702;
extern f32 D_8015F704;
extern Vec3f D_8015F708;
extern UNUSED u32 D_8015F718[3];
extern u32 gFreeMemorySize;
extern u32 gNextFreeMemoryAddress;
extern u32 gHeapEndPtr;
extern size_t gFreeMemorySize;
extern uintptr_t gNextFreeMemoryAddress;
extern uintptr_t gHeapEndPtr;
extern u32 D_8015F730;
extern u32 gFreeMemoryResetAnchor;
extern uintptr_t gFreeMemoryResetAnchor;
extern Vec3f D_8015F738;
extern Vec3f D_8015F748;
extern Vec3f D_8015F758;
+484 -929
View File
File diff suppressed because it is too large Load Diff
+19 -4
View File
@@ -25,8 +25,23 @@ struct unexpiredActors {
s32 unk18;
};
/* Function Prototypes */
typedef struct {
f32 unk0;
f32 unk4;
f32 unk8;
f32 unkC;
} Test;
extern Test D_801634F8[];
/* Function Prototypes */
void func_80012190(void);
void func_8000BA14(u16, f32, f32, s16);
void func_80014BDC(void);
void func_80014A88(void);
void func_80014934(void);
void func_800147E0(void);
void func_800132F4(void);
s16 func_80005FD0(Vec3f, Vec3f);
void func_800100F0(s32);
void func_800120C8(void);
@@ -125,7 +140,7 @@ void func_80014D30(s32, s32);
f32 func_80014EE4(f32 arg0, s32 arg1);
void func_8001530C(void);
void func_80015314(s32, s32, s32);
void func_80015314(s32, f32, s32);
void func_80015390(Camera*, Player*, s32);
void func_8001968C(void);
@@ -170,7 +185,7 @@ extern struct unexpiredActors gUnexpiredActorsList[];
extern s16 D_8016348C;
extern s32 D_801643E0[];
extern s32 D_80164408[];
extern s16 D_80164670;
extern s16 D_80164670[];
extern s16 D_80164672;
extern s16 D_80164674;
extern s16 D_80164676;
@@ -180,7 +195,7 @@ extern s16 D_8016467C;
extern s16 D_8016467E;
extern s16 D_801632B8[];
extern s16 D_801632D0[];
extern s16 D_801632E8[];
extern u16 D_801632E8[];
extern s16 D_801646CC;
extern u16 D_80163E2A;
extern Gfx D_0D0076F8[];
+8 -44
View File
@@ -140,13 +140,10 @@ u16 func_8001FD78(Player *player, f32 posX, UNUSED f32 arg2, f32 posZ) {
}
void func_80020000(Player *player, Camera *camera, s8 arg2, s8 arg3) {
s32 stackPadding0;
s32 stackPadding1;
s32 stackPadding2;
s32 stackPadding3;
s32 pad[4];
s32 sp4C;
s32 sp48;
s32 stackPadding4;
s32 pad2;
s32 temp_v0;
s32 temp_v0_2;
@@ -1315,25 +1312,9 @@ void func_80024374(Player *player, s8 arg1, s8 arg2) {
}
void func_800248D0(Player *player, s8 arg1, s8 arg2, s8 arg3) {
s32 stackPadding00;
s32 pad;
Mat4 sp1A4;
s32 stackPadding01;
s32 stackPadding02;
s32 stackPadding03;
s32 stackPadding04;
s32 stackPadding05;
s32 stackPadding06;
s32 stackPadding07;
s32 stackPadding08;
s32 stackPadding09;
s32 stackPadding10;
s32 stackPadding11;
s32 stackPadding12;
s32 stackPadding13;
s32 stackPadding14;
s32 stackPadding15;
s32 stackPadding16;
s32 stackPadding17;
s32 pad2[17];
Vec3f sp154;
Vec3s sp14C;
f32 sp148;
@@ -1426,31 +1407,15 @@ void func_800248D0(Player *player, s8 arg1, s8 arg2, s8 arg3) {
}
void func_800256F4(Player *player, s8 arg1, s8 arg2, s8 arg3) {
s32 stackPadding00;
s32 pad;
Mat4 sp12C;
s32 stackPadding01;
s32 stackPadding02;
s32 stackPadding03;
s32 stackPadding04;
s32 stackPadding05;
s32 stackPadding06;
s32 stackPadding07;
s32 stackPadding08;
s32 stackPadding09;
s32 stackPadding10;
s32 stackPadding11;
s32 stackPadding12;
s32 stackPadding13;
s32 stackPadding14;
s32 stackPadding15;
s32 stackPadding16;
s32 stackPadding17;
s32 pad2[17];
Vec3f spDC;
Vec3s spD4;
f32 spD0;
f32 spCC;
f32 spC8;
s32 stackPadding18;
s32 pad3;
s16 spC2;
s16 thing;
@@ -1559,8 +1524,7 @@ void func_800262E0(Player *player, s8 arg1, s8 arg2, s8 arg3) {
}
void func_800267AC(Player *player, s8 arg1, s8 arg2) {
s32 stackPadding0;
s32 stackPadding1;
s32 pad[2];
s32 temp_t1;
s32 var_v1;
OSMesg *sp34;
+59 -89
View File
@@ -1625,76 +1625,60 @@ void func_80075714(s32 objectIndex) {
func_8008BF18(objectIndex);
}
#ifdef MIPS_TO_C
//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-28-2022
extern s32 D_801636A0;
extern s32 D_801637AC;
extern s16 D_8016578C;
extern s16 D_80165790;
extern ? D_8018C5F0;
void func_80075838(void) {
s32 *var_s1;
s32 *var_s1_2;
s32 pad[2];
s32 count;
s32 i;
s32 temp_a0;
s32 temp_a0_2;
s32 var_s2;
s32 var_s2_2;
struct_80165C18_entry *temp_s0;
struct_80165C18_entry *temp_s0_2;
struct_80165C18_entry *temp;
if (D_8016578C != 0) {
D_8016578C -= 1;
}
if (D_80165790 != 0) {
D_80165790 -= 1;
}
var_s2 = 0;
if ((D_801636A0 != 0) || (D_8016578C != 0)) {
var_s1 = D_8018C3F0;
do {
temp_a0 = *var_s1;
if ((sTrains[0].someFlags != 0) || (D_8016578C != 0)) {
count = 0;
for (i = 0; i < 128; i++) {
temp_a0 = D_8018C3F0[i];
if (temp_a0 != -1) {
temp_s0 = &D_80165C18[temp_a0];
if (temp_s0->unk_0A6 != 0) {
temp = &D_80165C18[temp_a0];
if (temp->unk_0A6 != 0) {
func_80075714(temp_a0);
if (temp_s0->unk_0A6 == 0) {
func_80072100(var_s1);
if (temp->unk_0A6 == 0) {
func_80072100(&D_8018C3F0[i]);
}
var_s2 += 1;
count += 1;
}
}
var_s1 += 4;
} while (var_s1 != &D_8018C5F0);
if (var_s2 != 0) {
D_8016578C = 0x0064;
}
if (count != 0) {
D_8016578C = 100;
}
}
if ((D_801637AC != 0) || (D_80165790 != 0)) {
var_s2_2 = 0;
var_s1_2 = D_8018C630;
do {
temp_a0_2 = *var_s1_2;
if (temp_a0_2 != -1) {
temp_s0_2 = &D_80165C18[temp_a0_2];
if (temp_s0_2->unk_0A6 != 0) {
func_80075714(temp_a0_2);
if (temp_s0_2->unk_0A6 == 0) {
func_80072100(var_s1_2);
if ((sTrains[1].someFlags != 0) || (D_80165790 != 0)) {
count = 0;
for (i = 0; i < 128; i++) {
temp_a0 = D_8018C630[i];
if (temp_a0 != -1) {
temp = &D_80165C18[temp_a0];
if (temp->unk_0A6 != 0) {
func_80075714(temp_a0);
if (temp->unk_0A6 == 0) {
func_80072100(&D_8018C630[i]);
}
var_s2_2 += 1;
count += 1;
}
}
var_s1_2 += 4;
} while (var_s1_2 != &D_8018C830);
if (var_s2_2 != 0) {
D_80165790 = 0x0064;
}
if (count != 0) {
D_80165790 = 100;
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80075838.s")
#endif
void func_800759EC(s32 objectIndex, Vec3f arg1, f32 arg2) {
struct_80165C18_entry *temp_v0;
@@ -1765,76 +1749,62 @@ void func_80075B84(s32 arg0) {
func_8008BF18(arg0);
}
#ifdef MIPS_TO_C
//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-28-2022
extern s32 D_801637E8;
extern s32 D_80163814;
extern s16 D_8016578C;
extern s16 D_80165790;
extern ? D_8018C5F0;
void func_80075CA8(void) {
s32 *var_s1;
s32 *var_s1_2;
s32 pad[2];
s32 count;
s32 i;
s32 temp_a0;
s32 temp_a0_2;
s32 var_s2;
s32 var_s2_2;
struct_80165C18_entry *temp_s0;
struct_80165C18_entry *temp_s0_2;
struct_80165C18_entry *temp;
if (D_8016578C != 0) {
D_8016578C -= 1;
}
if (D_80165790 != 0) {
D_80165790 -= 1;
}
var_s2 = 0;
if ((D_801637E8 != 0) || (D_8016578C != 0)) {
var_s1 = D_8018C3F0;
do {
temp_a0 = *var_s1;
count = 0;
for (i = 0; i < 128; i++) {
temp_a0 = D_8018C3F0[i];
if (temp_a0 != -1) {
temp_s0 = &D_80165C18[temp_a0];
if (temp_s0->unk_0A6 != 0) {
temp = &D_80165C18[temp_a0];
if (temp->unk_0A6 != 0) {
func_80075B84(temp_a0);
if (temp_s0->unk_0A6 == 0) {
func_80072100(var_s1);
if (temp->unk_0A6 == 0) {
func_80072100(&D_8018C3F0[i]);
}
var_s2 += 1;
count += 1;
}
}
var_s1 += 4;
} while (var_s1 != &D_8018C5F0);
if (var_s2 != 0) {
D_8016578C = 0x0064;
}
if (count != 0) {
D_8016578C = 100;
}
}
if ((D_80163814 != 0) || (D_80165790 != 0)) {
var_s2_2 = 0;
var_s1_2 = D_8018C630;
do {
temp_a0_2 = *var_s1_2;
if (temp_a0_2 != -1) {
temp_s0_2 = &D_80165C18[temp_a0_2];
if (temp_s0_2->unk_0A6 != 0) {
func_80075B84(temp_a0_2);
if (temp_s0_2->unk_0A6 == 0) {
func_80072100(var_s1_2);
count = 0;
for (i = 0; i < 128; i++) {
temp_a0 = D_8018C630[i];
if (temp_a0 != -1) {
temp = &D_80165C18[temp_a0];
if (temp->unk_0A6 != 0) {
func_80075B84(temp_a0);
if (temp->unk_0A6 == 0) {
func_80072100(&D_8018C630[i]);
}
var_s2_2 += 1;
count += 1;
}
}
var_s1_2 += 4;
} while (var_s1_2 != &D_8018C830);
if (var_s2_2 != 0) {
D_80165790 = 0x0064;
}
if (count != 0) {
D_80165790 = 100;
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80075CA8.s")
#endif
void func_80075E5C(s32 objectIndex, Vec3f arg1, u16 arg2, f32 arg3, s32 arg4) {
struct_80165C18_entry *temp_v0;
@@ -2300,7 +2270,7 @@ void func_80076F2C(void) {
}
}
}
extern s16 D_800E6788[1]; // todo: fix this extern
void func_80076FEC(s32 objectIndex, s32 flameIndex) {
func_800723A4(objectIndex, 3);
+13 -29
View File
@@ -56,9 +56,8 @@ void crash_screen_draw_glyph(u16 *framebuffer, s32 x, s32 y, s32 glyph) {
}
}
// Functionally Equivallent. At least, visually equivallent.
// Functionally Equivallent.
#ifdef NON_MATCHING
//generated by m2c commit 3b40ab93768f52ac241c5ae84ef58ef6bc4cb1de
// 0xRGBA (I think A maybe not).
#define WHITE_COLOUR 0xFFFF
@@ -75,36 +74,21 @@ void crash_screen_draw_glyph(u16 *framebuffer, s32 x, s32 y, s32 glyph) {
**/
void crash_screen_draw_square(u16 *framebuffer)
{
// s32 new_var;
s32 s0_end;
s32 s2_start;
s32 row;
s32 column;
s32 var_s0;
s32 var_s2;
s32 var_s3;
s32 row;
s32 column;
s32 i;
var_s0 = 0x2E;
var_s2 = 0x28;
var_s3 = 0x2C;
// new_var = i;
// for (i = 0; i < 2; i++)
do // (var_s0 = 0x2E; var_s0 != 0x2C; var_s0--)
{
row = 0x2E - i;
for (row = var_s2; row < var_s0; row++)
{
for (column = var_s2; column < var_s0; column++)
{
framebuffer[row * 320 + column] = i == 0 ? 0xF801 : 0xFFFF;
}
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;
}
}
}
var_s0--;
var_s2 = 6 + i;
} while(var_s0 != var_s3);
osWritebackDCacheAll();
osViSwapBuffer(framebuffer);
osWritebackDCacheAll();
osViSwapBuffer(framebuffer);
}
#else
GLOBAL_ASM("asm/non_matchings/crash_screen/crash_screen_draw_square.s")
+1 -1
View File
@@ -62,8 +62,8 @@
#include <macros.h>
#include <mk64.h>
#include <objects.h>
#include <hardcoded_segments.h>
#include <segments.h>
#include <segment_symbols.h>
#include <sounds.h>
#include <trig_tables.h>
#include <types.h>
+10 -11
View File
@@ -130,17 +130,16 @@ void load_ceremony_cutscene(void) {
D_800DC5C8 = (u16)0;
gSurfaceMap = (mk64_surface_map_ram *) gNextFreeMemoryAddress;
// @bug these segmented addresses need to be symbols for mobility
// This syntax is required to match
set_vertex_data_with_default_section_id(0x70067E8, -1);
set_vertex_data_with_default_section_id(0x700AEF8, -1);
set_vertex_data_with_default_section_id(0x700A970, 8);
set_vertex_data_with_default_section_id(0x700AC30, 8);
set_vertex_data_with_default_section_id(0x7000CE0, 0x10);
set_vertex_data_with_default_section_id(0x7000E88, 0x10);
set_vertex_data_with_default_section_id(0x700A618, -1);
set_vertex_data_with_default_section_id(0x700A618, -1);
set_vertex_data_with_default_section_id(0x70023F8, 1);
set_vertex_data_with_default_section_id(0x7002478, 1);
set_vertex_data_with_default_section_id(0x070067E8, -1);
set_vertex_data_with_default_section_id(0x0700AEF8, -1);
set_vertex_data_with_default_section_id(0x0700A970, 8);
set_vertex_data_with_default_section_id(0x0700AC30, 8);
set_vertex_data_with_default_section_id(0x07000CE0, 0x10);
set_vertex_data_with_default_section_id(0x07000E88, 0x10);
set_vertex_data_with_default_section_id(0x0700A618, -1);
set_vertex_data_with_default_section_id(0x0700A618, -1);
set_vertex_data_with_default_section_id(0x070023F8, 1);
set_vertex_data_with_default_section_id(0x07002478, 1);
func_80295C6C();
debug_switch_character_ceremony_cutscene();
func_802818BC();
+60 -71
View File
@@ -27,6 +27,7 @@
#include "main.h"
#include "code_80086E70.h"
#include "courses/all_course_data.h"
#include <vehicles.h>
void func_800431B0(Vec3f arg0, Vec3su arg1, f32 arg2, Vtx *vtx) {
func_80042E00(arg0, arg1, arg2);
@@ -4642,47 +4643,47 @@ void func_800540CC(s32 objectIndex, s32 cameraId) {
}
}
#ifdef MIPS_TO_C
//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-28-2022
extern f32 D_801635A4;
extern s32 D_801636A0;
extern f32 D_801636B0;
extern s32 D_801637AC;
extern ? D_8018C5F0;
// Train smoke?
void func_800541BC(s32 cameraId) {
Camera *sp3C;
Gfx *temp_v1;
s32 *var_s0;
s32 *var_s0_2;
s32 pad;
s32 j;
Camera *camera;
s32 i;
temp_v1 = gDisplayListHead;
sp3C = &camera1[cameraId];
gDisplayListHead = temp_v1 + 8;
temp_v1->words.w0 = 0x06000000;
temp_v1->words.w1 = (u32) D_0D007AE0;
func_8004477C(D_0D029458, 0x00000020, 0x00000020);
func_8004B72C(0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF);
D_80183E80->unk0 = 0;
D_80183E80->unk4 = 0x8000;
if ((D_801636A0 != 0) && (func_80041980(&D_801635A4, sp3C, 0x4000U) != 0)) {
var_s0 = D_8018C3F0;
do {
func_800540CC(*var_s0, cameraId);
var_s0 += 4;
} while (var_s0 != &D_8018C5F0);
camera = &camera1[cameraId];
gSPDisplayList(gDisplayListHead++, D_0D007AE0)
func_8004477C(D_0D029458, 32, 32);
func_8004B72C(255, 255, 255, 255, 255, 255, 255);
D_80183E80[0] = 0;
D_80183E80[2] = 0x8000;
// Render smoke for any number of trains. Don't know enough about these variables yet.
#ifdef AVOID_UB_WIP
for (j = 0; j < NUM_TRAINS; j++) {
if ((sTrains[j].someFlags != 0) && (func_80041980(&sTrains[j].locomotive.position, camera, 0x4000U) != 0)) {
for (i = 0; i < 128; i++) {
// Need to make a way to increase this array for each train.
func_800540CC(D_8018C3F0[i], cameraId);
}
}
}
if ((D_801637AC != 0) && (func_80041980(&D_801636B0, sp3C, 0x4000U) != 0)) {
var_s0_2 = D_8018C630;
do {
func_800540CC(*var_s0_2, cameraId);
var_s0_2 += 4;
} while (var_s0_2 != &D_8018C830);
}
}
#else
GLOBAL_ASM("asm/non_matchings/hud_renderer/func_800541BC.s")
if ((sTrains[0].someFlags != 0) && (func_80041980(&sTrains[0].locomotive.position, camera, 0x4000U) != 0)) {
for (i = 0; i < D_8018C3F0_SIZE; i++) {
func_800540CC(D_8018C3F0[i], cameraId);
}
}
if ((sTrains[1].someFlags != 0) && (func_80041980(&sTrains[1].locomotive.position, camera, 0x4000U) != 0)) {
for (i = 0; i < D_8018C630_SIZE; i++) {
func_800540CC(D_8018C630[i], cameraId);
}
}
#endif
}
void func_80054324(s32 objectIndex, s32 cameraId) {
Camera *camera;
@@ -4697,47 +4698,35 @@ void func_80054324(s32 objectIndex, s32 cameraId) {
}
}
#ifdef MIPS_TO_C
//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-28-2022
extern f32 D_801637C4;
extern s32 D_801637E8;
extern f32 D_801637F0;
extern s32 D_80163814;
extern ? D_8018C5F0;
// Likely smoke related.
void func_80054414(s32 cameraId) {
Camera *sp3C;
Gfx *temp_v1;
s32 *var_s0;
s32 *var_s0_2;
s32 pad[2];
Camera *camera;
s32 i;
camera = &camera1[cameraId];
gSPDisplayList(gDisplayListHead++, D_0D007AE0);
temp_v1 = gDisplayListHead;
sp3C = &camera1[cameraId];
gDisplayListHead = temp_v1 + 8;
temp_v1->words.w0 = 0x06000000;
temp_v1->words.w1 = (u32) D_0D007AE0;
func_8004477C(D_0D029458, 0x00000020, 0x00000020);
func_8004B72C(0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF);
D_80183E80->unk0 = 0;
D_80183E80->unk4 = 0x8000;
if ((D_801637E8 != 0) && (func_80041980(&D_801637C4, sp3C, 0x4000U) != 0)) {
var_s0 = D_8018C3F0;
do {
func_80054324(*var_s0, cameraId);
var_s0 += 4;
} while (var_s0 != &D_8018C5F0);
func_8004477C(D_0D029458, 32, 32);
func_8004B72C(255, 255, 255, 255, 255, 255, 255);
D_80183E80[0] = 0;
D_80183E80[2] = 0x8000;
if ((D_801637E8 != 0) && (func_80041980(&D_801637C4, camera, 0x4000U) != 0)) {
for (i = 0; i < D_8018C3F0_SIZE; i++) {
func_80054324(D_8018C3F0[i], cameraId);
}
}
if ((D_80163814 != 0) && (func_80041980(&D_801637F0, sp3C, 0x4000U) != 0)) {
var_s0_2 = D_8018C630;
do {
func_80054324(*var_s0_2, cameraId);
var_s0_2 += 4;
} while (var_s0_2 != &D_8018C830);
if ((D_80163814 != 0) && (func_80041980(&D_801637F0, camera, 0x4000U) != 0)) {
for (i = 0; i < D_8018C630_SIZE; i++) {
func_80054324(D_8018C630[i], cameraId);
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/hud_renderer/func_80054414.s")
#endif
void func_8005457C(s32 objectIndex, s32 cameraId) {
Camera *camera;
@@ -4747,9 +4736,9 @@ void func_8005457C(s32 objectIndex, s32 cameraId) {
if (gMatrixHudCount <= MTX_HUD_POOL_SIZE_MAX) {
temp_s0 = &D_80165C18[objectIndex];
if (temp_s0->unk_0D5 == 9) {
func_8004B72C(0x000000FF, (s32) temp_s0->unk_0A4, 0, (s32) temp_s0->unk_0A2, 0, 0, (s32) temp_s0->unk_0A0);
func_8004B72C(255, (s32) temp_s0->unk_0A4, 0, (s32) temp_s0->unk_0A2, 0, 0, (s32) temp_s0->unk_0A0);
} else {
func_8004B138(0x000000FF, (s32) temp_s0->unk_0A4, 0, (s32) temp_s0->unk_0A0);
func_8004B138(255, (s32) temp_s0->unk_0A4, 0, (s32) temp_s0->unk_0A0);
}
D_80183E80[1] = func_800418AC(temp_s0->pos[0], temp_s0->pos[2], camera->pos);
func_800431B0(temp_s0->pos, D_80183E80, temp_s0->sizeScaling, D_0D005AE0);
@@ -4805,8 +4794,8 @@ void func_80054938(s32 cameraId) {
sp54 = &camera1[cameraId];
gSPDisplayList(gDisplayListHead++, D_0D007AE0);
func_8004477C(D_0D02BC58[D_80165598], 0x00000020, 0x00000020);
func_8004B72C(0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF);
func_8004477C(D_0D02BC58[D_80165598], 32, 32);
func_8004B72C(255, 255, 255, 255, 255, 255, 255);
D_80183E80[0] = 0;
D_80183E80[2] = 0x8000;
for (var_s0 = 0; var_s0 < D_8018C870_SIZE; var_s0++) {
+3 -5
View File
@@ -1707,8 +1707,7 @@ void func_80027040(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
}
} else if (((temp & 0x400) == 0x400) || ((temp & 0x01000000) == 0x01000000) || ((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000)) {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], 0x780U);
// I think there's something off with the "player->unk_0A8 >> 8"
// I don't like that right-shift
// 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);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
} else {
@@ -1734,8 +1733,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
((temp & 0x02000000) == 0x02000000) || ((temp & 0x10000) == 0x10000))
{
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], 0x780);
// I think there's something off with the "player->unk_0A8 >> 8"
// I don't like that right-shift
// 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);
} else {
osInvalDCache(&D_802DFB80[arg4][arg3][arg1], D_800DDEB0[player->characterId]);
@@ -1746,7 +1744,7 @@ void func_80027560(Player *player, s8 arg1, s8 arg2, s8 arg3, s8 arg4) {
void func_80027A20(Player *player, s8 arg1, s8 arg2, s8 arg3) {
// Weird typecasting is being done here. We define D_802F1F80 as a 3-dimensional u32 array,
// but its better to understand it as a 3-dimensional struct_D_802F1F80 array.
struct_D_802F1F80 *temp_s0 = (struct_D_802F1F80 *) &D_802F1F80[arg3][arg2][arg1 << 7];
struct_D_802F1F80 *temp_s0 = (struct_D_802F1F80 *) &D_802F1F80[arg3][arg2][arg1 * 0x80];
switch(gActiveScreenMode) {
case SCREEN_MODE_1P:
case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL:
+41 -33
View File
@@ -3,15 +3,14 @@
#include <PR/os.h>
#include <macros.h>
#include <functions.h>
#include "types.h"
#include "config.h"
#include <types.h>
#include <config.h>
#include "profiler.h"
#include "main.h"
#include "racing/memory.h"
#include "menus.h"
#include "segments.h"
#include "segment_symbols.h"
#include "common_structs.h"
#include <segments.h>
#include <common_structs.h>
#include <defines.h>
#include "framebuffers.h"
#include "camera.h"
@@ -203,9 +202,12 @@ void create_thread(OSThread *thread, OSId id, void (*entry)(void *), void *arg,
thread->queue = NULL;
osCreateThread(thread, id, entry, arg, sp, pri);
}
void isPrintfInit(void);
void main_func(void) {
osInitialize();
#ifdef DEBUG
isPrintfInit(); // init osSyncPrintf
#endif
create_thread(&gIdleThread, 1, &thread1_idle, NULL, gIdleThreadStack + ARRAY_COUNT(gIdleThreadStack), 100);
osStartThread(&gIdleThread);
}
@@ -462,19 +464,19 @@ void display_and_vsync(void) {
}
void init_segment_ending_sequences(void) {
bzero((void *) SEG_ENDING_SEQUENCES, 0xDF00);
bzero((void *) SEG_ENDING_SEQUENCES, ENDING_SEQUENCE_SIZE);
osWritebackDCacheAll();
dma_copy((u8 *) SEG_ENDING_SEQUENCES, (u8 *) &_endingSequencesSegmentRomStart, ALIGN16((u32)&_endingSequencesSegmentRomEnd - (u32)&_endingSequencesSegmentRomStart));
osInvalICache((void *) SEG_ENDING_SEQUENCES, 0xDF00);
osInvalDCache((void *) SEG_ENDING_SEQUENCES, 0xDF00);
osInvalICache((void *) SEG_ENDING_SEQUENCES, ENDING_SEQUENCE_SIZE);
osInvalDCache((void *) SEG_ENDING_SEQUENCES, ENDING_SEQUENCE_SIZE);
}
void init_segment_racing(void) {
bzero((void *) SEG_RACING, 0x2C470);
bzero((void *) SEG_RACING, RACING_SEQUENCE_SIZE);
osWritebackDCacheAll();
dma_copy((u8 *) SEG_RACING, (u8 *) &_racingSegmentRomStart, ALIGN16((u32)&_racingSegmentRomEnd - (u32)&_racingSegmentRomStart));
osInvalICache((void *) SEG_RACING, 0x2C470);
osInvalDCache((void *) SEG_RACING, 0x2C470);
osInvalICache((void *) SEG_RACING, RACING_SEQUENCE_SIZE);
osInvalDCache((void *) SEG_RACING, RACING_SEQUENCE_SIZE);
}
void dma_copy(u8 *dest, u8 *romAddr, u32 size) {
@@ -498,40 +500,46 @@ void dma_copy(u8 *dest, u8 *romAddr, u32 size) {
*/
void setup_game_memory(void) {
UNUSED u32 pad[2];
u32 sp2C;
u32 sp40;
uintptr_t texture_seg;
u32 sp38;
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;
gHeapEndPtr = (uintptr_t) SEG_RACING;
set_segment_base_addr(0, (void *) SEG_START);
// Memory pool size of 0xAB630
// todo: is it possible to shift this value?
#ifdef AVOID_UB
initialize_memory_pool((uintptr_t) &_mainSegNoloadEnd, (uintptr_t) (&_mainSegNoloadEnd[0] + 0xAB630));
#else
initialize_memory_pool((uintptr_t) &_mainSegNoloadEnd, (uintptr_t) 0x80242F00);
#endif
initialize_memory_pool((uintptr_t) &_mainSegNoloadEnd, (uintptr_t) MEMORY_POOL_END);
func_80000BEC();
osInvalDCache((void *) SEG_802BA370, 0x5810);
osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_data_802BA370SegmentRomStart, (void *) SEG_802BA370, 0x5810, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
set_segment_base_addr(2, (void *) load_data((uintptr_t) &_data_segment2SegmentRomStart, (uintptr_t) &_data_segment2SegmentRomEnd));
sp2C = (u32)&_common_texturesSegmentRomEnd - (u32)&_common_texturesSegmentRomStart;
sp2C = ALIGN16(sp2C);
texture_seg = SEG_RACING-sp2C;
osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_common_texturesSegmentRomStart, (void *) texture_seg, sp2C, &gDmaMesgQueue);
commonCourseDataSize = (uintptr_t)&_common_texturesSegmentRomEnd - (uintptr_t)&_common_texturesSegmentRomStart;
commonCourseDataSize = ALIGN16(commonCourseDataSize);
#ifdef AVOID_UB
textureSegStart = (ptrdiff_t) SEG_RACING[0] - commonCourseDataSize;
#else
textureSegStart = SEG_RACING - commonCourseDataSize;
#endif
osPiStartDma(&gDmaIoMesg, 0, 0, (uintptr_t) &_common_texturesSegmentRomStart, (void *) textureSegStart, commonCourseDataSize, &gDmaMesgQueue);
osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK);
sp40 = *(u32 *)(texture_seg + 4);
sp40 = ALIGN16(sp40);
sp38 = gNextFreeMemoryAddress;
mio0decode((u8 *) texture_seg, (u8 *) sp38);
set_segment_base_addr(0xD, (void *) sp38);
textureSegSize = *(uintptr_t *)(textureSegStart + 4);
textureSegSize = ALIGN16(textureSegSize);
allocatedMemory = gNextFreeMemoryAddress;
mio0decode((u8 *) textureSegStart, (u8 *) allocatedMemory);
set_segment_base_addr(0xD, (void *) allocatedMemory);
gNextFreeMemoryAddress += sp40;
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;
}
+145
View File
@@ -0,0 +1,145 @@
#include "libultra_internal.h"
#include "libc/stdarg.h"
#include <string.h>
#include "printf.h"
#include <PR/os.h>
#include "hardware.h"
// Note: This file was very quickly strewn together from oot.
// Not great but it works.
OSPiHandle* sISVHandle; // official name : is_Handle
typedef struct {
/* 0x00 */ u32 magic; // IS64
/* 0x04 */ u32 get;
/* 0x08 */ u8 unk_08[0x14-0x08];
/* 0x14 */ u32 put;
/* 0x18 */ u8 unk_18[0x20-0x18];
/* 0x20 */ u8 data[0x10000-0x20];
} ISVDbg;
#define gISVDbgPrnAdrs ((ISVDbg*)0xB3FF0000)
#define ASCII_TO_U32(a, b, c, d) ((u32)((a << 24) | (b << 16) | (c << 8) | (d << 0)))
void* is_proutSyncPrintf(void* arg, const char* str, u32 count);
s32 __osEPiRawReadIo(OSPiHandle *arg0, u32 devAddr, u32 *data) {
register s32 stat;
while (stat = HW_REG(PI_STATUS_REG, s32), stat & (PI_STATUS_BUSY | PI_STATUS_IOBUSY | PI_STATUS_ERROR)) {
;
}
*data = HW_REG(arg0->baseAddress | devAddr, s32);
return 0;
}
s32 osEPiReadIo(OSPiHandle* handle, u32 devAddr, u32* data) {
register s32 ret;
__osPiGetAccess();
ret = __osEPiRawReadIo(handle, devAddr, data);
__osPiRelAccess();
return ret;
}
s32 osEPiWriteIo(OSPiHandle* handle, u32 devAddr, u32 data) {
register s32 ret;
__osPiGetAccess();
ret = __osEPiRawWriteIo(handle, devAddr, data);
__osPiRelAccess();
return ret;
}
void isPrintfInit(void) {
sISVHandle = osCartRomInit();
osEPiWriteIo(sISVHandle, (u32)&gISVDbgPrnAdrs->put, 0);
osEPiWriteIo(sISVHandle, (u32)&gISVDbgPrnAdrs->get, 0);
osEPiWriteIo(sISVHandle, (u32)&gISVDbgPrnAdrs->magic, ASCII_TO_U32('I', 'S', '6', '4'));
}
void osSyncPrintfUnused(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
_Printf(is_proutSyncPrintf, NULL, fmt, args);
va_end(args);
}
void osSyncPrintf(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
_Printf(is_proutSyncPrintf, NULL, fmt, args);
va_end(args);
}
void print(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
_Printf(is_proutSyncPrintf, NULL, fmt, args);
va_end(args);
}
// assumption
void rmonPrintf(const char* fmt, ...) {
va_list args;
va_start(args, fmt);
_Printf(is_proutSyncPrintf, NULL, fmt, args);
va_end(args);
}
void* is_proutSyncPrintf(void* arg, const char* str, u32 count) {
u32 data;
s32 pos;
s32 start;
s32 end;
osEPiReadIo(sISVHandle, (u32)&gISVDbgPrnAdrs->magic, &data);
if (data != ASCII_TO_U32('I', 'S', '6', '4')) {
return (void*)1;
}
osEPiReadIo(sISVHandle, (u32)&gISVDbgPrnAdrs->get, &data);
pos = data;
osEPiReadIo(sISVHandle, (u32)&gISVDbgPrnAdrs->put, &data);
start = data;
end = start + count;
if (end >= 0xFFE0) {
end -= 0xFFE0;
if (pos < end || start < pos) {
return (void*)1;
}
} else {
if (start < pos && pos < end) {
return (void*)1;
}
}
while (count) {
u32 addr = (u32)&gISVDbgPrnAdrs->data + (start & 0xFFFFFFC);
s32 shift = ((3 - (start & 3)) * 8);
if (*str) {
osEPiReadIo(sISVHandle, addr, &data);
osEPiWriteIo(sISVHandle, addr, (*str << shift) | (data & ~(0xFF << shift)));
start++;
if (start >= 0xFFE0) {
start -= 0xFFE0;
}
}
count--;
str++;
}
osEPiWriteIo(sISVHandle, (u32)&gISVDbgPrnAdrs->put, start);
return (void*)1;
}
+5
View File
@@ -1,6 +1,9 @@
#include "libultra_internal.h"
#include "libc/stdarg.h"
// These funcs defined in is_debug.c
#ifndef DEBUG
char *osSyncPrintf(char *arg0, const char *arg1, size_t size) {
// ifdef'd formatting code?
return (1);
@@ -12,3 +15,5 @@ void rmonPrintf(const char *fmt, ...) {
_Printf(osSyncPrintf, NULL, fmt, args);
va_end(args);
}
#endif // DEBUG
+2 -2
View File
@@ -1354,9 +1354,9 @@ u8 *load_course(s32 courseId) {
unknown1 = gCourseTable[courseId].unknown1;
if ((gGamestate == ENDING_SEQUENCE) || (gGamestate == CREDITS_SEQUENCE)) {
gHeapEndPtr = SEG_ENDING_SEQUENCES;
gHeapEndPtr = (uintptr_t) SEG_ENDING_SEQUENCES;
} else {
gHeapEndPtr = SEG_RACING;
gHeapEndPtr = (uintptr_t) SEG_RACING;
}
set_segment_base_addr(9, load_data((uintptr_t)offsetRomStart, (uintptr_t) offsetRomEnd));