From 9fa0a7f1da1b70bee995f53c6c96c43189018772 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Wed, 1 Feb 2023 18:45:02 -0400 Subject: global: Import Dolphin SDK This version comes from the Metroid Prime decompilation project. https://github.com/PrimeDecomp/prime --- src/Dolphin/dvd/dvdlow.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/Dolphin/dvd/dvdlow.c (limited to 'src/Dolphin/dvd/dvdlow.c') diff --git a/src/Dolphin/dvd/dvdlow.c b/src/Dolphin/dvd/dvdlow.c new file mode 100644 index 0000000..1a939ba --- /dev/null +++ b/src/Dolphin/dvd/dvdlow.c @@ -0,0 +1,109 @@ +#include "dolphin/DVDPriv.h" +#include "dolphin/os.h" + +static BOOL FirstRead = TRUE; +static volatile BOOL StopAtNextInt = FALSE; +static u32 LastLength = 0; +static DVDLowCallback Callback = NULL; +static DVDLowCallback ResetCoverCallback = NULL; +static OSTime LastResetEnd = 0; +static BOOL ResetOccurred = FALSE; +static volatile BOOL WaitingCoverClose = FALSE; +static BOOL Breaking = FALSE; +static u32 WorkAroundType = 0; +static u32 WorkAroundSeekLocation = 0; +static OSTime LastReadFinished = 0; +static OSTime LastReadIssued = 0; +static BOOL LastCommandWasRead = FALSE; +static u32 NextCommandNumber = 0; + +typedef struct DVDUnk { + u32 _0; + u32 _4; + u32 _8; +} DVDUnk; + +typedef struct DVDCommand { + s32 _0; + u32 _4; + u32 _8; + u32 _c; + DVDLowCallback callback; +} DVDCommand; + +static DVDCommand CommandList[4]; +static OSAlarm AlarmForWA; +static OSAlarm AlarmForTimeout; +static OSAlarm AlarmForBreak; +static DVDUnk Prev; +static DVDUnk Cur; + +void __DVDInitWA() { + NextCommandNumber = 0; + CommandList[0]._0 = -1; + __DVDLowSetWAType(0, 0); + OSInitAlarm(); +} +static void Read(u32 tmp1, u32 tmp2, u32 tmp3, DVDLowCallback tmp4); +void __DVDInterruptHandler(__OSInterrupt interrupt, OSContext* context) {} + +static void AlarmHandler(OSAlarm* alarm, OSContext* context) { + DVDCommand* cmd; + cmd = &CommandList[NextCommandNumber]; + + if (cmd->_0 == 1) { + ++NextCommandNumber; + Read(cmd->_4, cmd->_8, cmd->_c, cmd->callback); + } else if (cmd->_0 == 2) { + ++NextCommandNumber; + DVDLowSeek(cmd->_c, cmd->callback); + } +} + +static void AlarmHandlerForTimeout(OSAlarm* alarm, OSContext* context) { + OSContext tmpContext; + DVDLowCallback callback; + __OSMaskInterrupts(0x400); + OSClearContext(&tmpContext); + OSSetCurrentContext(&tmpContext); + callback = Callback; + Callback = NULL; + if (callback != NULL) { + callback(0x10); + } + OSClearContext(&tmpContext); + OSSetCurrentContext(context); +} + +static void Read(u32 tmp1, u32 tmp2, u32 tmp3, DVDLowCallback tmp4) { + +} + +static void SeekTwiceBeforeRead() { + +} + +void DVDLowRead(u32 unk, DVDLowCallback callback) { + +} + +void DVDLowSeek(u32 offset, DVDLowCallback callback) { + +} + +BOOL DVDLowWaitCoverClose(DVDLowCallback callback) { + Callback = callback; + WaitingCoverClose = TRUE; + StopAtNextInt = FALSE; + __DIRegs[1] = 2; + return TRUE; +} + + +void __DVDLowSetWAType(u32 type, u32 location) { + BOOL enabled; + enabled = OSDisableInterrupts(); + WorkAroundType = type; + WorkAroundSeekLocation = location; + OSRestoreInterrupts(enabled); +} -- cgit v1.2.3-13-gbd6f