Merge branch 'Rainchus:main' into main

This commit is contained in:
CreateSource 2023-11-28 21:40:17 -05:00 committed by GitHub
commit 8f1d6b9680
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 4400 additions and 994 deletions

View file

@ -17,6 +17,10 @@ modules:
symbols: config/GMPE01_00/rels/bootDll/symbols.txt
splits: config/GMPE01_00/rels/bootDll/splits.txt
links: []
extract:
- symbol: logoNintendoData
binary: logoNintendoData.bin
header: logoNintendoData.inc
- object: orig/GMPE01_00/files/dll/instDll.rel
hash: f09399fee83c63abfe2adb25341152adad959a93
symbols: config/GMPE01_00/rels/instDll/symbols.txt
@ -502,3 +506,44 @@ modules:
symbols: config/GMPE01_00/rels/m401Dll/symbols.txt
splits: config/GMPE01_00/rels/m401Dll/splits.txt
links: [_minigameDll]
extract:
- symbol: ank8x8_4b
binary: ank8x8_4b.bin
header: ank8x8_4b.inc
- symbol: refMapData0
binary: refMapData0.anm
header: refMapData0.inc
- symbol: refMapData1
binary: refMapData1.anm
header: refMapData1.inc
- symbol: refMapData2
binary: refMapData2.anm
header: refMapData2.inc
- symbol: refMapData3
binary: refMapData3.anm
header: refMapData3.inc
- symbol: refMapData4
binary: refMapData4.anm
header: refMapData4.inc
- symbol: toonMapData
binary: toonMapData.anm
header: toonMapData.inc
- symbol: toonMapData2
binary: toonMapData2.anm
header: toonMapData2.inc
- symbol: hiliteData
binary: hiliteData.anm
header: hiliteData.inc
- symbol: hiliteData2
binary: hiliteData2.anm
header: hiliteData2.inc
- symbol: hiliteData3
binary: hiliteData3.anm
header: hiliteData3.inc
- symbol: hiliteData4
binary: hiliteData4.anm
header: hiliteData4.inc
- symbol: Ascii8x8_1bpp
binary: Ascii8x8_1bpp.bin
header: Ascii8x8_1bpp.inc

View file

@ -5,3 +5,16 @@ Sections:
.rodata type:rodata align:8
.data type:data align:32
.bss type:bss align:8
REL/executor.c:
.text start:0x00000000 end:0x000000A0
REL/bootDll/bootDll.c:
.text start:0x000000A0 end:0x00002944
.rodata start:0x00000000 end:0x000000DC
.data start:0x00000000 end:0x000000A0
.bss start:0x00000000 end:0x0000005C
REL/bootDll/nintendo_data.c:
.text start:0x00002944 end:0x000029C8
.data start:0x000000A0 end:0x0000311D

View file

@ -1,6 +1,6 @@
_prolog = .text:0x00000000; // type:function size:0x54 scope:global
_epilog = .text:0x00000054; // type:function size:0x4C scope:global
fn_1_A0 = .text:0x000000A0; // type:function size:0x1CC
ModuleProlog = .text:0x000000A0; // type:function size:0x1CC
fn_1_26C = .text:0x0000026C; // type:function size:0x78C
fn_1_9F8 = .text:0x000009F8; // type:function size:0xC8
fn_1_AC0 = .text:0x00000AC0; // type:function size:0x6B8
@ -8,7 +8,7 @@ fn_1_1178 = .text:0x00001178; // type:function size:0x3B4
fn_1_152C = .text:0x0000152C; // type:function size:0xBD4
fn_1_2100 = .text:0x00002100; // type:function size:0x374
fn_1_2474 = .text:0x00002474; // type:function size:0x4D0
fn_1_2944 = .text:0x00002944; // type:function size:0x84
logoReadNintendo = .text:0x00002944; // type:function size:0x84
_ctors = .ctors:0x00000000; // type:label scope:global data:4byte
_dtors = .dtors:0x00000000; // type:label scope:global data:4byte
lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 data:float
@ -56,7 +56,7 @@ lbl_1_data_58 = .data:0x00000058; // type:object size:0x4
lbl_1_data_5C = .data:0x0000005C; // type:object size:0x1A data:string
lbl_1_data_76 = .data:0x00000076; // type:object size:0x13 data:string
lbl_1_data_89 = .data:0x00000089; // type:object size:0x17
lbl_1_data_A0 = .data:0x000000A0; // type:object size:0x307D
logoNintendoData = .data:0x000000A0; // type:object size:0x307D align:32
lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x6
lbl_1_bss_6 = .bss:0x00000006; // type:object size:0x2 data:2byte
lbl_1_bss_8 = .bss:0x00000008; // type:object size:0x6 data:2byte

View file

@ -47,6 +47,14 @@ game/decode.c:
game/font.c:
.data start:0x8011FE00 end:0x80121E00
game/init.c:
.text start:0x80009AFC end:0x8000A464
.data start:0x80121E00 end:0x80121F50
.bss start:0x80145A40 end:0x80145A80
.sdata start:0x801D3448 end:0x801D3460
.sbss start:0x801D3AF8 end:0x801D3B28
.sdata2 start:0x801D4968 end:0x801D4978
game/jmp.c:
.text start:0x8000A464 end:0x8000A558
@ -89,6 +97,74 @@ game/sprput.c:
.sbss start:0x801D3B50 end:0x801D3B58
.sdata2 start:0x801D49F0 end:0x801D4A28
game/hsfload.c:
.text start:0x80010B30 end:0x80014018
.data start:0x80122320 end:0x80122390
.bss start:0x8015C6C0 end:0x8015CC80
.sbss start:0x801D3B58 end:0x801D3B90
game/hsfdraw.c:
.text start:0x80014018 end:0x8001F9AC
.rodata start:0x8011DD20 end:0x8011DD30
.data start:0x80122390 end:0x801225A0
.bss start:0x8015CC80 end:0x801677C0
.sdata start:0x801D3470 end:0x801D3488
.sbss start:0x801D3B90 end:0x801D3C30
.sdata2 start:0x801D4A28 end:0x801D4AB0
game/hsfman.c:
.text start:0x8001F9AC end:0x800250E8
.data start:0x801225A0 end:0x8012D658
.bss start:0x801677C0 end:0x8018D3D0
.sbss start:0x801D3C30 end:0x801D3C60
.sdata2 start:0x801D4AB0 end:0x801D4B10
.sbss2 start:0x801D6BE0 end:0x801D6BE8
game/objmain.c:
.text start:0x8002EBD8 end:0x8002FF4C
.data start:0x8012D918 end:0x8012DCC8
.bss start:0x8018FB38 end:0x8018FBF8
.sdata start:0x801D3498 end:0x801D34A0
.sbss start:0x801D3CC0 end:0x801D3CF0
.sdata2 start:0x801D4C78 end:0x801D4CA0
game/fault.c:
.text start:0x8002FF4C end:0x800308B8
.data start:0x8012DCC8 end:0x8012E4F0
.bss start:0x8018FBF8 end:0x8018FC10
.sdata start:0x801D34A0 end:0x801D34B0
.sbss start:0x801D3CF0 end:0x801D3D00
game/ovllist.c:
.data start:0x8012F790 end:0x80130100
game/frand.c:
.text start:0x800325F4 end:0x80032830
.sbss start:0x801D3D10 end:0x801D3D18
.sdata2 start:0x801D4CB0 end:0x801D4CC0
game/window.c:
.text start:0x8004207C end:0x800483A0
.data start:0x80130140 end:0x80130688
.bss start:0x801923C0 end:0x801967E0
.sdata start:0x801D35E8 end:0x801D35F0
.sbss start:0x801D3DB0 end:0x801D3DF8
.sdata2 start:0x801D4F08 end:0x801D4F98
game/messdata.c:
.text start:0x800483A0 end:0x80048488
game/card.c:
.text start:0x80048488 end:0x80048A84
.data start:0x80130688 end:0x801306D8
.sbss start:0x801D3DF8 end:0x801D3E00
game/armem.c:
.text start:0x80048A84 end:0x800498F0
.data start:0x801306D8 end:0x801307C8
.bss start:0x801967E0 end:0x80196EC0
.sbss start:0x801D3E00 end:0x801D3E10
Runtime.PPCEABI.H/global_destructor_chain.c:
.text start:0x800E2008 end:0x800E2068
.dtors start:0x8011DCE8 end:0x8011DCEC

File diff suppressed because it is too large Load diff

View file

