Port libultra and yay0 (shindou is broken currently)

This commit is contained in:
CrashOveride95
2020-12-03 20:19:03 -05:00
parent 6a80548e8f
commit 15c0bfedbb
296 changed files with 9453 additions and 11420 deletions

View File

@@ -374,7 +374,6 @@ s32 D_SH_80343CF0;
s8 D_SH_80343CF8_pad[0x8];
struct UnkStruct80343D00 D_SH_80343D00;
s8 D_SH_8034DC8_pad[0x8];
OSPiHandle DriveRomHandle; // used in osDriveRomInit.c. Why here?
s8 D_SH_80343E48_pad[0x8];
#endif
@@ -788,12 +787,12 @@ struct SPTask *create_next_audio_frame_task(void) {
task = &gAudioTask->task.t;
task->type = M_AUDTASK;
task->flags = flags;
task->ucode_boot = rspF3DBootStart;
task->ucode_boot_size = (u8 *) rspF3DBootEnd - (u8 *) rspF3DBootStart;
task->ucode = rspAspMainStart;
task->ucode_boot = rspbootTextStart;
task->ucode_boot_size = (u8 *) rspbootTextEnd - (u8 *) rspbootTextStart;
task->ucode = aspMainTextStart;
task->ucode_size = 0x800; // (this size is ignored)
task->ucode_data = rspAspMainDataStart;
task->ucode_data_size = (rspAspMainDataEnd - rspAspMainDataStart) * sizeof(u64);
task->ucode_data = aspMainDataStart;
task->ucode_data_size = (aspMainDataEnd - aspMainDataStart) * sizeof(u64);
task->dram_stack = NULL;
task->dram_stack_size = 0;
task->output_buff = NULL;

View File

@@ -1255,9 +1255,6 @@ s32 func_sh_802f3dd0(OSIoMesg *m, s32 pri, s32 direction, uintptr_t devAddr, voi
case 2:
handle = osCartRomInit();
break;
case 3:
handle = osDriveRomInit();
break;
default:
return 0;
}

View File

@@ -114,12 +114,12 @@ struct SPTask *create_next_audio_frame_task(void) {
task = &gAudioTask->task.t;
task->type = M_AUDTASK;
task->flags = flags;
task->ucode_boot = rspF3DBootStart;
task->ucode_boot_size = (u8 *) rspF3DBootEnd - (u8 *) rspF3DBootStart;
task->ucode = rspAspMainStart;
task->ucode_data = rspAspMainDataStart;
task->ucode_boot = rspbootTextStart;
task->ucode_boot_size = (u8 *) rspbootTextEnd - (u8 *) rspbootTextStart;
task->ucode = aspMainTextStart;
task->ucode_data = aspMainDataStart;
task->ucode_size = 0x800; // (this size is ignored)
task->ucode_data_size = (rspAspMainDataEnd - rspAspMainDataStart) * sizeof(u64);
task->ucode_data_size = (aspMainDataEnd - aspMainDataStart) * sizeof(u64);
task->dram_stack = NULL;
task->dram_stack_size = 0;
task->output_buff = NULL;

View File

@@ -115,12 +115,12 @@ struct SPTask *func_sh_802f5a80(void) {
task = &gAudioTask->task.t;
task->type = M_AUDTASK;
task->flags = flags;
task->ucode_boot = rspF3DBootStart;
task->ucode_boot_size = (u8 *) rspF3DStart - (u8 *) rspF3DBootStart;
task->ucode = rspAspMainStart;
task->ucode_data = rspAspMainDataStart;
task->ucode_boot = rspbootTextStart;
task->ucode_boot_size = (u8 *) rspbootTextEnd - (u8 *) rspbootTextStart;
task->ucode = aspMainTextStart;
task->ucode_data = aspMainDataStart;
task->ucode_size = 0x1000;
task->ucode_data_size = (rspAspMainDataEnd - rspAspMainDataStart) * sizeof(u64);
task->ucode_data_size = (aspMainDataEnd - aspMainDataStart) * sizeof(u64);
task->dram_stack = NULL;
task->dram_stack_size = 0;
task->output_buff = NULL;

View File

@@ -275,7 +275,7 @@ static void level_cmd_load_raw(void) {
sCurrentCmd = CMD_NEXT;
}
static void level_cmd_load_mio0(void) {
static void level_cmd_load_yay0(void) {
load_segment_decompress(CMD_GET(s16, 2), CMD_GET(void *, 4), CMD_GET(void *, 8));
sCurrentCmd = CMD_NEXT;
}
@@ -295,7 +295,7 @@ static void level_cmd_load_mario_head(void) {
sCurrentCmd = CMD_NEXT;
}
static void level_cmd_load_mio0_texture(void) {
static void level_cmd_load_yay0_texture(void) {
load_segment_decompress_heap(CMD_GET(s16, 2), CMD_GET(void *, 4), CMD_GET(void *, 8));
sCurrentCmd = CMD_NEXT;
}
@@ -779,9 +779,9 @@ static void (*LevelScriptJumpTable[])(void) = {
/*15*/ level_cmd_pop_pool_state,
/*16*/ level_cmd_load_to_fixed_address,
/*17*/ level_cmd_load_raw,
/*18*/ level_cmd_load_mio0,
/*18*/ level_cmd_load_yay0,
/*19*/ level_cmd_load_mario_head,
/*1A*/ level_cmd_load_mio0_texture,
/*1A*/ level_cmd_load_yay0_texture,
/*1B*/ level_cmd_init_level,
/*1C*/ level_cmd_clear_level,
/*1D*/ level_cmd_alloc_level_pool,

286
src/game/_Ldtob.c Normal file
View File

@@ -0,0 +1,286 @@
#include <macros.h>
#include <stdlib.h>
#include <string.h>
#include "printf.h"
#define BUFF_LEN 0x20
static s16 _Ldunscale(s16 *, printf_struct *);
static void _Genld(printf_struct *, u8, u8 *, s16, s16);
const double D_80338670[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L };
/* float properties */
#define _D0 0
#define _DBIAS 0x3ff
#define _DLONG 1
#define _DOFF 4
#define _FBIAS 0x7e
#define _FOFF 7
#define _FRND 1
#define _LBIAS 0x3ffe
#define _LOFF 15
/* integer properties */
#define _C2 1
#define _CSIGN 1
#define _ILONG 0
#define _MBMAX 8
#define NAN 2
#define INF 1
#define FINITE -1
#define _DFRAC ((1 << _DOFF) - 1)
#define _DMASK (0x7fff & ~_DFRAC)
#define _DMAX ((1 << (15 - _DOFF)) - 1)
#define _DNAN (0x8000 | _DMAX << _DOFF | 1 << (_DOFF - 1))
#define _DSIGN 0x8000
#if _D0 == 3
#define _D1 2 /* little-endian order */
#define _D2 1
#define _D3 0
#else
#define _D1 1 /* big-endian order */
#define _D2 2
#define _D3 3
#endif
void _Ldtob(printf_struct *args, u8 type) {
u8 buff[BUFF_LEN];
u8 *ptr;
UNUSED u32 sp70;
f64 val;
/* maybe struct? */
s16 err;
s16 nsig;
s16 exp;
s32 i;
s32 n;
f64 factor;
s32 gen;
s32 j;
s32 lo;
ldiv_t qr;
u8 drop;
s32 n2;
/* */
UNUSED u8 unused[0x4];
ptr = buff;
val = args->value.f64;
if (args->precision < 0) {
args->precision = 6;
} else {
if (args->precision == 0 && (type == 'g' || type == 'G')) {
args->precision = 1;
}
}
err = _Ldunscale(&exp, args);
if (err > 0) {
memcpy(args->buff, err == 2 ? "NaN" : "Inf", args->part2_len = 3);
return;
}
if (err == 0) {
nsig = 0;
exp = 0;
} else {
if (val < 0) {
val = -val;
}
exp = exp * 30103 / 0x000186A0 - 4;
if (exp < 0) {
n = (3 - exp) & ~3;
exp = -n;
for (i = 0; n > 0; n >>= 1, i++) {
if ((n & 1) != 0) {
val *= D_80338670[i];
}
}
} else {
if (exp > 0) {
factor = 1;
exp &= ~3;
for (n = exp, i = 0; n > 0; n >>= 1, i++) {
if ((n & 1) != 0) {
factor *= D_80338670[i];
}
}
val /= factor;
}
}
gen = ((type == 'f') ? exp + 10 : 6) + args->precision;
if (gen > 0x13) {
gen = 0x13;
}
*ptr++ = '0';
while (gen > 0 && 0 < val) {
lo = val;
if ((gen -= 8) > 0) {
val = (val - lo) * 1.0e8;
}
ptr = ptr + 8;
for (j = 8; lo > 0 && --j >= 0;) {
qr = ldiv(lo, 10);
*--ptr = qr.rem + '0';
lo = qr.quot;
}
while (--j >= 0) {
ptr--;
*ptr = '0';
}
ptr += 8;
}
gen = ptr - &buff[1];
for (ptr = &buff[1], exp += 7; *ptr == '0'; ptr++) {
--gen, --exp;
}
nsig = ((type == 'f') ? exp + 1 : ((type == 'e' || type == 'E') ? 1 : 0)) + args->precision;
if (gen < nsig) {
nsig = gen;
}
if (nsig > 0) {
if (nsig < gen && ptr[nsig] > '4') {
drop = '9';
} else {
drop = '0';
}
for (n2 = nsig; ptr[--n2] == drop;) {
nsig--;
}
if (drop == '9') {
ptr[n2]++;
}
if (n2 < 0) {
--ptr, ++nsig, ++exp;
}
}
}
_Genld(args, type, ptr, nsig, exp);
}
static s16 _Ldunscale(s16 *pex, printf_struct *px) {
unsigned short *ps = (unsigned short *) px;
short xchar = (ps[_D0] & _DMASK) >> _DOFF;
if (xchar == _DMAX) { /* NaN or INF */
*pex = 0;
return (s16)(ps[_D0] & _DFRAC || ps[_D1] || ps[_D2] || ps[_D3] ? NAN : INF);
} else if (0 < xchar) {
ps[_D0] = (ps[_D0] & ~_DMASK) | (_DBIAS << _DOFF);
*pex = xchar - (_DBIAS - 1);
return (FINITE);
}
if (0 > xchar) {
return NAN;
} else {
*pex = 0;
return (0);
}
}
static void _Genld(printf_struct *px, u8 code, u8 *p, s16 nsig, s16 xexp) {
u8 point = '.';
if (nsig <= 0) {
nsig = 1,
p = (u8 *) "0";
}
if (code == 'f'
|| ((code == 'g' || code == 'G') && (-4 <= xexp) && (xexp < px->precision))) { /* 'f' format */
++xexp; /* change to leading digit count */
if (code != 'f') { /* fixup for 'g' */
if (!(px->flags & FLAGS_HASH) && nsig < px->precision) {
px->precision = nsig;
}
if ((px->precision -= xexp) < 0) {
px->precision = 0;
}
}
if (xexp <= 0) { /* digits only to right of point */
px->buff[px->part2_len++] = '0';
if (0 < px->precision || px->flags & FLAGS_HASH) {
px->buff[px->part2_len++] = point;
}
if (px->precision < -xexp) {
xexp = -px->precision;
}
px->num_mid_zeros = -xexp;
px->precision += xexp;
if (px->precision < nsig) {
nsig = px->precision;
}
memcpy(&px->buff[px->part2_len], p, px->part3_len = nsig);
px->num_trailing_zeros = px->precision - nsig;
} else if (nsig < xexp) { /* zeros before point */
memcpy(&px->buff[px->part2_len], p, nsig);
px->part2_len += nsig;
px->num_mid_zeros = xexp - nsig;
if (0 < px->precision || px->flags & FLAGS_HASH) {
px->buff[px->part2_len] = point, ++px->part3_len;
}
px->num_trailing_zeros = px->precision;
} else { /* enough digits before point */
memcpy(&px->buff[px->part2_len], p, xexp);
px->part2_len += xexp;
nsig -= xexp;
if (0 < px->precision || px->flags & FLAGS_HASH) {
px->buff[px->part2_len++] = point;
}
if (px->precision < nsig) {
nsig = px->precision;
}
memcpy(&px->buff[px->part2_len], p + xexp, nsig);
px->part2_len += nsig;
px->num_mid_zeros = px->precision - nsig;
}
} else { /* 'e' format */
if (code == 'g' || code == 'G') { /* fixup for 'g' */
if (nsig < px->precision) {
px->precision = nsig;
}
if (--px->precision < 0) {
px->precision = 0;
}
code = code == 'g' ? 'e' : 'E';
}
px->buff[px->part2_len++] = *p++;
if (0 < px->precision || px->flags & FLAGS_HASH) {
px->buff[px->part2_len++] = point;
}
if (0 < px->precision) { /* put fraction digits */
if (px->precision < --nsig) {
nsig = px->precision;
}
memcpy(&px->buff[px->part2_len], p, nsig);
px->part2_len += nsig;
px->num_mid_zeros = px->precision - nsig;
}
p = (u8 *) &px->buff[px->part2_len]; /* put exponent */
*p++ = code;
if (0 <= xexp) {
*p++ = '+';
} else { /* negative exponent */
*p++ = '-';
xexp = -xexp;
}
if (100 <= xexp) { /* put oversize exponent */
if (1000 <= xexp) {
*p++ = xexp / 1000 + '0', xexp %= 1000;
}
*p++ = xexp / 100 + '0', xexp %= 100;
}
*p++ = xexp / 10 + '0', xexp %= 10;
*p++ = xexp + '0';
px->part3_len = p - (u8 *) &px->buff[px->part2_len];
}
if ((px->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { /* pad with leading zeros */
int n =
px->part1_len + px->part2_len + px->num_mid_zeros + px->part3_len + px->num_trailing_zeros;
if (n < px->width) {
px->num_leading_zeros = px->width - n;
}
}
}

58
src/game/_Litob.c Normal file
View File

@@ -0,0 +1,58 @@
#include <stdlib.h>
#include <string.h>
#include "printf.h"
#define BUFF_LEN 0x18
static u8 D_80334960[] = "0123456789abcdef";
static u8 D_80334974[] = "0123456789ABCDEF";
void _Litob(printf_struct *args, u8 type) {
u8 buff[BUFF_LEN];
const u8 *num_map;
s32 base;
s32 buff_ind;
u64 num;
lldiv_t quotrem;
if (type == 'X') {
num_map = D_80334974;
} else {
num_map = D_80334960;
}
base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16);
buff_ind = BUFF_LEN;
num = args->value.s64;
if ((type == 'd' || type == 'i') && args->value.s64 < 0) {
num = -num;
}
if (num != 0 || args->precision != 0) {
buff[--buff_ind] = num_map[num % base];
}
args->value.s64 = num / base;
while (args->value.s64 > 0 && buff_ind > 0) {
quotrem = lldiv(args->value.s64, base);
args->value.s64 = quotrem.quot;
buff[--buff_ind] = num_map[quotrem.rem];
}
args->part2_len = BUFF_LEN - buff_ind;
memcpy(args->buff, buff + buff_ind, args->part2_len);
if (args->part2_len < args->precision) {
args->num_leading_zeros = args->precision - args->part2_len;
}
if (args->precision < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
buff_ind = args->width - args->part1_len - args->num_leading_zeros - args->part2_len;
if (buff_ind > 0) {
args->num_leading_zeros += buff_ind;
}
}
}

225
src/game/_Printf.c Normal file
View File

@@ -0,0 +1,225 @@
#include <stdarg.h>
#include <string.h>
#include "printf.h"
#define ATOI(i, a) \
for (i = 0; *a >= '0' && *a <= '9'; a++) \
if (i < 999) \
i = *a + i * 10 - '0';
#define _PROUT(dst, fmt, _size) \
if (_size > 0) { \
dst = prout(dst, fmt, _size); \
if (dst != 0) \
sp78.size += _size; \
else \
return sp78.size; \
}
#define _PAD(i, m, c, src, extracond) \
if (extracond && m > 0) \
for (i = m; i > 0; i -= c) { \
if ((u32) i > 32) \
c = 32; \
else \
c = i; \
_PROUT(dst, src, c); \
}
const char length_str[] = "hlL";
const char flags_str[] = " +-#0";
const u32 flags_arr[] = { FLAGS_SPACE, FLAGS_PLUS, FLAGS_MINUS, FLAGS_HASH, FLAGS_ZERO, 0 };
char _spaces[] = " ";
char _zeroes[] = "00000000000000000000000000000000";
static void _Putfld(printf_struct *, va_list *, u8, u8 *);
s32 _Printf(char *(*prout)(char *, const char *, size_t), char *dst, const char *fmt, va_list args) {
printf_struct sp78;
const u8 *fmt_ptr;
u8 c;
const char *flag_index;
u8 sp4c[0x20]; // probably a buffer?
s32 sp48, sp44, sp40, sp3c, sp38, sp34, sp30, sp2c, sp28, sp24;
sp78.size = 0;
while (TRUE) {
fmt_ptr = (u8 *) fmt;
while ((c = *fmt_ptr) != 0 && c != '%') {
fmt_ptr++;
}
_PROUT(dst, fmt, fmt_ptr - (u8 *) fmt);
if (c == 0) {
return sp78.size;
}
fmt = (char *) ++fmt_ptr;
sp78.flags = 0;
for (; (flag_index = strchr(flags_str, *fmt_ptr)) != NULL; fmt_ptr++) {
sp78.flags |= flags_arr[flag_index - flags_str];
}
if (*fmt_ptr == '*') {
sp78.width = va_arg(args, s32);
if (sp78.width < 0) {
sp78.width = -sp78.width;
sp78.flags |= FLAGS_MINUS;
}
fmt_ptr++;
} else {
ATOI(sp78.width, fmt_ptr);
}
if (*fmt_ptr != '.') {
sp78.precision = -1;
} else {
fmt_ptr++;
if (*fmt_ptr == '*') {
sp78.precision = va_arg(args, s32);
fmt_ptr++;
} else {
ATOI(sp78.precision, fmt_ptr);
}
}
if (strchr(length_str, *fmt_ptr) != NULL) {
sp78.length = *fmt_ptr++;
} else {
sp78.length = 0;
}
if (sp78.length == 'l' && *fmt_ptr == 'l') {
sp78.length = 'L';
fmt_ptr++;
}
_Putfld(&sp78, &args, *fmt_ptr, sp4c);
sp78.width -= sp78.part1_len + sp78.num_leading_zeros + sp78.part2_len + sp78.num_mid_zeros
+ sp78.part3_len + sp78.num_trailing_zeros;
_PAD(sp44, sp78.width, sp48, _spaces, !(sp78.flags & FLAGS_MINUS));
_PROUT(dst, (char *) sp4c, sp78.part1_len);
_PAD(sp3c, sp78.num_leading_zeros, sp40, _zeroes, 1);
_PROUT(dst, sp78.buff, sp78.part2_len);
_PAD(sp34, sp78.num_mid_zeros, sp38, _zeroes, 1);
_PROUT(dst, (char *) (&sp78.buff[sp78.part2_len]), sp78.part3_len)
_PAD(sp2c, sp78.num_trailing_zeros, sp30, _zeroes, 1);
_PAD(sp24, sp78.width, sp28, _spaces, sp78.flags & FLAGS_MINUS);
fmt = (char *) fmt_ptr + 1;
}
}
static void _Putfld(printf_struct *a0, va_list *args, u8 type, u8 *buff) {
a0->part1_len = a0->num_leading_zeros = a0->part2_len = a0->num_mid_zeros = a0->part3_len =
a0->num_trailing_zeros = 0;
switch (type) {
case 'c':
buff[a0->part1_len++] = va_arg(*args, u32);
break;
case 'd':
case 'i':
if (a0->length == 'l') {
a0->value.s64 = va_arg(*args, s32);
} else if (a0->length == 'L') {
a0->value.s64 = va_arg(*args, s64);
} else {
a0->value.s64 = va_arg(*args, s32);
}
if (a0->length == 'h') {
a0->value.s64 = (s16) a0->value.s64;
}
if (a0->value.s64 < 0) {
buff[a0->part1_len++] = '-';
} else if (a0->flags & FLAGS_PLUS) {
buff[a0->part1_len++] = '+';
} else if (a0->flags & FLAGS_SPACE) {
buff[a0->part1_len++] = ' ';
}
a0->buff = (char *) &buff[a0->part1_len];
_Litob(a0, type);
break;
case 'x':
case 'X':
case 'u':
case 'o':
if (a0->length == 'l') {
a0->value.s64 = va_arg(*args, s32);
} else if (a0->length == 'L') {
a0->value.s64 = va_arg(*args, s64);
} else {
a0->value.s64 = va_arg(*args, s32);
}
if (a0->length == 'h') {
a0->value.s64 = (u16) a0->value.s64;
} else if (a0->length == 0) {
a0->value.s64 = (u32) a0->value.s64;
}
if (a0->flags & FLAGS_HASH) {
buff[a0->part1_len++] = '0';
if (type == 'x' || type == 'X') {
buff[a0->part1_len++] = type;
}
}
a0->buff = (char *) &buff[a0->part1_len];
_Litob(a0, type);
break;
case 'e':
case 'f':
case 'g':
case 'E':
case 'G':
//... okay?
a0->value.f64 = a0->length == 'L' ? va_arg(*args, f64) : va_arg(*args, f64);
if (a0->value.u16 & 0x8000) {
buff[a0->part1_len++] = '-';
} else {
if (a0->flags & FLAGS_PLUS) {
buff[a0->part1_len++] = '+';
} else if (a0->flags & FLAGS_SPACE) {
buff[a0->part1_len++] = ' ';
}
}
a0->buff = (char *) &buff[a0->part1_len];
_Ldtob(a0, type);
break;
case 'n':
if (a0->length == 'h') {
*(va_arg(*args, u16 *)) = a0->size;
} else if (a0->length == 'l') {
*va_arg(*args, u32 *) = a0->size;
} else if (a0->length == 'L') {
*va_arg(*args, u64 *) = a0->size;
} else {
*va_arg(*args, u32 *) = a0->size;
}
break;
case 'p':
a0->value.s64 = (intptr_t) va_arg(*args, void *);
a0->buff = (char *) &buff[a0->part1_len];
_Litob(a0, 'x');
break;
case 's':
a0->buff = va_arg(*args, char *);
a0->part2_len = strlen(a0->buff);
if (a0->precision >= 0 && a0->part2_len > a0->precision) {
a0->part2_len = a0->precision;
}
break;
case '%':
buff[a0->part1_len++] = '%';
break;
default:
buff[a0->part1_len++] = type;
break;
}
}

View File

@@ -1,4 +1,5 @@
#include <ultra64.h>
#include <PR/os_internal_error.h>
#include <stdarg.h>
#include <string.h>
@@ -6,7 +7,7 @@
#if defined(TARGET_N64) && (defined(VERSION_EU) || defined(VERSION_SH))
#include "lib/src/printf.h"
#include "printf.h"
u8 gCrashScreenCharToGlyph[128] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,

View File

@@ -1,6 +0,0 @@
#ifndef DECOMPRESS_H
#define DECOMPRESS_H
void decompress(void *mio0, void *dest);
#endif // DECOMPRESS_H

View File

@@ -221,11 +221,25 @@ void create_task_structure(void) {
gGfxSPTask->msgqueue = &D_80339CB8;
gGfxSPTask->msg = (OSMesg) 2;
gGfxSPTask->task.t.type = M_GFXTASK;
gGfxSPTask->task.t.ucode_boot = rspF3DBootStart;
gGfxSPTask->task.t.ucode_boot_size = ((u8 *) rspF3DBootEnd - (u8 *) rspF3DBootStart);
gGfxSPTask->task.t.ucode_boot = rspbootTextStart;
gGfxSPTask->task.t.ucode_boot_size = ((u8 *) rspbootTextEnd - (u8 *) rspbootTextStart);
gGfxSPTask->task.t.flags = 0;
gGfxSPTask->task.t.ucode = rspF3DStart;
gGfxSPTask->task.t.ucode_data = rspF3DDataStart;
#ifdef F3DZEX_GBI_2
gGfxSPTask->task.t.ucode = gspF3DZEX2_PosLight_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DZEX2_PosLight_fifoDataStart;
#elif F3DEX_GBI_2
gGfxSPTask->task.t.ucode = gspF3DEX2_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DEX2_fifoDataStart;
#elif F3DEX_GBI
gGfxSPTask->task.t.ucode = gspF3DEX_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspF3DEX_fifoDataStart;
#elif SUPER3D_GBI
gGfxSPTask->task.t.ucode = gspSuper3D_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspSuper3D_fifoDataStart;
#else
gGfxSPTask->task.t.ucode = gspFast3D_fifoTextStart;
gGfxSPTask->task.t.ucode_data = gspFast3D_fifoDataStart;
#endif
gGfxSPTask->task.t.ucode_size = SP_UCODE_SIZE; // (this size is ignored)
gGfxSPTask->task.t.ucode_data_size = SP_UCODE_DATA_SIZE;
gGfxSPTask->task.t.dram_stack = (u64 *) gGfxSPTaskStack;
@@ -576,7 +590,7 @@ void setup_game_memory(void) {
set_segment_base_addr(24, (void *) D_80339CF4);
func_80278A78(&gDemo, gDemoInputs, D_80339CF4);
load_segment(0x10, _entrySegmentRomStart, _entrySegmentRomEnd, MEMORY_POOL_LEFT);
load_segment_decompress(2, _segment2_mio0SegmentRomStart, _segment2_mio0SegmentRomEnd);
load_segment_decompress(2, _segment2_yay0SegmentRomStart, _segment2_yay0SegmentRomEnd);
}
// main game loop thread. runs forever as long as the game

View File

@@ -1253,16 +1253,16 @@ s32 lvl_init_from_save_file(UNUSED s16 arg0, s32 levelNum) {
s16 var = eu_get_language();
switch (var) {
case LANGUAGE_ENGLISH:
load_segment_decompress(0x19, _translation_en_mio0SegmentRomStart,
_translation_en_mio0SegmentRomEnd);
load_segment_decompress(0x19, _translation_en_yay0SegmentRomStart,
_translation_en_yay0SegmentRomEnd);
break;
case LANGUAGE_FRENCH:
load_segment_decompress(0x19, _translation_fr_mio0SegmentRomStart,
_translation_fr_mio0SegmentRomEnd);
load_segment_decompress(0x19, _translation_fr_yay0SegmentRomStart,
_translation_fr_yay0SegmentRomEnd);
break;
case LANGUAGE_GERMAN:
load_segment_decompress(0x19, _translation_de_mio0SegmentRomStart,
_translation_de_mio0SegmentRomEnd);
load_segment_decompress(0x19, _translation_de_yay0SegmentRomStart,
_translation_de_yay0SegmentRomEnd);
break;
}
#endif

View File

@@ -1,4 +1,5 @@
#include <ultra64.h>
#include <PR/os_system.h>
#include <stdio.h>
#include "sm64.h"
@@ -415,22 +416,22 @@ void turn_off_audio(void) {
* Initialize hardware, start main thread, then idle.
*/
void thread1_idle(UNUSED void *arg) {
#if defined(VERSION_US) || defined(VERSION_SH)
s32 sp24 = osTvType;
#endif
osCreateViManager(OS_PRIORITY_VIMGR);
#if defined(VERSION_US) || defined(VERSION_SH)
if (sp24 == TV_TYPE_NTSC) {
switch ( osTvType ) {
case OS_TV_NTSC:
// NTSC
osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
} else {
osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]);
}
#elif defined(VERSION_JP)
osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]);
#else // VERSION_EU
osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]);
#endif
break;
case OS_TV_MPAL:
// MPAL
osViSetMode(&osViModeTable[OS_VI_MPAL_LAN1]);
break;
case OS_TV_PAL:
// PAL
osViSetMode(&osViModeTable[OS_VI_PAL_LAN1]);
break;
}
osViBlack(TRUE);
osViSetSpecialFeatures(OS_VI_DITHER_FILTER_ON);
osViSetSpecialFeatures(OS_VI_GAMMA_OFF);

View File

@@ -27,7 +27,7 @@ extern OSThread gSoundThread;
#ifdef VERSION_SH
extern OSThread gRumblePakThread;
extern s32 gRumblePakPfs; // Actually an OSPfs but we don't have that header yet
extern OSPfs gRumblePakPfs;
#endif
extern OSMesgQueue gPIMesgQueue;

View File

@@ -5,7 +5,7 @@
#define INCLUDED_FROM_MEMORY_C
#include "buffers/buffers.h"
#include "decompress.h"
#include "slidec.h"
#include "game_init.h"
#include "main.h"
#include "memory.h"
@@ -332,7 +332,7 @@ void *load_segment_decompress(s32 segment, u8 *srcStart, u8 *srcEnd) {
dma_read(compressed, srcStart, srcEnd);
dest = main_pool_alloc(*size, MEMORY_POOL_LEFT);
if (dest != NULL) {
decompress(compressed, dest);
slidstart(compressed, dest);
set_segment_base_addr(segment, dest);
main_pool_free(compressed);
} else {
@@ -350,7 +350,7 @@ void *load_segment_decompress_heap(u32 segment, u8 *srcStart, u8 *srcEnd) {
if (compressed != NULL) {
dma_read(compressed, srcStart, srcEnd);
decompress(compressed, gDecompressionHeap);
slidstart(compressed, gDecompressionHeap);
set_segment_base_addr(segment, gDecompressionHeap);
main_pool_free(compressed);
} else {

View File

@@ -1,5 +1,4 @@
#include <PR/ultratypes.h>
#include <PR/gbi.h>
#include <ultra64.h>
#include "config.h"
#include "game_init.h"

36
src/game/printf.h Normal file
View File

@@ -0,0 +1,36 @@
#ifndef _PRINTF_H_
#define _PRINTF_H_
#include <stdarg.h>
typedef struct
{
union {
/* 00 */ s64 s64;
u64 u64;
f64 f64;
u32 u32;
u16 u16;
} value;
/* 08 */ char *buff;
/* 0c */ s32 part1_len;
/* 10 */ s32 num_leading_zeros;
/* 14 */ s32 part2_len;
/* 18 */ s32 num_mid_zeros;
/* 1c */ s32 part3_len;
/* 20 */ s32 num_trailing_zeros;
/* 24 */ s32 precision;
/* 28 */ s32 width;
/* 2c */ u32 size;
/* 30 */ u32 flags;
/* 34 */ u8 length;
} printf_struct;
#define FLAGS_SPACE 1
#define FLAGS_PLUS 2
#define FLAGS_MINUS 4
#define FLAGS_HASH 8
#define FLAGS_ZERO 16
s32 _Printf(char *(*prout)(char *, const char *, size_t), char *dst, const char *fmt, va_list args);
void _Litob(printf_struct *args, u8 type);
void _Ldtob(printf_struct *args, u8 type);
#endif

View File

@@ -1,6 +1,4 @@
#include <PR/ultratypes.h>
#include <PR/os_time.h>
#include <PR/gbi.h>
#include <ultra64.h>
#include "sm64.h"
#include "profiler.h"

View File

@@ -9,7 +9,7 @@
OSThread gRumblePakThread;
s32 gRumblePakPfs; // Actually an OSPfs but we don't have that header yet
OSPfs gRumblePakPfs;
s8 D_SH_8031D8F8[0x60];
@@ -26,11 +26,6 @@ s32 sRumblePakActive = 0;
s32 sRumblePakErrorCount = 0;
s32 gRumblePakTimer = 0;
// These void* are OSPfs* but we don't have that header
extern s32 osMotorStop(void *);
extern s32 osMotorStart(void *);
extern u32 osMotorInit(OSMesgQueue *, void *, s32);
void init_rumble_pak_scheduler_queue(void) {
osCreateMesgQueue(&gRumblePakSchedulerMesgQueue, gRumblePakSchedulerMesgBuf, 1);
osSendMesg(&gRumblePakSchedulerMesgQueue, (OSMesg) 0, OS_MESG_NOBLOCK);

6
src/game/slidec.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef SLIDEC_H
#define SLIDEC_H
void slidstart(unsigned char*, unsigned char *);
#endif // SLIDEC_H