Twilight Princess
Decompilation of The Legend of Zelda: Twilight Princess
Loading...
Searching...
No Matches
os.h
Go to the documentation of this file.
1#ifndef _DOLPHIN_OS_H_
2#define _DOLPHIN_OS_H_
3
4#include <stdio.h>
5
6#ifdef __REVOLUTION_SDK__
7#include <revolution/os.h>
8#else
9#include <dolphin/types.h>
10#include <dolphin/gx/GXStruct.h>
11void OSReportInit(void);
13void OSVAttention(const char* fmt, va_list args);
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19typedef s64 OSTime;
20typedef u32 OSTick;
21
22#include <dolphin/os/OSAlloc.h>
23#include <dolphin/os/OSCache.h>
26#include <dolphin/os/OSModule.h>
27#include <dolphin/os/OSThread.h>
28#include <dolphin/os/OSMutex.h>
29#include <dolphin/os/OSFont.h>
30#include <dolphin/os/OSReset.h>
32#include <dolphin/os/OSError.h>
33#include <dolphin/os/OSTime.h>
34#include <dolphin/os/OSSerial.h>
35#include <dolphin/os/OSRtc.h>
38#include <dolphin/os/OSAlarm.h>
39#include <dolphin/os/OSDC.h>
40#include <dolphin/os/OSIC.h>
41#include <dolphin/os/OSLC.h>
42#include <dolphin/os/OSL2.h>
43#include <dolphin/os/OSReboot.h>
44#include <dolphin/os/OSExec.h>
45#include <dolphin/os/OSMemory.h>
47#include <dolphin/os/OSUtf.h>
48#include <dolphin/os/OSTimer.h>
49
50// private macro, maybe shouldn't be defined here?
51#define OFFSET(addr, align) (((u32)(addr) & ((align)-1)))
52
53#define DOLPHIN_ALIGNMENT 32
54
55// Upper words of the masks, since UIMM is only 16 bits
56#define OS_CACHED_REGION_PREFIX 0x8000
57#define OS_UNCACHED_REGION_PREFIX 0xC000
58#define OS_PHYSICAL_MASK 0x3FFF
59
60#define OS_BASE_CACHED (OS_CACHED_REGION_PREFIX << 16)
61#define OS_BASE_UNCACHED (OS_UNCACHED_REGION_PREFIX << 16)
62
63#ifdef __MWERKS__
64u32 __OSPhysicalMemSize AT_ADDRESS(OS_BASE_CACHED | 0x0028);
65volatile int __OSTVMode AT_ADDRESS(OS_BASE_CACHED | 0x00CC);
66OSThreadQueue __OSActiveThreadQueue AT_ADDRESS(OS_BASE_CACHED | 0x00DC);
67OSThread* __OSCurrentThread AT_ADDRESS(OS_BASE_CACHED | 0x00E4);
68u32 __OSSimulatedMemSize AT_ADDRESS(OS_BASE_CACHED | 0x00F0);
69u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8);
70u32 __OSCoreClock AT_ADDRESS(OS_BASE_CACHED | 0x00FC);
71volatile u16 __OSDeviceCode AT_ADDRESS(OS_BASE_CACHED | 0x30E6);
72u16 __OSWirelessPadFixMode AT_ADDRESS(OS_BASE_CACHED | 0x30E0);
73
74// unknowns
75OSThread* __gUnkThread1 AT_ADDRESS(OS_BASE_CACHED | 0x00D8);
76int __gUnknown800030C0[2] AT_ADDRESS(OS_BASE_CACHED | 0x30C0);
77u8 __gUnknown800030E3 AT_ADDRESS(OS_BASE_CACHED | 0x30E3);
78#else
79#define __OSBusClock (*(u32 *)(OS_BASE_CACHED | 0x00F8))
80#define __OSCoreClock (*(u32 *)(OS_BASE_CACHED | 0x00FC))
81#endif
82
83#define OS_BUS_CLOCK __OSBusClock
84#define OS_CORE_CLOCK __OSCoreClock
85#define OS_TIMER_CLOCK (OS_BUS_CLOCK/4)
86
87#define OSTicksToSeconds(ticks) ((ticks) / (OS_TIMER_CLOCK))
88#define OSTicksToMilliseconds(ticks) ((ticks) / (OS_TIMER_CLOCK/1000))
89#define OSTicksToMicroseconds(ticks) ((ticks) * 8 / (OS_TIMER_CLOCK/125000))
90#define OSSecondsToTicks(sec) ((sec) * (OS_TIMER_CLOCK))
91#define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000))
92#define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000)
93#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8)
94
96void OSInit(void);
97void OSRegisterVersion(const char* id);
98
99void* OSGetArenaHi(void);
100void* OSGetArenaLo(void);
101void OSSetArenaHi(void* newHi);
102void OSSetArenaLo(void* newLo);
103void* OSAllocFromArenaLo(u32 size, u32 align);
104void* OSAllocFromArenaHi(u32 size, u32 align);
105
107
108void __OSPSInit(void);
109void __OSFPRInit(void);
110u32 __OSGetDIConfig(void);
111
113
114typedef struct OSCalendarTime {
115 /* 0x00 */ int sec;
116 /* 0x04 */ int min;
117 /* 0x08 */ int hour;
118 /* 0x0C */ int mday;
119 /* 0x10 */ int mon;
120 /* 0x14 */ int year;
121 /* 0x18 */ int wday;
122 /* 0x1C */ int yday;
123 /* 0x20 */ int msec;
124 /* 0x24 */ int usec;
126
127#include <dolphin/dvd.h>
139
150
151void OSInitStopwatch(OSStopwatch* sw, char* name);
157
158OSTick OSGetTick(void);
159OSTime OSGetTime(void);
165
166#define OS_CONSOLE_MASK 0xF0000000
167#define OS_CONSOLE_RETAIL 0x00000000
168#define OS_CONSOLE_DEVELOPMENT 0x10000000
169#define OS_CONSOLE_TDEV 0x20000000
170
171#define OS_CONSOLE_RETAIL4 0x00000004
172#define OS_CONSOLE_RETAIL3 0x00000003
173#define OS_CONSOLE_RETAIL2 0x00000002
174#define OS_CONSOLE_RETAIL1 0x00000001
175#define OS_CONSOLE_TDEVHW4 0x20000007
176#define OS_CONSOLE_TDEVHW3 0x20000006
177#define OS_CONSOLE_TDEVHW2 0x20000005
178#define OS_CONSOLE_TDEVHW1 0x20000004
179#define OS_CONSOLE_DEVHW4 0x10000007
180#define OS_CONSOLE_DEVHW3 0x10000006
181#define OS_CONSOLE_DEVHW2 0x10000005
182#define OS_CONSOLE_DEVHW1 0x10000004
183#define OS_CONSOLE_MINNOW 0x10000003
184#define OS_CONSOLE_ARTHUR 0x10000002
185#define OS_CONSOLE_PC_EMULATOR 0x10000001
186#define OS_CONSOLE_EMULATOR 0x10000000
187
188#define OS_SOUND_MODE_MONO 0
189#define OS_SOUND_MODE_STEREO 1
190
191u32 OSGetSoundMode(void);
193
194DECL_WEAK void OSReport(const char* msg, ...);
195DECL_WEAK void OSVReport(const char* msg, va_list list);
196DECL_WEAK void OSPanic(const char* file, int line, const char* msg, ...);
197void OSFatal(GXColor fg, GXColor bg, const char* msg);
198
199// do these belong here?
200DECL_WEAK void OSAttention(const char* msg, ...);
201DECL_WEAK void OSReport_Error(const char* fmt, ...);
202DECL_WEAK void OSReport_FatalError(const char* fmt, ...);
203DECL_WEAK void OSReport_System(const char* fmt, ...);
204DECL_WEAK void OSReport_Warning(const char* fmt, ...);
205DECL_WEAK void OSReportDisable(void);
206DECL_WEAK void OSReportEnable(void);
207DECL_WEAK void OSReportForceEnableOff(void);
208DECL_WEAK void OSReportForceEnableOn(void);
209DECL_WEAK void OSVReport(const char* format, va_list list);
210
211#if DEBUG
212#define OS_REPORT(...) OSReport(__VA_ARGS__)
213#define OS_WARNING(...) OSReport_Warning(__VA_ARGS__)
214#define OS_REPORT_ERROR(...) OSReport_Error(__VA_ARGS__)
215#define OS_PANIC(line, msg) OSPanic(__FILE__, line, msg)
216#else
217#define OS_REPORT(...)
218#define OS_WARNING(...)
219#define OS_REPORT_ERROR(...)
220#define OS_PANIC(...)
221#endif
222
227extern u8 __OSReport_enable;
228
229#define OSRoundUp32B(x) (((u32)(x) + 32 - 1) & ~(32 - 1))
230#define OSRoundDown32B(x) (((u32)(x)) & ~(32 - 1))
231
232void* OSPhysicalToCached(u32 paddr);
233void* OSPhysicalToUncached(u32 paddr);
234u32 OSCachedToPhysical(void* caddr);
235u32 OSUncachedToPhysical(void* ucaddr);
236void* OSCachedToUncached(void* caddr);
237void* OSUncachedToCached(void* ucaddr);
238
239#if !DEBUG
240#define OSPhysicalToCached(paddr) ((void*) ((u32)(OS_BASE_CACHED + (u32)(paddr))))
241#define OSPhysicalToUncached(paddr) ((void*) ((u32)(OS_BASE_UNCACHED + (u32)(paddr))))
242#define OSCachedToPhysical(caddr) ((u32) ((u32)(caddr) - OS_BASE_CACHED))
243#define OSUncachedToPhysical(ucaddr) ((u32) ((u32)(ucaddr) - OS_BASE_UNCACHED))
244#define OSCachedToUncached(caddr) ((void*) ((u8*)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED)))
245#define OSUncachedToCached(ucaddr) ((void*) ((u8*)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED)))
246#endif
247
248// unsorted externs
249extern OSTime __OSGetSystemTime(void);
250DECL_WEAK extern int __OSIsGcam;
252extern OSTime __OSStartTime;
253extern int __OSInIPL;
254
255// helper for assert line numbers in different revisions
256#if SDK_REVISION < 1
257 #define LINE(l0, l1, l2) (l0)
258#elif SDK_REVISION < 2
259 #define LINE(l0, l1, l2) (l1)
260#else
261 #define LINE(l0, l1, l2) (l2)
262#endif
263
264#if DEBUG
265#define ASSERTLINE(line, cond) \
266 ((cond) || (OSPanic(__FILE__, line, "Failed assertion " #cond), 0))
267
268#define ASSERTMSGLINE(line, cond, msg) \
269 ((cond) || (OSPanic(__FILE__, line, msg), 0))
270
271// This is dumb but we dont have a Metrowerks way to do variadic macros in the macro to make this done in a not scrubby way.
272#define ASSERTMSG1LINE(line, cond, msg, arg1) \
273 ((cond) || (OSPanic(__FILE__, line, msg, arg1), 0))
274
275#define ASSERTMSG2LINE(line, cond, msg, arg1, arg2) \
276 ((cond) || (OSPanic(__FILE__, line, msg, arg1, arg2), 0))
277
278#define ASSERTMSGLINEV(line, cond, ...) \
279 ((cond) || (OSPanic(__FILE__, line, __VA_ARGS__), 0))
280
281#else
282#define ASSERTLINE(line, cond) (void)0
283#define ASSERTMSGLINE(line, cond, msg) (void)0
284#define ASSERTMSG1LINE(line, cond, msg, arg1) (void)0
285#define ASSERTMSG2LINE(line, cond, msg, arg1, arg2) (void)0
286#define ASSERTMSGLINEV(line, cond, ...) (void)0
287#endif
288
289#define ASSERT(cond) ASSERTLINE(__LINE__, cond)
290
291inline s16 __OSf32tos16(__REGISTER f32 inF) {
292 __REGISTER s16 out;
293 u32 tmp;
294 __REGISTER u32* tmpPtr = &tmp;
295 // clang-format off
296#ifdef __MWERKS__
297 asm {
298 psq_st inF, 0(tmpPtr), 0x1, 5
299 lha out, 0(tmpPtr)
300 }
301#endif
302 // clang-format on
303
304 return out;
305}
306
307inline void OSf32tos16(f32* f, s16* out) {
308 *out = __OSf32tos16(*f);
309}
310
311inline u8 __OSf32tou8(__REGISTER f32 inF) {
312 __REGISTER u8 out;
313 u32 tmp;
314 __REGISTER u32* tmpPtr = &tmp;
315 // clang-format off
316#ifdef __MWERKS__
317 asm {
318 psq_st inF, 0(tmpPtr), 0x1, 2
319 lbz out, 0(tmpPtr)
320 }
321#endif
322 // clang-format on
323
324 return out;
325}
326
327inline void OSf32tou8(f32* f, u8* out) {
328 *out = __OSf32tou8(*f);
329}
330
331static inline void OSInitFastCast(void) {
332 // clang-format off
333#ifdef __MWERKS__
334 asm {
335 li r3, 4
336 oris r3, r3, 4
337 mtspr 0x392, r3
338 li r3, 5
339 oris r3, r3, 5
340 mtspr 0x393, r3
341 li r3, 6
342 oris r3, r3, 6
343 mtspr 0x394, r3
344 li r3, 7
345 oris r3, r3, 7
346 mtspr 0x395, r3
347 }
348#endif
349 // clang-format on
350}
351
352#ifdef __cplusplus
353}
354#endif
355
356#endif
357#endif
static OSContext context
Definition JUTException.cpp:157
s16 name
Definition d_a_e_pz.cpp:1754
u32 mode
Definition GXTev.c:56
u8 __OSException
Definition OSException.h:34
unsigned int size
Definition __os.h:106
BOOL OSDisableInterrupts(void)
Definition OSInterrupt.c:85
void OSf32tos16(f32 *f, s16 *out)
Definition os.h:307
DECL_WEAK int __OSIsGcam
Definition OS.c:63
void OSReportInit(void)
Definition m_Do_printf.cpp:103
OSTime OSGetTime(void)
Definition OSTime.c:14
BOOL OSRestoreInterrupts(BOOL level)
void OSFatal(GXColor fg, GXColor bg, const char *msg)
Definition OSFatal.c:159
void __OSPSInit(void)
Definition OS.c:605
DECL_WEAK void OSReportForceEnableOff(void)
Definition m_Do_printf.cpp:76
u32 OSUncachedToPhysical(void *ucaddr)
Definition OSAddress.c:26
OSExecParams __OSRebootParams
Definition OS.c:43
void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime *td)
Definition OSTime.c:137
u32 OSGetPhysicalMemSize(void)
Definition OSMemory.c:19
u8 __OSReport_System_disable
Definition m_Do_printf.cpp:17
struct OSCalendarTime OSCalendarTime
s64 OSTime
Definition os.h:19
void OSSetSoundMode(u32 mode)
Definition OSRtc.c:306
BOOL OSEnableInterrupts(void)
Definition OSInterrupt.c:96
OSTime __OSStartTime
Definition OS.c:57
void * OSCachedToUncached(void *caddr)
Definition OSAddress.c:31
DECL_WEAK void OSReport_Error(const char *fmt,...)
Definition m_Do_printf.cpp:215
u8 __OSf32tou8(__REGISTER f32 inF)
Definition os.h:311
void OSResetStopwatch(OSStopwatch *sw)
Definition OSStopwatch.c:44
void * OSAllocFromArenaHi(u32 size, u32 align)
Definition OSArena.c:42
void OSRegisterVersion(const char *id)
Definition OS.c:629
DECL_WEAK void OSReport_System(const char *fmt,...)
Definition m_Do_printf.cpp:258
DECL_WEAK void OSReport(const char *msg,...)
Definition OSError.c:12
u32 OSGetSoundMode(void)
Definition OSRtc.c:298
u32 OSTick
Definition os.h:20
void * OSPhysicalToCached(u32 paddr)
Definition OSAddress.c:11
OSTime OSCheckStopwatch(OSStopwatch *sw)
Definition OSStopwatch.c:34
u32 __OSPhysicalMemSize AT_ADDRESS(OS_BASE_CACHED|0x0028)
void OSStopStopwatch(OSStopwatch *sw)
Definition OSStopwatch.c:17
u8 __OSReport_Warning_disable
Definition m_Do_printf.cpp:15
u8 __OSReport_disable
Definition m_Do_printf.cpp:11
void * OSPhysicalToUncached(u32 paddr)
Definition OSAddress.c:16
void OSInitStopwatch(OSStopwatch *sw, char *name)
Definition OSStopwatch.c:4
DECL_WEAK void OSVReport(const char *msg, va_list list)
Definition OSError.c:19
void __OSFPRInit(void)
Definition OS.c:86
DECL_WEAK void OSPanic(const char *file, int line, const char *msg,...)
Definition OSError.c:23
void OSVAttention(const char *fmt, va_list args)
Definition m_Do_printf.cpp:53
DECL_WEAK void OSReportDisable(void)
Definition m_Do_printf.cpp:64
void * OSGetArenaLo(void)
Definition OSArena.c:16
u32 OSGetConsoleType(void)
Definition OS.c:181
s16 __OSf32tos16(__REGISTER f32 inF)
Definition os.h:291
void OSSwitchFiberEx(u32, u32, u32, u32, u32, u32)
DECL_WEAK void OSReportForceEnableOn(void)
Definition m_Do_printf.cpp:72
void OSStartStopwatch(OSStopwatch *sw)
Definition OSStopwatch.c:12
u32 OSCachedToPhysical(void *caddr)
Definition OSAddress.c:21
struct OSBootInfo_s OSBootInfo
DECL_WEAK void OSReport_Warning(const char *fmt,...)
Definition m_Do_printf.cpp:243
OSTick OSGetTick(void)
Definition OSTime.c:29
void OSSetArenaHi(void *newHi)
Definition OSArena.c:22
void * OSAllocFromArenaLo(u32 size, u32 align)
Definition OSArena.c:30
int __OSInIPL
Definition OS.c:58
void * OSGetArenaHi(void)
Definition OSArena.c:10
u8 __OSReport_enable
Definition m_Do_printf.cpp:19
OSTime OSCalendarTimeToTicks(OSCalendarTime *td)
Definition OSTime.c:173
struct OSStopwatch OSStopwatch
void OSSetArenaLo(void *newLo)
Definition OSArena.c:26
u32 __OSGetDIConfig(void)
Definition OS.c:625
DECL_WEAK void OSReportEnable(void)
Definition m_Do_printf.cpp:68
OSTime __OSGetSystemTime(void)
Definition OSTime.c:59
void OSf32tou8(f32 *f, u8 *out)
Definition os.h:327
DECL_WEAK void OSReport_FatalError(const char *fmt,...)
Definition m_Do_printf.cpp:200
void OSDefaultExceptionHandler(__OSException exception, OSContext *context)
void OSDumpStopwatch(OSStopwatch *sw)
Definition OSStopwatch.c:48
void * OSUncachedToCached(void *ucaddr)
Definition OSAddress.c:36
static void OSInitFastCast(void)
Definition os.h:331
u8 __OSReport_Error_disable
Definition m_Do_printf.cpp:13
DECL_WEAK void OSAttention(const char *msg,...)
Definition m_Do_printf.cpp:57
void OSInit(void)
Definition OS.c:230
int BOOL
Definition types.h:33
unsigned long u32
Definition types.h:12
signed short int s16
Definition types.h:9
signed long long int s64
Definition types.h:13
float f32
Definition types.h:25
unsigned short int u16
Definition types.h:10
unsigned char u8
Definition types.h:8
u8 __OSf32tou8(__REGISTER f32 inF)
Definition os.h:344
DECL_WEAK void OSVReport(const char *msg, va_list list)
Definition OSError.c:19
s16 __OSf32tos16(__REGISTER f32 inF)
Definition os.h:323
Definition dvd.h:71
Definition os.h:128
u32 version
Definition os.h:131
u32 FSTMaxLength
Definition os.h:137
DVDDiskID DVDDiskID
Definition os.h:129
void * arenaLo
Definition os.h:134
void * FSTLocation
Definition os.h:136
u32 magic
Definition os.h:130
void * arenaHi
Definition os.h:135
u32 consoleType
Definition os.h:133
u32 memorySize
Definition os.h:132
Definition os.h:114
int msec
Definition os.h:123
int mday
Definition os.h:118
int sec
Definition os.h:115
int yday
Definition os.h:122
int mon
Definition os.h:119
int wday
Definition os.h:121
int year
Definition os.h:120
int usec
Definition os.h:124
int min
Definition os.h:116
int hour
Definition os.h:117
Definition OSContext.h:140
Definition OSExec.h:13
Definition os.h:140
OSTime min
Definition os.h:144
OSTime last
Definition os.h:146
char * name
Definition os.h:141
u32 hits
Definition os.h:142
OSTime max
Definition os.h:145
u32 _padding
Definition os.h:148
BOOL running
Definition os.h:147
OSTime total
Definition os.h:143
Definition OSThread.h:22
Definition OSThread.h:42
Definition GXStruct.h:30
Definition fdlibm.h:73