@ -118,7 +118,7 @@ if not is_windows():
# Tool versions
config.compilers_tag = "20231018"
config.dtk_tag = "v0.6.0"
config.dtk_tag = "v0.6.3"
config.sjiswrap_tag = "v1.1.1"
config.wibo_tag = "0.6.3"
@ -150,6 +150,7 @@ cflags_base = [
"-fp_contract on",
"-str reuse",
"-i include",
f"-i build/{config.version}/include",
"-multibyte",
f"-DVERSION={version_num}",
]
@ -172,8 +173,10 @@ cflags_runtime = [
# REL flags
cflags_rel = [
*cflags_base,
"-O0,s",
"-O0,p",
"-enum int",
"-char unsigned",
"-fp_contract off",
"-sdata 0",
"-sdata2 0",
"-pool off",
@ -183,7 +186,9 @@ cflags_rel = [
cflags_game = [
*cflags_base,
"-O0,p",
"-enum int",
"-char unsigned",
"-fp_contract off",
]
config.linker_version = "GC/2.6"
@ -227,17 +232,29 @@ config.libs = [
"objects": [
Object(NonMatching, "game/main.c"),
Object(NonMatching, "game/pad.c"),
Object(NonMatching, "game/dvd.c"),
Object(Matching, "game/dvd.c"),
Object(NonMatching, "game/data.c"),
Object(Matching, "game/decode.c"),
Object(NonMatching, "game/font.c"),
Object(Matching, "game/font.c"),
Object(Matching, "game/init.c"),
Object(NonMatching, "game/jmp.c"),
Object(Matching, "game/malloc.c"),
Object(Matching, "game/memory.c"),
Object(NonMatching, "game/printfunc.c"),
Object(Matching, "game/printfunc.c"),
Object(Matching, "game/process.c"),
Object(NonMatching, "game/sprman.c"),
Object(NonMatching, "game/sprput.c"),
Object(NonMatching, "game/hsfload.c"),
Object(NonMatching, "game/hsfdraw.c"),
Object(NonMatching, "game/hsfman.c"),
Object(Matching, "game/objmain.c"),
Object(NonMatching, "game/fault.c"),
Object(NonMatching, "game/frand.c"),
Object(Matching, "game/ovllist.c"),
Object(NonMatching, "game/window.c"),
Object(NonMatching, "game/messdata.c"),
Object(NonMatching, "game/card.c"),
Object(NonMatching, "game/armem.c"),
],
},
{
@ -270,6 +287,17 @@ config.libs = [
Object(Matching, "REL/_minigameDLL/_minigameDLL.c"),
],
},
{
"lib": "bootDll",
"mw_version": config.linker_version,
"cflags": cflags_rel,
"host": False,
"objects": [
Object(Matching, "REL/executor.c"),
Object(NonMatching, "REL/bootDll/bootDll.c"),
Object(Matching, "REL/bootDll/nintendo_data.c"),
],
},
{
"lib": "subchrselDll",
"mw_version": config.linker_version,

25
get_rel_function_names.py Executable file
View file

@ -0,0 +1,25 @@
import os
import sys
if len(sys.argv) != 2:
print("Usage: python script.py <file_path>")
sys.exit(1)
file_path = sys.argv[1]
lines_starting_with_fn = ""
with open(file_path, 'r') as file:
for line in file:
# Remove leading and trailing whitespaces
line = line.strip()
if line.startswith(".fn fn_"):
# Remove ".fn " from the beginning of the line
line = line[len(".fn "):]
# Remove ", global" from the end of the line
line = line.rstrip(', global')
lines_starting_with_fn += "// " + line + '\n\n'
print(lines_starting_with_fn)

View file

@ -3,7 +3,9 @@
#include "types.h"
#include "common_structs.h"
#include "common_enums.h"
#include "functions.h"
#include "variables.h"
#include "dolphin/mtx/GeoTypes.h"
#endif

35
include/common_enums.h Normal file
View file

@ -0,0 +1,35 @@
#ifndef _COMMON_ENUMS_H
#define _COMMON_ENUMS_H
#include "types.h"
#define OVL_DEFINE(name, path) name,
typedef enum {
OVL_INVALID = -1,
#include "ovl_table.h"
OVL_COUNT
} OverlayID;
#undef OVL_DEFINE
#define DATADIR_DEFINE(name, path) name,
typedef enum {
#include "datadir_table.h"
DATADIR_COUNT
} DataDirID;
#undef DATADIR_DEFINE
typedef enum {
HEAP_SYSTEM,
HEAP_MUSIC,
HEAP_DATA,
HEAP_DVD,
HEAP_MISC,
HEAP_MAX
} HeapID;
#endif

View file

@ -2,12 +2,14 @@
#define _COMMON_STRUCTS_H
#include "types.h"
#include "common_enums.h"
#include "dolphin/dvd.h"
typedef struct UnkOvl {
s32 unk0;
char unk4[4];
s32 unk8;
} UnkOvl;
typedef struct om_ovl_his_data {
OverlayID overlay;
int event;
int stat;
} omOvlHisData;
typedef struct Vec3f {
f32 x;
@ -57,4 +59,97 @@ typedef struct wipe_state {
u8 unk2[20];
} WipeState;
typedef struct file_list_entry {
char *name;
s32 file_id;
} FileListEntry;
typedef struct data_read_stat {
s32 dir_id;
void *dir;
void *file;
u32 raw_len;
u32 comp_type;
BOOL used;
s32 num;
u32 status;
DVDFileInfo file_info;
} DataReadStat;
typedef struct BoardStateSubStruct {
/* 0x00 */ s32 unk0;
/* 0x04 */ s16 unk4;
/* 0x06 */ s16 unk6;
/* 0x08 */ s16 unk8;
} BoardStateSubStruct;
typedef struct BoardState {
/* 0x00 */ char unk00[0x04];
/* 0x04 */ s8 curTurnCount;
/* 0x05 */ s8 maxTurnCount;
/* 0x06 */ char unk06[0x02];
/* 0x08 */ u8 unk08;
/* 0x09 */ s8 doubleCoinsOnSpaceBool;
/* 0x0A */ s8 curPlayerIndex;
/* 0x0C */ char unk0C[4];
/* 0x10 */ BoardStateSubStruct unk10;
/* 0x1A */ char unk1A[0xC6];
} BoardState; //8018fcf8, sizeof 0xE0
typedef struct {
u8 unk0 : 2;
} PlayerFlags;
typedef struct Player {
/* 0x00 */ s8 characterID;
/* 0x01 */ s8 unk01;
/* 0x02 */ s8 unk02;
/* 0x03 */ s8 unk03;
/* 0x04 */ s8 controllerPort;
/* 0x05 */ s8 items[3];
/* 0x08 */ PlayerFlags flags; //0x02 mini mushroom, 0x04 mega mushroom
/* 0x09 */ s8 placement; //0x80 1st, 0x20 2nd, 0x40 3rd, 0x60 4th
/* 0x0A */ u8 spacesLeftToMove;
/* 0x0B */ char unk_0B[5];
/* 0x10 */ s16 nextABSSpaceIndex;
/* 0x12 */ char unk_12[2];
/* 0x14 */ s8 blueSpacesLanded;
/* 0x15 */ s8 redSpacesLanded;
/* 0x16 */ s8 happeningSpacesLanded;
/* 0x17 */ s8 chanceSpacesLanded;
/* 0x18 */ char unk_18;
/* 0x19 */ s8 battleSpacesLanded;
/* 0x1A */ s8 itemSpacesLanded;
/* 0x1B */ s8 springSpacesLanded;
/* 0x1C */ s16 coins;
/* 0x1E */ char unk_1E[2];
/* 0x20 */ s16 totalCoinsCollected;
/* 0x22 */ s16 coinPeak;
/* 0x24 */ char unk_24[6];
/* 0x2A */ s16 stars;
/* 0x2C */ char unk_2C[4];
} Player; //size of 0x30
typedef struct om_obj_data {
u16 stat;
s16 next_idx_alloc;
s16 prio;
s16 prev;
s16 next;
s16 next_idx;
s16 group;
u16 group_idx;
int unk10;
void (*func)(struct om_obj_data *);
Vec3f trans;
Vec3f rot;
Vec3f scale;
u16 mdlcnt;
s16 *model;
u16 mtncnt;
s16 *motion;
int work[4];
void *data;
} omObjData;
#endif

140
include/datadir_table.h Normal file
View file

@ -0,0 +1,140 @@
DATADIR_DEFINE(DATADIR_E3SETUP, "data/E3setup.bin")
DATADIR_DEFINE(DATADIR_BBATTLE, "data/bbattle.bin")
DATADIR_DEFINE(DATADIR_BGUEST, "data/bguest.bin")
DATADIR_DEFINE(DATADIR_BKOOPA, "data/bkoopa.bin")
DATADIR_DEFINE(DATADIR_BKOOPASUIT, "data/bkoopasuit.bin")
DATADIR_DEFINE(DATADIR_BKUJIYA, "data/bkujiya.bin")
DATADIR_DEFINE(DATADIR_BLAST5, "data/blast5.bin")
DATADIR_DEFINE(DATADIR_BOARD, "data/board.bin")
DATADIR_DEFINE(DATADIR_BPAUSE, "data/bpause.bin")
DATADIR_DEFINE(DATADIR_BYOKODORI, "data/byokodori.bin")
DATADIR_DEFINE(DATADIR_DAISY, "data/daisy.bin")
DATADIR_DEFINE(DATADIR_DAISYMDL0, "data/daisymdl0.bin")
DATADIR_DEFINE(DATADIR_DAISYMDL1, "data/daisymdl1.bin")
DATADIR_DEFINE(DATADIR_DAISYMOT, "data/daisymot.bin")
DATADIR_DEFINE(DATADIR_DONKEY, "data/donkey.bin")
DATADIR_DEFINE(DATADIR_DONKEYMDL0, "data/donkeymdl0.bin")
DATADIR_DEFINE(DATADIR_DONKEYMDL1, "data/donkeymdl1.bin")
DATADIR_DEFINE(DATADIR_DONKEYMOT, "data/donkeymot.bin")
DATADIR_DEFINE(DATADIR_EFFECT, "data/effect.bin")
DATADIR_DEFINE(DATADIR_GAMEMES, "data/gamemes.bin")
DATADIR_DEFINE(DATADIR_INST, "data/inst.bin")
DATADIR_DEFINE(DATADIR_INSTFONT, "data/instfont.bin")
DATADIR_DEFINE(DATADIR_INSTPIC, "data/instpic.bin")
DATADIR_DEFINE(DATADIR_LUIGI, "data/luigi.bin")
DATADIR_DEFINE(DATADIR_LUIGIMDL0, "data/luigimdl0.bin")
DATADIR_DEFINE(DATADIR_LUIGIMDL1, "data/luigimdl1.bin")
DATADIR_DEFINE(DATADIR_LUIGIMOT, "data/luigimot.bin")
DATADIR_DEFINE(DATADIR_M300, "data/m300.bin")
DATADIR_DEFINE(DATADIR_M302, "data/m302.bin")
DATADIR_DEFINE(DATADIR_M303, "data/m303.bin")
DATADIR_DEFINE(DATADIR_M330, "data/m330.bin")
DATADIR_DEFINE(DATADIR_M333, "data/m333.bin")
DATADIR_DEFINE(DATADIR_M401, "data/m401.bin")
DATADIR_DEFINE(DATADIR_M402, "data/m402.bin")
DATADIR_DEFINE(DATADIR_M403, "data/m403.bin")
DATADIR_DEFINE(DATADIR_M404, "data/m404.bin")
DATADIR_DEFINE(DATADIR_M405, "data/m405.bin")
DATADIR_DEFINE(DATADIR_M406, "data/m406.bin")
DATADIR_DEFINE(DATADIR_M407, "data/m407.bin")
DATADIR_DEFINE(DATADIR_M408, "data/m408.bin")
DATADIR_DEFINE(DATADIR_M409, "data/m409.bin")
DATADIR_DEFINE(DATADIR_M410, "data/m410.bin")
DATADIR_DEFINE(DATADIR_M411, "data/m411.bin")
DATADIR_DEFINE(DATADIR_M412, "data/m412.bin")
DATADIR_DEFINE(DATADIR_M413, "data/m413.bin")
DATADIR_DEFINE(DATADIR_M414, "data/m414.bin")
DATADIR_DEFINE(DATADIR_M415, "data/m415.bin")
DATADIR_DEFINE(DATADIR_M416, "data/m416.bin")
DATADIR_DEFINE(DATADIR_M417, "data/m417.bin")
DATADIR_DEFINE(DATADIR_M418, "data/m418.bin")
DATADIR_DEFINE(DATADIR_M419, "data/m419.bin")
DATADIR_DEFINE(DATADIR_M420, "data/m420.bin")
DATADIR_DEFINE(DATADIR_M421, "data/m421.bin")
DATADIR_DEFINE(DATADIR_M422, "data/m422.bin")
DATADIR_DEFINE(DATADIR_M423, "data/m423.bin")
DATADIR_DEFINE(DATADIR_M424, "data/m424.bin")
DATADIR_DEFINE(DATADIR_M425, "data/m425.bin")
DATADIR_DEFINE(DATADIR_M426, "data/m426.bin")
DATADIR_DEFINE(DATADIR_M427, "data/m427.bin")
DATADIR_DEFINE(DATADIR_M428, "data/m428.bin")
DATADIR_DEFINE(DATADIR_M429, "data/m429.bin")
DATADIR_DEFINE(DATADIR_M430, "data/m430.bin")
DATADIR_DEFINE(DATADIR_M431, "data/m431.bin")
DATADIR_DEFINE(DATADIR_M432, "data/m432.bin")
DATADIR_DEFINE(DATADIR_M433, "data/m433.bin")
DATADIR_DEFINE(DATADIR_M434, "data/m434.bin")
DATADIR_DEFINE(DATADIR_M435, "data/m435.bin")
DATADIR_DEFINE(DATADIR_M436, "data/m436.bin")
DATADIR_DEFINE(DATADIR_M437, "data/m437.bin")
DATADIR_DEFINE(DATADIR_M438, "data/m438.bin")
DATADIR_DEFINE(DATADIR_M439, "data/m439.bin")
DATADIR_DEFINE(DATADIR_M440, "data/m440.bin")
DATADIR_DEFINE(DATADIR_M441, "data/m441.bin")
DATADIR_DEFINE(DATADIR_M442, "data/m442.bin")
DATADIR_DEFINE(DATADIR_M443, "data/m443.bin")
DATADIR_DEFINE(DATADIR_M444, "data/m444.bin")
DATADIR_DEFINE(DATADIR_M445, "data/m445.bin")
DATADIR_DEFINE(DATADIR_M446, "data/m446.bin")
DATADIR_DEFINE(DATADIR_M447, "data/m447.bin")
DATADIR_DEFINE(DATADIR_M448, "data/m448.bin")
DATADIR_DEFINE(DATADIR_M449, "data/m449.bin")
DATADIR_DEFINE(DATADIR_M450, "data/m450.bin")
DATADIR_DEFINE(DATADIR_M451, "data/m451.bin")
DATADIR_DEFINE(DATADIR_M453, "data/m453.bin")
DATADIR_DEFINE(DATADIR_M455, "data/m455.bin")
DATADIR_DEFINE(DATADIR_M456, "data/m456.bin")
DATADIR_DEFINE(DATADIR_M457, "data/m457.bin")
DATADIR_DEFINE(DATADIR_M458, "data/m458.bin")
DATADIR_DEFINE(DATADIR_M459, "data/m459.bin")
DATADIR_DEFINE(DATADIR_M460, "data/m460.bin")
DATADIR_DEFINE(DATADIR_M461, "data/m461.bin")
DATADIR_DEFINE(DATADIR_M462, "data/m462.bin")
DATADIR_DEFINE(DATADIR_MARIO, "data/mario.bin")
DATADIR_DEFINE(DATADIR_MARIOMDL0, "data/mariomdl0.bin")
DATADIR_DEFINE(DATADIR_MARIOMDL1, "data/mariomdl1.bin")
DATADIR_DEFINE(DATADIR_MARIOMOT, "data/mariomot.bin")
DATADIR_DEFINE(DATADIR_MENT, "data/ment.bin")
DATADIR_DEFINE(DATADIR_MGCONST, "data/mgconst.bin")
DATADIR_DEFINE(DATADIR_MGMODE, "data/mgmode.bin")
DATADIR_DEFINE(DATADIR_MODESEL, "data/modesel.bin")
DATADIR_DEFINE(DATADIR_MPEX, "data/mpex.bin")
DATADIR_DEFINE(DATADIR_MSTORY, "data/mstory.bin")
DATADIR_DEFINE(DATADIR_MSTORY2, "data/mstory2.bin")
DATADIR_DEFINE(DATADIR_MSTORY3, "data/mstory3.bin")
DATADIR_DEFINE(DATADIR_MSTORY4, "data/mstory4.bin")
DATADIR_DEFINE(DATADIR_OPTION, "data/option.bin")
DATADIR_DEFINE(DATADIR_PEACH, "data/peach.bin")
DATADIR_DEFINE(DATADIR_PEACHMDL0, "data/peachmdl0.bin")
DATADIR_DEFINE(DATADIR_PEACHMDL1, "data/peachmdl1.bin")
DATADIR_DEFINE(DATADIR_PEACHMOT, "data/peachmot.bin")
DATADIR_DEFINE(DATADIR_PRESENT, "data/present.bin")
DATADIR_DEFINE(DATADIR_RESULT, "data/result.bin")
DATADIR_DEFINE(DATADIR_SAF, "data/saf.bin")
DATADIR_DEFINE(DATADIR_SELMENU, "data/selmenu.bin")
DATADIR_DEFINE(DATADIR_SETUP, "data/setup.bin")
DATADIR_DEFINE(DATADIR_STAFF, "data/staff.bin")
DATADIR_DEFINE(DATADIR_TITLE, "data/title.bin")
DATADIR_DEFINE(DATADIR_W01, "data/w01.bin")
DATADIR_DEFINE(DATADIR_W02, "data/w02.bin")
DATADIR_DEFINE(DATADIR_W03, "data/w03.bin")
DATADIR_DEFINE(DATADIR_W04, "data/w04.bin")
DATADIR_DEFINE(DATADIR_W05, "data/w05.bin")
DATADIR_DEFINE(DATADIR_W06, "data/w06.bin")
DATADIR_DEFINE(DATADIR_W10, "data/w10.bin")
DATADIR_DEFINE(DATADIR_W20, "data/w20.bin")
DATADIR_DEFINE(DATADIR_W21, "data/w21.bin")
DATADIR_DEFINE(DATADIR_WALUIGI, "data/waluigi.bin")
DATADIR_DEFINE(DATADIR_WALUIGIMDL0, "data/waluigimdl0.bin")
DATADIR_DEFINE(DATADIR_WALUIGIMDL1, "data/waluigimdl1.bin")
DATADIR_DEFINE(DATADIR_WALUIGIMOT, "data/waluigimot.bin")
DATADIR_DEFINE(DATADIR_WARIO, "data/wario.bin")
DATADIR_DEFINE(DATADIR_WARIOMDL0, "data/wariomdl0.bin")
DATADIR_DEFINE(DATADIR_WARIOMDL1, "data/wariomdl1.bin")
DATADIR_DEFINE(DATADIR_WARIOMOT, "data/wariomot.bin")
DATADIR_DEFINE(DATADIR_WIN, "data/win.bin")
DATADIR_DEFINE(DATADIR_YOSHI, "data/yoshi.bin")
DATADIR_DEFINE(DATADIR_YOSHIMDL0, "data/yoshimdl0.bin")
DATADIR_DEFINE(DATADIR_YOSHIMDL1, "data/yoshimdl1.bin")
DATADIR_DEFINE(DATADIR_YOSHIMOT, "data/yoshimot.bin")
DATADIR_DEFINE(DATADIR_ZTAR, "data/ztar.bin")

View file

@ -121,6 +121,9 @@ BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset,
#define DVDReadAsync(fileInfo, addr, length, offset, callback) \
DVDReadAsyncPrio((fileInfo), (addr), (length), (offset), (callback), 2)
#define DVDRead(fileInfo, addr, length, offset) \
DVDReadPrio((fileInfo), (addr), (length), (offset), 2)
#define DVDSeekAsync(fileInfo, offset, callback) \
DVDSeekAsyncPrio((fileInfo), (offset), (callback), 2)

View file

@ -8,37 +8,36 @@
extern "C" {
#endif
// extern GXRenderModeObj GXNtsc240Ds;
// extern GXRenderModeObj GXNtsc240DsAa;
// extern GXRenderModeObj GXNtsc240Int;
// extern GXRenderModeObj GXNtsc240IntAa;
extern GXRenderModeObj GXNtsc240Ds;
extern GXRenderModeObj GXNtsc240DsAa;
extern GXRenderModeObj GXNtsc240Int;
extern GXRenderModeObj GXNtsc240IntAa;
extern GXRenderModeObj GXNtsc480IntDf;
// extern GXRenderModeObj GXNtsc480Int;
// extern GXRenderModeObj GXNtsc480IntAa;
// extern GXRenderModeObj GXNtsc480Prog;
// extern GXRenderModeObj GXNtsc480ProgSoft;
// extern GXRenderModeObj GXNtsc480ProgAa;
// extern GXRenderModeObj GXMpal240Ds;
// extern GXRenderModeObj GXMpal240DsAa;
// extern GXRenderModeObj GXMpal240Int;
// extern GXRenderModeObj GXMpal240IntAa;
extern GXRenderModeObj GXNtsc480Int;
extern GXRenderModeObj GXNtsc480IntAa;
extern GXRenderModeObj GXNtsc480Prog;
extern GXRenderModeObj GXNtsc480ProgAa;
extern GXRenderModeObj GXMpal240Ds;
extern GXRenderModeObj GXMpal240DsAa;
extern GXRenderModeObj GXMpal240Int;
extern GXRenderModeObj GXMpal240IntAa;
extern GXRenderModeObj GXMpal480IntDf;
// extern GXRenderModeObj GXMpal480Int;
// extern GXRenderModeObj GXMpal480IntAa;
// extern GXRenderModeObj GXPal264Ds;
// extern GXRenderModeObj GXPal264DsAa;
// extern GXRenderModeObj GXPal264Int;
// extern GXRenderModeObj GXPal264IntAa;
extern GXRenderModeObj GXMpal480Int;
extern GXRenderModeObj GXMpal480IntAa;
extern GXRenderModeObj GXPal264Ds;
extern GXRenderModeObj GXPal264DsAa;
extern GXRenderModeObj GXPal264Int;
extern GXRenderModeObj GXPal264IntAa;
extern GXRenderModeObj GXPal528IntDf;
// extern GXRenderModeObj GXPal528Int;
// extern GXRenderModeObj GXPal524IntAa;
// extern GXRenderModeObj GXEurgb60Hz240Ds;
// extern GXRenderModeObj GXEurgb60Hz240DsAa;
// extern GXRenderModeObj GXEurgb60Hz240Int;
// extern GXRenderModeObj GXEurgb60Hz240IntAa;
extern GXRenderModeObj GXPal528Int;
extern GXRenderModeObj GXPal524IntAa;
extern GXRenderModeObj GXEurgb60Hz240Ds;
extern GXRenderModeObj GXEurgb60Hz240DsAa;
extern GXRenderModeObj GXEurgb60Hz240Int;
extern GXRenderModeObj GXEurgb60Hz240IntAa;
extern GXRenderModeObj GXEurgb60Hz480IntDf;
// extern GXRenderModeObj GXEurgb60Hz480Int;
// extern GXRenderModeObj GXEurgb60Hz480IntAa;
extern GXRenderModeObj GXEurgb60Hz480Int;
extern GXRenderModeObj GXEurgb60Hz480IntAa;
#define GX_MAX_Z24 0x00FFFFFF

View file

@ -86,6 +86,11 @@ static inline void GXPosition2f32(const f32 x, const f32 y) {
GXWGFifo.f32 = y;
}
static inline void GXPosition2s16(const s16 x, const s16 y) {
GXWGFifo.s16 = x;
GXWGFifo.s16 = y;
}
static inline void GXPosition3s16(const s16 x, const s16 y, const s16 z) {
GXWGFifo.s16 = x;
GXWGFifo.s16 = y;
@ -108,6 +113,12 @@ static inline void GXColor1u32(const u32 v) {
GXWGFifo.u32 = v;
}
static inline void GXColor3u8(const u8 r, const u8 g, const u8 b) {
GXWGFifo.u8 = r;
GXWGFifo.u8 = g;
GXWGFifo.u8 = b;
}
static inline void GXColor4u8(const u8 r, const u8 g, const u8 b, const u8 a) {
GXWGFifo.u8 = r;
GXWGFifo.u8 = g;
@ -125,11 +136,14 @@ static inline void GXTexCoord2f32(const f32 u, const f32 v) {
GXWGFifo.f32 = v;
}
static inline void GXPosition1x8(u8 index) {
GXWGFifo.u8 = index;
}
static inline void GXColor1x8(u8 index) {
GXWGFifo.u8 = index;
}
static inline void GXEnd(void) {}
#endif

View file

@ -58,6 +58,7 @@ u32 OSUncachedToCached(void* ucaddr);
#define OSDiffTick(tick1, tick0) ((s32)(tick1) - (s32)(tick0))
#define OSRoundUp32B(v) (((u32)(v + 31) & ~31))
#define OSRoundDown32B(x) (((u32)(x)) & ~31)
void* OSGetArenaHi(void);
void* OSGetArenaLo(void);
@ -218,6 +219,9 @@ void OSReport(const char* msg, ...);
void OSPanic(const char* file, int line, const char* msg, ...);
void OSFatal(GXColor fg, GXColor bg, const char* msg);
u32 OSGetPhysicalMemSize(void);
u32 OSGetConsoleSimulatedMemSize(void);
#ifdef __cplusplus
}
#endif

View file

@ -18,6 +18,7 @@ void* OSAllocFixed(void** rstart, void** rend);
void OSFreeToHeap(OSHeapHandle heap, void* ptr);
long OSCheckHeap(OSHeapHandle heap);
void OSDumpHeap(OSHeapHandle heap);
void *OSAllocFixed(void **rstart, void **rend);
u32 OSReferentSize(void* ptr);
void OSVisitAllocated(OSAllocVisitor visitor);
extern volatile OSHeapHandle __OSCurrHeap;

View file

@ -3,14 +3,14 @@
#include "types.h"
#include "common_structs.h"
#include "common_enums.h"
#include "dolphin/gx/GXStruct.h"
void Hu3DBGColorSet(u8, u8, u8);
void Hu3DCameraCreate(s16);
void Hu3DCameraPerspectiveSet(s16, f32, f32, f32, f32);
void Hu3DCameraViewportSet(s16, f32, f32, f32, f32, f32, f32);
void omOvlHisChg(s32, s32, s32, s32);
UnkOvl* omOvlHisGet(s32);
void* omInitObjMan(s32, s32);
void fn_80044920(s16);
void fn_80045F74(s16, s32);
s32 fn_800578E4(void);
@ -18,18 +18,19 @@ void fn_80032A58(int arg0);
void fn_80035A0C(void);
void HuDecodeData(void *src, void *dst, u32 size, int decode_type);
void HuMemInitAll(void);
void *HuMemInit(void *ptr, s32 size);
void HuMemDCFlushAll();
void HuMemDCFlush(int heap);
void *HuMemDirectMalloc(int heap, s32 size);
void *HuMemDirectMallocNum(int heap, s32 size, u32 num);
void HuMemDCFlush(HeapID heap);
void *HuMemDirectMalloc(HeapID heap, s32 size);
void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num);
void HuMemDirectFree(void *ptr);
void HuMemDirectFreeNum(int heap, u32 num);
s32 HuMemUsedMallocSizeGet(int heap);
s32 HuMemUsedMallocBlockGet(int heap);
u32 HuMemHeapSizeGet(int heap);
void *HuMemHeapPtrGet(int heap);
void HuMemDirectFreeNum(HeapID heap, u32 num);
s32 HuMemUsedMallocSizeGet(HeapID heap);
s32 HuMemUsedMallocBlockGet(HeapID heap);
u32 HuMemHeapSizeGet(HeapID heap);
void *HuMemHeapPtrGet(HeapID heap);
void *HuMemHeapInit(void *ptr, s32 size);
void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr);
@ -42,6 +43,7 @@ s32 HuMemMemoryAllocSizeGet(s32 size);
void HuMemHeapDump(void *heap_ptr, s16 status);
void HuPrcInit(void);
void HuPrcEnd(void);
Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size);
void HuPrcChildLink(Process *parent, Process *child);
void HuPrcChildUnlink(Process *process);
@ -63,10 +65,110 @@ void HuPrcResetStat(Process *process, u16 value);
void HuPrcAllPause(int flag);
void HuPrcAllUPause(int flag);
void omOvlGotoEx(int id, s16 end_mode, int stat, int event);
void omOvlReturnEx(int level, s16 end_mode);
void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl);
void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat);
void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat);
void omOvlReturnEx(s16 level, s16 arg2);
void omOvlKill(s16 arg);
void omOvlHisChg(s32 level, OverlayID overlay, int event, int stat);
omOvlHisData *omOvlHisGet(s32 level);
Process *omInitObjMan(s16 max_objs, int prio);
void omDestroyObjMan(void);
omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, s16 group, void (*func)(omObjData *));
void omAddMember(Process *objman_process, u16 group, omObjData *object);
void omDelObjEx(Process *objman_process, omObjData *object);
void omDelMember(Process *objman_process, omObjData *object);
void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs);
omObjData **omGetGroupMemberListEx(Process *objman_process, s16 group);
void omSetStatBit(omObjData *obj, u16 stat);
void omResetStatBit(omObjData *obj, u16 stat);
void omSetTra(omObjData *obj, float x, float y, float z);
void omSetRot(omObjData *obj, float x, float y, float z);
void omSetSca(omObjData *obj, float x, float y, float z);
void omMain(void);
void omAllPause(BOOL pause);
char omPauseChk(void);
OverlayID omCurrentOvlGet(void);
void omDLLDBGOut(void);
void omDLLInit(FileListEntry *ovl_list);
int omDLLStart(s16 ovl, s16 dll);
void omDLLNumEnd(s16 ovl, s16 arg2);
void omSysPauseEnable(BOOL flag);
void WipeCreate(char dir, char type, short duration);
u16 print8(s16 x, s16 y, float scale, char *str, ...);
void pfInit(void);
void pfClsScr(void);
s16 print8(s16 x, s16 y, float scale, char *str, ...);
s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color);
void pfDrawFonts(void);
void *HuDvdDataRead(char *path);
void **HuDvdDataReadMulti(char **paths);
void *HuDvdDataReadDirect(char *path, HeapID heap);
void *HuDvdDataFastRead(s32 entrynum);
void *HuDvdDataFastReadNum(s32 entrynum, s32 num);
void *HuDvdDataFastReadAsync(s32 entrynum, DataReadStat *stat);
void HuDvdDataClose(void *ptr);
void HuDvdErrorWatch();
void HuDataInit(void);
int HuDataReadChk(s32 data_num);
DataReadStat *HuDataGetStatus(void *dir_ptr);
void *HuDataGetDirPtr(s32 data_num);
DataReadStat *HuDataDirRead(s32 data_num);
DataReadStat *HuDataDirReadNum(s32 data_num, s32 num);
DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num);
void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo);
s32 HuDataDirReadAsync(s32 data_num);
s32 HuDataDirReadNumAsync(s32 data_num, s32 num);
BOOL HuDataGetAsyncStat(s32 status);
void *HuDataRead(s32 data_num);
void *HuDataReadNum(s32 data_num, s32 num);
void *HuDataSelHeapRead(s32 data_num, HeapID heap);
void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap);
void **HuDataReadMulti(s32 *data_ids);
s32 HuDataGetSize(s32 data_num);
void HuDataClose(void *ptr);
void HuDataCloseMulti(void **ptrs);
void HuDataDirClose(s32 data_id);
void HuDataDirCloseNum(s32 num);
void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap);
void *HuARDirCheck(s32 dir);
void HuAR_ARAMtoMRAM(void *dst);
void HuAR_ARAMtoMRAMNum(void *dst, s32 num);
BOOL HuARDMACheck();
void Hu3DModelPosSet(s16 index, float x, float y, float z);
void Hu3DModelRotSet(s16 index, float x, float y, float z);
void Hu3DModelScaleSet(s16 index, float x, float y, float z);
void espInit(void);
void HuSprClose(void);
void HuWinAllKill(void);
void HuPadRumbleAllStop(void);
void HuAudFXListnerKill(void);
void HuAudDllSndGrpSet(u16 ovl);
void fn_800338EC(s16 ovl);
void fn_80035A0C(void);
void fn_8003F3AC(void);
void fn_8004D6F4(s16 arg);
s32 _CheckFlag(u32 flag);
void BoardMessCreate(s16, s32, s32);
void BoardMessKill(void);
void BoardMessWait(void);
#endif

