aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-08-05 19:13:55 +0200
committerStapleButter <thetotalworm@gmail.com>2017-08-05 19:13:55 +0200
commit0106406aff0f7aada992a9f27b68a20deafbc5e4 (patch)
tree35ed773e73daf4fe91f237461e25f0611c082dcb
parent4a899ebe3f681096876e17f1189617cd274a4f63 (diff)
* allow 128KB firmwares (DSi/3DS dumps)
* document firmware sizes better
-rw-r--r--README.md7
-rw-r--r--src/SPI.cpp40
2 files changed, 38 insertions, 9 deletions
diff --git a/README.md b/README.md
index e80b0d7..550497c 100644
--- a/README.md
+++ b/README.md
@@ -13,11 +13,16 @@ How to use:
melonDS requires BIOS/firmware copies from a DS. Files required:
* bios7.bin, 16KB: ARM7 BIOS
* bios9.bin, 4KB: ARM9 BIOS
- * firmware.bin, 256KB: firmware
+ * firmware.bin, 128/256/512KB: firmware
Firmware boot requires a firmware dump from an original DS or DS Lite.
DS firmwares dumped from a DSi or 3DS aren't bootable and only contain configuration data, thus they are only suitable when booting games directly.
+Possible firmware sizes:
+ * 128KB: DSi/3DS DS-mode firmware (reduced size due to lacking bootcode)
+ * 256KB: regular DS firmware
+ * 512KB: iQue DS firmware
+
DS BIOS dumps from a 3DS can be used with no compatibility issues. DSi BIOS dumps should be usable too, provided they were dumped properly.
As for the rest, the interface should be pretty straightforward. If you have a question, don't hesitate to ask, though!
diff --git a/src/SPI.cpp b/src/SPI.cpp
index 9d00b58..21f9ccb 100644
--- a/src/SPI.cpp
+++ b/src/SPI.cpp
@@ -100,10 +100,23 @@ void Reset()
fseek(f, 0, SEEK_END);
FirmwareLength = (u32)ftell(f);
- if (FirmwareLength != 0x40000 && FirmwareLength != 0x80000)
+ if (FirmwareLength != 0x20000 && FirmwareLength != 0x40000 && FirmwareLength != 0x80000)
{
- printf("Bad firmware size %d, assuming 256K\n", FirmwareLength);
- FirmwareLength = 0x40000;
+ printf("Bad firmware size %d, ", FirmwareLength);
+
+ // pick the nearest power-of-two length
+ FirmwareLength |= (FirmwareLength >> 1);
+ FirmwareLength |= (FirmwareLength >> 2);
+ FirmwareLength |= (FirmwareLength >> 4);
+ FirmwareLength |= (FirmwareLength >> 8);
+ FirmwareLength |= (FirmwareLength >> 16);
+ FirmwareLength++;
+
+ // ensure it's a sane length
+ if (FirmwareLength > 0x80000) FirmwareLength = 0x80000;
+ else if (FirmwareLength < 0x20000) FirmwareLength = 0x20000;
+
+ printf("assuming %d\n", FirmwareLength);
}
Firmware = new u8[FirmwareLength];
@@ -352,7 +365,7 @@ u8 Read()
}
void Write(u8 val, u32 hold)
-{
+{printf("SPI powerman %02X %d\n", val, hold?1:0);
if (!hold)
{
Hold = 0;
@@ -369,15 +382,26 @@ void Write(u8 val, u32 hold)
if (DataPos == 1)
{
+ u32 regid = Index & 0x07;
+
if (Index & 0x80)
{
- Data = Registers[Index & 0x07];
+ Data = Registers[regid];
}
else
{
- Registers[Index & 0x07] =
- (Registers[Index & 0x07] & ~RegMasks[Index & 0x07]) |
- (val & RegMasks[Index & 0x07]);
+ Registers[regid] = (Registers[regid] & ~RegMasks[regid]) | (val & RegMasks[regid]);
+
+ switch (regid)
+ {
+ case 0:
+ if (val & 0x40) printf("DS shutdown\n");
+ printf("power %02X\n", val);
+ break;
+ case 4:
+ printf("brightness %02X\n", val);
+ break;
+ }
}
}
else