u8 currentBuffer;
u8* topLeftFramebuffers[2];
+Handle gspEvent, gspSharedMemHandle;
+
void gspGpuInit()
{
gspInit();
//setup our gsp shared mem section
u8 threadID;
- Handle gspEvent, gspSharedMemHandle;
svc_createEvent(&gspEvent, 0x0);
GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &threadID);
svc_mapMemoryBlock(gspSharedMemHandle, 0x10002000, 0x3, 0x10000000);
currentBuffer=0;
}
+void gspGpuExit()
+{
+ GSPGPU_UnregisterInterruptRelayQueue(NULL);
+
+ //unmap GSP shared mem
+ svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000);
+ svc_closeHandle(gspSharedMemHandle);
+ svc_closeHandle(gspEvent);
+
+ gspExit();
+
+ //free GSP heap
+ svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x2000000, MEMOP_FREE, 0x0);
+}
+
void swapBuffers()
{
u32 regData;
return costable[v&0x1FF];
}
+u32 cnt;
+
void renderEffect()
{
u8* bufAdr=&gspHeap[0x46500*currentBuffer];
for(j=1;j<240;j++)
{
u32 v=(j+i*240)*3;
- bufAdr[v]=(pcCos(i)+4096)/32;
- bufAdr[v+1]=0x00;
- bufAdr[v+2]=0xFF*currentBuffer;
+ bufAdr[v]=(pcCos(i+cnt)+4096)/32;
+ bufAdr[v+1]=(pcCos(j-256+cnt)+4096)/64;
+ bufAdr[v+2]=(pcCos(i+128-cnt)+4096)/32;
}
}
+ cnt++;
+}
+
+Handle hidHandle;
+Handle hidMemHandle;
+
+void hidInit()
+{
+ srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
+ HIDUSER_GetInfo(hidHandle, &hidMemHandle);
+ svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
+
+ HIDUSER_Init(hidHandle);
+}
+
+void hidExit()
+{
+ svc_unmapMemoryBlock(hidMemHandle, 0x10000000);
+ svc_closeHandle(hidMemHandle);
+ svc_closeHandle(hidHandle);
}
int main()
gspGpuInit();
- Handle hidHandle;
- Handle hidMemHandle;
- srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
- HIDUSER_GetInfo(hidHandle, &hidMemHandle);
- svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
-
- HIDUSER_Init(hidHandle);
+ hidInit();
aptSetupEventHandler();
- while(!aptGetStatus())
+ APP_STATUS status;
+ while((status=aptGetStatus())!=APP_EXITING)
{
- u32 PAD=((u32*)0x10000000)[7];
- renderEffect();
- swapBuffers();
- copyBuffer();
- u32 regData=PAD|0x01000000;
- GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)®Data, 4);
- svc_sleepThread(1000000000);
+ if(status==APP_RUNNING)
+ {
+ u32 PAD=((u32*)0x10000000)[7];
+
+ u32 regData=PAD|0x01000000;
+ GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)®Data, 4);
+
+ renderEffect();
+ swapBuffers();
+ copyBuffer();
+ }
+ svc_sleepThread(16666666);
}
+ hidExit();
+ gspGpuExit();
aptExit();
svc_exitProcess();
return 0;
Result FSUSER_OpenDirectory(Handle handle, Handle* out, FS_archive archive, FS_path dirLowPath);
Result FSUSER_OpenFile(Handle handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes);
Result FSUSER_OpenFileDirectly(Handle handle, Handle* out, FS_archive archive, FS_path fileLowPath, u32 openflags, u32 attributes);
+Result FSUSER_CloseArchive(Handle handle, FS_archive* archive);
Result FSFILE_Close(Handle handle);
Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, u32 *buffer, u32 size);
Result FSFILE_GetSize(Handle handle, u64 *size);
Result FSDIR_Read(Handle handle, u32 *entriesRead, u32 entrycount, u16 *buffer);
+Result FSDIR_Close(Handle handle);
#endif
#define GSP_H
void gspInit();
+void gspExit();
Result GSPGPU_AcquireRight(Handle *handle, u8 flags);
Result GSPGPU_ReleaseRight(Handle *handle);
Result GSPGPU_WriteHWRegs(Handle *handle, u32 regAddr, u8* data, u8 size);
Result GSPGPU_ReadHWRegs(Handle *handle, u32 regAddr, u8* data, u8 size);
Result GSPGPU_RegisterInterruptRelayQueue(Handle *handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID);
+Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle);
Result GSPGPU_TriggerCmdReqQueue(Handle *handle);
Result GSPGPU_submitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x20], Handle* handle);
#define SRV_H
Result initSrv();
+Result exitSrv();
Result srv_Initialize(Handle* handleptr);
Result srv_getServiceHandle(Handle* handleptr, Handle* out, char* server);
#ifndef SVC_H
#define SVC_H
+typedef enum{
+ MEMOP_FREE = 1,
+ MEMOP_RESERVE = 2,
+ MEMOP_COMMIT = 3,
+ MEMOP_MAP = 4,
+ MEMOP_UNMAP = 5,
+ MEMOP_PROTECT = 6,
+ MEMOP_REGION_APP = 0x100,
+ MEMOP_REGION_SYSTEM = 0x200,
+ MEMOP_REGION_BASE = 0x300,
+ MEMOP_LINEAR = 0x1000,
+}MEMORY_OPERATION;
+
u32* getThreadCommandBuffer(void);
Result svc_controlMemory(u32* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions); //(outaddr is usually the same as the input addr0)
Result svc_clearEvent(Handle handle);
Result svc_createMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 mypermission, u32 otherpermission);
Result svc_mapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission);
+ Result svc_unmapMemoryBlock(Handle memblock, u32 addr);
Result svc_waitSynchronization1(Handle handle, s64 nanoseconds);
Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds);
Result svc_closeHandle(Handle handle);
+ Result svc_getSystemInfo(s64* out, u32 type, s32 param);
Result svc_connectToPort(volatile Handle* out, const char* portName);
Result svc_sendSyncRequest(Handle session);
}
}
break;
- case 0x2: //event 2 means we should exit the thread
+ case 0x2: //event 2 means we should exit the thread (event will be added later)
runThread=false;
break;
}
void aptExit()
{
+ u8 buf1[4], buf2[4];
+
+ buf1[0]=0x02; buf1[1]=0x00; buf1[2]=0x00; buf1[3]=0x00;
+ aptOpenSession();
+ APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2);
+ aptCloseSession();
+ aptOpenSession();
+ APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+ aptCloseSession();
+
+ aptOpenSession();
+ APT_AppletUtility(NULL, NULL, 0x7, 0x4, buf1, 0x1, buf2);
+ aptCloseSession();
+ aptOpenSession();
+ APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+ aptCloseSession();
+ aptOpenSession();
+ APT_AppletUtility(NULL, NULL, 0x4, 0x1, buf1, 0x1, buf2);
+ aptCloseSession();
+
+
aptOpenSession();
APT_PrepareToCloseApplication(NULL, 0x1);
aptCloseSession();
aptOpenSession();
APT_CloseApplication(NULL, 0x0, 0x0, 0x0);
aptCloseSession();
+
+ svc_closeHandle(aptStatusMutex);
+ // svc_closeHandle(aptLockHandle);
}
void aptSetupEventHandler()
return cmdbuf[1];
}
+Result FSUSER_CloseArchive(Handle handle, FS_archive* archive)
+{
+ if(!archive)return -2;
+ u32* cmdbuf=getThreadCommandBuffer();
+
+ cmdbuf[0]=0x080E0080;
+ cmdbuf[1]=archive->handleLow;
+ cmdbuf[2]=archive->handleLow;
+
+ Result ret=0;
+ if((ret=svc_sendSyncRequest(handle)))return ret;
+
+ return cmdbuf[1];
+}
+
Result FSFILE_Close(Handle handle)
{
u32* cmdbuf=getThreadCommandBuffer();
return cmdbuf[1];
}
+
+Result FSDIR_Close(Handle handle)
+{
+ u32* cmdbuf=getThreadCommandBuffer();
+
+ cmdbuf[0]=0x08020000;
+
+ Result ret=0;
+ if((ret=svc_sendSyncRequest(handle)))return ret;
+
+ return cmdbuf[1];
+}
#include <ctr/GSP.h>
#include <ctr/svc.h>
-Handle gspGpuHandle;
+Handle gspGpuHandle=0;
void gspInit()
{
srv_getServiceHandle(NULL, &gspGpuHandle, "gsp::Gpu");
}
+void gspExit()
+{
+ if(gspGpuHandle)svc_closeHandle(gspGpuHandle);
+}
+
Result GSPGPU_AcquireRight(Handle* handle, u8 flags)
{
if(!handle)handle=&gspGpuHandle;
return cmdbuf[1];
}
+Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle)
+{
+ if(!handle)handle=&gspGpuHandle;
+
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0x00140000; //request header code
+
+ Result ret=0;
+ if((ret=svc_sendSyncRequest(*handle)))return ret;
+
+ return cmdbuf[1];
+}
+
Result GSPGPU_TriggerCmdReqQueue(Handle* handle)
{
if(!handle)handle=&gspGpuHandle;
#include <ctr/srv.h>
#include <ctr/svc.h>
-Handle srvHandle;
+Handle srvHandle=0;
Result initSrv()
{
return srv_Initialize(&srvHandle);
}
+Result exitSrv()
+{
+ if(srvHandle)svc_closeHandle(srvHandle);
+}
+
Result srv_Initialize(Handle* handleptr)
{
if(!handleptr)handleptr=&srvHandle;
svc 0x1F
bx lr
+.global svc_unmapMemoryBlock
+.type svc_unmapMemoryBlock, %function
+svc_unmapMemoryBlock:
+ svc 0x20
+ bx lr
+
.global svc_closeHandle
.type svc_closeHandle, %function
svc_closeHandle:
ldr r5, [sp], #4
bx lr
+.global svc_getSystemInfo
+.type svc_getSystemInfo, %function
+svc_getSystemInfo:
+ stmfd sp!, {r0, r4}
+ svc 0x2A
+ ldr r4, [sp], #4
+ str r1, [r4]
+ str r2, [r4, #4]
+ # str r3, [r4, #8] # ?
+ ldr r4, [sp], #4
+ bx lr
+
.global svc_connectToPort
.type svc_connectToPort, %function
svc_connectToPort:
u8 currentBuffer;
u8* topLeftFramebuffers[2];
+Handle gspEvent, gspSharedMemHandle;
+
void gspGpuInit()
{
gspInit();
//setup our gsp shared mem section
u8 threadID;
- Handle gspEvent, gspSharedMemHandle;
svc_createEvent(&gspEvent, 0x0);
GSPGPU_RegisterInterruptRelayQueue(NULL, gspEvent, 0x1, &gspSharedMemHandle, &threadID);
svc_mapMemoryBlock(gspSharedMemHandle, 0x10002000, 0x3, 0x10000000);
currentBuffer=0;
}
+void gspGpuExit()
+{
+ GSPGPU_UnregisterInterruptRelayQueue(NULL);
+
+ //unmap GSP shared mem
+ svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000);
+ svc_closeHandle(gspSharedMemHandle);
+ svc_closeHandle(gspEvent);
+
+ gspExit();
+
+ //free GSP heap
+ svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x2000000, MEMOP_FREE, 0x0);
+}
+
+
void swapBuffers()
{
u32 regData;
}
}
+Handle hidHandle;
+Handle hidMemHandle;
+
+void hidInit()
+{
+ srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
+ HIDUSER_GetInfo(hidHandle, &hidMemHandle);
+ svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
+
+ HIDUSER_Init(hidHandle);
+}
+
+void hidExit()
+{
+ svc_unmapMemoryBlock(hidMemHandle, 0x10000000);
+ svc_closeHandle(hidMemHandle);
+ svc_closeHandle(hidHandle);
+}
+
int main()
{
initSrv();
gspGpuInit();
- Handle hidHandle;
- Handle hidMemHandle;
- srv_getServiceHandle(NULL, &hidHandle, "hid:USER");
- HIDUSER_GetInfo(hidHandle, &hidMemHandle);
- svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000);
-
- HIDUSER_Init(hidHandle);
+ hidInit();
Handle fsuHandle;
srv_getServiceHandle(NULL, &fsuHandle, "fs:USER");
FS_path filePath=(FS_path){PATH_CHAR, 10, (u8*)"/test.bin"};
FSUSER_OpenFileDirectly(fsuHandle, &fileHandle, sdmcArchive, filePath, FS_OPEN_READ, FS_ATTRIBUTE_NONE);
FSFILE_Read(fileHandle, &bytesRead, 0x0, (u32*)gspHeap, 0x46500);
+ FSFILE_Close(fileHandle);
aptSetupEventHandler();
svc_sleepThread(1000000000);
}
+ svc_closeHandle(fsuHandle);
+ hidExit();
+ gspGpuInit();
aptExit();
svc_exitProcess();
return 0;