99
include/ovl_table.h Normal file
View file

@ -0,0 +1,99 @@
OVL_DEFINE(OVL__MINI, "dll/_minigameDLL.rel")
OVL_DEFINE(OVL_BOOT, "dll/bootdll.rel")
OVL_DEFINE(OVL_E3SETUP, "dll/e3setupDLL.rel")
OVL_DEFINE(OVL_INST, "dll/instdll.rel")
OVL_DEFINE(OVL_M300, "dll/m300dll.rel")
OVL_DEFINE(OVL_M302, "dll/m302dll.rel")
OVL_DEFINE(OVL_M303, "dll/m303dll.rel")
OVL_DEFINE(OVL_M330, "dll/m330dll.rel")
OVL_DEFINE(OVL_M333, "dll/m333dll.rel")
OVL_DEFINE(OVL_M401, "dll/m401dll.rel")
OVL_DEFINE(OVL_M402, "dll/m402dll.rel")
OVL_DEFINE(OVL_M403, "dll/m403dll.rel")
OVL_DEFINE(OVL_M404, "dll/m404dll.rel")
OVL_DEFINE(OVL_M405, "dll/m405dll.rel")
OVL_DEFINE(OVL_M406, "dll/m406dll.rel")
OVL_DEFINE(OVL_M407, "dll/m407dll.rel")
OVL_DEFINE(OVL_M408, "dll/m408dll.rel")
OVL_DEFINE(OVL_M409, "dll/m409dll.rel")
OVL_DEFINE(OVL_M410, "dll/m410dll.rel")
OVL_DEFINE(OVL_M411, "dll/m411dll.rel")
OVL_DEFINE(OVL_M412, "dll/m412dll.rel")
OVL_DEFINE(OVL_M413, "dll/m413dll.rel")
OVL_DEFINE(OVL_M414, "dll/m414dll.rel")
OVL_DEFINE(OVL_M415, "dll/m415dll.rel")
OVL_DEFINE(OVL_M416, "dll/m416dll.rel")
OVL_DEFINE(OVL_M417, "dll/m417dll.rel")
OVL_DEFINE(OVL_M418, "dll/m418dll.rel")
OVL_DEFINE(OVL_M419, "dll/m419dll.rel")
OVL_DEFINE(OVL_M420, "dll/m420dll.rel")
OVL_DEFINE(OVL_M421, "dll/m421dll.rel")
OVL_DEFINE(OVL_M422, "dll/m422dll.rel")
OVL_DEFINE(OVL_M423, "dll/m423dll.rel")
OVL_DEFINE(OVL_M424, "dll/m424dll.rel")
OVL_DEFINE(OVL_M425, "dll/m425dll.rel")
OVL_DEFINE(OVL_M426, "dll/m426dll.rel")
OVL_DEFINE(OVL_M427, "dll/m427dll.rel")
OVL_DEFINE(OVL_M428, "dll/m428dll.rel")
OVL_DEFINE(OVL_M429, "dll/m429dll.rel")
OVL_DEFINE(OVL_M430, "dll/m430dll.rel")
OVL_DEFINE(OVL_M431, "dll/m431dll.rel")
OVL_DEFINE(OVL_M432, "dll/m432dll.rel")
OVL_DEFINE(OVL_M433, "dll/m433dll.rel")
OVL_DEFINE(OVL_M434, "dll/m434dll.rel")
OVL_DEFINE(OVL_M435, "dll/m435dll.rel")
OVL_DEFINE(OVL_M436, "dll/m436dll.rel")
OVL_DEFINE(OVL_M437, "dll/m437dll.rel")
OVL_DEFINE(OVL_M438, "dll/m438dll.rel")
OVL_DEFINE(OVL_M439, "dll/m439dll.rel")
OVL_DEFINE(OVL_M440, "dll/m440dll.rel")
OVL_DEFINE(OVL_M441, "dll/m441dll.rel")
OVL_DEFINE(OVL_M442, "dll/m442dll.rel")
OVL_DEFINE(OVL_M443, "dll/m443dll.rel")
OVL_DEFINE(OVL_M444, "dll/m444dll.rel")
OVL_DEFINE(OVL_M445, "dll/m445dll.rel")
OVL_DEFINE(OVL_M446, "dll/m446dll.rel")
OVL_DEFINE(OVL_M447, "dll/m447dll.rel")
OVL_DEFINE(OVL_M448, "dll/m448dll.rel")
OVL_DEFINE(OVL_M449, "dll/m449dll.rel")
OVL_DEFINE(OVL_M450, "dll/m450dll.rel")
OVL_DEFINE(OVL_M451, "dll/m451dll.rel")
OVL_DEFINE(OVL_M453, "dll/m453dll.rel")
OVL_DEFINE(OVL_M455, "dll/m455dll.rel")
OVL_DEFINE(OVL_M456, "dll/m456dll.rel")
OVL_DEFINE(OVL_M457, "dll/m457dll.rel")
OVL_DEFINE(OVL_M458, "dll/m458dll.rel")
OVL_DEFINE(OVL_M459, "dll/m459dll.rel")
OVL_DEFINE(OVL_M460, "dll/m460dll.rel")
OVL_DEFINE(OVL_M461, "dll/m461dll.rel")
OVL_DEFINE(OVL_M462, "dll/m462dll.rel")
OVL_DEFINE(OVL_M463, "dll/m463dll.rel")
OVL_DEFINE(OVL_MENT, "dll/mentdll.rel")
OVL_DEFINE(OVL_MESS, "dll/messdll.rel")
OVL_DEFINE(OVL_MGMODE, "dll/mgmodedll.rel")
OVL_DEFINE(OVL_MODELTEST, "dll/modeltestdll.rel")
OVL_DEFINE(OVL_MODESEL, "dll/modeseldll.rel")
OVL_DEFINE(OVL_MPEX, "dll/mpexdll.rel")
OVL_DEFINE(OVL_MSETUP, "dll/msetupdll.rel")
OVL_DEFINE(OVL_MSTORY2, "dll/mstory2dll.rel")
OVL_DEFINE(OVL_MSTORY3, "dll/mstory3dll.rel")
OVL_DEFINE(OVL_MSTORY4, "dll/mstory4dll.rel")
OVL_DEFINE(OVL_MSTORY, "dll/mstorydll.rel")
OVL_DEFINE(OVL_NIS, "dll/nisdll.rel")
OVL_DEFINE(OVL_OPTION, "dll/option.rel")
OVL_DEFINE(OVL_PRESENT, "dll/present.rel")
OVL_DEFINE(OVL_RESULT, "dll/resultdll.rel")
OVL_DEFINE(OVL_SAF, "dll/safdll.rel")
OVL_DEFINE(OVL_SELMENU, "dll/selmenuDLL.rel")
OVL_DEFINE(OVL_STAFF, "dll/staffdll.rel")
OVL_DEFINE(OVL_SUBCHRSEL, "dll/subchrseldll.rel")
OVL_DEFINE(OVL_W01, "dll/w01dll.rel")
OVL_DEFINE(OVL_W02, "dll/w02dll.rel")
OVL_DEFINE(OVL_W03, "dll/w03dll.rel")
OVL_DEFINE(OVL_W04, "dll/w04dll.rel")
OVL_DEFINE(OVL_W05, "dll/w05dll.rel")
OVL_DEFINE(OVL_W06, "dll/w06dll.rel")
OVL_DEFINE(OVL_W10, "dll/w10dll.rel")
OVL_DEFINE(OVL_W20, "dll/w20dll.rel")
OVL_DEFINE(OVL_W21, "dll/w21dll.rel")
OVL_DEFINE(OVL_ZTAR, "dll/ztardll.rel")

19
include/stdarg.h Normal file
View file

@ -0,0 +1,19 @@
#ifndef STDARG_H
#define STDARG_H
typedef struct {
char gpr;
char fpr;
char reserved[2];
char* input_arg_area;
char* reg_save_area;
} __va_list[1];
typedef __va_list va_list;
void* __va_arg(va_list v_list, unsigned char type);
#define va_start(ap, fmt) ((void) fmt, __builtin_va_info(&ap))
#define va_arg(ap, t) (*((t*) __va_arg(ap, _var_arg_typeof(t))))
#define va_end(ap) (void) 0
#endif

12
include/stdio.h Normal file
View file

@ -0,0 +1,12 @@
#ifndef _STDIO_H_
#define _STDIO_H_
#include "stdarg.h"
int puts(const char* s);
int printf(const char*, ...);
int sprintf(char* s, const char* format, ...);
int vprintf(const char* format, va_list arg);
int vsprintf(char* s, const char* format, va_list arg);
#endif

View file

@ -4,11 +4,13 @@
#include "types.h"
#include "common_structs.h"
#include "dolphin/os.h"
#include "dolphin/gx/GXStruct.h"
extern u16 HuPadBtnDown[4];
extern u8 HuPadDStk[4];
extern OSHeapHandle currentHeapHandle;
extern GXRenderModeObj *RenderMode;
extern BOOL saftyFrameF;
extern u16 strlinecnt;
@ -20,4 +22,26 @@ extern WipeState wipeData;
extern PlayerConfig gPlayerConfig[4];
extern FileListEntry _ovltbl[];
extern u32 DirDataSize;
extern u32 totalPolyCnted;
extern char fadeStat;
extern omObjData *omDBGSysKeyObj;
extern Process *omwatchproc;
extern OverlayID omnextovl;
extern OverlayID omcurovl;
extern int omcurdll;
extern int omovlhisidx;
extern int omovlevtno;
extern int omnextovlevtno;
extern int omovlstat;
extern char omUPauseFlag;
extern s16 omSysExitReq;
extern s16 omdispinfo;
extern char omSysPauseEnableFlag;
extern OverlayID omprevovl;
#endif

