The first commit

This commit is contained in:
Banjo Kazooie
2022-07-15 17:09:41 -05:00
commit dd13d34074
1087 changed files with 391897 additions and 0 deletions

40
src/done/bk_boot_1050.c Normal file
View File

@@ -0,0 +1,40 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "rarezip.h"
#define ENTRY_STACK_LEN 0x2000
#define ENTRY_STACK_LEN_U64 (ENTRY_STACK_LEN / sizeof(u64))
u64 gEntryStack[ENTRY_STACK_LEN_U64];
extern u8 core1_us_v10_rzip_ROM_START[];
extern u8 core1_us_v10_rzip_ROM_END[];
extern u8 D_8002D500;
extern u8 D_8023DA20;
extern u32 D_803FFE00[4];
void func_80000594(u8 *, u8 *);
void func_8023DA20(s32);
void func_80000450(s32 arg0){
u8 *tmp;
u8 *dst;
tmp = &D_8002D500;
dst = &D_8023DA20;
osInitialize();
osPiRawStartDma(OS_READ, core1_us_v10_rzip_ROM_START, tmp, core1_us_v10_rzip_ROM_END - core1_us_v10_rzip_ROM_START);
while(osPiGetStatus() & PI_STATUS_DMA_BUSY);
func_8000055C();
func_80000594(&tmp, &dst);
D_803FFE00[0] = crc1;
D_803FFE00[1] = crc2;
func_80000594(&tmp, &dst);
D_803FFE00[2] = crc1;
D_803FFE00[3] = crc2;
overlay_table_init();
(&func_8023DA20)(arg0);
}

34
src/done/cartrominit.c Normal file
View File

@@ -0,0 +1,34 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
OSPiHandle CartRomHandle;
OSPiHandle *osCartRomInit(void)
{
u32 domain;
u32 saveMask;
domain = 0;
if (CartRomHandle.baseAddress == PHYS_TO_K1(PI_DOM1_ADDR2))
return &CartRomHandle;
CartRomHandle.type = DEVICE_TYPE_CART;
CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2);
osPiRawReadIo(NULL, &domain);
CartRomHandle.latency = domain & 0xff;
CartRomHandle.pulse = (domain >> 8) & 0xff;
CartRomHandle.pageSize = (domain >> 0x10) & 0xf;
CartRomHandle.relDuration = (domain >> 0x14) & 0xf;
CartRomHandle.domain = PI_DOMAIN1;
CartRomHandle.speed = 0;
bzero(&CartRomHandle.transferInfo, sizeof(__OSTranxInfo));
saveMask = __osDisableInt();
CartRomHandle.next = __osPiTable;
__osPiTable = &CartRomHandle;
__osRestoreInt(saveMask);
return &CartRomHandle;
}

View File

@@ -0,0 +1,15 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
extern OSThread __osThreadTail;
void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg, s32 msgCount)
{
mq->mtqueue = (OSThread *)&__osThreadTail;
mq->fullqueue = (OSThread *)&__osThreadTail;
mq->validCount = 0;
mq->first = 0;
mq->msgCount = msgCount;
mq->msg = msg;
}

32
src/done/createthread.c Normal file
View File

@@ -0,0 +1,32 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#define __osCleanupThread __osCleanupThread
void __osCleanupThread(void);
extern OSThread *__osActiveQueue;
void osCreateThread(OSThread *t, OSId id, void (*entry)(void *), void *arg, void *sp, OSPri p)
{
register u32 saveMask;
OSIntMask mask;
t->id = id;
t->priority = p;
t->next = NULL;
t->queue = NULL;
t->context.pc = (u32)entry;
t->context.a0 = (u64)arg;
t->context.sp = (u64)sp - 16;
t->context.ra = (u64)__osCleanupThread;
mask = OS_IM_ALL;
t->context.sr = SR_IMASK | SR_EXL | SR_IE;
t->context.rcp = (mask & RCP_IMASK) >> RCP_IMASKSHIFT;
t->context.fpcsr = (u32)(FPCSR_FS | FPCSR_EV);
t->fp = 0;
t->state = OS_STATE_STOPPED;
t->flags = 0;
saveMask = __osDisableInt();
t->tlnext = __osActiveQueue;
__osActiveQueue = t;
__osRestoreInt(saveMask);
}

45
src/done/destroythread.c Normal file
View File

@@ -0,0 +1,45 @@
#include <ultra64.h>
#include "osint.h"
void osDestroyThread(OSThread *t)
{
register u32 saveMask;
register OSThread *pred;
register OSThread *succ;
saveMask = __osDisableInt();
if (t == NULL)
{
t = __osRunningThread;
}
else
{
if (t->state != OS_STATE_STOPPED)
{
__osDequeueThread(t->queue, t);
}
}
if (__osActiveQueue == t)
{
__osActiveQueue = __osActiveQueue->tlnext;
}
else
{
pred = __osActiveQueue;
succ = pred->tlnext;
while (succ)
{
if (succ == t)
{
pred->tlnext = t->tlnext;
break;
}
pred = succ;
succ = pred->tlnext;
}
}
if (t == __osRunningThread)
{
__osDispatchThread();
}
__osRestoreInt(saveMask);
}

113
src/done/devmgr.c Normal file
View File

