From 26186c33ee7f137ecbdcd8320984fe78faedbe5e Mon Sep 17 00:00:00 2001 From: Prakxo Date: Wed, 21 Dec 2022 00:00:29 +0100 Subject: [PATCH] match some of fraser/cuyler files. --- .gitignore | 2 +- common.py | 1 + config/dol_slices.yml | 4 ++ config/rel_slices.yml | 9 +++- include/_mem.h | 19 +++++++ include/libultra/gfxprint.h | 22 ++++++++ include/libultra/libultra.h | 4 ++ include/random_field.h | 11 ++++ include/roomtype.h | 58 ++++++++++++++++++++++ include/types.h | 11 +++- rel/m_random_field/mRF_GetRandomStepMode.c | 5 ++ rel/m_random_field/mRF_MakePerfectBit.c | 10 ++++ rel/m_room_type/mRmTp_FtrItemNo2FtrIdx.c | 17 +++++++ src/libultra/gfxprint/gfxprint_locate.c | 6 +++ src/libultra/gfxprint/gfxprint_locate8x8.c | 7 +++ 15 files changed, 183 insertions(+), 3 deletions(-) create mode 100644 include/_mem.h create mode 100644 include/libultra/gfxprint.h create mode 100644 include/random_field.h create mode 100644 include/roomtype.h create mode 100644 rel/m_random_field/mRF_GetRandomStepMode.c create mode 100644 rel/m_random_field/mRF_MakePerfectBit.c create mode 100644 rel/m_room_type/mRmTp_FtrItemNo2FtrIdx.c create mode 100644 src/libultra/gfxprint/gfxprint_locate.c create mode 100644 src/libultra/gfxprint/gfxprint_locate8x8.c diff --git a/.gitignore b/.gitignore index a1f62ab6..8393129a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ __pycache__/ build/ expected/ rel/*/*.s -src/*/*.s +src/*/*/*.s out/ dump/* !dump/foresta.rel.sha1 diff --git a/common.py b/common.py index 4772dc20..096dac52 100644 --- a/common.py +++ b/common.py @@ -309,6 +309,7 @@ LOCAL_CFLAGS = [ "-nostdinc", "-proc gekko", "-maxerrors 1", + "-Cpp_exceptions off", "-I-", f"-i {INCDIR}", f"-i {PPCDIS_INCDIR}", diff --git a/config/dol_slices.yml b/config/dol_slices.yml index e69de29b..5fc2380f 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -0,0 +1,4 @@ +libultra/gfxprint/gfxprint_locate.c: + .text: [0x8005B1EC, 0x8005B210] +libultra/gfxprint/gfxprint_locate8x8.c: + .text: [0x8005B210, 0x8005B238] \ No newline at end of file diff --git a/config/rel_slices.yml b/config/rel_slices.yml index adf19427..bea3439b 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -7,4 +7,11 @@ zurumode/zerucheck_key_check.c: zurumode/zurumode_cleanup.c: .text: [0x8040efc4, 0x8040f008] # zurumode/zurumode_update.c: - # .text: [0x8040EDA8 , 0x8040ee74] Has C++ functions but was matched with C?? Won't really bother at the moment with this one. \ No newline at end of file + # .text: [0x8040EDA8 , 0x8040ee74] Has C++ functions but was matched with C?? Won't really bother at the moment with this one. +m_random_field/mRF_MakePerfectBit.c: + .text: [0x8050B1AC, 0x8050B1D4] +m_random_field/mRF_GetRandomStepMode.c: + .text: [0x8050B284, 0x8050B2C0] +m_room_type/mRmTp_FtrItemNo2FtrIdx.c: + .text: [0x803E7878, 0x803E78BC] + diff --git a/include/_mem.h b/include/_mem.h new file mode 100644 index 00000000..196e8826 --- /dev/null +++ b/include/_mem.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#pragma section code_type ".init" + +void * memcpy(void * dst, const void * src, size_t n); +void * memset(void * dst, int val, size_t n); +void __fill_mem(void * dst, int val, unsigned long n); + +#pragma section code_type + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/include/libultra/gfxprint.h b/include/libultra/gfxprint.h new file mode 100644 index 00000000..dd75ac66 --- /dev/null +++ b/include/libultra/gfxprint.h @@ -0,0 +1,22 @@ +#ifndef GFXPRINT_H +#define GFXPRINT_H + +#include "types.h" + +typedef struct gfxprint_obj { + s32 unk0; + struct unknown_struct * unk4; + s16 NewX; + s16 NewY; + u16 PrevX; + u8 PrevY; + u8 unkF; + u8 R; + u8 G; + u8 B; + u8 A; +}; + +void gfxprint_locate(struct gfxprint_obj*, s32, s32); + +#endif diff --git a/include/libultra/libultra.h b/include/libultra/libultra.h index f7438fa8..ade6e295 100644 --- a/include/libultra/libultra.h +++ b/include/libultra/libultra.h @@ -1,6 +1,10 @@ #ifndef LIBULTRA_H #define LIBULTRA_H +#include "types.h" + +void bcopy(const void *dst, void *src, size_t n); +void bzero(void *ptr, size_t size); extern s32 osAppNMIBuffer[16]; #endif \ No newline at end of file diff --git a/include/random_field.h b/include/random_field.h new file mode 100644 index 00000000..a9d38a39 --- /dev/null +++ b/include/random_field.h @@ -0,0 +1,11 @@ +#ifndef RANDOM_FIELD_H +#define RANDOM_FIELD_H + +#include "types.h" + +#define mRF_PERFECT_BIT 9 + +int mRF_GetRandom(int val); + + +#endif \ No newline at end of file diff --git a/include/roomtype.h b/include/roomtype.h new file mode 100644 index 00000000..dd1e535a --- /dev/null +++ b/include/roomtype.h @@ -0,0 +1,58 @@ +#ifndef ROOM_TYPE_H +#define ROOM_TYPE_H + +#include "types.h" + +enum { + FG_ITEM0_TYPE, + FG_FTR0_TYPE, + FG_ITEM1_TYPE, + FG_FTR1_TYPE, + FG_NXGT0_TYPE, + FG_STRUCTURE_TYPE, + FG_PAD6_TYPE, + FG_PAD7_TYPE, + FG_ITEM2_TYPE, + FG_ACTOR_TYPE, + FG_PROPS_TYPE, + FG_PAD11_TYPE, + FG_PAD12_TYPE, + FG_SP_NPC_TYPE, + FG_NPC_TYPE, + FG_DONT_TYPE, + FG_TYPE_NUM +}; + +// TEMPORARY. Should be generated with .decl files +#define ITEM0_NO_START 0x0000 +#define NULL_NO ITEM0_NO_START +#define ITEM0_1_NO_START ITEM0_NO_START + 0x800 + +#define FTR0_NO_START 0x1000 + +#define ITEM1_NO_START 0x2000 +#define ITEM1_0_NO_START ITEM0_1_NO_START // paper +#define ITEM1_1_NO_START ITEM1_NO_START + 0x100 // money +#define ITEM1_2_NO_START ITEM1_NO_START + 0x200 // tools +#define ITEM1_3_NO_START ITEM1_NO_START + 0x300 // fish +#define ITEM1_4_NO_START ITEM1_NO_START + 0x400 // clothing +#define ITEM1_5_NO_START ITEM1_NO_START + 0x500 // etc +#define ITEM1_6_NO_START ITEM1_NO_START + 0x600 // carpets +#define ITEM1_7_NO_START ITEM1_NO_START + 0x700 // wallpaper +#define ITEM1_8_NO_START ITEM1_NO_START + 0x800 // food +#define ITEM1_9_NO_START ITEM1_NO_START + 0x900 // seeds +#define ITEM1_A_NO_START ITEM1_NO_START + 0xA00 // mini disks +#define ITEM1_B_NO_START ITEM1_NO_START + 0xB00 // diaries +#define ITEM1_C_NO_START ITEM1_NO_START + 0xC00 // tickets +#define ITEM1_D_NO_START ITEM1_NO_START + 0xD00 // insects +#define ITEM1_E_NO_START ITEM1_NO_START + 0xE00 // hukubukuro +#define ITEM1_F_NO_START ITEM1_NO_START + 0xF00 // kabu + +#define FTR1_NO_START 0x3000 + +#define GET_FG_ITEM0_CATEGORY(f) (((f)&0x800) >> 11) +#define GET_FG_ITEM1_CATEGORY(f) (((f)&0xF00) >> 8) +#define GET_FG_TYPE(f) (((f)&0xF000) >> 12) + + +#endif \ No newline at end of file diff --git a/include/types.h b/include/types.h index 0f8ccc2b..f53d796f 100644 --- a/include/types.h +++ b/include/types.h @@ -26,6 +26,15 @@ typedef double f64; typedef volatile f32 vf32; typedef volatile f64 vf64; -#define NULL ((void*)0) +typedef int BOOL; +typedef unsigned int uintptr_t; // Manually added +// Pointer to unknown, to be determined at a later date. +typedef void* unkptr; +typedef u32 unknown; + +#define TRUE 1 +#define FALSE 0 +#define NULL ((void*)0) +#define nullptr 0 #endif \ No newline at end of file diff --git a/rel/m_random_field/mRF_GetRandomStepMode.c b/rel/m_random_field/mRF_GetRandomStepMode.c new file mode 100644 index 00000000..440c6c2d --- /dev/null +++ b/rel/m_random_field/mRF_GetRandomStepMode.c @@ -0,0 +1,5 @@ +#include "random_field.h" + +int mRF_GetRandomStepMode(void) { + return mRF_GetRandom(100) < 15; +} \ No newline at end of file diff --git a/rel/m_random_field/mRF_MakePerfectBit.c b/rel/m_random_field/mRF_MakePerfectBit.c new file mode 100644 index 00000000..818d92bc --- /dev/null +++ b/rel/m_random_field/mRF_MakePerfectBit.c @@ -0,0 +1,10 @@ +#include "random_field.h" +int mRF_MakePerfectBit(void) { + int perfect_bit = 0; + int i; + for (i = 0; i < mRF_PERFECT_BIT; i++) { + perfect_bit |= 1 << i; + } + + return perfect_bit; +} diff --git a/rel/m_room_type/mRmTp_FtrItemNo2FtrIdx.c b/rel/m_room_type/mRmTp_FtrItemNo2FtrIdx.c new file mode 100644 index 00000000..4577018c --- /dev/null +++ b/rel/m_room_type/mRmTp_FtrItemNo2FtrIdx.c @@ -0,0 +1,17 @@ +#include "roomtype.h" + +#define FTR_NO_2_FTR_IDX(f) ((f) >> 2) +#define NUM_FTR_IN_TYPE (FTR_NO_2_FTR_IDX(0x1000)) +#define IS_FTR(f) ((f) == FG_FTR0_TYPE || (f) == FG_FTR1_TYPE) + +extern int mRmTp_FtrItemNo2FtrIdx(u16 ftr_no) { + int type = GET_FG_TYPE(ftr_no); + if (IS_FTR(type)) { + if (type == FG_FTR0_TYPE) { + return FTR_NO_2_FTR_IDX(ftr_no - FTR0_NO_START); + } + return FTR_NO_2_FTR_IDX(ftr_no - FTR1_NO_START) + NUM_FTR_IN_TYPE; + } + + return NULL_NO; +} diff --git a/src/libultra/gfxprint/gfxprint_locate.c b/src/libultra/gfxprint/gfxprint_locate.c new file mode 100644 index 00000000..4491b42a --- /dev/null +++ b/src/libultra/gfxprint/gfxprint_locate.c @@ -0,0 +1,6 @@ +#include "libultra/gfxprint.h" + +void gfxprint_locate(struct gfxprint_obj* gfxprint, s32 x, s32 y) { + gfxprint->NewX = (s16) (gfxprint->PrevX + (x * 4)); + gfxprint->NewY = (s16) (gfxprint->PrevY + (y * 4)); +} \ No newline at end of file diff --git a/src/libultra/gfxprint/gfxprint_locate8x8.c b/src/libultra/gfxprint/gfxprint_locate8x8.c new file mode 100644 index 00000000..36229349 --- /dev/null +++ b/src/libultra/gfxprint/gfxprint_locate8x8.c @@ -0,0 +1,7 @@ +#include "libultra/gfxprint.h" + +void gfxprint_locate8x8(struct gfxprint_obj* arg0, s32 arg1, s32 arg2) { + s32 x = arg1 << 3; + s32 y = arg2 << 3; + gfxprint_locate(arg0, x, y); +} \ No newline at end of file