-
-
Notifications
You must be signed in to change notification settings - Fork 93
/
gcloader.c
86 lines (76 loc) · 2.05 KB
/
gcloader.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
* GCLoader Driver for Gamecube
*
* Written by meneerbeer, emu_kidid
**/
#include <stdio.h>
#include <gccore.h> /*** Wrapper to include common libogc headers ***/
#include <ogcsys.h> /*** Needed for console support ***/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <debug.h>
#include <ogc/exi.h>
#include <gcloader.h>
#include <malloc.h>
#include "main.h"
#include "swiss.h"
#include "gui/FrameBufferMagic.h"
#include "gui/IPLFontWrite.h"
static vu32* const gcloader = (vu32*)0xCC006000;
u32 __gcloaderCmdImm(unsigned int cmd, unsigned int p1, unsigned int p2) {
gcloader[2] = cmd;
gcloader[3] = p1;
gcloader[4] = p2;
gcloader[6] = 0;
gcloader[8] = 0;
gcloader[7] = 1;
int retries = 1000000;
while(( gcloader[7] & 1) && retries) {
retries --; // Wait for IMM command to finish up
}
return !retries ? -1 : gcloader[8];
}
u32 gcloaderReadId() {
return __gcloaderCmdImm(0xB0000000, 0x00000000, 0x00000000);
}
char *gcloaderGetVersion() {
int len = (__gcloaderCmdImm(0xB1000001, 0x00000000, 0x00000000)+31)&~31;
if(len <= 0) {
return NULL;
}
char *buffer = memalign(32, len);
if(!buffer) {
return NULL;
}
gcloader[2] = 0xB1000000;
gcloader[3] = 0;
gcloader[4] = 0;
gcloader[5] = (u32)buffer;
gcloader[6] = len;
gcloader[7] = 3; // DMA | START
DCInvalidateRange(buffer, len);
while(gcloader[7] & 1);
buffer[len-1] = '\0';
return buffer;
}
int gcloaderWriteFrags(u32 discNum, file_frag *fragList, u32 totFrags) {
int ret, i;
print_gecko("GCLoader setting up disc %i with %i fragments\r\n", discNum, totFrags);
ret = __gcloaderCmdImm(0xB3000001, discNum, totFrags);
if(ret != 0) {
return ret;
}
for(i = 0; i < totFrags; i++) {
print_gecko("Frag %i: ofs in file: [0x%08X] len [0x%08X] LBA on SD [0x%08llX]\r\n",
i, fragList[i].offset, fragList[i].size, fragList[i].fileBase);
ret = __gcloaderCmdImm(fragList[i].offset, fragList[i].size, fragList[i].fileBase);
if(ret == 0) {
break;
}
}
return ret;
}
int gcloaderWriteDiscNum(u32 discNum) {
return __gcloaderCmdImm(0xB3000002, discNum, 0x00000000);
}