@@ -0,0 +1,113 @@
#include <ultra64.h>
#include "piint.h"
void __osDevMgrMain(void *args)
{
OSIoMesg *mb;
OSMesg em;
OSMesg dummy;
s32 ret;
OSDevMgr *dm;
s32 messageSend;
messageSend = 0;
mb = NULL;
ret = 0;
dm = (OSDevMgr *)args;
while (TRUE)
{
osRecvMesg(dm->cmdQueue, (OSMesg)&mb, OS_MESG_BLOCK);
if (mb->piHandle != NULL &&
mb->piHandle->type == DEVICE_TYPE_64DD &&
(mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0 ||
mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_1))
{
__OSBlockInfo *blockInfo;
__OSTranxInfo *info;
info = &mb->piHandle->transferInfo;
blockInfo = &info->block[info->blockNum];
info->sectorNum = -1;
if (info->transferMode != LEO_SECTOR_MODE)
{
blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr - blockInfo->sectorSize);
}
if (info->transferMode == LEO_TRACK_MODE && mb->piHandle->transferInfo.cmdType == LEO_CMD_TYPE_0)
messageSend = 1;
else
messageSend = 0;
osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK);
__osResetGlobalIntMask(OS_IM_PI);
osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, (info->bmCtlShadow | 0x80000000));
while (TRUE)
{
osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK);
info = &mb->piHandle->transferInfo;
blockInfo = &info->block[info->blockNum];
if (blockInfo->errStatus == LEO_ERROR_29)
{
u32 stat;
osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET); //TODO: remove magic constants
osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow);
osEPiRawReadIo(mb->piHandle, LEO_STATUS, &stat);
if (stat & LEO_STATUS_MECHANIC_INTERRUPT) //TODO: remove magic constants
{
osEPiRawWriteIo(mb->piHandle, LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR);
}
blockInfo->errStatus = LEO_ERROR_4;
IO_WRITE(PI_STATUS_REG, PI_CLR_INTR);
__osSetGlobalIntMask(OS_IM_PI | SR_IBIT4);
}
osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
if (messageSend != 1)
break;
if (mb->piHandle->transferInfo.block[0].errStatus != LEO_ERROR_GOOD)
break;
messageSend = 0;
}
osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK);
if (mb->piHandle->transferInfo.blockNum == 1)
osYieldThread();
}
else
{
switch (mb->hdr.type)
{
case OS_MESG_TYPE_DMAREAD:
osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK);
ret = dm->dma(OS_READ, mb->devAddr, mb->dramAddr, mb->size);
break;
case OS_MESG_TYPE_DMAWRITE:
osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK);
ret = dm->dma(OS_WRITE, mb->devAddr, mb->dramAddr, mb->size);
break;
case OS_MESG_TYPE_EDMAREAD:
osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK);
ret = dm->edma(mb->piHandle, OS_READ, mb->devAddr, mb->dramAddr,
mb->size);
break;
case OS_MESG_TYPE_EDMAWRITE:
osRecvMesg(dm->acsQueue, &dummy, OS_MESG_BLOCK);
ret = dm->edma(mb->piHandle, OS_WRITE, mb->devAddr, mb->dramAddr,
mb->size);
break;
case OS_MESG_TYPE_LOOPBACK:
osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
ret = -1;
break;
default:
ret = -1;
break;
}
if (ret == 0)
{
osRecvMesg(dm->evtQueue, &em, OS_MESG_BLOCK);
osSendMesg(mb->hdr.retQueue, mb, OS_MESG_NOBLOCK);
osSendMesg(dm->acsQueue, NULL, OS_MESG_NOBLOCK);
}
}
}
}

29
src/done/epirawdma.c Normal file
View File

@@ -0,0 +1,29 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "piint.h"
extern OSPiHandle *__osCurrentHandle[2];
s32 osEPiRawStartDma(OSPiHandle *pihandle, s32 direction, u32 devAddr, void *dramAddr, u32 size)
{
u32 stat;
u32 domain;
EPI_SYNC(pihandle, stat, domain);
IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr));
IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS(pihandle->baseAddress | devAddr));
switch (direction)
{
case OS_READ:
IO_WRITE(PI_WR_LEN_REG, size - 1);
break;
case OS_WRITE:
IO_WRITE(PI_RD_LEN_REG, size - 1);
break;
default:
return -1;
}
return 0;
}

14
src/done/epirawread.c Normal file
View File

@@ -0,0 +1,14 @@
#include <os_internal.h>
#include <rcp.h>
#include "piint.h"
s32 osEPiRawReadIo(OSPiHandle *pihandle, u32 devAddr, u32 *data)
{
register u32 stat;
register u32 domain;
WAIT_ON_IOBUSY(stat);
*data = IO_READ(pihandle->baseAddress | devAddr);
return 0;
}

13
src/done/epirawwrite.c Normal file
View File

@@ -0,0 +1,13 @@
#include <os_internal.h>
#include "piint.h"
s32 osEPiRawWriteIo(OSPiHandle *pihandle, u32 devAddr, u32 data)
{
register u32 stat;
register u32 domain;
WAIT_ON_IOBUSY(stat);
IO_WRITE(pihandle->baseAddress | devAddr, data);
return 0;
}

11
src/done/getthreadpri.c Normal file
View File

@@ -0,0 +1,11 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "osint.h"
OSPri osGetThreadPri(OSThread *thread)
{
if (thread == NULL)
thread = __osRunningThread;
return thread->priority;
}

588
src/done/inflate.c Normal file
View File

