bus/cbus: add MIF-201 MIDI interface stub

This commit is contained in:
angelosa 2025-03-05 11:32:20 +01:00
parent 8a250aded0
commit b0613ccfab
6 changed files with 141 additions and 17 deletions

View File

@ -5288,6 +5288,8 @@ if (BUSES["CBUS"]~=null) then
files {
MAME_DIR .. "src/devices/bus/cbus/amd98.cpp",
MAME_DIR .. "src/devices/bus/cbus/amd98.h",
MAME_DIR .. "src/devices/bus/cbus/mif201.cpp",
MAME_DIR .. "src/devices/bus/cbus/mif201.h",
MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.cpp",
MAME_DIR .. "src/devices/bus/cbus/mpu_pc98.h",
MAME_DIR .. "src/devices/bus/cbus/pc9801_26.cpp",

View File

@ -0,0 +1,70 @@
// license:BSD-3-Clause
// copyright-holders: Angelo Salese
/**************************************************************************************************
MIF-201 MIDI interface
Bundled with Micro Musician VA
References:
- https://mamedev.emulab.it/kale/fast/files/micromusician_va.jpg
TODO:
- evasive, needs manual, dip-switch sheet and PCB pictures;
**************************************************************************************************/
#include "emu.h"
#include "mif201.h"
DEFINE_DEVICE_TYPE(MIF201, mif201_device, "mif201", "Micro Musician VA MIF-201 MIDI Interface")
mif201_device::mif201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, MIF201, tag, owner, clock)
, m_bus(*this, DEVICE_SELF_OWNER)
, m_uart(*this, "uart%u", 1U)
, m_pit(*this, "pit")
{
}
//void mif201_device::irq_out(int state)
//{
// m_bus->int_w<2>(state);
//}
void mif201_device::device_add_mconfig(machine_config &config)
{
// TODO: unknown clocks
I8251(config, m_uart[0], 1021800);
I8251(config, m_uart[1], 1021800);
PIT8253(config, m_pit, 1021800);
}
void mif201_device::device_start()
{
// sheet claims i8251-1 having swapped ports compared to i8251-2 but micromus just uses
// $e2d2 for control, assume typo.
m_bus->install_io(0xe2d0, 0xe2d3,
read8sm_delegate(*this, [this](offs_t offset) { return m_uart[0]->read(offset); }, "uart1_r"),
write8sm_delegate(*this, [this](offs_t offset, u8 data) { m_uart[0]->write(offset, data); }, "uart1_w")
);
m_bus->install_io(0xe4d0, 0xe4d3,
read8sm_delegate(*this, [this](offs_t offset) { return m_uart[1]->read(offset); }, "uart2_r"),
write8sm_delegate(*this, [this](offs_t offset, u8 data) { m_uart[1]->write(offset, data); }, "uart2_w")
);
m_bus->install_io(0xe6d0, 0xe6d3,
read8sm_delegate(*this, [this](offs_t offset) { return m_pit->read(offset); }, "pit_low_r"),
write8sm_delegate(*this, [this](offs_t offset, u8 data) { m_pit->write(offset, data); }, "pit_low_w")
);
m_bus->install_io(0xe7d0, 0xe7d3,
read8sm_delegate(*this, [this](offs_t offset) { return m_pit->read(offset | 2); }, "pit_high_r"),
write8sm_delegate(*this, [this](offs_t offset, u8 data) { m_pit->write(offset | 2, data); }, "pit_high_w")
);
}
void mif201_device::device_reset()
{
}

View File

@ -0,0 +1,46 @@
// license:BSD-3-Clause
// copyright-holders: Angelo Salese
#ifndef MAME_BUS_CBUS_MIF201_H
#define MAME_BUS_CBUS_MIF201_H
#pragma once
#include "bus/cbus/pc9801_cbus.h"
#include "machine/i8251.h"
#include "machine/pit8253.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> mpu_pc98_device
class mif201_device : public device_t
{
public:
// construction/destruction
mif201_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
static constexpr feature_type unemulated_features() { return feature::SOUND; }
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// optional information overrides
virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
private:
required_device<pc9801_slot_device> m_bus;
required_device_array<i8251_device, 2> m_uart;
required_device<pit8253_device> m_pit;
// void map(address_map &map);
};
// device type definition
DECLARE_DEVICE_TYPE(MIF201, mif201_device)
#endif // MAME_BUS_CBUS_MIF201_H

