casio/casloopy.cpp: Promoted system to working. (#11621)

* Emulated most features of the system, with the exception of sound output and the thermal printer.
* bus/vboy/slot.cpp: Fixed loading loose software on big Endian hosts. [Vas Crabb]

Systems promoted to working
---------------------------
Casio Loopy [Phil Bennett, Ryan Holtz]

New working software list items (casloopy.xml)
-------------------------------
Chakra-kun no Omajinai Paradise [Rachel Simone Weil]
This commit is contained in:
Phil Bennett 2023-10-17 11:45:26 -07:00 committed by GitHub
parent a5b5686970
commit cbe16a03a8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 25503 additions and 437 deletions

View file

@ -5,19 +5,32 @@ license:CC0-1.0
-->
<softwarelist name="casloopy" description="Casio Loopy cartridges">
<!-- Undumped titles:
- Chakura-kun no Omajinai Paradise (チャクラくんのおまじないパラダイス)
-->
<software name="animelnd">
<description>Anime Land</description>
<year>1994</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-401"/>
<info name="alt_title" value="あにめらんど"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="animelnd.bin" size="0x200000" crc="665cd0a2" sha1="8d50867aba721185560fc92bed75c92263a1da39"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="animelnd.bin" size="0x200000" crc="665cd0a2" sha1="8d50867aba721185560fc92bed75c92263a1da39" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
<software name="chakrakun">
<description>Chakra-kun no Omajinai Paradise</description>
<year>1997</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-405"/>
<info name="alt_title" value="チャクラくんのおまじないパラダイス"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="chakrakun.bin" size="0x200000" crc="35539985" sha1="96af1630c77ef1008d697cb65efb6c2e0e6e3f81" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
@ -28,9 +41,11 @@ license:CC0-1.0
<publisher>Casio</publisher>
<info name="serial" value="XK-403"/>
<info name="alt_title" value="ドリームチェンジ 小金ちゃんのファッションパーティー"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="dreamchg.bin" size="0x200000" crc="0b850185" sha1="b5d73661ea83167d2b07516c7c66a8a85b28415b"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="dreamchg.bin" size="0x200000" crc="0b850185" sha1="b5d73661ea83167d2b07516c7c66a8a85b28415b" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
@ -41,9 +56,11 @@ license:CC0-1.0
<publisher>Casio</publisher>
<info name="serial" value="XK-402"/>
<info name="alt_title" value="HARIHARIシールパラダイス"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="harihari.bin" size="0x200000" crc="39a417d6" sha1="1adbd97181b61a1a65e21976b0146e9dd80fbdbf"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="harihari.bin" size="0x200000" crc="39a417d6" sha1="1adbd97181b61a1a65e21976b0146e9dd80fbdbf" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
@ -54,49 +71,12 @@ license:CC0-1.0
<publisher>Casio</publisher>
<info name="serial" value="XK-503"/>
<info name="alt_title" value="リトルロマンス"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x300000">
<rom name="d23c16000.ic104" size="0x200000" crc="4406ed81" sha1="32ce9fa7f5d3cb6a9de69f0a54fb3a169cec5432" offset="0x000000" />
<rom name="d23c8000.ic105" size="0x100000" crc="a868e597" sha1="87226d26dbb3a95ce8f75a595bd874af6e5cb17b" offset="0x200000" />
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x300000">
<rom name="d23c16000.ic104" size="0x200000" offset="0x000000" crc="4406ed81" sha1="32ce9fa7f5d3cb6a9de69f0a54fb3a169cec5432" loadflag="load16_word_swap"/>
<rom name="d23c8000.ic105" size="0x100000" offset="0x200000" crc="a868e597" sha1="87226d26dbb3a95ce8f75a595bd874af6e5cb17b" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="nigaoart">
<description>Nigaoe Artist</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-404"/>
<info name="alt_title" value="似顔絵アーティスト"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="nigaoart.bin" size="0x200000" crc="63d59881" sha1="d2b830acf8440e4726e851514d609700375b27db"/>
</dataarea>
</part>
</software>
<software name="wanwanam">
<description>Wanwan Aijou Monogatari</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-501"/>
<info name="alt_title" value="わんわん愛情物語"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="wanwanam.bin" size="0x200000" crc="291ab2bc" sha1="77a63cf194c5b06633e25b43916629b6f3428870"/>
</dataarea>
</part>
</software>
<software name="pccllect">
<description>Pasokon Collection</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-502"/>
<info name="alt_title" value="パソコン・コレクション"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="pccllect.bin" size="0x200000" crc="9cd4d282" sha1="15ac5a8e71fc8371505da8368d04c9634655d1d5"/>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
@ -107,10 +87,12 @@ license:CC0-1.0
<publisher>Casio</publisher>
<info name="serial" value="XK-504"/>
<info name="alt_title" value="ルーピータウンのおへやがほしい!"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x300000">
<rom name="CHIP1.IC104" size="0x200000" crc="bae71d45" sha1="79628715ccedd9bc3fd72d21fa9ea6513b88cf51" offset="0x000000" />
<rom name="CHIP2.IC105" size="0x100000" crc="e0514d03" sha1="4dd02faa1ebf6754da0ade417e488512f3502620" offset="0x200000" />
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x300000">
<rom name="chip1.ic104" size="0x200000" offset="0x000000" crc="bae71d45" sha1="79628715ccedd9bc3fd72d21fa9ea6513b88cf51" loadflag="load16_word_swap"/>
<rom name="chip2.ic105" size="0x100000" offset="0x200000" crc="e0514d03" sha1="4dd02faa1ebf6754da0ade417e488512f3502620" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
@ -121,22 +103,70 @@ license:CC0-1.0
<publisher>Casio</publisher>
<info name="serial" value="XK-701"/>
<info name="alt_title" value="ルピトンのワンダーパレット"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x200000">
<rom name="lupiton.bin" size="0x200000" crc="338a5af7" sha1="ddb3e2b363ef0325a1370511f3692ca47031cb46" />
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="lupiton.bin" size="0x200000" crc="338a5af7" sha1="ddb3e2b363ef0325a1370511f3692ca47031cb46" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
<software name="vswordp">
<software name="nigaoart">
<description>Nigaoe Artist</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-404"/>
<info name="alt_title" value="似顔絵アーティスト"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="nigaoart.bin" size="0x200000" crc="63d59881" sha1="d2b830acf8440e4726e851514d609700375b27db" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>
<software name="pccllect">
<description>Pasokon Collection</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-502"/>
<info name="alt_title" value="パソコン・コレクション"/>
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="pccllect.bin" size="0x200000" crc="9cd4d282" sha1="15ac5a8e71fc8371505da8368d04c9634655d1d5" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x8000">
</dataarea>
</part>
</software>
<software name="vswordp" supported="no">
<description>Video Seal Wordprocessor</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-700"/>
<info name="alt_title" value="Magical Shop"/>
<part name="cart" interface="loopy_cart">
<dataarea name="rom" size="0x100000">
<rom name="mx23c8100.lsi102" size="0x100000" crc="5764591f" sha1="16a2ade7e08f16e44d5c74c714840df1b48da4ad" />
<part name="cart" interface="casloopy_cart">
<dataarea name="rom" width="16" endianness="big" size="0x100000">
<rom name="mx23c8100.lsi102" size="0x100000" crc="5764591f" sha1="16a2ade7e08f16e44d5c74c714840df1b48da4ad" loadflag="load16_word_swap"/>
</dataarea>
</part>
</software>
<software name="wanwanam" supported="partial"> <!-- ADPCM chip not supported -->
<description>Wanwan Aijou Monogatari</description>
<year>1995</year>
<publisher>Casio</publisher>
<info name="serial" value="XK-501"/>
<info name="alt_title" value="わんわん愛情物語"/>
<part name="cart" interface="casloopy_cart">
<feature name="slot" value="adpcm"/>
<dataarea name="rom" width="16" endianness="big" size="0x200000">
<rom name="wanwanam.bin" size="0x200000" crc="291ab2bc" sha1="77a63cf194c5b06633e25b43916629b6f3428870" loadflag="load16_word_swap"/>
</dataarea>
<dataarea name="nvram" size="0x2000">
</dataarea>
</part>
</software>

View file

@ -1026,6 +1026,21 @@ if (BUSES["C64"]~=null) then
end
---------------------------------------------------
--
--@src/devices/bus/casloopy/slot.h,BUSES["CASLOOPY"] = true
---------------------------------------------------
if (BUSES["CASLOOPY"]~=null) then
files {
MAME_DIR .. "src/devices/bus/casloopy/slot.cpp",
MAME_DIR .. "src/devices/bus/casloopy/slot.h",
MAME_DIR .. "src/devices/bus/casloopy/rom.cpp",
MAME_DIR .. "src/devices/bus/casloopy/rom.h",
}
end
---------------------------------------------------
--
--@src/devices/bus/cbm2/exp.h,BUSES["CBM2"] = true

View file

@ -0,0 +1,117 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
/***********************************************************************************************************
Casio Loopy cart emulation
***********************************************************************************************************/
#include "emu.h"
#include "rom.h"
//-------------------------------------------------
// casloopy_rom_device - constructor
//-------------------------------------------------
DEFINE_DEVICE_TYPE(CASLOOPY_ROM_STD, casloopy_rom_device, "casloopy_rom", "Casio Loopy Standard Cart")
DEFINE_DEVICE_TYPE(CASLOOPY_ROM_ADPCM, casloopy_adpcm_device, "casloopy_adpcm", "Casio Loopy ADPCM Cart")
casloopy_rom_device::casloopy_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, type, tag, owner, clock), device_casloopy_cart_interface(mconfig, *this)
, m_rom_base(nullptr)
, m_nvram_base(nullptr)
, m_rom_size(0)
, m_nvram_size(0)
{
}
casloopy_rom_device::casloopy_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: casloopy_rom_device(mconfig, CASLOOPY_ROM_STD, tag, owner, clock)
{
}
casloopy_adpcm_device::casloopy_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: casloopy_rom_device(mconfig, CASLOOPY_ROM_ADPCM, tag, owner, clock)
{
}
/*-------------------------------------------------
device_t implementation
-------------------------------------------------*/
void casloopy_rom_device::device_start()
{
}
void casloopy_adpcm_device::device_add_mconfig(machine_config &config)
{
casloopy_rom_device::device_add_mconfig(config);
// TODO: Add support for the MSM6653A ADPCM chip, or samples
// and route to the speakers
}
/*-------------------------------------------------
load/unload
-------------------------------------------------*/
std::error_condition casloopy_rom_device::load()
{
memory_region *const romregion = memregion("^rom");
m_rom_base = reinterpret_cast<const u16 *>(romregion->base());
m_rom_size = romregion->bytes() / 2;
memory_region *const nvramregion = memregion("^nvram");
if (nvramregion)
{
m_nvram_base = reinterpret_cast<u8 *>(nvramregion->base());
m_nvram_size = nvramregion->bytes();
if (m_nvram_size & (m_nvram_size - 1))
return image_error::BADSOFTWARE;
save_pointer(NAME(m_nvram_base), m_nvram_size);
battery_load(m_nvram_base, m_nvram_size, nullptr);
}
return std::error_condition();
}
void casloopy_rom_device::unload()
{
if (m_nvram_base)
battery_save(m_nvram_base, m_nvram_size);
}
/*-------------------------------------------------
read/write
-------------------------------------------------*/
u16 casloopy_rom_device::rom_r(offs_t offset)
{
if (offset < m_rom_size)
return m_rom_base[offset];
else
return 0xffff;
}
u8 casloopy_rom_device::ram_r(offs_t offset)
{
if (m_nvram_base)
return m_nvram_base[offset & (m_nvram_size - 1)];
else
return 0xff;
}
void casloopy_rom_device::ram_w(offs_t offset, u8 data)
{
if (m_nvram_base)
m_nvram_base[offset & (m_nvram_size - 1)] = data;
}

