mirror of
https://github.com/sanni/cartreader.git
synced 2025-01-14 14:09:06 +01:00
Use header values for rom and sram start/end instead of hardcoding
This commit is contained in:
parent
4621ad20f3
commit
1dccf84d9f
@ -3,6 +3,9 @@
|
|||||||
//******************************************
|
//******************************************
|
||||||
// IMPORTANT: All data are stored as BIG-ENDIAN. Many ROM dumps online are little endian.
|
// IMPORTANT: All data are stored as BIG-ENDIAN. Many ROM dumps online are little endian.
|
||||||
// See https://github.com/kasamikona/Loopy-Tools/blob/master/ROM%20Structure.md
|
// See https://github.com/kasamikona/Loopy-Tools/blob/master/ROM%20Structure.md
|
||||||
|
//
|
||||||
|
// By @partlyhuman
|
||||||
|
// Special thanks to @kasamikona
|
||||||
#ifdef enable_LOOPY
|
#ifdef enable_LOOPY
|
||||||
|
|
||||||
// SH-1 memory map locations, ROM starts here
|
// SH-1 memory map locations, ROM starts here
|
||||||
@ -19,6 +22,8 @@ const int LOOPY_RAMCS2 = A7;
|
|||||||
|
|
||||||
// The internal checksum read from the cart header at 08h, will be checked against an actual sum
|
// The internal checksum read from the cart header at 08h, will be checked against an actual sum
|
||||||
uint32_t loopyChecksum;
|
uint32_t loopyChecksum;
|
||||||
|
uint32_t loopyChecksumStart;
|
||||||
|
uint32_t loopyChecksumEnd;
|
||||||
// Whether the cart was found (by checksum) in the database
|
// Whether the cart was found (by checksum) in the database
|
||||||
bool loopyCartRecognized;
|
bool loopyCartRecognized;
|
||||||
|
|
||||||
@ -403,9 +408,18 @@ void getCartInfo_LOOPY() {
|
|||||||
// Set control
|
// Set control
|
||||||
dataIn_LOOPY();
|
dataIn_LOOPY();
|
||||||
|
|
||||||
// Last word of ROM stored as 32-bit pointer at 000004h
|
// First word after header stored as 32-bit pointer at 0h, final word (inclusive) at 4h
|
||||||
uint32_t headerRomSize = ((uint32_t)readWord_LOOPY(0x4) << 16) | (uint32_t)readWord_LOOPY(0x6);
|
// based on SH-1 memory mapped location of ROM (shift to rebase on zero)
|
||||||
cartSize = headerRomSize - LOOPY_MAP_ROM_ZERO + 2;
|
loopyChecksumStart = (((uint32_t)readWord_LOOPY(0x0) << 16) | (uint32_t)readWord_LOOPY(0x2)) - LOOPY_MAP_ROM_ZERO;
|
||||||
|
loopyChecksumEnd = (((uint32_t)readWord_LOOPY(0x4) << 16) | (uint32_t)readWord_LOOPY(0x6)) - LOOPY_MAP_ROM_ZERO;
|
||||||
|
// Full cart size DOES include the header, don't subtract it off :)
|
||||||
|
cartSize = loopyChecksumEnd + 2;
|
||||||
|
|
||||||
|
// SRAM first and last byte locations stored at 10h and 14h, based on SH-1 memory mapped location of SRAM
|
||||||
|
uint32_t loopySramStart = (((uint32_t)readWord_LOOPY(0x10) << 16) | (uint32_t)readWord_LOOPY(0x12)) - LOOPY_MAP_SRAM_ZERO;
|
||||||
|
uint32_t loopySramEnd = (((uint32_t)readWord_LOOPY(0x14) << 16) | (uint32_t)readWord_LOOPY(0x16)) - LOOPY_MAP_SRAM_ZERO;
|
||||||
|
sramSize = loopySramEnd - loopySramStart + 1;
|
||||||
|
// TODO sanity check these values
|
||||||
|
|
||||||
// Get internal checksum from header
|
// Get internal checksum from header
|
||||||
loopyChecksum = ((uint32_t)readWord_LOOPY(0x8) << 16) | (uint32_t)readWord_LOOPY(0xA);
|
loopyChecksum = ((uint32_t)readWord_LOOPY(0x8) << 16) | (uint32_t)readWord_LOOPY(0xA);
|
||||||
@ -423,10 +437,6 @@ void getCartInfo_LOOPY() {
|
|||||||
print_Msg(F("Size: "));
|
print_Msg(F("Size: "));
|
||||||
print_Msg(cartSize * 8 / 1024 / 1024);
|
print_Msg(cartSize * 8 / 1024 / 1024);
|
||||||
println_Msg(F(" MBit"));
|
println_Msg(F(" MBit"));
|
||||||
|
|
||||||
// SRAM size can be calculated from subtracting 32bit pointers 000014h (last byte of sram, memory mapped) - 000010h (first byte of sram, memory mapped)
|
|
||||||
// But this is fine
|
|
||||||
sramSize = LOOPY_SRAM_SIZE;
|
|
||||||
print_Msg(F("Sram: "));
|
print_Msg(F("Sram: "));
|
||||||
print_Msg(sramSize * 8 / 1024);
|
print_Msg(sramSize * 8 / 1024);
|
||||||
println_Msg(F(" KBit"));
|
println_Msg(F(" KBit"));
|
||||||
@ -477,8 +487,8 @@ void readROM_LOOPY() {
|
|||||||
word myWord = readWord_LOOPY(ptr);
|
word myWord = readWord_LOOPY(ptr);
|
||||||
|
|
||||||
// aggregate checksum over 16-bit words, starting at 80h, this address is stored in header but never varies
|
// aggregate checksum over 16-bit words, starting at 80h, this address is stored in header but never varies
|
||||||
if (ptr >= 0x80) {
|
if (ptr >= loopyChecksumStart) {
|
||||||
sum += myWord;
|
sum += myWord;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store in buffer
|
// Store in buffer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user