mirror of
https://github.com/captain-amygdala/pistorm.git
synced 2026-01-28 20:41:08 +00:00
Merge pull request #29 from LinuxJedi/byte-swap
Identify and fix byte-swapped ROMs
This commit is contained in:
@@ -251,7 +251,7 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad
|
||||
memset(cfg->map_data[index], 0x00, cfg->map_size[index]);
|
||||
fread(cfg->map_data[index], cfg->rom_size[index], 1, in);
|
||||
fclose(in);
|
||||
displayRomInfo(cfg->map_data[index]);
|
||||
displayRomInfo(cfg->map_data[index], cfg->rom_size[index]);
|
||||
if (cfg->map_size[index] == cfg->rom_size[index])
|
||||
m68k_add_rom_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
|
||||
break;
|
||||
|
||||
@@ -46,12 +46,32 @@ static void getDiagRom(uint8_t *address, struct romInfo *info)
|
||||
info->extra = strtoul(endptr, NULL, 10);
|
||||
}
|
||||
|
||||
static void getRomInfo(uint8_t *address, struct romInfo *info)
|
||||
static void swapRom(uint8_t *address, size_t length)
|
||||
{
|
||||
uint8_t *ptr = address;
|
||||
for (size_t pos = 0; pos < length; pos = pos + 2)
|
||||
{
|
||||
uint8_t low = ptr[pos];
|
||||
uint8_t high = ptr[pos+1];
|
||||
ptr[pos] = high;
|
||||
ptr[pos+1] = low;
|
||||
}
|
||||
}
|
||||
|
||||
static void getRomInfo(uint8_t *address, size_t length, struct romInfo *info)
|
||||
{
|
||||
uint8_t *ptr = address;
|
||||
uint8_t data = *ptr;
|
||||
info->isDiagRom = false;
|
||||
|
||||
if ((ptr[2] == 0xF9) && (ptr[3] == 0x4E))
|
||||
{
|
||||
// ROM byte swapped!
|
||||
printf("[CFG] Byte swapped ROM found, swapping back\n");
|
||||
swapRom(address, length);
|
||||
data = *ptr;
|
||||
}
|
||||
|
||||
if (data != 0x11)
|
||||
{
|
||||
info->id = ROM_TYPE_UNKNOWN;
|
||||
@@ -94,13 +114,13 @@ static void getRomInfo(uint8_t *address, struct romInfo *info)
|
||||
return;
|
||||
}
|
||||
|
||||
void displayRomInfo(uint8_t *address)
|
||||
void displayRomInfo(uint8_t *address, size_t length)
|
||||
{
|
||||
struct romInfo info = {0};
|
||||
const char *kversion;
|
||||
const char *size;
|
||||
|
||||
getRomInfo(address, &info);
|
||||
getRomInfo(address, length, &info);
|
||||
|
||||
if ((!info.isDiagRom) && (info.id != ROM_TYPE_UNKNOWN))
|
||||
{
|
||||
@@ -199,7 +219,7 @@ void displayRomInfo(uint8_t *address)
|
||||
}
|
||||
else if (info.id == ROM_TYPE_UNKNOWN)
|
||||
{
|
||||
printf("[CFG] ROM cannot be identified, if it is a byte swapped Kickstart this will fail\n");
|
||||
printf("[CFG] ROM cannot be identified\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -26,5 +26,5 @@ enum romErrCode {
|
||||
ERR_ROM_UNKNOWN
|
||||
};
|
||||
|
||||
void displayRomInfo(uint8_t *address);
|
||||
void displayRomInfo(uint8_t *address, size_t length);
|
||||
#endif /* __ROMINFO */
|
||||
|
||||
Reference in New Issue
Block a user