View file

@ -0,0 +1,58 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#ifndef MAME_BUS_CASLOOPY_ROM_H
#define MAME_BUS_CASLOOPY_ROM_H
#pragma once
#include "slot.h"
// ======================> casloopy_rom_device
class casloopy_rom_device : public device_t,
public device_casloopy_cart_interface
{
public:
// construction/destruction
casloopy_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// load/unload
virtual std::error_condition load() override;
virtual void unload() override;
// read/write
virtual u16 rom_r(offs_t offset) override;
virtual u8 ram_r(offs_t offset) override;
virtual void ram_w(offs_t offset, u8 data) override;
protected:
casloopy_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
virtual void device_start() override;
private:
const u16 *m_rom_base;
u8 *m_nvram_base;
u32 m_rom_size;
u32 m_nvram_size;
};
// ======================> casloopy_adpcm_device
class casloopy_adpcm_device : public casloopy_rom_device
{
public:
// construction/destruction
casloopy_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
protected:
virtual void device_add_mconfig(machine_config &config) override;
};
// device type definition
DECLARE_DEVICE_TYPE(CASLOOPY_ROM_STD, casloopy_rom_device)
DECLARE_DEVICE_TYPE(CASLOOPY_ROM_ADPCM, casloopy_adpcm_device)
#endif // MAME_BUS_CASLOOPY_ROM_H

