mirror of
https://github.com/pret/pokestadium.git
synced 2026-09-30 22:07:10 -05:00
libultra phase 5: integration of text complete. cleanup pass later for data/rodata/bss and gaps
This commit is contained in:
38
Makefile
38
Makefile
@@ -71,6 +71,11 @@ build/src/libultra/os/gettime.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/timerintr.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/setglobalintmask.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/resetglobalintmask.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/settime.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/yieldthread.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/settimer.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/startthread.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/os/sethwinterrupt.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/pigetcmdq.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/sptask.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/controller.c.o: OPTFLAGS := -O1
|
||||
@@ -87,12 +92,20 @@ build/src/libultra/io/sp.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/viswapbuf.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/sptaskyielded.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/vi.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/visetevent.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/aisetnextbuf.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/ai.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/vigetcurrframebuf.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/spsetpc.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/libc/ll.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/libc/ll.c.o: MIPS_VERSION := -mips3 -32
|
||||
build/src/libultra/libc/llcvt.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/libc/llcvt.c.o: MIPS_VERSION := -mips3 -32
|
||||
|
||||
# cheap hack. TODO: Make the override better
|
||||
build/src/libultra/io/gbpakpower.c.o: OPTFLAGS += -Wo,-loopunroll,0
|
||||
build/src/libultra/io/gbpakinit.c.o: OPTFLAGS += -Wo,-loopunroll,0
|
||||
build/src/libultra/io/gbpakselectbank.c.o: OPTFLAGS += -Wo,-loopunroll,0
|
||||
|
||||
# Libultra misc
|
||||
build/src/libultra/gu/scale.c.o: CC := $(CC_OLD)
|
||||
@@ -114,6 +127,10 @@ build/src/libultra/gu/cosf.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/gu/random.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/xprintf.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/xprintf.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/libc/xldtob.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/xldtob.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/libc/xlitob.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/xlitob.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/libc/string.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/string.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/io/controller.c.o: CC := $(CC_OLD)
|
||||
@@ -137,15 +154,31 @@ build/src/libultra/al/env.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/al/resample.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/al/resample.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/al/save.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/al/heapalloc.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/gu/mtxutil.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/gu/mtxutil.c.o: OPTFLAGS := -O3
|
||||
build/src/libultra/io/pfsisplug.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/conteepprobe.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/conteepwrite.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/conteepread.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/contpfs.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/viswapcontext.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/contramwrite.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/contramread.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/crc.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/libc/ldiv.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/vimgr.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/visetxscale.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/visetxscale.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/io/visetyscale.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/visetyscale.c.o: OPTFLAGS := -O1
|
||||
build/src/libultra/al/synallocfx.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/al/synallocfx.c.o: OPTFLAGS := -O3
|
||||
|
||||
build/src/libultra/io/gbpakcheckconnector.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/gbpakreadid.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/gbpakreadwrite.c.o: CC := $(CC_OLD)
|
||||
build/src/libultra/io/gbpakselectbank.c.o: CC := $(CC_OLD)
|
||||
|
||||
######################## Flags #############################
|
||||
|
||||
@@ -197,6 +230,11 @@ $(BUILD_DIR)/src/libultra/libc/ll.c.o: src/libultra/libc/ll.c
|
||||
python3 tools/set_o32abi_bit.py $@
|
||||
@$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s)
|
||||
|
||||
$(BUILD_DIR)/src/libultra/libc/llcvt.c.o: src/libultra/libc/llcvt.c
|
||||
$(CC) -c $(CFLAGS) $(OPTFLAGS) -o $@ $^
|
||||
python3 tools/set_o32abi_bit.py $@
|
||||
@$(OBJDUMP) $(OBJDUMP_FLAGS) $@ > $(@:.o=.s)
|
||||
|
||||
$(BUILD_DIR)/%.s.o: %.s
|
||||
$(AS) $(ASFLAGS) -o $@ $<
|
||||
|
||||
|
||||
@@ -24,6 +24,26 @@ typedef struct
|
||||
/* 34 */ char length;
|
||||
} printf_struct;
|
||||
|
||||
// these are the same struct. TODO: Merge
|
||||
typedef struct {
|
||||
/* 0x0 */ union {
|
||||
/* 0x0 */ long long ll;
|
||||
/* 0x0 */ double ld;
|
||||
} v;
|
||||
/* 0x8 */ unsigned char* s;
|
||||
/* 0xC */ int n0;
|
||||
/* 0x10 */ int nz0;
|
||||
/* 0x14 */ int n1;
|
||||
/* 0x18 */ int nz1;
|
||||
/* 0x1C */ int n2;
|
||||
/* 0x20 */ int nz2;
|
||||
/* 0x24 */ int prec;
|
||||
/* 0x28 */ int width;
|
||||
/* 0x2C */ size_t nchar;
|
||||
/* 0x30 */ unsigned int flags;
|
||||
/* 0x34 */ char qual;
|
||||
} _Pft;
|
||||
|
||||
#define FLAGS_SPACE 1
|
||||
#define FLAGS_PLUS 2
|
||||
#define FLAGS_MINUS 4
|
||||
@@ -32,7 +52,7 @@ typedef struct
|
||||
typedef char *outfun(char*,const char*,size_t);
|
||||
|
||||
int _Printf(outfun prout, char *arg, const char *fmt, va_list args);
|
||||
void _Litob(printf_struct *args, char type);
|
||||
void _Ldtob(printf_struct *args, char type);
|
||||
void _Litob(_Pft *args, char type);
|
||||
void _Ldtob(_Pft *args, char type);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -332,4 +332,7 @@ void _collectPVoices(ALSynth *drvr);
|
||||
s32 _timeToSamples(ALSynth *ALSynth, s32 micros);
|
||||
ALMicroTime _samplesToTime(ALSynth *synth, s32 samples);
|
||||
|
||||
void _init_lpfilter(ALLowPass *lp);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
93
splat.yaml
93
splat.yaml
@@ -272,47 +272,48 @@ segments:
|
||||
- [0x63B60, c, libultra/io/pigetcmdq]
|
||||
- [0x63B90, c, libultra/gu/cosf]
|
||||
- [0x63D00, c, libultra/io/epiread]
|
||||
- [0x63D50, asm, libultra/io/visetspecial]
|
||||
- [0x63EB0, asm, libultra/os/settime]
|
||||
- [0x63EE0, asm, libultra/io/visetevent]
|
||||
- [0x63F50, asm, libultra/io/gbpakreadid]
|
||||
- [0x64110, asm, libultra/io/cartrominit]
|
||||
- [0x64270, asm, libultra/io/pfsselectbank]
|
||||
- [0x642F0, asm, libultra/os/setfpccsr]
|
||||
- [0x64300, asm, libultra/io/aigetlen]
|
||||
- [0x64310, asm, libultra/io/epiwrite]
|
||||
- [0x64360, asm, libultra/os/maptlbrdb]
|
||||
- [0x643C0, asm, libultra/os/yieldthread]
|
||||
- [0x64410, asm, libultra/io/contramwrite]
|
||||
- [0x64660, asm, libultra/io/contramread]
|
||||
- [0x64890, asm, libultra/io/crc]
|
||||
- [0x63D50, c, libultra/io/visetspecial]
|
||||
- [0x63EB0, c, libultra/os/settime]
|
||||
- [0x63EE0, c, libultra/io/visetevent]
|
||||
- [0x63F50, c, libultra/io/gbpakreadid]
|
||||
- [0x64110, c, libultra/io/cartrominit]
|
||||
- [0x64270, c, libultra/io/pfsselectbank]
|
||||
- [0x642F0, hasm, libultra/os/setfpccsr]
|
||||
- [0x64300, c, libultra/io/aigetlen]
|
||||
- [0x64310, c, libultra/io/epiwrite]
|
||||
- [0x64360, hasm, libultra/os/maptlbrdb]
|
||||
- [0x643C0, c, libultra/os/yieldthread]
|
||||
- [0x64410, c, libultra/io/contramwrite]
|
||||
- [0x64660, c, libultra/io/contramread]
|
||||
- [0x64890, c, libultra/io/crc]
|
||||
- [0x64A00, hasm, libultra/os/__osGetCause]
|
||||
- [0x64A10, asm, libultra/io/epirawwrite]
|
||||
- [0x64B70, asm, libultra/os/settimer]
|
||||
- [0x64C50, asm, libultra/libc/xldtob]
|
||||
- [0x65710, asm, libultra/libc/ldiv]
|
||||
- [0x658A0, asm, libultra/libc/xlitob]
|
||||
- [0x65B40, asm, libultra/io/sirawwrite]
|
||||
- [0x65B90, asm, libultra/io/spsetstat]
|
||||
- [0x65BA0, asm, libultra/io/spgetstat]
|
||||
- [0x65BC0, asm, libultra/io/vimgr]
|
||||
- [0x65ED0, asm, libultra/io/vigetcurrcontext]
|
||||
- [0x65EE0, asm, libultra/os/writebackdcacheall]
|
||||
- [0x65F10, asm, libultra/al/heapalloc]
|
||||
- [0x65F70, asm, libultra/os/startthread]
|
||||
- [0x660C0, asm, libultra/io/visetxscale]
|
||||
- [0x661F0, asm, libultra/io/visetyscale]
|
||||
- [0x66250, asm, libultra/libc/llcvt]
|
||||
- [0x66460, asm, libultra/al/synallocfx]
|
||||
- [0x66500, asm, libultra/al/syndelete]
|
||||
- [0x66510, asm, libultra/io/gbpakreadwrite]
|
||||
- [0x666D0, asm, libultra/io/gbpakselectbank]
|
||||
- [0x667A0, asm, libultra/io/aisetnextbuf]
|
||||
- [0x66850, asm, libultra/io/ai]
|
||||
- [0x66880, asm, libultra/io/conteepread]
|
||||
- [0x66AD0, asm, libultra/io/vigetcurrframebuf]
|
||||
- [0x66B10, asm, libultra/io/spsetpc]
|
||||
- [0x66B50, asm, libultra/os/sethwinterrupt]
|
||||
- [0x64A10, c, libultra/io/epirawwrite]
|
||||
- [0x64B70, c, libultra/os/settimer]
|
||||
- [0x64C50, c, libultra/libc/xldtob]
|
||||
- [0x65710, c, libultra/libc/ldiv]
|
||||
- [0x658A0, c, libultra/libc/xlitob]
|
||||
- [0x65B40, c, libultra/io/sirawwrite]
|
||||
- [0x65B90, c, libultra/io/spsetstat]
|
||||
- [0x65BA0, c, libultra/io/spgetstat]
|
||||
- [0x65BB0, bin, noppad_65BB0]
|
||||
- [0x65BC0, c, libultra/io/vimgr]
|
||||
- [0x65ED0, c, libultra/io/vigetcurrcontext]
|
||||
- [0x65EE0, hasm, libultra/os/writebackdcacheall]
|
||||
- [0x65F10, c, libultra/al/heapalloc]
|
||||
- [0x65F70, c, libultra/os/startthread]
|
||||
- [0x660C0, c, libultra/io/visetxscale]
|
||||
- [0x661F0, c, libultra/io/visetyscale]
|
||||
- [0x66250, c, libultra/libc/llcvt]
|
||||
- [0x66460, c, libultra/al/synallocfx]
|
||||
- [0x66500, c, libultra/al/syndelete]
|
||||
- [0x66510, c, libultra/io/gbpakreadwrite]
|
||||
- [0x666D0, c, libultra/io/gbpakselectbank]
|
||||
- [0x667A0, c, libultra/io/aisetnextbuf]
|
||||
- [0x66850, c, libultra/io/ai]
|
||||
- [0x66880, c, libultra/io/conteepread]
|
||||
- [0x66AD0, c, libultra/io/vigetcurrframebuf]
|
||||
- [0x66B10, c, libultra/io/spsetpc]
|
||||
- [0x66B50, c, libultra/os/sethwinterrupt]
|
||||
#- [0x66BC0, asm]
|
||||
- [0x66BC0, bin] # rest of rom part 1
|
||||
|
||||
@@ -327,6 +328,13 @@ segments:
|
||||
- [0x7B750, .data, libultra/al/env]
|
||||
- [0x7B890, .data, libultra/io/vi]
|
||||
- [0x7B900, bin, rom_data_7B900]
|
||||
- [0x7B9F0, .data, libultra/io/gbpakreadid]
|
||||
- [0x7BA40, .data, libultra/io/cartrominit]
|
||||
- [0x7BA50, bin, rom_data_7BA50]
|
||||
- [0x7BA60, .data, libultra/libc/xlitob]
|
||||
- [0x7BA90, .data, libultra/io/vimgr]
|
||||
- [0x7BAB0, .data, libultra/io/aisetnextbuf]
|
||||
- [0x7BAC0, bin, rom_data_7BAC0]
|
||||
|
||||
# Start of .rodata
|
||||
- [0x7BAC0, .rodata, rsp] # rsp.c rodata
|
||||
@@ -345,6 +353,9 @@ segments:
|
||||
- [0x7F130, .rodata, libultra/al/resample]
|
||||
- [0x7F180, .rodata, libultra/gu/cosf]
|
||||
- [0x7F1D0, bin, rom_rodata_7F1D0]
|
||||
- [0x7F1E0, .rodata, libultra/libc/xldtob]
|
||||
- [0x7F240, .rodata, libultra/libc/llcvt]
|
||||
- [0x7F250, bin, rom_rodata_7F250]
|
||||
- [0x7F980]
|
||||
|
||||
# .bss
|
||||
@@ -353,6 +364,8 @@ segments:
|
||||
- {vram: 0x80083CA0, type: .bss, name: unk_bss}
|
||||
- {vram: 0x80103880, type: .bss, name: libultra/gu/rotate}
|
||||
- {vram: 0x80103890, type: .bss, name: libultra/os/timerintr}
|
||||
- {vram: 0x801038E4, type: .bss, name: libultra/io/cartrominit}
|
||||
- {vram: 0x80103950, type: .bss, name: libultra/io/vimgr}
|
||||
|
||||
# rest of the ROM
|
||||
- [0x7F980, bin]
|
||||
|
||||
65
src/libultra/al/heapalloc.c
Normal file
65
src/libultra/al/heapalloc.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/*====================================================================
|
||||
* heapalloc.c
|
||||
*
|
||||
* Copyright 1995, Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
|
||||
* Inc.; the contents of this file may not be disclosed to third
|
||||
* parties, copied or duplicated in any form, in whole or in part,
|
||||
* without the prior written permission of Silicon Graphics, Inc.
|
||||
*
|
||||
* RESTRICTED RIGHTS LEGEND:
|
||||
* Use, duplication or disclosure by the Government is subject to
|
||||
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
|
||||
* in Technical Data and Computer Software clause at DFARS
|
||||
* 252.227-7013, and/or in similar or successor clauses in the FAR,
|
||||
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
|
||||
* Copyright Laws of the United States.
|
||||
*====================================================================*/
|
||||
|
||||
#include "synthInternals.h"
|
||||
#include <libaudio.h>
|
||||
#include <os_internal.h>
|
||||
#include <ultraerror.h>
|
||||
|
||||
void *alHeapDBAlloc(u8 *file, s32 line, ALHeap *hp, s32 num, s32 size)
|
||||
{
|
||||
s32 bytes;
|
||||
u8 *ptr = 0;
|
||||
|
||||
bytes = (num*size + AL_CACHE_ALIGN) & ~AL_CACHE_ALIGN;
|
||||
|
||||
#ifdef _DEBUG
|
||||
hp->count++;
|
||||
bytes += sizeof(HeapInfo);
|
||||
#endif
|
||||
|
||||
if ((hp->cur + bytes) <= (hp->base + hp->len)) {
|
||||
|
||||
ptr = hp->cur;
|
||||
hp->cur += bytes;
|
||||
|
||||
#ifdef _DEBUG
|
||||
((HeapInfo *)ptr)->magic = AL_HEAP_MAGIC;
|
||||
((HeapInfo *)ptr)->size = bytes;
|
||||
((HeapInfo *)ptr)->count = hp->count;
|
||||
if (file) {
|
||||
((HeapInfo *)ptr)->file = file;
|
||||
((HeapInfo *)ptr)->line = line;
|
||||
} else {
|
||||
((HeapInfo *)ptr)->file = (u8 *) "unknown";
|
||||
((HeapInfo *)ptr)->line = 0;
|
||||
}
|
||||
|
||||
ptr += sizeof(HeapInfo);
|
||||
#endif
|
||||
|
||||
} else {
|
||||
#ifdef _DEBUG
|
||||
__osError(ERR_ALHEAPNOFREE, 1, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
31
src/libultra/al/synallocfx.c
Normal file
31
src/libultra/al/synallocfx.c
Normal file
@@ -0,0 +1,31 @@
|
||||
/*====================================================================
|
||||
* synallocfx.c
|
||||
*
|
||||
* Copyright 1995, Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
|
||||
* Inc.; the contents of this file may not be disclosed to third
|
||||
* parties, copied or duplicated in any form, in whole or in part,
|
||||
* without the prior written permission of Silicon Graphics, Inc.
|
||||
*
|
||||
* RESTRICTED RIGHTS LEGEND:
|
||||
* Use, duplication or disclosure by the Government is subject to
|
||||
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
|
||||
* in Technical Data and Computer Software clause at DFARS
|
||||
* 252.227-7013, and/or in similar or successor clauses in the FAR,
|
||||
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
|
||||
* Copyright Laws of the United States.
|
||||
*====================================================================*/
|
||||
|
||||
#include "synthInternals.h"
|
||||
|
||||
ALFxRef *alSynAllocFX(ALSynth *s, s16 bus, ALSynConfig *c, ALHeap *hp)
|
||||
{
|
||||
alFxNew(&s->auxBus[bus].fx[0], c, hp);
|
||||
alFxParam(&s->auxBus[bus].fx[0], AL_FILTER_SET_SOURCE,
|
||||
&s->auxBus[bus]);
|
||||
alMainBusParam(s->mainBus, AL_FILTER_ADD_SOURCE,&s->auxBus[bus].fx[0]);
|
||||
|
||||
return (ALFxRef)(&s->auxBus[bus].fx[0]);
|
||||
}
|
||||
26
src/libultra/al/syndelete.c
Normal file
26
src/libultra/al/syndelete.c
Normal file
@@ -0,0 +1,26 @@
|
||||
/*====================================================================
|
||||
* syndelete.c
|
||||
*
|
||||
* Copyright 1995, Silicon Graphics, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
|
||||
* Inc.; the contents of this file may not be disclosed to third
|
||||
* parties, copied or duplicated in any form, in whole or in part,
|
||||
* without the prior written permission of Silicon Graphics, Inc.
|
||||
*
|
||||
* RESTRICTED RIGHTS LEGEND:
|
||||
* Use, duplication or disclosure by the Government is subject to
|
||||
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
|
||||
* in Technical Data and Computer Software clause at DFARS
|
||||
* 252.227-7013, and/or in similar or successor clauses in the FAR,
|
||||
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
|
||||
* Copyright Laws of the United States.
|
||||
*====================================================================*/
|
||||
|
||||
#include "synthInternals.h"
|
||||
|
||||
void alSynDelete(ALSynth *drvr)
|
||||
{
|
||||
drvr->head = 0;
|
||||
}
|
||||
15
src/libultra/io/ai.c
Normal file
15
src/libultra/io/ai.c
Normal file
@@ -0,0 +1,15 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
s32 __osAiDeviceBusy(void) {
|
||||
register s32 status = IO_READ(AI_STATUS_REG);
|
||||
|
||||
if (status & AI_STATUS_FIFO_FULL) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
8
src/libultra/io/aigetlen.c
Normal file
8
src/libultra/io/aigetlen.c
Normal file
@@ -0,0 +1,8 @@
|
||||
#include "PR/rcp.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
u32 osAiGetLength(void) {
|
||||
return IO_READ(AI_LEN_REG);
|
||||
}
|
||||
31
src/libultra/io/aisetnextbuf.c
Normal file
31
src/libultra/io/aisetnextbuf.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
#include "../os/osint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
s32 osAiSetNextBuffer(void *bufPtr, u32 size) {
|
||||
static u8 hdwrBugFlag = FALSE;
|
||||
char *bptr;
|
||||
|
||||
bptr = bufPtr;
|
||||
|
||||
if (hdwrBugFlag) {
|
||||
bptr -= 0x2000;
|
||||
}
|
||||
|
||||
if ((((u32)bufPtr + size) & 0x1fff) == 0) {
|
||||
hdwrBugFlag = TRUE;
|
||||
} else {
|
||||
hdwrBugFlag = FALSE;
|
||||
}
|
||||
|
||||
if (__osAiDeviceBusy()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
IO_WRITE(AI_DRAM_ADDR_REG, osVirtualToPhysical(bptr));
|
||||
IO_WRITE(AI_LEN_REG, size);
|
||||
return 0;
|
||||
}
|
||||
65
src/libultra/io/cartrominit.c
Normal file
65
src/libultra/io/cartrominit.c
Normal file
@@ -0,0 +1,65 @@
|
||||
#include <ultra64.h>
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/R4300.h"
|
||||
#include "PR/rcp.h"
|
||||
|
||||
OSPiHandle __CartRomHandle;
|
||||
OSPiHandle *osCartRomInit(void)
|
||||
{
|
||||
u32 value;
|
||||
u32 saveMask;
|
||||
static int first = 1;
|
||||
register u32 stat;
|
||||
u32 latency;
|
||||
u32 pulse;
|
||||
u32 pageSize;
|
||||
u32 relDuration;
|
||||
|
||||
__osPiGetAccess();
|
||||
|
||||
if (!first) {
|
||||
__osPiRelAccess();
|
||||
return &__CartRomHandle;
|
||||
}
|
||||
|
||||
first = 0;
|
||||
__CartRomHandle.type = DEVICE_TYPE_CART;
|
||||
__CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2);
|
||||
__CartRomHandle.domain = PI_DOMAIN1;
|
||||
__CartRomHandle.speed = 0;
|
||||
|
||||
bzero(&__CartRomHandle.transferInfo, sizeof(__OSTranxInfo));
|
||||
|
||||
while (stat = IO_READ(PI_STATUS_REG), stat & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
|
||||
;
|
||||
}
|
||||
|
||||
latency = IO_READ(PI_BSD_DOM1_LAT_REG);
|
||||
pageSize = IO_READ(PI_BSD_DOM1_PGS_REG);
|
||||
relDuration = IO_READ(PI_BSD_DOM1_RLS_REG);
|
||||
pulse = IO_READ(PI_BSD_DOM1_PWD_REG);
|
||||
|
||||
IO_WRITE(PI_BSD_DOM1_LAT_REG, 0xFF);
|
||||
IO_WRITE(PI_BSD_DOM1_PGS_REG, 0);
|
||||
IO_WRITE(PI_BSD_DOM1_RLS_REG, 3);
|
||||
IO_WRITE(PI_BSD_DOM1_PWD_REG, 0xFF);
|
||||
|
||||
value = IO_READ(__CartRomHandle.baseAddress);
|
||||
__CartRomHandle.latency = value & 0xFF;
|
||||
__CartRomHandle.pageSize = (value >> 0x10) & 0xF;
|
||||
__CartRomHandle.relDuration = (value >> 0x14) & 0xF;
|
||||
__CartRomHandle.pulse = (value >> 8) & 0xFF;
|
||||
|
||||
IO_WRITE(PI_BSD_DOM1_LAT_REG, latency);
|
||||
IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize);
|
||||
IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration);
|
||||
IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse);
|
||||
|
||||
saveMask = __osDisableInt();
|
||||
__CartRomHandle.next = __osPiTable;
|
||||
__osPiTable = &__CartRomHandle;
|
||||
__osRestoreInt(saveMask);
|
||||
__osPiRelAccess();
|
||||
|
||||
return &__CartRomHandle;
|
||||
}
|
||||
105
src/libultra/io/conteepread.c
Normal file
105
src/libultra/io/conteepread.c
Normal file
@@ -0,0 +1,105 @@
|
||||
#include <ultra64.h>
|
||||
#include "PR/rcp.h"
|
||||
#include "ultra64/controller.h"
|
||||
#include "siint.h"
|
||||
|
||||
void __osPackEepReadData(u8 address);
|
||||
extern OSPifRam __osEepPifRam;
|
||||
extern s32 __osEepromRead16K;
|
||||
|
||||
#define CONT_RANGE_ERROR -1
|
||||
|
||||
s32 osEepromRead(OSMesgQueue *mq, u8 address, u8 *buffer)
|
||||
{
|
||||
s32 ret;
|
||||
int i;
|
||||
u16 type;
|
||||
u8 *ptr;
|
||||
OSContStatus sdata;
|
||||
__OSContEepromFormat eepromformat;
|
||||
ret = 0;
|
||||
i = 0;
|
||||
ptr = (u8 *)&__osEepPifRam.ramarray;
|
||||
__osSiGetAccess();
|
||||
ret = __osEepStatus(mq, &sdata);
|
||||
|
||||
if (ret == 0) {
|
||||
type = sdata.type & (CONT_EEPROM | CONT_EEP16K);
|
||||
|
||||
switch (type) {
|
||||
case CONT_EEPROM:
|
||||
// @bug: Should be > EEPROM_MAXBLOCKS
|
||||
if (address >= EEPROM_MAXBLOCKS) {
|
||||
ret = -1;
|
||||
}
|
||||
break;
|
||||
case CONT_EEPROM | CONT_EEP16K:
|
||||
// @bug: Should be > EEP16K_MAXBLOCKS
|
||||
if (address >= EEP16K_MAXBLOCKS) {
|
||||
ret = -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (1);
|
||||
ret = CONT_NO_RESPONSE_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
__osSiRelAccess();
|
||||
return ret;
|
||||
}
|
||||
|
||||
while (sdata.status & CONT_EEPROM_BUSY) {
|
||||
__osEepStatus(mq, &sdata);
|
||||
}
|
||||
|
||||
__osPackEepReadData(address);
|
||||
|
||||
ret = __osSiRawStartDma(OS_WRITE, &__osEepPifRam);
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
ret = __osSiRawStartDma(OS_READ, &__osEepPifRam);
|
||||
__osContLastCmd = CONT_CMD_READ_EEPROM;
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
ptr++;
|
||||
}
|
||||
|
||||
eepromformat = *(__OSContEepromFormat *)ptr;
|
||||
|
||||
ret = CHNL_ERR(eepromformat);
|
||||
|
||||
if (ret == 0) {
|
||||
for (i = 0; i < ARRLEN(eepromformat.data); i++) {
|
||||
*buffer++ = eepromformat.data[i];
|
||||
}
|
||||
}
|
||||
|
||||
__osSiRelAccess();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void __osPackEepReadData(u8 address) {
|
||||
u8 *ptr = (u8 *)&__osEepPifRam.ramarray;
|
||||
__OSContEepromFormat eepromformat;
|
||||
int i;
|
||||
|
||||
__osEepPifRam.pifstatus = CONT_CMD_EXE;
|
||||
|
||||
eepromformat.txsize = CONT_CMD_READ_EEPROM_TX;
|
||||
eepromformat.rxsize = CONT_CMD_READ_EEPROM_RX;
|
||||
eepromformat.cmd = CONT_CMD_READ_EEPROM;
|
||||
eepromformat.address = address;
|
||||
|
||||
for (i = 0; i < MAXCONTROLLERS; i++) {
|
||||
*ptr++ = 0;
|
||||
}
|
||||
|
||||
*(__OSContEepromFormat *)(ptr) = eepromformat;
|
||||
ptr += sizeof(__OSContEepromFormat);
|
||||
ptr[0] = CONT_CMD_END;
|
||||
}
|
||||
73
src/libultra/io/contramread.c
Normal file
73
src/libultra/io/contramread.c
Normal file
@@ -0,0 +1,73 @@
|
||||
#include <ultra64.h>
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
#include "ultra64/controller.h"
|
||||
|
||||
extern s32 __osPfsLastChannel;
|
||||
|
||||
#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
|
||||
|
||||
s32 __osContRamRead(OSMesgQueue* mq, int channel, u16 address, u8* buffer) {
|
||||
s32 ret;
|
||||
s32 i;
|
||||
u8* ptr;
|
||||
s32 retry = 2;
|
||||
|
||||
__osSiGetAccess();
|
||||
|
||||
do {
|
||||
ptr = (u8*)&__osPfsPifRam;
|
||||
|
||||
if (__osContLastCmd != CONT_CMD_READ_MEMPACK || __osPfsLastChannel != channel) {
|
||||
__osContLastCmd = CONT_CMD_READ_MEMPACK;
|
||||
__osPfsLastChannel = channel;
|
||||
|
||||
for (i = 0; i < channel; i++) { *ptr++ = CONT_CMD_REQUEST_STATUS; }
|
||||
|
||||
__osPfsPifRam.pifstatus = CONT_CMD_EXE;
|
||||
|
||||
READFORMAT(ptr)->dummy = CONT_CMD_NOP;
|
||||
READFORMAT(ptr)->txsize = CONT_CMD_READ_MEMPACK_TX;
|
||||
READFORMAT(ptr)->rxsize = CONT_CMD_READ_MEMPACK_RX;
|
||||
READFORMAT(ptr)->cmd = CONT_CMD_READ_MEMPACK;
|
||||
READFORMAT(ptr)->datacrc = 0xFF;
|
||||
|
||||
ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END;
|
||||
} else {
|
||||
ptr += channel;
|
||||
}
|
||||
|
||||
READFORMAT(ptr)->hi = address >> 3;
|
||||
READFORMAT(ptr)->lo = (u8)(__osContAddressCrc(address) | (address << 5));
|
||||
|
||||
__osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
__osSiRawStartDma(OS_READ, &__osPfsPifRam);
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4);
|
||||
|
||||
if (!ret) {
|
||||
if (__osContDataCrc(&READFORMAT(ptr)->data) != READFORMAT(ptr)->datacrc) {
|
||||
ret = __osPfsGetStatus(mq, channel);
|
||||
|
||||
if (ret) {
|
||||
break;
|
||||
}
|
||||
|
||||
ret = PFS_ERR_CONTRFAIL;
|
||||
} else {
|
||||
_bcopy(&READFORMAT(ptr)->data, buffer, BLOCKSIZE);
|
||||
}
|
||||
} else {
|
||||
ret = PFS_ERR_NOPACK;
|
||||
}
|
||||
if (ret != PFS_ERR_CONTRFAIL) {
|
||||
break;
|
||||
}
|
||||
} while (0 <= retry--);
|
||||
__osSiRelAccess();
|
||||
|
||||
return ret;
|
||||
}
|
||||
74
src/libultra/io/contramwrite.c
Normal file
74
src/libultra/io/contramwrite.c
Normal file
@@ -0,0 +1,74 @@
|
||||
#include <ultra64.h>
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
#include "ultra64/controller.h"
|
||||
|
||||
extern s32 __osPfsLastChannel;
|
||||
|
||||
#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))
|
||||
|
||||
s32 __osContRamWrite(OSMesgQueue* mq, int channel, u16 address, u8* buffer, int force) {
|
||||
s32 ret = 0;
|
||||
s32 i;
|
||||
u8* ptr;
|
||||
s32 retry = 2;
|
||||
u8 crc;
|
||||
|
||||
if ((force != PFS_FORCE) && (address < PFS_LABEL_AREA) && (address != 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
__osSiGetAccess();
|
||||
|
||||
do {
|
||||
ptr = (u8*)(&__osPfsPifRam.ramarray);
|
||||
|
||||
if (__osContLastCmd != CONT_CMD_WRITE_MEMPACK || __osPfsLastChannel != channel) {
|
||||
__osContLastCmd = CONT_CMD_WRITE_MEMPACK;
|
||||
__osPfsLastChannel = channel;
|
||||
|
||||
// clang-format off
|
||||
for (i = 0; i < channel; i++) { *ptr++ = 0; }
|
||||
// clang-format on
|
||||
|
||||
__osPfsPifRam.pifstatus = 1;
|
||||
|
||||
READFORMAT(ptr)->dummy = CONT_CMD_NOP;
|
||||
READFORMAT(ptr)->txsize = CONT_CMD_WRITE_MEMPACK_TX;
|
||||
READFORMAT(ptr)->rxsize = CONT_CMD_WRITE_MEMPACK_RX;
|
||||
READFORMAT(ptr)->cmd = CONT_CMD_WRITE_MEMPACK;
|
||||
READFORMAT(ptr)->datacrc = 0xFF;
|
||||
|
||||
ptr[sizeof(__OSContRamReadFormat)] = CONT_CMD_END;
|
||||
} else {
|
||||
ptr += channel;
|
||||
}
|
||||
READFORMAT(ptr)->hi = address >> 3;
|
||||
READFORMAT(ptr)->lo = ((address << 5) | __osContAddressCrc(address));
|
||||
|
||||
_bcopy(buffer, READFORMAT(ptr)->data, BLOCKSIZE);
|
||||
|
||||
ret = __osSiRawStartDma(OS_WRITE, &__osPfsPifRam);
|
||||
crc = __osContDataCrc(buffer);
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
ret = __osSiRawStartDma(OS_READ, &__osPfsPifRam);
|
||||
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
|
||||
|
||||
ret = ((((__OSContRamReadFormat*)ptr)->rxsize & 0xC0) >> 4);
|
||||
if (!ret) {
|
||||
if (crc != ((__OSContRamReadFormat*)ptr)->datacrc) {
|
||||
if ((ret = __osPfsGetStatus(mq, channel))) {
|
||||
break;
|
||||
} else {
|
||||
ret = PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret = PFS_ERR_NOPACK;
|
||||
}
|
||||
} while ((ret == PFS_ERR_CONTRFAIL) && (retry-- >= 0));
|
||||
__osSiRelAccess();
|
||||
|
||||
return ret;
|
||||
}
|
||||
96
src/libultra/io/crc.c
Normal file
96
src/libultra/io/crc.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
u8 __osContAddressCrc(u16 inaddr)
|
||||
{
|
||||
u32 crc;
|
||||
u32 mask;
|
||||
u32 addr = inaddr;
|
||||
|
||||
crc = 0;
|
||||
|
||||
for (mask = 0x400; mask != 0; mask >>= 1) {
|
||||
crc *= 2;
|
||||
|
||||
if (addr & mask) {
|
||||
if (crc & 0x20) {
|
||||
crc ^= 20;
|
||||
} else {
|
||||
crc++;
|
||||
}
|
||||
} else {
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x20) {
|
||||
crc ^= 21;
|
||||
}
|
||||
|
||||
return crc & 0x1f;
|
||||
}
|
||||
|
||||
u8 __osContDataCrc(u8 *data)
|
||||
{
|
||||
u32 i;
|
||||
u32 mask;
|
||||
u32 crc = 0;
|
||||
|
||||
for (i = 32; i != 0; i--) {
|
||||
for (mask = 0x80; mask != 0; mask >>= 1) {
|
||||
crc *= 2;
|
||||
|
||||
if (*data & mask) {
|
||||
if (crc & 0x100) {
|
||||
crc ^= 132;
|
||||
} else {
|
||||
crc++;
|
||||
}
|
||||
} else {
|
||||
if (crc & 0x100) {
|
||||
crc ^= 133;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data++;
|
||||
}
|
||||
|
||||
do {
|
||||
crc <<= 1;
|
||||
|
||||
if (crc & 0x100) {
|
||||
crc ^= 133;
|
||||
}
|
||||
i++;
|
||||
} while (i < 8);
|
||||
|
||||
return crc;
|
||||
}
|
||||
58
src/libultra/io/epirawwrite.c
Normal file
58
src/libultra/io/epirawwrite.c
Normal file
@@ -0,0 +1,58 @@
|
||||
#include <os_internal.h>
|
||||
#include "piint.h"
|
||||
|
||||
s32 osEPiRawWriteIo(OSPiHandle *handle, u32 devAddr, u32 data)
|
||||
{
|
||||
u32 stat = IO_READ(PI_STATUS_REG);
|
||||
|
||||
while (stat & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {
|
||||
stat = IO_READ(PI_STATUS_REG);
|
||||
}
|
||||
|
||||
if (__osCurrentHandle[handle->domain]->type != handle->type) {
|
||||
OSPiHandle *cHandle = __osCurrentHandle[handle->domain];
|
||||
|
||||
if (handle->domain == PI_DOMAIN1) {
|
||||
if (cHandle->latency != handle->latency) {
|
||||
IO_WRITE(PI_BSD_DOM1_LAT_REG, handle->latency);
|
||||
}
|
||||
|
||||
if (cHandle->pageSize != handle->pageSize) {
|
||||
IO_WRITE(PI_BSD_DOM1_PGS_REG, handle->pageSize);
|
||||
}
|
||||
|
||||
if (cHandle->relDuration != handle->relDuration) {
|
||||
IO_WRITE(PI_BSD_DOM1_RLS_REG, handle->relDuration);
|
||||
}
|
||||
|
||||
if (cHandle->pulse != handle->pulse) {
|
||||
IO_WRITE(PI_BSD_DOM1_PWD_REG, handle->pulse);
|
||||
}
|
||||
} else {
|
||||
if (cHandle->latency != handle->latency) {
|
||||
IO_WRITE(PI_BSD_DOM2_LAT_REG, handle->latency);
|
||||
}
|
||||
|
||||
if (cHandle->pageSize != handle->pageSize) {
|
||||
IO_WRITE(PI_BSD_DOM2_PGS_REG, handle->pageSize);
|
||||
}
|
||||
|
||||
if (cHandle->relDuration != handle->relDuration) {
|
||||
IO_WRITE(PI_BSD_DOM2_RLS_REG, handle->relDuration);
|
||||
}
|
||||
|
||||
if (cHandle->pulse != handle->pulse) {
|
||||
IO_WRITE(PI_BSD_DOM2_PWD_REG, handle->pulse);
|
||||
}
|
||||
}
|
||||
|
||||
cHandle->type = handle->type;
|
||||
cHandle->latency = handle->latency;
|
||||
cHandle->pageSize = handle->pageSize;
|
||||
cHandle->relDuration = handle->relDuration;
|
||||
cHandle->pulse = handle->pulse;
|
||||
}
|
||||
|
||||
IO_WRITE(handle->baseAddress | devAddr, data);
|
||||
return 0;
|
||||
}
|
||||
13
src/libultra/io/epiwrite.c
Normal file
13
src/libultra/io/epiwrite.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "piint.h"
|
||||
|
||||
s32 osEPiRawWriteIo(OSPiHandle*, u32, u32);
|
||||
|
||||
s32 osEPiWriteIo(OSPiHandle* pihandle, u32 devAddr, u32 data) {
|
||||
register s32 ret;
|
||||
|
||||
__osPiGetAccess();
|
||||
ret = osEPiRawWriteIo(pihandle, devAddr, data);
|
||||
__osPiRelAccess();
|
||||
|
||||
return ret;
|
||||
}
|
||||
91
src/libultra/io/gbpakreadid.c
Normal file
91
src/libultra/io/gbpakreadid.c
Normal file
@@ -0,0 +1,91 @@
|
||||
#include <os_internal.h>
|
||||
#include "ultra64/controller.h"
|
||||
#include "siint.h"
|
||||
|
||||
extern void _bcopy(void *, void *, u32);
|
||||
|
||||
u32 g_OsGbNintendoData[] = {
|
||||
0xceed6666, 0xcc0d000b, 0x03730083, 0x000c000d,
|
||||
0x0008111f, 0x8889000e, 0xdccc6ee6, 0xddddd999,
|
||||
0xbbbb6763, 0x6e0eeccc, 0xdddc999f, 0xbbb9333e,
|
||||
};
|
||||
|
||||
u8 g_OsGbCartVersions[] = {
|
||||
0x00, 0x01, 0x01, 0x01,
|
||||
0xff, 0x02, 0x02, 0xff,
|
||||
0x00, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x03,
|
||||
0x03, 0x03, 0x03, 0x03,
|
||||
};
|
||||
|
||||
s32 osGbpakReadId(OSPfs *pfs, OSGbpakId *id, u8 *status)
|
||||
{
|
||||
s32 i;
|
||||
s32 ret;
|
||||
u8 sum;
|
||||
u8 buffer[0x60];
|
||||
|
||||
ret = osGbpakGetStatus(pfs, status);
|
||||
|
||||
if (ret == PFS_ERR_NEW_GBCART) {
|
||||
ret = osGbpakGetStatus(pfs, status);
|
||||
}
|
||||
|
||||
if (ret == PFS_ERR_NEW_GBCART) {
|
||||
return PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
if ((*status & OS_GBPAK_POWER) == 0) {
|
||||
ret = osGbpakPower(pfs, OS_GBPAK_POWER_ON);
|
||||
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
ret = osGbpakReadWrite(pfs, PFS_READ, 0x100, buffer, 0x60);
|
||||
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = osGbpakGetStatus(pfs, status);
|
||||
|
||||
if (ret == PFS_ERR_NEW_GBCART) {
|
||||
ret = PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Compare id->nintendo_chr with expected data
|
||||
if (bcmp(g_OsGbNintendoData, &buffer[4], sizeof(id->nintendo_chr)) != 0) {
|
||||
return PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
|
||||
// Sum game_title through to isum
|
||||
sum = 0;
|
||||
|
||||
for (i = 0x34; i < 0x4e; i++) {
|
||||
sum += buffer[i];
|
||||
}
|
||||
|
||||
sum = (sum + 25) & 0xff;
|
||||
|
||||
if (sum != 0) {
|
||||
return PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
|
||||
_bcopy(buffer, id, sizeof(OSGbpakId));
|
||||
|
||||
if (id->cart_type < 20) {
|
||||
pfs->version = g_OsGbCartVersions[id->cart_type];
|
||||
}
|
||||
|
||||
pfs->dir_size = id->ram_size;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
77
src/libultra/io/gbpakreadwrite.c
Normal file
77
src/libultra/io/gbpakreadwrite.c
Normal file
@@ -0,0 +1,77 @@
|
||||
#include <os_internal.h>
|
||||
#include "ultra64/controller.h"
|
||||
|
||||
s32 osGbpakReadWrite(OSPfs *pfs, u16 flag, u16 address, u8 *buffer, u16 size)
|
||||
{
|
||||
s32 i;
|
||||
s32 ret;
|
||||
u8 bank;
|
||||
u16 addr;
|
||||
|
||||
bank = address >> 14;
|
||||
|
||||
if (bank != pfs->banks) {
|
||||
ret = __osGbpakSelectBank(pfs, bank);
|
||||
|
||||
if (ret != 0) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
size = size >> 5;
|
||||
address = (address | 0xc000) >> 5;
|
||||
|
||||
if (flag == PFS_WRITE) {
|
||||
for (i = 0; i < size; i++) {
|
||||
ret = __osContRamWrite(pfs->queue, pfs->channel, address, buffer, 0);
|
||||
|
||||
if (ret != 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
address++;
|
||||
|
||||
if (address >= 0x800 && i < size - 1) {
|
||||
bank++;
|
||||
ret = __osGbpakSelectBank(pfs, bank);
|
||||
|
||||
if (ret != 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
address = 0x600;
|
||||
}
|
||||
|
||||
buffer += BLOCKSIZE;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < size; i++) {
|
||||
ret = __osContRamRead(pfs->queue, pfs->channel, address, buffer);
|
||||
|
||||
if (ret != 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
address++;
|
||||
|
||||
if (address >= 0x800 && i < size - 1) {
|
||||
bank++;
|
||||
ret = __osGbpakSelectBank(pfs, bank);
|
||||
|
||||
if (ret != 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
address = 0x600;
|
||||
}
|
||||
|
||||
buffer += BLOCKSIZE;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == PFS_ERR_NEW_PACK) {
|
||||
ret = PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
42
src/libultra/io/gbpakselectbank.c
Normal file
42
src/libultra/io/gbpakselectbank.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include <os_internal.h>
|
||||
#include "ultra64/controller.h"
|
||||
#include "siint.h"
|
||||
|
||||
s32 __osGbpakSelectBank(OSPfs *pfs, u8 bank)
|
||||
{
|
||||
s32 ret;
|
||||
s32 i;
|
||||
u8 buffer[32];
|
||||
s32 j;
|
||||
|
||||
if (bank >= 3) {
|
||||
return PFS_ERR_INVALID;
|
||||
}
|
||||
|
||||
for (i = 0; i < 32; i+=4) {
|
||||
buffer[i+0] = bank;
|
||||
buffer[i+1] = bank;
|
||||
buffer[i+2] = bank;
|
||||
buffer[i+3] = bank;
|
||||
}
|
||||
|
||||
ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0);
|
||||
|
||||
if (ret == PFS_ERR_NEW_PACK) {
|
||||
ret = osGbpakInit(pfs->queue, pfs, pfs->channel);
|
||||
|
||||
if (ret == 0) {
|
||||
ret = __osContRamWrite(pfs->queue, pfs->channel, 0x500, (u8 *)buffer, 0);
|
||||
|
||||
if (ret == PFS_ERR_NEW_PACK) {
|
||||
ret = PFS_ERR_CONTRFAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
pfs->banks = bank;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
24
src/libultra/io/pfsselectbank.c
Normal file
24
src/libultra/io/pfsselectbank.c
Normal file
@@ -0,0 +1,24 @@
|
||||
#include <os_internal.h>
|
||||
#include "ultra64/controller.h"
|
||||
|
||||
s32 __osPfsSelectBank(OSPfs *pfs, u8 bank)
|
||||
{
|
||||
u8 temp[8][4];
|
||||
int i, j;
|
||||
s32 ret;
|
||||
ret = 0;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
for(j = 0; j < 4; j++) {
|
||||
temp[i][j] = bank;
|
||||
}
|
||||
}
|
||||
|
||||
ret = __osContRamWrite(pfs->queue, pfs->channel, 1024, (u8*)temp, FALSE);
|
||||
|
||||
if (ret == 0) {
|
||||
pfs->activebank = bank;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
14
src/libultra/io/sirawwrite.c
Normal file
14
src/libultra/io/sirawwrite.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "siint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
s32 __osSiRawWriteIo(u32 devAddr, u32 data) {
|
||||
if (__osSiDeviceBusy()) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
IO_WRITE(devAddr, data);
|
||||
return 0;
|
||||
}
|
||||
9
src/libultra/io/spgetstat.c
Normal file
9
src/libultra/io/spgetstat.c
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
u32 __osSpGetStatus() {
|
||||
return IO_READ(SP_STATUS_REG);
|
||||
}
|
||||
15
src/libultra/io/spsetpc.c
Normal file
15
src/libultra/io/spsetpc.c
Normal file
@@ -0,0 +1,15 @@
|
||||
#include "PR/rcp.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
s32 __osSpSetPc(u32 pc) {
|
||||
register u32 status = IO_READ(SP_STATUS_REG);
|
||||
|
||||
if (!(status & SP_STATUS_HALT)) {
|
||||
return -1;
|
||||
}
|
||||
IO_WRITE(SP_PC_REG, pc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
9
src/libultra/io/spsetstat.c
Normal file
9
src/libultra/io/spsetstat.c
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "PR/rcp.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
void __osSpSetStatus(u32 data) {
|
||||
IO_WRITE(SP_STATUS_REG, data);
|
||||
}
|
||||
9
src/libultra/io/vigetcurrcontext.c
Normal file
9
src/libultra/io/vigetcurrcontext.c
Normal file
@@ -0,0 +1,9 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include "viint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
__OSViContext *__osViGetCurrentContext(void) {
|
||||
return __osViCurr;
|
||||
}
|
||||
10
src/libultra/io/vigetcurrframebuf.c
Normal file
10
src/libultra/io/vigetcurrframebuf.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include "viint.h"
|
||||
|
||||
void *osViGetCurrentFramebuffer(void) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
void *framep = __osViCurr->framep;
|
||||
|
||||
__osRestoreInt(saveMask);
|
||||
return framep;
|
||||
}
|
||||
112
src/libultra/io/vimgr.c
Normal file
112
src/libultra/io/vimgr.c
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <macros.h>
|
||||
#include <PR/os_internal.h>
|
||||
#include <PR/rcp.h>
|
||||
#include "viint.h"
|
||||
#include "../os/osint.h"
|
||||
|
||||
#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0])))
|
||||
|
||||
OSDevMgr __osViDevMgr = {0};
|
||||
u32 __additional_scanline = 0;
|
||||
static OSThread viThread;
|
||||
static unsigned char viThreadStack[OS_VIM_STACKSIZE];
|
||||
static OSMesgQueue viEventQueue;
|
||||
static OSMesg viEventBuf[5];
|
||||
static OSIoMesg viRetraceMsg;
|
||||
static OSIoMesg viCounterMsg;
|
||||
|
||||
static void viMgrMain(void *arg);
|
||||
void osCreateViManager(OSPri pri)
|
||||
{
|
||||
u32 savedMask;
|
||||
OSPri oldPri;
|
||||
OSPri myPri;
|
||||
|
||||
if (!__osViDevMgr.active) {
|
||||
__osTimerServicesInit();
|
||||
__additional_scanline = 0;
|
||||
osCreateMesgQueue(&viEventQueue, viEventBuf, ARRLEN(viEventBuf));
|
||||
viRetraceMsg.hdr.type = OS_MESG_TYPE_VRETRACE;
|
||||
viRetraceMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
||||
viRetraceMsg.hdr.retQueue = NULL;
|
||||
viCounterMsg.hdr.type = OS_MESG_TYPE_COUNTER;
|
||||
viCounterMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
||||
viCounterMsg.hdr.retQueue = NULL;
|
||||
osSetEventMesg(OS_EVENT_VI, &viEventQueue, &viRetraceMsg);
|
||||
osSetEventMesg(OS_EVENT_COUNTER, &viEventQueue, &viCounterMsg);
|
||||
oldPri = -1;
|
||||
myPri = osGetThreadPri(NULL);
|
||||
|
||||
if (myPri < pri) {
|
||||
oldPri = myPri;
|
||||
osSetThreadPri(NULL, pri);
|
||||
}
|
||||
|
||||
savedMask = __osDisableInt();
|
||||
__osViDevMgr.active = TRUE;
|
||||
__osViDevMgr.thread = &viThread;
|
||||
__osViDevMgr.cmdQueue = &viEventQueue;
|
||||
__osViDevMgr.evtQueue = &viEventQueue;
|
||||
__osViDevMgr.acsQueue = NULL;
|
||||
__osViDevMgr.dma = NULL;
|
||||
__osViDevMgr.edma = NULL;
|
||||
osCreateThread(&viThread, 0, viMgrMain, &__osViDevMgr, &viThreadStack[OS_VIM_STACKSIZE], pri);
|
||||
__osViInit();
|
||||
osStartThread(&viThread);
|
||||
__osRestoreInt(savedMask);
|
||||
|
||||
if (oldPri != -1) {
|
||||
osSetThreadPri(0, oldPri);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void viMgrMain(void *arg) {
|
||||
__OSViContext *vc;
|
||||
OSDevMgr *dm;
|
||||
OSIoMesg *mb;
|
||||
static u16 retrace;
|
||||
s32 first;
|
||||
u32 count;
|
||||
|
||||
mb = NULL;
|
||||
first = 0;
|
||||
vc = __osViGetCurrentContext();
|
||||
retrace = vc->retraceCount;
|
||||
if (retrace == 0)
|
||||
retrace = 1;
|
||||
dm = (OSDevMgr *)arg;
|
||||
|
||||
while (TRUE) {
|
||||
osRecvMesg(dm->evtQueue, (OSMesg)&mb, OS_MESG_BLOCK);
|
||||
switch (mb->hdr.type) {
|
||||
case OS_MESG_TYPE_VRETRACE:
|
||||
__osViSwapContext();
|
||||
retrace--;
|
||||
|
||||
if (retrace == 0) {
|
||||
vc = __osViGetCurrentContext();
|
||||
if (vc->msgq != NULL)
|
||||
osSendMesg(vc->msgq, vc->msg, OS_MESG_NOBLOCK);
|
||||
retrace = vc->retraceCount;
|
||||
}
|
||||
|
||||
__osViIntrCount++;
|
||||
|
||||
if (first) {
|
||||
count = osGetCount();
|
||||
__osCurrentTime = count;
|
||||
first = 0;
|
||||
}
|
||||
|
||||
count = __osBaseCounter;
|
||||
__osBaseCounter = osGetCount();
|
||||
count = __osBaseCounter - count;
|
||||
__osCurrentTime = __osCurrentTime + count;
|
||||
break;
|
||||
case OS_MESG_TYPE_COUNTER:
|
||||
__osTimerInterrupt();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
14
src/libultra/io/visetevent.c
Normal file
14
src/libultra/io/visetevent.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include "viint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
void osViSetEvent(OSMesgQueue *mq, OSMesg m, u32 retraceCount) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
||||
__osViNext->msgq = mq;
|
||||
__osViNext->msg = m;
|
||||
__osViNext->retraceCount = retraceCount;
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
48
src/libultra/io/visetspecial.c
Normal file
48
src/libultra/io/visetspecial.c
Normal file
@@ -0,0 +1,48 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include <PR/rcp.h>
|
||||
#include "viint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
void osViSetSpecialFeatures(u32 func) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
||||
if ((func & OS_VI_GAMMA_ON) != 0) {
|
||||
__osViNext->control |= VI_CTRL_GAMMA_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_GAMMA_OFF) != 0) {
|
||||
__osViNext->control &= ~VI_CTRL_GAMMA_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_GAMMA_DITHER_ON) != 0) {
|
||||
__osViNext->control |= VI_CTRL_GAMMA_DITHER_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_GAMMA_DITHER_OFF) != 0) {
|
||||
__osViNext->control &= ~VI_CTRL_GAMMA_DITHER_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_DIVOT_ON) != 0) {
|
||||
__osViNext->control |= VI_CTRL_DIVOT_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_DIVOT_OFF) != 0) {
|
||||
__osViNext->control &= ~VI_CTRL_DIVOT_ON;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_DITHER_FILTER_ON) != 0) {
|
||||
__osViNext->control |= VI_CTRL_DITHER_FILTER_ON;
|
||||
__osViNext->control &= ~VI_CTRL_ANTIALIAS_MASK;
|
||||
}
|
||||
|
||||
if ((func & OS_VI_DITHER_FILTER_OFF) != 0) {
|
||||
__osViNext->control &= ~VI_CTRL_DITHER_FILTER_ON;
|
||||
__osViNext->control |= __osViNext->modep->comRegs.ctrl & VI_CTRL_ANTIALIAS_MASK;
|
||||
}
|
||||
|
||||
__osViNext->state |= VI_STATE_CTRL_UPDATED;
|
||||
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
16
src/libultra/io/visetxscale.c
Normal file
16
src/libultra/io/visetxscale.c
Normal file
@@ -0,0 +1,16 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include "viint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
void osViSetXScale(f32 value) {
|
||||
register u32 nomValue;
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
||||
__osViNext->x.factor = value;
|
||||
__osViNext->state |= VI_STATE_XSCALE_UPDATED;
|
||||
nomValue = __osViNext->modep->comRegs.xScale & VI_SCALE_MASK;
|
||||
__osViNext->x.scale = (u32)(__osViNext->x.factor * nomValue) & VI_SCALE_MASK;
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
13
src/libultra/io/visetyscale.c
Normal file
13
src/libultra/io/visetyscale.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <PR/os_internal.h>
|
||||
#include "viint.h"
|
||||
|
||||
// TODO: this comes from a header
|
||||
#ident "$Revision: 1.17 $"
|
||||
|
||||
void osViSetYScale(f32 value) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
||||
__osViNext->y.factor = value;
|
||||
__osViNext->state |= VI_STATE_YSCALE_UPDATED;
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
31
src/libultra/libc/ldiv.c
Normal file
31
src/libultra/libc/ldiv.c
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <stdlib.h>
|
||||
|
||||
lldiv_t lldiv(long long num, long long denom)
|
||||
{
|
||||
lldiv_t ret;
|
||||
|
||||
ret.quot = num / denom;
|
||||
ret.rem = num - denom * ret.quot;
|
||||
|
||||
if (ret.quot < 0 && ret.rem > 0) {
|
||||
ret.quot++;
|
||||
ret.rem -= denom;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ldiv_t ldiv(long num, long denom)
|
||||
{
|
||||
ldiv_t ret;
|
||||
|
||||
ret.quot = num / denom;
|
||||
ret.rem = num - denom * ret.quot;
|
||||
|
||||
if (ret.quot < 0 && ret.rem > 0) {
|
||||
ret.quot++;
|
||||
ret.rem -= denom;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
31
src/libultra/libc/llcvt.c
Normal file
31
src/libultra/libc/llcvt.c
Normal file
@@ -0,0 +1,31 @@
|
||||
long long __d_to_ll(double d) {
|
||||
return d;
|
||||
}
|
||||
|
||||
long long __f_to_ll(float f) {
|
||||
return f;
|
||||
}
|
||||
|
||||
unsigned long long __d_to_ull(double d) {
|
||||
return d;
|
||||
}
|
||||
|
||||
unsigned long long __f_to_ull(float f) {
|
||||
return f;
|
||||
}
|
||||
|
||||
double __ll_to_d(long long s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
float __ll_to_f(long long s) {
|
||||
return s;
|
||||
}
|
||||
|
||||
double __ull_to_d(unsigned long long u) {
|
||||
return u;
|
||||
}
|
||||
|
||||
float __ull_to_f(unsigned long long u) {
|
||||
return u;
|
||||
}
|
||||
311
src/libultra/libc/xldtob.c
Normal file
311
src/libultra/libc/xldtob.c
Normal file
@@ -0,0 +1,311 @@
|
||||
#include "stdlib.h"
|
||||
#include "string.h"
|
||||
#include "xstdio.h"
|
||||
|
||||
// TODO: these come from headers
|
||||
#ident "$Revision: 1.23 $"
|
||||
#ident "$Revision: 1.34 $"
|
||||
#ident "$Revision: 1.5 $"
|
||||
|
||||
#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 const double pows[] = {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
|
||||
#define _D1 1 // big-endian order
|
||||
#define _D2 2
|
||||
#define _D3 3
|
||||
|
||||
#define ALIGN(s, align) (((u32)(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;
|
||||
|
||||
// char unused[0x4];
|
||||
p = buff;
|
||||
ldval = px->v.ld;
|
||||
|
||||
if (px->prec < 0) {
|
||||
px->prec = 6;
|
||||
} else if (px->prec == 0 && (code == 'g' || code == 'G')) {
|
||||
px->prec = 1;
|
||||
}
|
||||
|
||||
err = _Ldunscale(&xexp, px);
|
||||
if (err > 0) {
|
||||
memcpy(px->s, err == 2 ? "NaN" : "Inf", px->n1 = 3);
|
||||
return;
|
||||
} else if (err == 0) {
|
||||
nsig = 0;
|
||||
xexp = 0;
|
||||
} else {
|
||||
int i;
|
||||
int n;
|
||||
|
||||
if (ldval < 0) {
|
||||
ldval = -ldval;
|
||||
}
|
||||
|
||||
// what
|
||||
if ((xexp = xexp * 30103 / 100000 - 4) < 0) {
|
||||
n = ALIGN(-xexp, 4), xexp = -n;
|
||||
|
||||
for (i = 0; n > 0; n >>= 1, i++) {
|
||||
if (n & 1) {
|
||||
ldval *= pows[i];
|
||||
}
|
||||
}
|
||||
} else if (xexp > 0) {
|
||||
f64 factor = 1;
|
||||
|
||||
xexp &= ~3;
|
||||
|
||||
for (n = xexp, i = 0; n > 0; n >>= 1, i++) {
|
||||
if (n & 1) {
|
||||
factor *= pows[i];
|
||||
}
|
||||
}
|
||||
|
||||
ldval /= factor;
|
||||
}
|
||||
{
|
||||
int gen = px->prec + ((code == 'f') ? 10 + xexp : 6);
|
||||
|
||||
if (gen > 0x13) {
|
||||
gen = 0x13;
|
||||
}
|
||||
|
||||
for (*p++ = '0'; gen > 0 && 0 < ldval; p += 8) {
|
||||
int j;
|
||||
int lo = ldval;
|
||||
|
||||
if ((gen -= 8) > 0) {
|
||||
ldval = (ldval - lo) * 1e8;
|
||||
}
|
||||
|
||||
for (p += 8, j = 8; lo > 0 && --j >= 0;) {
|
||||
ldiv_t qr = ldiv(lo, 10);
|
||||
*--p = qr.rem + '0', lo = qr.quot;
|
||||
}
|
||||
|
||||
while (--j >= 0) {
|
||||
*--p = '0';
|
||||
}
|
||||
}
|
||||
|
||||
gen = p - &buff[1];
|
||||
|
||||
for (p = &buff[1], xexp += 7; *p == '0'; p++) {
|
||||
--gen, --xexp;
|
||||
}
|
||||
|
||||
nsig = px->prec + ((code == 'f') ? xexp + 1 : ((code == 'e' || code == 'E') ? 1 : 0));
|
||||
|
||||
if (gen < nsig) {
|
||||
nsig = gen;
|
||||
}
|
||||
|
||||
if (nsig > 0) {
|
||||
char drop = nsig < gen && '5' <= p[nsig] ? '9' : '0';
|
||||
int n;
|
||||
|
||||
for (n = nsig; p[--n] == drop;) {
|
||||
--nsig;
|
||||
}
|
||||
|
||||
if (drop == '9') {
|
||||
++p[n];
|
||||
}
|
||||
|
||||
if (n < 0) {
|
||||
--p, ++nsig, ++xexp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_Genld(px, code, p, nsig, xexp);
|
||||
}
|
||||
|
||||
s16 _Ldunscale(s16* pex, _Pft* px) {
|
||||
u16* ps = px;
|
||||
s16 xchar = (ps[_D0] & _DMASK) >> _DOFF;
|
||||
|
||||
|
||||
if (xchar == _DMAX) {
|
||||
*pex = 0;
|
||||
|
||||
return (ps[_D0] & _DFRAC) || ps[_D1] || ps[_D2] || ps[_D3] ? 2 : 1;
|
||||
} else if (xchar > 0) {
|
||||
ps[_D0] = (ps[_D0] & ~_DMASK) | 0x3FF0;
|
||||
*pex = xchar - 0x3FE;
|
||||
return -1;
|
||||
} else if (xchar < 0) {
|
||||
return 2;
|
||||
} else {
|
||||
*pex = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void _Genld(_Pft* px, char code, u8* p, s16 nsig, s16 xexp) {
|
||||
const unsigned char point = '.';
|
||||
|
||||
if (nsig <= 0) {
|
||||
nsig = 1, p = "0"; // memes
|
||||
}
|
||||
|
||||
if (code == 'f' || (code == 'g' || code == 'G') && xexp >= -4 && xexp < px->prec) {
|
||||
xexp += 1;
|
||||
if (code != 'f') {
|
||||
if (((px->flags & 8) == 0) && nsig < px->prec) {
|
||||
px->prec = nsig;
|
||||
}
|
||||
|
||||
px->prec -= xexp;
|
||||
if (px->prec < 0) {
|
||||
px->prec = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (xexp <= 0) {
|
||||
px->s[px->n1++] = '0';
|
||||
|
||||
if (px->prec > 0 || (px->flags & 8)) {
|
||||
px->s[px->n1++] = point;
|
||||
}
|
||||
|
||||
if (px->prec < -xexp) {
|
||||
xexp = -px->prec;
|
||||
}
|
||||
|
||||
px->nz1 = -xexp;
|
||||
px->prec += xexp;
|
||||
|
||||
if (px->prec < nsig) {
|
||||
nsig = px->prec;
|
||||
}
|
||||
|
||||
memcpy(&px->s[px->n1], p, px->n2 = nsig); // , memes (this one is insane)
|
||||
px->nz2 = px->prec - nsig;
|
||||
} else if (nsig < xexp) {
|
||||
memcpy(&px->s[px->n1], p, nsig);
|
||||
px->n1 += nsig;
|
||||
px->nz1 = xexp - nsig;
|
||||
if (px->prec > 0 || (px->flags & 8)) {
|
||||
px->s[px->n1] = point;
|
||||
px->n2 += 1;
|
||||
}
|
||||
|
||||
px->nz2 = px->prec;
|
||||
} else {
|
||||
memcpy(&px->s[px->n1], p, xexp);
|
||||
px->n1 += xexp;
|
||||
nsig -= xexp;
|
||||
|
||||
if (px->prec > 0 || (px->flags & 8)) {
|
||||
px->s[px->n1++] = point;
|
||||
}
|
||||
|
||||
if (px->prec < nsig) {
|
||||
nsig = px->prec;
|
||||
}
|
||||
|
||||
memcpy(&px->s[px->n1], &p[xexp], nsig);
|
||||
px->n1 += nsig;
|
||||
px->nz1 = px->prec - nsig;
|
||||
}
|
||||
} else {
|
||||
if (code == 'g' || code == 'G') {
|
||||
if (nsig < px->prec) {
|
||||
px->prec = nsig;
|
||||
}
|
||||
|
||||
if (--px->prec < 0) {
|
||||
px->prec = 0;
|
||||
}
|
||||
|
||||
if (code == 'g') {
|
||||
code = 'e';
|
||||
} else {
|
||||
code = 'E';
|
||||
}
|
||||
}
|
||||
|
||||
px->s[px->n1++] = *p++;
|
||||
|
||||
if (px->prec > 0 || (px->flags & 8)) {
|
||||
px->s[px->n1++] = point;
|
||||
}
|
||||
|
||||
if (px->prec > 0) {
|
||||
if (px->prec < --nsig) {
|
||||
nsig = px->prec;
|
||||
}
|
||||
|
||||
memcpy(&px->s[px->n1], p, nsig);
|
||||
px->n1 += nsig;
|
||||
px->nz1 = px->prec - nsig;
|
||||
}
|
||||
|
||||
p = &px->s[px->n1];
|
||||
*p++ = code;
|
||||
|
||||
if (xexp >= 0) {
|
||||
*p++ = '+';
|
||||
} else {
|
||||
*p++ = '-';
|
||||
xexp = -xexp;
|
||||
}
|
||||
|
||||
if (xexp >= 100) {
|
||||
if (xexp >= 1000) {
|
||||
*p++ = (xexp / 1000) + '0', xexp %= 1000; // , memes
|
||||
}
|
||||
*p++ = (xexp / 100) + '0', xexp %= 100; // , memes
|
||||
}
|
||||
*p++ = (xexp / 10) + '0', xexp %= 10; // , memes
|
||||
|
||||
*p++ = xexp + '0';
|
||||
px->n2 = (size_t)p - ((size_t)px->s + px->n1);
|
||||
}
|
||||
|
||||
if ((px->flags & 0x14) == 0x10) {
|
||||
s32 n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2;
|
||||
|
||||
if (n < px->width) {
|
||||
px->nz0 = px->width - n;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
64
src/libultra/libc/xlitob.c
Normal file
64
src/libultra/libc/xlitob.c
Normal file
@@ -0,0 +1,64 @@
|
||||
#include "stdlib.h"
|
||||
#include "string.h"
|
||||
#include "xstdio.h"
|
||||
|
||||
// TODO: these come from headers
|
||||
#ident "$Revision: 1.34 $"
|
||||
#ident "$Revision: 1.5 $"
|
||||
#ident "$Revision: 1.23 $"
|
||||
|
||||
#define BUFF_LEN 0x18
|
||||
|
||||
static char ldigs[] = "0123456789abcdef";
|
||||
static char udigs[] = "0123456789ABCDEF";
|
||||
|
||||
void _Litob(_Pft *args, char type) {
|
||||
char buff[BUFF_LEN];
|
||||
const char *digs;
|
||||
s32 base;
|
||||
s32 i;
|
||||
unsigned long long ullval;
|
||||
|
||||
if (type == 'X') {
|
||||
digs = udigs;
|
||||
} else {
|
||||
digs = ldigs;
|
||||
}
|
||||
|
||||
base = (type == 'o') ? 8 : ((type != 'x' && type != 'X') ? 10 : 16);
|
||||
i = BUFF_LEN;
|
||||
ullval = args->v.ll;
|
||||
|
||||
if ((type == 'd' || type == 'i') && args->v.ll < 0) {
|
||||
ullval = -ullval;
|
||||
}
|
||||
|
||||
if (ullval != 0 || args->prec != 0) {
|
||||
buff[--i] = digs[ullval % base];
|
||||
}
|
||||
|
||||
args->v.ll = ullval / base;
|
||||
|
||||
while (args->v.ll > 0 && i > 0) {
|
||||
lldiv_t qr = lldiv(args->v.ll, base);
|
||||
|
||||
args->v.ll = qr.quot;
|
||||
buff[--i] = digs[qr.rem];
|
||||
}
|
||||
|
||||
args->n1 = BUFF_LEN - i;
|
||||
|
||||
memcpy(args->s, buff + i, args->n1);
|
||||
|
||||
if (args->n1 < args->prec) {
|
||||
args->nz0 = args->prec - args->n1;
|
||||
}
|
||||
|
||||
if (args->prec < 0 && (args->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) {
|
||||
i = args->width - args->n0 - args->nz0 - args->n1;
|
||||
|
||||
if (i > 0) {
|
||||
args->nz0 += i;
|
||||
}
|
||||
}
|
||||
}
|
||||
16
src/libultra/os/sethwinterrupt.c
Normal file
16
src/libultra/os/sethwinterrupt.c
Normal file
@@ -0,0 +1,16 @@
|
||||
#include "PR/os_internal.h"
|
||||
|
||||
struct __osHwInt {
|
||||
s32 (*handler)(void);
|
||||
void *stackEnd;
|
||||
};
|
||||
|
||||
extern struct __osHwInt __osHwIntTable[];
|
||||
|
||||
void __osSetHWIntrRoutine(OSHWIntr interrupt, s32 (*handler)(void), void *stackEnd) {
|
||||
register u32 saveMask= __osDisableInt();
|
||||
|
||||
__osHwIntTable[interrupt].handler = handler;
|
||||
__osHwIntTable[interrupt].stackEnd = stackEnd;
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
6
src/libultra/os/settime.c
Normal file
6
src/libultra/os/settime.c
Normal file
@@ -0,0 +1,6 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "osint.h"
|
||||
|
||||
void osSetTime(OSTime time) {
|
||||
__osCurrentTime = time;
|
||||
}
|
||||
27
src/libultra/os/settimer.c
Normal file
27
src/libultra/os/settimer.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <os_internal.h>
|
||||
#include "osint.h"
|
||||
|
||||
int osSetTimer(OSTimer *t, OSTime value, OSTime interval, OSMesgQueue *mq, OSMesg msg)
|
||||
{
|
||||
OSTime time;
|
||||
|
||||
t->next = NULL;
|
||||
t->prev = NULL;
|
||||
t->interval = interval;
|
||||
|
||||
if (value != 0) {
|
||||
t->value = value;
|
||||
} else {
|
||||
t->value = interval;
|
||||
}
|
||||
|
||||
t->mq = mq;
|
||||
t->msg = msg;
|
||||
time = __osInsertTimer(t);
|
||||
|
||||
if (__osTimerList->next == t) {
|
||||
__osSetTimerIntr(time);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
33
src/libultra/os/startthread.c
Normal file
33
src/libultra/os/startthread.c
Normal file
@@ -0,0 +1,33 @@
|
||||
#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);
|
||||
}
|
||||
10
src/libultra/os/yieldthread.c
Normal file
10
src/libultra/os/yieldthread.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "PR/os_internal.h"
|
||||
#include "osint.h"
|
||||
|
||||
void osYieldThread(void) {
|
||||
register u32 saveMask = __osDisableInt();
|
||||
|
||||
__osRunningThread->state = OS_STATE_RUNNABLE;
|
||||
__osEnqueueAndYield(&__osRunQueue);
|
||||
__osRestoreInt(saveMask);
|
||||
}
|
||||
@@ -375,4 +375,16 @@ _getVol = 0x80061238;
|
||||
osViModePalLan1 = 0x8007AD00;
|
||||
osViModeMpalLan1 = 0x8007ADA0;
|
||||
osViModeNtscLan1 = 0x8007AD50;
|
||||
__additional_scanline = 0x8007AEAC;
|
||||
g_OsGbNintendoData = 0x8007ADF0;
|
||||
g_OsGbCartVersions = 0x8007AE20;
|
||||
__CartRomHandle = 0x801038D0;
|
||||
__osPfsLastChannel = 0x8007AE50;
|
||||
__osViDevMgr = 0x8007AE90;
|
||||
__additional_scanline = 0x8007AEAC;
|
||||
viThread = 0x80103950;
|
||||
viThreadStack = 0x80103B00;
|
||||
viEventQueue = 0x80104B00;
|
||||
viEventBuf = 0x80104B18;
|
||||
viRetraceMsg = 0x80104B30;
|
||||
viCounterMsg = 0x80104B48;
|
||||
__osHwIntTable = 0x80079650;
|
||||
Reference in New Issue
Block a user