Previous 199869 Revisions Next

r31900 Thursday 4th September, 2014 at 05:18:05 UTC by Fabio Priuli
(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.
[src/emu/bus/megadrive]md_slot.c md_slot.h rom.c

trunk/src/emu/bus/megadrive/rom.c
r31899r31900
549549READ16_MEMBER(md_rom_mcpirate_device::read)
550550{
551551   if (offset < 0x400000/2)
552      return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom.bytes() - 1))/2];
552      return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom_size - 1))/2];
553553   else
554554      return read(space, offset - 0x400000/2, 0xffff);
555555}
r31899r31900
795795 LION KING 3
796796 -------------------------------------------------*/
797797
798#define MD_LION3_ADDR(a)  (((offset << 1) | (m_bank << 15)) & (m_rom.bytes() - 1))/2
798#define MD_LION3_ADDR(a)  (((offset << 1) | (m_bank << 15)) & (m_rom_size - 1))/2
799799
800800READ16_MEMBER(md_rom_lion3_device::read)
801801{
r31899r31900
926926 POKEMON STADIUM / KAIJU
927927 -------------------------------------------------*/
928928
929#define MD_POKESTAD_ADDR(a)  (((offset << 1) | (m_bank << 15)) & (m_rom.bytes() - 1))/2
929#define MD_POKESTAD_ADDR(a)  (((offset << 1) | (m_bank << 15)) & (m_rom_size - 1))/2
930930
931931READ16_MEMBER(md_rom_pokestad_device::read)
932932{
r31899r31900
13081308
13091309READ16_MEMBER(md_rom_radica_device::read)
13101310{
1311   return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom.bytes() - 1))/2];
1311   return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (m_rom_size - 1))/2];
13121312}
13131313
13141314READ16_MEMBER(md_rom_radica_device::read_a13)
trunk/src/emu/bus/megadrive/md_slot.c
r31899r31900
6262//-------------------------------------------------
6363
6464device_md_cart_interface::device_md_cart_interface(const machine_config &mconfig, device_t &device)
65   : device_slot_card_interface(mconfig, device)
65   : device_slot_card_interface(mconfig, device),
66      m_rom(NULL),
67      m_rom_size(0)
6668{
6769}
6870
r31899r31900
7981//  rom_alloc - alloc the space for the cart
8082//-------------------------------------------------
8183
82void device_md_cart_interface::rom_alloc(size_t size)
84void device_md_cart_interface::rom_alloc(size_t size, const char *tag)
8385{
8486   if (m_rom == NULL)
85      m_rom.resize(size/sizeof(UINT16));
87   {
88      astring tempstring(tag);
89      m_rom = (UINT16 *)device().machine().memory().region_alloc(tempstring, size, 2, ENDIANNESS_LITTLE)->base();
90      m_rom_size = size;
91   }
8692}
8793
8894
r31899r31900
367373   // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
368374   length = m_cart->get_padded_size(length);
369375
370   m_cart->rom_alloc(length);
376   astring cart_string(tag());
377   cart_string.cat(":cart:rom");
378   m_cart->rom_alloc(length, cart_string.cstr());
371379   ROM = m_cart->get_rom_base();
372   memcpy(ROM, get_software_region("rom"), get_software_region_length("rom"));
380   memcpy((UINT8 *)ROM, get_software_region("rom"), get_software_region_length("rom"));
373381
374382   // if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff
375383   if (length > get_software_region_length("rom"))
r31899r31900
479487   // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
480488   len = m_cart->get_padded_size(tmplen - offset);
481489   // this contains an hack for SSF2: its current bankswitch code needs larger rom space to work
482   m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len);
490   astring cart_string(tag());
491   cart_string.cat(":cart:rom");
492   m_cart->rom_alloc((len == 0x500000) ? 0x900000 : len, cart_string.cstr());
483493
484494
485495   // STEP 3: copy the game data in the appropriate way
r31899r31900
602612            m_cart->m_nvram_end += 1;
603613
604614         m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
605         if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start)
615         if (m_cart->m_rom_size <= m_cart->m_nvram_start)
606616            m_cart->m_nvram_active = 1;
607617         m_cart->m_nvram_handlers_installed = 1;
608618         // don't trust too much header?
r31899r31900
615625         logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n");
616626
617627         m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
618         if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start)
628         if (m_cart->m_rom_size <= m_cart->m_nvram_start)
619629            m_cart->m_nvram_active = 1;
620630         break;
621631
r31899r31900
624634         m_cart->m_nvram_start = 0x200000;
625635         m_cart->m_nvram_end = m_cart->m_nvram_start + get_software_region_length("sram") - 1;
626636         m_cart->nvram_alloc(m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
627         if (m_cart->m_rom.bytes() <= m_cart->m_nvram_start)
637         if (m_cart->m_rom_size <= m_cart->m_nvram_start)
628638            m_cart->m_nvram_active = 1;
629639         m_cart->m_nvram_handlers_installed = 1;
630640         break;
r31899r31900
989999   astring ctrl(""), reg("");
9901000
9911001   // LOG FILE DETAILS
992   logerror("FILE DETAILS\n" );
993   logerror("============\n" );
1002   logerror("FILE DETAILS\n");
1003   logerror("============\n");
9941004   logerror("Name: %s\n", basename());
9951005   logerror("File Size: 0x%" I64FMT "x\n", (software_entry() == NULL) ? length() : get_software_region_length("rom"));
9961006   logerror("Detected type: %s\n", md_get_slot(m_type));
r31899r31900
10621072      csum &= 0xffff;
10631073   }
10641074
1065   logerror("INTERNAL HEADER\n" );
1066   logerror("===============\n" );
1075   logerror("INTERNAL HEADER\n");
1076   logerror("===============\n");
10671077   logerror("Console: %.16s\n", console);
10681078   logerror("Copyright String: %.16s\n", copyright);
10691079   logerror(" - Manufacturer: %.4s\n", copyright + 3); // TODO: convert code to manufacturer name!
trunk/src/emu/bus/megadrive/md_slot.h
r31899r31900
107107   /* this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly */
108108   virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); };
109109
110   virtual void rom_alloc(size_t size);
110   virtual void rom_alloc(size_t size, const char *tag);
111111   virtual void nvram_alloc(size_t size);
112112   virtual UINT16* get_rom_base() { return m_rom; };
113113   virtual UINT16* get_nvram_base() { return m_nvram; };
114   virtual UINT32 get_rom_size() { return m_rom.bytes(); };
114   virtual UINT32 get_rom_size() { return m_rom_size; };
115115   virtual UINT32 get_nvram_size() { return m_nvram.bytes(); };
116116   virtual void set_bank_to_rom(const char *banktag, UINT32 offset) {};
117117
r31899r31900
127127   int m_nvram_handlers_installed;
128128
129129   // internal state
130   dynamic_array<UINT16> m_rom;
130   UINT16  *m_rom;
131   UINT32  m_rom_size;
131132   dynamic_array<UINT16> m_nvram;
132133
133134   UINT8 rom_bank_map[128];    // 64K chunks of rom

Previous 199869 Revisions Next


© 1997-2024 The MAME Team