diff --git a/include/alignment.h b/include/alignment.h new file mode 100644 index 0000000000..7a3b94ea2c --- /dev/null +++ b/include/alignment.h @@ -0,0 +1,16 @@ +#ifndef ALIGNMENT_H +#define ALIGNMENT_H + +#define ALIGN8(val) (((val) + 7) & ~7) +#define ALIGN16(val) (((val) + 0xF) & ~0xF) +#define ALIGN32(val) (((val) + 0x1F) & ~0x1F) +#define ALIGN64(val) (((val) + 0x3F) & ~0x3F) +#define ALIGN256(val) (((val) + 0xFF) & ~0xFF) + +#ifdef __GNUC__ +#define ALIGNED8 __attribute__ ((aligned (8))) +#else +#define ALIGNED8 +#endif + +#endif diff --git a/include/macros.h b/include/macros.h index e890d8df3b..b979dd1295 100644 --- a/include/macros.h +++ b/include/macros.h @@ -8,11 +8,6 @@ #define VIRTUAL_TO_PHYSICAL(addr) (u32)((u8*)(addr) - 0x80000000) #define SEGMENTED_TO_VIRTUAL(addr) PHYSICAL_TO_VIRTUAL(gSegments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr)) -#define ALIGN16(val) (((val) + 0xF) & ~0xF) -#define ALIGN32(val) (((val) + 0x1F) & ~0x1F) -#define ALIGN64(val) (((val) + 0x3F) & ~0x3F) -#define ALIGN256(val) (((val) + 0xFF) & ~0xFF) - #define OFFSETOF(structure, member) ((size_t)&(((structure*)0)->member)) #define SQ(x) ((x)*(x)) @@ -168,10 +163,4 @@ extern GraphicsContext* __gfxCtx; ((height)-1) << G_TEXTURE_IMAGE_FRAC); \ } while (0) -#ifdef __GNUC__ -#define ALIGNED8 __attribute__ ((aligned (8))) -#else -#define ALIGNED8 -#endif - #endif diff --git a/include/ultra64/controller.h b/include/ultra64/controller.h index f2038c8248..86e3e4bee1 100644 --- a/include/ultra64/controller.h +++ b/include/ultra64/controller.h @@ -96,9 +96,12 @@ #define BTN_B 0x4000 #define BTN_A 0x8000 -typedef struct { +typedef union { + struct { /* 0x00 */ u32 ram[15]; /* 0x3C */ u32 status; + }; + u64 force_structure_alignment; } OSPifRam; // size = 0x40 typedef struct { diff --git a/include/z64.h b/include/z64.h index be120c7b99..a96b3becc6 100644 --- a/include/z64.h +++ b/include/z64.h @@ -24,6 +24,7 @@ #include "z64skin.h" #include "z64transition.h" #include "z64interface.h" +#include "alignment.h" #include "sequence.h" #include "sfx.h" #include "color.h" @@ -49,8 +50,6 @@ #define Z_PRIORITY_DMAMGR 16 #define Z_PRIORITY_IRQMGR 17 -#define ALIGN8(val) (((val) + 7) & ~7) - #define STACK(stack, size) \ u64 stack[ALIGN8(size) / sizeof(u64)] @@ -521,12 +520,22 @@ typedef enum { typedef struct { /* 0x0000 */ u32 msgOffset; /* 0x0004 */ u32 msgLength; + union { /* 0x0008 */ u8 charTexBuf[FONT_CHAR_TEX_SIZE * 120]; + /* 0x0008 */ u64 force_structure_alignment_charTex; + }; + union { /* 0x3C08 */ u8 iconBuf[FONT_CHAR_TEX_SIZE]; + /* 0x3C08 */ u64 force_structure_alignment_icon; + }; + union { /* 0x3C88 */ u8 fontBuf[FONT_CHAR_TEX_SIZE * 320]; + /* 0x3C88 */ u64 force_structure_alignment_font; + }; union { /* 0xDC88 */ char msgBuf[1280]; /* 0xDC88 */ u16 msgBufWide[640]; + /* 0xDC88 */ u64 force_structure_alignment_msg; }; } Font; // size = 0xE188 diff --git a/include/z64player.h b/include/z64player.h index aa5463161f..abef450282 100644 --- a/include/z64player.h +++ b/include/z64player.h @@ -2,6 +2,7 @@ #define Z64PLAYER_H #include "z64actor.h" +#include "alignment.h" struct Player; @@ -158,7 +159,8 @@ typedef enum { } PlayerDoorType; -#define PLAYER_LIMB_BUF_COUNT PLAYER_LIMB_MAX + 2 // 2 extra entries in limb buffers? +#define LIMB_BUF_COUNT(limbCount) ((ALIGN16((limbCount) * sizeof(Vec3s)) + sizeof(Vec3s) - 1) / sizeof(Vec3s)) +#define PLAYER_LIMB_BUF_COUNT LIMB_BUF_COUNT(PLAYER_LIMB_MAX) typedef struct { /* 0x00 */ f32 unk_00; diff --git a/src/code/z_common_data.c b/src/code/z_common_data.c index 216a5ac9a4..670509d6ef 100644 --- a/src/code/z_common_data.c +++ b/src/code/z_common_data.c @@ -1,6 +1,7 @@ #include "global.h" -SaveContext gSaveContext; +// The use of ALIGNED8 here is just a temporary solution until the SaveContext is re-structured +ALIGNED8 SaveContext gSaveContext; u32 D_8015FA88; u32 D_8015FA8C;