From 7bff87f979646d7a0b878658a636ca072c7e88e8 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 4 Jun 2020 15:09:40 +0200 Subject: [PATCH] msx: add matra ink cartridge (nw) --- scripts/src/bus.lua | 2 + src/devices/bus/msx_cart/cartridge.cpp | 2 + src/devices/bus/msx_cart/ink.cpp | 55 ++++++++++++++++++++++++++ src/devices/bus/msx_cart/ink.h | 36 +++++++++++++++++ src/devices/machine/intelfsh.cpp | 8 ++-- 5 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/devices/bus/msx_cart/ink.cpp create mode 100644 src/devices/bus/msx_cart/ink.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index 0130cf9e40e..a0a0f571bf5 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1608,6 +1608,8 @@ if (BUSES["MSX_SLOT"]~=null) then MAME_DIR .. "src/devices/bus/msx_cart/hfox.h", MAME_DIR .. "src/devices/bus/msx_cart/holy_quran.cpp", MAME_DIR .. "src/devices/bus/msx_cart/holy_quran.h", + MAME_DIR .. "src/devices/bus/msx_cart/ink.cpp", + MAME_DIR .. "src/devices/bus/msx_cart/ink.h", MAME_DIR .. "src/devices/bus/msx_cart/konami.cpp", MAME_DIR .. "src/devices/bus/msx_cart/konami.h", MAME_DIR .. "src/devices/bus/msx_cart/korean.cpp", diff --git a/src/devices/bus/msx_cart/cartridge.cpp b/src/devices/bus/msx_cart/cartridge.cpp index 967732b3ae3..9c1e03a05fb 100644 --- a/src/devices/bus/msx_cart/cartridge.cpp +++ b/src/devices/bus/msx_cart/cartridge.cpp @@ -14,6 +14,7 @@ #include "halnote.h" #include "hfox.h" #include "holy_quran.h" +#include "ink.h" #include "konami.h" #include "korean.h" #include "majutsushi.h" @@ -58,6 +59,7 @@ void msx_cart(device_slot_interface &device) device.option_add_internal("msxaud_nms1205", MSX_CART_MSX_AUDIO_NMS1205); device.option_add_internal("super_swangi", MSX_CART_SUPER_SWANGI); device.option_add_internal("hfox", MSX_CART_HFOX); + device.option_add_internal("ink", MSX_CART_INK); device.option_add_internal("keyboard_master", MSX_CART_KEYBOARD_MASTER); device.option_add_internal("holy_quran", MSX_CART_HOLY_QURAN); device.option_add_internal("dooly", MSX_CART_DOOLY); diff --git a/src/devices/bus/msx_cart/ink.cpp b/src/devices/bus/msx_cart/ink.cpp new file mode 100644 index 00000000000..e3053a5da7d --- /dev/null +++ b/src/devices/bus/msx_cart/ink.cpp @@ -0,0 +1,55 @@ +// license:BSD-3-Clause +// copyright-holders:hap +/****************************************************************************** + +Ink cartridge (Matra, 2006) + +48KB ROM data on an AMD Am29F040B(label scratched off), the game uses it +for protection. + +******************************************************************************/ + +#include "emu.h" +#include "ink.h" + +DEFINE_DEVICE_TYPE(MSX_CART_INK, msx_cart_ink_device, "msx_cart_ink", "MSX Cartridge - Ink") + + +msx_cart_ink_device::msx_cart_ink_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, MSX_CART_INK, tag, owner, clock) + , msx_cart_interface(mconfig, *this) + , m_flash(*this, "flash") +{ +} + +ROM_START( msx_cart_ink ) + ROM_REGION(0x80000, "flash", ROMREGION_ERASEFF) +ROM_END + +const tiny_rom_entry *msx_cart_ink_device::device_rom_region() const +{ + return ROM_NAME( msx_cart_ink ); +} + +void msx_cart_ink_device::device_add_mconfig(machine_config &config) +{ + AMD_29F040(config, m_flash); +} + +void msx_cart_ink_device::initialize_cartridge() +{ + size_t size = get_rom_size() > 0x80000 ? 0x80000 : get_rom_size(); + memcpy(memregion("flash")->base(), get_rom_base(), size); +} + + +uint8_t msx_cart_ink_device::read_cart(offs_t offset) +{ + return m_flash->read(offset); +} + +void msx_cart_ink_device::write_cart(offs_t offset, uint8_t data) +{ + // /RD connects to flashrom A16-A18 + m_flash->write(offset | 0x70000, data); +} diff --git a/src/devices/bus/msx_cart/ink.h b/src/devices/bus/msx_cart/ink.h new file mode 100644 index 00000000000..933385c575d --- /dev/null +++ b/src/devices/bus/msx_cart/ink.h @@ -0,0 +1,36 @@ +// license:BSD-3-Clause +// copyright-holders:hap +#ifndef MAME_BUS_MSX_CART_INK_H +#define MAME_BUS_MSX_CART_INK_H + +#pragma once + +#include "bus/msx_cart/cartridge.h" +#include "machine/intelfsh.h" + + +DECLARE_DEVICE_TYPE(MSX_CART_INK, msx_cart_ink_device) + + +class msx_cart_ink_device : public device_t, public msx_cart_interface +{ +public: + msx_cart_ink_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + virtual void initialize_cartridge() override; + + virtual uint8_t read_cart(offs_t offset) override; + virtual void write_cart(offs_t offset, uint8_t data) override; + +protected: + // device-level overrides + virtual void device_start() override { ; } + virtual void device_add_mconfig(machine_config &config) override; + virtual const tiny_rom_entry *device_rom_region() const override; + +private: + required_device m_flash; +}; + + +#endif // MAME_BUS_MSX_CART_INK_H diff --git a/src/devices/machine/intelfsh.cpp b/src/devices/machine/intelfsh.cpp index 027340e4736..b8293cad26e 100644 --- a/src/devices/machine/intelfsh.cpp +++ b/src/devices/machine/intelfsh.cpp @@ -623,7 +623,7 @@ uint32_t intelfsh_device::read_full(uint32_t address) { // used in Fujitsu 29DL16X 8bits mode // used in AMD 29LV200 8bits mode - switch (address) + switch (address & 0xff) { case 0: data = m_maker_id; break; case 2: data = m_device_id; break; @@ -632,7 +632,7 @@ uint32_t intelfsh_device::read_full(uint32_t address) } else { - switch (address) + switch (address & 0xff) { case 0: data = m_maker_id; break; case 1: data = m_device_id; break; @@ -643,7 +643,7 @@ uint32_t intelfsh_device::read_full(uint32_t address) case FM_READID: if (m_maker_id == MFG_INTEL && m_device_id == 0x16) { - switch (address) + switch (address & 0xff) { case 0: data = m_maker_id; break; case 2: data = m_device_id; break; @@ -652,7 +652,7 @@ uint32_t intelfsh_device::read_full(uint32_t address) } else { - switch (address) + switch (address & 0xff) { case 0: // maker ID data = m_maker_id;