trunk/src/emu/bus/megadrive/rom.c
| r31899 | r31900 | |
| 549 | 549 | READ16_MEMBER(md_rom_mcpirate_device::read) |
| 550 | 550 | { |
| 551 | 551 | 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]; |
| 553 | 553 | else |
| 554 | 554 | return read(space, offset - 0x400000/2, 0xffff); |
| 555 | 555 | } |
| r31899 | r31900 | |
| 795 | 795 | LION KING 3 |
| 796 | 796 | -------------------------------------------------*/ |
| 797 | 797 | |
| 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 |
| 799 | 799 | |
| 800 | 800 | READ16_MEMBER(md_rom_lion3_device::read) |
| 801 | 801 | { |
| r31899 | r31900 | |
| 926 | 926 | POKEMON STADIUM / KAIJU |
| 927 | 927 | -------------------------------------------------*/ |
| 928 | 928 | |
| 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 |
| 930 | 930 | |
| 931 | 931 | READ16_MEMBER(md_rom_pokestad_device::read) |
| 932 | 932 | { |
| r31899 | r31900 | |
| 1308 | 1308 | |
| 1309 | 1309 | READ16_MEMBER(md_rom_radica_device::read) |
| 1310 | 1310 | { |
| 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]; |
| 1312 | 1312 | } |
| 1313 | 1313 | |
| 1314 | 1314 | READ16_MEMBER(md_rom_radica_device::read_a13) |
trunk/src/emu/bus/megadrive/md_slot.c
| r31899 | r31900 | |
| 62 | 62 | //------------------------------------------------- |
| 63 | 63 | |
| 64 | 64 | device_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) |
| 66 | 68 | { |
| 67 | 69 | } |
| 68 | 70 | |
| r31899 | r31900 | |
| 79 | 81 | // rom_alloc - alloc the space for the cart |
| 80 | 82 | //------------------------------------------------- |
| 81 | 83 | |
| 82 | | void device_md_cart_interface::rom_alloc(size_t size) |
| 84 | void device_md_cart_interface::rom_alloc(size_t size, const char *tag) |
| 83 | 85 | { |
| 84 | 86 | 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 | } |
| 86 | 92 | } |
| 87 | 93 | |
| 88 | 94 | |
| r31899 | r31900 | |
| 367 | 373 | // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space |
| 368 | 374 | length = m_cart->get_padded_size(length); |
| 369 | 375 | |
| 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()); |
| 371 | 379 | 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")); |
| 373 | 381 | |
| 374 | 382 | // if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff |
| 375 | 383 | if (length > get_software_region_length("rom")) |
| r31899 | r31900 | |
| 479 | 487 | // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space |
| 480 | 488 | len = m_cart->get_padded_size(tmplen - offset); |
| 481 | 489 | // 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()); |
| 483 | 493 | |
| 484 | 494 | |
| 485 | 495 | // STEP 3: copy the game data in the appropriate way |
| r31899 | r31900 | |
| 602 | 612 | m_cart->m_nvram_end += 1; |
| 603 | 613 | |
| 604 | 614 | 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) |
| 606 | 616 | m_cart->m_nvram_active = 1; |
| 607 | 617 | m_cart->m_nvram_handlers_installed = 1; |
| 608 | 618 | // don't trust too much header? |
| r31899 | r31900 | |
| 615 | 625 | logerror("No SRAM detected from header, using fallback SRAM in case this is a broken header\n"); |
| 616 | 626 | |
| 617 | 627 | 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) |
| 619 | 629 | m_cart->m_nvram_active = 1; |
| 620 | 630 | break; |
| 621 | 631 | |
| r31899 | r31900 | |
| 624 | 634 | m_cart->m_nvram_start = 0x200000; |
| 625 | 635 | m_cart->m_nvram_end = m_cart->m_nvram_start + get_software_region_length("sram") - 1; |
| 626 | 636 | 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) |
| 628 | 638 | m_cart->m_nvram_active = 1; |
| 629 | 639 | m_cart->m_nvram_handlers_installed = 1; |
| 630 | 640 | break; |
| r31899 | r31900 | |
| 989 | 999 | astring ctrl(""), reg(""); |
| 990 | 1000 | |
| 991 | 1001 | // LOG FILE DETAILS |
| 992 | | logerror("FILE DETAILS\n" ); |
| 993 | | logerror("============\n" ); |
| 1002 | logerror("FILE DETAILS\n"); |
| 1003 | logerror("============\n"); |
| 994 | 1004 | logerror("Name: %s\n", basename()); |
| 995 | 1005 | logerror("File Size: 0x%" I64FMT "x\n", (software_entry() == NULL) ? length() : get_software_region_length("rom")); |
| 996 | 1006 | logerror("Detected type: %s\n", md_get_slot(m_type)); |
| r31899 | r31900 | |
| 1062 | 1072 | csum &= 0xffff; |
| 1063 | 1073 | } |
| 1064 | 1074 | |
| 1065 | | logerror("INTERNAL HEADER\n" ); |
| 1066 | | logerror("===============\n" ); |
| 1075 | logerror("INTERNAL HEADER\n"); |
| 1076 | logerror("===============\n"); |
| 1067 | 1077 | logerror("Console: %.16s\n", console); |
| 1068 | 1078 | logerror("Copyright String: %.16s\n", copyright); |
| 1069 | 1079 | logerror(" - Manufacturer: %.4s\n", copyright + 3); // TODO: convert code to manufacturer name! |
trunk/src/emu/bus/megadrive/md_slot.h
| r31899 | r31900 | |
| 107 | 107 | /* this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly */ |
| 108 | 108 | virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); }; |
| 109 | 109 | |
| 110 | | virtual void rom_alloc(size_t size); |
| 110 | virtual void rom_alloc(size_t size, const char *tag); |
| 111 | 111 | virtual void nvram_alloc(size_t size); |
| 112 | 112 | virtual UINT16* get_rom_base() { return m_rom; }; |
| 113 | 113 | 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; }; |
| 115 | 115 | virtual UINT32 get_nvram_size() { return m_nvram.bytes(); }; |
| 116 | 116 | virtual void set_bank_to_rom(const char *banktag, UINT32 offset) {}; |
| 117 | 117 | |
| r31899 | r31900 | |
| 127 | 127 | int m_nvram_handlers_installed; |
| 128 | 128 | |
| 129 | 129 | // internal state |
| 130 | | dynamic_array<UINT16> m_rom; |
| 130 | UINT16 *m_rom; |
| 131 | UINT32 m_rom_size; |
| 131 | 132 | dynamic_array<UINT16> m_nvram; |
| 132 | 133 | |
| 133 | 134 | UINT8 rom_bank_map[128]; // 64K chunks of rom |