mirror of https://github.com/mgba-emu/mgba.git
GBA Memory: Support the Chinese version of Digimon Sapphire by Vast Fame
This commit is contained in:
parent
e16dfc264a
commit
20fc7b6ef3
|
@ -16,7 +16,8 @@ CXX_GUARD_START
|
||||||
enum GBAVFameCartType {
|
enum GBAVFameCartType {
|
||||||
VFAME_NO = 0,
|
VFAME_NO = 0,
|
||||||
VFAME_STANDARD = 1,
|
VFAME_STANDARD = 1,
|
||||||
VFAME_GEORGE = 2
|
VFAME_ALTERNATE = 2,
|
||||||
|
VFAME_GEORGE = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GBAVFameCart {
|
struct GBAVFameCart {
|
||||||
|
|
|
@ -7,12 +7,18 @@
|
||||||
|
|
||||||
#include <mgba/internal/gba/gba.h>
|
#include <mgba/internal/gba/gba.h>
|
||||||
#include <mgba/internal/gba/memory.h>
|
#include <mgba/internal/gba/memory.h>
|
||||||
|
#include <mgba-util/crc32.h>
|
||||||
|
|
||||||
static const uint8_t ADDRESS_REORDERING[4][16] = {
|
static const uint8_t ADDRESS_REORDERING[4][16] = {
|
||||||
{ 15, 14, 9, 1, 8, 10, 7, 3, 5, 11, 4, 0, 13, 12, 2, 6 },
|
{ 15, 14, 9, 1, 8, 10, 7, 3, 5, 11, 4, 0, 13, 12, 2, 6 },
|
||||||
{ 15, 7, 13, 5, 11, 6, 0, 9, 12, 2, 10, 14, 3, 1, 8, 4 },
|
{ 15, 7, 13, 5, 11, 6, 0, 9, 12, 2, 10, 14, 3, 1, 8, 4 },
|
||||||
{ 15, 0, 3, 12, 2, 4, 14, 13, 1, 8, 6, 7, 9, 5, 11, 10 }
|
{ 15, 0, 3, 12, 2, 4, 14, 13, 1, 8, 6, 7, 9, 5, 11, 10 }
|
||||||
};
|
};
|
||||||
|
static const uint8_t ADDRESS_REORDERING_ALTERNATE[4][16] = {
|
||||||
|
{ 15, 0, 13, 5, 8, 4, 7, 3, 1, 2, 10, 14, 9, 12, 11, 6 },
|
||||||
|
{ 15, 7, 9, 1, 2, 6, 14, 13, 12, 11, 4, 0, 3, 5, 8, 10 },
|
||||||
|
{ 15, 14, 3, 12, 11, 10, 0, 9, 5, 8, 6, 7, 13, 1, 2, 4 }
|
||||||
|
};
|
||||||
static const uint8_t ADDRESS_REORDERING_GEORGE[4][16] = {
|
static const uint8_t ADDRESS_REORDERING_GEORGE[4][16] = {
|
||||||
{ 15, 7, 13, 1, 11, 10, 14, 9, 12, 2, 4, 0, 3, 5, 8, 6 },
|
{ 15, 7, 13, 1, 11, 10, 14, 9, 12, 2, 4, 0, 3, 5, 8, 6 },
|
||||||
{ 15, 14, 3, 12, 8, 4, 0, 13, 5, 11, 6, 7, 9, 1, 2, 10 },
|
{ 15, 14, 3, 12, 8, 4, 0, 13, 5, 11, 6, 7, 9, 1, 2, 10 },
|
||||||
|
@ -23,6 +29,11 @@ static const uint8_t VALUE_REORDERING[4][16] = {
|
||||||
{ 3, 2, 1, 0, 7, 6, 5, 4 },
|
{ 3, 2, 1, 0, 7, 6, 5, 4 },
|
||||||
{ 1, 0, 7, 6, 5, 4, 3, 2 }
|
{ 1, 0, 7, 6, 5, 4, 3, 2 }
|
||||||
};
|
};
|
||||||
|
static const uint8_t VALUE_REORDERING_ALTERNATE[4][16] = {
|
||||||
|
{ 5, 4, 7, 2, 1, 0, 3, 6 },
|
||||||
|
{ 1, 2, 3, 0, 5, 6, 7, 4 },
|
||||||
|
{ 3, 0, 1, 6, 7, 4, 5, 2 }
|
||||||
|
};
|
||||||
static const uint8_t VALUE_REORDERING_GEORGE[4][16] = {
|
static const uint8_t VALUE_REORDERING_GEORGE[4][16] = {
|
||||||
{ 3, 0, 7, 2, 1, 4, 5, 6 },
|
{ 3, 0, 7, 2, 1, 4, 5, 6 },
|
||||||
{ 1, 4, 3, 0, 5, 6, 7, 2 },
|
{ 1, 4, 3, 0, 5, 6, 7, 2 },
|
||||||
|
@ -65,13 +76,18 @@ void GBAVFameDetect(struct GBAVFameCart* cart, uint32_t* rom, size_t romSize) {
|
||||||
mLOG(GBA_MEM, INFO, "Vast Fame game detected");
|
mLOG(GBA_MEM, INFO, "Vast Fame game detected");
|
||||||
}
|
}
|
||||||
|
|
||||||
// This game additionally operates with a different set of SRAM modes
|
// These games additionally operates with a different set of SRAM modes
|
||||||
// Its initialisation seems to be identical so the difference must be in the cart HW itself
|
// Their initialisation seems to be identical so the difference must be in the cart HW itself
|
||||||
// Other undumped games may have similar differences
|
// Other undumped games may have similar differences
|
||||||
if (memcmp("George Sango", &((struct GBACartridge*) rom)->title, 12) == 0) {
|
if (memcmp("George Sango", &((struct GBACartridge*) rom)->title, 12) == 0) {
|
||||||
cart->cartType = VFAME_GEORGE;
|
cart->cartType = VFAME_GEORGE;
|
||||||
mLOG(GBA_MEM, INFO, "George mode");
|
mLOG(GBA_MEM, INFO, "George mode");
|
||||||
}
|
}
|
||||||
|
// Chinese version of Digimon Sapphire; header is identical to the English version which uses the normal reordering
|
||||||
|
// so we have to use some other way to detect it
|
||||||
|
else if (doCrc32(rom, romSize) == 0x793A328F) {
|
||||||
|
cart->cartType = VFAME_STANDARD;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is not currently being used but would be called on ROM reads
|
// This is not currently being used but would be called on ROM reads
|
||||||
|
@ -256,6 +272,8 @@ static uint32_t _modifySramAddress(enum GBAVFameCartType type, uint32_t address,
|
||||||
return address;
|
return address;
|
||||||
} else if (type == VFAME_GEORGE) {
|
} else if (type == VFAME_GEORGE) {
|
||||||
return _reorderBits(address, ADDRESS_REORDERING_GEORGE[mode - 1], 16);
|
return _reorderBits(address, ADDRESS_REORDERING_GEORGE[mode - 1], 16);
|
||||||
|
} else if (type == VFAME_ALTERNATE) {
|
||||||
|
return _reorderBits(address, ADDRESS_REORDERING_ALTERNATE[mode - 1], 16);
|
||||||
} else {
|
} else {
|
||||||
return _reorderBits(address, ADDRESS_REORDERING[mode - 1], 16);
|
return _reorderBits(address, ADDRESS_REORDERING[mode - 1], 16);
|
||||||
}
|
}
|
||||||
|
@ -266,6 +284,8 @@ static int8_t _modifySramValue(enum GBAVFameCartType type, uint8_t value, int mo
|
||||||
if (reorderType != 0) {
|
if (reorderType != 0) {
|
||||||
if (type == VFAME_GEORGE) {
|
if (type == VFAME_GEORGE) {
|
||||||
value = _reorderBits(value, VALUE_REORDERING_GEORGE[reorderType - 1], 8);
|
value = _reorderBits(value, VALUE_REORDERING_GEORGE[reorderType - 1], 8);
|
||||||
|
} else if (type == VFAME_ALTERNATE) {
|
||||||
|
value = _reorderBits(value, VALUE_REORDERING_ALTERNATE[reorderType - 1], 8);
|
||||||
} else {
|
} else {
|
||||||
value = _reorderBits(value, VALUE_REORDERING[reorderType - 1], 8);
|
value = _reorderBits(value, VALUE_REORDERING[reorderType - 1], 8);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue