Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

r37 changes #9

Open
wants to merge 23 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ else
$(error Unsupported host/building OS <$(UNAME_S)>)
endif

DOLPHIN_REVISION ?= 36

BUILD_DIR := build
TOOLS_DIR := $(BUILD_DIR)/tools
BASEROM_DIR := baserom
Expand Down Expand Up @@ -111,8 +113,7 @@ CC = $(MWCC)
######################## Flags #############################

CHARFLAGS := -char unsigned

CFLAGS = $(CHARFLAGS) -nodefaults -proc gekko -fp hard -Cpp_exceptions off -enum int -warn pragmas -requireprotos -pragma 'cats off'
CFLAGS = $(CHARFLAGS) -nodefaults -proc gekko -fp hard -Cpp_exceptions off -enum int -warn pragmas -requireprotos -pragma 'cats off' -DDOLPHIN_REVISION=$(DOLPHIN_REVISION)
INCLUDES := -Iinclude -Iinclude/libc -ir src

ASFLAGS = -mgekko -I src -I include
Expand All @@ -126,8 +127,10 @@ build/debug/src/card/CARDRename.o: CHARFLAGS := -char signed
build/release/src/card/CARDRename.o: CHARFLAGS := -char signed
build/debug/src/card/CARDOpen.o: CHARFLAGS := -char signed
build/release/src/card/CARDOpen.o: CHARFLAGS := -char signed
ifneq ($(DOLPHIN_REVISION),37)
build/debug/src/dvd/%.o: CFLAGS += -char signed
build/release/src/dvd/%.o: CFLAGS += -char signed
endif

build/debug/src/demo/%.o: CFLAGS += -char signed
build/release/src/demo/%.o: CFLAGS += -char signed
Expand Down Expand Up @@ -293,6 +296,7 @@ dvd_c_files := \
src/dvd/dvdfs.c \
src/dvd/dvd.c \
src/dvd/dvdqueue.c \
src/dvd/dvderror.c \
src/dvd/fstload.c
dvd.a : $(addprefix $(BUILD_DIR)/release/,$(dvd_c_files:.c=.o))
dvdD.a : $(addprefix $(BUILD_DIR)/debug/,$(dvd_c_files:.c=.o))
Expand Down Expand Up @@ -377,6 +381,7 @@ os_c_files := \
src/os/OSMessage.c \
src/os/OSMemory.c \
src/os/OSMutex.c \
src/os/OSReboot.c \
src/os/OSReset.c \
src/os/OSResetSW.c \
src/os/OSRtc.c \
Expand Down
1 change: 1 addition & 0 deletions include/dolphin/card.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ typedef struct CARDID {
#define CARD_RESULT_CANCELED -14
#define CARD_RESULT_FATAL_ERROR -128

// TODO: This should be private
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what are you basing that on?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SDK doesn't seem to have those macros public, and the public API doesn't deal with blocks.

#define CARDIsValidBlockNo(card, blockNo) ((blockNo) >= CARD_NUM_SYSTEM_BLOCK && (blockNo) < (card)->cBlock)

#define CARD_READ_SIZE 512
Expand Down
3 changes: 3 additions & 0 deletions include/dolphin/card/CARDCheck.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef _DOLPHIN_CARDCHECK_H_
#define _DOLPHIN_CARDCHECK_H_

#if DOLPHIN_REVISION >= 37
s32 CARDCheckExAsync(s32 chan, s32 *xferBytes, CARDCallback callback);
#endif
s32 CARDCheckAsync(s32 chan, CARDCallback callback);
long CARDCheck(long chan);

Expand Down
1 change: 1 addition & 0 deletions include/dolphin/dvd.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ void (* DVDLowSetResetCoverCallback(void (* callback)(unsigned long)))(unsigned
int DVDLowBreak();
void (* DVDLowClearCallback())(unsigned long);
unsigned long DVDLowGetCoverStatus();
BOOL DVDCheckDisk(void);

// dvd.c
void DVDInit();
Expand Down
1 change: 1 addition & 0 deletions include/dolphin/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ unsigned int __gUnknown800030C0[2] : (OS_BASE_CACHED | 0x30C0);
#define OSTicksToMicroseconds(ticks) ((ticks)*8 / (OS_TIMER_CLOCK/125000))
#define OSSecondsToTicks(sec) ((sec) * (OS_TIMER_CLOCK))
#define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000))
#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8)
#define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000)
#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8)

Expand Down
5 changes: 5 additions & 0 deletions include/dolphin/os/OSRtc.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,12 @@ typedef struct OSSramEx {
unsigned char flashID[2][12];
unsigned long wirelessKeyboardID;
unsigned short wirelessPadID[4];
#if DOLPHIN_REVISION >= 37
u8 dvdErrorCode;
u8 _padding0;
#else
unsigned short _padding0;
#endif
unsigned char flashIDCheckSum[2];
unsigned char _padding1[4];
} OSSramEx;
Expand Down
25 changes: 20 additions & 5 deletions include/dolphin/os/OSThread.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,29 @@ enum OS_THREAD_STATE

#define OS_THREAD_STACK_MAGIC 0xDEADBABE

typedef void (*OSIdleFunction)(void *param);

void OSInitThreadQueue(OSThreadQueue *queue);
OSThread *OSGetCurrentThread(void);
BOOL OSIsThreadSuspended(OSThread *thread);
BOOL OSIsThreadTerminated(OSThread *thread);
s32 OSDisableScheduler(void);
s32 OSEnableScheduler(void);
void OSYieldThread(void);
BOOL OSCreateThread(OSThread *thread, void *(*func)(void *), void *param, void *stack, u32 stackSize, OSPriority priority, u16 attr);
void OSExitThread(void *val);
void OSCancelThread(OSThread *thread);
BOOL OSJoinThread(OSThread *thread, void *val);
void OSDetachThread(OSThread *thread);
s32 OSResumeThread(OSThread *thread);
s32 OSSuspendThread(OSThread *thread);
void OSSleepThread(OSThreadQueue *queue);
void OSWakeupThread(OSThreadQueue *queue);
s32 OSSuspendThread(OSThread *thread);
s32 OSResumeThread(OSThread* thread);
OSThread* OSGetCurrentThread(void);
s32 OSEnableScheduler(void);
s32 OSDisableScheduler(void);
BOOL OSSetThreadPriority(OSThread *thread, OSPriority priority);
OSPriority OSGetThreadPriority(OSThread *thread);
OSThread *OSSetIdleFunction(OSIdleFunction idleFunction, void *param, void *stack, u32 stackSize);
OSThread *OSGetIdleFunction(void);
long OSCheckActiveThreads(void);

#define IsSuspended(suspend) (suspend > 0)

Expand Down
6 changes: 5 additions & 1 deletion include/dolphin/pad.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,11 @@ typedef struct PADStatus
int PADReset(unsigned long mask);
BOOL PADRecalibrate(u32 mask);
BOOL PADInit();
void PADRead(struct PADStatus * status);
#if DOLPHIN_REVISION >= 37
u32 PADRead(struct PADStatus *status);
#else
void PADRead(struct PADStatus *status);
#endif
void PADSetSamplingRate(unsigned long msec);
void __PADTestSamplingRate(unsigned long tvmode);
void PADControlAllMotors(const u32 *commandArray);
Expand Down
60 changes: 52 additions & 8 deletions src/card/CARDBios.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ void __CARDExtHandler(s32 chan, OSContext *context) {
card->attached = FALSE;
card->result = CARD_RESULT_NOCARD;
EXISetExiCallback(chan, 0);
#if DOLPHIN_REVISION >= 37
OSCancelAlarm(&card->alarm);
#endif
callback = card->exiCallback;

if (callback)
Expand Down Expand Up @@ -113,17 +116,28 @@ void __CARDExiHandler(s32 chan, OSContext *context) {
void __CARDTxHandler(s32 chan, OSContext *context) {
CARDControl *card;
CARDCallback callback;
#if DOLPHIN_REVISION >= 37
BOOL r31;
#endif

ASSERTLINE(0x12D, 0 <= chan && chan < 2);

card = &__CARDBlock[chan];
#if DOLPHIN_REVISION >= 37
r31 = !EXIDeselect(chan);
#else
!EXIDeselect(chan);
#endif
!EXIUnlock(chan);
callback = card->txCallback;
if (callback)
{
card->txCallback = NULL;
#if DOLPHIN_REVISION >= 37
callback(chan, (!r31 && EXIProbe(chan)) ? CARD_RESULT_READY : CARD_RESULT_NOCARD);
#else
callback(chan, (EXIProbe(chan)) ? CARD_RESULT_READY : CARD_RESULT_NOCARD);
#endif
}
}

Expand Down Expand Up @@ -280,6 +294,12 @@ static void TimeoutHandler(OSAlarm *alarm, OSContext *context) {
}
}

#if DOLPHIN_REVISION >= 37
if (!card->attached) {
return;
}
#endif

ASSERTLINE(0x20E, 0 <= chan && chan < 2);

EXISetExiCallback(chan, NULL);
Expand All @@ -297,9 +317,13 @@ static void SetupTimeoutAlarm(CARDControl *card) {
{
case 0xF3:
break;
case 0xF2:
#if DOLPHIN_REVISION >= 37
OSSetAlarm(&card->alarm, OSMillisecondsToTicks(100), TimeoutHandler);
break;
#endif
case 0xF4:
case 0xF1:
case 0xF2:
OSSetAlarm(&card->alarm, OSSecondsToTicks((OSTime)2) * (card->sectorSize / 0x2000),
TimeoutHandler);
break;
Expand Down Expand Up @@ -709,15 +733,19 @@ s32 CARDFreeBlocks(s32 chan, s32 *byteNotUsed, s32 *filesNotUsed) {
return __CARDPutControlBlock(card, CARD_RESULT_BROKEN);
}

*byteNotUsed = (s32)(card->sectorSize * fat[CARD_FAT_FREEBLOCKS]);
if (DOLPHIN_REVISION < 37 || byteNotUsed != NULL) {
*byteNotUsed = (s32)(card->sectorSize * fat[CARD_FAT_FREEBLOCKS]);
}

*filesNotUsed = 0;
for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++)
{
ent = &dir[fileNo];
if (ent->fileName[0] == 0xff)
if (DOLPHIN_REVISION < 37 || filesNotUsed != NULL) {
*filesNotUsed = 0;
for (fileNo = 0; fileNo < CARD_MAX_FILE; fileNo++)
{
++*filesNotUsed;
ent = &dir[fileNo];
if (ent->fileName[0] == 0xff)
{
++*filesNotUsed;
}
}
}

Expand Down Expand Up @@ -753,14 +781,30 @@ long CARDGetMemSize(long chan, unsigned short * size) {
s32 CARDGetSectorSize(s32 chan, u32 *size) {
struct CARDControl *card;
long result;
#if DOLPHIN_REVISION >= 37
BOOL enabled;
CARDControl *tmp;
#endif

result = __CARDGetControlBlock(chan, &card);
if (result < 0)
{
return result;
}
*size = card->sectorSize;
#if DOLPHIN_REVISION >= 37
tmp = card;
enabled = OSDisableInterrupts();
if (tmp->attached) {
tmp->result = 0;
} else if (tmp->result == -1) {
tmp->result = 0;
}
OSRestoreInterrupts(enabled);
return 0;
#else
return __CARDPutControlBlock(card, 0);
#endif
}

s32 __CARDSync(s32 chan) {
Expand Down
Loading