View file

@ -0,0 +1,15 @@
#include "common.h"
#include "logoNintendoData.inc"
void *logoReadNintendo(void)
{
u32 *src = (u32 *)logoNintendoData;
u32 size = *src++;
void *dst = HuMemDirectMalloc(HEAP_DATA, size);
int decode_type = *src++;
if(dst) {
HuDecodeData(src, dst, size, decode_type);
}
return dst;
}

12
src/REL/safDll/safDll.c Normal file
View file

@ -0,0 +1,12 @@
#include "common.h"
#include "REL/executor.h"
void fn_1_0(void) {
}
//fn_1_4
// https://decomp.me/scratch/Ii0sV
// fn_1_288
// https://decomp.me/scratch/VQ3CT

View file

@ -97,7 +97,7 @@ static void SubchrMain()
WipeCreate(2, 0, -1);
HuPrcSleep(wipeData.duration+1.0f);
fn_80035A0C();
omOvlGotoEx(41, 1, 0, 0);
omOvlGotoEx(OVL_M433, 1, 0, 0);
do {
HuPrcVSleep();
} while(1);

746
src/REL/w10Dll/w10Dll.c Normal file
View file

@ -0,0 +1,746 @@
#include "common.h"
#include "REL/executor.h"
s16 HuWinCreate(float x, float y, s16 w, s16 h, s16 frame);
typedef struct unkw10Dll {
char unk0[0x0C];
Vec3f unk0C;
Vec3f unk18;
s32 unk24;
} unkw10Dll; //sizeof 0x28
typedef struct w10DllUnk01 {
u8 unk0;
f32 unk4;
f32 unk8;
f32 unkC;
f32 unk10;
} w10DllUnk01; //sizeof ?
typedef struct w10DllUnk02 {
char unk00[0x5C];
w10DllUnk01* unk5C;
} w10DllUnk02; //sizeof ?
//this belongs to m456Dll
w10DllUnk02** fn_8002FAC0(Process*, s32);
void fn_8003FD10(s16, f32, f32);
extern s16 lbl_1_bss_20;
extern f32 lbl_1_rodata_5C;
extern f32 lbl_1_rodata_60;
s16 fn_8003F958(s32, s32, s32);
void fn_8003FBEC(s16);
void fn_8008853C(s32);
extern s32 lbl_801A52E8;
void fn_800B42B4(s32);
void fn_80082AAC(s32);
void fn_800B4264(s32, s32, s32);
void fn_1_1FB0(void);
void fn_1_1E3C(s32, s32, s32);
void fn_8007500C(s32);
void fn_1_BA0(s32);
void fn_8006F0D4(s32, f32);
f32 fn_8006F128(s32);
f64 fmod(f32, f64);
void fn_1_C20(void);
void fn_8006F61C(s16, s32);
void fn_800B42BC(s16);
void fn_80023828(s32, s32);
s32 fn_8006DBD4(s16);
void fn_8005B150(void*, void*);
void fn_1_6D8(void);
void fn_1_E0(void);
void fn_8006F2E8(s32, Vec3f*);
void HuWinMesSet(s16, s32);
void fn_1_1D68(void);
void fn_1_1DEC(void);
void fn_1_AEC(void);
void fn_80042848(s16);
void fn_80045BF4(s16, s32);
void fn_80045D7C(s16, s32, s32, s32, s32);
void fn_80045E84(s16, s32);
void fn_80046F04(s32, f32*, ...);
void fn_8005D10C(void*, void*);
s16 fn_8006D9A4(s32, void*, s32);
void fn_8006DB90(s16);
void fn_8006DDE8(s16, f32);
void fn_8006E2B8(s16, s32, s32);
void fn_8006E878(s16, f32);
void fn_8006F158(s16, void*);
void fn_8006F1A8(s16, f32, f32, f32);
s32 fn_8006F220(s16 arg0, Vec3f* arg1);
void fn_8006F50C(s16, s32);
void fn_80073FF4(void*);
void fn_80073FFC(void*);
void fn_80074004(void*);
s32 fn_800745F0(s32, s32);
void fn_800772EC(s32);
void fn_80077A3C(void);
void fn_80077AAC(s16);
void fn_8007A83C(s16);
void fn_80083EDC(s16);
void fn_800A4F6C(s16);
void fn_800B3FD8(void*);
void fn_800B4274(s32, s32);
void fn_1_1AAC(void);
void fn_1_8C0(void);
void fn_1_904(void);
void fn_1_908(void);
s32 fn_1_90C(void);
void fn_1_91C(void);
void Hu3D2Dto3D(Vec3f*, s32, Vec3f*);
void fn_8005D5C0(Vec3f*);
void fn_8006F338(s16, f32, f32, f32);
s32 fn_8005B6A8(void);
void fn_8006EFBC(s16, Mtx);
void fn_8006F270(s16, f32, f32, f32);
void fn_8003FB08(s16);
extern Vec3f lbl_1_data_80[];
extern f32 lbl_1_rodata_38;
extern f32 lbl_1_rodata_3C;
extern f32 lbl_1_rodata_40;
extern Process* lbl_1_bss_18;
extern s16 lbl_1_bss_1C;
extern s16 lbl_1_bss_1E;
extern s32 lbl_1_data_78; //no idea on the type of this
extern f64 lbl_1_rodata_28;
extern f32 lbl_1_rodata_30;
extern f32 lbl_1_rodata_34;
extern BoardStateSubStruct* lbl_1_bss_0;
extern s16 lbl_1_bss_10[12]; //could be incorrect size
extern void* lbl_1_bss_8; //unknown type
extern s16 lbl_1_bss_C;
extern s16 lbl_1_bss_E;
extern unkw10Dll lbl_1_data_0[1];
extern s16 lbl_1_bss_22[11];
extern s32 lbl_1_data_2A8[11];
extern s16 lbl_1_data_28;
extern s16 lbl_1_data_2A;
extern s16 lbl_1_data_2C;
extern s16 lbl_1_data_2E;
extern s16 lbl_1_data_30;
extern s16 lbl_1_data_32;
extern s32 lbl_1_data_54; //unknown type
extern s32 lbl_1_data_5C; //unknown type
extern s32 lbl_1_data_64; //unknown type
extern s32 lbl_1_data_6C; //unknown type
extern f32 lbl_1_rodata_10;
extern f32 lbl_1_rodata_14;
extern f32 lbl_1_rodata_18;
extern f32 lbl_1_rodata_1C;
extern BoardState lbl_8018FCF8;
/*
void fn_1_0(void) {
fn_8005B150(&fn_1_E0, &fn_1_6D8);
}
*/
// function is probably global. only inlined in rels?
/*
inline s32 get_current_board(void) {
return lbl_8018FCF8.unk08 & 0x1F;
}
*/
/*
void fn_1_E0(void) {
f32 sp10;
f32 spC;
s32 sp8;
s32 i;
unkw10Dll* temp_r30;
s32 temp;
s32 temp2;
temp2 = get_current_board();
lbl_1_bss_0 = &lbl_8018FCF8.unk10;
lbl_1_bss_0->unk0 = 0;
lbl_1_bss_0->unk4 = 0;
lbl_1_bss_0->unk6 = 0;
fn_800B3FD8(&fn_1_1AAC);
fn_1_AEC();
fn_1_1D68();
lbl_1_bss_C = 0;
fn_800772EC(0x7B0000);
temp = fn_800745F0(0, 1);
fn_800B4274(temp, 1);
lbl_1_data_28 = fn_8006D9A4(0x7B0001, NULL, 0);
fn_8006DDE8(lbl_1_data_28, lbl_1_rodata_10);
fn_8006F1A8(lbl_1_data_28, lbl_1_rodata_14, lbl_1_rodata_14, lbl_1_rodata_14);
fn_8006E2B8(lbl_1_data_28, 0, 0x40000001);
fn_8006E878(lbl_1_data_28, lbl_1_rodata_18);
lbl_1_data_2A = fn_8006D9A4(0x7B0002, NULL, 0);
fn_8006DDE8(lbl_1_data_2A, lbl_1_rodata_10);
fn_8006F1A8(lbl_1_data_2A, lbl_1_rodata_14, lbl_1_rodata_14, lbl_1_rodata_14);
fn_8006E2B8(lbl_1_data_2A, 0, 0x40000001);
lbl_1_data_2C = fn_8006D9A4(0x7B0011, &lbl_1_data_54, 0);
fn_8006F1A8(lbl_1_data_2C, lbl_1_rodata_14, lbl_1_rodata_14, lbl_1_rodata_14);
fn_8006E2B8(lbl_1_data_2C, 1, 0x40000001);
lbl_1_data_2E = fn_8006D9A4(0x20005, &lbl_1_data_5C, 0);
fn_8006E2B8(lbl_1_data_2E, 1, 0x40000001);
lbl_1_data_32 = fn_8006D9A4(0x20012, &lbl_1_data_64, 0);
fn_8006E2B8(lbl_1_data_32, 1, 0x40000001);
lbl_1_data_30 = fn_8006D9A4(0x2000D, &lbl_1_data_6C, 0);
fn_8006E2B8(lbl_1_data_30, 1, 0x40000001);
fn_8005D10C(&fn_1_8C0, &fn_1_904);
for (i = 0; i < 1; i++) {
temp_r30 = &lbl_1_data_0[i];
if (temp_r30->unk24 != -1) {
lbl_1_bss_8 = NULL;
lbl_1_bss_10[i] = fn_8006D9A4(temp_r30->unk24, lbl_1_bss_8, 0);
fn_8006F158(lbl_1_bss_10[i], temp_r30);
fn_8006F220(lbl_1_bss_10[i], &temp_r30->unk0C);
fn_8006F2E8(lbl_1_bss_10[i], &temp_r30->unk18);
fn_8006F50C(lbl_1_bss_10[i], 1);
if (lbl_1_bss_8 != NULL) {
fn_8006E2B8(lbl_1_bss_10[i], 0, 0x40000001);
}
}
}
fn_8006F50C(lbl_1_bss_10[0], 0);
lbl_1_bss_0->unk8 = fn_8006D9A4(0x7000A, NULL, 0);
fn_8006F50C(lbl_1_bss_0->unk8, 0);
fn_80073FF4(&fn_1_90C);
fn_80073FFC(&fn_1_91C);
fn_80074004(&fn_1_908);
fn_80083EDC(lbl_1_data_2C);
fn_800A4F6C(lbl_1_data_32);
fn_80077AAC(lbl_1_data_2E);
fn_8007A83C(lbl_1_data_30);
fn_80046F04(1, &spC, 0x2E003A);
lbl_1_bss_E = HuWinCreate(lbl_1_rodata_1C, lbl_1_rodata_20, spC, sp10, 1);
HuWinMesSet(lbl_1_bss_E, 0x2E003A);
fn_80045E84(lbl_1_bss_E, 0);
fn_80045BF4(lbl_1_bss_E, 1);
fn_80045D7C(lbl_1_bss_E, 7, 0, 0, 0);
}
*/
/*
void fn_1_6D8(void) {
s32 i;
for (i = 0; i < 1; i++) {
if (lbl_1_bss_10[i] != 0) {
fn_8006DB90(lbl_1_bss_10[i]);
lbl_1_bss_10[i] = 0;
}
}
if (lbl_1_data_32 != -1) {
fn_8006DB90(lbl_1_data_32);
lbl_1_data_32 = -1;
}
if (lbl_1_data_2E != -1) {
fn_8006DB90(lbl_1_data_2E);
lbl_1_data_2E = -1;
}
if (lbl_1_data_30 != -1) {
fn_8006DB90(lbl_1_data_30);
lbl_1_data_30 = -1;
}
if (lbl_1_data_2C != -1) {
fn_8006DB90(lbl_1_data_2C);
lbl_1_data_2C = -1;
}
if (lbl_1_data_28 != -1) {
fn_8006DB90(lbl_1_data_28);
lbl_1_data_28 = -1;
}
if (lbl_1_data_2A != -1) {
fn_8006DB90(lbl_1_data_2A);
lbl_1_data_2A = -1;
}
fn_8006DB90(lbl_1_bss_0->unk8);
fn_1_1DEC();
fn_80042848(lbl_1_bss_E);
fn_80077A3C();
}
*/
/*
void fn_1_8C0(void) {
s32 temp = fn_8006DBD4(lbl_1_data_28);
fn_80023828(temp, 1);
}
*/
/*
void fn_1_904(void) {
}
*/
/*
void fn_1_908(void) {
}
*/
/*
s32 fn_1_90C(void) {
return 0;
}
*/
/*
void fn_1_914(void) {
}
*/
/*
void fn_1_918(void) {
}
*/
/*
void fn_1_91C(void) {
}
*/
/*
s32 fn_1_920(s32 arg0, f32 arg8, f32 arg9) {
s32 var_r31;
f32 var_f29;
f32 var_f31;
var_r31 = 0;
var_f31 = fn_8006F128(arg0);
arg8 = fmod(arg8, lbl_1_rodata_28);
if (var_f31 < lbl_1_rodata_14) {
var_f31 += lbl_1_rodata_30;
}
if (arg8 < lbl_1_rodata_14) {
arg8 += lbl_1_rodata_30;
}
if (var_f31 != arg8) {
var_f29 = arg8 - var_f31;
if (var_f29 < lbl_1_rodata_14) {
var_f29 += lbl_1_rodata_30;
}
if (var_f29 < lbl_1_rodata_34) {
if (var_f29 > arg9) {
var_f31 = var_f31 + arg9;
} else {
var_f31 = arg8;
}
} else if ((lbl_1_rodata_30 - var_f29) > arg9) {
var_f31 = var_f31 - arg9;
} else {
var_f31 = arg8;
}
if (var_f31 < lbl_1_rodata_14) {
var_f31 += lbl_1_rodata_30;
}
if (var_f31 >= lbl_1_rodata_30) {
var_f31 -= lbl_1_rodata_30;
}
fn_8006F0D4(arg0, var_f31);
} else {
var_r31 = 1;
}
return var_r31;
}
*/
/*
void fn_1_AEC(void) {
lbl_1_bss_1C = 0;
lbl_1_bss_1E = fn_8006D9A4(0x7B000F, &lbl_1_data_78, 0);
fn_8006E2B8(lbl_1_bss_1E, 1, 0x40000001);
fn_800B42BC(lbl_1_bss_1E);
fn_8006F61C(lbl_1_bss_1E, 6);
lbl_1_bss_18 = HuPrcCreate(fn_1_C20, 0x1FFF, 0x1800, 0);
}
*/
/*
void fn_1_BA0(s32 arg0) {
s32 var_r31;
switch (lbl_1_bss_1C) {
case 0:
var_r31 = 5;
break;
case 1:
var_r31 = 6;
break;
}
BoardMessCreate(var_r31, arg0, -1);
BoardMessWait();
BoardMessKill();
}
*/
/*
void fn_1_C10(void) {
HuPrcEnd();
}
*/
/*
void fn_1_C20(void) {
Mtx sp20;
Vec3f sp14;
Vec3f sp8;
while (1) {
if (fn_8005B6A8() != 0) {
fn_8006DB90(lbl_1_bss_1E);
fn_800B42BC(-1);
HuPrcEnd();
}
Hu3D2Dto3D(&lbl_1_data_80[lbl_1_bss_1C], 1, &sp14);
fn_8006F158(lbl_1_bss_1E, &sp14);
fn_8005D5C0(&sp8);
PSMTXRotRad(sp20, 'y', lbl_1_rodata_38);
fn_8006EFBC(lbl_1_bss_1E, sp20);
fn_8006F270(lbl_1_bss_1E, sp8.x, lbl_1_rodata_3C, lbl_1_rodata_3C);
fn_8006F338(lbl_1_bss_1E, lbl_1_rodata_40, lbl_1_rodata_40, lbl_1_rodata_40);
HuPrcVSleep();
}
}
*/
/*
void fn_1_D2C(void) {
fn_1_BA0(0x2E0001);
}
*/
/*
void fn_1_D54(void) {
fn_1_BA0(0x2E0002);
}
*/
/*
void fn_1_D7C(void) {
fn_1_BA0(0x2E0003);
}
*/
/*
void fn_1_DA4(void) {
fn_1_BA0(0x2E0004);
}
*/
/*
void fn_1_DCC(void) {
fn_1_BA0(0x2E0005);
}
*/
/*
void fn_1_DF4(void) {
fn_1_BA0(0x2E0006);
}
*/
/*
void fn_1_E1C(void) {
fn_1_BA0(0x2E0007);
}
*/
/*
void fn_1_E44(void) {
fn_1_BA0(0x2E0008);
fn_1_BA0(0x2E0009);
fn_8007500C(0);
fn_8006F50C(lbl_1_data_2C, 1);
}
*/
/*
void fn_1_E94(void) {
fn_1_BA0(0x2E000A);
}
*/
/*
void fn_1_EBC(void) {
fn_1_BA0(0x2E000B);
}
*/
/*
void fn_1_EE4(void) {
}
*/
/*
void fn_1_EE8(void) {
fn_1_1E3C(0, 0x122, 0x8C);
fn_1_BA0(0x2E000C);
fn_1_BA0(0x2E000D);
fn_1_1FB0();
}
*/
/*
void fn_1_F30(void) {
fn_1_1E3C(1, 0x122, 0x8C);
fn_1_BA0(0x2E000E);
fn_1_1FB0();
}
*/
/*
void fn_1_F6C(void) {
fn_1_1E3C(2, 0x122, 0x8C);
fn_1_BA0(0x2E000F);
fn_1_1FB0();
fn_800B4264(0, 0x50, 1);
}
*/
/*
void fn_1_FB8(void) {
fn_1_1E3C(3, 0x122, 0x8C);
fn_1_BA0(0x2E0010);
fn_1_1FB0();
fn_1_BA0(0x2E0011);
fn_800B4264(-0x50, 0, 1);
}
*/
/*
void fn_1_1010(void) {
fn_1_1E3C(4, 0x122, 0x8C);
fn_1_BA0(0x2E0012);
fn_1_1FB0();
fn_800B4264(0, 0x50, 1);
}
*/
/*
void fn_1_105C(void) {
fn_1_1E3C(5, 0x122, 0x8C);
fn_1_BA0(0x2E0013);
fn_1_1FB0();
}
*/
/*
void fn_1_1098(void) {
fn_1_BA0(0x2E0014);
}
*/
/*
void fn_1_10C0(void) {
fn_1_BA0(0x2E0015);
fn_800B4264(-0x50, 0, 1);
}
*/
/*
void fn_1_10F8(void) {
fn_1_1E3C(6, 0x122, 0x8C);
fn_1_BA0(0x2E0016);
fn_1_1FB0();
}
*/
/*
void fn_1_1134(void) {
fn_1_1E3C(7, 0x122, 0x8C);
fn_1_BA0(0x2E0017);
fn_1_1FB0();
fn_80082AAC(1);
}
*/
/*
void fn_1_1178(void) {
fn_1_BA0(0x2E0018);
}
*/
/*
void fn_1_11A0(void) {
s32 temp;
fn_1_BA0(0x2E0019);
temp = fn_800745F0(0, 1);
fn_800B4274(temp, 0);
}
*/
/*
void fn_1_11EC(void) {
s32 temp;
fn_1_BA0(0x2E001A);
temp = fn_800745F0(0, 1);
fn_800B4274(temp, 0);
fn_800B42B4(0);
}
*/
/*
void fn_1_1240(void) {
fn_1_BA0(0x2E001B);
fn_800B4264(0x50, 0, 1);
}
*/
/*
void fn_1_1278(void) {
fn_1_BA0(0x2E001C);
}
*/
/*
void fn_1_12A0(void) {
fn_1_BA0(0x2E001D);
fn_80062B74(2, 1);
fn_800B42B4(1);
}
*/
/*
void fn_1_12DC(void) {
fn_1_BA0(0x2E001E);
}
*/
/*
void fn_1_1304(void) {
fn_1_BA0(0x2E001F);
}
*/
/*
void fn_1_132C(void) {
fn_1_BA0(0x2E0020);
}
*/
/*
void fn_1_1354(void) {
fn_1_BA0(0x2E0021);
}
*/
/*
void fn_1_137C(void) {
fn_1_BA0(0x2E0022);
}
*/
// fn_1_13A4
/*
void fn_1_176C(void) {
fn_1_C10(1);
fn_1_BA0(0x2E0024);
}
*/
/*
void fn_1_179C(void) {
fn_1_BA0(0x2E0025);
gPlayerData[1].flags.unk0 = 2;
gPlayerData[3].flags.unk0 = 2;
}
*/
/*
void fn_1_17F4(void) {
fn_1_BA0(0x2E0026);
gPlayerData[0].flags.unk0 = 2;
}
*/
/*
void fn_1_1834(void) {
fn_1_BA0(0x2E0027);
gPlayerData[0].flags.unk0 = 1;
gPlayerData[1].flags.unk0 = 1;
gPlayerData[2].flags.unk0 = 1;
gPlayerData[3].flags.unk0 = 2;
}
*/
/*
void fn_1_18BC(void) {
fn_1_BA0(0x2E0028);
fn_1_BA0(0x2E0029);
lbl_801A52E8 = 0;
fn_8008853C(0);
}
*/
/*
void fn_1_1908(void) {
fn_1_BA0(0x2E002D);
}
*/
/*
void fn_1_1930(void) {
fn_1_BA0(0x2E002F);
}
*/
/*
void fn_1_1958(void) {
fn_1_BA0(0x2E0031);
}
*/
/*
void fn_1_1980(void) {
}
*/
// fn_1_1984
// fn_1_1AAC
/*
void fn_1_1D68(void) {
s32 temp_r4;
s32 temp_r5;
s32 i;
for (i = 0; i < 11; i++) {
lbl_1_bss_22[i] = fn_8003F958(lbl_1_data_2A8[i], 0, 0);
fn_8003FBEC(lbl_1_bss_22[i]);
}
}
*/
/*
void fn_1_1DEC(void) {
s32 i;
for (i = 0; i < 11; i++) {
fn_8003FB08(lbl_1_bss_22[i]);
}
}
*/
// fn_1_1E3C
/*
void fn_1_1FB0(void) {
f32 var_f31;
f32 var_f30;
u32 i;
var_f31 = lbl_1_rodata_60;
var_f30 = lbl_1_rodata_60;
for (i = 0; i < 15; i++) {
var_f31 -= lbl_1_rodata_5C;
var_f30 -= lbl_1_rodata_5C;
fn_8003FD10(lbl_1_bss_20, var_f31, var_f30);
HuPrcVSleep();
}
fn_8003FBEC(lbl_1_bss_20);
}
*/

