diff options
Diffstat (limited to 'src/devices/bus/wswan/slot.cpp')
-rw-r--r-- | src/devices/bus/wswan/slot.cpp | 125 |
1 files changed, 57 insertions, 68 deletions
diff --git a/src/devices/bus/wswan/slot.cpp b/src/devices/bus/wswan/slot.cpp index fd0c8cdc9fa..7cb338e2cc9 100644 --- a/src/devices/bus/wswan/slot.cpp +++ b/src/devices/bus/wswan/slot.cpp @@ -29,9 +29,9 @@ device_ws_cart_interface::device_ws_cart_interface(const machine_config &mconfig device_interface(device, "wswancart"), m_rom(nullptr), m_rom_size(0), + m_nvram_size(0), m_bank_mask(0), - m_has_rtc(false), - m_is_rotated(false) + m_has_rtc(false) { } @@ -48,11 +48,11 @@ device_ws_cart_interface::~device_ws_cart_interface() // rom_alloc - alloc the space for the cart //------------------------------------------------- -void device_ws_cart_interface::rom_alloc(uint32_t size, const char *tag) +void device_ws_cart_interface::rom_alloc(u32 size, const char *tag) { if (m_rom == nullptr) { - m_rom = device().machine().memory().region_alloc(std::string(tag).append(WSSLOT_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_LITTLE)->base(); + m_rom = (u16 *)device().machine().memory().region_alloc(std::string(tag).append(WSSLOT_ROM_REGION_TAG).c_str(), size, 2, ENDIANNESS_LITTLE)->base(); m_rom_size = size; m_bank_mask = ((m_rom_size >> 16) - 1); } @@ -63,8 +63,9 @@ void device_ws_cart_interface::rom_alloc(uint32_t size, const char *tag) // nvram_alloc - alloc the space for the ram //------------------------------------------------- -void device_ws_cart_interface::nvram_alloc(uint32_t size) +void device_ws_cart_interface::nvram_alloc(u32 size) { + m_nvram_size = size; m_nvram.resize(size); } @@ -76,7 +77,7 @@ void device_ws_cart_interface::nvram_alloc(uint32_t size) //------------------------------------------------- // ws_cart_slot_device - constructor //------------------------------------------------- -ws_cart_slot_device::ws_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : +ws_cart_slot_device::ws_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : device_t(mconfig, WS_CART_SLOT, tag, owner, clock), device_image_interface(mconfig, *this), device_single_card_slot_interface<device_ws_cart_interface>(mconfig, *this), @@ -119,7 +120,8 @@ static const ws_slot slot_list[] = { { WS_STD, "ws_rom" }, { WS_SRAM, "ws_sram" }, - { WS_EEPROM, "ws_eeprom" } + { WS_EEPROM, "ws_eeprom" }, + { WWITCH, "wwitch"} }; static int ws_get_pcb_id(const char *slot) @@ -153,9 +155,9 @@ image_init_result ws_cart_slot_device::call_load() { if (m_cart) { - uint8_t *ROM; - uint32_t size = !loaded_through_softlist() ? length() : get_software_region_length("rom"); - uint32_t nvram_size = 0; + u16 *ROM; + u32 size = !loaded_through_softlist() ? length() : get_software_region_length("rom"); + u32 nvram_size = 0; m_cart->rom_alloc(size, tag()); ROM = m_cart->get_rom_base(); @@ -167,14 +169,11 @@ image_init_result ws_cart_slot_device::call_load() if (!loaded_through_softlist()) { - int chunks = size / 0x10000; // get cart type and nvram length m_type = get_cart_type(ROM, size, nvram_size); - if (ROM[(chunks - 1) * 0x10000 + 0xfffd]) + if (ROM[(size >> 1) - 2] & 0xff00) m_cart->set_has_rtc(true); - if (ROM[(chunks - 1) * 0x10000 + 0xfffc] & 0x01) - m_cart->set_is_rotated(true); } else { @@ -182,7 +181,7 @@ image_init_result ws_cart_slot_device::call_load() if (pcb_name) m_type = ws_get_pcb_id(pcb_name); - if (m_type == WS_SRAM) + if (m_type == WS_SRAM || m_type == WWITCH) nvram_size = get_software_region_length("sram"); if (m_type == WS_EEPROM) nvram_size = get_software_region_length("eeprom"); @@ -192,15 +191,8 @@ image_init_result ws_cart_slot_device::call_load() if (!core_stricmp(get_feature("rtc"), "yes")) m_cart->set_has_rtc(true); } - if (get_feature("rotated")) - { - if (!core_stricmp(get_feature("rotated"), "yes")) - m_cart->set_is_rotated(true); - } } - //printf("Type: %s\n", ws_get_slot(m_type)); - if (nvram_size) { // allocate NVRAM @@ -230,12 +222,11 @@ void ws_cart_slot_device::call_unload() get cart type from cart file -------------------------------------------------*/ -int ws_cart_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len, uint32_t &nvram_len) const +int ws_cart_slot_device::get_cart_type(const u16 *ROM, u32 len, u32 &nvram_len) const { - int chunks = len / 0x10000; int type = WS_STD; - switch (ROM[(chunks - 1) * 0x10000 + 0xfffb]) + switch (ROM[(len >> 1) - 3] >> 8) { case 0x00: break; @@ -272,8 +263,7 @@ int ws_cart_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len, uint32_ nvram_len = 0x800; break; default: - printf("Unknown RAM size [0x%X]\n", ROM[(chunks - 1) * 0x10000 + 0xfffb]); - logerror("Unknown RAM size [0x%X]\n", ROM[(chunks - 1) * 0x10000 + 0xfffb]); + logerror("Unknown RAM size [0x%X]\n", ROM[(len >> 1) - 3] >> 8); break; } @@ -289,10 +279,10 @@ std::string ws_cart_slot_device::get_default_card_software(get_default_card_soft if (hook.image_file()) { const char *slot_string; - uint32_t size = hook.image_file()->size(); - std::vector<uint8_t> rom(size); + u32 size = hook.image_file()->size(); + std::vector<u16> rom(size); int type; - uint32_t nvram; + u32 nvram; hook.image_file()->read(&rom[0], size); @@ -300,8 +290,6 @@ std::string ws_cart_slot_device::get_default_card_software(get_default_card_soft type = get_cart_type(&rom[0], size, nvram); slot_string = ws_get_slot(type); - //printf("type: %s\n", slot_string); - return std::string(slot_string); } @@ -312,80 +300,80 @@ std::string ws_cart_slot_device::get_default_card_software(get_default_card_soft read_rom20 -------------------------------------------------*/ -uint8_t ws_cart_slot_device::read_rom20(offs_t offset) +u16 ws_cart_slot_device::read_rom20(offs_t offset, u16 mem_mask) { if (m_cart) - return m_cart->read_rom20(offset); + return m_cart->read_rom20(offset, mem_mask); else - return 0xff; + return 0xffff; } /*------------------------------------------------- read_rom30 -------------------------------------------------*/ -uint8_t ws_cart_slot_device::read_rom30(offs_t offset) +u16 ws_cart_slot_device::read_rom30(offs_t offset, u16 mem_mask) { if (m_cart) - return m_cart->read_rom30(offset); + return m_cart->read_rom30(offset, mem_mask); else - return 0xff; + return 0xffff; } /*------------------------------------------------- read_rom40 -------------------------------------------------*/ -uint8_t ws_cart_slot_device::read_rom40(offs_t offset) +u16 ws_cart_slot_device::read_rom40(offs_t offset, u16 mem_mask) { if (m_cart) - return m_cart->read_rom40(offset); + return m_cart->read_rom40(offset, mem_mask); else - return 0xff; + return 0xffff; } /*------------------------------------------------- read_ram -------------------------------------------------*/ -uint8_t ws_cart_slot_device::read_ram(offs_t offset) +u16 ws_cart_slot_device::read_ram(offs_t offset, u16 mem_mask) { if (m_cart) - return m_cart->read_ram(offset); + return m_cart->read_ram(offset, mem_mask); else - return 0xff; + return 0xffff; } /*------------------------------------------------- write_ram -------------------------------------------------*/ -void ws_cart_slot_device::write_ram(offs_t offset, uint8_t data) +void ws_cart_slot_device::write_ram(offs_t offset, u16 data, u16 mem_mask) { if (m_cart) - m_cart->write_ram(offset, data); + m_cart->write_ram(offset, data, mem_mask); } /*------------------------------------------------- read_io -------------------------------------------------*/ -uint8_t ws_cart_slot_device::read_io(offs_t offset) +u16 ws_cart_slot_device::read_io(offs_t offset, u16 mem_mask) { if (m_cart) - return m_cart->read_io(offset); + return m_cart->read_io(offset & 0x07, mem_mask); else - return 0xff; + return 0xffff; } /*------------------------------------------------- write_io -------------------------------------------------*/ -void ws_cart_slot_device::write_io(offs_t offset, uint8_t data) +void ws_cart_slot_device::write_io(offs_t offset, u16 data, u16 mem_mask) { if (m_cart) - m_cart->write_io(offset, data); + m_cart->write_io(offset & 0x07, data, mem_mask); } @@ -398,36 +386,37 @@ static const char *const sram_str[] = { "none", "64Kbit SRAM", "256Kbit SRAM", " static const char *const eeprom_str[] = { "none", "1Kbit EEPROM", "16Kbit EEPROM", "Unknown", "Unknown", "8Kbit EEPROM" }; static const char *const romsize_str[] = { "Unknown", "Unknown", "4Mbit", "8Mbit", "16Mbit", "Unknown", "32Mbit", "Unknown", "64Mbit", "128Mbit" }; -void ws_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t offs, uint32_t len) +void ws_cart_slot_device::internal_header_logging(const u16 *ROM, u32 offs, u32 len) { - int sum = 0, banks = len / 0x10000; - uint8_t romsize, ramtype, ramsize; - romsize = ROM[offs + 0xfffa]; - ramtype = (ROM[offs + 0xfffb] & 0xf0) ? 1 : 0; // 1 = EEPROM, 0 = SRAM - ramsize = ramtype ? ((ROM[offs + 0xfffb] & 0xf0) >> 4) : (ROM[offs + 0xfffb] & 0x0f); - + const int banks = len / 0x10000; + const int words = len >> 1; + const u8 romsize = ROM[words - 3] & 0xff; + const u8 ramtype = (ROM[words - 3] & 0xf000) ? 1 : 0; // 1 = EEPROM, 0 = SRAM + const u8 ramsize = ramtype ? (((ROM[words - 3] >> 8) & 0xf0) >> 4) : ((ROM[words - 3] >> 8) & 0x0f); + u16 sum = 0; logerror( "ROM DETAILS\n" ); logerror( "===========\n\n" ); - logerror("\tDeveloper ID: %X\n", ROM[offs + 0xfff6]); - logerror("\tMinimum system: %s\n", ROM[offs + 0xfff7] ? "WonderSwan Color" : "WonderSwan"); - logerror("\tCart ID: %X\n", ROM[offs + 0xfff8]); + logerror("\tDeveloper ID: %X\n", ROM[words - 5] & 0xff); + logerror("\tMinimum system: %s\n", ROM[words - 5] & 0xff00 ? "WonderSwan Color" : "WonderSwan"); + logerror("\tCart ID: %X\n", ROM[words - 4] & 0xff); logerror("\tROM size: %s\n", romsize_str[romsize]); if (ramtype) logerror("\tEEPROM size: %s\n", (ramsize < 6) ? eeprom_str[ramsize] : "Unknown"); else logerror("\tSRAM size: %s\n", (ramsize < 6) ? sram_str[ramsize] : "Unknown"); - logerror("\tFeatures: %X\n", ROM[offs + 0xfffc]); - logerror("\tRTC: %s\n", ROM[offs + 0xfffd] ? "yes" : "no"); + logerror("\tFeatures: %X\n", ROM[words - 2] & 0xff); + logerror("\tRTC: %s\n", (ROM[words - 2] & 0xff00) ? "yes" : "no"); for (int i = 0; i < banks; i++) { - for (int count = 0; count < 0x10000; count++) + for (int count = 0; count < 0x8000; count++) { - sum += ROM[(i * 0x10000) + count]; + sum += ROM[i * 0x8000 + count] & 0xff; + sum += ROM[i * 0x8000 + count] >> 8; } } - sum -= ROM[offs + 0xffff]; - sum -= ROM[offs + 0xfffe]; + sum -= ROM[words - 1] & 0xff; + sum -= ROM[words - 1] >> 8; sum &= 0xffff; - logerror("\tChecksum: %.2X%.2X (calculated: %04X)\n", ROM[offs + 0xffff], ROM[offs + 0xfffe], sum); + logerror("\tChecksum: %04X (calculated: %04X)\n", ROM[words - 1], sum); } |