aboutsummaryrefslogtreecommitdiff
path: root/backends/gp32/gp32std.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/gp32/gp32std.cpp')
-rw-r--r--backends/gp32/gp32std.cpp103
1 files changed, 98 insertions, 5 deletions
diff --git a/backends/gp32/gp32std.cpp b/backends/gp32/gp32std.cpp
index 1a62cb13dc..bacf232310 100644
--- a/backends/gp32/gp32std.cpp
+++ b/backends/gp32/gp32std.cpp
@@ -158,6 +158,10 @@ GPFILE *gp_fopen(const char *fileName, const char *openMode) {
file->cachePos = 0;
mode = OPEN_W;
err = GpFileCreate(fileName, ALWAYS_CREATE, &file->handle);
+ } else if(tolower(openMode[0]) == 'a') {
+ warning("We do not support 'a' file open mode.");
+ free(file);
+ return NULL;
} else {
error("wrong file mode");
}
@@ -183,7 +187,7 @@ int gp_fclose(GPFILE *stream) {
/* if (*(uint32 *)((char *)stream - sizeof(uint32)) == 0x4321) {
debug(0, "Double closing", __FUNCTION__);
return 1;
- } // return 1 ??
+ }
*/
if (stream->cachePos) {
@@ -214,6 +218,7 @@ int gp_fseek(GPFILE *stream, long offset, int whence) {
return GpFileSeek(stream->handle, whence, offset, (long *)&dummy);
}
+//TODO: read cache
size_t gp_fread(void *ptr, size_t size, size_t n, GPFILE *stream) {
ulong readcount = 0;
ERR_CODE err = GpFileRead(stream->handle, ptr, size * n, &readcount); //fixme? size*n
@@ -483,6 +488,94 @@ void gp_delay(uint32 msecs) {
while (GpTickCountGet() < startTime + msecs);
}
+void gp_clockSpeedChange(int freq, int magic, int div) {
+ #define rTCFG0 (*(volatile unsigned *)0x15100000)
+ #define rTCFG1 (*(volatile unsigned *)0x15100004)
+ #define rTCNTB4 (*(volatile unsigned *)0x1510003c)
+ unsigned int pclk;
+ unsigned int prescaler0;
+
+ // Change CPU Speed
+ GpClockSpeedChange(freq, magic, div);
+ pclk = GpPClkGet();
+
+ // Repair SDK timer - it forgets to set prescaler
+ prescaler0 = (pclk / (8000 * 40)) - 1;
+ rTCFG0 = (rTCFG0 & 0xFFFFFF00) | prescaler0;
+ rTCFG1 = 0x30033;
+
+ // Repair GpTickCountGet
+ rTCNTB4 = pclk / 1600;
+}
+
+void gp_setCpuSpeed(int freq) {
+ // Default value for 40 mhz
+ static int CLKDIV = 0x48013;
+ static int MCLK = 40000000;
+ static int CLKMODE = 0;
+ static int HCLK = 40000000;
+ static int PCLK = 40000000;
+
+ switch (freq) {
+ // overclocked
+ case 168: { CLKDIV = 0x14000; MCLK = 168000000; CLKMODE = 3; break; }
+ case 172: { CLKDIV = 0x23010; MCLK = 172000000; CLKMODE = 3; break; }
+ case 176: { CLKDIV = 0x24010; MCLK = 176000000; CLKMODE = 3; break; }
+ case 180: { CLKDIV = 0x16000; MCLK = 180000000; CLKMODE = 3; break; }
+ case 184: { CLKDIV = 0x26010; MCLK = 184000000; CLKMODE = 3; break; }
+ case 188: { CLKDIV = 0x27010; MCLK = 188000000; CLKMODE = 3; break; }
+ case 192: { CLKDIV = 0x18000; MCLK = 192000000; CLKMODE = 3; break; }
+ case 196: { CLKDIV = 0x29010; MCLK = 196000000; CLKMODE = 3; break; }
+ case 200: { CLKDIV = 0x2A010; MCLK = 200000000; CLKMODE = 3; break; }
+ case 204: { CLKDIV = 0x2b010; MCLK = 204000000; CLKMODE = 3; break; }
+ case 208: { CLKDIV = 0x2c010; MCLK = 208000000; CLKMODE = 3; break; }
+ case 212: { CLKDIV = 0x2d010; MCLK = 212000000; CLKMODE = 3; break; }
+ case 216: { CLKDIV = 0x2e010; MCLK = 216000000; CLKMODE = 3; break; }
+ case 220: { CLKDIV = 0x2f010; MCLK = 220000000; CLKMODE = 3; break; }
+ case 224: { CLKDIV = 0x30010; MCLK = 224000000; CLKMODE = 3; break; }
+ case 228: { CLKDIV = 0x1e000; MCLK = 228000000; CLKMODE = 3; break; }
+ case 232: { CLKDIV = 0x32010; MCLK = 232000000; CLKMODE = 3; break; }
+ case 236: { CLKDIV = 0x33010; MCLK = 236000000; CLKMODE = 3; break; }
+ case 240: { CLKDIV = 0x20000; MCLK = 240000000; CLKMODE = 3; break; }
+ case 244: { CLKDIV = 0x35010; MCLK = 244000000; CLKMODE = 3; break; }
+ case 248: { CLKDIV = 0x36010; MCLK = 248000000; CLKMODE = 3; break; }
+ case 252: { CLKDIV = 0x22000; MCLK = 252000000; CLKMODE = 3; break; }
+ case 256: { CLKDIV = 0x38010; MCLK = 256000000; CLKMODE = 3; break; }
+
+ // normal
+// case 166: { CLKDIV = 0x4B011; MCLK = 166000000; CLKMODE = 3; break; }
+ case 166: { CLKDIV = 0x2f001; MCLK = 165000000; CLKMODE = 3; break; }
+ case 164: { CLKDIV = 0x4a011; MCLK = 164000000; CLKMODE = 3; break; }
+ case 160: { CLKDIV = 0x48011; MCLK = 160000000; CLKMODE = 3; break; }
+ case 156: { CLKDIV = 0x2c001; MCLK = 156000000; CLKMODE = 3; break; }
+ case 144: { CLKDIV = 0x28001; MCLK = 144000000; CLKMODE = 3; break; }
+ case 133: { CLKDIV = 0x51021; MCLK = 133500000; CLKMODE = 2; break; }
+ case 132: { CLKDIV = 0x3a011; MCLK = 132000000; CLKMODE = 3; break; }
+ case 120: { CLKDIV = 0x24001; MCLK = 120000000; CLKMODE = 2; break; }
+ case 100: { CLKDIV = 0x2b011; MCLK = 102000000; CLKMODE = 2; break; }
+ case 66: { CLKDIV = 0x25002; MCLK = 67500000; CLKMODE = 2; break; }
+ case 50: { CLKDIV = 0x2a012; MCLK = 50000000; CLKMODE = 0; break; }
+// case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 0; break; }
+ case 40: { CLKDIV = 0x48013; MCLK = 40000000; CLKMODE = 1; break; }
+// case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 0; break; }
+ case 33: { CLKDIV = 0x25003; MCLK = 33750000; CLKMODE = 2; break; }
+ case 22: { CLKDIV = 0x33023; MCLK = 22125000; CLKMODE = 0; break; }
+ default:
+ error("Invalid CPU frequency!");
+ }
+ if (CLKMODE == 0) { HCLK = MCLK; PCLK = MCLK; }
+ if (CLKMODE == 1) { HCLK = MCLK; PCLK = MCLK / 2; }
+ if (CLKMODE == 2) { HCLK = MCLK / 2; PCLK = MCLK / 2; }
+ if (CLKMODE == 3) { HCLK = MCLK / 2; PCLK = MCLK / 4; }
+
+ gp_clockSpeedChange(MCLK, CLKDIV, CLKMODE);
+}
+
+void gp_Reset() {
+ gp_setCpuSpeed(66);
+ asm volatile("swi #4\n");
+}
+
void gp_exit(int code) {
if (!code) {
printf(" ----------------------------------------");
@@ -521,7 +614,7 @@ void NP(const char *fmt, ...) {
va_end(marker);
_dprintf("NP:%s", s);
- //gp_delay(50);
+ gp_delay(50);
}
void LP(const char *fmt, ...) {
@@ -534,7 +627,7 @@ void LP(const char *fmt, ...) {
va_end(marker);
_dprintf("LP:%s", s);
- //gp_delay(300);
+ gp_delay(300);
}
void SP(const char *fmt, ...) {
@@ -547,7 +640,7 @@ void SP(const char *fmt, ...) {
va_end(marker);
_dprintf("SP:%s", s);
- //gp_delay(50);
+ gp_delay(50);
}
void BP(const char *fmt, ...) {
@@ -560,5 +653,5 @@ void BP(const char *fmt, ...) {
va_end(marker);
_dprintf("BP:%s", s);
- //gp_delay(2000);
+ gp_delay(2000);
}