552
src/game/data.c Normal file
View file

@ -0,0 +1,552 @@
#include "common.h"
#include "dolphin/dvd.h"
#define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset)))
#define DATA_EFF_SIZE(size) (((size)+1) & ~0x1)
static void **HuDataReadMultiSub(s32 *data_ids, BOOL use_num, s32 num);
#define DATA_MAX_READSTAT 128
#define DATADIR_DEFINE(name, path) { path, -1 },
static FileListEntry DataDirStat[DATADIR_COUNT+1] = {
#include "datadir_table.h"
{ NULL, -1 }
};
#undef DATADIR_DEFINE
u32 DirDataSize;
static u32 DataDirMax;
static s32 shortAccessSleep;
static DataReadStat ReadDataStat[DATA_MAX_READSTAT];
void HuDataInit(void)
{
int i = 0;
FileListEntry *dir_stat = DataDirStat;
DataReadStat *read_stat;
while(dir_stat->name) {
if((dir_stat->file_id = DVDConvertPathToEntrynum(dir_stat->name)) == -1) {
OSReport("data.c: Data File Error(%s)\n", dir_stat->name);
OSPanic("data.c", 65, "\n");
}
i++;
dir_stat++;
}
DataDirMax = i;
for(i=0, read_stat = ReadDataStat; i<DATA_MAX_READSTAT; i++, read_stat++) {
read_stat->dir_id = -1;
read_stat->used = FALSE;
read_stat->status = 0;
}
}
static int HuDataReadStatusGet(void)
{
int i;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].dir_id == -1) {
break;
}
}
if(i >= DATA_MAX_READSTAT) {
i = -1;
}
return i;
}
int HuDataReadChk(s32 data_num)
{
int i;
data_num >>= 16;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].dir_id == data_num && ReadDataStat[i].status != 1) {
break;
}
}
if(i >= DATA_MAX_READSTAT) {
i = -1;
}
return i;
}
DataReadStat *HuDataGetStatus(void *dir_ptr)
{
int i;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].dir == dir_ptr) {
break;
}
}
if(i > DATA_MAX_READSTAT) {
return NULL;
}
return &ReadDataStat[i];
}
void *HuDataGetDirPtr(s32 data_num)
{
int status = HuDataReadChk(data_num);
if(status < 0) {
return NULL;
}
return ReadDataStat[status].dir;
}
DataReadStat *HuDataDirRead(s32 data_num)
{
DataReadStat *read_stat;
int status;
s32 dir_id;
dir_id = data_num >> 16;
if(DataDirMax <= dir_id) {
OSReport("data.c: Data Number Error(%d)\n", data_num);
return NULL;
}
if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram;
if(dir_aram = HuARDirCheck(data_num)) {
HuAR_ARAMtoMRAM(dir_aram);
while(HuARDMACheck());
status = HuDataReadChk(data_num);
read_stat = &ReadDataStat[status];
} else {
status = HuDataReadStatusGet();
if(status == -1) {
OSReport("data.c: Data Work Max Error\n");
return NULL;
}
read_stat = &ReadDataStat[status];
read_stat->dir = HuDvdDataFastRead(DataDirStat[dir_id].file_id);
if(read_stat->dir) {
read_stat->dir_id = dir_id;
}
}
} else {
read_stat = &ReadDataStat[status];
}
return read_stat;
}
DataReadStat *HuDataDirReadNum(s32 data_num, s32 num)
{
DataReadStat *read_stat;
int status;
s32 dir_id;
dir_id = data_num >> 16;
if(DataDirMax <= dir_id) {
OSReport("data.c: Data Number Error(%d)\n", data_num);
return NULL;
}
if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram;
if((dir_aram = HuARDirCheck(data_num))) {
OSReport("ARAM data num %x\n", data_num);
HuAR_ARAMtoMRAMNum(dir_aram, num);
while(HuARDMACheck());
status = HuDataReadChk(data_num);
read_stat = &ReadDataStat[status];
read_stat->used = TRUE;
read_stat->num = num;
} else {
OSReport("data num %x\n", data_num);
status = HuDataReadStatusGet();
if(status == -1) {
OSReport("data.c: Data Work Max Error\n");
return NULL;
}
read_stat = &ReadDataStat[status];
read_stat->dir = HuDvdDataFastReadNum(DataDirStat[dir_id].file_id, num);
if(read_stat->dir) {
read_stat->dir_id = dir_id;
read_stat->used = TRUE;
read_stat->num = num;
}
}
} else {
read_stat = &ReadDataStat[status];
}
return read_stat;
}
DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num)
{
DataReadStat *read_stat = HuDataGetStatus(dir_ptr);
int status;
if((status = HuDataReadChk(read_stat->dir_id << 16)) >= 0) {
HuDataDirClose(data_num);
}
if((status = HuDataReadStatusGet()) == -1) {
OSReport("data.c: Data Work Max Error\n");
return NULL;
} else {
read_stat = &ReadDataStat[status];
read_stat->dir = dir_ptr;
read_stat->dir_id = data_num >>16;
return read_stat;
}
}
void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo)
{
DataReadStat *read_stat;
int i;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].status == 1 && ReadDataStat[i].file_info.startAddr == fileInfo->startAddr) {
break;
}
}
if(i >= DATA_MAX_READSTAT) {
OSPanic("data.c", 358, "dvd.c AsyncCallBack Error");
}
read_stat = &ReadDataStat[i];
read_stat->status = 0;
DVDClose(&read_stat->file_info);
}
s32 HuDataDirReadAsync(s32 data_num)
{
DataReadStat *read_stat;
int status;
s32 dir_id;
dir_id = data_num >> 16;
if(DataDirMax <= dir_id) {
OSReport("data.c: Data Number Error(%d)\n", data_num);
return -1;
}
if((status = HuDataReadChk(data_num)) < 0) {
void *dir_aram;
if(dir_aram = HuARDirCheck(data_num)) {
OSReport("ARAM data num %x\n", data_num);
HuAR_ARAMtoMRAM(dir_aram);
status = 0x10000;
} else {
status = HuDataReadStatusGet();
if(status == -1) {
OSReport("data.c: Data Work Max Error\n");
return -1;
}
read_stat = &ReadDataStat[status];
read_stat->status = 1;
read_stat->dir_id = dir_id;
read_stat->dir = HuDvdDataFastReadAsync(DataDirStat[dir_id].file_id, read_stat);
}
} else {
status = -1;
}
return status;
}
s32 HuDataDirReadNumAsync(s32 data_num, s32 num)
{
DataReadStat *read_stat;
int status;
s32 dir_id;
dir_id = data_num >> 16;
if(DataDirMax <= dir_id) {
OSReport("data.c: Data Number Error(%d)\n", data_num);
return -1;
}
if((status = HuDataReadChk(data_num)) < 0) {
if((status = HuDataReadStatusGet()) == -1) {
OSReport("data.c: Data Work Max Error\n");
return -1;
}
ReadDataStat[status].status = TRUE;
ReadDataStat[status].dir_id = dir_id;
read_stat = &ReadDataStat[status];
read_stat->used = TRUE;
read_stat->num = num;
read_stat->dir = HuDvdDataFastReadAsync(DataDirStat[dir_id].file_id, read_stat);
} else {
status = -1;
}
return status;
}
BOOL HuDataGetAsyncStat(s32 status)
{
if(status == 0x10000) {
return HuARDMACheck() == 0;
} else {
return ReadDataStat[status].status == 0;
}
}
static void GetFileInfo(DataReadStat *read_stat, s32 file_num)
{
u32 *temp_ptr;
temp_ptr = (u32 *)PTR_OFFSET(read_stat->dir, (file_num * 4))+1;
read_stat->file = PTR_OFFSET(read_stat->dir, *temp_ptr);
temp_ptr = read_stat->file;
read_stat->raw_len = *temp_ptr++;
read_stat->comp_type = *temp_ptr++;
read_stat->file = temp_ptr;
}
void *HuDataRead(s32 data_num)
{
DataReadStat *read_stat;
int status;
void *buf;
if(!HuDataDirRead(data_num)) {
(void)data_num;
return NULL;
}
if((status = HuDataReadChk(data_num)) == -1) {
return NULL;
}
read_stat = &ReadDataStat[status];
GetFileInfo(read_stat, data_num & 0xFFFF);
buf = HuMemDirectMalloc(0, DATA_EFF_SIZE(read_stat->raw_len));
if(buf) {
HuDecodeData(read_stat->file, buf, read_stat->raw_len, read_stat->comp_type);
}
return buf;
}
void *HuDataReadNum(s32 data_num, s32 num)
{
DataReadStat *read_stat;
int status;
void *buf;
if(!HuDataDirReadNum(data_num, num)) {
return NULL;
}
if((status = HuDataReadChk(data_num)) == -1) {
return NULL;
}
read_stat = &ReadDataStat[status];
GetFileInfo(read_stat, data_num & 0xFFFF);
buf = HuMemDirectMallocNum(0, DATA_EFF_SIZE(read_stat->raw_len), num);
if(buf) {
HuDecodeData(read_stat->file, buf, read_stat->raw_len, read_stat->comp_type);
}
return buf;
}
void *HuDataSelHeapRead(s32 data_num, HeapID heap)
{
DataReadStat *read_stat;
int status;
void *buf;
if(!HuDataDirRead(data_num)) {
return NULL;
}
if((status = HuDataReadChk(data_num)) == -1) {
return NULL;
}
read_stat = &ReadDataStat[status];
GetFileInfo(read_stat, data_num & 0xFFFF);
switch(heap) {
case HEAP_MUSIC:
buf = HuMemDirectMalloc(HEAP_MUSIC, DATA_EFF_SIZE(read_stat->raw_len));
break;
case HEAP_DATA:
buf = HuMemDirectMalloc(HEAP_DATA, DATA_EFF_SIZE(read_stat->raw_len));
break;
case HEAP_DVD:
buf = HuMemDirectMalloc(HEAP_DVD, DATA_EFF_SIZE(read_stat->raw_len));
break;
default:
buf = HuMemDirectMalloc(HEAP_SYSTEM, DATA_EFF_SIZE(read_stat->raw_len));
break;
}
if(buf) {
HuDecodeData(read_stat->file, buf, read_stat->raw_len, read_stat->comp_type);
}
return buf;
}
void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap)
{
DataReadStat *read_stat;
int status;
void *buf;
if(!HuDataDirReadNum(data_num, num)) {
return NULL;
}
if((status = HuDataReadChk(data_num)) == -1) {
return NULL;
}
read_stat = &ReadDataStat[status];
GetFileInfo(read_stat, data_num & 0xFFFF);
switch(heap) {
case HEAP_MUSIC:
buf = HuMemDirectMalloc(HEAP_MUSIC, DATA_EFF_SIZE(read_stat->raw_len));
break;
case HEAP_DATA:
buf = HuMemDirectMallocNum(HEAP_DATA, DATA_EFF_SIZE(read_stat->raw_len), num);
break;
case HEAP_DVD:
buf = HuMemDirectMallocNum(HEAP_DVD, DATA_EFF_SIZE(read_stat->raw_len), num);
break;
default:
buf = HuMemDirectMallocNum(HEAP_SYSTEM, DATA_EFF_SIZE(read_stat->raw_len), num);
break;
}
if(buf) {
HuDecodeData(read_stat->file, buf, read_stat->raw_len, read_stat->comp_type);
}
return buf;
}
void **HuDataReadMulti(s32 *data_ids)
{
return HuDataReadMultiSub(data_ids, FALSE, 0);
}
static void **HuDataReadMultiSub(s32 *data_ids, BOOL use_num, s32 num)
{
s32 *dir_ids;
char **paths;
void **dir_ptrs;
void **out_ptrs;
int i, count, total_files;
u32 dir_id;
for(i=0, count=0; data_ids[i] != -1; i++) {
dir_id = data_ids[i] >> 16;
if(DataDirMax <= dir_id) {
OSReport("data.c: Data Number Error(%d)\n", data_ids[i]);
return NULL;
}
if(HuDataReadChk(data_ids[i]) < 0) {
count++;
}
}
total_files = i;
dir_ids = HuMemDirectMalloc(HEAP_SYSTEM, (count+1)*sizeof(s32));
for(i=0; i<count+1; i++) {
dir_ids[i] = -1;
}
paths = HuMemDirectMalloc(HEAP_SYSTEM, (count+1)*sizeof(char *));
for(i=0, count=0; data_ids[i] != -1; i++) {
dir_id = data_ids[i] >> 16;
if(HuDataReadChk(data_ids[i]) < 0) {
int j;
for(j=0; dir_ids[j] != -1; j++) {
if(dir_ids[j] == dir_id){
break;
}
}
if(dir_ids[j] == -1) {
dir_ids[j] = dir_id;
paths[count++] = DataDirStat[dir_id].name;
}
}
}
dir_ptrs = HuDvdDataReadMulti(paths);
for(i=0; dir_ids[i] != -1; i++) {
s32 status;
if((status = HuDataReadStatusGet()) == -1) {
OSReport("data.c: Data Work Max Error\n");
(void)count; //HACK to match HuDataReadMultiSub
HuMemDirectFree(dir_ids);
HuMemDirectFree(paths);
return NULL;
} else {
ReadDataStat[status].dir = dir_ptrs[i];
ReadDataStat[status].dir_id = dir_ids[i];
}
}
HuMemDirectFree(dir_ids);
HuMemDirectFree(paths);
HuMemDirectFree(dir_ptrs);
if(use_num) {
out_ptrs = HuMemDirectMallocNum(HEAP_SYSTEM, (total_files+1)*sizeof(void *), num);
} else {
out_ptrs = HuMemDirectMalloc(HEAP_SYSTEM, (total_files+1)*sizeof(void *));
}
for(i=0; data_ids[i] != -1; i++) {
if(use_num) {
out_ptrs[i] = HuDataReadNum(data_ids[i], num);
} else {
out_ptrs[i] = HuDataRead(data_ids[i]);
}
}
out_ptrs[i] = NULL;
return out_ptrs;
}
s32 HuDataGetSize(s32 data_num)
{
DataReadStat *read_stat;
int status;
if((status = HuDataReadChk(data_num)) == -1) {
return -1;
}
read_stat = &ReadDataStat[status];
GetFileInfo(read_stat, data_num & 0xFFFF);
return DATA_EFF_SIZE(read_stat->raw_len);
}
void HuDataClose(void *ptr)
{
if(ptr) {
HuMemDirectFree(ptr);
}
}
void HuDataCloseMulti(void **ptrs)
{
int i;
for(i=0; ptrs[i]; i++) {
void *ptr = ptrs[i];
if(ptr) {
HuMemDirectFree(ptr);
}
}
if(ptrs) {
HuMemDirectFree(ptrs);
}
}
void HuDataDirClose(s32 data_id)
{
DataReadStat *read_stat;
int i;
s32 dir_id = data_id >> 16;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].dir_id == dir_id) {
break;
}
}
if(i >= DATA_MAX_READSTAT) {
return;
}
read_stat = &ReadDataStat[i];
if(read_stat->status == 1) {
OSPanic("data.c", 812, "data.c: Async Close Error\n");
}
read_stat->dir_id = -1;
HuDvdDataClose(read_stat->dir);
read_stat->dir = NULL;
read_stat->used = FALSE;
read_stat->status = 0;
}
void HuDataDirCloseNum(s32 num)
{
int i;
for(i=0; i<DATA_MAX_READSTAT; i++) {
if(ReadDataStat[i].used == TRUE && ReadDataStat[i].num == num) {
HuDataDirClose(ReadDataStat[i].dir_id << 16);
}
}
}
//Still to be decompiled
void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap)
{
return NULL;
}