@@ -0,0 +1,588 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "rarezip.h"
u8 border[] = { /* Order of the bit length code lengths */
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
/*static*/ u16 cplens[] = { /* Copy lengths for literal codes 257..285 */
3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
/* note: see note #13 above about the 258 in this list. */
/*static*/ u8 cplext[] = { /* Extra bits for literal codes 257..285 */
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99}; /* 99==invalid */
/*static*/ u16 cpdist[] = { /* Copy offsets for distance codes 0..29 */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
8193, 12289, 16385, 24577};
/*static*/ u8 cpdext[] = { /* Extra bits for distance codes */
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
12, 12, 13, 13};
u16 mask_bits[] = {
0x0000,
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
};
s32 lbits = 9;
s32 dbits = 6;
u8 *inbuf;
u8 *D_80007284;
u32 inptr;
u32 wp;
struct huft *D_80007290; //unk
u32 bb;
u32 bk;
u32 crc1;
u32 crc2;
u32 hufts;
int huft_build(b, n, s, d, e, t, m)
unsigned *b; /* code lengths in bits (all assumed <= BMAX) */
unsigned n; /* number of codes (assumed <= N_MAX) */
unsigned s; /* number of simple-valued codes (0..s-1) */
u16 *d; /* list of base values for non-simple codes */
u16 *e; /* list of extra bits for non-simple codes */
struct huft **t; /* result: starting table */
int *m; /* maximum lookup bits, returns actual */
/* Given a list of code lengths and a maximum table size, make a set of
tables to decode that set of codes. Return zero on success, one if
the given code set is incomplete (the tables are still built in this
case), two if the input is invalid (all zero length codes or an
oversubscribed set of lengths), and three if not enough memory. */
{
unsigned a; /* counter for codes of length k */
unsigned c[BMAX+1]; /* bit length count table */
unsigned f; /* i repeats in table every f entries */
int g; /* maximum code length */
int h; /* table level */
register unsigned i; /* counter, current code */
register unsigned j; /* counter */
register int k; /* number of bits in current code */
int l; /* bits per table (returned in m) */
register unsigned *p; /* pointer into c[], b[], or v[] */
register struct huft *q; /* points to current table */
struct huft r; /* table entry for structure assignment */
struct huft *u[BMAX]; /* table stack */
unsigned v[N_MAX]; /* values in order of bit length */
register int w; /* bits before this table == (l * h) */
unsigned x[BMAX+1]; /* bit offsets, then code stack */
unsigned *xp; /* pointer into x */
int y; /* number of dummy codes added */
unsigned z; /* number of entries in current table */
/* Generate counts for each bit length */
bzero(c, sizeof(c));
p = b; i = n;
do {
c[*p]++; /* assume all entries <= BMAX */
p++; /* Can't combine with above line (Solaris bug) */
} while (--i);
if (c[0] == n) /* null input--all zero length codes */
{
*t = (struct huft *)NULL;
*m = 0;
return 0;
}
/* Find minimum and maximum length, bound *m by those */
l = *m;
for (j = 1; j <= BMAX; j++)
if (c[j])
break;
k = j; /* minimum code length */
if ((unsigned)l < j)
l = j;
for (i = BMAX; i; i--)
if (c[i])
break;
g = i; /* maximum code length */
if ((unsigned)l > i)
l = i;
*m = l;
/* Adjust last length count to fill out codes, if needed */
for (y = 1 << j; j < i; j++, y <<= 1){
(y -= c[j]);
}
y -= c[i];
c[i] += y;
/* Generate starting offsets into the value table for each length */
x[1] = j = 0;
p = c + 1; xp = x + 2;
while (--i) { /* note that i == g from above */
*xp++ = (j += *p++);
}
/* Make a table of values in order of bit lengths */
p = b; i = 0;
do {
if ((j = *p++) != 0)
v[x[j]++] = i;
} while (++i < n);
/* Generate the Huffman codes and for each, make the table entries */
x[0] = i = 0; /* first Huffman code is zero */
p = v; /* grab values in bit order */
h = -1; /* no tables yet--level -1 */
w = -l; /* bits decoded == (l * h) */
u[0] = (struct huft *)NULL; /* just to keep compilers happy */
q = (struct huft *)NULL; /* ditto */
z = 0; /* ditto */
/* go through the bit lengths (k already is bits in shortest code) */
for (; k <= g; k++)
{
a = c[k];
while (a--)
{
/* here i is the Huffman code of length k bits for value *p */
/* make tables up to required level */
while (k > w + l)
{
h++;
w += l; /* previous table always l bits */
/* compute minimum size table less than or equal to l bits */
z = (z = g - w) > (unsigned)l ? l : z; /* upper limit on table size */
if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
{ /* too few codes for k-w bit table */
f -= a + 1; /* deduct codes from patterns left */
xp = c + k;
while (++j < z) /* try smaller tables up to z bits */
{
if ((f <<= 1) <= *++xp)
break; /* enough codes to use up j bits */
f -= *xp; /* else deduct codes from patterns */
}
}
z = 1 << j; /* table entries for j-bit table */
/* allocate and link in new table */
q = D_80007290 + hufts;
hufts += z + 1; /* track memory usage */
*t = q + 1; /* link to list for huft_free() */
*(t = &(q->v.t)) = (struct huft *)NULL;
u[h] = ++q; /* table starts after link */
/* connect to last table, if there is one */
if (h)
{
x[h] = i; /* save pattern for backing up */
r.b = (u8)l; /* bits to dump before this table */
r.e = (u8)(16 + j); /* bits in this table */
r.v.t = q; /* pointer to this table */
j = i >> (w - l); /* (get around Turbo C bug) */
u[h-1][j] = r; /* connect to last table */
}
}
/* set up table entry in r */
r.b = (u8)(k - w);
if (p >= v + n)
r.e = 99; /* out of values--invalid code */
else if (*p < s)
{
r.e = (u8)(*p < 256 ? 16 : 15); /* 256 is end-of-block code */
r.v.n = *p; /* simple code is just the value */
p++; /* one compiler does not like *p++ */
}
else
{
r.e = *((u8 *)e + (*p - s)); /* non-simple--look up in lists */
r.v.n = d[*p++ - s];
}
/* fill code-like entries with r */
f = 1 << (k - w);
for (j = i >> w; j < z; j += f)
q[j] = r;
/* backwards increment the k-bit code i */
for (j = 1 << (k - 1); i & j; j >>= 1)
i ^= j;
i ^= j;
/* backup over finished tables */
while ((i & ((1 << w) - 1)) != x[h])
{
h--; /* don't need to update q */
w -= l;
}
}
}
/* Return true (1) if we were given an incomplete table */
return y != 0 && g != 1;
}
//^inflate_codes
/* static */ int inflate_codes(struct huft *tl, struct huft *td, s32 bl, s32 bd)
{
register unsigned e; /* table entry flag/number of extra bits */
unsigned n, d; /* length and index for copy */
unsigned w; /* current window position */
struct huft *t; /* pointer to table entry */
unsigned ml, md; /* masks for bl and bd bits */
register u32 b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
register u8 tmp;
/* make local copies of globals */
b = bb; /* initialize bit buffer */
k = bk;
w = wp; /* initialize window position */
/* inflate the coded data */
ml = mask_bits[bl]; /* precompute masks for speed */
md = mask_bits[bd];
for (;;) /* do until end of block */
{//L80000D78
NEEDBITS((unsigned)bl)
if ((e = (t = tl + ((unsigned)b & ml))->e) > 16)
do {
DUMPBITS(t->b)
e -= 16;
NEEDBITS(e)
} while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
DUMPBITS(t->b)
if (e == 16) /* then it's a literal */
{
tmp = (u8)t->v.n;
D_80007284[w++] = tmp;
crc1 += tmp;
crc2 ^= tmp << (crc1 & 0x17);
}
else /* it's an EOB or a length */
{//L80000EAC
/* exit if end of block */
if (e == 15)
break;
/* get length of block to copy */
NEEDBITS(e) //L80000EAC - L80000ED8
n = t->v.n + ((unsigned)b & mask_bits[e]);
DUMPBITS(e);
/* decode distance of block to copy */
NEEDBITS((unsigned)bd)//L80000F04 - L80000F2C
if ((e = (t = td + ((unsigned)b & md))->e) > 16)
do {
DUMPBITS(t->b)
e -= 16;
NEEDBITS(e)
} while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);
//L80000FC8
DUMPBITS(t->b)
NEEDBITS(e) //L80000FE0 - L80001008
d = w - t->v.n - ((unsigned)b & mask_bits[e]);
DUMPBITS(e)
/* do the copy */
do{
tmp = D_80007284[d++];
D_80007284[w++] = tmp;
crc1 += tmp;
crc2 ^= tmp << (crc1 & 0x17);
}while(--n);
}
}
/* restore the globals from the locals */
wp = w; /* restore global window pointer */
bb = b; /* restore global bit buffer */
bk = k;
/* done */
return 0;
}
/* static */ int inflate_stored(void)
/* "decompress" an inflated type 0 (stored) block. */
{
unsigned n; /* number of bytes in block */
unsigned w; /* current window position */
register u32 b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
/* make local copies of globals */
b = bb; /* initialize bit buffer */
k = bk;
w = wp; /* initialize window position */
/* go to byte boundary */
n = k & 7;
DUMPBITS(n);
/* get the length and its complement */
NEEDBITS(16)
n = ((unsigned)b & 0xffff);
DUMPBITS(16)
NEEDBITS(16)
DUMPBITS(16)
/* read and output the compressed data */
while (n--)
{
NEEDBITS(8)
D_80007284[w++] = (u8) b;
crc1 += b & 0xFF;
crc2 ^= (b &0xFF) << (crc1 & 0x17);
DUMPBITS(8)
}
/* restore the globals from the locals */
wp = w; /* restore global window pointer */
bb = b; /* restore global bit buffer */
bk = k;
return 0;
}
/* static */ int inflate_fixed(void)
/* decompress an inflated type 1 (fixed Huffman codes) block. We should
either replace this with a custom decoder, or at least precompute the
Huffman tables. */
{
int i; /* temporary variable */
struct huft *tl; /* literal/length code table */
struct huft *td; /* distance code table */
int bl; /* lookup bits for tl */
int bd; /* lookup bits for td */
unsigned l[288]; /* length list for huft_build */
/* set up literal table */
for (i = 0; i < 144; i++)
l[i] = 8;
for (; i < 256; i++)
l[i] = 9;
for (; i < 280; i++)
l[i] = 7;
for (; i < 288; i++) /* make a complete, but wrong code set */
l[i] = 8;
bl = 7;
huft_build(l, 288, 257, cplens, cplext, &tl, &bl);
/* set up distance table */
for (i = 0; i < 30; i++) /* make an incomplete code set */
l[i] = 5;
bd = 5;
huft_build(l, 30, 0, cpdist, cpdext, &td, &bd);
/* decompress until an end-of-block code */
inflate_codes(tl, td, bl, bd);
return 0;
}
/* static */ int inflate_dynamic(void)/* decompress an inflated type 2 (dynamic Huffman codes) block. */
{
int i; /* temporary variables */
unsigned j;
unsigned l; /* last length */
unsigned m; /* mask for bit lengths table */
unsigned n; /* number of lengths to get */
struct huft *tl; /* literal/length code table */
struct huft *td; /* distance code table */
int bl; /* lookup bits for tl */
int bd; /* lookup bits for td */
unsigned nb; /* number of bit length codes */
unsigned nl; /* number of literal/length codes */
unsigned nd; /* number of distance codes */
register unsigned k; /* number of bits in bit buffer */
register u32 b; /* bit buffer */
unsigned ll[286+30]; /* literal/length and distance code lengths */
/* make local bit buffer */
b = bb;
k = bk;
/* read in table lengths */
NEEDBITS(5)
nl = 257 + ((unsigned)b & 0x1f); /* number of literal/length codes */
DUMPBITS(5)
NEEDBITS(5)
nd = 1 + ((unsigned)b & 0x1f); /* number of distance codes */
DUMPBITS(5)
NEEDBITS(4)
nb = 4 + ((unsigned)b & 0xf); /* number of bit length codes */
DUMPBITS(4)
/* read in bit-length-code lengths */
for (j = 0; j < nb; j++)
{
NEEDBITS(3)
ll[border[j]] = (unsigned)b & 7;
DUMPBITS(3)
}
for (; j < 19; j++)
ll[border[j]] = 0;
/* build decoding table for trees--single level, 7 bit lookup */
bl = 7;
huft_build(ll, 19, 19, NULL, NULL, &tl, &bl);
/* read in literal and distance code lengths */
n = nl + nd;
m = mask_bits[bl];
i = l = 0;
while ((unsigned)i < n)
{
NEEDBITS((unsigned)bl)
j = (td = tl + ((unsigned)b & m))->b;
DUMPBITS(j)
j = td->v.n;
if (j < 16) /* length of code in bits (0..15) */
ll[i++] = l = j; /* save last length in l */
else if (j == 16) /* repeat last length 3 to 6 times */
{
NEEDBITS(2)
j = 3 + ((unsigned)b & 3);
DUMPBITS(2)
while (j--)
ll[i++] = l;
}
else if (j == 17) /* 3 to 10 zero length codes */
{
NEEDBITS(3)
j = 3 + ((unsigned)b & 7);
DUMPBITS(3)
while (j--)
ll[i++] = 0;
l = 0;
}
else /* j == 18: 11 to 138 zero length codes */
{
NEEDBITS(7)
j = 11 + ((unsigned)b & 0x7f);
DUMPBITS(7)
while (j--)
ll[i++] = 0;
l = 0;
}
}
/* restore the global bit buffer */
bb = b;
bk = k;
/* build the decoding tables for literal/length and distance codes */
bl = lbits;
huft_build(ll, nl, 257, cplens, cplext, &tl, &bl);
bd = dbits;
huft_build(ll + nl, nd, 0, cpdist, cpdext, &td, &bd);
/* decompress until an end-of-block code */
inflate_codes(tl, td, bl, bd);
return 0;
}
/* static */ int inflate_block(int *e)
/* decompress an inflated block */
{
u32 t; /* block type */
register u32 b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
/* make local bit buffer */
b = bb;
k = bk;
/* read in last block bit */
NEEDBITS(1)
*e = (int)b & 1;
DUMPBITS(1)
/* read in block type */
NEEDBITS(2)
t = (unsigned)b & 3;
DUMPBITS(2)
/* restore the global bit buffer */
bb = b;
bk = k;
/* inflate that block type */
if (t == 2)
return inflate_dynamic();
if (t == 0)
return inflate_stored();
if (t == 1)
return inflate_fixed();
/* bad block type */
return 2;
}
/* decompress an inflated entry */
int bkboot_inflate(void) //int inflate()
{
int e; /* last block flag */
int r; /* result code */
unsigned h; /* maximum struct huft's malloc'ed */
/* initialize window, bit buffer */
wp = 0;
bk = 0;
bb = 0;
crc1 = 0;
crc2 = -1;
/* decompress until the last block */
h = 0;
do {
hufts = 0;
if ((r = inflate_block(&e)) != 0)
return r;
if (hufts > h)
h = hufts;
} while (!e);
/* Undo too much lookahead. The next read will be byte aligned so we
* can discard unused bits in the last meaningful byte.
*/
while (bk >= 8) {
bk -= 8;
inptr--;
}
/* return success */
#ifdef DEBUG
fprintf(stderr, "<%u> ", h);
#endif /* DEBUG */
return 0;
}

68
src/done/initialize.c Normal file
View File

@@ -0,0 +1,68 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
OSTime osClockRate = OS_CLOCK_RATE;
s32 osViClock = VI_NTSC_CLOCK;
u32 __osShutdown = 0;
u32 __OSGlobalIntMask = OS_IM_ALL;
u32 __osFinalrom;
typedef struct
{
/* 0x0 */ unsigned int inst1;
/* 0x4 */ unsigned int inst2;
/* 0x8 */ unsigned int inst3;
/* 0xC */ unsigned int inst4;
} __osExceptionVector;
extern __osExceptionVector __osExceptionPreamble;
// osInitialize
void __osInitialize_common()
{
u32 pifdata;
u32 clock = 0;
__osFinalrom = TRUE;
__osSetSR(__osGetSR() | SR_CU1); //enable fpu
__osSetFpcCsr(FPCSR_FS | FPCSR_EV); //flush denorm to zero, enable invalid operation
while (__osSiRawReadIo(PIF_RAM_END - 3, &pifdata)) //last byte of joychannel ram
{
;
}
while (__osSiRawWriteIo(PIF_RAM_END - 3, pifdata | 8))
{
; //todo: magic contant
}
*(__osExceptionVector *)UT_VEC = __osExceptionPreamble;
*(__osExceptionVector *)XUT_VEC = __osExceptionPreamble;
*(__osExceptionVector *)ECC_VEC = __osExceptionPreamble;
*(__osExceptionVector *)E_VEC = __osExceptionPreamble;
osWritebackDCache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector));
osInvalICache((void *)UT_VEC, E_VEC - UT_VEC + sizeof(__osExceptionVector));
osMapTLBRdb();
osPiRawReadIo(4, &clock); //TODO: remove magic constant;
clock &= ~0xf; //clear lower 4 bits
if (clock != 0)
{
osClockRate = clock;
}
osClockRate = osClockRate * 3 / 4;
if (osResetType == 0 /*cold reset */)
{
bzero(osAppNMIBuffer, OS_APP_NMI_BUFSIZE);
}
if (osTvType == OS_TV_PAL)
{
osViClock = VI_PAL_CLOCK;
}
else if (osTvType == OS_TV_MPAL)
{
osViClock = VI_MPAL_CLOCK;
}
else
{
osViClock = VI_NTSC_CLOCK;
}
}

