Skip to content

Commit b638db6

Browse files
committed
Misc decomp
1 parent 79a49b8 commit b638db6

File tree

7 files changed

+111
-114
lines changed

7 files changed

+111
-114
lines changed

include/functions.h

+1
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,6 @@ s32 func_8000F44C();
6262
void set_menu_page(s32);
6363
void func_8001442C();
6464
s8 func_80048498();
65+
void set_textures_on_gdl(Gfx **gdl, Texture *tex0, Texture *tex1, u32 flags, s32 level, u32 force, u32 setModes);
6566

6667
#endif //_FUNCTIONS_H

include/sys/gfx/gx.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ typedef struct _UnkVidStruct2 {
6363
#define UNKNOWN_VIDEO_STRUCT_SIZE 0x90
6464

6565
typedef struct _UnkVidStruct {
66-
struct _UnkHeapVidStruct *ptrToUnknown1;
67-
f32 *ptrToUnknown2;
66+
Gfx dl;
6867
u8 unk0x8_pad[16];
6968
s16 unk0x18;
7069
s16 unk0x1a;
@@ -82,7 +81,7 @@ typedef struct _UnkVidStruct {
8281
u8 unk0x4c_pad[40];
8382
f32 unk0x78;
8483
f32 unk0x7c;
85-
u8 unk0x80_pad[4];
84+
void *unk0x80;
8685
OSViMode *viMode;
8786
s16 unk0x88;
8887
u8 unk0x8a_padd[6];
@@ -93,6 +92,11 @@ typedef struct _UnkVidStruct3 {
9392
s32 unk0x4;
9493
} UnkVidStruct3;
9594

95+
typedef struct {
96+
u8 _unk0x0[0x46];
97+
s16 unk0x46;
98+
} UnkVidStruct4;
99+
96100
// Length of gUnknownVideoStructs
97101
#define UNKNOWN_VIDEO_STRUCTS_COUNT 40
98102

@@ -108,8 +112,6 @@ extern void *D_80092F54;
108112
extern void *D_80092F9C;
109113
extern void *D_80092FE4;
110114

111-
extern s32 D_80092FF8;
112-
113115
extern s8 D_80093060;
114116
extern UnkVidStruct3 *D_80093068;
115117

@@ -119,8 +121,6 @@ extern f32 gMPalAspectRatio; // 1.333333_ (4/3)
119121
extern f32 gNtscAspectRatio; // 1.333333_ (4/3)
120122

121123
extern UnkVidStruct gUnknownVideoStructs[UNKNOWN_VIDEO_STRUCTS_COUNT];
122-
extern UnkHeapVidStruct *D_800BCC10;
123-
extern UnkVidStruct2 D_800BCC18[4]; // size:0x50
124124
extern s32 D_800BCC68;
125125
extern s32 D_800BCC6C;
126126
extern u32 D_800BCC70;

splat.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,8 @@ segments:
257257
- [0x8BD60, bin, ucode_gspF3DEX2_xbusText]
258258
- [0x92370, .data, crash]
259259
- [0x92380, bin]
260+
- [0x93BF8, .data, video]
261+
- [0x93C08, bin]
260262
- [0x93CB8, .data, libultra/io/vimgr]
261263
- [0x93CD0, bin]
262264
- [0x97840, .data, libultra/os/initialize]
@@ -299,6 +301,10 @@ segments:
299301
- [0xA3470, bin]
300302
- [0xA3A00, bin, ucode_aspMainData]
301303
- [0xA4550, bin, ucode_gspF3DEX2_xbusData]
304+
- [0xA4970, bin]
305+
306+
- [0xA69B8]
307+
- [auto, all_bss]
302308

303309
- type: code
304310
start: 0xA4970

src/dlls/engine/21_gametext/gametext.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
#include <PR/ultratypes.h>
2-
#include "common.h"
2+
#include "sys/fs.h"
3+
#include "sys/memory.h"
34
#include "dlls/engine/21_gametext.h"
5+
#include "variables.h"
6+
#include "functions.h"
47
#include "prevent_bss_reordering.h"
58

69
static s8 sCurrentBankIndex = -1;

src/input.c

+1
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ void controller_thread_entry(void *_) {
308308
#pragma GLOBAL_ASM("asm/nonmatchings/input/init_virtual_cont_port_map.s")
309309
#else
310310
// Functionally equivalent
311+
// Making gVirtualContPortMap static fixes it
311312
void _init_virtual_cont_port_map() {
312313
int i;
313314

src/video.c

+89-106
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include "common.h"
22

3+
UnkHeapVidStruct *D_800BCC10;
4+
UnkVidStruct2 D_800BCC18[4]; // size:0x50
5+
36
// func_8005BC38 is from segment_5C470
47
/**
58
* If param1 isn't null, sets it to gPossiblyScreenWidthOrHeight.
@@ -13,39 +16,32 @@ void initialize_framebuffers(int someBool, s32 width, s32 height);
1316
void swap_framebuffer_pointers();
1417
void set_custom_vi_mode();
1518

16-
#if 1
19+
#if 0
1720
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005C780.s")
1821
#else
19-
// Functionally equivalent, see TODOs
2022
void func_8005C780() {
21-
UnkVidStruct2 *vidStruct2;
22-
UnkVidStruct *vidStruct;
23-
UnkHeapVidStruct *vidHeapStruct;
2423
s32 i;
2524

26-
vidHeapStruct = D_800BCC10;
27-
28-
if (vidHeapStruct != NULL) {
29-
free(vidHeapStruct);
25+
if (D_800BCC10 != NULL) {
26+
free(D_800BCC10);
3027
}
3128

3229
D_800BCC10 = malloc(UNKNOWN_HEAP_VIDEO_STRUCT_SIZE, 0x13, 0);
3330

3431
for (i = 0; i < UNKNOWN_VIDEO_STRUCTS_COUNT; i++)
3532
{
36-
gUnknownVideoStructs[i].ptrToUnknown1 = (UnkHeapVidStruct*)0xdf000000;
37-
gUnknownVideoStructs[i].ptrToUnknown2 = NULL;
33+
gSPEndDisplayList(&gUnknownVideoStructs[i].dl);
3834
gUnknownVideoStructs[i].viMode = NULL;
3935
gUnknownVideoStructs[i].unk0x88 = 0;
4036
}
4137

4238
for (i = 0; i < 4; i++)
4339
{
4440
D_800BCC18[i].unk0x10 = NULL;
45-
D_800BCC18[i].unk0x0 = 0.0f;
46-
D_800BCC18[i].unk0x4 = 0.0f;
41+
D_800BCC18[i].unk0x0 = 0;
42+
D_800BCC18[i].unk0x4 = 0;
43+
D_800BCC18[i].unk0x8 = 0;
4744
D_800BCC18[i].unk0xc = 0;
48-
D_800BCC18[i].unk0x8 = 0.0f;
4945
}
5046

5147
D_800BCC10->unk0x0 = -3.0f;
@@ -54,18 +50,21 @@ void func_8005C780() {
5450
D_800BCC10->unk0xc = -3.0f;
5551
D_800BCC10->unk0x10 = 0.0f;
5652
D_800BCC10->unk0x14 = 3.0f;
53+
5754
D_800BCC10->unk0x18 = 3.0f;
5855
D_800BCC10->unk0x1c = 0.0f;
5956
D_800BCC10->unk0x20 = 3.0f;
6057
D_800BCC10->unk0x24 = 3.0f;
6158
D_800BCC10->unk0x28 = 0.0f;
6259
D_800BCC10->unk0x2c = -3.0f;
60+
6361
D_800BCC10->unk0x30 = -3.0f;
6462
D_800BCC10->unk0x34 = 0.0f;
6563
D_800BCC10->unk0x38 = -3.0f;
6664
D_800BCC10->unk0x3c = -3.0f;
6765
D_800BCC10->unk0x40 = 0.0f;
6866
D_800BCC10->unk0x44 = 3.0f;
67+
6968
D_800BCC10->unk0x48 = 3.0f;
7069
D_800BCC10->unk0x4c = 0.0f;
7170
D_800BCC10->unk0x50 = 3.0f;
@@ -81,61 +80,26 @@ void func_8005C780() {
8180
}
8281
#endif
8382

84-
#if 1
83+
#if 0
8584
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005C998.s")
8685
void func_8005C998();
8786
#else
88-
// Functionally equivalent, see TODOs
89-
void _func_8005C998() {
90-
UnkVidStruct2 *vidStruct2;
91-
UnkVidStruct *vidStruct = &gUnknownVideoStructs[0];
92-
93-
do {
94-
vidStruct->ptrToUnknown1 = (UnkHeapVidStruct*)0xdf000000;
95-
vidStruct->ptrToUnknown2 = NULL;
96-
goto label_1; label_1: // TODO: This probably shouldn't be necessary
97-
vidStruct->viMode = NULL;
98-
vidStruct->unk0x88 = 0;
99-
} while (++vidStruct < &gUnknownVideoStructs[UNKNOWN_VIDEO_STRUCTS_COUNT]);
100-
101-
// TODO: Figure out how to get this to match in a way that it weaves in `lui at,0x800c`
102-
vidStruct2 = &D_800BCC18[0];
103-
vidStruct2->unk0x10 = 0;
104-
// lui at,0x800c
105-
vidStruct2->unk0x0 = 0.0f;
106-
vidStruct2->unk0x4 = 0.0f;
107-
// lui at,0x800c
108-
vidStruct2->unk0xc = (u8)0;
109-
vidStruct2->unk0x8 = 0.0f;
110-
// lui at,0x800c
111-
vidStruct2 = &D_800BCC18[1];
112-
vidStruct2->unk0x10 = 0;
113-
// lui at,0x800c
114-
vidStruct2->unk0x0 = 0.0f;
115-
// lui at,0x800c
116-
vidStruct2->unk0x4 = 0.0f;
117-
vidStruct2->unk0x8 = 0.0f;
118-
// lui at,0x800c
119-
vidStruct2->unk0xc = (u8)0;
120-
// lui at,0x800c
121-
vidStruct2 = &D_800BCC18[2];
122-
vidStruct2->unk0x10 = 0;
123-
// lui at,0x800c
124-
vidStruct2->unk0x0 = 0.0f;
125-
vidStruct2->unk0x4 = 0.0f;
126-
// lui at,0x800c
127-
vidStruct2->unk0xc = (u8)0;
128-
vidStruct2->unk0x8 = 0.0f;
129-
// lui at,0x800c
130-
vidStruct2 = &D_800BCC18[3];
131-
vidStruct2->unk0x10 = 0;
132-
// lui at,0x800c
133-
vidStruct2->unk0x0 = 0.0f;
134-
// lui at,0x800c
135-
vidStruct2->unk0x4 = 0.0f;
136-
vidStruct2->unk0x8 = 0.0f;
137-
// lui at,0x800c
138-
vidStruct2->unk0xc = (u8)0;
87+
void func_8005C998() {
88+
s32 i;
89+
90+
for (i = 0; i < UNKNOWN_VIDEO_STRUCTS_COUNT; i++) {
91+
gSPEndDisplayList(&gUnknownVideoStructs[i].dl);
92+
gUnknownVideoStructs[i].viMode = NULL;
93+
gUnknownVideoStructs[i].unk0x88 = 0;
94+
}
95+
96+
for (i = 0; i < 4; i++) {
97+
D_800BCC18[i].unk0x10 = 0;
98+
D_800BCC18[i].unk0x0 = 0.0f;
99+
D_800BCC18[i].unk0x4 = 0.0f;
100+
D_800BCC18[i].unk0x8 = 0.0f;
101+
D_800BCC18[i].unk0xc = 0;
102+
}
139103
}
140104
#endif
141105

@@ -151,41 +115,62 @@ void func_8005CA5C(u32 param1) {
151115
}
152116
#endif
153117

154-
#if 1
118+
#if 0
155119
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005CA88.s")
156120
#else
157-
// Functionally equivalent, not quite regalloc only but extremely close
158-
void func_8005CA88(f32 *a0, f32 *a1, u8 a2)
159-
{
160-
s32 temp1;
161-
s32 temp2;
162-
163-
if (D_800BCC78 != 0)
164-
{
165-
temp1 = D_80092FF8;
166-
167-
D_800BCC18[temp1].unk0x10 = a0;
168-
D_800BCC18[temp1].unk0x0 = a1[0];
121+
void func_8005CA88(f32 *a0, f32 *a1, u8 a2) {
122+
static s32 D_80092FF8 = 0;
169123

170-
temp2 = temp1 + 1;
171-
if (1); // TODO: skeptical about this
124+
if (D_800BCC78 != 0) {
125+
D_800BCC18[D_80092FF8].unk0x10 = a0;
126+
D_800BCC18[D_80092FF8].unk0x0 = a1[0];
127+
D_800BCC18[D_80092FF8].unk0x4 = a0[4] + a1[1];
128+
D_800BCC18[D_80092FF8].unk0x8 = a1[2];
129+
D_800BCC18[D_80092FF8].unk0xc = a2;
172130

173-
D_800BCC18[temp1].unk0x4 = a0[4] + a1[1];
174-
D_800BCC18[temp1].unk0x8 = a1[2];
175-
D_800BCC18[temp1].unk0xc = a2;
131+
D_80092FF8 = D_80092FF8 + 1;
176132

177-
D_80092FF8 = temp2;
178-
179-
if (D_80092FF8 == 4)
180-
{
133+
if (D_80092FF8 == 4) {
181134
D_80092FF8 = 0;
182135
}
183136
}
184137
}
185138
#endif
186139

140+
#if 0
187141
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005CB10.s")
142+
#else
143+
void func_8005CB10(Gfx **gdl, UnkVidStruct4 *param2) {
144+
s32 i;
145+
Texture *tex;
146+
147+
switch (param2->unk0x46) {
148+
case 0:
149+
tex = D_800BCC68;
150+
break;
151+
case 0x1f:
152+
tex = D_800BCC6C;
153+
break;
154+
default:
155+
tex = D_800BCC68;
156+
break;
157+
}
188158

159+
set_textures_on_gdl(gdl, tex, NULL, 0x1a, 0, 0, 1);
160+
161+
i = 0;
162+
163+
while (i < UNKNOWN_VIDEO_STRUCTS_COUNT) {
164+
if (param2 == gUnknownVideoStructs[i].unk0x80) {
165+
gSPDisplayList((*gdl)++, &gUnknownVideoStructs[i].dl);
166+
}
167+
168+
i++;
169+
}
170+
}
171+
#endif
172+
173+
static s32 D_80092FFC = 1;
189174
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005CC74.s")
190175

191176
#pragma GLOBAL_ASM("asm/nonmatchings/video/func_8005CD80.s")
@@ -195,37 +180,35 @@ void func_8005CA88(f32 *a0, f32 *a1, u8 a2)
195180
#else
196181
// Functionally equivalent, mainly regalloc, see TODO
197182
void func_8005CDFC(int _) {
198-
UnkVidStruct *vidStruct;
199183
float var1;
200184
float var2;
201185
s16 *var3;
186+
s32 i;
202187

203-
vidStruct = &gUnknownVideoStructs[0];
204-
205-
do {
206-
if (vidStruct->viMode == NULL) {
188+
for (i = 0; i < UNKNOWN_VIDEO_STRUCTS_COUNT; i++) {
189+
if (gUnknownVideoStructs[i].viMode == NULL) {
207190
continue;
208191
}
209192

210193
// TODO: The order of loads and stores here are slightly out of order
211-
var1 = gWorldX - vidStruct->unk0x78;
212-
var2 = gWorldZ - vidStruct->unk0x7c;
194+
var1 = gWorldX - gUnknownVideoStructs[i].unk0x78;
195+
var2 = gWorldZ - gUnknownVideoStructs[i].unk0x7c;
213196

214-
var3 = &vidStruct->unk0x48[0];
197+
var3 = &gUnknownVideoStructs[i].unk0x48[0];
215198

216-
vidStruct->unk0x78 = vidStruct->unk0x78 + var1;
217-
vidStruct->unk0x7c = vidStruct->unk0x7c + var2;
218-
219-
vidStruct->unk0x18 = vidStruct->unk0x18 - var1;
220-
vidStruct->unk0x1c = vidStruct->unk0x1c - var2;
221-
vidStruct->unk0x28 = vidStruct->unk0x28 - var1;
222-
vidStruct->unk0x2c = vidStruct->unk0x2c - var2;
223-
vidStruct->unk0x38 = vidStruct->unk0x38 - var1;
224-
vidStruct->unk0x3c = vidStruct->unk0x3c - var2;
199+
gUnknownVideoStructs[i].unk0x78 += var1;
200+
gUnknownVideoStructs[i].unk0x7c += var2;
201+
202+
gUnknownVideoStructs[i].unk0x18 -= var1;
203+
gUnknownVideoStructs[i].unk0x1c -= var2;
204+
gUnknownVideoStructs[i].unk0x28 -= var1;
205+
gUnknownVideoStructs[i].unk0x2c -= var2;
206+
gUnknownVideoStructs[i].unk0x38 -= var1;
207+
gUnknownVideoStructs[i].unk0x3c -= var2;
225208

226209
var3[2] = var3[2] - var2;
227210
var3[0] = var3[0] - var1;
228-
} while (++vidStruct != &gUnknownVideoStructs[UNKNOWN_VIDEO_STRUCTS_COUNT]);
211+
}
229212
}
230213
#endif
231214

0 commit comments

Comments
 (0)