188
src/game/dvd.c Normal file
View file

@ -0,0 +1,188 @@
#include "common.h"
#include "dolphin/dvd.h"
#include "dolphin/os.h"
static DVDDiskID correctDiskID = {
{ 'M', 'P', 'G', 'C' }, //gameName
{ 'H', 'U' }, //company
1, //diskNumber
1, //gameVersion
1, //streaming
0, //streamingBufSize
};
static int CallBackStatus;
static s32 beforeDvdStatus;
static void HuDVDReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo)
{
CallBackStatus = 1;
}
static void *HuDvdDataReadWait(DVDFileInfo *file, int heap, int mode, int num, DVDCallback cb, BOOL skip_wait)
{
u32 len;
void *buf;
if(mode != 0 && mode != 1 && mode != 2) {
OSReport("dvd.c: HuDvdDataReadWait Mode Error");
buf = NULL;
len = 0;
}
len = file->length;
DirDataSize = len;
if(mode == 1) {
buf = HuMemDirectMallocNum(heap, OSRoundUp32B(len), num);
} else {
buf = HuMemDirectMalloc(heap, OSRoundUp32B(len));
}
if(!buf) {
OSReport("dvd.c: Memory Allocation Error (Length %x) (mode %d)\n", len, mode);
OSReport("Rest Memory %x\n", HuMemHeapSizeGet(3)-HuMemUsedMallocSizeGet(3));
OSPanic("dvd.c", 75, "\n");
return NULL;
}
DCInvalidateRange(buf, OSRoundUp32B(len));
OSReport("Rest Memory %x\n", HuMemHeapSizeGet(3)-HuMemUsedMallocSizeGet(3));
CallBackStatus = 0;
DVDReadAsync(file, buf, OSRoundUp32B(len), 0, cb);
if(!skip_wait) {
while(!CallBackStatus) {
HuDvdErrorWatch();
}
HuDvdErrorWatch();
}
return buf;
}
void *HuDvdDataRead(char *path)
{
DVDFileInfo file;
void *data = NULL;
if(!DVDOpen(path, &file)) {
OSPanic("dvd.c", 146, "dvd.c: File Open Error");
} else {
data = HuDvdDataReadWait(&file, HEAP_DVD, 0, 0, HuDVDReadAsyncCallBack, FALSE);
DVDClose(&file);
}
return data;
}
void **HuDvdDataReadMulti(char **paths)
{
DVDFileInfo file;
int i;
u32 count;
void **file_ptrs;
count = 0;
while(paths[count]) {
count++;
}
file_ptrs = HuMemDirectMalloc(0, count*sizeof(void *));
for(i=0; i<count; i++) {
if(!DVDOpen(paths[i], &file)) {
OSPanic("dvd.c", 183, "dvd.c: File Open Error");
return NULL;
} else {
file_ptrs[i] = HuDvdDataReadWait(&file, HEAP_DVD, 0, 0, HuDVDReadAsyncCallBack, FALSE);
DVDClose(&file);
}
}
return file_ptrs;
}
void *HuDvdDataReadDirect(char *path, HeapID heap)
{
DVDFileInfo file;
void *data = NULL;
if(!DVDOpen(path, &file)) {
OSPanic("dvd.c", 202, "dvd.c: File Open Error");
} else {
data = HuDvdDataReadWait(&file, heap, 2, 0, HuDVDReadAsyncCallBack, FALSE);
DVDClose(&file);
}
return data;
}
void *HuDvdDataFastRead(s32 entrynum)
{
DVDFileInfo file;
void *data = NULL;
if(!DVDFastOpen(entrynum, &file)) {
OSPanic("dvd.c", 243, "dvd.c: File Open Error");
} else {
data = HuDvdDataReadWait(&file, HEAP_DVD, 0, 0, HuDVDReadAsyncCallBack, FALSE);
DVDClose(&file);
}
return data;
}
void *HuDvdDataFastReadNum(s32 entrynum, s32 num)
{
DVDFileInfo file;
void *data = NULL;
if(!DVDFastOpen(entrynum, &file)) {
(void)num;
OSPanic("dvd.c", 258, "dvd.c: File Open Error");
} else {
data = HuDvdDataReadWait(&file, HEAP_DVD, 1, num, HuDVDReadAsyncCallBack, FALSE);
DVDClose(&file);
}
return data;
}
void *HuDvdDataFastReadAsync(s32 entrynum, DataReadStat *stat)
{
DVDFileInfo file;
void *data = NULL;
if(!DVDFastOpen(entrynum, &stat->file_info)) {
OSPanic("dvd.c", 274, "dvd.c: File Open Error");
} else {
data = HuDvdDataReadWait(&stat->file_info, HEAP_DVD, 0, 0, HuDataDirReadAsyncCallBack, TRUE);
}
return data;
}
void HuDvdDataClose(void *ptr)
{
if(ptr) {
HuMemDirectFree(ptr);
}
}
void HuDvdErrorWatch()
{
int status = DVDGetDriveStatus();
if(status == beforeDvdStatus) {
return;
}
beforeDvdStatus = status;
switch(status+1) {
case 0:
OSReport("DVD ERROR:Fatal error occurred\n***HALT***");
while(1);
break;
case 5:
OSReport("DVD ERROR:No disk\n");
break;
case 6:
OSReport("DVD ERROR:Cover open\n");
break;
case 7:
OSReport("DVD ERROR:Wrong disk\n");
break;
case 12:
OSReport("DVD ERROR:Please retry\n");
break;
default:
break;
}
}

1
src/game/font.c Normal file
View file

@ -0,0 +1 @@
#include "ank8x8_4b.inc"

274
src/game/init.c Normal file
View file

@ -0,0 +1,274 @@
#include "common.h"
#include "dolphin/os.h"
#include "dolphin/gx.h"
#include "dolphin/dvd.h"
#include "dolphin/vi.h"
#include "dolphin/pad.h"
struct memory_info {
void *start;
void *end;
};
extern void HuAudInit();
extern void HuCardInit();
extern void HuARInit();
extern u32 frand();
extern void HuFaultInitXfbDirectDraw(GXRenderModeObj *mode);
extern void HuFaultSetXfbAddress(int fb, void *addr);
static GXRenderModeObj rmodeobj;
static BOOL FirstFrame = TRUE;
GXRenderModeObj *RenderMode;
OSHeapHandle currentHeapHandle;
static void *DefaultFifo;
static GXFifoObj *DefaultFifoObj;
void *DemoFrameBuffer1;
void *DemoFrameBuffer2;
void *DemoCurrentBuffer;
u32 minimumVcount;
float minimumVcountf;
u32 worstVcount;
static BOOL DemoStatEnable;
static void InitRenderMode(GXRenderModeObj *mode);
static void InitMem();
static void InitGX();
static void InitVI();
static void SwapBuffers();
static void LoadMemInfo();
void HuSysInit(GXRenderModeObj *mode)
{
u32 rnd_temp;
OSInit();
DVDInit();
VIInit();
PADInit();
if(OSGetProgressiveMode() == 1 && VIGetDTVStatus() == 1) {
mode = &GXNtsc480Prog;
}
InitRenderMode(mode);
InitMem();
VIConfigure(RenderMode);
VIConfigurePan(0, 0, 640, 480);
DefaultFifo = OSAlloc(0x100000);
DefaultFifoObj = GXInit(DefaultFifo, 0x100000);
InitGX();
InitVI();
HuFaultInitXfbDirectDraw(RenderMode);
HuFaultSetXfbAddress(0, DemoFrameBuffer1);
HuFaultSetXfbAddress(1, DemoFrameBuffer2);
HuDvdErrDispInit(RenderMode, DemoFrameBuffer1, DemoFrameBuffer2);
rnd_temp = frand();
HuMemInitAll();
HuAudInit();
HuARInit();
minimumVcount = minimumVcountf = 1.0f;
worstVcount = 0;
OSInitFastCast();
HuCardInit();
}
static void InitRenderMode(GXRenderModeObj *mode)
{
if(mode != NULL) {
RenderMode = mode;
return;
}
switch(VIGetTvFormat()) {
case 0:
RenderMode = &GXNtsc480IntDf;
break;
case 1:
RenderMode = &GXPal528IntDf;
break;
case 2:
RenderMode = &GXMpal480IntDf;
break;
default:
OSPanic("init.c", 169, "DEMOInit: invalid TV format\n");
break;
}
GXAdjustForOverscan(RenderMode, &rmodeobj, 0, 16);
RenderMode = &rmodeobj;
}
static void InitGX()
{
GXSetViewport(0, 0, RenderMode->fbWidth, RenderMode->xfbHeight, 0, 1);
GXSetScissor(0, 0, RenderMode->fbWidth, RenderMode->efbHeight);
GXSetDispCopySrc(0, 0, RenderMode->fbWidth, RenderMode->efbHeight);
GXSetDispCopyDst(RenderMode->fbWidth, RenderMode->xfbHeight);
GXSetDispCopyYScale((float)RenderMode->xfbHeight/(float)RenderMode->efbHeight);
GXSetCopyFilter(RenderMode->aa, RenderMode->sample_pattern, GX_TRUE, RenderMode->vfilter);
if(RenderMode->aa) {
GXSetPixelFmt(GX_PF_RGB565_Z16, GX_ZC_LINEAR);
} else {
GXSetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
}
GXCopyDisp(DemoCurrentBuffer, GX_TRUE);
GXSetDispCopyGamma(GX_GM_1_0);
}
static void InitMem()
{
void *arena_lo = OSGetArenaLo();
void *arena_hi = OSGetArenaHi();
u32 fb_size = (u16)(((u16)RenderMode->fbWidth+15) & ~15)*RenderMode->xfbHeight*2;
DemoFrameBuffer1 = (void *)OSRoundUp32B((u32)arena_lo);
DemoFrameBuffer2 = (void *)OSRoundUp32B((u32)DemoFrameBuffer1+fb_size);
DemoCurrentBuffer = DemoFrameBuffer2;
arena_lo = (void *)OSRoundUp32B((u32)DemoFrameBuffer2+fb_size);
OSSetArenaLo(arena_lo);
if(OSGetConsoleType() == OS_CONSOLE_DEVHW1 && OSGetPhysicalMemSize() != 0x400000 && OSGetConsoleSimulatedMemSize() < 0x1800000) {
LoadMemInfo();
} else {
arena_lo = OSGetArenaLo();
arena_hi = OSGetArenaHi();
arena_lo = OSInitAlloc(arena_lo, arena_hi, 1);
OSSetArenaLo(arena_lo);
arena_lo = (void *)OSRoundUp32B((u32)arena_lo);
arena_hi = (void *)OSRoundDown32B((u32)arena_hi);
OSSetCurrentHeap(currentHeapHandle = OSCreateHeap(arena_lo, arena_hi));
arena_lo = arena_hi;
OSSetArenaLo(arena_lo);
}
}
static void InitVI()
{
u32 interlace;
VISetNextFrameBuffer(DemoFrameBuffer1);
DemoCurrentBuffer = DemoFrameBuffer2;
VIFlush();
VIWaitForRetrace();
interlace = RenderMode->viTVmode & 0x1;
if(interlace) {
VIWaitForRetrace();
}
}
void HuSysBeforeRender()
{
if(RenderMode->field_rendering) {
GXSetViewportJitter(0, 0, RenderMode->fbWidth, RenderMode->xfbHeight, 0, 1, VIGetNextField());
} else {
GXSetViewport(0, 0, RenderMode->fbWidth, RenderMode->xfbHeight, 0, 1);
}
GXInvalidateVtxCache();
GXInvalidateTexAll();
}
void HuSysDoneRender(s32 retrace_count)
{
int retrace_dist;
if(DemoStatEnable) {
GXDrawDone();
DEMOUpdateStats(1);
DEMOPrintStats();
GXDrawDone();
DEMOUpdateStats(0);
}
GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
GXSetColorUpdate(GX_TRUE);
GXDrawDone();
GXCopyDisp(DemoCurrentBuffer, GX_TRUE);
if(minimumVcount != 0) {
retrace_dist = VIGetRetraceCount()-retrace_count;
if(worstVcount < retrace_dist) {
worstVcount = retrace_dist;
}
while(VIGetRetraceCount()-retrace_count < minimumVcount-1) {
VIWaitForRetrace();
}
}
SwapBuffers();
}
static void SwapBuffers()
{
VISetNextFrameBuffer(DemoCurrentBuffer);
if(FirstFrame) {
VISetBlack(GX_FALSE);
FirstFrame = FALSE;
}
VIFlush();
VIWaitForRetrace();
if(DemoCurrentBuffer == DemoFrameBuffer1) {
DemoCurrentBuffer = DemoFrameBuffer2;
} else {
DemoCurrentBuffer = DemoFrameBuffer1;
}
}
static void LoadMemInfo()
{
u32 size;
u32 copy_size;
u32 offset;
u32 entries;
u32 i;
void *arena_lo;
void *arena_hi;
void *alloc_max;
void *alloc_min;
struct memory_info *buf_ptr;
DVDFileInfo file;
char buf[240];
OSReport("\nNow, try to find memory info file...\n\n");
if(!DVDOpen("/meminfo.bin", &file)) {
OSReport("\nCan't find memory info file. Use /XXX toolname/ to maximize available\n");
OSReport("memory space. For now, we only use the first %dMB.\n", (OSGetConsoleSimulatedMemSize()/1024)/1024);
arena_lo = OSGetArenaLo();
arena_hi = OSGetArenaHi();
arena_lo = OSInitAlloc(arena_lo, arena_hi, 1);
OSSetArenaLo(arena_lo);
arena_lo = (void *)OSRoundUp32B((u32)arena_lo);
arena_hi = (void *)OSRoundDown32B((u32)arena_hi);
OSSetCurrentHeap(OSCreateHeap(arena_lo, arena_hi));
arena_lo = arena_hi;
OSSetArenaLo(arena_lo);
} else {
buf_ptr = (struct memory_info *)OSRoundUp32B((u32)buf);
alloc_max = OSGetArenaHi();
alloc_min = (void *)(OSGetConsoleSimulatedMemSize()+0x80000000);
OSSetArenaHi((void *)(OSGetPhysicalMemSize()+0x80000000));
arena_lo = OSGetArenaLo();
arena_hi = OSGetArenaHi();
arena_lo = OSInitAlloc(arena_lo, arena_hi, 1);
OSSetArenaLo(arena_lo);
arena_lo = (void *)OSRoundUp32B((u32)arena_lo);
arena_hi = (void *)OSRoundDown32B((u32)arena_hi);
OSSetCurrentHeap(OSCreateHeap(arena_lo, arena_hi));
arena_lo = arena_hi;
OSSetArenaLo(arena_lo);
OSAllocFixed(&alloc_max, &alloc_min);
size = file.length;
offset = 0;
while(size) {
OSReport("loop\n");
copy_size = (size < 32) ? size : 32;
if(DVDRead(&file, buf_ptr, OSRoundUp32B(copy_size), offset) < 0) {
OSPanic("init.c", 576, "An error occurred when issuing read to /meminfo.bin\n");
}
entries = copy_size/sizeof(struct memory_info);
for(i=0; i<entries; i++) {
OSReport("start: 0x%08x, end: 0x%08x\n", buf_ptr[i].start, buf_ptr[i].end);
OSAllocFixed(&buf_ptr[i].start, &buf_ptr[i].end);
OSReport("Removed 0x%08x - 0x%08x from the current heap\n", buf_ptr[i].start, (u32)buf_ptr[i].end-1);
}
size -= copy_size;
offset += copy_size;
}
DVDClose(&file);
OSDumpHeap(__OSCurrHeap);
}
}

View file

@ -1,8 +1,8 @@
#include "common.h"
#include "dolphin/os.h"
static u32 HeapSizeTbl[5] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0 };
static void *HeapTbl[5];
static u32 HeapSizeTbl[HEAP_MAX] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0 };
static void *HeapTbl[HEAP_MAX];
void HuMemInitAll(void)
{
@ -10,7 +10,7 @@ void HuMemInitAll(void)
void *ptr;
u32 free_size;
for(i=0; i<4; i++) {
ptr = OSAllocFromHeap(__OSCurrHeap, HeapSizeTbl[i]);
ptr = OSAlloc(HeapSizeTbl[i]);
if(ptr == NULL) {
OSReport("HuMem> Failed OSAlloc Size:%d\n", HeapSizeTbl[i]);
return;
@ -19,7 +19,7 @@ void HuMemInitAll(void)
}
free_size = OSCheckHeap(currentHeapHandle);
OSReport("HuMem> left memory space %dKB(%d)\n", free_size/1024, free_size);
ptr = OSAllocFromHeap(__OSCurrHeap, free_size);
ptr = OSAlloc(free_size);
if(ptr == NULL) {
OSReport("HuMem> Failed OSAlloc left space\n");
return;
@ -39,12 +39,12 @@ void HuMemDCFlushAll()
HuMemDCFlush(0);
}
void HuMemDCFlush(int heap)
void HuMemDCFlush(HeapID heap)
{
DCFlushRangeNoSync(HeapTbl[heap], HeapSizeTbl[heap]);
}
void *HuMemDirectMalloc(int heap, s32 size)
void *HuMemDirectMalloc(HeapID heap, s32 size)
{
register u32 retaddr;
asm {
@ -54,7 +54,7 @@ void *HuMemDirectMalloc(int heap, s32 size)
return HuMemMemoryAlloc(HeapTbl[heap], size, retaddr);
}
void *HuMemDirectMallocNum(int heap, s32 size, u32 num)
void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num)
{
register u32 retaddr;
asm {
@ -73,7 +73,7 @@ void HuMemDirectFree(void *ptr)
HuMemMemoryFree(ptr, retaddr);
}
void HuMemDirectFreeNum(int heap, u32 num)
void HuMemDirectFreeNum(HeapID heap, u32 num)
{
register u32 retaddr;
asm {
@ -82,22 +82,22 @@ void HuMemDirectFreeNum(int heap, u32 num)
HuMemMemoryFreeNum(HeapTbl[heap], num, retaddr);
}
s32 HuMemUsedMallocSizeGet(int heap)
s32 HuMemUsedMallocSizeGet(HeapID heap)
{
return HuMemUsedMemorySizeGet(HeapTbl[heap]);
}
s32 HuMemUsedMallocBlockGet(int heap)
s32 HuMemUsedMallocBlockGet(HeapID heap)
{
return HuMemUsedMemoryBlockGet(HeapTbl[heap]);
}
u32 HuMemHeapSizeGet(int heap)
u32 HuMemHeapSizeGet(HeapID heap)
{
return HeapSizeTbl[heap];
}
void *HuMemHeapPtrGet(int heap)
void *HuMemHeapPtrGet(HeapID heap)
{
return HeapTbl[heap];
}

563
src/game/objmain.c Normal file
View file

@ -0,0 +1,563 @@
#include "common.h"
#define OM_OVL_HIS_MAX 16
#define OM_MAX_GROUPS 10
typedef struct om_obj_group {
u16 next_idx;
u16 max_objs;
u16 num_objs;
u16 *next;
omObjData **obj;
} omObjGroup;
typedef struct om_obj_man {
s16 max_objs;
s16 num_objs;
s16 next_idx;
s16 obj_last;
s16 obj_first;
s16 unkA;
omObjData *obj;
omObjGroup *group;
} omObjMan;
omObjData *omDBGSysKeyObj;
Process *omwatchproc;
OverlayID omnextovl;
OverlayID omcurovl;
int omcurdll;
int omovlhisidx;
int omovlevtno;
int omnextovlevtno;
int omovlstat;
static int omnextovlstat;
char omUPauseFlag;
s16 omSysExitReq;
s16 omdispinfo;
static omOvlHisData omovlhis[OM_OVL_HIS_MAX];
char omSysPauseEnableFlag = TRUE;
OverlayID omprevovl = OVL_INVALID;
static void omWatchOverlayProc(void);
static void omInsertObj(Process *objman_process, omObjData *object);
void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl)
{
omDLLInit(ovl_list);
omwatchproc = HuPrcCreate(omWatchOverlayProc, prio, 8192, 0);
HuPrcSetStat(omwatchproc, 12);
omcurovl = OVL_INVALID;
omovlhisidx = -1;
omOvlCallEx(start_ovl, 1, 0, 0);
omDBGSysKeyObj = NULL;
omSysPauseEnable(TRUE);
}
static void omWatchOverlayProc(void)
{
while(1) {
if(omcurovl == OVL_INVALID) {
if(omnextovl >= 0 && fadeStat == 0) {
HuPrcSleep(0);
OSReport("++++++++++++++++++++ Start New OVL %d (EVT:%d STAT:0x%08x) ++++++++++++++++++\n", omnextovl, omnextovlevtno, omnextovlstat);
HuMemHeapDump(HuMemHeapPtrGet(HEAP_SYSTEM), -1);
HuMemHeapDump(HuMemHeapPtrGet(HEAP_DATA), -1);
HuMemHeapDump(HuMemHeapPtrGet(HEAP_DVD), -1);
OSReport("objman>Used Memory Size:%08x\n", HuMemUsedMallocSizeGet(HEAP_SYSTEM));
OSReport("objman>Used Memory Cnt:%d\n", HuMemUsedMallocBlockGet(HEAP_SYSTEM));
OSReport("objman>Init esp\n");
espInit();
OSReport("objman>Call objectsetup\n");
fn_800338EC(omnextovl);
HuAudDllSndGrpSet(omnextovl);
omcurovl = omnextovl;
omovlevtno = omnextovlevtno;
omovlstat = omnextovlstat;
omnextovl = OVL_INVALID;
if(_CheckFlag(0x1000C)) {
fn_8003F3AC();
}
omSysPauseEnable(TRUE);
omcurdll = omDLLStart(omcurovl, 0);
OSReport("objman>ObjectSetup end\n");
if(omcurovl != OVL_INVALID) {
goto watch_child;
} else {
continue;
}
} else {
HuPrcVSleep();
}
} else {
watch_child:
HuPrcChildWatch();
}
}
}
void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat)
{
OSReport("objman>Call New Ovl %d(%d)\n", overlay, arg2);
if(omovlhisidx >= OM_OVL_HIS_MAX) {
OSReport("objman>OVL Call over error\n");
return;
}
omovlhis[++omovlhisidx].overlay = overlay;
omovlhis[omovlhisidx].event = event;
omovlhis[omovlhisidx].stat = stat;
omOvlGotoEx(overlay, arg2, event, stat);
}
void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat)
{
omprevovl = omcurovl;
if(omcurovl >= 0) {
omOvlKill(arg2);
}
omnextovl = overlay;
omnextovlevtno = event;
omnextovlstat = stat;
}
void omOvlReturnEx(s16 level, s16 arg2)
{
omovlhisidx -= level;
OSReport("objman>Ovl Return %d=%d(%d)\n", level, omovlhisidx, arg2);
if(omovlhisidx < 0) {
OSReport("objman>OVL under error\n");
omovlhisidx = 0;
}
omOvlGotoEx(omovlhis[omovlhisidx].overlay, arg2, omovlhis[omovlhisidx].event, omovlhis[omovlhisidx].stat);
}
void omOvlKill(s16 arg)
{
fn_8004D6F4(-1);
fn_80035A0C();
Hu3DAllKill();
HuWinAllKill();
HuSprClose();
HuPrcChildKill(omwatchproc);
HuMemDirectFreeNum(HEAP_SYSTEM, 0x10000000);
HuDataDirCloseNum(0x10000000);
HuMemDirectFreeNum(HEAP_DVD, 0x10000000);
HuMemDirectFreeNum(HEAP_DATA, 0x10000000);
HuPadRumbleAllStop();
HuAudFXListnerKill();
OSReport("OvlKill %d\n", arg);
omSysExitReq = FALSE;
omDLLNumEnd(omcurovl, arg);
omcurovl = OVL_INVALID;
omDBGSysKeyObj = NULL;
}
void omOvlHisChg(s32 level, OverlayID overlay, int event, int stat)
{
omOvlHisData *history;
if(omovlhisidx-level < 0 || omovlhisidx-level >= OM_OVL_HIS_MAX) {
OSReport("objman> omOvlHisChg: overlay 実行履歴の範囲外を変更しようとしました\n");
return;
}
history = &omovlhis[omovlhisidx-level];
history->overlay = overlay;
history->event = event;
history->stat = stat;
}
omOvlHisData *omOvlHisGet(s32 level)
{
if(omovlhisidx-level < 0 || omovlhisidx-level >= OM_OVL_HIS_MAX) {
OSReport("objman> omOvlHisGet: overlay 実行履歴の範囲外を参照しようとしました\n");
return NULL;
}
return &omovlhis[omovlhisidx-level];
}
Process *omInitObjMan(s16 max_objs, int prio)
{
omObjGroup *group_all;
omObjData *obj_all;
omObjData *obj;
int i;
omObjMan *objman;
Process *process;
OSReport("objman>InitObjMan start\n");
max_objs += 2;
omSysExitReq = FALSE;
process = HuPrcChildCreate(omMain, prio, 16384, 0, omwatchproc);
HuPrcSetStat(process, 12);
objman = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(omObjMan), 0x10000000);
objman->max_objs = max_objs;
process->user_data = objman;
process->dtor = omDestroyObjMan;
objman->num_objs = 0;
objman->next_idx = 0;
objman->obj_last = -1;
objman->obj_first = -1;
obj_all = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData), 0x10000000);
objman->obj = obj_all;
group_all = HuMemDirectMallocNum(HEAP_SYSTEM, OM_MAX_GROUPS*sizeof(omObjGroup), 0x10000000);
objman->group = group_all;
for(i=0; i<max_objs;i++) {
obj = &obj_all[i];
obj->stat = 1;
obj->prio = obj->prev =obj->next = -1;
obj->unk10 = 0;
obj->trans.x = obj->trans.y = obj->trans.z = obj->rot.x = obj->rot.y = obj->rot.z = 0.0f;
obj->scale.x = obj->scale.y = obj->scale.z = 1.0f;
obj->model = obj->motion = NULL;
obj->func = obj->data = NULL;
obj->next_idx = i+1;
obj->mtncnt = 0;
obj->motion = NULL;
}
for(i=0; i<OM_MAX_GROUPS;i++) {
group_all[i].max_objs = 0;
group_all[i].num_objs = 0;
group_all[i].next_idx = 0;
group_all[i].obj = NULL;
group_all[i].next = NULL;
}
OSReport("objman>InitObjMan end\n");
omUPauseFlag = FALSE;
HuPrcAllUPause(0);
return process;
}
void omDestroyObjMan(void)
{
Process *process = HuPrcCurrentGet();
omObjMan *objman = process->user_data;
objman->obj_last = -1;
OSReport("objman>Destory ObjMan\n");
}
omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, s16 group, void (*func)(omObjData *))
{
int i;
omObjData *object;
s16 next_idx;
omObjMan *objman = objman_process->user_data;
omObjData *obj_base = objman->obj;
if(objman->num_objs == objman->max_objs) {
return NULL;
}
next_idx = objman->next_idx;
object = &obj_base[next_idx];
object->next_idx_alloc = next_idx;
object->prio = prio;
omInsertObj(objman_process, object);
if(mdlcnt) {
object->model = HuMemDirectMallocNum(HEAP_SYSTEM, mdlcnt*sizeof(s16), 0x10000000);
object->mdlcnt = mdlcnt;
for(i=0; i<mdlcnt; i++) {
object->model[i] = -1;
}
} else {
object->model = NULL;
object->mdlcnt = 0;
}
if(mtncnt) {
object->motion = HuMemDirectMallocNum(HEAP_SYSTEM, mtncnt*sizeof(s16), 0x10000000);
object->mtncnt = mtncnt;
} else {
object->motion = NULL;
object->mtncnt = 0;
}
if(group >= 0) {
omAddMember(objman_process, group, object);
} else {
object->group = group;
object->group_idx = 0;
}
object->stat = 4;
object->unk10 = 0;
object->func = func;
object->work[0] = object->work[1] = object->work[2] = object->work[3] = 0;
objman->next_idx = object->next_idx;
objman->num_objs++;
omSetTra(object, 0.0f, 0.0f, 0.0f);
omSetRot(object, 0.0f, 0.0f, 0.0f);
omSetSca(object, 1.0f, 1.0f, 1.0f);
return object;
}
static void omInsertObj(Process *objman_process, omObjData *object)
{
omObjData *obj_new;
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
s16 next_idx_alloc = object->next_idx_alloc;
s16 prio = object->prio;
s16 obj_idx;
s16 prev_idx;
if(objman->obj_first == -1) {
object->prev = -1;
object->next = -1;
objman->obj_first = next_idx_alloc;
objman->obj_last = next_idx_alloc;
(void)objman; //HACK for matching
return;
}
for(obj_idx = objman->obj_first; obj_idx != -1; obj_idx = obj_new->next) {
obj_new = &obj_all[obj_idx];
if(obj_new->prio <= prio) {
break;
}
prev_idx = obj_idx;
}
if(obj_idx != -1) {
object->prev = obj_new->prev;
object->next = obj_idx;
if(obj_new->prev != -1) {
obj_all[obj_new->prev].next = next_idx_alloc;
} else {
objman->obj_first = next_idx_alloc;
}
obj_new->prev = next_idx_alloc;
} else {
object->next = -1;
object->prev = prev_idx;
obj_new->next = next_idx_alloc;
objman->obj_last = next_idx_alloc;
}
}
void omAddMember(Process *objman_process, u16 group, omObjData *object)
{
omObjMan *objman = objman_process->user_data;
omObjGroup *group_ptr = &objman->group[group];
if(group_ptr->num_objs != group_ptr->max_objs) {
object->group = group;
object->group_idx = group_ptr->next_idx;
group_ptr->obj[group_ptr->next_idx] = object;
group_ptr->next_idx = group_ptr->next[group_ptr->next_idx];
group_ptr->num_objs++;
}
}
void omDelObjEx(Process *objman_process, omObjData *object)
{
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
s16 next_idx_alloc = object->next_idx_alloc;
if(objman->num_objs == 0 || object->stat == 1) {
return;
}
objman->num_objs--;
if(object->group >= 0) {
omDelMember(objman_process, object);
}
if(object->motion != NULL) {
HuMemDirectFree(object->motion);
object->motion = NULL;
}
if(object->model != NULL) {
HuMemDirectFree(object->model);
object->model = NULL;
}
if(object->data != NULL) {
HuMemDirectFree(object->data);
object->data = NULL;
}
object->stat = 1;
if(object->next >= 0) {
obj_all[object->next].prev = object->prev;
}
if(object->prev >= 0) {
obj_all[object->prev].next = object->next;
}
if(objman->num_objs != 0) {
if(object->prev < 0) {
objman->obj_first = obj_all[object->next].next_idx_alloc;
}
if(object->next < 0) {
objman->obj_last = obj_all[object->prev].next_idx_alloc;
}
} else {
objman->obj_first = objman->obj_last = -1;
}
object->next_idx = objman->next_idx;
objman->next_idx = next_idx_alloc;
}
void omDelMember(Process *objman_process, omObjData *object)
{
if(object->group != -1) {
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
omObjGroup *group = &objman->group[object->group];
group->obj[object->group_idx] = NULL;
group->next[object->group_idx] = group->next_idx;
group->next_idx = object->group_idx;
object->group = -1;
group->num_objs--;
}
}
void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs)
{
int i;
omObjMan *objman = objman_process->user_data;
omObjGroup *group_ptr = &objman->group[group];
if(group_ptr->obj != NULL) {
HuMemDirectFree(group_ptr->obj);
}
if(group_ptr->next != NULL) {
HuMemDirectFree(group_ptr->next);
}
group_ptr->next_idx = 0;
group_ptr->max_objs = max_objs;
group_ptr->num_objs = 0;
group_ptr->obj = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData *), 0x10000000);
group_ptr->next = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(u16), 0x10000000);
for(i=0; i<max_objs; i++) {
group_ptr->obj[i] = NULL;
group_ptr->next[i] = i+1;
}
}
omObjData **omGetGroupMemberListEx(Process *objman_process, s16 group)
{
omObjMan *objman = objman_process->user_data;
return objman->group[group].obj;
}
void omSetStatBit(omObjData *obj, u16 stat)
{
obj->stat |= stat;
}
void omResetStatBit(omObjData *obj, u16 stat)
{
obj->stat &= ~stat;
}
void omSetTra(omObjData *obj, float x, float y, float z)
{
obj->trans.x = x;
obj->trans.y = y;
obj->trans.z = z;
}
void omSetRot(omObjData *obj, float x, float y, float z)
{
obj->rot.x = x;
obj->rot.y = y;
obj->rot.z = z;
}
void omSetSca(omObjData *obj, float x, float y, float z)
{
obj->scale.x = x;
obj->scale.y = y;
obj->scale.z = z;
}
void omMain(void)
{
Process *process = HuPrcCurrentGet();
omObjMan *objman = process->user_data;
omObjData *obj_all = objman->obj;
omObjData *object;
s16 obj_index;
omDLLDBGOut();
while(1) {
if(omdispinfo) {
float scale = 1.5f;
GXColor color;
color.a = 96;
color.r = 0;
color.g = 0;
color.b = 255;
printWin(7, 23, 128*scale, 40*scale, &color);
fontcolor = 14;
print8(8, 24, scale, "\xFD\x01H:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_SYSTEM), HuMemUsedMallocBlockGet(HEAP_SYSTEM));
print8(8, 24+(8*scale), scale, "\xFD\x01M:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_DATA), HuMemUsedMallocBlockGet(HEAP_DATA));
print8(8, 24+(16*scale), scale, "\xFD\x01OBJ:%d/%d", objman->num_objs, objman->max_objs);
print8(8, 24+(24*scale), scale, "\xFD\x01OVL:%ld(%ld<%ld)", omovlhisidx, omcurovl, omprevovl);
print8(8, 24+(32*scale), scale, "\xFD\x01POL:%ld", totalPolyCnted);
}
obj_index = objman->obj_last;
while(obj_index != -1) {
object = &obj_all[obj_index];
obj_index = object->prev;
if((object->stat & 0x3) == 0) {
if(object->func != NULL && (object->stat & 0x58) == 0) {
object->func(object);
}
if(omcurovl == -1 || objman->obj_last == -1) {
break;
}
if((object->stat & 0x3) == 0) {
if((obj_all[obj_index].stat & 0x3) != 0) {
obj_index = object->prev;
}
if(object->model != NULL && object->model[0] != -1 && !(object->stat & 0x100)) {
Hu3DModelPosSet(object->model[0], object->trans.x, object->trans.y, object->trans.z);
Hu3DModelRotSet(object->model[0], object->rot.x, object->rot.y, object->rot.z);
Hu3DModelScaleSet(object->model[0], object->scale.x, object->scale.y, object->scale.z);
}
}
}
}
HuPrcVSleep();
}
}
//Dummy function to force string literals in binary
static void omDumpObj(Process *objman_process)
{
omObjMan *objman = objman_process->user_data;
omObjData *obj_all = objman->obj;
int i;
OSReport("=================== 現在登録されている OBJECT ==================\n");
OSReport("STAT PRI GRPN MEMN PROG (TRA) (ROT) (SCA) mdlcnt mtncnt work[0] work[1] work[2] work[3] *data\n");
for(i=0; i<objman->max_objs; i++) {
omObjData *object = &obj_all[i];
OSReport("%04d:%04X %04X %d %d %08X (%.2f %.2f %.2f) (%.2f %.2f %.2f) (%.2f %.2f %.2f) %d %d %08X %08X %08X %08X %08X\n",
object->stat, object->stat, object->prio, object->group, object->unk10, object->func,
object->trans.x, object->trans.y, object->trans.z,
object->rot.x, object->rot.y, object->rot.z,
object->scale.x, object->scale.y, object->scale.z,
object->mdlcnt, object->mtncnt, object->work[0], object->work[1], object->work[2], object->work[3], object->data);
}
OSReport("================================================================\n");
}
void omAllPause(BOOL pause)
{
Process *objman_process = HuPrcCurrentGet();
omObjMan *objman = objman_process->user_data;
int i;
if(pause) {
for(i=0; i<objman->max_objs; i++) {
if((objman->obj[i].stat & 0x21) == 0) {
omSetStatBit(&objman->obj[i], 0x10);
}
}
} else {
for(i=0; i<objman->max_objs; i++) {
if((objman->obj[i].stat & 0x21) == 0) {
omResetStatBit(&objman->obj[i], 0x10);
}
}
}
}
char omPauseChk(void)
{
if(omDBGSysKeyObj == NULL) {
return 0;
} else {
return omDBGSysKeyObj->work[0] & 0x1;
}
}
OverlayID omCurrentOvlGet(void)
{
return omcurovl;
}

11
src/game/ovllist.c Normal file
View file

@ -0,0 +1,11 @@
#include "common.h"
#define OVL_DEFINE(name, path) { path, 0 },
FileListEntry _ovltbl[OVL_COUNT+1] = {
#include "ovl_table.h"
{ NULL, -1 }
};
#undef OVL_DEFINE

View file

@ -1,28 +1,53 @@
#include "common.h"
#include "dolphin/mtx.h"
#include "dolphin/gx.h"
#include "dolphin/vi.h"
#include "stdio.h"
#include "stdarg.h"
extern u8 ank8x8_4b[];
struct strline_data {
u16 type;
u16 last_idx;
u16 color;
s16 x;
s16 y;
s16 w;
s16 h;
s16 empty_line;
s16 empstrline_next;
float scale;
char str[80];
GXColor color;
GXColor win_color;
};
static struct strline_data strline[256];
static char pfStrBuf[256];
BOOL saftyFrameF;
u16 strlinecnt;
u16 empstrline;
int fontcolor;
u16 empstrline;
u16 strlinecnt;
BOOL saftyFrameF;
void pfClsScr(void);
static void WireDraw(void);
static GXColor ATTRIBUTE_ALIGN(32) fcoltbl[16] = {
{ 0, 0, 0, 255 },
{ 0, 0, 128, 255 },
{ 128, 0, 0, 255 },
{ 128, 0, 128, 255 },
{ 0, 128, 0, 255 },
{ 0, 128, 128, 255 },
{ 128, 128, 0, 255 },
{ 128, 128, 128, 255 },
{ 128, 128, 128, 128 },
{ 0, 0, 255, 255 },
{ 255, 0, 0, 255 },
{ 255, 0, 255, 255 },
{ 0, 255, 0, 255 },
{ 0, 255, 255, 255 },
{ 255, 255, 0, 255 },
{ 255, 255, 255, 255 }
};
void pfInit(void)
{
@ -42,10 +67,286 @@ void pfClsScr(void)
empstrline = 0;
strlinecnt = 0;
for (i = 0; i < 256; i++) {
strline[i].empty_line = i+1;
strline[i].empstrline_next = i+1;
strline[i].type = 0;
if (strline[i].str[0] != 0) {
strline[i].str[0] = 0;
}
}
}
}
s16 print8(s16 x, s16 y, float scale, char *str, ...)
{
struct strline_data *strline_curr;
char *src = pfStrBuf;
char *dst;
s16 ret;
va_list list;
strline_curr = &strline[empstrline];
if(strlinecnt >= 256) {
return -1;
}
va_start(list, str);
vsprintf(pfStrBuf, str, list);
strlinecnt++;
ret = empstrline;
empstrline = strline_curr->empstrline_next;
strline_curr->type = 0;
strline_curr->color = fontcolor;
strline_curr->x = x;
strline_curr->y = y;
strline_curr->scale = scale;
dst = strline_curr->str;
while(*src) {
*dst++ = *src++;
}
*dst = 0;
va_end(list);
return ret;
}
s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color)
{
struct strline_data *strline_curr;
s16 ret;
char *src = pfStrBuf;
strline_curr = &strline[empstrline];
if(strlinecnt >= 256) {
return -1;
}
strlinecnt++;
ret = empstrline;
empstrline = strline_curr->empstrline_next;
strline_curr->type = 1;
strline_curr->win_color.r = color->r;
strline_curr->win_color.g = color->g;
strline_curr->win_color.b = color->b;
strline_curr->win_color.a = color->a;
strline_curr->x = x;
strline_curr->y = y;
strline_curr->w = w;
strline_curr->h = h;
return ret;
}
void pfDrawFonts(void)
{
GXTexObj font_tex;
Mtx44 proj;
Mtx modelview;
int i;
s16 x, y, w, h;
u16 strline_count = strlinecnt;
if(saftyFrameF) {
WireDraw();
}
MTXOrtho(proj, 0, 480, 0, 640, 0, 10);
GXSetProjection(proj, GX_ORTHOGRAPHIC);
MTXIdentity(modelview);
GXLoadPosMtxImm(modelview, GX_PNMTX0);
GXSetCurrentMtx(GX_PNMTX0);
GXSetViewport(0, 0, RenderMode->fbWidth, RenderMode->efbHeight, 0, 1);
GXSetScissor(0, 0, RenderMode->fbWidth, RenderMode->efbHeight);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX8);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_CLR0, fcoltbl, sizeof(GXColor));
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXInvalidateTexAll();
GXInitTexObj(&font_tex, ank8x8_4b, 128, 128, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE);
GXInitTexObjLOD(&font_tex, GX_NEAR, GX_NEAR, 0, 0, 0, GX_FALSE, GX_FALSE, GX_ANISO_1);
GXLoadTexObj(&font_tex, GX_TEXMAP0);
GXSetNumTevStages(1);
GXSetNumTexGens(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE);
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_VTX, GX_SRC_VTX, GX_LIGHT0, GX_DF_CLAMP, GX_AF_SPOT);
GXSetZCompLoc(GX_FALSE);
GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1);
GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP);
GXSetAlphaUpdate(GX_TRUE);
for(i=0; i<256; i++) {
x = strline[i].x;
y = strline[i].y;
if(strline[i].type == 1) {
w = strline[i].w;
h = strline[i].h;
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_S16, 0);
GXSetTevColor(GX_TEVREG0, strline[i].win_color);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_C0, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_A0, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetNumTevStages(1);
GXSetNumTexGens(0);
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition2s16(x, y);
GXPosition2s16(x+w, y);
GXPosition2s16(x+w, y+h);
GXPosition2s16(x, y+h);
GXEnd();
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxDesc(GX_VA_CLR0, GX_INDEX8);
GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_S16, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
GXSetArray(GX_VA_CLR0, fcoltbl, sizeof(GXColor));
GXSetNumTevStages(1);
GXSetNumTexGens(1);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0);
GXSetTexCoordGen(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY);
GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE);
} else {
if(strline[i].str[0] != '\0') {
float shadow_ofs_x, shadow_ofs_y;
float char_w;
float char_h;
float texcoord_x, texcoord_y;
char *str;
u16 color;
s16 shadow_color;
float scale;
char_w = char_h = 8.0f*strline[i].scale;
str = strline[i].str;
color = strline[i].color;
shadow_color = -1;
scale = 1.0f;
while(*str) {
char c = *str++;
switch(c) {
case 255:
c = *str++;
scale = c/16.0f;
char_w = 8.0f*strline[i].scale*scale;
char_h = 8.0f*strline[i].scale*scale;
break;
case 254:
color = (*str++)-1;
break;
case 253:
shadow_color = (*str++)-1;
shadow_ofs_x = 1.3333333f*strline[i].scale*scale;
shadow_ofs_y = 1.3333333f*strline[i].scale*scale;
break;
default:
texcoord_x = (c%16)/16.0f;
texcoord_y = ((c/16)/16.0f)+(1/128.0f);
if(shadow_color < 0) {
GXBegin(GX_QUADS, GX_VTXFMT0, 4);
GXPosition3s16(x, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w, y+char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x, y+char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXEnd();
} else {
GXBegin(GX_QUADS, GX_VTXFMT0, 8);
GXPosition3s16(x+shadow_ofs_x, y+shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w+shadow_ofs_x, y+shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w+shadow_ofs_x, y+char_h+shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x+shadow_ofs_x, y+char_h+shadow_ofs_y, 0);
GXColor1x8(shadow_color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXPosition3s16(x, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y);
GXPosition3s16(x+char_w, y, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y);
GXPosition3s16(x+char_w, y+char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x+(1/16.0f), texcoord_y+(1/16.0f));
GXPosition3s16(x, y+char_h, 0);
GXColor1x8(color);
GXTexCoord2f32(texcoord_x, texcoord_y+(1/16.0f));
GXEnd();
}
x += char_w;
if(x > 640) {
x = 0;
y += char_h;
}
break;
}
}
}
}
}
}
static void WireDraw(void)
{
Mtx44 proj;
Mtx modelview;
MTXOrtho(proj, 0, 480, 0, 576, 0, 10);
GXSetProjection(proj, GX_ORTHOGRAPHIC);
if(RenderMode->field_rendering) {
GXSetViewportJitter(0, 0, 640, 480, 0, 1, VIGetNextField());
} else {
GXSetViewport(0, 0, 640, 480, 0, 1);
}
GXSetScissor(0, 0, 640, 480);
GXClearVtxDesc();
GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XY, GX_F32, 0);
GXSetVtxDesc(GX_VA_CLR0, GX_DIRECT);
GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGB, GX_RGB8, 0);
GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0);
GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_RASC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO);
GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO);
GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV);
GXSetNumTexGens(0);
GXSetNumTevStages(1);
GXSetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
GXSetNumChans(1);
GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, GX_LIGHT_NULL, GX_DF_CLAMP, GX_AF_NONE);
MTXIdentity(modelview);
GXLoadPosMtxImm(modelview, GX_PNMTX0);
GXBegin(GX_LINES, 0, 8);
GXPosition2f32(16, 40);
GXColor3u8(255, 0, 0);
GXPosition2f32(16, 440);
GXColor3u8(255, 0, 0);
GXPosition2f32(16, 40);
GXColor3u8(255, 0, 0);
GXPosition2f32(560, 40);
GXColor3u8(255, 0, 0);
GXPosition2f32(560, 440);
GXColor3u8(255, 0, 0);
GXPosition2f32(560, 40);
GXColor3u8(255, 0, 0);
GXPosition2f32(560, 440);
GXColor3u8(255, 0, 0);
GXPosition2f32(16, 440);
GXColor3u8(255, 0, 0);
GXEnd();
}

View file

@ -70,7 +70,7 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz
alloc_size = HuMemMemoryAllocSizeGet(sizeof(Process))
+HuMemMemoryAllocSizeGet(stack_size)
+HuMemMemoryAllocSizeGet(extra_size);
if(!(heap = HuMemDirectMalloc(0, alloc_size))) {
if(!(heap = HuMemDirectMalloc(HEAP_SYSTEM, alloc_size))) {
OSReport("process> malloc error size %d\n", alloc_size);
return NULL;
}

0
tools/m2ctx.py Normal file → Executable file
View file