(MESS) md_slot.c: let's try to load carts in a rom region rather than in a dynamic buffer.

This hopefully allows to search for ROM cheats again and fixes bug MT5488. nw.
This commit is contained in:
Fabio Priuli 2014-09-04 05:18:05 +00:00
parent 5496f9b617
commit 38f2a4f376
3 changed files with 31 additions and 20 deletions

View File

@ -62,7 +62,9 @@ const device_type COPERA_CART_SLOT = &device_creator<copera_cart_slot_device>;
//------------------------------------------------- //-------------------------------------------------
device_md_cart_interface::device_md_cart_interface(const machine_config &mconfig, device_t &device) device_md_cart_interface::device_md_cart_interface(const machine_config &mconfig, device_t &device)
: device_slot_card_interface(mconfig, device) : device_slot_card_interface(mconfig, device),
m_rom(NULL),
m_rom_size(0)
{ {
} }
@ -79,10 +81,14 @@ device_md_cart_interface::~device_md_cart_interface()
// rom_alloc - alloc the space for the cart // rom_alloc - alloc the space for the cart
//------------------------------------------------- //-------------------------------------------------
void device_md_cart_interface::rom_alloc(size_t size) void device_md_cart_interface::rom_alloc(size_t size, const char *tag)
{ {
if (m_rom == NULL) if (m_rom == NULL)
m_rom.resize(size/sizeof(UINT16)); {
astring tempstring(tag);
m_rom = (UINT16 *)device().machine().memory().region_alloc(tempstring, size, 2, ENDIANNESS_LITTLE)->base();
m_rom_size = size;
}
} }
@ -367,9 +373,11 @@ int base_md_cart_slot_device::load_list()
// if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
length = m_cart->get_padded_size(length); length = m_cart->get_padded_size(length);
m_cart->rom_alloc(length); astring cart_string(tag());
cart_string.cat(":cart:rom");
m_cart->rom_alloc(length, cart_string.cstr());
ROM = m_cart->get_rom_base(); ROM = m_cart->get_rom_base();
memcpy(ROM, get_software_region("rom"), get_software_region_length("rom")); memcpy((UINT8 *)ROM, get_software_region("rom"), get_software_region_length("rom"));
// if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff // if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff
if (length > get_software_region_length("rom")) if (length > get_software_region_length("rom"))
@ -479,7 +487,9 @@ int base_md_cart_slot_device::load_nonlist()
// if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
len = m_cart->get_padded_size(tmplen - offset); len = m_cart->get_padded_size(tmplen - offset);
// this contains an hack for SSF2: its current bankswitch code needs larger rom space to work // this contains an hack for SSF2: its current bankswitch code needs larger rom space to work
m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len); astring cart_string(tag());
cart_string.cat(":cart:rom");
m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len, cart_string.cstr());
// STEP 3: copy the game data in the appropriate way // STEP 3: copy the game data in the appropriate way
@ -602,7 +612,7 @@ void base_md_cart_slot_device::setup_nvram()
m_cart->m_nvram_end += 1; m_cart->m_nvram_end += 1;
m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1); m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start) if (m_cart->m_rom_size <= m_cart->m_nvram_start)
m_cart->m_nvram_active = 1; m_cart->m_nvram_active = 1;
m_cart->m_nvram_handlers_installed = 1; m_cart->m_nvram_handlers_installed = 1;
// don't trust too much header? // don't trust too much header?
@ -615,7 +625,7 @@ void base_md_cart_slot_device::setup_nvram()
logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n"); logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n");
m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1); m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start) if (m_cart->m_rom_size <= m_cart->m_nvram_start)
m_cart->m_nvram_active = 1; m_cart->m_nvram_active = 1;
break; break;
@ -624,7 +634,7 @@ void base_md_cart_slot_device::setup_nvram()
m_cart->m_nvram_start = 0x200000; m_cart->m_nvram_start = 0x200000;
m_cart->m_nvram_end = m_cart->m_nvram_start + get_software_region_length("sram") - 1; m_cart->m_nvram_end = m_cart->m_nvram_start + get_software_region_length("sram") - 1;
m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1); m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start) if (m_cart->m_rom_size <= m_cart->m_nvram_start)
m_cart->m_nvram_active = 1; m_cart->m_nvram_active = 1;
m_cart->m_nvram_handlers_installed = 1; m_cart->m_nvram_handlers_installed = 1;
break; break;
@ -989,8 +999,8 @@ void base_md_cart_slot_device::file_logging(UINT8 *ROM8, UINT32 rom_len, UINT32
astring ctrl(""), reg(""); astring ctrl(""), reg("");
// LOG FILE DETAILS // LOG FILE DETAILS
logerror("FILE DETAILS\n" ); logerror("FILE DETAILS\n");
logerror("============\n" ); logerror("============\n");
logerror("Name: %s\n", basename()); logerror("Name: %s\n", basename());
logerror("File Size: 0x%" I64FMT "x\n", (software_entry() == NULL) ? length() : get_software_region_length("rom")); logerror("File Size: 0x%" I64FMT "x\n", (software_entry() == NULL) ? length() : get_software_region_length("rom"));
logerror("Detected type: %s\n", md_get_slot(m_type)); logerror("Detected type: %s\n", md_get_slot(m_type));
@ -1062,8 +1072,8 @@ void base_md_cart_slot_device::file_logging(UINT8 *ROM8, UINT32 rom_len, UINT32
csum &= 0xffff; csum &= 0xffff;
} }
logerror("INTERNAL HEADER\n" ); logerror("INTERNAL HEADER\n");
logerror("===============\n" ); logerror("===============\n");
logerror("Console: %.16s\n", console); logerror("Console: %.16s\n", console);
logerror("Copyright String: %.16s\n", copyright); logerror("Copyright String: %.16s\n", copyright);
logerror(" - Manufacturer: %.4s\n", copyright + 3); // TODO: convert code to manufacturer name! logerror(" - Manufacturer: %.4s\n", copyright + 3); // TODO: convert code to manufacturer name!