View File

@ -2,20 +2,24 @@
// copyright-holders:Angelo Salese
/**************************************************************************************************
C-bus slot interface for PC-98xx family
C-bus slot interface for PC-98xx family
a.k.a. NEC version of the ISA bus.
C-bus -> Card Bus
a.k.a. NEC version of the ISA bus.
C-bus -> Compatible Bus
TODO:
- stub interface, checkout what actually belongs here.
Speculation is that C-bus has ROM / RAM slots always in the 0xc0000-0xdffff region,
and some opacity can be added if true.
- move pc9801_cbus_devices declaration from pc9801 driver in here;
- 8-bit I/O smearing should be handled here;
- INT# should be handled here too;
- Best way to inform user when it tries to install incompatible boards?
- Support for PCI bridging on later machines (cfr. pc9801cx3);
References:
- https://98epjunk.shakunage.net/sw/ext_card/ext_card.html
- https://ja.wikipedia.org/wiki/C%E3%83%90%E3%82%B9
- https://www.pc-9800.net/db2/db2_ga_index.htm
- http://ookumaneko.s1005.xrea.com/pcibios.htm (PCI era mapping)
TODO:
- stub interface, checkout what actually belongs here
- move pc9801_cbus_devices declaration from pc9801 driver in here;
- 8-bit I/O smearing should be handled here;
- INT# should be handled here too;
- Best way to inform user when it tries to install incompatible boards?
- Support for PCI bridging on later machines (cfr. pc9821cx3);
**************************************************************************************************/

View File

@ -753,11 +753,11 @@ void pc88va_state::io_map(address_map &map)
);
map(0x0540, 0x0547).umask16(0x00ff).lrw8(
NAME([this] (offs_t offset) {
LOGGFXCTRL("PATRH%d R\n", offset);
LOGGFXCTRL("Multiplane PATRH%d R\n", offset);
return m_multiplane.patr[offset][1];
}),
NAME([this] (offs_t offset, u8 data) {
LOGGFXCTRL("PATRH%d W %02x\n", offset, data);
LOGGFXCTRL("Multiplane PATRH%d W %02x\n", offset, data);
m_multiplane.patr[offset][1] = data;
})
);
@ -802,11 +802,11 @@ void pc88va_state::io_map(address_map &map)
);
map(0x0590, 0x0593).umask16(0x00ff).lrw8(
NAME([this] (offs_t offset) {
LOGGFXCTRL("Singleplane PATRL%d R\n", offset);
LOGGFXCTRL("Singleplane PATR%d R\n", offset);
return m_singleplane.patr[offset];
}),
NAME([this] (offs_t offset, u8 data) {
LOGGFXCTRL("Singleplane PATRL%d W %02x\n", offset, data);
LOGGFXCTRL("Singleplane PATR%d W %02x\n", offset, data);
m_singleplane.patr[offset] = data;
})
);
@ -1265,6 +1265,7 @@ static void pc88va_cbus_devices(device_slot_interface &device)
{
device.option_add("pc9801_55u", PC9801_55U);
device.option_add("pc9801_55l", PC9801_55L);
device.option_add("mif_201", MIF201);
device.option_add("mpu_pc98", MPU_PC98);
}

View File

@ -29,11 +29,12 @@
#include "sound/ymopn.h"
//#include "bus/cbus/amd98.h"
#include "bus/cbus/mif201.h"
#include "bus/cbus/mpu_pc98.h"
//#include "bus/cbus/pc9801_26.h"
#include "bus/cbus/pc9801_55.h"
//#include "bus/cbus/pc9801_86.h"
//#include "bus/cbus/pc9801_118.h"
#include "bus/cbus/mpu_pc98.h"
//#include "bus/cbus/sb16_ct2720.h"