mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
bus/bbc/1mhzbus: Added PEDL Multiform Z80.
This commit is contained in:
parent
817caa777c
commit
24579647dc
@ -500,6 +500,8 @@ if (BUSES["BBC_1MHZBUS"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/ieee488.h",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/m2000.cpp",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/m2000.h",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/multiform.cpp",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/multiform.h",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/opus3.cpp",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/opus3.h",
|
||||
MAME_DIR .. "src/devices/bus/bbc/1mhzbus/pdram.cpp",
|
||||
|
@ -119,7 +119,7 @@ void bbc_1mhzbus_slot_device::jim_w(offs_t offset, uint8_t data)
|
||||
#include "m2000.h"
|
||||
//#include "m5000.h"
|
||||
#include "scsi.h"
|
||||
//#include "multiform.h"
|
||||
#include "multiform.h"
|
||||
#include "opus3.h"
|
||||
#include "pdram.h"
|
||||
#include "pms64k.h"
|
||||
@ -146,7 +146,7 @@ void bbc_1mhzbus_devices(device_slot_interface &device)
|
||||
//device.option_add("videodig", BBC_VIDEODIG); /* Video Digitiser (RH Electronics) */
|
||||
device.option_add("emrmidi", BBC_EMRMIDI); /* EMR Midi Interface */
|
||||
//device.option_add("procyon", BBC_PROCYON); /* CST Procyon IEEE Interface */
|
||||
//device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
|
||||
device.option_add("multiform", BBC_MULTIFORM); /* PEDL Multiform Z80 */
|
||||
device.option_add("opus3", BBC_OPUS3); /* Opus Challenger 3 */
|
||||
device.option_add("pdram", BBC_PDRAM); /* Micro User Pull Down RAM */
|
||||
device.option_add("pms64k", BBC_PMS64K); /* PMS 64K Non-Volatile Ram Module */
|
||||
@ -176,7 +176,7 @@ void bbcm_1mhzbus_devices(device_slot_interface &device)
|
||||
//device.option_add("m3000", BBC_M3000); /* Hybrid Music 3000 Expander */
|
||||
//device.option_add("m5000", BBC_M5000); /* Hybrid Music 5000 Synthesiser */
|
||||
//device.option_add("m87", BBC_M87); /* Peartree Music 87 Synthesiser */
|
||||
//device.option_add("multiform", BBC_MULTIFORM); /* Technomatic Multiform Z80 */
|
||||
device.option_add("multiform", BBC_MULTIFORM); /* PEDL Multiform Z80 */
|
||||
device.option_add("opusa", BBC_OPUSA); /* Opus Challenger ADFS */
|
||||
device.option_add("pdram", BBC_PDRAM); /* Micro User Pull Down RAM */
|
||||
device.option_add("pms64k", BBC_PMS64K); /* PMS 64K Non-Volatile Ram Module */
|
||||
|
195
src/devices/bus/bbc/1mhzbus/multiform.cpp
Normal file
195
src/devices/bus/bbc/1mhzbus/multiform.cpp
Normal file
@ -0,0 +1,195 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
PEDL Multiform Z80 2nd processor
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Technomatic_MultiformZ80.html
|
||||
|
||||
TODO:
|
||||
- Find utility disc, library disc, and manual
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#include "emu.h"
|
||||
#include "multiform.h"
|
||||
#include "softlist_dev.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
DEFINE_DEVICE_TYPE(BBC_MULTIFORM, bbc_multiform_device, "bbc_multiform", "PEDL Multiform Z80")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ADDRESS_MAP( z80_mem )
|
||||
//-------------------------------------------------
|
||||
|
||||
void bbc_multiform_device::z80_mem(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xffff).rw(FUNC(bbc_multiform_device::mem_r), FUNC(bbc_multiform_device::mem_w));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// ADDRESS_MAP( z80_io )
|
||||
//-------------------------------------------------
|
||||
|
||||
void bbc_multiform_device::z80_io(address_map &map)
|
||||
{
|
||||
map.global_mask(0xff);
|
||||
map(0x00, 0x00).r(m_host_latch[0], FUNC(generic_latch_8_device::read)).w(m_parasite_latch[0], FUNC(generic_latch_8_device::write));
|
||||
map(0x01, 0x01).r(m_host_latch[1], FUNC(generic_latch_8_device::read)).w(m_parasite_latch[1], FUNC(generic_latch_8_device::write));
|
||||
map(0x80, 0x80).w(FUNC(bbc_multiform_device::rom_disable_w));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// ROM( multiform )
|
||||
//-------------------------------------------------
|
||||
|
||||
ROM_START(multiform)
|
||||
ROM_REGION(0x2000, "osm", 0)
|
||||
ROM_LOAD("osmv200.rom", 0x0000, 0x2000, CRC(67ce1713) SHA1(314ee6211a7af6cab659640fbdd11f1078460f08))
|
||||
|
||||
ROM_REGION(0x4000, "exp_rom", 0)
|
||||
ROM_LOAD("osmz80v137.rom", 0x0000, 0x4000, CRC(79a8de8f) SHA1(0bc06ce54ab9a2242294bbbe9ce8f07e464bb674))
|
||||
ROM_END
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void bbc_multiform_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
Z80(config, m_z80, 8_MHz_XTAL / 2);
|
||||
m_z80->set_addrmap(AS_PROGRAM, &bbc_multiform_device::z80_mem);
|
||||
m_z80->set_addrmap(AS_IO, &bbc_multiform_device::z80_io);
|
||||
m_z80->set_irq_acknowledge_callback(FUNC(bbc_multiform_device::irq_callback));
|
||||
|
||||
/* 74ls374 */
|
||||
GENERIC_LATCH_8(config, m_host_latch[0]);
|
||||
GENERIC_LATCH_8(config, m_host_latch[1]);
|
||||
GENERIC_LATCH_8(config, m_parasite_latch[0]);
|
||||
GENERIC_LATCH_8(config, m_parasite_latch[1]);
|
||||
|
||||
/* software lists */
|
||||
SOFTWARE_LIST(config, "flop_ls_z80").set_original("bbc_flop_z80");
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// rom_region - device-specific ROM region
|
||||
//-------------------------------------------------
|
||||
|
||||
const tiny_rom_entry *bbc_multiform_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME( multiform );
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
//-------------------------------------------------
|
||||
// bbc_multiform_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
bbc_multiform_device::bbc_multiform_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, BBC_MULTIFORM, tag, owner, clock)
|
||||
, device_bbc_1mhzbus_interface(mconfig, *this)
|
||||
, m_z80(*this, "z80")
|
||||
, m_host_latch(*this, "host_latch%u", 0U)
|
||||
, m_parasite_latch(*this, "parasite_latch%u", 0U)
|
||||
, m_osm(*this, "osm")
|
||||
, m_rom_enabled(true)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void bbc_multiform_device::device_start()
|
||||
{
|
||||
m_ram = std::make_unique<uint8_t[]>(0x10000);
|
||||
|
||||
/* register for save states */
|
||||
save_pointer(NAME(m_ram), 0x10000);
|
||||
save_item(NAME(m_rom_enabled));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void bbc_multiform_device::device_reset()
|
||||
{
|
||||
m_rom_enabled = true;
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
uint8_t bbc_multiform_device::fred_r(offs_t offset)
|
||||
{
|
||||
uint8_t data = 0xff;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00:
|
||||
data = m_parasite_latch[0]->read();
|
||||
break;
|
||||
case 0x01:
|
||||
data = m_parasite_latch[1]->read();
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void bbc_multiform_device::fred_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
switch (offset)
|
||||
{
|
||||
case 0x00:
|
||||
m_host_latch[0]->write(data);
|
||||
break;
|
||||
case 0x01:
|
||||
m_host_latch[1]->write(data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
READ8_MEMBER(bbc_multiform_device::mem_r)
|
||||
{
|
||||
uint8_t data;
|
||||
|
||||
if (m_rom_enabled && offset < 0x2000)
|
||||
data = m_osm->base()[offset & 0x1fff];
|
||||
else
|
||||
data = m_ram[offset];
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(bbc_multiform_device::mem_w)
|
||||
{
|
||||
m_ram[offset] = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(bbc_multiform_device::rom_disable_w)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
m_rom_enabled = false;
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// irq vector callback
|
||||
//-------------------------------------------------
|
||||
|
||||
IRQ_CALLBACK_MEMBER(bbc_multiform_device::irq_callback)
|
||||
{
|
||||
return 0xfe;
|
||||
}
|
69
src/devices/bus/bbc/1mhzbus/multiform.h
Normal file
69
src/devices/bus/bbc/1mhzbus/multiform.h
Normal file
@ -0,0 +1,69 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/**********************************************************************
|
||||
|
||||
PEDL Multiform Z80 2nd processor
|
||||
|
||||
http://chrisacorns.computinghistory.org.uk/8bit_Upgrades/Technomatic_MultiformZ80.html
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
|
||||
#ifndef MAME_BUS_BBC_1MHZBUS_MULTIFORM_H
|
||||
#define MAME_BUS_BBC_1MHZBUS_MULTIFORM_H
|
||||
|
||||
#include "1mhzbus.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/gen_latch.h"
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> bbc_multiform_device
|
||||
|
||||
class bbc_multiform_device :
|
||||
public device_t,
|
||||
public device_bbc_1mhzbus_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
bbc_multiform_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
DECLARE_READ8_MEMBER( mem_r );
|
||||
DECLARE_WRITE8_MEMBER( mem_w );
|
||||
DECLARE_WRITE8_MEMBER( rom_disable_w );
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// optional information overrides
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
virtual uint8_t fred_r(offs_t offset) override;
|
||||
virtual void fred_w(offs_t offset, uint8_t data) override;
|
||||
|
||||
private:
|
||||
IRQ_CALLBACK_MEMBER( irq_callback );
|
||||
|
||||
required_device<cpu_device> m_z80;
|
||||
required_device_array<generic_latch_8_device, 2> m_host_latch;
|
||||
required_device_array<generic_latch_8_device, 2> m_parasite_latch;
|
||||
required_memory_region m_osm;
|
||||
|
||||
void z80_mem(address_map &map);
|
||||
void z80_io(address_map &map);
|
||||
|
||||
std::unique_ptr<uint8_t[]> m_ram;
|
||||
bool m_rom_enabled;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(BBC_MULTIFORM, bbc_multiform_device)
|
||||
|
||||
|
||||
#endif /* MAME_BUS_BBC_1MHZBUS_MULTIFORM_H */
|
Loading…
Reference in New Issue
Block a user