diff options
Diffstat (limited to 'src/devices/bus/sega8/sega8_slot.cpp')
-rw-r--r-- | src/devices/bus/sega8/sega8_slot.cpp | 95 |
1 files changed, 44 insertions, 51 deletions
diff --git a/src/devices/bus/sega8/sega8_slot.cpp b/src/devices/bus/sega8/sega8_slot.cpp index e6d6f17a5f4..d30b5c4e869 100644 --- a/src/devices/bus/sega8/sega8_slot.cpp +++ b/src/devices/bus/sega8/sega8_slot.cpp @@ -28,6 +28,8 @@ #include "emu.h" #include "sega8_slot.h" +#include "multibyte.h" + #define VERBOSE 0 #include "logmacro.h" @@ -83,11 +85,11 @@ device_sega8_cart_interface::~device_sega8_cart_interface() // rom_alloc - alloc the space for the cart //------------------------------------------------- -void device_sega8_cart_interface::rom_alloc(uint32_t size, const char *tag) +void device_sega8_cart_interface::rom_alloc(uint32_t size) { if (m_rom == nullptr) { - m_rom = device().machine().memory().region_alloc(std::string(tag).append(S8SLOT_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_LITTLE)->base(); + m_rom = device().machine().memory().region_alloc(device().subtag("^cart:rom"), size, 1, ENDIANNESS_LITTLE)->base(); m_rom_size = size; m_rom_page_count = size / 0x4000; if (!m_rom_page_count) @@ -118,7 +120,7 @@ void device_sega8_cart_interface::ram_alloc(uint32_t size) sega8_cart_slot_device::sega8_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, bool is_card) : device_t(mconfig, type, tag, owner, clock) - , device_image_interface(mconfig, *this) + , device_cartrom_image_interface(mconfig, *this) , device_single_card_slot_interface<device_sega8_cart_interface>(mconfig, *this) , m_type(SEGA8_BASE_ROM) , m_is_card(is_card) @@ -223,6 +225,7 @@ static const sega8_slot slot_list[] = { SEGA8_NEMESIS, "nemesis" }, { SEGA8_JANGGUN, "janggun" }, { SEGA8_KOREAN, "korean" }, + { SEGA8_KOREAN_188IN1, "korean_188in1" }, { SEGA8_KOREAN_NOBANK, "korean_nb" }, { SEGA8_OTHELLO, "othello" }, { SEGA8_CASTLE, "castle" }, @@ -263,21 +266,23 @@ static const char *sega8_get_slot(int type) call load -------------------------------------------------*/ -image_verify_result sega8_cart_slot_device::verify_cart( uint8_t *magic, int size ) +std::error_condition sega8_cart_slot_device::verify_cart( const uint8_t *magic, int size ) { - image_verify_result retval(image_verify_result::FAIL); + std::error_condition retval; // Verify the file is a valid image - check $7ff0 for "TMR SEGA" if (size >= 0x8000) { - if (!strncmp((char*)&magic[0x7ff0], "TMR SEGA", 8)) - retval = image_verify_result::PASS; + if (strncmp((const char*)&magic[0x7ff0], "TMR SEGA", 8)) + retval = image_error::INVALIDIMAGE; } + else + retval = image_error::INVALIDLENGTH; return retval; } -void sega8_cart_slot_device::set_lphaser_xoffset( uint8_t *rom, int size ) +void sega8_cart_slot_device::set_lphaser_xoffset( const uint8_t *rom, int size ) { static const uint8_t signatures[7][16] = { @@ -387,33 +392,29 @@ void sega8_cart_slot_device::setup_ram() } } -image_init_result sega8_cart_slot_device::call_load() +std::pair<std::error_condition, std::string> sega8_cart_slot_device::call_load() { if (m_cart) { uint32_t len = !loaded_through_softlist() ? length() : get_software_region_length("rom"); - uint32_t offset = 0; - uint8_t *ROM; if (m_is_card && len > 0x8000) - { - seterror(image_error::INVALIDIMAGE, "Attempted loading a card larger than 32KB"); - return image_init_result::FAIL; - } + return std::make_pair(image_error::INVALIDLENGTH, "Sega Card images must be no larger than 32K"); // check for header + uint32_t offset = 0; if ((len % 0x4000) == 512) { offset = 512; len -= 512; } - // make sure that we only get complete (0x4000) rom banks + // make sure that we only get complete (0x4000) ROM banks if (len & 0x3fff) len = ((len >> 14) + 1) << 14; - m_cart->rom_alloc(len, tag()); - ROM = m_cart->get_rom_base(); + m_cart->rom_alloc(len); + uint8_t *const ROM = m_cart->get_rom_base(); if (!loaded_through_softlist()) { @@ -423,8 +424,8 @@ image_init_result sega8_cart_slot_device::call_load() else memcpy(ROM, get_software_region("rom"), get_software_region_length("rom")); - /* check the image */ - if (verify_cart(ROM, len) != image_verify_result::PASS) + // check the image + if (verify_cart(ROM, len)) logerror("Warning loading image: verify_cart failed\n"); if (loaded_through_softlist()) @@ -452,11 +453,9 @@ image_init_result sega8_cart_slot_device::call_load() //printf("Type: %s\n", sega8_get_slot(type)); internal_header_logging(ROM + offset, len, m_cart->get_ram_size()); - - return image_init_result::PASS; } - return image_init_result::PASS; + return std::make_pair(std::error_condition(), std::string()); } @@ -540,7 +539,7 @@ int sega8_cart_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len) cons { if (ROM[i] == 0x32) // Z80 opcode for: LD (xxxx), A { - uint16_t addr = (ROM[i + 2] << 8) | ROM[i + 1]; + uint16_t addr = get_u16le(&ROM[i + 1]); if (addr == 0xffff) { i += 2; _ffff++; continue; } if (addr == 0x0002 || addr == 0x0003 || addr == 0x0004) @@ -589,7 +588,7 @@ int sega8_cart_slot_device::get_cart_type(const uint8_t *ROM, uint32_t len) cons { if (ROM[i] == 0x32) { - uint16_t addr = ROM[i + 1] | (ROM[i + 2] << 8); + uint16_t addr = get_u16le(&ROM[i + 1]); switch (addr & 0xf000) { @@ -670,8 +669,7 @@ std::string sega8_cart_slot_device::get_default_card_software(get_default_card_s hook.image_file()->length(len); // FIXME: check error return, guard against excessively large files std::vector<uint8_t> rom(len); - size_t actual; - hook.image_file()->read(&rom[0], len, actual); // FIXME: check error return or read returning short + /*auto const [err, actual] =*/ read(*hook.image_file(), &rom[0], len); // FIXME: check error return or read returning short uint32_t const offset = ((len % 0x4000) == 512) ? 512 : 0; @@ -750,7 +748,7 @@ void sega8_cart_slot_device::write_io(offs_t offset, uint8_t data) Internal header logging -------------------------------------------------*/ -void sega8_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t len, uint32_t nvram_len) +void sega8_cart_slot_device::internal_header_logging(const uint8_t *ROM, uint32_t len, uint32_t nvram_len) { static const char *const system_region[] = { @@ -792,11 +790,6 @@ void sega8_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t len, 0x20000, }; - char reserved[10]; - uint8_t version, csum_size, region, serial[3]; - uint16_t checksum, csum = 0; - uint32_t csum_end; - // LOG FILE DETAILS logerror("FILE DETAILS\n" ); logerror("============\n" ); @@ -814,41 +807,39 @@ void sega8_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t len, if (len < 0x8000) return; + char reserved[10]; for (int i = 0; i < 10; i++) reserved[i] = ROM[0x7ff0 + i]; - checksum = ROM[0x7ffa] | (ROM[0x7ffb] << 8); + uint16_t checksum = get_u16le(&ROM[0x7ffa]); + uint8_t serial[3]; for (int i = 0; i < 3; i++) serial[i] = ROM[0x7ffc + i]; serial[2] &= 0x0f; - version = (ROM[0x7ffe] & 0xf0) >> 4; + uint8_t version = (ROM[0x7ffe] & 0xf0) >> 4; - csum_size = ROM[0x7fff] & 0x0f; - csum_end = csum_length[csum_size]; + uint8_t csum_size = ROM[0x7fff] & 0x0f; + uint32_t csum_end = csum_length[csum_size]; if (!csum_end || csum_end > len) csum_end = len; - region = (ROM[0x7fff] & 0xf0) >> 4; + uint8_t region = (ROM[0x7fff] & 0xf0) >> 4; // compute cart checksum to compare with expected one - for (int i = 0; i < csum_end; i++) - { - if (i < 0x7ff0 || i >= 0x8000) - { - csum += ROM[i]; - csum &= 0xffff; - } - } + util::sum16_creator sum16; + sum16.append(ROM, std::min<uint32_t>(csum_end, 0x7ff0)); + if (csum_end > 0x8000) + sum16.append(&ROM[0x8000], csum_end - 0x8000); logerror("INTERNAL HEADER\n" ); logerror("===============\n" ); logerror("Reserved String: %.10s\n", reserved); logerror("Region: %s\n", system_region[region]); - logerror("Checksum: (Expected) 0x%x - (Computed) 0x%x\n", checksum, csum); + logerror("Checksum: (Expected) 0x%x - (Computed) 0x%x\n", checksum, sum16.finish()); logerror(" [checksum over 0x%X bytes]\n", csum_length[csum_size]); - logerror("Serial String: %X\n", serial[0] | (serial[1] << 8) | (serial[2] << 16)); + logerror("Serial String: %X\n", get_u24le(serial)); logerror("Software Revision: %x\n", version); logerror("\n" ); @@ -856,14 +847,14 @@ void sega8_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t len, if (m_type == SEGA8_CODEMASTERS) { uint8_t day, month, year, hour, minute; - csum = 0; + uint16_t csum = 0; day = ROM[0x7fe1]; month = ROM[0x7fe2]; year = ROM[0x7fe3]; hour = ROM[0x7fe4]; minute = ROM[0x7fe5]; - checksum = ROM[0x7fe6] | (ROM[0x7fe7] << 8); + checksum = get_u16le(&ROM[0x7fe6]); csum_size = ROM[0x7fe0]; // compute cart checksum to compare with expected one @@ -871,7 +862,7 @@ void sega8_cart_slot_device::internal_header_logging(uint8_t *ROM, uint32_t len, { if (i < 0x7ff0 || i >= 0x8000) { - csum += (ROM[i] | (ROM[i + 1] << 8)); + csum += get_u16le(&ROM[i]); csum &= 0xffff; } } @@ -916,6 +907,7 @@ void sg1000mk3_cart(device_slot_interface &device) device.option_add_internal("janggun", SEGA8_ROM_JANGGUN); device.option_add_internal("hicom", SEGA8_ROM_HICOM); device.option_add_internal("korean", SEGA8_ROM_KOREAN); + device.option_add_internal("korean_188in1", SEGA8_ROM_KOREAN_188); device.option_add_internal("korean_nb", SEGA8_ROM_KOREAN_NB); device.option_add_internal("seojin", SEGA8_ROM_SEOJIN); device.option_add_internal("othello", SEGA8_ROM_OTHELLO); @@ -937,6 +929,7 @@ void sms_cart(device_slot_interface &device) device.option_add_internal("janggun", SEGA8_ROM_JANGGUN); device.option_add_internal("hicom", SEGA8_ROM_HICOM); device.option_add_internal("korean", SEGA8_ROM_KOREAN); + device.option_add_internal("korean_188in1", SEGA8_ROM_KOREAN_188); device.option_add_internal("korean_nb", SEGA8_ROM_KOREAN_NB); } |