Skip to content

Commit

Permalink
Print function mdebug (#90)
Browse files Browse the repository at this point in the history
* xprintf mdebug

* xlitob mdebug

* xldtob mdebug

* sprintf mdebug

* syncprintf mdebug

* ldouble + remove ultratypes.h from xstdio.h

* double only for IDO
  • Loading branch information
hensldm authored Nov 28, 2024
1 parent 6e861af commit 2717d45
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 125 deletions.
14 changes: 7 additions & 7 deletions src/libc/sprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
// TODO: this comes from a header
#ident "$Revision: 1.23 $"

static char* proutSprintf(char* dst, const char* src, size_t count);
static void* proutSprintf(void* s, const char* buf, size_t n);

int sprintf(char* dst, const char* fmt, ...) {
s32 ans;
int sprintf(char* s, const char* fmt, ...) {
int ans;
va_list ap;
va_start(ap, fmt);
ans = _Printf(proutSprintf, dst, fmt, ap);
ans = _Printf(proutSprintf, s, fmt, ap);
if (ans >= 0) {
dst[ans] = 0;
s[ans] = 0;
}
return ans;
}
static char* proutSprintf(char* dst, const char* src, size_t count) {
return (char*)memcpy((u8*)dst, (u8*)src, count) + count;
static void* proutSprintf(void* s, const char* buf, size_t n) {
return (char*)memcpy(s, buf, n) + n;
}
11 changes: 5 additions & 6 deletions src/libc/syncprintf.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "stdarg.h"
#include "PR/os.h"
#include "PR/os_internal.h"
#include "PR/rdb.h"
#include "xstdio.h"
#include "PR/rcp.h"
Expand All @@ -12,7 +13,7 @@ extern void* __printfunc;
extern u32 __kmc_pt_mode;

static void* proutSyncPrintf(void* str, const char* buf, size_t n) {
size_t sent = 0;
u32 sent = 0;

while (sent < n) {
sent += __osRdbSend(buf + sent, n - sent, RDB_TYPE_GtoH_PRINT);
Expand All @@ -25,8 +26,6 @@ static volatile unsigned int* wport = (unsigned*)0xbff08000;
static volatile unsigned int* piok = (unsigned*)PHYS_TO_K1(PI_STATUS_REG);

static void rmonPutchar(char c) {
u32 data;

while (*piok & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
}

Expand All @@ -44,7 +43,7 @@ static void* kmc_proutSyncPrintf(void* str, const char* buf, int n) {
char xbuf[128];
static int column = 0;

p = &xbuf;
p = xbuf;

for (i = 0; i < n; i++) {
c = *buf++;
Expand Down Expand Up @@ -117,12 +116,12 @@ void rmonPrintf(const char* fmt, ...) {

#else

void __osSyncVPrintf(const char* fmt, va_list args) {
void __osSyncVPrintf(const char* fmt, va_list ap) {

int ans;
#ifndef _FINALROM
if (__printfunc != NULL) {
ans = _Printf(__printfunc, NULL, fmt, args);
ans = _Printf(__printfunc, NULL, fmt, ap);
}
#endif
}
Expand Down
31 changes: 15 additions & 16 deletions src/libc/xldtob.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@

#define BUFF_LEN 0x20

static s16 _Ldunscale(s16* pex, _Pft* px);
static void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp);
static short _Ldunscale(short* pex, ldouble* px);
static void _Genld(_Pft* px, char code, unsigned char* p, short nsig, short xexp);

static const double pows[] = {10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L};
static const ldouble pows[] = {10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L};

// float properties
#define _D0 0
Expand Down Expand Up @@ -41,17 +41,16 @@ static const double pows[] = {10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L
#define _D2 2
#define _D3 3

#define ALIGN(s, align) (((u32)(s) + ((align)-1)) & ~((align)-1))
#define ALIGN(s, align) (((unsigned int)(s) + ((align)-1)) & ~((align)-1))

void _Ldtob(_Pft* px, char code) {
char buff[BUFF_LEN];
char *p;
f64 ldval;
s16 err;
s16 nsig;
s16 xexp;
ldouble ldval;
short err;
short nsig;
short xexp;

// char unused[0x4];
p = buff;
ldval = px->v.ld;

Expand All @@ -61,7 +60,7 @@ void _Ldtob(_Pft* px, char code) {
px->prec = 1;
}

err = _Ldunscale(&xexp, px);
err = _Ldunscale(&xexp, &px->v.ld);
if (err > 0) {
memcpy(px->s, err == 2 ? "NaN" : "Inf", px->n1 = 3);
return;
Expand All @@ -87,7 +86,7 @@ void _Ldtob(_Pft* px, char code) {
}
}
} else if (xexp > 0) {
f64 factor = 1;
ldouble factor = 1;

xexp &= ~3;

Expand Down Expand Up @@ -160,9 +159,9 @@ void _Ldtob(_Pft* px, char code) {
_Genld(px, code, p, nsig, xexp);
}

s16 _Ldunscale(s16* pex, _Pft* px) {
u16* ps = (u16*)px;
s16 xchar = (ps[_D0] & _DMASK) >> _DOFF;
short _Ldunscale(short* pex, ldouble* px) {
unsigned short* ps = (unsigned short*)px;
short xchar = (ps[_D0] & _DMASK) >> _DOFF;


if (xchar == _DMAX) {
Expand All @@ -181,7 +180,7 @@ s16 _Ldunscale(s16* pex, _Pft* px) {
}
}

void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) {
void _Genld(_Pft* px, char code, unsigned char* p, short nsig, short xexp) {
const unsigned char point = '.';

if (nsig <= 0) {
Expand Down Expand Up @@ -299,7 +298,7 @@ void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) {
}

if ((px->flags & 0x14) == 0x10) {
s32 n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2;
int n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2;

if (n < px->width) {
px->nz0 = px->width - n;
Expand Down
38 changes: 19 additions & 19 deletions src/libc/xlitob.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,47 +12,47 @@
static char ldigs[] = "0123456789abcdef";
static char udigs[] = "0123456789ABCDEF";

void _Litob(_Pft *args, char type) {
void _Litob(_Pft *px, char code) {
char buff[BUFF_LEN];
const char *digs;
s32 base;
s32 i;
int base;
int i;
unsigned long long ullval;

digs = (type == 'X') ? udigs : ldigs;
digs = (code == 'X') ? udigs : ldigs;

base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16);
base = (code == 'o') ? 8 : ((code != 'x' && code != 'X') ? 10 : 16);
i = BUFF_LEN;
ullval = args->v.ll;
ullval = px->v.ll;

if ((type == 'd' || type == 'i') && args->v.ll < 0) {
if ((code == 'd' || code == 'i') && px->v.ll < 0) {
ullval = -ullval;
}

if (ullval != 0 || args->prec != 0) {
if (ullval != 0 || px->prec != 0) {
buff[--i] = digs[ullval % base];
}

args->v.ll = ullval / base;
px->v.ll = ullval / base;

while (args->v.ll > 0 && i > 0) {
lldiv_t qr = lldiv(args->v.ll, base);
while (px->v.ll > 0 && i > 0) {
lldiv_t qr = lldiv(px->v.ll, base);

args->v.ll = qr.quot;
px->v.ll = qr.quot;
buff[--i] = digs[qr.rem];
}

args->n1 = BUFF_LEN - i;
px->n1 = BUFF_LEN - i;

memcpy(args->s, buff + i, args->n1);
memcpy(px->s, buff + i, px->n1);

if (args->n1 < args->prec) {
args->nz0 = args->prec - args->n1;
if (px->n1 < px->prec) {
px->nz0 = px->prec - px->n1;
}

if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
if ((i = args->width - args->n0 - args->nz0 - args->n1) > 0) {
args->nz0 += i;
if (px->prec < 0 && (px->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
if ((i = px->width - px->n0 - px->nz0 - px->n1) > 0) {
px->nz0 += i;
}
}
}
Loading

0 comments on commit 2717d45

Please sign in to comment.