View File

@ -107,11 +107,11 @@ public:
/* this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly */ /* this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly */
virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); }; virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); };
virtual void rom_alloc(size_t size); virtual void rom_alloc(size_t size, const char *tag);
virtual void nvram_alloc(size_t size); virtual void nvram_alloc(size_t size);
virtual UINT16* get_rom_base() { return m_rom; }; virtual UINT16* get_rom_base() { return m_rom; };
virtual UINT16* get_nvram_base() { return m_nvram; }; virtual UINT16* get_nvram_base() { return m_nvram; };
virtual UINT32 get_rom_size() { return m_rom.bytes(); }; virtual UINT32 get_rom_size() { return m_rom_size; };
virtual UINT32 get_nvram_size() { return m_nvram.bytes(); }; virtual UINT32 get_nvram_size() { return m_nvram.bytes(); };
virtual void set_bank_to_rom(const char *banktag, UINT32 offset) {}; virtual void set_bank_to_rom(const char *banktag, UINT32 offset) {};
@ -127,7 +127,8 @@ public:
int m_nvram_handlers_installed; int m_nvram_handlers_installed;
// internal state // internal state
dynamic_array<UINT16> m_rom; UINT16 *m_rom;
UINT32 m_rom_size;
dynamic_array<UINT16> m_nvram; dynamic_array<UINT16> m_nvram;
UINT8 rom_bank_map[128]; // 64K chunks of rom UINT8 rom_bank_map[128]; // 64K chunks of rom

View File

@ -549,7 +549,7 @@ READ16_MEMBER(md_rom_cm2in1_device::read)
READ16_MEMBER(md_rom_mcpirate_device::read) READ16_MEMBER(md_rom_mcpirate_device::read)
{ {
if (offset < 0x400000/2) if (offset < 0x400000/2)
return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom.bytes() - 1))/2]; return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom_size - 1))/2];
else else
return read(space, offset - 0x400000/2, 0xffff); return read(space, offset - 0x400000/2, 0xffff);
} }
@ -795,7 +795,7 @@ WRITE16_MEMBER(md_rom_lion2_device::write)
LION KING 3 LION KING 3
-------------------------------------------------*/ -------------------------------------------------*/
#define MD_LION3_ADDR(a) (((offset << 1) | (m_bank << 15)) & (m_rom.bytes() - 1))/2 #define MD_LION3_ADDR(a) (((offset << 1) | (m_bank << 15)) & (m_rom_size - 1))/2
READ16_MEMBER(md_rom_lion3_device::read) READ16_MEMBER(md_rom_lion3_device::read)
{ {
@ -926,7 +926,7 @@ READ16_MEMBER(md_rom_soulb_device::read)
POKEMON STADIUM / KAIJU POKEMON STADIUM / KAIJU
-------------------------------------------------*/ -------------------------------------------------*/
#define MD_POKESTAD_ADDR(a) (((offset << 1) | (m_bank << 15)) & (m_rom.bytes() - 1))/2 #define MD_POKESTAD_ADDR(a) (((offset << 1) | (m_bank << 15)) & (m_rom_size - 1))/2
READ16_MEMBER(md_rom_pokestad_device::read) READ16_MEMBER(md_rom_pokestad_device::read)
{ {
@ -1308,7 +1308,7 @@ WRITE16_MEMBER(md_rom_topf_device::write)
READ16_MEMBER(md_rom_radica_device::read) READ16_MEMBER(md_rom_radica_device::read)
{ {
return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom.bytes() - 1))/2]; return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom_size - 1))/2];
} }
READ16_MEMBER(md_rom_radica_device::read_a13) READ16_MEMBER(md_rom_radica_device::read_a13)