diff --git a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c index 502584cb49..974381490d 100644 --- a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c +++ b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c @@ -4433,32 +4433,8 @@ void func_80182FD4(void *a0, void *a1) */ #include "common.h" -typedef struct { - u32 addr : 24; - u32 len : 8; -} PTag_801833F0; -typedef struct { - PTag_801833F0 tag; - u8 r0, g0, b0, code; - u16 x0, y0; - u8 u0, v0; - u16 clut; - u16 x1, y1; - u8 u1, v1; - u16 tpage; - u16 x2, y2; - u8 u2, v2; - u16 pad2; - u16 x3, y3; - u8 u3, v3; - u16 pad3; -} Ft4_801833F0; -typedef struct { - PTag_801833F0 tag; - u32 code0; -} Drm_801833F0; #define ADDPRIM_801833F0(o, p) \ (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ diff --git a/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c b/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c index 20d8aa3aba..672d5db49f 100644 --- a/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c +++ b/src/ov_SC02_028/ov_SC02_028_jr_801884D8.c @@ -23,30 +23,6 @@ typedef struct { typedef struct { s16 v[4]; } Blk8_80126940_8017D6D0_8017F844; -typedef struct { - u32 addr : 24; - u32 len : 8; -} PTag_801833F0; -typedef struct { - PTag_801833F0 tag; - u8 r0, g0, b0, code; - u16 x0, y0; - u8 u0, v0; - u16 clut; - u16 x1, y1; - u8 u1, v1; - u16 tpage; - u16 x2, y2; - u8 u2, v2; - u16 pad2; - u16 x3, y3; - u8 u3, v3; - u16 pad3; -} Ft4_801833F0; -typedef struct { - PTag_801833F0 tag; - u32 code0; -} Drm_801833F0; typedef struct { s16 unk0; s16 unk2; diff --git a/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c b/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c index 04d82daeb1..7b32c8598b 100644 --- a/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c +++ b/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c @@ -4147,7 +4147,140 @@ void func_80180F98(void *a0, void *a1) } -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8017D898", func_801813B4); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_801813B4(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_801818D4(void) { } diff --git a/src/ov_SC03_101/ov_SC03_101_jr_8017CA80.c b/src/ov_SC03_101/ov_SC03_101_jr_8017CA80.c index 726b58fdd8..451c2ecbf1 100644 --- a/src/ov_SC03_101/ov_SC03_101_jr_8017CA80.c +++ b/src/ov_SC03_101/ov_SC03_101_jr_8017CA80.c @@ -4817,7 +4817,140 @@ INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8017CA80", func_801814A INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8017CA80", func_801814F8); -INCLUDE_ASM("asm/ov_SC03_101/nonmatchings/ov_SC03_101_jr_8017CA80", func_80181914); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_80181914(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_80181E34(void) { } diff --git a/src/ov_SC03_104/ov_SC03_104_jr_8017CA80.c b/src/ov_SC03_104/ov_SC03_104_jr_8017CA80.c index f9ac210bad..e33934f75c 100644 --- a/src/ov_SC03_104/ov_SC03_104_jr_8017CA80.c +++ b/src/ov_SC03_104/ov_SC03_104_jr_8017CA80.c @@ -4721,7 +4721,140 @@ INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8017CA80", func_801848E INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8017CA80", func_80184934); -INCLUDE_ASM("asm/ov_SC03_104/nonmatchings/ov_SC03_104_jr_8017CA80", func_80184D50); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_80184D50(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_80185270(void) { } diff --git a/src/ov_SC04_003/ov_SC04_003_jr_8017BEBC.c b/src/ov_SC04_003/ov_SC04_003_jr_8017BEBC.c index 2891e3baae..feb8c93fb1 100644 --- a/src/ov_SC04_003/ov_SC04_003_jr_8017BEBC.c +++ b/src/ov_SC04_003/ov_SC04_003_jr_8017BEBC.c @@ -3866,7 +3866,140 @@ INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8017BEBC", func_8017E49 INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8017BEBC", func_8017E4F4); -INCLUDE_ASM("asm/ov_SC04_003/nonmatchings/ov_SC04_003_jr_8017BEBC", func_8017E910); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_8017E910(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_8017EE30(void) { } diff --git a/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c b/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c index 037fef491b..8696c9e99a 100644 --- a/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c +++ b/src/ov_SC04_005/ov_SC04_005_jr_8017BEBC.c @@ -5686,7 +5686,140 @@ INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_80180FF INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_80181054); -INCLUDE_ASM("asm/ov_SC04_005/nonmatchings/ov_SC04_005_jr_8017BEBC", func_80181470); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_80181470(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_80181990(void) { } diff --git a/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c b/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c index 9a2e954d1d..d1431d8667 100644 --- a/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c +++ b/src/ov_SC04_007/ov_SC04_007_jr_8017BEBC.c @@ -5169,7 +5169,140 @@ INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_8017FEA INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_8017FF08); -INCLUDE_ASM("asm/ov_SC04_007/nonmatchings/ov_SC04_007_jr_8017BEBC", func_80180324); +#define ADDPRIM_801833F0(o, p) \ + (((PTag_801833F0 *)(p))->addr = ((PTag_801833F0 *)(o))->addr, \ + ((PTag_801833F0 *)(o))->addr = (u32)(p)) +#define SR3_801833F0(a) (((s32)(*(u16 *)(a) << 16)) >> 19) + +void func_80180324(void *ent, void *spr, u32 *q, u32 *ot) +{ + extern u8 *D_800A5E60; + register s32 zr __asm__("$0"); + + Ft4_801833F0 *poly; + Drm_801833F0 *dm; + s32 vtx; + u32 flags; + s32 tp, abr, code, shift; + u16 x; + u32 y; + s32 tpage, clut, cy; + s32 su, sv, uu, vv; + u16 fl; + s32 i, m; + u32 b; + + poly = (Ft4_801833F0 *)D_800A5E60; + fl = *(u16 *)((s32)ent + 0x1E) & 0x8000; + flags = *(u32 *)((s32)ent + 4); + tp = (flags >> 24) & 3; + shift = 2 - tp; + x = *(u16 *)((s32)ent + 0x28) + (*(s16 *)((s32)spr + 4) >> shift); + y = *(u16 *)((s32)ent + 0x2A) + *(u16 *)((s32)spr + 6); + vtx = *(s32 *)((s32)ent + 0x20); + D_800A5E60 += 0xF0; + if (flags & 0x40000000) { + code = 0x2E; + abr = (flags >> 28) & 3; + } else { + code = 0x2C; + abr = 1; + } + tpage = (tp << 7) | (abr << 5) | ((y & 0x100) >> 4) | ((x & 0x3C0) >> 6) | + ((y & 0x200) << 2); + b = *(u8 *)((s32)ent + 0x27); + cy = (b + 0x100) << 6; + if (b < 0xE0) { + clut = cy | 0x16; + } else { + clut = cy | 0x10; + } + { + s32 t = ((x - ((tpage & 0xF) << 6)) << shift) + + (*(u16 *)((s32)spr + 4) & ((1 << shift) - 1)); + su = t + zr; + __asm__ __volatile__("" ::"r"(t + *(u8 *)((s32)spr + 2) - 1)); + __asm__ __volatile__("" ::"r"(t)); + } + y = y & 0xFFFF; + if (tpage & 0x10) { + sv = y - 0x100; + } else { + sv = y + zr; + } + __asm__ __volatile__("" ::"r"(sv + *(u8 *)((s32)spr + 3) - 1)); + + i = 1; + uu = su; + vv = sv; + for (; i < 13; i += 2, poly++) { + s32 k = (i - 1) * 4; + __asm__ __volatile__("" ::"r"(i)); + poly->tag.len = 9; + poly->code = code; + poly->tpage = tpage; + poly->u2 = su; + poly->v2 = sv; + poly->u0 = SR3_801833F0(vtx + k + 0x10) + uu; + poly->v0 = SR3_801833F0(vtx + k + 0x12) + vv; + poly->u1 = SR3_801833F0(vtx + i * 4 + 0x10) + uu; + poly->v1 = SR3_801833F0(vtx + i * 4 + 0x12) + vv; + /* k2 is recorded as a giv HERE, AFTER the u1/v1 mem giv - see (1). */ + { + s32 k2 = (i + 1) * 4; + poly->u3 = SR3_801833F0(vtx + k2 + 0x10) + uu; + poly->v3 = SR3_801833F0(vtx + k2 + 0x12) + vv; + } + poly->clut = clut; + __asm__ __volatile__("" ::"r"(i), "r"(i)); + poly->r0 = *(u8 *)((s32)ent + 0x24); + poly->g0 = *(u8 *)((s32)ent + 0x25); + poly->b0 = *(u8 *)((s32)ent + 0x26); + poly->x0 = ((u16 *)q)[i * 2]; + poly->y0 = ((u16 *)q)[i * 2 + 1]; + poly->x1 = ((u16 *)q)[i * 2 + 2]; + poly->y1 = ((u16 *)q)[i * 2 + 3]; + poly->x2 = ((u16 *)q)[0]; + poly->y2 = ((u16 *)q)[1]; + poly->x3 = ((u16 *)q)[i * 2 + 4]; + poly->y3 = ((u16 *)q)[i * 2 + 5]; + if (fl != 0) { + ADDPRIM_801833F0(&ot[*(s32 *)((s32)q + 0x34 + (i >> 1) * 4)], poly); + } else { + ADDPRIM_801833F0(ot, poly); + } + } + poly[-1].x3 = ((u16 *)q)[2]; + poly[-1].y3 = ((u16 *)q)[3]; + poly[-1].u3 = su + SR3_801833F0(vtx + 0x10); + poly[-1].v3 = sv + SR3_801833F0(vtx + 0x12); + + if (flags & 0x40000000) { + dm = (Drm_801833F0 *)poly; + if (fl != 0) { + m = 0; + D_800A5E60 += 0x30; + do { + m++; + dm->tag.len = 1; + dm->code0 = (abr << 5) | 0xE100000A; + ADDPRIM_801833F0(&ot[*(volatile s32 *)((s32)q + 0x34)], dm); + q = (u32 *)((s32)q + 4); + dm++; + } while (m < 6); + } else { + dm->code0 = (abr << 5) | 0xE100000A; + D_800A5E60 += 8; + dm->tag.len = 1; + ADDPRIM_801833F0(ot, dm); + /* Zero-byte live-range stretch: puts vtx's allocno priority at + * 1232, inside the (1228, 1296) window - see (2). Placement is + * load-bearing; do not move this statement. */ + __asm__ __volatile__("" ::"r"(vtx)); + } + } +} + void func_80180844(void) { } diff --git a/src/shared/engine_types.h b/src/shared/engine_types.h index c89f087e85..3237047e9c 100644 --- a/src/shared/engine_types.h +++ b/src/shared/engine_types.h @@ -1294,6 +1294,32 @@ typedef struct Rec801466F0 { s32 unkC; /* +0x0C */ s32 unk10; /* +0x10 */ } Rec801466F0; + +/* --- lift_types.py fleet lift --- */ +typedef struct { + u32 addr : 24; + u32 len : 8; +} PTag_801833F0; +typedef struct { + PTag_801833F0 tag; + u32 code0; +} Drm_801833F0; +typedef struct { + PTag_801833F0 tag; + u8 r0, g0, b0, code; + u16 x0, y0; + u8 u0, v0; + u16 clut; + u16 x1, y1; + u8 u1, v1; + u16 tpage; + u16 x2, y2; + u8 u2, v2; + u16 pad2; + u16 x3, y3; + u8 u3, v3; + u16 pad3; +} Ft4_801833F0; #endif /* BFM_ENGINE_TYPES_H */ /* SESSION-19: moved here — 11 typedefs (the * Phase-29 crack-wave lift onward) were sitting OUTSIDE the guard, so any TU that * included this header twice re-declared them. gcc-2.7.2 rejects a repeated typedef