Skip to content
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
4 changes: 2 additions & 2 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -813,8 +813,8 @@ def MatchingFor(*versions):
Object(Matching, "dolphin/src/os/OSThread.c"),
Object(Matching, "dolphin/src/os/OSTime.c"),
Object(Matching, "dolphin/src/os/OSSync.c"),
Object(NonMatching, "dolphin/src/os/init/__start.c"),
Object(NonMatching, "dolphin/src/os/init/__ppc_eabi_init.cpp")
Object(Matching, "dolphin/src/os/init/__start.c"),
Object(Matching, "dolphin/src/os/init/__ppc_eabi_init.cpp")
]
),
DolphinLib(
Expand Down
86 changes: 86 additions & 0 deletions include/dol2asm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#ifndef DOL2ASM
#define DOL2ASM

#ifdef __MWERKS__

#ifdef __cplusplus
#define SECTION_INIT extern "C" __declspec(section ".init")
#define SECTION_RODATA __declspec(section ".rodata")
#define SECTION_DATA __declspec(section ".data")
#define SECTION_SDATA __declspec(section ".sdata")
#define SECTION_SDATA2 __declspec(section ".sdata2")
#define SECTION_BSS __declspec(section ".data")
#define SECTION_SBSS __declspec(section ".sdata")
#define SECTION_SBSS2 __declspec(section ".sdata2")
#define SECTION_CTORS extern "C" __declspec(section ".ctors")
#define SECTION_DTORS extern "C" __declspec(section ".dtors")
#define SECTION_EXTAB extern "C" __declspec(section "extab_")
#define SECTION_EXTABINDEX extern "C" __declspec(section "extabindex_")
#define SECTION_DEAD extern "C" __declspec(section ".dead")
#define SECTION_CTORS10 __declspec(section ".ctors$10")
#define SECTION_CTORS15 __declspec(section ".ctors$15")
#define SECTION_DTORS10 __declspec(section ".dtors$10")
#define SECTION_DTORS15 __declspec(section ".dtors$15")
#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE)
#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION);
#else
#define SECTION_INIT __declspec(section ".init")
#define SECTION_RODATA __declspec(section ".rodata")
#define SECTION_DATA __declspec(section ".data")
#define SECTION_SDATA __declspec(section ".sdata")
#define SECTION_SDATA2 __declspec(section ".sdata2")
#define SECTION_BSS __declspec(section ".data")
#define SECTION_SBSS __declspec(section ".sdata")
#define SECTION_SBSS2 __declspec(section ".sdata2")
#define SECTION_CTORS __declspec(section ".ctors")
#define SECTION_DTORS __declspec(section ".dtors")
#define SECTION_EXTAB __declspec(section "extab_")
#define SECTION_EXTABINDEX __declspec(section "extabindex_")
#define SECTION_DEAD __declspec(section ".dead")
#define SECTION_CTORS10 __declspec(section ".ctors$10")
#define SECTION_CTORS15 __declspec(section ".ctors$15")
#define SECTION_DTORS10 __declspec(section ".dtors$10")
#define SECTION_DTORS15 __declspec(section ".dtors$15")
#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE)
#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION);
#endif

#else
#define SECTION_INIT
#define SECTION_RODATA
#define SECTION_DATA
#define SECTION_SDATA
#define SECTION_SDATA2
#define SECTION_BSS
#define SECTION_SBSS
#define SECTION_SBSS2
#define SECTION_CTORS
#define SECTION_DTORS
#define SECTION_EXTAB
#define SECTION_EXTABINDEX
#define SECTION_DEAD
#define SECTION_CTORS10
#define SECTION_CTORS15
#define SECTION_DTORS10
#define SECTION_DTORS15
#define COMPILER_STRIP_GATE(...)
#define REGISTER_CTORS(...)

#define asm
#define nofralloc
#endif

#define _HUGE_ENUF 1e+300
#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
#define HUGE_VAL ((double)INFINITY)
#define HUGE_VALL ((long double)INFINITY)

#define DOUBLE_INF HUGE_VAL

#pragma section ".dead"
#pragma section ".ctors$10"
#pragma section ".ctors$15"
#pragma section ".dtors$10"
#pragma section ".dtors$15"

#endif
6 changes: 6 additions & 0 deletions src/dolphin/include/dolphin/PPCArch.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#ifndef _DOLPHIN_PPCARCH_WRAPPER_H
#define _DOLPHIN_PPCARCH_WRAPPER_H

#include <dolphin/base/PPCArch.h>

#endif
24 changes: 24 additions & 0 deletions src/dolphin/include/dolphin/dolphin.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef _DOLPHIN_H_
#define _DOLPHIN_H_

#include <dolphin/types.h>
#include <dolphin/os.h>
#include <dolphin/dsp.h>
#include <dolphin/dvd.h>
#include <dolphin/gx.h>
#include <dolphin/hio.h>
#include <dolphin/mtx.h>
#include <dolphin/vi.h>
#include <dolphin/card.h>
#include <dolphin/perf.h>
#include <dolphin/ar.h>
#include <dolphin/PPCArch.h>
#include <dolphin/db.h>
#include <dolphin/pad.h>
#include <dolphin/dtk.h>
#include <dolphin/ai.h>
#include <dolphin/demo.h>
#include <dolphin/exi.h>
#include <dolphin/si.h>

#endif
15 changes: 15 additions & 0 deletions src/dolphin/include/dolphin/os/__ppc_eabi_init.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef _DOLPHIN_OS___PPC_EABI_INIT_H
#define _DOLPHIN_OS___PPC_EABI_INIT_H

#ifdef __cplusplus
extern "C" {
#endif

__declspec(section ".init") extern void __init_hardware(void);
__declspec(section ".init") extern void __flush_cache(register void* address, register unsigned int size);

#ifdef __cplusplus
}
#endif

#endif
6 changes: 3 additions & 3 deletions src/dolphin/src/os/OS.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ extern OSTime __OSGetSystemTime();
static const char* __OSVersion =
"<< Dolphin SDK - OS\trelease build: Apr 17 2003 12:33:06 (0x2301) >>";
// needs to be "<< Dolphin SDK - DSP\trelease build: Apr 17 2003 12:34:16 (0x2301) >>"?
extern char _db_stack_end[];
extern char _db_stack_end[] AT_ADDRESS(0x803D8A50);

#define OS_BI2_DEBUG_ADDRESS 0x800000F4
#define DEBUGFLAG_ADDR 0x800030E8
Expand All @@ -32,8 +32,8 @@ static __OSExceptionHandler* OSExceptionTable;
OSTime __OSStartTime;
BOOL __OSInIPL;

extern u8 __ArenaHi[];
extern u8 __ArenaLo[];
extern u8 __ArenaHi[] AT_ADDRESS(0x81800000);
extern u8 __ArenaLo[] AT_ADDRESS(0x803D9A60);
extern u32 __DVDLongFileNameFlag;
extern u32 __PADSpec;

Expand Down
2 changes: 1 addition & 1 deletion src/dolphin/src/os/OSThread.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ static void DefaultSwitchThreadCallback(OSThread* from, OSThread* to)
{
}

extern u8 _stack_addr[];
extern u8 _stack_addr[] AT_ADDRESS(0x803D8A50);
extern u8 _stack_end[];

#define AddTail(queue, thread, link) \
Expand Down
76 changes: 40 additions & 36 deletions src/dolphin/src/os/init/__ppc_eabi_init.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#include <dolphin/os.h>
#include <dolphin/base.h>
#include <dolphin/PPCArch.h>
#include <dolphin/os/__ppc_eabi_init.h>

#ifdef __cplusplus
extern "C" {
Expand All @@ -8,61 +8,64 @@ extern "C" {
void __OSPSInit();
void __OSFPRInit();
void __OSCacheInit();

typedef void (*voidfunctionptr)(void); // pointer to function returning void
__declspec(section ".ctors") extern voidfunctionptr _ctors[];
__declspec(section ".dtors") extern voidfunctionptr _dtors[];

static void __init_cpp(void);
void __init_cpp(void);

// clang-format off
__declspec(section ".init") asm void __init_hardware(void)
{ // clang-format off
asm void __init_hardware(void)
{
nofralloc
mfmsr r0
ori r0,r0,MSR_FP
ori r0, r0, 0x2000
mtmsr r0
mflr r31
bl __OSPSInit
bl __OSFPRInit
bl __OSCacheInit
mtlr r31

mflr r31
bl __OSPSInit
bl __OSFPRInit
bl __OSCacheInit
mtlr r31
blr
}
// clang-format on

__declspec(section ".init") asm void __flush_cache(void *address, unsigned int size)
{ // clang-format off
// clang-format off
asm void __flush_cache(register void *address, register unsigned int size)
{
nofralloc
lis r5, 0xffff
ori r5, r5, 0xfff1
and r5, r5, r3
subf r3, r5, r3
add r4, r4, r3
rept:
dcbst 0,r5
lis r5, ~0
ori r5, r5, ~14
and r5, r5, r3
subf r3, r5, r3
add r4, r4, r3

loop:
dcbst r0, r5
sync
icbi 0,r5
addic r5,r5,0x8
subic. r4,r4,0x8
bge rept
icbi r0, r5
addic r5, r5, 8
subic. r4, r4, 8
bge loop
isync
blr
}
// clang-format on

void __init_user(void)
void __init_user()
{
__init_cpp();
}

static void __init_cpp(void)
typedef void (*voidfunctionptr)(void); // pointer to function returning void
__declspec(section ".init") extern voidfunctionptr _ctors[];
__declspec(section ".init") extern voidfunctionptr _dtors[];

void __init_cpp(void)
{
voidfunctionptr* constructor;
voidfunctionptr *constructor;

/*
* call static initializers
*/
for (constructor = _ctors; *constructor; constructor++)
{
* call static initializers
*/
for (constructor = _ctors; *constructor; constructor++) {
(*constructor)();
}
}
Expand All @@ -71,6 +74,7 @@ void _ExitProcess(void)
{
PPCHalt();
}

#ifdef __cplusplus
}
#endif
Loading
Loading