You've already forked Microtransactions64
mirror of
https://github.com/Print-and-Panic/Microtransactions64.git
synced 2026-01-21 10:17:19 -08:00
Port libultra and yay0 (shindou is broken currently)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
286
src/game/_Ldtob.c
Normal 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
58
src/game/_Litob.c
Normal 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
225
src/game/_Printf.c
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
#ifndef DECOMPRESS_H
|
||||
#define DECOMPRESS_H
|
||||
|
||||
void decompress(void *mio0, void *dest);
|
||||
|
||||
#endif // DECOMPRESS_H
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
36
src/game/printf.h
Normal 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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
6
src/game/slidec.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef SLIDEC_H
|
||||
#define SLIDEC_H
|
||||
|
||||
void slidstart(unsigned char*, unsigned char *);
|
||||
|
||||
#endif // SLIDEC_H
|
||||
Reference in New Issue
Block a user