Merge branch 'refactor' of https://github.com/smealum/ctrulib into refactor
This commit is contained in:
commit
41c2a759f8
@ -24,18 +24,17 @@ INCLUDES := include
|
||||
#---------------------------------------------------------------------------------
|
||||
# options for code generation
|
||||
#---------------------------------------------------------------------------------
|
||||
ARCH := -marm
|
||||
ARCH := -march=armv6k -mtune=mpcore
|
||||
|
||||
CFLAGS := -g -Wall -O2 -mthumb-interwork\
|
||||
-mcpu=mpcore -mtune=mpcore \
|
||||
-mfpu=vfp -ffast-math -mword-relocations \
|
||||
$(ARCH)
|
||||
CFLAGS := -g -Wall -O2 -mword-relocations \
|
||||
-fomit-frame-pointer -ffast-math \
|
||||
$(ARCH)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DARM11 -D_3DS
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
|
||||
|
||||
ASFLAGS := -g $(ARCH) -mcpu=mpcore -mtune=mpcore
|
||||
LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||
|
||||
ASFLAGS := -g $(ARCH)
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
|
@ -1,9 +1,8 @@
|
||||
#ifndef OS_H
|
||||
#define OS_H
|
||||
|
||||
|
||||
#define SYSTEM_VERSION(major, minor, revision) \
|
||||
(((major)<<24)|((minor)<<16)|((revision)<<8))
|
||||
(((major)<<24)|((minor)<<16)|((revision)<<8))
|
||||
|
||||
u32 osConvertVirtToPhys(u32 vaddr);
|
||||
const char* osStrError(u32 error);
|
||||
|
@ -5,23 +5,22 @@
|
||||
#ifndef SVC_H
|
||||
#define SVC_H
|
||||
|
||||
|
||||
typedef enum {
|
||||
MEMOP_FREE =1, // Free heap
|
||||
MEMOP_ALLOC=3, // Allocate heap
|
||||
MEMOP_MAP =4, // Mirror mapping
|
||||
MEMOP_UNMAP=5, // Mirror unmapping
|
||||
MEMOP_PROT =6, // Change protection
|
||||
MEMOP_FREE =1, // Free heap
|
||||
MEMOP_ALLOC=3, // Allocate heap
|
||||
MEMOP_MAP =4, // Mirror mapping
|
||||
MEMOP_UNMAP=5, // Mirror unmapping
|
||||
MEMOP_PROT =6, // Change protection
|
||||
|
||||
MEMOP_FREE_LINEAR =0x10001, // Free linear heap
|
||||
MEMOP_ALLOC_LINEAR=0x10003 // Allocate linear heap
|
||||
MEMOP_FREE_LINEAR =0x10001, // Free linear heap
|
||||
MEMOP_ALLOC_LINEAR=0x10003 // Allocate linear heap
|
||||
} MemOp;
|
||||
|
||||
typedef enum {
|
||||
MEMPERM_READ =1,
|
||||
MEMPERM_WRITE =2,
|
||||
MEMPERM_EXECUTE=4,
|
||||
MEMPERM_MAX =0xFFFFFFFF //force 4-byte
|
||||
MEMPERM_READ =1,
|
||||
MEMPERM_WRITE =2,
|
||||
MEMPERM_EXECUTE=4,
|
||||
MEMPERM_MAX =0xFFFFFFFF //force 4-byte
|
||||
} MemPerm;
|
||||
|
||||
u32* getThreadCommandBuffer(void);
|
||||
@ -50,5 +49,4 @@ s32 svcConnectToPort(volatile Handle* out, const char* portName);
|
||||
s32 svcSendSyncRequest(Handle session);
|
||||
s32 svcGetProcessId(u32 *out, Handle handle);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -2,11 +2,11 @@
|
||||
#define NETDB_H
|
||||
|
||||
struct hostent {
|
||||
char * h_name;
|
||||
char ** h_aliases;
|
||||
int h_addrtype;
|
||||
int h_length;
|
||||
char ** h_addr_list;
|
||||
char * h_name;
|
||||
char ** h_aliases;
|
||||
int h_addrtype;
|
||||
int h_length;
|
||||
char ** h_addr_list;
|
||||
};
|
||||
|
||||
|
||||
|
@ -4,50 +4,50 @@
|
||||
|
||||
u32 osConvertVirtToPhys(u32 vaddr)
|
||||
{
|
||||
if(vaddr >= 0x14000000 && vaddr < 0x1c000000)
|
||||
return vaddr + 0x0c000000; // LINEAR heap
|
||||
if(vaddr >= 0x1F000000 && vaddr < 0x1F600000)
|
||||
return vaddr - 0x07000000; // VRAM
|
||||
if(vaddr >= 0x1FF00000 && vaddr < 0x1FF80000)
|
||||
return vaddr + 0x00000000; // DSP memory
|
||||
if(vaddr >= 0x30000000 && vaddr < 0x40000000)
|
||||
return vaddr - 0x10000000; // Only available under FIRM v8+ for certain processes.
|
||||
return 0;
|
||||
if(vaddr >= 0x14000000 && vaddr < 0x1c000000)
|
||||
return vaddr + 0x0c000000; // LINEAR heap
|
||||
if(vaddr >= 0x1F000000 && vaddr < 0x1F600000)
|
||||
return vaddr - 0x07000000; // VRAM
|
||||
if(vaddr >= 0x1FF00000 && vaddr < 0x1FF80000)
|
||||
return vaddr + 0x00000000; // DSP memory
|
||||
if(vaddr >= 0x30000000 && vaddr < 0x40000000)
|
||||
return vaddr - 0x10000000; // Only available under FIRM v8+ for certain processes.
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 osGetFirmVersion() {
|
||||
return (*(u32*)0x1FF80000) & ~0xFF;
|
||||
return (*(u32*)0x1FF80000) & ~0xFF;
|
||||
}
|
||||
|
||||
u32 osGetKernelVersion() {
|
||||
return (*(u32*)0x1FF80060) & ~0xFF;
|
||||
return (*(u32*)0x1FF80060) & ~0xFF;
|
||||
}
|
||||
|
||||
const char* osStrError(u32 error) {
|
||||
switch((error>>26) & 0x3F) {
|
||||
case 0:
|
||||
return "Success.";
|
||||
case 1:
|
||||
return "Nothing happened.";
|
||||
case 2:
|
||||
return "Would block.";
|
||||
case 3:
|
||||
return "Not enough resources.";
|
||||
case 4:
|
||||
return "Not found.";
|
||||
case 5:
|
||||
return "Invalid state.";
|
||||
case 6:
|
||||
return "Unsupported.";
|
||||
case 7:
|
||||
return "Invalid argument.";
|
||||
case 8:
|
||||
return "Wrong argument.";
|
||||
case 9:
|
||||
return "Interrupted.";
|
||||
case 10:
|
||||
return "Internal error.";
|
||||
default:
|
||||
return "Unknown.";
|
||||
}
|
||||
switch((error>>26) & 0x3F) {
|
||||
case 0:
|
||||
return "Success.";
|
||||
case 1:
|
||||
return "Nothing happened.";
|
||||
case 2:
|
||||
return "Would block.";
|
||||
case 3:
|
||||
return "Not enough resources.";
|
||||
case 4:
|
||||
return "Not found.";
|
||||
case 5:
|
||||
return "Invalid state.";
|
||||
case 6:
|
||||
return "Unsupported.";
|
||||
case 7:
|
||||
return "Invalid argument.";
|
||||
case 8:
|
||||
return "Wrong argument.";
|
||||
case 9:
|
||||
return "Interrupted.";
|
||||
case 10:
|
||||
return "Internal error.";
|
||||
default:
|
||||
return "Unknown.";
|
||||
}
|
||||
}
|
||||
|
@ -20,133 +20,133 @@ static circlePosition cPos;
|
||||
|
||||
Result hidInit(u32* sharedMem)
|
||||
{
|
||||
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
|
||||
Result ret=0;
|
||||
if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
|
||||
Result ret=0;
|
||||
|
||||
// Request service.
|
||||
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
|
||||
// Request service.
|
||||
if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
|
||||
|
||||
// Get sharedmem handle.
|
||||
if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
|
||||
// Get sharedmem handle.
|
||||
if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
|
||||
|
||||
// Map HID shared memory at addr "sharedMem".
|
||||
hidSharedMem=sharedMem;
|
||||
if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
|
||||
// Map HID shared memory at addr "sharedMem".
|
||||
hidSharedMem=sharedMem;
|
||||
if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
|
||||
|
||||
// Reset internal state.
|
||||
kOld = kHeld = kDown = kUp = 0;
|
||||
return 0;
|
||||
// Reset internal state.
|
||||
kOld = kHeld = kDown = kUp = 0;
|
||||
return 0;
|
||||
|
||||
cleanup2:
|
||||
svcCloseHandle(hidMemHandle);
|
||||
svcCloseHandle(hidMemHandle);
|
||||
cleanup1:
|
||||
svcCloseHandle(hidHandle);
|
||||
return ret;
|
||||
svcCloseHandle(hidHandle);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void hidExit()
|
||||
{
|
||||
// Unmap HID sharedmem and close handles.
|
||||
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
|
||||
svcCloseHandle(hidMemHandle);
|
||||
svcCloseHandle(hidHandle);
|
||||
// Unmap HID sharedmem and close handles.
|
||||
svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
|
||||
svcCloseHandle(hidMemHandle);
|
||||
svcCloseHandle(hidHandle);
|
||||
}
|
||||
|
||||
void hidScanInput()
|
||||
{
|
||||
kOld = kHeld;
|
||||
kOld = kHeld;
|
||||
|
||||
int padId = hidSharedMem[4];
|
||||
kHeld = hidSharedMem[10 + padId*4];
|
||||
cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
|
||||
int padId = hidSharedMem[4];
|
||||
kHeld = hidSharedMem[10 + padId*4];
|
||||
cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
|
||||
|
||||
int touchId = hidSharedMem[42 + 4];
|
||||
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
|
||||
if (hidSharedMem[42 + 8 + touchId*2 + 1])
|
||||
kHeld |= KEY_TOUCH;
|
||||
int touchId = hidSharedMem[42 + 4];
|
||||
tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
|
||||
if (hidSharedMem[42 + 8 + touchId*2 + 1])
|
||||
kHeld |= KEY_TOUCH;
|
||||
|
||||
kDown = (~kOld) & kHeld;
|
||||
kUp = kOld & (~kHeld);
|
||||
kDown = (~kOld) & kHeld;
|
||||
kUp = kOld & (~kHeld);
|
||||
}
|
||||
|
||||
u32 hidKeysHeld()
|
||||
{
|
||||
return kHeld;
|
||||
return kHeld;
|
||||
}
|
||||
|
||||
u32 hidKeysDown()
|
||||
{
|
||||
return kDown;
|
||||
return kDown;
|
||||
}
|
||||
|
||||
u32 hidKeysUp()
|
||||
{
|
||||
return kUp;
|
||||
return kUp;
|
||||
}
|
||||
|
||||
void hidTouchRead(touchPosition* pos)
|
||||
{
|
||||
if (pos) *pos = tPos;
|
||||
if (pos) *pos = tPos;
|
||||
}
|
||||
|
||||
void hidCircleRead(circlePosition* pos)
|
||||
{
|
||||
if (pos) *pos = cPos;
|
||||
if (pos) *pos = cPos;
|
||||
}
|
||||
|
||||
Result HIDUSER_GetSharedMem(Handle* outMemHandle)
|
||||
{
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0xa0000; //request header code
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0xa0000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
if(outMemHandle)*outMemHandle=cmdbuf[3];
|
||||
if(outMemHandle)*outMemHandle=cmdbuf[3];
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result HIDUSER_EnableAccelerometer()
|
||||
{
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x110000; //request header code
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x110000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result HIDUSER_DisableAccelerometer()
|
||||
{
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x120000; //request header code
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x120000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result HIDUSER_EnableGyroscope()
|
||||
{
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x130000; //request header code
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x130000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result HIDUSER_DisableGyroscope()
|
||||
{
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x140000; //request header code
|
||||
u32* cmdbuf=getThreadCommandBuffer();
|
||||
cmdbuf[0]=0x140000; //request header code
|
||||
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
Result ret=0;
|
||||
if((ret=svcSendSyncRequest(hidHandle)))return ret;
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
@ -20,12 +20,12 @@
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
u32 num;
|
||||
u32 num;
|
||||
|
||||
struct {
|
||||
char name[8];
|
||||
Handle handle;
|
||||
} services[];
|
||||
struct {
|
||||
char name[8];
|
||||
Handle handle;
|
||||
} services[];
|
||||
} service_list_t;
|
||||
|
||||
extern service_list_t* __service_ptr;
|
||||
@ -35,86 +35,86 @@ static Handle g_srv_handle = 0;
|
||||
|
||||
|
||||
static int __name_cmp(const char* a, const char* b) {
|
||||
u32 i;
|
||||
u32 i;
|
||||
|
||||
for(i=0; i<8; i++) {
|
||||
if(a[i] != b[i])
|
||||
return 1;
|
||||
if(a[i] == '\0')
|
||||
return 0;
|
||||
}
|
||||
for(i=0; i<8; i++) {
|
||||
if(a[i] != b[i])
|
||||
return 1;
|
||||
if(a[i] == '\0')
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Handle __get_handle_from_list(char* name) {
|
||||
if((u32)__service_ptr == 0)
|
||||
return 0;
|
||||
if((u32)__service_ptr == 0)
|
||||
return 0;
|
||||
|
||||
u32 i, num = __service_ptr->num;
|
||||
u32 i, num = __service_ptr->num;
|
||||
|
||||
for(i=0; i<num; i++) {
|
||||
if(__name_cmp(__service_ptr->services[i].name, name) == 0)
|
||||
return __service_ptr->services[i].handle;
|
||||
}
|
||||
for(i=0; i<num; i++) {
|
||||
if(__name_cmp(__service_ptr->services[i].name, name) == 0)
|
||||
return __service_ptr->services[i].handle;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Result srvInit()
|
||||
{
|
||||
Result rc = 0;
|
||||
Result rc = 0;
|
||||
|
||||
if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
|
||||
if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
|
||||
|
||||
if((rc = srvRegisterClient())) {
|
||||
svcCloseHandle(g_srv_handle);
|
||||
g_srv_handle = 0;
|
||||
}
|
||||
if((rc = srvRegisterClient())) {
|
||||
svcCloseHandle(g_srv_handle);
|
||||
g_srv_handle = 0;
|
||||
}
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
Result srvExit()
|
||||
{
|
||||
if(g_srv_handle != 0)svcCloseHandle(g_srv_handle);
|
||||
if(g_srv_handle != 0)svcCloseHandle(g_srv_handle);
|
||||
|
||||
g_srv_handle = 0;
|
||||
return 0;
|
||||
g_srv_handle = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Result srvRegisterClient()
|
||||
{
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
cmdbuf[0] = 0x10002;
|
||||
cmdbuf[1] = 0x20;
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
cmdbuf[0] = 0x10002;
|
||||
cmdbuf[1] = 0x20;
|
||||
|
||||
Result rc;
|
||||
if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
|
||||
Result rc;
|
||||
if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
|
||||
|
||||
return cmdbuf[1];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
||||
Result srvGetServiceHandle(Handle* out, char* name)
|
||||
{
|
||||
/* Look in service-list given to us by loader. If we find find a match,
|
||||
we return it. */
|
||||
Handle h = __get_handle_from_list(name);
|
||||
/* Look in service-list given to us by loader. If we find find a match,
|
||||
we return it. */
|
||||
Handle h = __get_handle_from_list(name);
|
||||
|
||||
if(h != 0) {
|
||||
return svcDuplicateHandle(out, h);
|
||||
}
|
||||
if(h != 0) {
|
||||
return svcDuplicateHandle(out, h);
|
||||
}
|
||||
|
||||
/* Normal request to service manager. */
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
cmdbuf[0] = 0x50100;
|
||||
strcpy((char*) &cmdbuf[1], name);
|
||||
cmdbuf[3] = strlen(name);
|
||||
cmdbuf[4] = 0x0;
|
||||
/* Normal request to service manager. */
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
cmdbuf[0] = 0x50100;
|
||||
strcpy((char*) &cmdbuf[1], name);
|
||||
cmdbuf[3] = strlen(name);
|
||||
cmdbuf[4] = 0x0;
|
||||
|
||||
Result rc;
|
||||
if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
|
||||
Result rc;
|
||||
if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
|
||||
|
||||
*out = cmdbuf[3];
|
||||
return cmdbuf[1];
|
||||
*out = cmdbuf[3];
|
||||
return cmdbuf[1];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user