View file

@ -0,0 +1,149 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
/***********************************************************************************************************
Casio Loopy cart slot emulation
***********************************************************************************************************/
#include "emu.h"
#include "slot.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
DEFINE_DEVICE_TYPE(CASLOOPY_CART_SLOT, casloopy_cart_slot_device, "casloopy_cart_slot", "Casio Loopy Cartridge Slot")
//**************************************************************************
// casloopy Cartridges Interface
//**************************************************************************
//-------------------------------------------------
// device_casloopy_cart_interface - constructor
//-------------------------------------------------
device_casloopy_cart_interface::device_casloopy_cart_interface(const machine_config &mconfig, device_t &device)
: device_interface(device, "casloopy_cart")
, m_slot(dynamic_cast<casloopy_cart_slot_device *>(device.owner()))
{
}
//-------------------------------------------------
// ~device_casloopy_cart_interface - destructor
//-------------------------------------------------
device_casloopy_cart_interface::~device_casloopy_cart_interface()
{
}
void device_casloopy_cart_interface::battery_load(void *buffer, int length, int fill)
{
assert(m_slot);
m_slot->battery_load(buffer, length, fill);
}
void device_casloopy_cart_interface::battery_load(void *buffer, int length, void *def_buffer)
{
assert(m_slot);
m_slot->battery_load(buffer, length, def_buffer);
}
void device_casloopy_cart_interface::battery_save(const void *buffer, int length)
{
assert(m_slot);
m_slot->battery_save(buffer, length);
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// casloopy_cart_slot_device - constructor
//-------------------------------------------------
casloopy_cart_slot_device::casloopy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
device_t(mconfig, CASLOOPY_CART_SLOT, tag, owner, clock),
device_cartrom_image_interface(mconfig, *this),
device_single_card_slot_interface<device_casloopy_cart_interface>(mconfig, *this),
m_cart(nullptr)
{
}
//-------------------------------------------------
// casloopy_cart_slot_device - destructor
//-------------------------------------------------
casloopy_cart_slot_device::~casloopy_cart_slot_device()
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void casloopy_cart_slot_device::device_start()
{
m_cart = get_card_device();
}
/*-------------------------------------------------
call load
-------------------------------------------------*/
std::pair<std::error_condition, std::string> casloopy_cart_slot_device::call_load()
{
if (!m_cart)
return std::make_pair(std::error_condition(), std::string());
memory_region *romregion = loaded_through_softlist() ? memregion("rom") : nullptr;
if (loaded_through_softlist() && !romregion)
return std::make_pair(image_error::INVALIDLENGTH, "Software list item has no 'rom' data area");
const u32 len = loaded_through_softlist() ? romregion->bytes() : length();
if (!loaded_through_softlist())
{
romregion = machine().memory().region_alloc(subtag("rom"), len, 2, ENDIANNESS_BIG);
u16 *const rombase = reinterpret_cast<u16 *>(romregion->base());
const u32 cnt = fread(rombase, len);
if (cnt != len)
return std::make_pair(std::errc::io_error, "Error reading cartridge file");
// CPU is big Endian, but conventional ROM dump format is little Endian
if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE)
{
for (u32 i = 0; (len / 2) > i; ++i)
rombase[i] = swapendian_int16(rombase[i]);
}
}
return std::make_pair(m_cart->load(), std::string());
}
/*-------------------------------------------------
call unload
-------------------------------------------------*/
void casloopy_cart_slot_device::call_unload()
{
if (m_cart)
m_cart->unload();
}
/*-------------------------------------------------
get default card software
-------------------------------------------------*/
std::string casloopy_cart_slot_device::get_default_card_software(get_default_card_software_hook &hook) const
{
return software_get_default_slot("std");
}

