diff options
-rw-r--r-- | src/mame/tomy/tomy_princ.cpp | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/src/mame/tomy/tomy_princ.cpp b/src/mame/tomy/tomy_princ.cpp index 06657bede3b..46ff7766bee 100644 --- a/src/mame/tomy/tomy_princ.cpp +++ b/src/mame/tomy/tomy_princ.cpp @@ -81,15 +81,17 @@ private: required_device<mb90611_device> m_maincpu; required_device<timer_device> m_scantimer; + virtual void machine_start() override; virtual void machine_reset() override; TIMER_DEVICE_CALLBACK_MEMBER(scan_interrupt); + DEVICE_IMAGE_LOAD_MEMBER(cart_load); void princ_map(address_map &map); u8 read_gpu_status(); - uint32_t screen_update_tomy_princ(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + u32 screen_update_tomy_princ(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); bool bFirstPort8Read = false; }; @@ -106,6 +108,15 @@ TIMER_DEVICE_CALLBACK_MEMBER(tomy_princ_state::scan_interrupt) m_maincpu->tin1_w(CLEAR_LINE); } +void tomy_princ_state::machine_start() +{ + if (m_cart->exists()) + { + memory_region *const cart_rom = m_cart->memregion("rom"); + m_maincpu->space(AS_PROGRAM).install_rom(0x800000, 0x87ffff, cart_rom->base()); + } +} + void tomy_princ_state::machine_reset() { bFirstPort8Read = true; @@ -122,11 +133,62 @@ u8 tomy_princ_state::read_gpu_status() return 0x00; } -uint32_t tomy_princ_state::screen_update_tomy_princ(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) +u32 tomy_princ_state::screen_update_tomy_princ(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return 0; } +DEVICE_IMAGE_LOAD_MEMBER(tomy_princ_state::cart_load) +{ + u64 length; + memory_region *cart_rom = nullptr; + if (m_cart->loaded_through_softlist()) + { + cart_rom = m_cart->memregion("rom"); + if (!cart_rom) + { + return std::make_pair(image_error::BADSOFTWARE, "Software list item has no 'rom' data area"); + } + length = cart_rom->bytes(); + } + else + { + length = m_cart->length(); + } + + if (!length) + { + return std::make_pair(image_error::INVALIDLENGTH, "Cartridges must not be empty"); + } + if (length & 1) + { + return std::make_pair(image_error::INVALIDLENGTH, "Unsupported cartridge size (must be a multiple of 2 bytes)"); + } + + if (!m_cart->loaded_through_softlist()) + { + cart_rom = machine().memory().region_alloc(m_cart->subtag("rom"), length, 2, ENDIANNESS_LITTLE); + if (!cart_rom) + { + return std::make_pair(std::errc::not_enough_memory, std::string()); + } + + u16 *const base = reinterpret_cast<u16 *>(cart_rom->base()); + if (m_cart->fread(base, length) != length) + { + return std::make_pair(std::errc::io_error, "Error reading cartridge file"); + } + + if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE) + { + for (u64 i = 0; (length / 2) > i; ++i) + base[i] = swapendian_int16(base[i]); + } + } + + return std::make_pair(std::error_condition(), std::string()); +} + // fe2d25 void tomy_princ_state::princ_map(address_map &map) { @@ -158,6 +220,11 @@ void tomy_princ_state::tomy_princ(machine_config &config) m_scantimer->configure_scanline(FUNC(tomy_princ_state::scan_interrupt), "screen", 0, 1); GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "princ_cart"); + m_cart->set_endian(ENDIANNESS_LITTLE); + m_cart->set_width(GENERIC_ROM16_WIDTH); + m_cart->set_device_load(FUNC(tomy_princ_state::cart_load)); + m_cart->set_must_be_loaded(false); + SOFTWARE_LIST(config, "cart_list").set_original("princ"); } |