3
src/done/kdebugserver.c Normal file
View File

@@ -0,0 +1,3 @@
#include <os_internal.h>
OSThread __osThreadSave;

29
src/done/leodiskinit.c Normal file
View File

@@ -0,0 +1,29 @@
#include <os_internal.h>
#include <rcp.h>
#include <os_libc.h>
OSPiHandle LeoDiskHandle;
OSPiHandle *__osDiskHandle;
OSPiHandle *osLeoDiskInit()
{
u32 saveMask;
LeoDiskHandle.type = DEVICE_TYPE_64DD;
LeoDiskHandle.baseAddress = PHYS_TO_K1(PI_DOM2_ADDR1);
LeoDiskHandle.latency = 3;
LeoDiskHandle.pulse = 6;
LeoDiskHandle.pageSize = 6;
LeoDiskHandle.relDuration = 2;
LeoDiskHandle.domain = PI_DOMAIN2;
IO_WRITE(PI_BSD_DOM2_LAT_REG, LeoDiskHandle.latency);
IO_WRITE(PI_BSD_DOM2_PWD_REG, LeoDiskHandle.pulse);
IO_WRITE(PI_BSD_DOM2_PGS_REG, LeoDiskHandle.pageSize);
IO_WRITE(PI_BSD_DOM2_RLS_REG, LeoDiskHandle.relDuration);
LeoDiskHandle.speed = 0;
bzero(&LeoDiskHandle.transferInfo, sizeof(__OSTranxInfo));
saveMask = __osDisableInt();
LeoDiskHandle.next = __osPiTable;
__osPiTable = &LeoDiskHandle;
__osDiskHandle = &LeoDiskHandle;
__osRestoreInt(saveMask);
return &LeoDiskHandle;
}