View file

@ -0,0 +1,90 @@
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
#ifndef MAME_BUS_CASLOOPY_SLOT_H
#define MAME_BUS_CASLOOPY_SLOT_H
#include "imagedev/cartrom.h"
#include <system_error>
#include <utility>
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
class casloopy_cart_slot_device;
class device_casloopy_cart_interface : public device_interface
{
public:
virtual ~device_casloopy_cart_interface();
// load/unload
virtual std::error_condition load() = 0;
virtual void unload() = 0;
// read/write
virtual u16 rom_r(offs_t offset) = 0;
virtual u8 ram_r(offs_t offset) = 0;
virtual void ram_w(offs_t offset, u8 data) = 0;
protected:
// construction/destruction
device_casloopy_cart_interface(const machine_config &mconfig, device_t &device);
// helpers for slot stuff
void battery_load(void *buffer, int length, int fill);
void battery_load(void *buffer, int length, void *def_buffer);
void battery_save(const void *buffer, int length);
private:
casloopy_cart_slot_device *const m_slot;
};
class casloopy_cart_slot_device : public device_t,
public device_cartrom_image_interface,
public device_single_card_slot_interface<device_casloopy_cart_interface>
{
public:
// construction/destruction
template <typename T>
casloopy_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock, T &&opts, char const *dflt)
: casloopy_cart_slot_device(mconfig, tag, owner, clock)
{
option_reset();
opts(*this);
set_default_option(dflt);
set_fixed(false);
}
casloopy_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual ~casloopy_cart_slot_device();
// device_image_interface implementation
virtual std::pair<std::error_condition, std::string> call_load() override;
virtual void call_unload() override;
virtual bool is_reset_on_load() const noexcept override { return true; }
virtual const char *image_interface() const noexcept override { return "casloopy_cart"; }
virtual const char *file_extensions() const noexcept override { return "bin"; }
// device_slot_interface implementation
virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override;
// reading and writing
u16 rom_r(offs_t offset) { return m_cart ? m_cart->rom_r(offset) : 0xffff; }
u8 ram_r(offs_t offset) { return m_cart ? m_cart->ram_r(offset) : 0xff; }
void ram_w(offs_t offset, u8 data) { if (m_cart) m_cart->ram_w(offset, data); }
protected:
// device_t implementation
virtual void device_start() override;
device_casloopy_cart_interface *m_cart;
};
DECLARE_DEVICE_TYPE(CASLOOPY_CART_SLOT, casloopy_cart_slot_device)
#endif // MAME_BUS_CASLOOPY_SLOT_H

View file

@ -66,9 +66,16 @@ std::pair<std::error_condition, std::string> vboy_cart_slot_device::call_load()
{
LOG("Allocating %u byte cartridge ROM region\n", len);
romregion = machine().memory().region_alloc(subtag("rom"), len, 4, ENDIANNESS_LITTLE);
u32 const cnt(fread(romregion->base(), len));
u32 *const rombase(reinterpret_cast<u32 *>(romregion->base()));
u32 const cnt(fread(rombase, len));
if (cnt != len)
return std::make_pair(image_error::UNSPECIFIED, "Error reading cartridge file");
return std::make_pair(std::errc::io_error, "Error reading cartridge file");
if (ENDIANNESS_NATIVE != ENDIANNESS_LITTLE)
{
for (u32 i = 0; (len / 4) > i; ++i)
rombase[i] = swapendian_int32(rombase[i]);
}
}
return std::make_pair(m_cart->load(), std::string());

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff