From 65306b562451d3793693c3bb2027454f1b3033e6 Mon Sep 17 00:00:00 2001 From: wilbertpol Date: Sun, 16 Apr 2023 16:39:50 +0100 Subject: bus/msx/module: Added Yamaha SKW-01 emulation. (#11113) msx/msx2.cpp, msx/msx1_v9938.cpp: Changed the name of all MSX_SLOT_YAMAHA_EXPANSION devices to 'module'. --- scripts/src/bus.lua | 2 + src/devices/bus/msx/module/module.cpp | 3 + src/devices/bus/msx/module/sfg.h | 6 +- src/devices/bus/msx/module/skw01.cpp | 181 ++++++++++++++++++++++++++++++++++ src/devices/bus/msx/module/skw01.h | 12 +++ src/mame/msx/msx1_v9938.cpp | 4 +- src/mame/msx/msx2.cpp | 10 +- 7 files changed, 208 insertions(+), 10 deletions(-) create mode 100644 src/devices/bus/msx/module/skw01.cpp create mode 100644 src/devices/bus/msx/module/skw01.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index f6fb739f524..cd04a87cd18 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -1956,6 +1956,8 @@ if (BUSES["MSX_SLOT"]~=null) then MAME_DIR .. "src/devices/bus/msx/module/module.h", MAME_DIR .. "src/devices/bus/msx/module/sfg.cpp", MAME_DIR .. "src/devices/bus/msx/module/sfg.h", + MAME_DIR .. "src/devices/bus/msx/module/skw01.cpp", + MAME_DIR .. "src/devices/bus/msx/module/skw01.h", MAME_DIR .. "src/devices/bus/msx/softcard/softcard.cpp", MAME_DIR .. "src/devices/bus/msx/softcard/softcard.h", } diff --git a/src/devices/bus/msx/module/module.cpp b/src/devices/bus/msx/module/module.cpp index 7a0f17d1ffc..b716d5478e5 100644 --- a/src/devices/bus/msx/module/module.cpp +++ b/src/devices/bus/msx/module/module.cpp @@ -3,11 +3,13 @@ #include "emu.h" #include "module.h" #include "sfg.h" +#include "skw01.h" namespace bus::msx::module::slotoptions { char const *const SFG01 = "sfg01"; char const *const SFG05 = "sfg05"; +char const *const SKW01 = "skw01"; } @@ -16,6 +18,7 @@ void msx_yamaha_60pin(device_slot_interface &device, bool is_in_subslot) using namespace bus::msx::module; device.option_add(slotoptions::SFG01, MSX_CART_SFG01); device.option_add(slotoptions::SFG05, MSX_CART_SFG05); + device.option_add(slotoptions::SKW01, MSX_CART_SKW01); } diff --git a/src/devices/bus/msx/module/sfg.h b/src/devices/bus/msx/module/sfg.h index 0bd1590dad9..d40df66c677 100644 --- a/src/devices/bus/msx/module/sfg.h +++ b/src/devices/bus/msx/module/sfg.h @@ -1,7 +1,7 @@ // license:BSD-3-Clause // copyright-holders:Wilbert Pol -#ifndef MAME_BUS_MSX_CART_YAMAHA_H -#define MAME_BUS_MSX_CART_YAMAHA_H +#ifndef MAME_BUS_MSX_MODULE_SFG_H +#define MAME_BUS_MSX_MODULE_SFG_H #pragma once @@ -60,4 +60,4 @@ public: virtual const tiny_rom_entry *device_rom_region() const override; }; -#endif // MAME_BUS_MSX_CART_YAMAHA_H +#endif // MAME_BUS_MSX_MODULE_SFG_H diff --git a/src/devices/bus/msx/module/skw01.cpp b/src/devices/bus/msx/module/skw01.cpp new file mode 100644 index 00000000000..1e683e7eda3 --- /dev/null +++ b/src/devices/bus/msx/module/skw01.cpp @@ -0,0 +1,181 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +/************************************************************************** + +Yamaha SKW-01 emulation + +Word processor side slot module with Kanij ROM, 2KB SRAM, and a +printer port. +The PCB is labeled YMX-YWP. + +The software can be started from Basic by entering the command "CALL JWP" +or "_JWP". + +TODO: +- This module runs unstable on the cx5m128 driver. + The instability is mostly visible when pressing F1, causing the system + to reset, hang, or display a screen with random data. + +**************************************************************************/ + +#include "emu.h" +#include "skw01.h" +#include "bus/centronics/ctronics.h" +#include "machine/buffer.h" +#include "machine/nvram.h" + +namespace { + +class msx_cart_skw01_device : public device_t, public msx_cart_interface +{ +public: + msx_cart_skw01_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual const tiny_rom_entry *device_rom_region() const override; + +protected: + virtual void device_start() override; + + virtual void device_add_mconfig(machine_config &config) override; + +private: + static constexpr u16 SRAM_SIZE = 2048; + + required_device m_nvram; + required_memory_region m_region_rom; + required_memory_region m_region_dict; + required_memory_region m_region_kanji; + u16 m_bank_address[5]; + std::unique_ptr m_sram; + required_device m_cent_status_in; + required_device m_cent_ctrl_out; + required_device m_cent_data_out; + required_device m_centronics; + + template void addr_lo_w(u8 data); + template void addr_hi_w(u8 data); + template u8 ready_r() const; + template u8 data_r() const; + void dictsram_w(u8 data); + u8 dictsram_r() const; +}; + + +msx_cart_skw01_device::msx_cart_skw01_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, MSX_CART_SKW01, tag, owner, clock) + , msx_cart_interface(mconfig, *this) + , m_nvram(*this, "nvram") + , m_region_rom(*this, "rom") + , m_region_dict(*this, "dict") + , m_region_kanji(*this, "kanji") + , m_bank_address{0} + , m_cent_status_in(*this, "cent_status_in") + , m_cent_ctrl_out(*this, "cent_ctrl_out") + , m_cent_data_out(*this, "cent_data_out") + , m_centronics(*this, "centronics") +{ +} + +void msx_cart_skw01_device::device_add_mconfig(machine_config &config) +{ + NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0); + + // printer port + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit1)); + + OUTPUT_LATCH(config, m_cent_data_out); + m_centronics->set_output_latch(*m_cent_data_out); + INPUT_BUFFER(config, m_cent_status_in); + + OUTPUT_LATCH(config, m_cent_ctrl_out); + m_cent_ctrl_out->bit_handler<1>().set(m_centronics, FUNC(centronics_device::write_strobe)); +} + +ROM_START(msx_skw01) + ROM_REGION(0x8000, "rom", 0) + ROM_LOAD("skw-01.rom", 0x0000, 0x8000, CRC(9a7c9a26) SHA1(6a7f41d89f9d50f4ff648233670660cfb07a41ee)) + ROM_REGION(0x8000, "dict", 0) + ROM_LOAD("skw-01p4.rom", 0x0000, 0x8000, CRC(41779e03) SHA1(82f2ecd9f3135a8602d54cc6322216b3b15ae8b3)) + ROM_REGION(0x20000, "kanji", 0) + ROM_LOAD("skw-01kf.rom", 0x00000, 0x20000, CRC(9de1dc10) SHA1(f0901a63de6c95a42ce6ad82dd5e6bfba4bcf180)) +ROM_END + +const tiny_rom_entry *msx_cart_skw01_device::device_rom_region() const +{ + return ROM_NAME(msx_skw01); +} + +void msx_cart_skw01_device::device_start() +{ + m_sram = std::make_unique(SRAM_SIZE); + m_nvram->set_base(m_sram.get(), SRAM_SIZE); + save_pointer(NAME(m_sram), SRAM_SIZE); + save_item(NAME(m_bank_address)); + + page(0)->install_rom(0x0000, 0x3fff, m_region_rom->base()); + page(1)->install_rom(0x4000, 0x7fff, m_region_rom->base() + 0x4000); + page(1)->install_readwrite_handler(0x7fc0, 0x7fc0, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::ready_r<0>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_lo_w<0>))); + page(1)->install_readwrite_handler(0x7fc1, 0x7fc1, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::data_r<0>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_hi_w<0>))); + page(1)->install_readwrite_handler(0x7fc2, 0x7fc2, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::ready_r<1>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_lo_w<1>))); + page(1)->install_readwrite_handler(0x7fc3, 0x7fc3, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::data_r<1>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_hi_w<1>))); + page(1)->install_readwrite_handler(0x7fc4, 0x7fc4, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::ready_r<2>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_lo_w<2>))); + page(1)->install_readwrite_handler(0x7fc5, 0x7fc5, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::data_r<2>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_hi_w<2>))); + page(1)->install_readwrite_handler(0x7fc6, 0x7fc6, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::ready_r<3>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_lo_w<3>))); + page(1)->install_readwrite_handler(0x7fc7, 0x7fc7, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::data_r<3>)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_hi_w<3>))); + page(1)->install_write_handler(0x7fc8, 0x7fc8, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_lo_w<4>))); + page(1)->install_write_handler(0x7fc9, 0x7fc9, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::addr_hi_w<4>))); + page(1)->install_readwrite_handler(0x7fca, 0x7fcb, emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::dictsram_r)), emu::rw_delegate(*this, FUNC(msx_cart_skw01_device::dictsram_w))); + page(1)->install_readwrite_handler(0x7fcc, 0x7fcc, emu::rw_delegate(*m_cent_status_in, FUNC(input_buffer_device::read)), emu::rw_delegate(*m_cent_ctrl_out, FUNC(output_latch_device::write))); + page(1)->install_write_handler(0x7fce, 0x7fce, emu::rw_delegate(*m_cent_data_out, FUNC(output_latch_device::write))); +} + +template +void msx_cart_skw01_device::addr_lo_w(u8 data) +{ + m_bank_address[Bank] = (m_bank_address[Bank] & 0xff00) | data; +} + +template +void msx_cart_skw01_device::addr_hi_w(u8 data) +{ + m_bank_address[Bank] = (m_bank_address[Bank] & 0x00ff) | (u16(data) << 8); +} + +template +u8 msx_cart_skw01_device::ready_r() const +{ + // Unknown what the delay should be + // 0 - Not ready + // 1 - Data ready to read + return 1; +} + +template +u8 msx_cart_skw01_device::data_r() const +{ + return m_region_kanji->as_u8((Bank * 0x8000) | (m_bank_address[Bank] & 0x7fff)); +} + +void msx_cart_skw01_device::dictsram_w(u8 data) +{ + if (BIT(m_bank_address[4], 15)) + { + m_sram[m_bank_address[4] & (SRAM_SIZE - 1)] = data; + } +} + +u8 msx_cart_skw01_device::dictsram_r() const +{ + if (BIT(m_bank_address[4], 15)) + { + return m_sram[m_bank_address[4] & (SRAM_SIZE - 1)]; + } + + return m_region_dict->as_u8(m_bank_address[4]); +} + +} // anonymous namespace + + +DEFINE_DEVICE_TYPE_PRIVATE(MSX_CART_SKW01, msx_cart_interface, msx_cart_skw01_device, "msx_cart_skw01", "Yamaha SKW-01") diff --git a/src/devices/bus/msx/module/skw01.h b/src/devices/bus/msx/module/skw01.h new file mode 100644 index 00000000000..eeccf3fea47 --- /dev/null +++ b/src/devices/bus/msx/module/skw01.h @@ -0,0 +1,12 @@ +// license:BSD-3-Clause +// copyright-holders:Wilbert Pol +#ifndef MAME_BUS_MSX_MODULE_SKW01_H +#define MAME_BUS_MSX_MODULE_SKW01_H + +#pragma once + +#include "bus/msx/slot/cartridge.h" + +DECLARE_DEVICE_TYPE(MSX_CART_SKW01, msx_cart_interface) + +#endif // MAME_BUS_MSX_MODULE_SKW01_H diff --git a/src/mame/msx/msx1_v9938.cpp b/src/mame/msx/msx1_v9938.cpp index 86ed7da7293..c65b819f6a7 100644 --- a/src/mame/msx/msx1_v9938.cpp +++ b/src/mame/msx/msx1_v9938.cpp @@ -124,7 +124,7 @@ void msx1_v9938_state::ax200(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "arabic", 0, 3, 1, 2, "arabic"); add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); - add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, msx_yamaha_60pin, nullptr); + add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, msx_yamaha_60pin, nullptr); msx1_v9938_pal(SND_YM2149, config, REGION_ARAB); } @@ -156,7 +156,7 @@ void msx1_v9938_state::ax200m(machine_config &config) add_cartridge_slot<1>(config, 1); add_cartridge_slot<2>(config, 2); // Dumped unit had a SFG05 with version M5.00.011 rom - add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, msx_yamaha_60pin, "sfg05"); + add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, msx_yamaha_60pin, "sfg05"); msx1_v9938_pal(SND_YM2149, config, REGION_ARAB); } diff --git a/src/mame/msx/msx2.cpp b/src/mame/msx/msx2.cpp index 0638af20e56..6298d1214d9 100644 --- a/src/mame/msx/msx2.cpp +++ b/src/mame/msx/msx2.cpp @@ -3746,7 +3746,7 @@ void msx2_state::cx7128(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 0, 0, 1, "subrom"); add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_MINICART, "minicart", 3, 1, msx_yamaha_minicart, nullptr); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_unused_bits(0x80); // 64KB Mapper RAM - add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, nullptr); + add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, 3, msx_yamaha_60pin, nullptr); msx2(SND_YM2149, config, REGION_JAPAN); SOFTWARE_LIST(config, "minicart_list").set_original("msx_yamaha_minicart"); @@ -3775,7 +3775,7 @@ void msx2_state::cx7m128(machine_config &config) add_internal_slot(config, MSX_SLOT_ROM, "subrom", 3, 0, 0, 1, "subrom"); add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_MINICART, "minicart", 3, 1, msx_yamaha_minicart, nullptr); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000).set_unused_bits(0x80); // 64KB Mapper RAM - add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, "sfg05"); + add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, 3, msx_yamaha_60pin, "sfg05"); msx2(SND_YM2149, config, REGION_JAPAN); SOFTWARE_LIST(config, "minicart_list").set_original("msx_yamaha_minicart"); @@ -3858,7 +3858,7 @@ void msx2_state::yis604(machine_config &config) add_cartridge_slot<2>(config, 2); add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_MINICART, "minicart", 3, 1, msx_yamaha_minicart, nullptr); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM - add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, nullptr); + add_cartridge_slot<4>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, 3, msx_yamaha_60pin, nullptr); msx2(SND_YM2149, config, REGION_JAPAN); SOFTWARE_LIST(config, "minicart_list").set_original("msx_yamaha_minicart"); @@ -3896,7 +3896,7 @@ void msx2_state::y805128(machine_config &config) add_internal_disk_mirrored(config, MSX_SLOT_DISK11_WD2793, "disk", 3, 0, 1, 2, "diskrom"); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x20000); // 128KB Mapper RAM // Default: SKW-05 - add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, nullptr); + add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, 3, msx_yamaha_60pin, nullptr); MSX_S1985(config, "s1985", 0); msx2(SND_YM2149, config, REGION_JAPAN); @@ -3935,7 +3935,7 @@ void msx2_state::y805256(machine_config &config) add_internal_disk_mirrored(config, MSX_SLOT_DISK1_WD2793_2_DRIVES, "disk", 3, 0, 1, 2, "diskrom"); add_internal_slot(config, MSX_SLOT_RAM_MM, "ram_mm", 3, 2, 0, 4).set_total_size(0x40000); // 256KB Mapper RAM // Default: SKW-05 - add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "expansion", 3, 3, msx_yamaha_60pin, nullptr); + add_cartridge_slot<3>(config, MSX_SLOT_YAMAHA_EXPANSION, "module", 3, 3, msx_yamaha_60pin, nullptr); MSX_S1985(config, "s1985", 0); msx2(SND_YM2149, config, REGION_JAPAN); -- cgit v1.2.3