215
src/done/leointerrupt.c Normal file
View File

@@ -0,0 +1,215 @@
#include <ultra64.h>
#include "osint.h"
#include "piint.h"
#define WAIT_ON_IOBUSY2(stat) \
stat = IO_READ(PI_STATUS_REG); \
while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \
stat = IO_READ(PI_STATUS_REG);
static void __osLeoResume(void);
static void __osLeoAbnormalResume(void);
extern OSThread *__osRunQueue;
extern OSIntMask __OSGlobalIntMask;
extern OSPiHandle *__osDiskHandle;
u8 leoDiskStack[OS_PIM_STACKSIZE];
s32 __osLeoInterrupt()
{
u32 stat;
volatile u32 pi_stat;
u32 bm_stat;
__OSTranxInfo *info;
__OSBlockInfo *blockInfo;
stat = 0;
info = &__osDiskHandle->transferInfo;
blockInfo = &info->block[info->blockNum];
pi_stat = IO_READ(PI_STATUS_REG);
if (pi_stat & PI_STATUS_DMA_BUSY)
{
__OSGlobalIntMask = __OSGlobalIntMask & ~SR_IBIT4; //cartridge interrupt
blockInfo->errStatus = LEO_ERROR_29;
__osLeoResume();
return 1;
}
WAIT_ON_IOBUSY(pi_stat);
stat = IO_READ(LEO_STATUS);
if (stat & LEO_STATUS_MECHANIC_INTERRUPT)
{
WAIT_ON_IOBUSY(pi_stat);
IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_CLR_MECHANIC_INTR);
blockInfo->errStatus = LEO_ERROR_GOOD;
return 0;
}
if (info->cmdType == LEO_CMD_TYPE_2)
return 1;
if (stat & LEO_STATUS_BUFFER_MANAGER_ERROR)
{
WAIT_ON_IOBUSY(pi_stat);
stat = IO_READ(LEO_STATUS);
blockInfo->errStatus = LEO_ERROR_22;
__osLeoResume();
IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
__OSGlobalIntMask |= OS_IM_PI;
return 1;
}
if (info->cmdType == LEO_CMD_TYPE_1)
{
if ((stat & LEO_STATUS_DATA_REQUEST) == 0)
{
if (info->sectorNum + 1 != info->transferMode * 85)
{
blockInfo->errStatus = LEO_ERROR_24;
__osLeoAbnormalResume();
return 1;
}
IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
__OSGlobalIntMask |= OS_IM_PI;
blockInfo->errStatus = LEO_ERROR_GOOD;
__osLeoResume();
return 1;
}
blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr + blockInfo->sectorSize);
info->sectorNum++;
osEPiRawStartDma(__osDiskHandle, OS_WRITE, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize);
return 1;
}
if (info->cmdType == LEO_CMD_TYPE_0)
{
if (info->transferMode == LEO_SECTOR_MODE)
{
if ((s32)blockInfo->C1ErrNum + 17 < info->sectorNum)
{
blockInfo->errStatus = LEO_ERROR_GOOD;
__osLeoAbnormalResume();
return 1;
}
if ((stat & LEO_STATUS_DATA_REQUEST) == 0)
{
blockInfo->errStatus = LEO_ERROR_23;
__osLeoAbnormalResume();
return 1;
}
}
else
{
blockInfo->dramAddr = (void *)((u32)blockInfo->dramAddr + blockInfo->sectorSize);
}
bm_stat = IO_READ(LEO_BM_STATUS);
if ((bm_stat & LEO_BM_STATUS_C1SINGLE && bm_stat & LEO_BM_STATUS_C1DOUBLE) || bm_stat & LEO_BM_STATUS_MICRO)
{
if (blockInfo->C1ErrNum > 3)
{
if (info->transferMode != LEO_SECTOR_MODE || info->sectorNum > 0x52)
{
blockInfo->errStatus = LEO_ERROR_23;
__osLeoAbnormalResume();
return 1;
}
}
else
{
int errNum = blockInfo->C1ErrNum;
blockInfo->C1ErrSector[errNum] = info->sectorNum + 1;
}
blockInfo->C1ErrNum += 1;
}
if (stat & LEO_STATUS_C2_TRANSFER)
{
if (info->sectorNum + 1 != 88)
{
blockInfo->errStatus = LEO_ERROR_24;
__osLeoAbnormalResume();
}
if (info->transferMode == LEO_TRACK_MODE && info->blockNum == 0)
{
info->blockNum = 1;
info->sectorNum = -1;
info->block[1].dramAddr = (void *)((u32)info->block[1].dramAddr - info->block[1].sectorSize);
blockInfo->errStatus = LEO_ERROR_22;
}
else
{
IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
__OSGlobalIntMask |= OS_IM_PI;
info->cmdType = LEO_CMD_TYPE_2;
blockInfo->errStatus = LEO_ERROR_GOOD;
}
osEPiRawStartDma(__osDiskHandle, OS_READ, LEO_C2_BUFF, blockInfo->C2Addr, blockInfo->sectorSize * 4);
return 1;
}
if (info->sectorNum == -1 && info->transferMode == LEO_TRACK_MODE && info->blockNum == 1)
{
__OSBlockInfo *bptr = &info->block[0];
if (bptr->C1ErrNum == 0)
{
if (((u32 *)bptr->C2Addr)[0] | ((u32 *)bptr->C2Addr)[1] | ((u32 *)bptr->C2Addr)[2] | ((u32 *)bptr->C2Addr)[3])
{
bptr->errStatus = LEO_ERROR_24;
__osLeoAbnormalResume();
return 1;
}
}
bptr->errStatus = 0;
__osLeoResume();
}
info->sectorNum++;
if (stat & LEO_STATUS_DATA_REQUEST)
{
if (info->sectorNum > 0x54)
{
blockInfo->errStatus = LEO_ERROR_24;
__osLeoAbnormalResume();
return 1;
}
osEPiRawStartDma(__osDiskHandle, 0, LEO_SECTOR_BUFF, blockInfo->dramAddr, blockInfo->sectorSize);
blockInfo->errStatus = LEO_ERROR_GOOD;
return 1;
}
if (info->sectorNum <= 0x54)
{
blockInfo->errStatus = LEO_ERROR_24;
__osLeoAbnormalResume();
return 1;
}
return 1;
}
blockInfo->errStatus = LEO_ERROR_4;
__osLeoAbnormalResume();
return 1;
}
static void __osLeoAbnormalResume(void)
{
__OSTranxInfo *info;
u32 pi_stat;
info = &__osDiskHandle->transferInfo;
pi_stat = pi_stat;
WAIT_ON_IOBUSY2(pi_stat);
IO_WRITE(LEO_BM_CTL, info->bmCtlShadow | LEO_BM_CTL_RESET);
WAIT_ON_IOBUSY2(pi_stat);
IO_WRITE(LEO_BM_CTL, info->bmCtlShadow);
__osLeoResume();
IO_WRITE(PI_STATUS_REG, PI_STATUS_CLR_INTR);
__OSGlobalIntMask |= OS_IM_PI;
}
static void __osLeoResume(void)
{
__OSEventState *es;
OSMesgQueue *mq;
s32 last;
es = &__osEventStateTab[OS_EVENT_PI];
mq = es->messageQueue;
if (mq == NULL || MQ_IS_FULL(mq))
return;
last = (mq->first + mq->validCount) % mq->msgCount;
mq->msg[last] = es->message;
mq->validCount++;
if (mq->mtqueue->next != NULL)
__osEnqueueThread(&__osRunQueue, __osPopThread(&mq->mtqueue));
}

57
src/done/ll.c Normal file
View File

@@ -0,0 +1,57 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
unsigned long long __ull_rshift(unsigned long long a0, unsigned long long a1)
{
return a0 >> a1;
}
unsigned long long __ull_rem(unsigned long long a0, unsigned long long a1)
{
return a0 % a1;
}
unsigned long long __ull_div(unsigned long long a0, unsigned long long a1)
{
return a0 / a1;
}
unsigned long long __ll_lshift(unsigned long long a0, unsigned long long a1)
{
return a0 << a1;
}
long long __ll_rem(unsigned long long a0, long long a1)
{
return a0 % a1;
}
long long __ll_div(long long a0, long long a1)
{
return a0 / a1;
}
unsigned long long __ll_mul(unsigned long long a0, unsigned long long a1)
{
return a0 * a1;
}
void __ull_divremi(unsigned long long *div, unsigned long long *rem, unsigned long long a2, unsigned short a3)
{
*div = a2 / a3;
*rem = a2 % a3;
}
long long __ll_mod(long long a0, long long a1)
{
long long tmp = a0 % a1;
if ((tmp < 0 && a1 > 0) || (tmp > 0 && a1 < 0))
{
tmp += a1;
}
return tmp;
}
long long __ll_rshift(long long a0, long long a1)
{
return a0 >> a1;
}

44
src/done/overlays.c Normal file
View File

@@ -0,0 +1,44 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#define OVERLAY(ovl, _) \
extern u8 ovl##_us_v10_rzip_ROM_START[]; \
extern u8 ovl##_us_v10_rzip_ROM_END[];
#include <overlays.h>
#undef OVERLAY
// This doesn't match as macros, even if two macros are used per overlay.
// Look into autogenerating this table in the long run for a cleaner solution.
void overlay_table_init(void) {
gOverlayTable[ 0].start = core2_us_v10_rzip_ROM_START;
gOverlayTable[ 0].end = core2_us_v10_rzip_ROM_END;
gOverlayTable[ 1].start = emptyLvl_us_v10_rzip_ROM_START;
gOverlayTable[ 1].end = emptyLvl_us_v10_rzip_ROM_END;
gOverlayTable[ 2].start = CC_us_v10_rzip_ROM_START;
gOverlayTable[ 2].end = CC_us_v10_rzip_ROM_END;
gOverlayTable[ 3].start = MMM_us_v10_rzip_ROM_START;
gOverlayTable[ 3].end = MMM_us_v10_rzip_ROM_END;
gOverlayTable[ 4].start = GV_us_v10_rzip_ROM_START;
gOverlayTable[ 4].end = GV_us_v10_rzip_ROM_END;
gOverlayTable[ 5].start = TTC_us_v10_rzip_ROM_START;
gOverlayTable[ 5].end = TTC_us_v10_rzip_ROM_END;
gOverlayTable[ 6].start = MM_us_v10_rzip_ROM_START;
gOverlayTable[ 6].end = MM_us_v10_rzip_ROM_END;
gOverlayTable[ 7].start = BGS_us_v10_rzip_ROM_START;
gOverlayTable[ 7].end = BGS_us_v10_rzip_ROM_END;
gOverlayTable[ 8].start = RBB_us_v10_rzip_ROM_START;
gOverlayTable[ 8].end = RBB_us_v10_rzip_ROM_END;
gOverlayTable[ 9].start = FP_us_v10_rzip_ROM_START;
gOverlayTable[ 9].end = FP_us_v10_rzip_ROM_END;
gOverlayTable[10].start = CCW_us_v10_rzip_ROM_START;
gOverlayTable[10].end = CCW_us_v10_rzip_ROM_END;
gOverlayTable[11].start = SM_us_v10_rzip_ROM_START;
gOverlayTable[11].end = SM_us_v10_rzip_ROM_END;
gOverlayTable[12].start = cutscenes_us_v10_rzip_ROM_START;
gOverlayTable[12].end = cutscenes_us_v10_rzip_ROM_END;
gOverlayTable[13].start = lair_us_v10_rzip_ROM_START;
gOverlayTable[13].end = lair_us_v10_rzip_ROM_END;
gOverlayTable[14].start = fight_us_v10_rzip_ROM_START;
gOverlayTable[14].end = fight_us_v10_rzip_ROM_END;
}

24
src/done/piacs.c Normal file
View File

@@ -0,0 +1,24 @@
#include <os_internal.h>
#define PI_Q_BUF_LEN 1
u32 __osPiAccessQueueEnabled = 0;
static OSMesg piAccessBuf[PI_Q_BUF_LEN];
OSMesgQueue __osPiAccessQueue;
void __osPiCreateAccessQueue(void)
{
__osPiAccessQueueEnabled = 1;
osCreateMesgQueue(&__osPiAccessQueue, piAccessBuf, PI_Q_BUF_LEN);
osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK);
}
void __osPiGetAccess(void)
{
OSMesg dummyMesg;
if (!__osPiAccessQueueEnabled)
__osPiCreateAccessQueue();
osRecvMesg(&__osPiAccessQueue, &dummyMesg, OS_MESG_BLOCK);
}
void __osPiRelAccess(void)
{
osSendMesg(&__osPiAccessQueue, NULL, OS_MESG_NOBLOCK);
}

7
src/done/pigetstat.c Normal file
View File

@@ -0,0 +1,7 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
u32 osPiGetStatus(void) {
return IO_READ(PI_STATUS_REG);
}

50
src/done/pimgr.c Normal file
View File

@@ -0,0 +1,50 @@
#include <ultra64.h>
#include "piint.h"
extern u32 __osPiAccessQueueEnabled;
OSDevMgr __osPiDevMgr = {0};
OSPiHandle *__osPiTable = NULL;
OSPiHandle *__osCurrentHandle[2] = {&CartRomHandle, &LeoDiskHandle};
static OSThread piThread;
static char piThreadStack[OS_PIM_STACKSIZE];
static OSMesgQueue piEventQueue;
static OSMesg piEventBuf;
void osCreatePiManager(OSPri pri, OSMesgQueue *cmdQ, OSMesg *cmdBuf, s32 cmdMsgCnt)
{
u32 savedMask;
OSPri oldPri;
OSPri myPri;
if (!__osPiDevMgr.active)
{
osCreateMesgQueue(cmdQ, cmdBuf, cmdMsgCnt);
osCreateMesgQueue(&piEventQueue, (OSMesg*)&piEventBuf, 1);
if (!__osPiAccessQueueEnabled)
__osPiCreateAccessQueue();
osSetEventMesg(OS_EVENT_PI, &piEventQueue, (OSMesg)0x22222222);
oldPri = -1;
myPri = osGetThreadPri(NULL);
if (myPri < pri)
{
oldPri = myPri;
osSetThreadPri(NULL, pri);
}
savedMask = __osDisableInt();
__osPiDevMgr.active = 1;
__osPiDevMgr.thread = &piThread;
__osPiDevMgr.cmdQueue = cmdQ;
__osPiDevMgr.evtQueue = &piEventQueue;
__osPiDevMgr.acsQueue = &__osPiAccessQueue;
__osPiDevMgr.dma = osPiRawStartDma;
__osPiDevMgr.edma = osEPiRawStartDma;
osCreateThread(&piThread, 0, __osDevMgrMain, &__osPiDevMgr, &piThreadStack[OS_PIM_STACKSIZE], pri);
osStartThread(&piThread);
__osRestoreInt(savedMask);
if (oldPri != -1)
{
osSetThreadPri(NULL, oldPri);
}
}
}

28
src/done/pirawdma.c Normal file
View File

@@ -0,0 +1,28 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#define WAIT_ON_IOBUSY(stat) \
stat = IO_READ(PI_STATUS_REG); \
while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) \
stat = IO_READ(PI_STATUS_REG);
s32 osPiRawStartDma(s32 direction, u32 devAddr, void *dramAddr, u32 size)
{
register u32 stat;
WAIT_ON_IOBUSY(stat);
IO_WRITE(PI_DRAM_ADDR_REG, osVirtualToPhysical(dramAddr));
IO_WRITE(PI_CART_ADDR_REG, K1_TO_PHYS((u32)osRomBase | devAddr));
switch (direction)
{
case OS_READ:
IO_WRITE(PI_WR_LEN_REG, size - 1);
break;
case OS_WRITE:
IO_WRITE(PI_RD_LEN_REG, size - 1);
break;
default:
return -1;
}
return 0;
}

11
src/done/pirawread.c Normal file
View File

@@ -0,0 +1,11 @@
#include <ultra64.h>
#include "piint.h"
s32 osPiRawReadIo(u32 devAddr, u32 *data)
{
register u32 stat;
WAIT_ON_IOBUSY(stat);
*data = IO_READ((u32)osRomBase | devAddr);
return 0;
}

51
src/done/rarezip.c Normal file
View File

@@ -0,0 +1,51 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
#include "rarezip.h"
struct huft *D_80007270;
u32 func_800005C0(u8*, u8*, struct huft *);
u32 func_80000618(u8**, u8**, struct huft *);
extern void *D_803FBE00;
u32 func_80000550(u8*arg0){
return *((u32*)(arg0 +2));
}
void func_8000055C(void){
D_80007270 = (struct huft*) &D_803FBE00;
}
u32 func_80000570(u8 *inPtr, u8 *outPtr){
return func_800005C0(inPtr, outPtr, D_80007270);
}
//rareunzip
u32 func_80000594(u8 **inPtr, u8 **outPtr){
return func_80000618(inPtr, outPtr, D_80007270);
}
void func_800005B8(void){}
u32 func_800005C0(u8* in, u8* out, struct huft *arg2){
inbuf = in; //inbuf
D_80007284 = out; //slide
D_80007290 = arg2;
inbuf += 6; //skip 6 byte bk header
wp = 0; //wp
inptr = 0; //inptr
bkboot_inflate(); //inflate
return wp; //return uncompressed size
}
u32 func_80000618(u8 **inPtr, u8 **outPtr, struct huft *arg2){
u32 size = func_800005C0(*inPtr, *outPtr, arg2);
*outPtr += wp;
*outPtr = ((u32)(*outPtr) & 0xF) ? ((u32)(*outPtr) & ~0xF) + 0x10 : *outPtr;
*inPtr += inptr + 6;
return size;
}

32
src/done/recvmesg.c Normal file
View File

@@ -0,0 +1,32 @@
#include <ultra64.h>
#include "osint.h"
s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32 flags)
{
register u32 saveMask;
saveMask = __osDisableInt();
while (MQ_IS_EMPTY(mq))
{
if (flags == OS_MESG_NOBLOCK)
{
__osRestoreInt(saveMask);
return -1;
}
__osRunningThread->state = OS_STATE_WAITING;
__osEnqueueAndYield(&mq->mtqueue);
}
if (msg != NULL)
{
*msg = mq->msg[mq->first];
}
mq->first = (mq->first + 1) % mq->msgCount;
mq->validCount--;
if (mq->fullqueue->next != NULL)
{
osStartThread(__osPopThread(&mq->fullqueue));
}
__osRestoreInt(saveMask);
return 0;
}

View File

@@ -0,0 +1,13 @@
#include <os_internal.h>
#include <R4300.h>
void __osResetGlobalIntMask(OSHWIntr interrupt)
{
register u32 saveMask = __osDisableInt();
//not sure about these constants, SR_IBIT3 is external level 3 INT0, which I think corresponds to the rcp
//os.h has several masks defined that end in 401 but non that are just 401
__OSGlobalIntMask &= ~(interrupt & ~(SR_IBIT3 | SR_IE));
__osRestoreInt(saveMask);
}

31
src/done/sendmesg.c Normal file
View File

@@ -0,0 +1,31 @@
#include <ultra64.h>
#include "osint.h"
s32 osSendMesg(OSMesgQueue *mq, OSMesg msg, s32 flags)
{
register u32 saveMask;
register s32 last;
saveMask = __osDisableInt();
while (MQ_IS_FULL(mq))
{
if (flags == OS_MESG_BLOCK)
{
__osRunningThread->state = OS_STATE_WAITING;
__osEnqueueAndYield(&mq->fullqueue);
}
else
{
__osRestoreInt(saveMask);
return -1;
}
}
last = (mq->first + mq->validCount) % mq->msgCount;
mq->msg[last] = msg;
mq->validCount++;
if (mq->mtqueue->next != NULL)
{
osStartThread(__osPopThread(&mq->mtqueue));
}
__osRestoreInt(saveMask);
return 0;
}

13
src/done/seteventmesg.c Normal file
View File

@@ -0,0 +1,13 @@
#include <os_internal.h>
#include "osint.h"
__OSEventState __osEventStateTab[OS_NUM_EVENTS];
void osSetEventMesg(OSEvent event, OSMesgQueue *mq, OSMesg msg)
{
register u32 saveMask = __osDisableInt();
__OSEventState *es;
es = &__osEventStateTab[event];
es->messageQueue = mq;
es->message = msg;
__osRestoreInt(saveMask);
}

View File

@@ -0,0 +1,9 @@
#include <os_internal.h>
#include <R4300.h>
void __osSetGlobalIntMask(OSHWIntr mask)
{
register u32 saveMask = __osDisableInt();
__OSGlobalIntMask |= mask;
__osRestoreInt(saveMask);
}

24
src/done/setthreadpri.c Normal file
View File

@@ -0,0 +1,24 @@
#include <ultra64.h>
#include "osint.h"
void osSetThreadPri(OSThread *t, OSPri pri)
{
register u32 saveMask = __osDisableInt();
if (t == NULL)
t = __osRunningThread;
if (t->priority != pri)
{
t->priority = pri;
if (t != __osRunningThread && t->state != OS_STATE_STOPPED)
{
__osDequeueThread(t->queue, t);
__osEnqueueThread(t->queue, t);
}
if (__osRunningThread->priority < __osRunQueue->priority)
{
__osRunningThread->state = OS_STATE_RUNNABLE;
__osEnqueueAndYield(&__osRunQueue);
}
}
__osRestoreInt(saveMask);
}

11
src/done/si.c Normal file
View File

@@ -0,0 +1,11 @@
#include <ultra64.h>
#include "functions.h"
#include "variables.h"
int __osSiDeviceBusy()
{
register u32 stat = IO_READ(SI_STATUS_REG);
if (stat & (SI_STATUS_DMA_BUSY | SI_STATUS_RD_BUSY))
return 1;
return 0;
}

9
src/done/sirawread.c Normal file
View File

@@ -0,0 +1,9 @@
#include <ultra64.h>
s32 __osSiRawReadIo(u32 devAddr, u32 *data)
{
if (__osSiDeviceBusy())
return -1;
*data = IO_READ(devAddr);
return 0;
}

9
src/done/sirawwrite.c Normal file
View File

@@ -0,0 +1,9 @@
#include <ultra64.h>
s32 __osSiRawWriteIo(u32 devAddr, u32 data)
{
if (__osSiDeviceBusy())
return -1;
IO_WRITE(devAddr, data);
return 0;
}

40
src/done/startthread.c Normal file
View File

@@ -0,0 +1,40 @@
#include <ultra64.h>
#include "osint.h"
void osStartThread(OSThread *t)
{
register u32 saveMask = __osDisableInt();
switch (t->state)
{
case OS_STATE_WAITING:
t->state = OS_STATE_RUNNABLE;
__osEnqueueThread(&__osRunQueue, t);
break;
case OS_STATE_STOPPED:
if (t->queue == NULL || t->queue == &__osRunQueue)
{
t->state = OS_STATE_RUNNABLE;
__osEnqueueThread(&__osRunQueue, t);
}
else
{
t->state = OS_STATE_WAITING;
__osEnqueueThread(t->queue, t);
__osEnqueueThread(&__osRunQueue, __osPopThread(t->queue));
}
break;
}
if (__osRunningThread == NULL)
{
__osDispatchThread();
}
else
{
if (__osRunningThread->priority < __osRunQueue->priority)
{
__osRunningThread->state = OS_STATE_RUNNABLE;
__osEnqueueAndYield(&__osRunQueue);
}
}
__osRestoreInt(saveMask);
}

25
src/done/thread.c Normal file
View File

@@ -0,0 +1,25 @@
#include <os_internal.h>
#include "osint.h"
struct __osThreadTail __osThreadTail = {0, -1};
OSThread *__osRunQueue = (OSThread *)&__osThreadTail;
OSThread *__osActiveQueue = (OSThread *)&__osThreadTail;
OSThread *__osRunningThread = {0};
OSThread *__osFaultedThread = {0};
void __osDequeueThread(OSThread **queue, OSThread *t)
{
register OSThread *pred;
register OSThread *succ;
pred = (OSThread *)queue; //this is actually legit..
succ = pred->next;
while (succ != NULL)
{
if (succ == t)
{
pred->next = t->next;
return;
}
pred = succ;
succ = pred->next;
}
}

View File

@@ -0,0 +1,19 @@
#include <os_internal.h>
#include <R4300.h>
#include "osint.h"
u32 osVirtualToPhysical(void *addr)
{
if (IS_KSEG0(addr))
{
return K0_TO_PHYS(addr);
}
else if (IS_KSEG1(addr))
{
return K1_TO_PHYS(addr);
}
else
{
return __osProbeTLB(addr);
}
}

9
src/done/yieldthread.c Normal file
View File

@@ -0,0 +1,9 @@
#include <ultra64.h>
#include "osint.h"
void osYieldThread(void){
register u32 saveMask = __osDisableInt();
__osRunningThread->state = OS_STATE_RUNNABLE;
__osEnqueueAndYield(&__osRunQueue);
__osRestoreInt(saveMask);
}