summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/a2bus/a2scsi.cpp2
-rw-r--r--src/devices/bus/bbc/rom/genie.cpp115
-rw-r--r--src/devices/bus/bbc/rom/genie.h48
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp4
-rw-r--r--src/devices/bus/c64/buscard.cpp308
-rw-r--r--src/devices/bus/c64/buscard.h22
-rw-r--r--src/devices/bus/c64/buscard2.cpp215
-rw-r--r--src/devices/bus/c64/buscard2.h72
-rw-r--r--src/devices/bus/c64/exp.cpp4
-rw-r--r--src/devices/bus/c64/exp.h3
-rw-r--r--src/devices/bus/c64/fcc.cpp167
-rw-r--r--src/devices/bus/c64/fcc.h14
-rw-r--r--src/devices/bus/cbmiec/interpod.cpp47
-rw-r--r--src/devices/bus/cbmiec/interpod.h18
-rw-r--r--src/devices/bus/gio/newport.cpp39
-rw-r--r--src/devices/bus/isa/finalchs.cpp4
-rw-r--r--src/devices/bus/isa/tekram_dc820.cpp21
-rw-r--r--src/devices/bus/isa/tekram_dc820.h8
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.cpp2
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.cpp107
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.h56
-rw-r--r--src/devices/cpu/m6502/m6510.cpp124
-rw-r--r--src/devices/cpu/m6502/m6510.h32
-rw-r--r--src/devices/cpu/mips/r4000.cpp85
-rw-r--r--src/devices/cpu/mips/r4000.h3
-rw-r--r--src/devices/cpu/unsp/unsp_exxx.cpp2
-rw-r--r--src/devices/cpu/z8000/z8000.cpp225
-rw-r--r--src/devices/cpu/z8000/z8000.h73
-rw-r--r--src/devices/cpu/z8000/z8000ops.hxx627
-rw-r--r--src/devices/machine/i82355.cpp7
-rw-r--r--src/devices/machine/nscsi_cd.cpp33
-rw-r--r--src/devices/machine/nscsi_cd.h13
-rw-r--r--src/devices/machine/sunplus_gcm394.cpp51
-rw-r--r--src/devices/machine/sunplus_gcm394.h20
-rw-r--r--src/devices/machine/sunplus_gcm394_video.cpp229
-rw-r--r--src/devices/machine/sunplus_gcm394_video.h22
-rwxr-xr-xsrc/frontend/mame/luaengine.cpp66
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp18
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp4
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp4
-rw-r--r--src/lib/netlist/devices/nlid_system.h8
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx.cpp9
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp4
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp2
-rw-r--r--src/lib/netlist/nl_base.h15
-rw-r--r--src/mame/drivers/at.cpp173
-rw-r--r--src/mame/drivers/c900.cpp21
-rw-r--r--src/mame/drivers/compc.cpp29
-rw-r--r--src/mame/drivers/eti660.cpp4
-rw-r--r--src/mame/drivers/firetrk.cpp2
-rw-r--r--src/mame/drivers/genpc.cpp5
-rw-r--r--src/mame/drivers/hh_sm510.cpp185
-rw-r--r--src/mame/drivers/m20.cpp4
-rw-r--r--src/mame/drivers/metro.cpp25
-rw-r--r--src/mame/drivers/microkit.cpp140
-rw-r--r--src/mame/drivers/mlanding.cpp300
-rw-r--r--src/mame/drivers/naomi.cpp3
-rw-r--r--src/mame/drivers/p8k.cpp2
-rw-r--r--src/mame/drivers/pc.cpp24
-rw-r--r--src/mame/drivers/pk8020.cpp378
-rw-r--r--src/mame/drivers/polepos.cpp9
-rw-r--r--src/mame/drivers/r2dx_v33.cpp14
-rw-r--r--src/mame/drivers/raiden2.cpp10
-rw-r--r--src/mame/drivers/royalmah.cpp74
-rw-r--r--src/mame/drivers/seta.cpp42
-rw-r--r--src/mame/drivers/socrates.cpp74
-rw-r--r--src/mame/drivers/splus.cpp6
-rw-r--r--src/mame/drivers/studio2.cpp6
-rw-r--r--src/mame/drivers/sunplus_gcm394.cpp62
-rw-r--r--src/mame/drivers/taito_f2.cpp1
-rw-r--r--src/mame/drivers/tmc1800.cpp16
-rw-r--r--src/mame/drivers/vip.cpp12
-rw-r--r--src/mame/drivers/wicat.cpp4
-rw-r--r--src/mame/drivers/z100.cpp6
-rw-r--r--src/mame/includes/galaga.h2
-rw-r--r--src/mame/includes/pk8020.h86
-rw-r--r--src/mame/includes/raiden2.h3
-rw-r--r--src/mame/includes/seta.h2
-rw-r--r--src/mame/machine/hpc3.cpp8
-rw-r--r--src/mame/machine/ioc2.cpp83
-rw-r--r--src/mame/machine/ioc2.h5
-rw-r--r--src/mame/machine/m24_z8000.cpp4
-rw-r--r--src/mame/machine/pk8020.cpp937
-rw-r--r--src/mame/machine/seibucop/seibucop_dma.hxx4
-rw-r--r--src/mame/mame.lst41
-rw-r--r--src/mame/video/galaga.cpp100
-rw-r--r--src/mame/video/pk8020.cpp122
-rw-r--r--src/mame/video/raiden2.cpp6
88 files changed, 3706 insertions, 2280 deletions
diff --git a/src/devices/bus/a2bus/a2scsi.cpp b/src/devices/bus/a2bus/a2scsi.cpp
index 988ebfd0096..d98e22382ff 100644
--- a/src/devices/bus/a2bus/a2scsi.cpp
+++ b/src/devices/bus/a2bus/a2scsi.cpp
@@ -52,7 +52,7 @@ DEFINE_DEVICE_TYPE(A2BUS_SCSI, a2bus_scsi_device, "a2scsi", "Apple II SCSI Card"
static void scsi_devices(device_slot_interface &device)
{
- device.option_add("cdrom", NSCSI_CDROM);
+ device.option_add("cdrom", NSCSI_CDROM_APPLE);
device.option_add("harddisk", NSCSI_HARDDISK);
device.option_add_internal("ncr5380", NCR5380N);
}
diff --git a/src/devices/bus/bbc/rom/genie.cpp b/src/devices/bus/bbc/rom/genie.cpp
new file mode 100644
index 00000000000..653d874525e
--- /dev/null
+++ b/src/devices/bus/bbc/rom/genie.cpp
@@ -0,0 +1,115 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+// thanks-to:Derek Mathieson (original author of Genie)
+/***************************************************************************
+
+ PMS Genie
+
+***************************************************************************/
+
+#include "emu.h"
+#include "genie.h"
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(BBC_PMSGENIE, bbc_pmsgenie_device, "bbc_pmsgenie", "PMS Genie ROM Board")
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// bbc_palprom_device - constructor
+//-------------------------------------------------
+
+bbc_pmsgenie_device::bbc_pmsgenie_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, BBC_PMSGENIE, tag, owner, clock)
+ , device_bbc_rom_interface(mconfig, *this)
+ , m_write_latch(0)
+ , m_bank_latch(0)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void bbc_pmsgenie_device::device_start()
+{
+ save_item(NAME(m_write_latch));
+ save_item(NAME(m_bank_latch));
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+uint8_t bbc_pmsgenie_device::read(offs_t offset)
+{
+ uint8_t data = 0xff;
+
+ if (!machine().side_effects_disabled())
+ {
+ switch (offset >> 8)
+ {
+ case 0x1e:
+ /* &9E00-&9EFF - Write value latch */
+ m_write_latch = offset & 0xff;
+ break;
+ case 0x1f:
+ /* &9F00-&9FFF - Bank select latch
+ Bit
+ 0-2: RAM bank select
+ 3: Not used
+ 4-5: ROM bank select
+ 6: Not used
+ 7: Read / NOT Write for internal RAM */
+ m_bank_latch = offset & 0xff;
+ break;
+ }
+ }
+
+ switch (offset & 0x2000)
+ {
+ case 0x0000:
+ /* &8000-&9FFF - 4 Pages of 8K ROM (32K in total) */
+ data = get_rom_base()[(offset & 0x1fff) | (m_bank_latch & 0x30) << 9];
+ break;
+
+ case 0x2000:
+ /* &A000-&BFFF - 8 Pages of 8K RAM (64K in total) */
+ if (m_bank_latch & 0x80)
+ {
+ /* RAM read */
+ if (m_bank_latch & 0x04)
+ {
+ data = get_nvram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13];
+ }
+ else
+ {
+ data = get_ram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13];
+ }
+ }
+ else
+ {
+ /* RAM write */
+ if (m_bank_latch & 0x04)
+ {
+ get_nvram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13] = m_write_latch;
+ }
+ else
+ {
+ get_ram_base()[(offset & 0x1fff) | (m_bank_latch & 0x03) << 13] = m_write_latch;
+ }
+ data = m_write_latch;
+ }
+ break;
+ }
+
+ return data;
+}
diff --git a/src/devices/bus/bbc/rom/genie.h b/src/devices/bus/bbc/rom/genie.h
new file mode 100644
index 00000000000..82813b2b166
--- /dev/null
+++ b/src/devices/bus/bbc/rom/genie.h
@@ -0,0 +1,48 @@
+// license:BSD-3-Clause
+// copyright-holders:Nigel Barnes
+/***************************************************************************
+
+ BBC Micro ROM carrier boards
+
+***************************************************************************/
+
+#ifndef MAME_BUS_BBC_ROM_GENIE_H
+#define MAME_BUS_BBC_ROM_GENIE_H
+
+#pragma once
+
+#include "slot.h"
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> bbc_genie_device
+
+class bbc_pmsgenie_device : public device_t,
+ public device_bbc_rom_interface
+{
+public:
+ // construction/destruction
+ bbc_pmsgenie_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_bbc_rom_interface overrides
+ virtual uint8_t read(offs_t offset) override;
+ virtual uint32_t get_rom_size() override { return 0x4000; }
+
+private:
+ uint8_t m_write_latch;
+ uint8_t m_bank_latch;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(BBC_PMSGENIE, bbc_pmsgenie_device)
+
+
+#endif // MAME_BUS_BBC_ROM_GENIE_H
diff --git a/src/devices/bus/bbc/rom/slot.cpp b/src/devices/bus/bbc/rom/slot.cpp
index af8ae212d6d..e421a1c520e 100644
--- a/src/devices/bus/bbc/rom/slot.cpp
+++ b/src/devices/bus/bbc/rom/slot.cpp
@@ -207,7 +207,7 @@ void bbc_romslot_device::write(offs_t offset, uint8_t data)
#include "rom.h"
#include "ram.h"
#include "dfs.h"
-//#include "genie.h"
+#include "genie.h"
#include "pal.h"
//#include "replay.h"
#include "rtc.h"
@@ -226,7 +226,7 @@ void bbc_rom_devices(device_slot_interface &device)
device.option_add_internal("palabep", BBC_PALABEP);
device.option_add_internal("palabe", BBC_PALABE);
device.option_add_internal("palmo2", BBC_PALMO2);
- //device.option_add_internal("genie", BBC_PMSGENIE);
+ device.option_add_internal("genie", BBC_PMSGENIE);
device.option_add_internal("mrme00", BBC_MRME00);
//device.option_add_internal("replay", BBC_REPLAY);
device.option_add_internal("stlrtc", BBC_STLRTC);
diff --git a/src/devices/bus/c64/buscard.cpp b/src/devices/bus/c64/buscard.cpp
index 31533d68675..f807522c2fd 100644
--- a/src/devices/bus/c64/buscard.cpp
+++ b/src/devices/bus/c64/buscard.cpp
@@ -4,8 +4,9 @@
Batteries Included BusCard cartridge emulation
- Enable BASIC 4.0 with SYS 61000
- Disable BASIC 4.0 with SYS 61003
+ SYS 61000 -> Enable BASIC 4.0
+ SYS 61003 -> Disable BASIC 4.0
+ SYS 61006 -> Enter Machine Language Monitor
**********************************************************************/
@@ -18,8 +19,10 @@
// MACROS/CONSTANTS
//**************************************************************************
-#define I8255_TAG "i8255"
-#define CENTRONICS_TAG "centronics"
+#define I8255_TAG "u2"
+#define DS75160A_TAG "u3"
+#define DS75161A_TAG "u4"
+#define CENTRONICS_TAG "p4"
#define EXPANSION_TAG "exp"
@@ -36,8 +39,11 @@ DEFINE_DEVICE_TYPE(C64_BUSCARD, buscard_t, "c64_buscard", "C64 BusCard cartridge
//-------------------------------------------------
ROM_START( buscard )
- ROM_REGION( 0x2000, "rom", 0 )
- ROM_LOAD( "buscardv0.9-tms2564.bin", 0x0000, 0x2000, CRC(175e8c96) SHA1(8fb4ba7e3d0b58dc01b66ef962955596f1b125b5) )
+ ROM_REGION( 0x8000, "rom", 0 )
+ ROM_LOAD( "0.9.u1", 0x0000, 0x2000, CRC(175e8c96) SHA1(8fb4ba7e3d0b58dc01b66ef962955596f1b125b5) )
+ //ROM_LOAD( "unpopulated.u13", 0x2000, 0x2000 )
+ //ROM_LOAD( "unpopulated.u14", 0x4000, 0x2000 )
+ //ROM_LOAD( "unpopulated.u15", 0x6000, 0x2000 )
ROM_END
@@ -56,15 +62,30 @@ const tiny_rom_entry *buscard_t::device_rom_region() const
//-------------------------------------------------
static INPUT_PORTS_START( buscard )
- PORT_START("SW")
- PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW:1" )
- PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW:2" )
- PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW:3" )
- PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW:4" )
- PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW:5" )
- PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW:6" )
- PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "SW:7" )
- PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "SW:8" )
+ PORT_START("S1")
+ PORT_DIPNAME( 0x03, 0x00, "Device #4" ) PORT_DIPLOCATION("S1:1,2")
+ PORT_DIPSETTING( 0x00, "Serial" )
+ PORT_DIPSETTING( 0x01, "Parallel w/conv." )
+ PORT_DIPSETTING( 0x02, "IEEE" )
+ PORT_DIPSETTING( 0x03, "Parallel" )
+ PORT_DIPNAME( 0x04, 0x04, "Device #5" ) PORT_DIPLOCATION("S1:3")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x04, "Serial" )
+ PORT_DIPNAME( 0x08, 0x08, "Device #6" ) PORT_DIPLOCATION("S1:4")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x08, "Serial" )
+ PORT_DIPNAME( 0x10, 0x10, "Device #7" ) PORT_DIPLOCATION("S1:5")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x10, "Serial" )
+ PORT_DIPNAME( 0x20, 0x20, "Device #8" ) PORT_DIPLOCATION("S1:6")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x20, "Serial" )
+ PORT_DIPNAME( 0x40, 0x40, "Device #9" ) PORT_DIPLOCATION("S1:7")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x40, "Serial" )
+ PORT_DIPNAME( 0x80, 0x80, "Device #10" ) PORT_DIPLOCATION("S1:8")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x80, "Serial" )
INPUT_PORTS_END
@@ -79,17 +100,175 @@ ioport_constructor buscard_t::device_input_ports() const
//-------------------------------------------------
+// PPI interface
+//-------------------------------------------------
+
+READ8_MEMBER( buscard_t::ppi_pa_r )
+{
+ uint8_t data = 0xff;
+
+ if (!m_te)
+ {
+ data = m_ieee1->read(space, 0);
+ }
+
+ if (m_dipsw)
+ {
+ data = m_s1->read();
+ }
+
+ return data;
+}
+
+WRITE8_MEMBER( buscard_t::ppi_pa_w )
+{
+ m_ieee1->write(space, 0, data);
+
+ m_centronics->write_data0(BIT(data, 0));
+ m_centronics->write_data1(BIT(data, 1));
+ m_centronics->write_data2(BIT(data, 2));
+ m_centronics->write_data3(BIT(data, 3));
+ m_centronics->write_data4(BIT(data, 4));
+ m_centronics->write_data5(BIT(data, 5));
+ m_centronics->write_data6(BIT(data, 6));
+ m_centronics->write_data7(BIT(data, 7));
+}
+
+WRITE8_MEMBER( buscard_t::ppi_pb_w )
+{
+ /*
+
+ bit description
+
+ PB0 BASIC ROM bank bit 0
+ PB1 BASIC ROM bank bit 1
+ PB2
+ PB3 BASIC ROM enable
+ PB4
+ PB5
+ PB6 STROBE
+ PB7 DIP switch select
+
+ */
+
+ m_bank = data & 0x03;
+ m_basic = BIT(data, 3);
+
+ m_centronics->write_strobe(BIT(data, 6));
+
+ m_dipsw = BIT(data, 7);
+}
+
+READ8_MEMBER( buscard_t::ppi_pc_r )
+{
+ /*
+
+ bit description
+
+ PC0 BUSY
+ PC1
+ PC2 DAV
+ PC3 EOI
+ PC4
+ PC5 ATN
+ PC6 NRFD
+ PC7 NDAC
+
+ */
+
+ uint8_t data = 0;
+
+ data |= m_busy;
+
+ data |= m_ieee2->dav_r() << 2;
+ data |= m_ieee2->eoi_r() << 3;
+ data |= m_ieee2->atn_r() << 5;
+ data |= m_ieee2->nrfd_r() << 6;
+ data |= m_ieee2->ndac_r() << 7;
+
+ return data;
+}
+
+WRITE8_MEMBER( buscard_t::ppi_pc_w )
+{
+ /*
+
+ bit description
+
+ PC0
+ PC1 ATN
+ PC2 DAV
+ PC3 EOI
+ PC4 TE
+ PC5
+ PC6 NRFD
+ PC7 NDAC
+
+ */
+
+ m_te = BIT(data, 4);
+ m_ieee1->te_w(m_te);
+ m_ieee2->te_w(m_te);
+
+ m_ieee2->atn_w(BIT(data, 1));
+ m_ieee2->dav_w(BIT(data, 2));
+ m_ieee2->eoi_w(BIT(data, 3));
+ m_ieee2->nrfd_w(BIT(data, 6));
+ m_ieee2->ndac_w(BIT(data, 7));
+}
+
+
+//-------------------------------------------------
+// Centronics interface
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( buscard_t::busy_w )
+{
+ m_busy = state;
+}
+
+
+//-------------------------------------------------
// device_add_mconfig - add device configuration
//-------------------------------------------------
void buscard_t::device_add_mconfig(machine_config &config)
{
I8255A(config, m_ppi, 0);
+ m_ppi->in_pa_callback().set(FUNC(buscard_t::ppi_pa_r));
+ m_ppi->out_pa_callback().set(FUNC(buscard_t::ppi_pa_w));
+ m_ppi->in_pb_callback().set_constant(0xff);
+ m_ppi->out_pb_callback().set(FUNC(buscard_t::ppi_pb_w));
+ m_ppi->in_pc_callback().set(FUNC(buscard_t::ppi_pc_r));
+ m_ppi->out_pc_callback().set(FUNC(buscard_t::ppi_pc_w));
+
+ DS75160A(config, m_ieee1, 0);
+ m_ieee1->read_callback().set(IEEE488_TAG, FUNC(ieee488_device::dio_r));
+ m_ieee1->write_callback().set(IEEE488_TAG, FUNC(ieee488_device::host_dio_w));
+
+ DS75161A(config, m_ieee2, 0);
+ m_ieee2->in_ren().set(IEEE488_TAG, FUNC(ieee488_device::ren_r));
+ m_ieee2->in_ifc().set(IEEE488_TAG, FUNC(ieee488_device::ifc_r));
+ m_ieee2->in_ndac().set(IEEE488_TAG, FUNC(ieee488_device::ndac_r));
+ m_ieee2->in_nrfd().set(IEEE488_TAG, FUNC(ieee488_device::nrfd_r));
+ m_ieee2->in_dav().set(IEEE488_TAG, FUNC(ieee488_device::dav_r));
+ m_ieee2->in_eoi().set(IEEE488_TAG, FUNC(ieee488_device::eoi_r));
+ m_ieee2->in_atn().set(IEEE488_TAG, FUNC(ieee488_device::atn_r));
+ m_ieee2->in_srq().set(IEEE488_TAG, FUNC(ieee488_device::srq_r));
+ m_ieee2->out_ren().set(IEEE488_TAG, FUNC(ieee488_device::host_ren_w));
+ m_ieee2->out_ifc().set(IEEE488_TAG, FUNC(ieee488_device::host_ifc_w));
+ m_ieee2->out_ndac().set(IEEE488_TAG, FUNC(ieee488_device::host_ndac_w));
+ m_ieee2->out_nrfd().set(IEEE488_TAG, FUNC(ieee488_device::host_nrfd_w));
+ m_ieee2->out_dav().set(IEEE488_TAG, FUNC(ieee488_device::host_dav_w));
+ m_ieee2->out_eoi().set(IEEE488_TAG, FUNC(ieee488_device::host_eoi_w));
+ m_ieee2->out_atn().set(IEEE488_TAG, FUNC(ieee488_device::host_atn_w));
+ m_ieee2->out_srq().set(IEEE488_TAG, FUNC(ieee488_device::host_srq_w));
IEEE488(config, m_bus, 0);
ieee488_slot_device::add_cbm_defaults(config, nullptr);
CENTRONICS(config, m_centronics, centronics_devices, nullptr);
+ m_centronics->busy_handler().set(FUNC(buscard_t::busy_w));
C64_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1), c64_expansion_cards, nullptr);
m_exp->set_passthrough();
@@ -109,9 +288,18 @@ buscard_t::buscard_t(const machine_config &mconfig, const char *tag, device_t *o
device_t(mconfig, C64_BUSCARD, tag, owner, clock),
device_c64_expansion_card_interface(mconfig, *this),
m_ppi(*this, I8255_TAG),
+ m_ieee1(*this, DS75160A_TAG),
+ m_ieee2(*this, DS75161A_TAG),
m_bus(*this, IEEE488_TAG),
m_centronics(*this, CENTRONICS_TAG),
- m_exp(*this, EXPANSION_TAG)
+ m_exp(*this, EXPANSION_TAG),
+ m_s1(*this, "S1"),
+ m_rom(*this, "rom"),
+ m_te(1),
+ m_bank(3),
+ m_basic(1),
+ m_dipsw(1),
+ m_busy(1)
{
}
@@ -122,6 +310,15 @@ buscard_t::buscard_t(const machine_config &mconfig, const char *tag, device_t *o
void buscard_t::device_start()
{
+ m_ieee1->pe_w(0);
+ m_ieee2->dc_w(0);
+
+ // state saving
+ save_item(NAME(m_te));
+ save_item(NAME(m_bank));
+ save_item(NAME(m_basic));
+ save_item(NAME(m_dipsw));
+ save_item(NAME(m_busy));
}
@@ -131,6 +328,10 @@ void buscard_t::device_start()
void buscard_t::device_reset()
{
+ m_ppi->reset();
+
+ m_ieee2->ifc_w(0);
+ m_ieee2->ifc_w(1);
}
@@ -140,7 +341,34 @@ void buscard_t::device_reset()
uint8_t buscard_t::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- return m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
+ int cs = BIT(offset, 6) && BIT(offset, 7);
+
+ if (sphi2 && !io1 && cs)
+ {
+ data = m_ppi->read(offset & 0x03);
+ }
+
+ if (!pd_pgm1(offset, sphi2))
+ {
+ data = m_rom->base()[offset & 0x1fff];
+ }
+
+ if (!pd_pgm234(offset, sphi2, 0x02))
+ {
+ data = m_rom->base()[0x2000 | (offset & 0x1fff)];
+ }
+
+ if (!pd_pgm234(offset, sphi2, 0x01))
+ {
+ data = m_rom->base()[0x4000 | (offset & 0x1fff)];
+ }
+
+ if (!pd_pgm234(offset, sphi2, 0x00))
+ {
+ data = m_rom->base()[0x6000 | (offset & 0x1fff)];
+ }
+
+ return m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1 | cs, io2);
}
@@ -150,7 +378,14 @@ uint8_t buscard_t::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int
void buscard_t::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
+ int cs = BIT(offset, 6) && BIT(offset, 7);
+
+ if (sphi2 && !io1 && cs)
+ {
+ m_ppi->write(offset & 0x03, data);
+ }
+
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1 | cs, io2);
}
@@ -160,7 +395,7 @@ void buscard_t::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int rom
int buscard_t::c64_game_r(offs_t offset, int sphi2, int ba, int rw)
{
- return m_exp->game_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
+ return pd_pgm1(offset, sphi2) & m_exp->game_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
}
@@ -170,5 +405,38 @@ int buscard_t::c64_game_r(offs_t offset, int sphi2, int ba, int rw)
int buscard_t::c64_exrom_r(offs_t offset, int sphi2, int ba, int rw)
{
- return m_exp->exrom_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
+ return (!pd_pgm1(offset, sphi2)) | m_exp->exrom_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
+}
+
+
+//-------------------------------------------------
+// pd_pgm1 - ROM 1 enable
+//-------------------------------------------------
+
+bool buscard_t::pd_pgm1(offs_t offset, int sphi2)
+{
+ if (sphi2 && m_slot->hiram())
+ {
+ if (offset >= 0xa000 && offset < 0xc000 && m_slot->loram() && !m_basic)
+ {
+ return 0;
+ }
+
+ if (offset >= 0xec00 && offset < 0xf000)
+ {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+
+//-------------------------------------------------
+// pd_pgm234 - ROM 2/3/4 enable
+//-------------------------------------------------
+
+bool buscard_t::pd_pgm234(offs_t offset, int sphi2, int bank)
+{
+ return !(sphi2 && m_slot->hiram() && m_slot->loram() && offset >= 0xa000 && offset < 0xc000 && m_basic && (m_bank == bank));
}
diff --git a/src/devices/bus/c64/buscard.h b/src/devices/bus/c64/buscard.h
index 07bf0a7310a..7c7324268d6 100644
--- a/src/devices/bus/c64/buscard.h
+++ b/src/devices/bus/c64/buscard.h
@@ -15,6 +15,8 @@
#include "bus/c64/exp.h"
#include "bus/centronics/ctronics.h"
#include "bus/ieee488/ieee488.h"
+#include "machine/ds75160a.h"
+#include "machine/ds75161a.h"
#include "machine/i8255.h"
@@ -50,9 +52,29 @@ protected:
private:
required_device<i8255_device> m_ppi;
+ required_device<ds75160a_device> m_ieee1;
+ required_device<ds75161a_device> m_ieee2;
required_device<ieee488_device> m_bus;
required_device<centronics_device> m_centronics;
required_device<c64_expansion_slot_device> m_exp;
+ required_ioport m_s1;
+ required_memory_region m_rom;
+
+ bool m_te;
+ int m_bank;
+ bool m_basic;
+ bool m_dipsw;
+ bool m_busy;
+
+ DECLARE_READ8_MEMBER( ppi_pa_r );
+ DECLARE_WRITE8_MEMBER( ppi_pa_w );
+ DECLARE_WRITE8_MEMBER( ppi_pb_w );
+ DECLARE_READ8_MEMBER( ppi_pc_r );
+ DECLARE_WRITE8_MEMBER( ppi_pc_w );
+ DECLARE_WRITE_LINE_MEMBER( busy_w );
+
+ bool pd_pgm1(offs_t offset, int sphi2);
+ bool pd_pgm234(offs_t offset, int sphi2, int bank);
};
diff --git a/src/devices/bus/c64/buscard2.cpp b/src/devices/bus/c64/buscard2.cpp
new file mode 100644
index 00000000000..6b14dab78c5
--- /dev/null
+++ b/src/devices/bus/c64/buscard2.cpp
@@ -0,0 +1,215 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Batteries Included BusCard II cartridge emulation
+
+ SYS 61000 -> Enable BASIC 4.0
+ SYS 61003 -> Disable BASIC 4.0
+ SYS 61006 -> Enter Machine Language Monitor
+
+**********************************************************************/
+
+#include "emu.h"
+#include "buscard2.h"
+
+
+
+//**************************************************************************
+// MACROS/CONSTANTS
+//**************************************************************************
+
+#define R6532_TAG "riot"
+#define MC6821_TAG "pia"
+#define CENTRONICS_TAG "centronics"
+#define EXPANSION_TAG "exp"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(C64_BUSCARD2, buscard2_t, "c64_buscard2", "C64 BusCard II cartridge")
+
+
+//-------------------------------------------------
+// ROM( buscard2 )
+//-------------------------------------------------
+
+ROM_START( buscard2 ) // dumps coming soon
+ ROM_REGION( 0x2000, "rom", 0 )
+ ROM_LOAD( "2764.bin", 0x0000, 0x2000, NO_DUMP )
+
+ ROM_REGION( 0x200, "prom", 0 )
+ ROM_LOAD( "82s129.1", 0x000, 0x100, NO_DUMP )
+ ROM_LOAD( "82s129.2", 0x100, 0x100, NO_DUMP )
+ROM_END
+
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const tiny_rom_entry *buscard2_t::device_rom_region() const
+{
+ return ROM_NAME( buscard2 );
+}
+
+
+//-------------------------------------------------
+// INPUT_PORTS( buscard2 )
+//-------------------------------------------------
+
+static INPUT_PORTS_START( buscard2 )
+ PORT_START("S1")
+ PORT_DIPNAME( 0x03, 0x00, "Device #4" ) PORT_DIPLOCATION("S1:1,2")
+ PORT_DIPSETTING( 0x00, "Serial" )
+ PORT_DIPSETTING( 0x01, "Parallel w/conv." )
+ PORT_DIPSETTING( 0x02, "IEEE" )
+ PORT_DIPSETTING( 0x03, "Parallel" )
+ PORT_DIPNAME( 0x04, 0x04, "Device #5" ) PORT_DIPLOCATION("S1:3")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x04, "Serial" )
+ PORT_DIPNAME( 0x08, 0x08, "Device #6" ) PORT_DIPLOCATION("S1:4")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x08, "Serial" )
+ PORT_DIPNAME( 0x10, 0x10, "Device #7" ) PORT_DIPLOCATION("S1:5")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x10, "Serial" )
+ PORT_DIPNAME( 0x20, 0x20, "Device #8" ) PORT_DIPLOCATION("S1:6")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x20, "Serial" )
+ PORT_DIPNAME( 0x40, 0x40, "Device #9" ) PORT_DIPLOCATION("S1:7")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x40, "Serial" )
+ PORT_DIPNAME( 0x80, 0x80, "Device #10" ) PORT_DIPLOCATION("S1:8")
+ PORT_DIPSETTING( 0x00, "IEEE" )
+ PORT_DIPSETTING( 0x80, "Serial" )
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor buscard2_t::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( buscard2 );
+}
+
+
+//-------------------------------------------------
+// Centronics interface
+//-------------------------------------------------
+
+WRITE_LINE_MEMBER( buscard2_t::busy_w )
+{
+ m_busy = state;
+}
+
+
+//-------------------------------------------------
+// device_add_mconfig - add device configuration
+//-------------------------------------------------
+
+void buscard2_t::device_add_mconfig(machine_config &config)
+{
+ RIOT6532(config, m_riot, 0);
+
+ PIA6821(config, m_pia, 0);
+
+ IEEE488(config, m_bus, 0);
+ ieee488_slot_device::add_cbm_defaults(config, nullptr);
+
+ CENTRONICS(config, m_centronics, centronics_devices, nullptr);
+ m_centronics->busy_handler().set(FUNC(buscard2_t::busy_w));
+
+ C64_EXPANSION_SLOT(config, m_exp, DERIVED_CLOCK(1, 1), c64_expansion_cards, nullptr);
+ m_exp->set_passthrough();
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// buscard2_t - constructor
+//-------------------------------------------------
+
+buscard2_t::buscard2_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, C64_BUSCARD2, tag, owner, clock),
+ device_c64_expansion_card_interface(mconfig, *this),
+ m_riot(*this, R6532_TAG),
+ m_pia(*this, MC6821_TAG),
+ m_bus(*this, IEEE488_TAG),
+ m_centronics(*this, CENTRONICS_TAG),
+ m_exp(*this, EXPANSION_TAG),
+ m_s1(*this, "S1"),
+ m_rom(*this, "rom"),
+ m_prom(*this, "prom"),
+ m_busy(1)
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void buscard2_t::device_start()
+{
+ // state saving
+ save_item(NAME(m_busy));
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void buscard2_t::device_reset()
+{
+}
+
+
+//-------------------------------------------------
+// c64_cd_r - cartridge data read
+//-------------------------------------------------
+
+uint8_t buscard2_t::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ return m_exp->cd_r(offset, data, sphi2, ba, roml, romh, io1, io2);
+}
+
+
+//-------------------------------------------------
+// c64_cd_w - cartridge data write
+//-------------------------------------------------
+
+void buscard2_t::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
+{
+ m_exp->cd_w(offset, data, sphi2, ba, roml, romh, io1, io2);
+}
+
+
+//-------------------------------------------------
+// c64_game_r - cartridge GAME read
+//-------------------------------------------------
+
+int buscard2_t::c64_game_r(offs_t offset, int sphi2, int ba, int rw)
+{
+ return m_exp->game_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
+}
+
+
+//-------------------------------------------------
+// c64_exrom_r - cartridge EXROM read
+//-------------------------------------------------
+
+int buscard2_t::c64_exrom_r(offs_t offset, int sphi2, int ba, int rw)
+{
+ return m_exp->exrom_r(offset, sphi2, ba, rw, m_slot->loram(), m_slot->hiram());
+}
diff --git a/src/devices/bus/c64/buscard2.h b/src/devices/bus/c64/buscard2.h
new file mode 100644
index 00000000000..732fc299191
--- /dev/null
+++ b/src/devices/bus/c64/buscard2.h
@@ -0,0 +1,72 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder
+/**********************************************************************
+
+ Batteries Included BusCard II cartridge emulation
+
+**********************************************************************/
+
+#ifndef MAME_BUS_C64_BUSCARD2_H
+#define MAME_BUS_C64_BUSCARD2_H
+
+#pragma once
+
+
+#include "bus/c64/exp.h"
+#include "bus/centronics/ctronics.h"
+#include "bus/ieee488/ieee488.h"
+#include "machine/6532riot.h"
+#include "machine/6821pia.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> buscard2_t
+
+class buscard2_t : public device_t,
+ public device_c64_expansion_card_interface
+{
+public:
+ // construction/destruction
+ buscard2_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // optional information overrides
+ virtual const tiny_rom_entry *device_rom_region() const override;
+ virtual void device_add_mconfig(machine_config &config) override;
+ virtual ioport_constructor device_input_ports() const override;
+
+ // device_c64_expansion_card_interface overrides
+ virtual uint8_t c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual void c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2) override;
+ virtual int c64_game_r(offs_t offset, int sphi2, int ba, int rw) override;
+ virtual int c64_exrom_r(offs_t offset, int sphi2, int ba, int rw) override;
+
+private:
+ required_device<riot6532_device> m_riot;
+ required_device<pia6821_device> m_pia;
+ required_device<ieee488_device> m_bus;
+ required_device<centronics_device> m_centronics;
+ required_device<c64_expansion_slot_device> m_exp;
+ required_ioport m_s1;
+ required_memory_region m_rom;
+ required_memory_region m_prom;
+
+ bool m_busy;
+
+ DECLARE_WRITE_LINE_MEMBER( busy_w );
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(C64_BUSCARD2, buscard2_t)
+
+
+#endif // MAME_BUS_C64_BUSCARD_H
diff --git a/src/devices/bus/c64/exp.cpp b/src/devices/bus/c64/exp.cpp
index c05095e2573..2a996728adf 100644
--- a/src/devices/bus/c64/exp.cpp
+++ b/src/devices/bus/c64/exp.cpp
@@ -31,6 +31,7 @@ device_c64_expansion_card_interface::device_c64_expansion_card_interface(const m
device_slot_card_interface(mconfig, device),
m_roml(*this, "roml"),
m_romh(*this, "romh"),
+ m_romx(*this, "romx"),
m_nvram(*this, "nvram"),
m_game(1),
m_exrom(1)
@@ -193,6 +194,7 @@ image_init_result c64_expansion_slot_device::call_load()
// Commodore 64/128 cartridge
load_software_region("roml", m_card->m_roml);
load_software_region("romh", m_card->m_romh);
+ load_software_region("romx", m_card->m_romx);
load_software_region("nvram", m_card->m_nvram);
if (get_feature("exrom") != nullptr) m_card->m_exrom = atol(get_feature("exrom"));
@@ -307,6 +309,7 @@ void c64_expansion_slot_device::set_passthrough()
// slot devices
#include "16kb.h"
#include "buscard.h"
+#include "buscard2.h"
#include "c128_comal80.h"
#include "c128_partner.h"
#include "comal80.h"
@@ -397,6 +400,7 @@ void c64_expansion_cards(device_slot_interface &device)
device.option_add("swiftlink", C64_SWIFTLINK);
device.option_add("turbo232", C64_TURBO232);
device.option_add("buscard", C64_BUSCARD);
+ device.option_add("buscard2", C64_BUSCARD2);
// the following need ROMs from the software list
device.option_add_internal("standard", C64_STD);
diff --git a/src/devices/bus/c64/exp.h b/src/devices/bus/c64/exp.h
index f625ca05f07..f5854b9491a 100644
--- a/src/devices/bus/c64/exp.h
+++ b/src/devices/bus/c64/exp.h
@@ -97,7 +97,7 @@ public:
int dotclock() { return phi2() * 8; }
int hiram() { return m_hiram; }
int loram() { return m_loram; }
-
+
void set_passthrough();
protected:
@@ -157,6 +157,7 @@ protected:
optional_shared_ptr<uint8_t> m_roml;
optional_shared_ptr<uint8_t> m_romh;
+ optional_shared_ptr<uint8_t> m_romx;
optional_shared_ptr<uint8_t> m_nvram;
int m_game;
diff --git a/src/devices/bus/c64/fcc.cpp b/src/devices/bus/c64/fcc.cpp
index 24aaa6ec523..f454b647129 100644
--- a/src/devices/bus/c64/fcc.cpp
+++ b/src/devices/bus/c64/fcc.cpp
@@ -1,38 +1,21 @@
// license:BSD-3-Clause
-// copyright-holders:Curt Coder
+// copyright-holders:Curt Coder, hap
/**********************************************************************
- Tasc Final ChessCard cartridge emulation
+Tasc Final ChessCard cartridge emulation
-**********************************************************************/
-
-/*
+It expects a mouse in port 2, and/or joystick in port 1.
- TODO:
+The cartridge includes its own CPU (G65SC02P-4 @ 5MHz), making a relatively
+strong chess program possible on C64.
+It was also released for IBM PC, with an ISA card.
- 629D ldx #$00
- 629F stx $0e
- 62A1 sta $df00
- 62A4 inc $d020
- 62A7 dec $d020
- 62AA cpx $0e
- 62AC beq $62a4 <-- eternal loop here
- 62AE rts
-
-*/
+**********************************************************************/
#include "emu.h"
#include "fcc.h"
-
-//**************************************************************************
-// MACROS/CONSTANTS
-//**************************************************************************
-
-#define G65SC02P4_TAG "g65sc02p4"
-
-
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
@@ -41,33 +24,15 @@ DEFINE_DEVICE_TYPE(C64_FCC, c64_final_chesscard_device, "c64_fcc", "Final ChessC
//-------------------------------------------------
-// ROM( c64_fcc )
-//-------------------------------------------------
-
-ROM_START( c64_fcc )
- ROM_REGION( 0x8000, G65SC02P4_TAG, 0 )
- ROM_LOAD( "fcc_rom1", 0x0000, 0x8000, CRC(2949836a) SHA1(9e6283095df9e3f4802ed0c654101f8e37168bf6) )
-ROM_END
-
-
-//-------------------------------------------------
-// rom_region - device-specific ROM region
-//-------------------------------------------------
-
-const tiny_rom_entry *c64_final_chesscard_device::device_rom_region() const
-{
- return ROM_NAME( c64_fcc );
-}
-
-
-//-------------------------------------------------
// ADDRESS_MAP( c64_fcc_map )
//-------------------------------------------------
void c64_final_chesscard_device::c64_fcc_map(address_map &map)
{
- map(0x0000, 0x1fff).mirror(0x6000).rw(FUNC(c64_final_chesscard_device::nvram_r), FUNC(c64_final_chesscard_device::nvram_w));
- map(0x8000, 0xffff).rom().region(G65SC02P4_TAG, 0);
+ map(0x0000, 0x1fff).rw(FUNC(c64_final_chesscard_device::nvram_r), FUNC(c64_final_chesscard_device::nvram_w)); // A13-A15 = low
+ //map(0x6000, 0x6000).noprw(); // N/C
+ map(0x7f00, 0x7f00).mirror(0x00ff).r(m_sublatch, FUNC(generic_latch_8_device::read)).w(m_mainlatch, FUNC(generic_latch_8_device::write)); // A8-A14 = high
+ map(0x8000, 0xffff).r(FUNC(c64_final_chesscard_device::rom_r));
}
@@ -77,8 +42,13 @@ void c64_final_chesscard_device::c64_fcc_map(address_map &map)
void c64_final_chesscard_device::device_add_mconfig(machine_config &config)
{
- M65SC02(config, m_maincpu, XTAL(5'000'000));
+ M65SC02(config, m_maincpu, 5_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &c64_final_chesscard_device::c64_fcc_map);
+
+ config.m_perfect_cpu_quantum = subtag("maincpu");
+
+ GENERIC_LATCH_8(config, m_mainlatch).data_pending_callback().set(FUNC(c64_final_chesscard_device::mainlatch_int));
+ GENERIC_LATCH_8(config, m_sublatch).data_pending_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
}
@@ -114,9 +84,11 @@ c64_final_chesscard_device::c64_final_chesscard_device(const machine_config &mco
device_t(mconfig, C64_FCC, tag, owner, clock),
device_c64_expansion_card_interface(mconfig, *this),
device_nvram_interface(mconfig, *this),
- m_maincpu(*this, G65SC02P4_TAG),
+ m_maincpu(*this, "maincpu"),
+ m_mainlatch(*this, "mainlatch"),
+ m_sublatch(*this, "sublatch"),
m_bank(0),
- m_ramen(0)
+ m_hidden(0)
{
}
@@ -127,6 +99,9 @@ c64_final_chesscard_device::c64_final_chesscard_device(const machine_config &mco
void c64_final_chesscard_device::device_start()
{
+ // state saving
+ save_item(NAME(m_bank));
+ save_item(NAME(m_hidden));
}
@@ -136,10 +111,13 @@ void c64_final_chesscard_device::device_start()
void c64_final_chesscard_device::device_reset()
{
+ m_mainlatch->read();
+ m_sublatch->read();
m_maincpu->reset();
m_bank = 0;
- m_ramen = 0;
+ m_hidden = 0;
+ m_exrom = 0;
m_game = 0;
}
@@ -150,21 +128,10 @@ void c64_final_chesscard_device::device_reset()
uint8_t c64_final_chesscard_device::c64_cd_r(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- if (!roml)
- {
- if (m_ramen)
- {
- data = m_nvram[offset & 0x1fff];
- }
- else
- {
- data = m_roml[(m_bank << 14) | (offset & 0x3fff)];
- }
- }
- else if (!romh)
- {
+ if (!roml || !romh)
data = m_roml[(m_bank << 14) | (offset & 0x3fff)];
- }
+ else if (!io2)
+ data = m_mainlatch->read();
return data;
}
@@ -176,72 +143,16 @@ uint8_t c64_final_chesscard_device::c64_cd_r(offs_t offset, uint8_t data, int sp
void c64_final_chesscard_device::c64_cd_w(offs_t offset, uint8_t data, int sphi2, int ba, int roml, int romh, int io1, int io2)
{
- if (!roml)
- {
- if (m_ramen)
- {
- m_nvram[offset & 0x1fff] = data;
- }
- }
- else if (!io1)
+ if (!m_hidden && !io1)
{
- /*
-
- bit description
-
- 0 ?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
- */
-
- printf("IO1 %04x %02x\n", offset, data);
+ // d0: rom bank
+ // d1: EXROM/GAME
+ // d7: hide register
m_bank = BIT(data, 0);
+ m_exrom = BIT(data, 1);
+ m_game = BIT(data, 1);
+ m_hidden = BIT(data, 7);
}
else if (!io2)
- {
- /*
-
- bit description
-
- 0 ?
- 1
- 2
- 3
- 4
- 5
- 6
- 7 ?
-
- */
-
- printf("IO2 %04x %02x\n", offset, data);
- m_ramen = BIT(data, 0);
- m_game = BIT(data, 7);
- }
-}
-
-
-//-------------------------------------------------
-// nvram_r - NVRAM read
-//-------------------------------------------------
-
-READ8_MEMBER( c64_final_chesscard_device::nvram_r )
-{
- return m_nvram[offset & m_nvram.mask()];
-}
-
-
-//-------------------------------------------------
-// nvram_w - NVRAM write
-//-------------------------------------------------
-
-WRITE8_MEMBER( c64_final_chesscard_device::nvram_w )
-{
- m_nvram[offset & m_nvram.mask()] = data;
+ m_sublatch->write(data);
}
diff --git a/src/devices/bus/c64/fcc.h b/src/devices/bus/c64/fcc.h
index 3988a597fd4..3c3aa02881d 100644
--- a/src/devices/bus/c64/fcc.h
+++ b/src/devices/bus/c64/fcc.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Curt Coder
+// copyright-holders:Curt Coder, hap
/**********************************************************************
Tasc Final ChessCard cartridge emulation
@@ -13,6 +13,7 @@
#include "exp.h"
#include "cpu/m6502/m65sc02.h"
+#include "machine/gen_latch.h"
@@ -36,7 +37,6 @@ protected:
virtual void device_reset() override;
// optional information overrides
- virtual const tiny_rom_entry *device_rom_region() const override;
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
@@ -51,12 +51,16 @@ protected:
private:
required_device<m65sc02_device> m_maincpu;
+ required_device<generic_latch_8_device> m_mainlatch;
+ required_device<generic_latch_8_device> m_sublatch;
uint8_t m_bank;
- int m_ramen;
+ int m_hidden;
- DECLARE_READ8_MEMBER( nvram_r );
- DECLARE_WRITE8_MEMBER( nvram_w );
+ DECLARE_WRITE_LINE_MEMBER(mainlatch_int) { m_slot->nmi_w(state); }
+ DECLARE_READ8_MEMBER(rom_r) { return m_romx[offset]; } // cartridge cpu rom
+ DECLARE_READ8_MEMBER(nvram_r) { return m_nvram[offset & m_nvram.mask()]; }
+ DECLARE_WRITE8_MEMBER(nvram_w) { m_nvram[offset & m_nvram.mask()] = data; }
void c64_fcc_map(address_map &map);
};
diff --git a/src/devices/bus/cbmiec/interpod.cpp b/src/devices/bus/cbmiec/interpod.cpp
index ac87a55cf21..d31b47e406c 100644
--- a/src/devices/bus/cbmiec/interpod.cpp
+++ b/src/devices/bus/cbmiec/interpod.cpp
@@ -70,13 +70,14 @@ Notes:
#define R6532_TAG "u3"
#define R6522_TAG "u4"
#define MC6850_TAG "u5"
+#define RS232_TAG "rs232"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
-DEFINE_DEVICE_TYPE(INTERPOD, interpod_device, "interpod", "Interpod")
+DEFINE_DEVICE_TYPE(INTERPOD, interpod_t, "interpod", "Interpod")
@@ -90,8 +91,11 @@ DEFINE_DEVICE_TYPE(INTERPOD, interpod_device, "interpod", "Interpod")
ROM_START( interpod )
ROM_REGION( 0x800, R6502_TAG, 0 )
- ROM_LOAD( "1.4.u2", 0x000, 0x800, CRC(c5b71982) SHA1(614d677b7c6273f6b84fa61affaf91cfdaeed6a6) )
- ROM_LOAD( "1.6.u2", 0x000, 0x800, CRC(67bb0436) SHA1(7659c45b73f577233f7657c4da9141dcfe8b6d97) )
+ ROM_DEFAULT_BIOS("v16")
+ ROM_SYSTEM_BIOS( 0, "v14", "Version 1.4" )
+ ROMX_LOAD( "1.4.u2", 0x000, 0x800, CRC(c5b71982) SHA1(614d677b7c6273f6b84fa61affaf91cfdaeed6a6), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS( 1, "v16", "Version 1.6" )
+ ROMX_LOAD( "1.6.u2", 0x000, 0x800, CRC(67bb0436) SHA1(7659c45b73f577233f7657c4da9141dcfe8b6d97), ROM_BIOS(1) )
ROM_END
@@ -99,7 +103,7 @@ ROM_END
// rom_region - device-specific ROM region
//-------------------------------------------------
-const tiny_rom_entry *interpod_device::device_rom_region() const
+const tiny_rom_entry *interpod_t::device_rom_region() const
{
return ROM_NAME( interpod );
}
@@ -109,7 +113,7 @@ const tiny_rom_entry *interpod_device::device_rom_region() const
// ADDRESS_MAP( interpod_mem )
//-------------------------------------------------
-void interpod_device::interpod_mem(address_map &map)
+void interpod_t::interpod_mem(address_map &map)
{
map(0x0000, 0x007f).mirror(0x3b80).m(R6532_TAG, FUNC(mos6532_new_device::ram_map));
map(0x0400, 0x041f).mirror(0x3be0).m(R6532_TAG, FUNC(mos6532_new_device::io_map));
@@ -123,43 +127,50 @@ void interpod_device::interpod_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-void interpod_device::device_add_mconfig(machine_config &config)
+void interpod_t::device_add_mconfig(machine_config &config)
{
M6502(config, m_maincpu, 1000000);
- m_maincpu->set_addrmap(AS_PROGRAM, &interpod_device::interpod_mem);
+ m_maincpu->set_addrmap(AS_PROGRAM, &interpod_t::interpod_mem);
VIA6522(config, m_via, 1000000);
+
MOS6532_NEW(config, m_riot, 1000000);
+
ACIA6850(config, m_acia, 0);
ieee488_device::add_cbm_devices(config, nullptr);
+
+ RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
}
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
-// interpod_device - constructor
+// interpod_t - constructor
//-------------------------------------------------
-interpod_device::interpod_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, INTERPOD, tag, owner, clock),
- device_cbm_iec_interface(mconfig, *this),
- m_maincpu(*this, R6502_TAG),
- m_via(*this, R6522_TAG),
- m_riot(*this, R6532_TAG),
- m_acia(*this, MC6850_TAG),
- m_ieee(*this, IEEE488_TAG)
+interpod_t::interpod_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, INTERPOD, tag, owner, clock),
+ device_cbm_iec_interface(mconfig, *this),
+ m_maincpu(*this, R6502_TAG),
+ m_via(*this, R6522_TAG),
+ m_riot(*this, R6532_TAG),
+ m_acia(*this, MC6850_TAG),
+ m_ieee(*this, IEEE488_TAG),
+ m_rs232(*this, RS232_TAG)
{
}
+
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
-void interpod_device::device_start()
+void interpod_t::device_start()
{
}
@@ -168,6 +179,6 @@ void interpod_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
-void interpod_device::device_reset()
+void interpod_t::device_reset()
{
}
diff --git a/src/devices/bus/cbmiec/interpod.h b/src/devices/bus/cbmiec/interpod.h
index 58c193286cf..bad1a0af660 100644
--- a/src/devices/bus/cbmiec/interpod.h
+++ b/src/devices/bus/cbmiec/interpod.h
@@ -12,6 +12,7 @@
#pragma once
#include "cbmiec.h"
+#include "bus/rs232/rs232.h"
#include "bus/ieee488/ieee488.h"
#include "cpu/m6502/m6502.h"
#include "machine/6522via.h"
@@ -21,23 +22,17 @@
//**************************************************************************
-// MACROS / CONSTANTS
-//**************************************************************************
-
-#define INTERPOD_TAG "interpod"
-
-
-//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// ======================> interpod_device
+// ======================> interpod_t
-class interpod_device : public device_t, public device_cbm_iec_interface
+class interpod_t : public device_t,
+ public device_cbm_iec_interface
{
public:
// construction/destruction
- interpod_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ interpod_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@@ -54,13 +49,14 @@ private:
required_device<mos6532_new_device> m_riot;
required_device<acia6850_device> m_acia;
required_device<ieee488_device> m_ieee;
+ required_device<rs232_port_device> m_rs232;
void interpod_mem(address_map &map);
};
// device type definition
-DECLARE_DEVICE_TYPE(INTERPOD, interpod_device)
+DECLARE_DEVICE_TYPE(INTERPOD, interpod_t)
#endif // MAME_BUS_CBMIEC_INTERPOD_H
diff --git a/src/devices/bus/gio/newport.cpp b/src/devices/bus/gio/newport.cpp
index e6875bc883d..b1b2cf9458f 100644
--- a/src/devices/bus/gio/newport.cpp
+++ b/src/devices/bus/gio/newport.cpp
@@ -1594,7 +1594,8 @@ bool newport_base_device::pixel_clip_pass(int16_t x, int16_t y)
void newport_base_device::store_pixel(uint32_t *dest_buf, uint32_t src)
{
- const uint32_t write_mask = m_rex3.m_write_mask & m_global_mask;
+ const uint32_t fast_mask = BIT(m_rex3.m_draw_mode1, 17) ? m_rex3.m_write_mask : 0xffffffff;
+ const uint32_t write_mask = fast_mask & m_global_mask;
const uint32_t dst = *dest_buf;
*dest_buf &= ~write_mask;
@@ -2425,18 +2426,41 @@ void newport_base_device::do_rex3_command()
const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : (BIT(mode0, 13) ? m_rex3.m_ls_pattern : 0xffffffff);
const bool shade = BIT(mode0, 18);
const bool rgbmode = BIT(mode1, 15);
+ const bool fastclear = BIT(mode1, 17);
LOGMASKED(LOG_COMMANDS, "%04x, %04x to %04x, %04x = %08x\n", start_x, start_y, end_x, end_y, pattern);
+ uint32_t color = m_rex3.m_color_i;
+ if (fastclear)
+ {
+ switch (m_rex3.m_plane_depth)
+ {
+ case 0: // 4bpp
+ color = m_rex3.m_color_vram & 0xf;
+ color |= color << 4;
+ break;
+ case 1: // 8bpp
+ color = m_rex3.m_color_vram & 0xff;
+ break;
+ case 2: // 12bpp
+ color = ((m_rex3.m_color_vram & 0xf00000) >> 12) | ((m_rex3.m_color_vram & 0xf000) >> 8) | ((m_rex3.m_color_vram & 0xf0) >> 4);
+ color |= color << 12;
+ break;
+ case 3: // 24bpp
+ color = m_rex3.m_color_vram & 0xffffff;
+ break;
+ }
+ }
+
uint32_t bit = 31;
for (; start_x != end_x; start_x += dx)
{
if (BIT(pattern, bit))
{
- if (shade || rgbmode)
+ if ((shade || rgbmode) && !fastclear)
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
else
- write_pixel(start_x, start_y, m_rex3.m_color_i);
+ write_pixel(start_x, start_y, color);
}
else if (opaque)
{
@@ -2556,24 +2580,27 @@ void newport_base_device::do_rex3_command()
const bool shade = BIT(mode0, 18);
const bool rgbmode = BIT(mode1, 15);
const bool opaque = BIT(mode0, 16) || BIT(mode0, 17);
+ const bool fastclear = BIT(mode1, 17);
const uint32_t pattern = BIT(mode0, 12) ? m_rex3.m_z_pattern : (BIT(mode0, 13) ? m_rex3.m_ls_pattern : 0xffffffff);
if (BIT(mode0, 15) && (end_x - start_x) >= 32)
end_x = start_x + 32 * dx;
uint32_t color = m_rex3.m_color_i;
- if (BIT(mode1, 17))
+ if (fastclear)
{
switch (m_rex3.m_plane_depth)
{
case 0: // 4bpp
color = m_rex3.m_color_vram & 0xf;
+ color |= color << 4;
break;
case 1: // 8bpp
color = m_rex3.m_color_vram & 0xff;
break;
case 2: // 12bpp
color = ((m_rex3.m_color_vram & 0xf00000) >> 12) | ((m_rex3.m_color_vram & 0xf000) >> 8) | ((m_rex3.m_color_vram & 0xf0) >> 4);
+ color |= color << 12;
break;
case 3: // 24bpp
color = m_rex3.m_color_vram & 0xffffff;
@@ -2588,7 +2615,7 @@ void newport_base_device::do_rex3_command()
{
if (BIT(pattern, bit))
{
- if (shade || rgbmode)
+ if ((shade || rgbmode) && !fastclear)
write_pixel(start_x, start_y, get_rgb_color(start_x, start_y));
else
write_pixel(start_x, start_y, color);
@@ -2668,6 +2695,8 @@ void newport_base_device::do_rex3_command()
default:
break;
}
+ src >>= m_rex3.m_store_shift;
+
write_pixel(start_x + m_rex3.m_x_move, start_y + m_rex3.m_y_move, src);
start_x += dx;
diff --git a/src/devices/bus/isa/finalchs.cpp b/src/devices/bus/isa/finalchs.cpp
index f9e6f37dc8f..40ec762d24f 100644
--- a/src/devices/bus/isa/finalchs.cpp
+++ b/src/devices/bus/isa/finalchs.cpp
@@ -11,7 +11,7 @@
#include "emu.h"
#include "finalchs.h"
-#include "cpu/m6502/m65c02.h"
+#include "cpu/m6502/m65sc02.h"
WRITE8_MEMBER( isa8_finalchs_device::io7ff8_write )
{
@@ -73,7 +73,7 @@ DEFINE_DEVICE_TYPE(ISA8_FINALCHS, isa8_finalchs_device, "isa_finalchs", "Final C
void isa8_finalchs_device::device_add_mconfig(machine_config &config)
{
- m65c02_device &cpu(M65C02(config, "maincpu", 5000000));
+ m65sc02_device &cpu(M65SC02(config, "maincpu", 5_MHz_XTAL));
cpu.set_addrmap(AS_PROGRAM, &isa8_finalchs_device::finalchs_mem);
}
diff --git a/src/devices/bus/isa/tekram_dc820.cpp b/src/devices/bus/isa/tekram_dc820.cpp
index 60acf997886..ab2375856ce 100644
--- a/src/devices/bus/isa/tekram_dc820.cpp
+++ b/src/devices/bus/isa/tekram_dc820.cpp
@@ -7,9 +7,12 @@
These EISA host adapters have, in addition to internal and external
SCSI and floppy disk connectors, LED and "SPKER" jumper headers. The
DC-820 and DC-820B also have four SIMM slots in addition to 64K of
- static RAM on board. The DC-320 and DC-320B only have 16K of SRAM.
+ static RAM on board. The DC-320 and DC-320B only have 16K of SRAM;
+ the DC-820B firmware switches into DC-320E mode if it fails to read
+ dummy values back from select RAM locations beyond the 16K limit.
The DC-820B has an ASIC in place of the 11 PLDs used by the DC-820.
+ DC-320E likely uses the same ASIC, though probably on a smaller PCB.
It seems likely that these controllers, like the AHA-174X, support a
legacy ISA port interface as well as the standard EISA doorbell and
@@ -103,9 +106,8 @@ void tekram_eisa_scsi_device::eeprom_w(u8 data)
m_eeprom->clk_write(BIT(data, 5));
}
-void tekram_eisa_scsi_device::mpu_map(address_map &map)
+void tekram_eisa_scsi_device::common_map(address_map &map)
{
- map(0x00000, 0x0ffff).ram();
map(0x10040, 0x1005f).m("scsi:7:scsic", FUNC(ncr53cf94_device::map)).umask16(0xff00);
map(0x10068, 0x10068).rw(FUNC(tekram_eisa_scsi_device::latch_status_r), FUNC(tekram_eisa_scsi_device::int0_ack_w));
map(0x10069, 0x10069).r(FUNC(tekram_eisa_scsi_device::status_r));
@@ -119,6 +121,19 @@ void tekram_eisa_scsi_device::mpu_map(address_map &map)
map(0xf0000, 0xfffff).rom().region("firmware", 0);
}
+void tekram_dc320e_device::mpu_map(address_map &map)
+{
+ common_map(map);
+ map(0x00000, 0x03fff).ram();
+ map(0x04000, 0x0ffff).noprw();
+}
+
+void tekram_dc820b_device::mpu_map(address_map &map)
+{
+ common_map(map);
+ map(0x00000, 0x0ffff).ram();
+}
+
void tekram_dc320b_device::eeprom_w(u8 data)
{
m_eeprom->di_write(BIT(data, 1));
diff --git a/src/devices/bus/isa/tekram_dc820.h b/src/devices/bus/isa/tekram_dc820.h
index e723a91776e..2308eb8655a 100644
--- a/src/devices/bus/isa/tekram_dc820.h
+++ b/src/devices/bus/isa/tekram_dc820.h
@@ -34,7 +34,7 @@ protected:
void mask_w(u8 data);
void eeprom_w(u8 data);
- void mpu_map(address_map &map);
+ void common_map(address_map &map);
void scsic_config(device_t *device);
void scsi_add(machine_config &config);
@@ -71,6 +71,9 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ void mpu_map(address_map &map);
};
class tekram_dc820_device : public tekram_eisa_scsi_device
@@ -96,6 +99,9 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual const tiny_rom_entry *device_rom_region() const override;
+
+private:
+ void mpu_map(address_map &map);
};
DECLARE_DEVICE_TYPE(TEKRAM_DC320B, tekram_dc320b_device)
diff --git a/src/devices/bus/vcs_ctrl/ctrl.cpp b/src/devices/bus/vcs_ctrl/ctrl.cpp
index c4f735aacb6..57cdad8f4ba 100644
--- a/src/devices/bus/vcs_ctrl/ctrl.cpp
+++ b/src/devices/bus/vcs_ctrl/ctrl.cpp
@@ -71,6 +71,7 @@ void vcs_control_port_device::device_start()
#include "joystick.h"
#include "keypad.h"
#include "lightpen.h"
+#include "mouse.h"
#include "paddles.h"
#include "wheel.h"
@@ -78,6 +79,7 @@ void vcs_control_port_devices(device_slot_interface &device)
{
device.option_add("joy", VCS_JOYSTICK);
device.option_add("pad", VCS_PADDLES);
+ device.option_add("mouse", VCS_MOUSE);
device.option_add("lp", VCS_LIGHTPEN);
device.option_add("joybstr", VCS_JOYSTICK_BOOSTER);
device.option_add("wheel", VCS_WHEEL);
diff --git a/src/devices/bus/vcs_ctrl/mouse.cpp b/src/devices/bus/vcs_ctrl/mouse.cpp
new file mode 100644
index 00000000000..611ae081da4
--- /dev/null
+++ b/src/devices/bus/vcs_ctrl/mouse.cpp
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder, hap
+/**********************************************************************
+
+Mouse emulation (Commodore 1351 or compatible)
+
+At power-on, holding the right mouse button will put it in joystick mode.
+In proportional mode, left button goes to pin #6, right button to pin #1.
+POT(X/Y) d1-d6 holds the current direction, d7 unused, d0 is a 'noise bit'.
+
+TODO:
+- joystick mode
+
+**********************************************************************/
+
+#include "emu.h"
+#include "mouse.h"
+
+
+
+//**************************************************************************
+// DEVICE DEFINITIONS
+//**************************************************************************
+
+DEFINE_DEVICE_TYPE(VCS_MOUSE, vcs_mouse_device, "vcs_mouse", "Atari / CBM Mouse")
+
+
+static INPUT_PORTS_START( vcs_mouse )
+ PORT_START("JOY")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0xde, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START("POTX")
+ PORT_BIT( 0x3f, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(15) PORT_KEYDELTA(10)
+
+ PORT_START("POTY")
+ PORT_BIT( 0x3f, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(15) PORT_KEYDELTA(10) PORT_REVERSE
+INPUT_PORTS_END
+
+
+//-------------------------------------------------
+// input_ports - device-specific input ports
+//-------------------------------------------------
+
+ioport_constructor vcs_mouse_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( vcs_mouse );
+}
+
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// vcs_mouse_device - constructor
+//-------------------------------------------------
+
+vcs_mouse_device::vcs_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, VCS_MOUSE, tag, owner, clock),
+ device_vcs_control_port_interface(mconfig, *this),
+ m_joy(*this, "JOY"),
+ m_potx(*this, "POTX"),
+ m_poty(*this, "POTY")
+{
+}
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void vcs_mouse_device::device_start()
+{
+}
+
+
+//-------------------------------------------------
+// vcs_joy_r - joystick read
+//-------------------------------------------------
+
+uint8_t vcs_mouse_device::vcs_joy_r()
+{
+ return m_joy->read();
+}
+
+
+//-------------------------------------------------
+// vcs_pot_x_r - potentiometer X read
+//-------------------------------------------------
+
+uint8_t vcs_mouse_device::vcs_pot_x_r()
+{
+ return m_potx->read() << 1;
+}
+
+
+//-------------------------------------------------
+// vcs_pot_y_r - potentiometer Y read
+//-------------------------------------------------
+
+uint8_t vcs_mouse_device::vcs_pot_y_r()
+{
+ return m_poty->read() << 1;
+}
diff --git a/src/devices/bus/vcs_ctrl/mouse.h b/src/devices/bus/vcs_ctrl/mouse.h
new file mode 100644
index 00000000000..eab33d64aab
--- /dev/null
+++ b/src/devices/bus/vcs_ctrl/mouse.h
@@ -0,0 +1,56 @@
+// license:BSD-3-Clause
+// copyright-holders:Curt Coder, hap
+/**********************************************************************
+
+ Mouse emulation (Commodore 1351 or compatible)
+
+**********************************************************************/
+
+#ifndef MAME_BUS_VCS_CTRL_MOUSE_H
+#define MAME_BUS_VCS_CTRL_MOUSE_H
+
+#pragma once
+
+#include "ctrl.h"
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> vcs_mouse_device
+
+class vcs_mouse_device : public device_t,
+ public device_vcs_control_port_interface
+{
+public:
+ // construction/destruction
+ vcs_mouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // optional information overrides
+ virtual ioport_constructor device_input_ports() const override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+ // device_vcs_control_port_interface overrides
+ virtual uint8_t vcs_joy_r() override;
+ virtual uint8_t vcs_pot_x_r() override;
+ virtual uint8_t vcs_pot_y_r() override;
+
+ virtual bool has_pot_x() override { return true; }
+ virtual bool has_pot_y() override { return true; }
+
+private:
+ required_ioport m_joy;
+ required_ioport m_potx;
+ required_ioport m_poty;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(VCS_MOUSE, vcs_mouse_device)
+
+#endif // MAME_BUS_VCS_CTRL_MOUSE_H
diff --git a/src/devices/cpu/m6502/m6510.cpp b/src/devices/cpu/m6502/m6510.cpp
index 92ec15dbc25..b045d4423f5 100644
--- a/src/devices/cpu/m6502/m6510.cpp
+++ b/src/devices/cpu/m6502/m6510.cpp
@@ -6,6 +6,9 @@
6502 with 6 i/o pins, also known as 8500
+ 6508 is 6510 plus 256 bytes of internal RAM, mirrored across pages 0
+ and 1.
+
***************************************************************************/
#include "emu.h"
@@ -13,6 +16,7 @@
#include "m6510d.h"
DEFINE_DEVICE_TYPE(M6510, m6510_device, "m6510", "MOS Technology M6510")
+DEFINE_DEVICE_TYPE(M6508, m6508_device, "m6508", "MOS Technology M6508")
m6510_device::m6510_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
m6510_device(mconfig, M6510, tag, owner, clock)
@@ -39,23 +43,27 @@ std::unique_ptr<util::disasm_interface> m6510_device::create_disassembler()
return std::make_unique<m6510_disassembler>();
}
-void m6510_device::device_start()
+void m6510_device::init_port()
{
read_port.resolve_safe(0);
write_port.resolve_safe();
+ save_item(NAME(pullup));
+ save_item(NAME(floating));
+ save_item(NAME(dir));
+ save_item(NAME(port));
+ save_item(NAME(drive));
+}
+
+void m6510_device::device_start()
+{
if(cache_disabled)
mintf = std::make_unique<mi_6510_nd>(this);
else
mintf = std::make_unique<mi_6510_normal>(this);
init();
-
- save_item(NAME(pullup));
- save_item(NAME(floating));
- save_item(NAME(dir));
- save_item(NAME(port));
- save_item(NAME(drive));
+ init_port();
}
void m6510_device::device_reset()
@@ -169,4 +177,106 @@ uint8_t m6510_device::mi_6510_nd::read_arg(uint16_t adr)
return res;
}
+
+m6508_device::m6508_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ m6510_device(mconfig, M6508, tag, owner, clock)
+{
+}
+
+void m6508_device::device_start()
+{
+ if(cache_disabled)
+ mintf = std::make_unique<mi_6508_nd>(this);
+ else
+ mintf = std::make_unique<mi_6508_normal>(this);
+
+ init();
+ init_port();
+
+ ram_page = make_unique_clear<uint8_t[]>(256);
+ save_pointer(NAME(ram_page), 256);
+}
+
+
+m6508_device::mi_6508_normal::mi_6508_normal(m6508_device *_base)
+{
+ base = _base;
+}
+
+uint8_t m6508_device::mi_6508_normal::read(uint16_t adr)
+{
+ uint8_t res = program->read_byte(adr);
+ if(adr == 0x0000)
+ res = base->dir_r();
+ else if(adr == 0x0001)
+ res = base->port_r();
+ else if(adr < 0x0200)
+ res = base->ram_page[adr & 0x00ff];
+ return res;
+}
+
+uint8_t m6508_device::mi_6508_normal::read_sync(uint16_t adr)
+{
+ uint8_t res = scache->read_byte(adr);
+ if(adr == 0x0000)
+ res = base->dir_r();
+ else if(adr == 0x0001)
+ res = base->port_r();
+ else if(adr < 0x0200)
+ res = base->ram_page[adr & 0x00ff];
+ return res;
+}
+
+uint8_t m6508_device::mi_6508_normal::read_arg(uint16_t adr)
+{
+ uint8_t res = cache->read_byte(adr);
+ if(adr == 0x0000)
+ res = base->dir_r();
+ else if(adr == 0x0001)
+ res = base->port_r();
+ else if(adr < 0x0200)
+ res = base->ram_page[adr & 0x00ff];
+ return res;
+}
+
+void m6508_device::mi_6508_normal::write(uint16_t adr, uint8_t val)
+{
+ program->write_byte(adr, val);
+ if(adr == 0x0000)
+ base->dir_w(val);
+ else if(adr == 0x0001)
+ base->port_w(val);
+ else if(adr < 0x0200)
+ base->ram_page[adr & 0x00ff] = val;
+}
+
+m6508_device::mi_6508_nd::mi_6508_nd(m6508_device *_base) : mi_6508_normal(_base)
+{
+}
+
+uint8_t m6508_device::mi_6508_nd::read_sync(uint16_t adr)
+{
+ uint8_t res = sprogram->read_byte(adr);
+ if(adr == 0x0000)
+ res = base->dir_r();
+ else if(adr == 0x0001)
+ res = base->port_r();
+ else if(adr < 0x0200)
+ res = base->ram_page[adr & 0x00ff];
+ return res;
+}
+
+uint8_t m6508_device::mi_6508_nd::read_arg(uint16_t adr)
+{
+ uint8_t res = program->read_byte(adr);
+ if(adr == 0x0000)
+ res = base->dir_r();
+ else if(adr == 0x0001)
+ res = base->port_r();
+ else if(adr < 0x0200)
+ res = base->ram_page[adr & 0x00ff];
+ return res;
+}
+
+
#include "cpu/m6502/m6510.hxx"
diff --git a/src/devices/cpu/m6502/m6510.h b/src/devices/cpu/m6502/m6510.h
index 28c9ab2443a..773acee9294 100644
--- a/src/devices/cpu/m6502/m6510.h
+++ b/src/devices/cpu/m6502/m6510.h
@@ -64,6 +64,7 @@ protected:
uint8_t port_r();
void port_w(uint8_t data);
+ void init_port();
void update_port();
#define O(o) void o ## _full(); void o ## _partial()
@@ -80,11 +81,42 @@ protected:
#undef O
};
+class m6508_device : public m6510_device {
+public:
+ m6508_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void device_start() override;
+
+ class mi_6508_normal : public memory_interface {
+ public:
+ m6508_device *base;
+
+ mi_6508_normal(m6508_device *base);
+ virtual ~mi_6508_normal() {}
+ virtual uint8_t read(uint16_t adr) override;
+ virtual uint8_t read_sync(uint16_t adr) override;
+ virtual uint8_t read_arg(uint16_t adr) override;
+ virtual void write(uint16_t adr, uint8_t val) override;
+ };
+
+ class mi_6508_nd : public mi_6508_normal {
+ public:
+ mi_6508_nd(m6508_device *base);
+ virtual ~mi_6508_nd() {}
+ virtual uint8_t read_sync(uint16_t adr) override;
+ virtual uint8_t read_arg(uint16_t adr) override;
+ };
+
+ std::unique_ptr<uint8_t[]> ram_page;
+};
+
enum {
M6510_IRQ_LINE = m6502_device::IRQ_LINE,
M6510_NMI_LINE = m6502_device::NMI_LINE
};
DECLARE_DEVICE_TYPE(M6510, m6510_device)
+DECLARE_DEVICE_TYPE(M6508, m6508_device)
#endif // MAME_CPU_M6502_M6510_H
diff --git a/src/devices/cpu/mips/r4000.cpp b/src/devices/cpu/mips/r4000.cpp
index 8b220b2b67f..0fb9dfc60e8 100644
--- a/src/devices/cpu/mips/r4000.cpp
+++ b/src/devices/cpu/mips/r4000.cpp
@@ -16,7 +16,6 @@
* - reworked address translation logic, including 64-bit modes
* - reworked softfloat3-based floating point
* - experimental primary instruction cache
- * - memory tap based ll/sc
* - configurable endianness
* - it's very very very slow
*
@@ -91,7 +90,6 @@ r4000_base_device::r4000_base_device(const machine_config &mconfig, device_type
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config_le("program", ENDIANNESS_LITTLE, 64, 32)
, m_program_config_be("program", ENDIANNESS_BIG, 64, 32)
- , m_ll_watch(nullptr)
, m_fcr0(0x00000500U)
{
m_cp0[CP0_PRId] = prid;
@@ -200,11 +198,7 @@ void r4000_base_device::device_reset()
m_cp0_timer_zero = total_cycles();
- if (m_ll_watch)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
+ m_ll_active = false;
m_cp0[CP0_WatchLo] = 0;
m_cp0[CP0_WatchHi] = 0;
@@ -884,14 +878,14 @@ void r4000_base_device::cpu_execute(u32 const op)
//case 0x1e: // *
//case 0x1f: // *
case 0x20: // LB
- load<s8>(ADDR(m_r[RSREG], s16(op)),
+ load<u8>(ADDR(m_r[RSREG], s16(op)),
[this, op](s8 data)
{
m_r[RTREG] = data;
});
break;
case 0x21: // LH
- load<s16>(ADDR(m_r[RSREG], s16(op)),
+ load<u16>(ADDR(m_r[RSREG], s16(op)),
[this, op](s16 data)
{
m_r[RTREG] = data;
@@ -901,14 +895,14 @@ void r4000_base_device::cpu_execute(u32 const op)
cpu_lwl(op);
break;
case 0x23: // LW
- load<s32>(ADDR(m_r[RSREG], s16(op)),
+ load<u32>(ADDR(m_r[RSREG], s16(op)),
[this, op](s32 data)
{
m_r[RTREG] = data;
});
break;
case 0x24: // LBU
- load<s8>(ADDR(m_r[RSREG], s16(op)),
+ load<u8>(ADDR(m_r[RSREG], s16(op)),
[this, op](u8 data)
{
m_r[RTREG] = data;
@@ -1030,28 +1024,12 @@ void r4000_base_device::cpu_execute(u32 const op)
}
break;
case 0x30: // LL
- load_linked<s32>(ADDR(m_r[RSREG], s16(op)),
+ load_linked<u32>(ADDR(m_r[RSREG], s16(op)),
[this, op](u64 address, s32 data)
{
- // remove existing tap
- if (m_ll_watch)
- m_ll_watch->remove();
-
- m_r[RTREG] = data;
+ m_r[RTREG] = s64(data);
m_cp0[CP0_LLAddr] = u32(address >> 4);
-
- // install write tap
- // FIXME: physical address truncation
- m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "ll",
- [this, hi(bool(BIT(address, 2)))](offs_t offset, u64 &data, u64 mem_mask)
- {
- if (hi ? ACCESSING_BITS_32_63 : ACCESSING_BITS_0_31)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
- });
- m_ll_addr = ADDR(m_r[RSREG], s16(op));
+ m_ll_active = true;
});
break;
case 0x31: // LWC1
@@ -1065,22 +1043,9 @@ void r4000_base_device::cpu_execute(u32 const op)
load_linked<u64>(ADDR(m_r[RSREG], s16(op)),
[this, op](u64 address, u64 data)
{
- // remove existing tap
- if (m_ll_watch)
- m_ll_watch->remove();
-
m_r[RTREG] = data;
m_cp0[CP0_LLAddr] = u32(address >> 4);
-
- // install write tap
- // FIXME: address truncation
- m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "lld",
- [this](offs_t offset, u64 &data, u64 mem_mask)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- });
- m_ll_addr = ADDR(m_r[RSREG], s16(op));
+ m_ll_active = true;
});
break;
case 0x35: // LDC1
@@ -1097,13 +1062,14 @@ void r4000_base_device::cpu_execute(u32 const op)
});
break;
case 0x38: // SC
- if (m_ll_watch && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
+ if (m_ll_active)
{
- m_ll_watch->remove();
- m_ll_watch = nullptr;
+ if (store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_r[RTREG])))
+ m_r[RTREG] = 1;
+ else
+ m_r[RTREG] = 0;
- store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_r[RTREG]));
- m_r[RTREG] = 1;
+ m_ll_active = false;
}
else
m_r[RTREG] = 0;
@@ -1116,13 +1082,14 @@ void r4000_base_device::cpu_execute(u32 const op)
break;
//case 0x3b: // *
case 0x3c: // SCD
- if (m_ll_watch && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
+ if (m_ll_active)
{
- m_ll_watch->remove();
- m_ll_watch = nullptr;
+ if (store<u64>(ADDR(m_r[RSREG], s16(op)), m_r[RTREG]))
+ m_r[RTREG] = 1;
+ else
+ m_r[RTREG] = 0;
- store<u64>(ADDR(m_r[RSREG], s16(op)), m_r[RTREG]);
- m_r[RTREG] = 1;
+ m_ll_active = false;
}
else
m_r[RTREG] = 0;
@@ -1358,11 +1325,7 @@ void r4000_base_device::cp0_execute(u32 const op)
SR &= ~SR_EXL;
}
- if (m_ll_watch)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
+ m_ll_active = false;
break;
default:
@@ -3018,14 +2981,14 @@ std::string r4000_base_device::debug_string_array(u64 array_pointer)
while (!done)
{
done = true;
- load<s32>(array_pointer, [this, &done, &result](u64 string_pointer)
+ load<u32>(array_pointer, [this, &done, &result](s32 string_pointer)
{
if (string_pointer != 0)
{
if (!result.empty())
result += ", ";
- result += '\"' + debug_string(string_pointer) + '\"';
+ result += '\"' + debug_string(s64(string_pointer)) + '\"';
done = false;
}
diff --git a/src/devices/cpu/mips/r4000.h b/src/devices/cpu/mips/r4000.h
index 217df45ecb6..bbab6289ef8 100644
--- a/src/devices/cpu/mips/r4000.h
+++ b/src/devices/cpu/mips/r4000.h
@@ -394,8 +394,7 @@ protected:
u64 m_cp0[32];
u64 m_cp0_timer_zero;
emu_timer *m_cp0_timer;
- memory_passthrough_handler *m_ll_watch;
- u64 m_ll_addr;
+ bool m_ll_active;
struct tlb_entry_t
{
u64 mask;
diff --git a/src/devices/cpu/unsp/unsp_exxx.cpp b/src/devices/cpu/unsp/unsp_exxx.cpp
index 2572910cf43..57242b85488 100644
--- a/src/devices/cpu/unsp/unsp_exxx.cpp
+++ b/src/devices/cpu/unsp/unsp_exxx.cpp
@@ -165,7 +165,7 @@ void unsp_12_device::execute_exxx_group(uint16_t op)
case 0x02:
logerror("%s = %s lsl %s\n", regs[rd], regs[rd], regs[rs]);
- unimplemented_opcode(op);
+ m_core->m_r[rd] = m_core->m_r[rd] << m_core->m_r[rs];
return;
case 0x03:
diff --git a/src/devices/cpu/z8000/z8000.cpp b/src/devices/cpu/z8000/z8000.cpp
index ad3a740ef30..3f8570abaff 100644
--- a/src/devices/cpu/z8000/z8000.cpp
+++ b/src/devices/cpu/z8000/z8000.cpp
@@ -35,7 +35,11 @@ z8002_device::z8002_device(const machine_config &mconfig, const char *tag, devic
z8002_device::z8002_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int addrbits, int iobits, int vecmult)
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config("program", ENDIANNESS_BIG, 16, addrbits, 0)
- , m_io_config("io", ENDIANNESS_BIG, iobits, 16, 0)
+ , m_data_config("data", ENDIANNESS_BIG, 16, addrbits, 0)
+ , m_io_config("I/O", ENDIANNESS_BIG, iobits, 16, 0)
+ , m_opcodes_config("first word", ENDIANNESS_BIG, 16, addrbits, 0)
+ , m_stack_config("stack", ENDIANNESS_BIG, 16, addrbits, 0)
+ , m_sio_config("special I/O", ENDIANNESS_BIG, iobits, 16, 0)
, m_mo_out(*this)
, m_ppc(0), m_pc(0), m_psapseg(0), m_psapoff(0), m_fcw(0), m_refresh(0), m_nspseg(0), m_nspoff(0), m_irq_req(0), m_irq_vec(0), m_op_valid(0), m_nmi_state(0), m_mi(0), m_program(nullptr), m_data(nullptr), m_cache(nullptr), m_io(nullptr), m_icount(0)
, m_vector_mult(vecmult)
@@ -45,26 +49,25 @@ z8002_device::z8002_device(const machine_config &mconfig, device_type type, cons
z8001_device::z8001_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: z8002_device(mconfig, Z8001, tag, owner, clock, 20, 16, 2)
- , m_data_config("data", ENDIANNESS_BIG, 16, 20, 0)
{
}
device_memory_interface::space_config_vector z8002_device::memory_space_config() const
{
- return space_config_vector {
+ auto spaces = space_config_vector {
std::make_pair(AS_PROGRAM, &m_program_config),
std::make_pair(AS_IO, &m_io_config)
};
-}
-
-device_memory_interface::space_config_vector z8001_device::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(AS_PROGRAM, &m_program_config),
- std::make_pair(AS_DATA, &m_data_config),
- std::make_pair(AS_IO, &m_io_config)
- };
+ if (has_configured_map(AS_DATA))
+ spaces.push_back(std::make_pair(AS_DATA, &m_data_config));
+ if (has_configured_map(AS_OPCODES))
+ spaces.push_back(std::make_pair(AS_OPCODES, &m_opcodes_config));
+ if (has_configured_map(AS_STACK))
+ spaces.push_back(std::make_pair(AS_STACK, &m_stack_config));
+ if (has_configured_map(AS_SIO))
+ spaces.push_back(std::make_pair(AS_SIO, &m_sio_config));
+ return spaces;
}
bool z8002_device::get_segmented_mode() const
@@ -92,7 +95,7 @@ uint32_t z8002_device::addr_sub(uint32_t addr, uint32_t subtrahend)
uint16_t z8002_device::RDOP()
{
- uint16_t res = m_program->read_word(m_pc);
+ uint16_t res = m_opcache->read_word(m_pc);
m_pc += 2;
return res;
}
@@ -108,7 +111,7 @@ uint32_t z8002_device::get_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- m_op[opnum] = m_program->read_word(m_pc);
+ m_op[opnum] = m_cache->read_word(m_pc);
m_pc += 2;
m_op_valid |= (1 << opnum);
}
@@ -126,13 +129,13 @@ uint32_t z8002_device::get_addr_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- uint32_t seg = m_program->read_word(m_pc);
+ uint32_t seg = m_cache->read_word(m_pc);
m_pc += 2;
if (get_segmented_mode())
{
if (seg & 0x8000)
{
- m_op[opnum] = ((seg & 0x7f00) << 8) | m_program->read_word(m_pc);
+ m_op[opnum] = ((seg & 0x7f00) << 8) | m_cache->read_word(m_pc);
m_pc += 2;
}
else
@@ -156,13 +159,13 @@ uint32_t z8002_device::get_raw_addr_operand(int opnum)
if (! (m_op_valid & (1 << opnum)))
{
- uint32_t seg = m_program->read_word(m_pc);
+ uint32_t seg = m_cache->read_word(m_pc);
m_pc += 2;
if (get_segmented_mode())
{
if (seg & 0x8000)
{
- m_op[opnum] = (seg << 16) | m_program->read_word(m_pc);
+ m_op[opnum] = (seg << 16) | m_cache->read_word(m_pc);
m_pc += 2;
}
else
@@ -192,16 +195,13 @@ uint32_t z8001_device::adjust_addr_for_nonseg_mode(uint32_t addr)
}
}
-uint8_t z8002_device::RDMEM_B(int spacenum, uint32_t addr)
+uint8_t z8002_device::RDMEM_B(address_space &space, uint32_t addr)
{
addr = adjust_addr_for_nonseg_mode(addr);
- if (spacenum == AS_PROGRAM)
- return m_program->read_byte(addr);
- else
- return m_data->read_byte(addr);
+ return space.read_byte(addr);
}
-uint16_t z8002_device::RDMEM_W(int spacenum, uint32_t addr)
+uint16_t z8002_device::RDMEM_W(address_space &space, uint32_t addr)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
@@ -210,62 +210,37 @@ uint16_t z8002_device::RDMEM_W(int spacenum, uint32_t addr)
m_irq_req = Z8000_SEGTRAP;
return 0xffff;
}
- if (spacenum == AS_PROGRAM)
- return m_program->read_word(addr);
- else
- return m_data->read_word(addr);
+ return space.read_word(addr);
}
-uint32_t z8002_device::RDMEM_L(int spacenum, uint32_t addr)
+uint32_t z8002_device::RDMEM_L(address_space &space, uint32_t addr)
{
uint32_t result;
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
- if (spacenum == AS_PROGRAM)
- {
- result = m_program->read_word(addr) << 16;
- return result + m_program->read_word(addr_add(addr, 2));
- }
- else
- {
- result = m_data->read_word(addr) << 16;
- return result + m_data->read_word(addr_add(addr, 2));
- }
+ result = space.read_word(addr) << 16;
+ return result + space.read_word(addr_add(addr, 2));
}
-void z8002_device::WRMEM_B(int spacenum, uint32_t addr, uint8_t value)
+void z8002_device::WRMEM_B(address_space &space, uint32_t addr, uint8_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
- if (spacenum == AS_PROGRAM)
- m_program->write_byte(addr, value);
- else
- m_data->write_byte(addr, value);
+ space.write_byte(addr, value);
}
-void z8002_device::WRMEM_W(int spacenum, uint32_t addr, uint16_t value)
+void z8002_device::WRMEM_W(address_space &space, uint32_t addr, uint16_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
- if (spacenum == AS_PROGRAM)
- m_program->write_word(addr, value);
- else
- m_data->write_word(addr, value);
+ space.write_word(addr, value);
}
-void z8002_device::WRMEM_L(int spacenum, uint32_t addr, uint32_t value)
+void z8002_device::WRMEM_L(address_space &space, uint32_t addr, uint32_t value)
{
addr = adjust_addr_for_nonseg_mode(addr);
addr &= ~1;
- if (spacenum == AS_PROGRAM)
- {
- m_program->write_word(addr, value >> 16);
- m_program->write_word(addr_add(addr, 2), value & 0xffff);
- }
- else
- {
- m_data->write_word(addr, value >> 16);
- m_data->write_word(addr_add(addr, 2), value & 0xffff);
- }
+ space.write_word(addr, value >> 16);
+ space.write_word(addr_add(addr, 2), value & 0xffff);
}
uint8_t z8002_device::RDPORT_B(int mode, uint16_t addr)
@@ -277,7 +252,7 @@ uint8_t z8002_device::RDPORT_B(int mode, uint16_t addr)
else
{
/* how to handle MMU reads? for now just do it */
- return m_io->read_byte(addr);
+ return m_sio->read_byte(addr);
}
}
@@ -292,7 +267,7 @@ uint16_t z8002_device::RDPORT_W(int mode, uint16_t addr)
else
{
/* how to handle MMU reads? */
- return 0x0000;
+ return m_sio->read_word_unaligned((uint16_t)addr);
}
}
@@ -305,7 +280,7 @@ uint16_t z8001_device::RDPORT_W(int mode, uint16_t addr)
else
{
/* how to handle MMU reads? */
- return 0x0000;
+ return m_sio->read_word_unaligned((uint16_t)addr);
}
}
@@ -318,7 +293,7 @@ void z8002_device::WRPORT_B(int mode, uint16_t addr, uint8_t value)
else
{
/* how to handle MMU writes? for now just do it */
- m_io->write_byte(addr,value);
+ m_sio->write_byte(addr,value);
}
}
@@ -333,6 +308,7 @@ void z8002_device::WRPORT_W(int mode, uint16_t addr, uint16_t value)
else
{
/* how to handle MMU writes? */
+ m_sio->write_word_unaligned((uint16_t)addr, value);
}
}
@@ -345,6 +321,7 @@ void z8001_device::WRPORT_W(int mode, uint16_t addr, uint16_t value)
else
{
/* how to handle MMU writes? */
+ m_sio->write_word_unaligned((uint16_t)addr, value);
}
}
@@ -403,22 +380,22 @@ void z8001_device::PUSH_PC()
uint32_t z8002_device::GET_PC(uint32_t VEC)
{
- return RDMEM_W(AS_PROGRAM, VEC + 2);
+ return RDMEM_W(*m_program, VEC + 2);
}
uint32_t z8001_device::GET_PC(uint32_t VEC)
{
- return segmented_addr(RDMEM_L(AS_PROGRAM, VEC + 4));
+ return segmented_addr(RDMEM_L(*m_program, VEC + 4));
}
uint16_t z8002_device::GET_FCW(uint32_t VEC)
{
- return RDMEM_W(AS_PROGRAM, VEC);
+ return RDMEM_W(*m_program, VEC);
}
uint16_t z8001_device::GET_FCW(uint32_t VEC)
{
- return RDMEM_W(AS_PROGRAM, VEC + 2);
+ return RDMEM_W(*m_program, VEC + 2);
}
uint32_t z8002_device::F_SEG_Z8001()
@@ -448,13 +425,13 @@ void z8002_device::Interrupt()
if (m_irq_req & Z8000_NVI)
{
- int type = standard_irq_callback(0);
+ int type = standard_irq_callback(NVI_LINE);
set_irq(type | Z8000_NVI);
}
if (m_irq_req & Z8000_VI)
{
- int type = standard_irq_callback(1);
+ int type = standard_irq_callback(VI_LINE);
set_irq(type | Z8000_VI);
}
@@ -464,7 +441,7 @@ void z8002_device::Interrupt()
CHANGE_FCW(fcw | F_S_N | F_SEG_Z8001());/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(SP, fcw); /* save current m_fcw */
- PUSHW(SP, RDMEM_W(AS_PROGRAM, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
+ PUSHW(SP, RDMEM_W(*m_program, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
m_irq_req &= ~Z8000_EPU;
CHANGE_FCW(GET_FCW(EPU));
m_pc = GET_PC(EPU);
@@ -476,7 +453,7 @@ void z8002_device::Interrupt()
CHANGE_FCW(fcw | F_S_N | F_SEG_Z8001());/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(SP, fcw); /* save current m_fcw */
- PUSHW(SP, RDMEM_W(AS_PROGRAM, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
+ PUSHW(SP, RDMEM_W(*m_program, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
m_irq_req &= ~Z8000_TRAP;
CHANGE_FCW(GET_FCW(TRAP));
m_pc = GET_PC(TRAP);
@@ -488,7 +465,7 @@ void z8002_device::Interrupt()
CHANGE_FCW(fcw | F_S_N | F_SEG_Z8001());/* switch to segmented (on Z8001) system mode */
PUSH_PC();
PUSHW(SP, fcw); /* save current m_fcw */
- PUSHW(SP, RDMEM_W(AS_PROGRAM, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
+ PUSHW(SP, RDMEM_W(*m_program, m_ppc)); /* for internal traps, the 1st word of the instruction is pushed */
m_irq_req &= ~Z8000_SYSCALL;
CHANGE_FCW(GET_FCW(SYSCALL));
m_pc = GET_PC(SYSCALL);
@@ -513,7 +490,7 @@ void z8002_device::Interrupt()
PUSH_PC();
PUSHW(SP, fcw); /* save current m_fcw */
PUSHW(SP, m_irq_req); /* save interrupt/trap type tag */
- m_pc = RDMEM_W(AS_PROGRAM, NMI);
+ m_pc = RDMEM_W(*m_program, NMI);
m_irq_req &= ~Z8000_NMI;
CHANGE_FCW(GET_FCW(NMI));
m_pc = GET_PC(NMI);
@@ -547,13 +524,13 @@ void z8002_device::Interrupt()
uint32_t z8002_device::read_irq_vector()
{
- return RDMEM_W(AS_PROGRAM, VEC00 + 2 * (m_irq_req & 0xff));
+ return RDMEM_W(*m_program, VEC00 + 2 * (m_irq_req & 0xff));
}
uint32_t z8001_device::read_irq_vector()
{
- return segmented_addr(RDMEM_L(AS_PROGRAM, VEC00 + 4 * (m_irq_req & 0xff)));
+ return segmented_addr(RDMEM_L(*m_program, VEC00 + 4 * (m_irq_req & 0xff)));
}
@@ -636,6 +613,53 @@ void z8002_device::state_string_export(const device_state_entry &entry, std::str
}
}
+void z8002_device::register_save_state()
+{
+ save_item(NAME(m_op));
+ save_item(NAME(m_ppc));
+ save_item(NAME(m_pc));
+ save_item(NAME(m_psapseg));
+ save_item(NAME(m_psapoff));
+ save_item(NAME(m_fcw));
+ save_item(NAME(m_refresh));
+ save_item(NAME(m_nspseg));
+ save_item(NAME(m_nspoff));
+ save_item(NAME(m_irq_req));
+ save_item(NAME(m_irq_vec));
+ save_item(NAME(m_op_valid));
+ save_item(NAME(m_regs.Q));
+ save_item(NAME(m_nmi_state));
+ save_item(NAME(m_irq_state));
+ save_item(NAME(m_mi));
+ save_item(NAME(m_icount));
+ save_item(NAME(m_vector_mult));
+}
+
+void z8002_device::init_spaces()
+{
+ m_program = &space(AS_PROGRAM);
+ /* If the system decodes STn lines to distinguish between data and program memory fetches,
+ install the data space. If it doesn't, install the program memory into data memory space. */
+ if (has_space(AS_DATA))
+ m_data = &space(AS_DATA);
+ else
+ m_data = m_program;
+ if (has_space(AS_STACK))
+ m_stack = &space(AS_STACK);
+ else
+ m_stack = m_data;
+ m_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
+ if (has_space(AS_OPCODES))
+ m_opcache = space(AS_OPCODES).cache<1, 0, ENDIANNESS_BIG>();
+ else
+ m_opcache = m_cache;
+ m_io = &space(AS_IO);
+ if (has_space(AS_SIO))
+ m_sio = &space(AS_SIO);
+ else
+ m_sio = m_io;
+}
+
void z8002_device::init_tables()
{
/* set up the zero, sign, parity lookup table */
@@ -654,46 +678,15 @@ std::unique_ptr<util::disasm_interface> z8002_device::create_disassembler()
return std::make_unique<z8000_disassembler>(this);
}
-void z8001_device::device_start()
-{
- clear_internal_state();
-
- m_program = &space(AS_PROGRAM);
- /* If the system decodes STn lines to distinguish between data and program memory fetches,
- install the data space. If it doesn't, install the program memory into data memory space. */
- if (has_space(AS_DATA))
- m_data = &space(AS_DATA);
- else
- m_data = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
-
- init_tables();
-
- register_debug_state();
-
- set_icountptr(m_icount);
- m_mo_out.resolve_safe();
- m_mi = CLEAR_LINE;
-}
-
void z8002_device::device_start()
{
clear_internal_state();
- m_program = &space(AS_PROGRAM);
- /* If the system decodes STn lines to distinguish between data and program memory fetches,
- install the data space. If it doesn't, install the program memory into data memory space. */
- if (has_space(AS_DATA))
- m_data = &space(AS_DATA);
- else
- m_data = &space(AS_PROGRAM);
- m_cache = m_program->cache<1, 0, ENDIANNESS_BIG>();
- m_io = &space(AS_IO);
-
+ init_spaces();
init_tables();
register_debug_state();
+ register_save_state();
set_icountptr(m_icount);
m_mo_out.resolve_safe();
@@ -702,22 +695,22 @@ void z8002_device::device_start()
void z8001_device::device_reset()
{
- m_fcw = RDMEM_W(AS_PROGRAM, 2); /* get reset m_fcw */
+ m_fcw = RDMEM_W(*m_program, 2); /* get reset m_fcw */
if(m_fcw & F_SEG)
{
- m_pc = ((RDMEM_W(AS_PROGRAM, 4) & 0x0700) << 8) | (RDMEM_W(AS_PROGRAM, 6) & 0xffff); /* get reset m_pc */
+ m_pc = ((RDMEM_W(*m_program, 4) & 0x0700) << 8) | (RDMEM_W(*m_program, 6) & 0xffff); /* get reset m_pc */
}
else
{
- m_pc = RDMEM_W(AS_PROGRAM, 4); /* get reset m_pc */
+ m_pc = RDMEM_W(*m_program, 4); /* get reset m_pc */
}
m_ppc = m_pc;
}
void z8002_device::device_reset()
{
- m_fcw = RDMEM_W(AS_PROGRAM, 2); /* get reset m_fcw */
- m_pc = RDMEM_W(AS_PROGRAM, 4); /* get reset m_pc */
+ m_fcw = RDMEM_W(*m_program, 2); /* get reset m_fcw */
+ m_pc = RDMEM_W(*m_program, 4); /* get reset m_pc */
m_ppc = m_pc;
}
@@ -756,7 +749,7 @@ void z8002_device::execute_run()
void z8002_device::execute_set_input(int irqline, int state)
{
- if (irqline == INPUT_LINE_NMI)
+ if (irqline == NMI_LINE)
{
if (m_nmi_state == state)
return;
@@ -772,7 +765,7 @@ void z8002_device::execute_set_input(int irqline, int state)
else if (irqline < 2)
{
m_irq_state[irqline] = state;
- if (irqline == 0)
+ if (irqline == NVI_LINE)
{
if (state == CLEAR_LINE)
{
diff --git a/src/devices/cpu/z8000/z8000.h b/src/devices/cpu/z8000/z8000.h
index cbf7fc2a4be..5dc360fa3fd 100644
--- a/src/devices/cpu/z8000/z8000.h
+++ b/src/devices/cpu/z8000/z8000.h
@@ -19,19 +19,33 @@ enum
Z8000_R12, Z8000_R13, Z8000_R14, Z8000_R15
};
-/* Interrupt Types that can be generated by outside sources */
-#define Z8000_EPU 0x8000 /* extended instruction trap */
-#define Z8000_TRAP 0x4000 /* privileged instruction trap */
-#define Z8000_NMI 0x2000 /* non maskable interrupt */
-#define Z8000_SEGTRAP 0x1000 /* segment trap (Z8001) */
-#define Z8000_NVI 0x0800 /* non vectored interrupt */
-#define Z8000_VI 0x0400 /* vectored interrupt (LSB is vector) */
-#define Z8000_SYSCALL 0x0200 /* system call (lsb is vector) */
-#define Z8000_HALT 0x0100 /* halted flag */
-
class z8002_device : public cpu_device, public z8000_disassembler::config
{
+protected:
+ /* Interrupt Types that can be generated by outside sources */
+ static constexpr uint16_t Z8000_EPU = 0x8000; /* extended instruction trap */
+ static constexpr uint16_t Z8000_TRAP = 0x4000; /* privileged instruction trap */
+ static constexpr uint16_t Z8000_NMI = 0x2000; /* non maskable interrupt */
+ static constexpr uint16_t Z8000_SEGTRAP = 0x1000; /* segment trap (Z8001) */
+ static constexpr uint16_t Z8000_NVI = 0x0800; /* non vectored interrupt */
+ static constexpr uint16_t Z8000_VI = 0x0400; /* vectored interrupt (LSB is vector) */
+ static constexpr uint16_t Z8000_SYSCALL = 0x0200; /* system call (lsb is vector) */
+ static constexpr uint16_t Z8000_HALT = 0x0100; /* halted flag */
+
public:
+ enum
+ {
+ NVI_LINE = 0,
+ VI_LINE = 1,
+ NMI_LINE = INPUT_LINE_NMI
+ };
+
+ enum
+ {
+ AS_STACK = AS_OPCODES + 1,
+ AS_SIO = AS_OPCODES + 2
+ };
+
// construction/destruction
z8002_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
~z8002_device();
@@ -64,10 +78,15 @@ protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+ void init_spaces();
void init_tables();
address_space_config m_program_config;
+ address_space_config m_data_config;
address_space_config m_io_config;
+ address_space_config m_opcodes_config;
+ address_space_config m_stack_config;
+ address_space_config m_sio_config;
devcb_write_line m_mo_out;
uint32_t m_op[4]; /* opcodes/data of current instruction */
@@ -94,13 +113,17 @@ protected:
int m_mi;
address_space *m_program;
address_space *m_data;
+ address_space *m_stack;
memory_access_cache<1, 0, ENDIANNESS_BIG> *m_cache;
+ memory_access_cache<1, 0, ENDIANNESS_BIG> *m_opcache;
address_space *m_io;
+ address_space *m_sio;
int m_icount;
int m_vector_mult;
void clear_internal_state();
void register_debug_state();
+ void register_save_state();
virtual bool get_segmented_mode() const override;
static inline uint32_t addr_add(uint32_t addr, uint32_t addend);
static inline uint32_t addr_sub(uint32_t addr, uint32_t subtrahend);
@@ -109,12 +132,12 @@ protected:
inline uint32_t get_addr_operand(int opnum);
inline uint32_t get_raw_addr_operand(int opnum);
virtual uint32_t adjust_addr_for_nonseg_mode(uint32_t addr);
- inline uint8_t RDMEM_B(int spacenum, uint32_t addr);
- inline uint16_t RDMEM_W(int spacenum, uint32_t addr);
- inline uint32_t RDMEM_L(int spacenum, uint32_t addr);
- inline void WRMEM_B(int spacenum, uint32_t addr, uint8_t value);
- inline void WRMEM_W(int spacenum, uint32_t addr, uint16_t value);
- inline void WRMEM_L(int spacenum, uint32_t addr, uint32_t value);
+ inline uint8_t RDMEM_B(address_space &space, uint32_t addr);
+ inline uint16_t RDMEM_W(address_space &space, uint32_t addr);
+ inline uint32_t RDMEM_L(address_space &space, uint32_t addr);
+ inline void WRMEM_B(address_space &space, uint32_t addr, uint8_t value);
+ inline void WRMEM_W(address_space &space, uint32_t addr, uint16_t value);
+ inline void WRMEM_L(address_space &space, uint32_t addr, uint32_t value);
inline uint8_t RDPORT_B(int mode, uint16_t addr);
virtual uint16_t RDPORT_W(int mode, uint16_t addr);
inline void WRPORT_B(int mode, uint16_t addr, uint8_t value);
@@ -130,6 +153,18 @@ protected:
inline void add_to_addr_reg(int regno, uint16_t addend);
inline void sub_from_addr_reg(int regno, uint16_t subtrahend);
inline void set_pc(uint32_t addr);
+ inline uint8_t RDIR_B(uint8_t reg);
+ inline uint16_t RDIR_W(uint8_t reg);
+ inline uint32_t RDIR_L(uint8_t reg);
+ inline void WRIR_B(uint8_t reg, uint8_t value);
+ inline void WRIR_W(uint8_t reg, uint16_t value);
+ inline void WRIR_L(uint8_t reg, uint32_t value);
+ inline uint8_t RDBX_B(uint8_t reg, uint16_t idx);
+ inline uint16_t RDBX_W(uint8_t reg, uint16_t idx);
+ inline uint32_t RDBX_L(uint8_t reg, uint16_t idx);
+ inline void WRBX_B(uint8_t reg, uint16_t idx, uint8_t value);
+ inline void WRBX_W(uint8_t reg, uint16_t idx, uint16_t value);
+ inline void WRBX_L(uint8_t reg, uint16_t idx, uint32_t value);
inline void PUSHW(uint8_t dst, uint16_t value);
inline uint16_t POPW(uint8_t src);
inline void PUSHL(uint8_t dst, uint32_t value);
@@ -640,14 +675,8 @@ public:
protected:
// device-level overrides
- virtual void device_start() override;
virtual void device_reset() override;
- // device_memory_interface overrides
- virtual space_config_vector memory_space_config() const override;
-
- address_space_config m_data_config;
-
virtual bool get_segmented_mode() const override;
virtual uint32_t adjust_addr_for_nonseg_mode(uint32_t addr) override;
virtual uint16_t RDPORT_W(int mode, uint16_t addr) override;
diff --git a/src/devices/cpu/z8000/z8000ops.hxx b/src/devices/cpu/z8000/z8000ops.hxx
index 4599538525f..2ffb6edc26b 100644
--- a/src/devices/cpu/z8000/z8000ops.hxx
+++ b/src/devices/cpu/z8000/z8000ops.hxx
@@ -135,18 +135,78 @@ void z8002_device::set_pc(uint32_t addr)
m_pc = (m_pc & 0xffff0000) | (addr & 0xffff);
}
+uint8_t z8002_device::RDIR_B(uint8_t reg)
+{
+ return RDMEM_B(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+}
+
+uint16_t z8002_device::RDIR_W(uint8_t reg)
+{
+ return RDMEM_W(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+}
+
+uint32_t z8002_device::RDIR_L(uint8_t reg)
+{
+ return RDMEM_L(reg == SP ? *m_stack : *m_data, addr_from_reg(reg));
+}
+
+void z8002_device::WRIR_B(uint8_t reg, uint8_t value)
+{
+ WRMEM_B(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+}
+
+void z8002_device::WRIR_W(uint8_t reg, uint16_t value)
+{
+ WRMEM_W(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+}
+
+void z8002_device::WRIR_L(uint8_t reg, uint32_t value)
+{
+ WRMEM_L(reg == SP ? *m_stack : *m_data, addr_from_reg(reg), value);
+}
+
+uint8_t z8002_device::RDBX_B(uint8_t reg, uint16_t idx)
+{
+ return RDMEM_B(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+}
+
+uint16_t z8002_device::RDBX_W(uint8_t reg, uint16_t idx)
+{
+ return RDMEM_W(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+}
+
+uint32_t z8002_device::RDBX_L(uint8_t reg, uint16_t idx)
+{
+ return RDMEM_L(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx));
+}
+
+void z8002_device::WRBX_B(uint8_t reg, uint16_t idx, uint8_t value)
+{
+ WRMEM_B(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+}
+
+void z8002_device::WRBX_W(uint8_t reg, uint16_t idx, uint16_t value)
+{
+ WRMEM_W(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+}
+
+void z8002_device::WRBX_L(uint8_t reg, uint16_t idx, uint32_t value)
+{
+ WRMEM_L(reg == SP ? *m_stack : *m_data, addr_add(addr_from_reg(reg), idx), value);
+}
+
void z8002_device::PUSHW(uint8_t dst, uint16_t value)
{
if (get_segmented_mode())
RW(dst | 1) -= 2;
else
RW(dst) -= 2;
- WRMEM_W(AS_DATA, addr_from_reg(dst), value);
+ WRIR_W(dst, value);
}
uint16_t z8002_device::POPW(uint8_t src)
{
- uint16_t result = RDMEM_W(AS_DATA, addr_from_reg(src));
+ uint16_t result = RDIR_W(src);
if (get_segmented_mode())
RW(src | 1) += 2;
else
@@ -160,12 +220,12 @@ void z8002_device::PUSHL(uint8_t dst, uint32_t value)
RW(dst | 1) -= 4;
else
RW(dst) -= 4;
- WRMEM_L(AS_DATA, addr_from_reg(dst), value);
+ WRIR_L(dst, value);
}
uint32_t z8002_device::POPL(uint8_t src)
{
- uint32_t result = RDMEM_L(AS_DATA, addr_from_reg(src));
+ uint32_t result = RDIR_L(src);
if (get_segmented_mode())
RW(src | 1) += 4;
else
@@ -1223,7 +1283,7 @@ void z8002_device::Z00_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = ADDB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ RB(dst) = ADDB(RB(dst), RDIR_B(src));
}
/******************************************
@@ -1245,7 +1305,7 @@ void z8002_device::Z01_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = ADDW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RW(dst) = ADDW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1267,7 +1327,7 @@ void z8002_device::Z02_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = SUBB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src))); /* EHC */
+ RB(dst) = SUBB(RB(dst), RDIR_B(src)); /* EHC */
}
/******************************************
@@ -1289,7 +1349,7 @@ void z8002_device::Z03_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = SUBW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RW(dst) = SUBW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1311,7 +1371,7 @@ void z8002_device::Z04_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = ORB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ RB(dst) = ORB(RB(dst), RDIR_B(src));
}
/******************************************
@@ -1333,7 +1393,7 @@ void z8002_device::Z05_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = ORW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RW(dst) = ORW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1355,7 +1415,7 @@ void z8002_device::Z06_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = ANDB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ RB(dst) = ANDB(RB(dst), RDIR_B(src));
}
/******************************************
@@ -1377,7 +1437,7 @@ void z8002_device::Z07_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = ANDW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RW(dst) = ANDW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1399,7 +1459,7 @@ void z8002_device::Z08_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = XORB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ RB(dst) = XORB(RB(dst), RDIR_B(src));
}
/******************************************
@@ -1421,7 +1481,7 @@ void z8002_device::Z09_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = XORW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RW(dst) = XORW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1443,7 +1503,7 @@ void z8002_device::Z0A_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RB(dst), RDIR_B(src));
}
/******************************************
@@ -1465,7 +1525,7 @@ void z8002_device::Z0B_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RW(dst), RDIR_W(src));
}
/******************************************
@@ -1475,8 +1535,9 @@ void z8002_device::Z0B_ssN0_dddd()
void z8002_device::Z0C_ddN0_0000()
{
GET_DST(OP0,NIB3);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, COMB(RDMEM_B(AS_DATA, addr)));
+ WRMEM_B(space, addr, COMB(RDMEM_B(space, addr)));
}
/******************************************
@@ -1487,7 +1548,7 @@ void z8002_device::Z0C_ddN0_0001_imm8()
{
GET_DST(OP0,NIB2);
GET_IMM8(OP1);
- CPB(RDMEM_B(AS_DATA, addr_from_reg(dst)), imm8); // @@@done
+ CPB(RDIR_B(dst), imm8); // @@@done
}
/******************************************
@@ -1497,8 +1558,9 @@ void z8002_device::Z0C_ddN0_0001_imm8()
void z8002_device::Z0C_ddN0_0010()
{
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, NEGB(RDMEM_B(AS_DATA, addr)));
+ WRMEM_B(space, addr, NEGB(RDMEM_B(space, addr)));
}
/******************************************
@@ -1508,7 +1570,7 @@ void z8002_device::Z0C_ddN0_0010()
void z8002_device::Z0C_ddN0_0100()
{
GET_DST(OP0,NIB2);
- TESTB(RDMEM_B(AS_DATA, addr_from_reg(dst)));
+ TESTB(RDIR_B(dst));
}
/******************************************
@@ -1519,7 +1581,7 @@ void z8002_device::Z0C_ddN0_0101_imm8()
{
GET_DST(OP0,NIB2);
GET_IMM8(OP1);
- WRMEM_B(AS_DATA, addr_from_reg(dst), imm8);
+ WRIR_B(dst, imm8);
}
/******************************************
@@ -1529,9 +1591,10 @@ void z8002_device::Z0C_ddN0_0101_imm8()
void z8002_device::Z0C_ddN0_0110()
{
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- if (RDMEM_B(AS_DATA, addr) & S08) SET_S; else CLR_S;
- WRMEM_B(AS_DATA, addr, 0xff);
+ if (RDMEM_B(space, addr) & S08) SET_S; else CLR_S;
+ WRMEM_B(space, addr, 0xff);
}
/******************************************
@@ -1541,7 +1604,7 @@ void z8002_device::Z0C_ddN0_0110()
void z8002_device::Z0C_ddN0_1000()
{
GET_DST(OP0,NIB2);
- WRMEM_B(AS_DATA, addr_from_reg(dst), 0);
+ WRIR_B(dst, 0);
}
/******************************************
@@ -1551,8 +1614,9 @@ void z8002_device::Z0C_ddN0_1000()
void z8002_device::Z0D_ddN0_0000()
{
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, COMW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(space, addr, COMW(RDMEM_W(space, addr)));
}
/******************************************
@@ -1563,7 +1627,7 @@ void z8002_device::Z0D_ddN0_0001_imm16()
{
GET_DST(OP0,NIB2);
GET_IMM16(OP1);
- CPW(RDMEM_W(AS_DATA, addr_from_reg(dst)), imm16);
+ CPW(RDIR_W(dst), imm16);
}
/******************************************
@@ -1573,8 +1637,9 @@ void z8002_device::Z0D_ddN0_0001_imm16()
void z8002_device::Z0D_ddN0_0010()
{
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, NEGW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(space, addr, NEGW(RDMEM_W(space, addr)));
}
/******************************************
@@ -1584,7 +1649,7 @@ void z8002_device::Z0D_ddN0_0010()
void z8002_device::Z0D_ddN0_0100()
{
GET_DST(OP0,NIB2);
- TESTW(RDMEM_W(AS_DATA, addr_from_reg(dst)));
+ TESTW(RDIR_W(dst));
}
/******************************************
@@ -1595,7 +1660,7 @@ void z8002_device::Z0D_ddN0_0101_imm16()
{
GET_DST(OP0,NIB2);
GET_IMM16(OP1);
- WRMEM_W(AS_DATA, addr_from_reg(dst), imm16);
+ WRIR_W(dst, imm16);
}
/******************************************
@@ -1605,9 +1670,10 @@ void z8002_device::Z0D_ddN0_0101_imm16()
void z8002_device::Z0D_ddN0_0110()
{
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- if (RDMEM_W(AS_DATA, addr) & S16) SET_S; else CLR_S;
- WRMEM_W(AS_DATA, addr, 0xffff);
+ if (RDMEM_W(space, addr) & S16) SET_S; else CLR_S;
+ WRMEM_W(space, addr, 0xffff);
}
/******************************************
@@ -1617,7 +1683,7 @@ void z8002_device::Z0D_ddN0_0110()
void z8002_device::Z0D_ddN0_1000()
{
GET_DST(OP0,NIB2);
- WRMEM_W(AS_DATA, addr_from_reg(dst), 0);
+ WRIR_W(dst, 0);
}
/******************************************
@@ -1680,7 +1746,7 @@ void z8002_device::Z10_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- CPL(RL(dst), RDMEM_L(AS_DATA, addr_from_reg(src)));
+ CPL(RL(dst), RDIR_L(src));
}
/******************************************
@@ -1691,7 +1757,7 @@ void z8002_device::Z11_ddN0_ssN0()
{
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
- PUSHL(dst, RDMEM_L(AS_DATA, addr_from_reg(src)));
+ PUSHL(dst, RDIR_L(src));
}
/******************************************
@@ -1713,7 +1779,7 @@ void z8002_device::Z12_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RL(dst) = SUBL(RL(dst), RDMEM_L(AS_DATA, addr_from_reg(src)));
+ RL(dst) = SUBL(RL(dst), RDIR_L(src));
}
/******************************************
@@ -1724,7 +1790,7 @@ void z8002_device::Z13_ddN0_ssN0()
{
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
- PUSHW(dst, RDMEM_W(AS_DATA, addr_from_reg(src)));
+ PUSHW(dst, RDIR_W(src));
}
/******************************************
@@ -1746,7 +1812,7 @@ void z8002_device::Z14_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RL(dst) = RDMEM_L( AS_DATA, addr_from_reg(src));
+ RL(dst) = RDIR_L(src);
}
/******************************************
@@ -1779,7 +1845,7 @@ void z8002_device::Z16_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RL(dst) = ADDL(RL(dst), RDMEM_L(AS_DATA, addr_from_reg(src)));
+ RL(dst) = ADDL(RL(dst), RDIR_L(src));
}
/******************************************
@@ -1790,7 +1856,7 @@ void z8002_device::Z17_ssN0_ddN0()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- WRMEM_W(AS_DATA, addr_from_reg(dst), POPW(src));
+ WRIR_W(dst, POPW(src));
}
/******************************************
@@ -1834,7 +1900,7 @@ void z8002_device::Z19_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RL(dst) = MULTW(RL(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RL(dst) = MULTW(RL(dst), RDIR_W(src));
}
/******************************************
@@ -1856,7 +1922,7 @@ void z8002_device::Z1A_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RQ(dst) = DIVL(RQ(dst), RDMEM_L(AS_DATA, addr_from_reg(src)));
+ RQ(dst) = DIVL(RQ(dst), RDIR_L(src));
}
/******************************************
@@ -1878,7 +1944,7 @@ void z8002_device::Z1B_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RL(dst) = DIVW(RL(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ RL(dst) = DIVW(RL(dst), RDIR_W(src));
}
/******************************************
@@ -1888,7 +1954,7 @@ void z8002_device::Z1B_ssN0_dddd()
void z8002_device::Z1C_ddN0_1000()
{
GET_DST(OP0,NIB2);
- TESTL(RDMEM_L(AS_DATA, addr_from_reg(dst)));
+ TESTL(RDIR_L(dst));
}
/******************************************
@@ -1900,9 +1966,10 @@ void z8002_device::Z1C_ddN0_1001_0000_ssss_0000_nmin1()
GET_DST(OP0,NIB2);
GET_CNT(OP1,NIB3);
GET_SRC(OP1,NIB1);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
while (cnt-- >= 0) {
- WRMEM_W(AS_DATA, addr, RW(src));
+ WRMEM_W(space, addr, RW(src));
addr = addr_add(addr, 2);
src = (src+1) & 15;
}
@@ -1917,9 +1984,10 @@ void z8002_device::Z1C_ssN0_0001_0000_dddd_0000_nmin1()
GET_SRC(OP0,NIB2);
GET_CNT(OP1,NIB3);
GET_DST(OP1,NIB1);
+ address_space &space = src == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(src);
while (cnt-- >= 0) {
- RW(dst) = RDMEM_W(AS_DATA, addr);
+ RW(dst) = RDMEM_W(space, addr);
addr = addr_add(addr, 2);
dst = (dst+1) & 15;
}
@@ -1933,7 +2001,7 @@ void z8002_device::Z1D_ddN0_ssss()
{
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
- WRMEM_L(AS_DATA, addr_from_reg(dst), RL(src));
+ WRIR_L(dst, RL(src));
}
/******************************************
@@ -1986,7 +2054,7 @@ void z8002_device::Z20_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RB(dst) = RDMEM_B(AS_DATA, addr_from_reg(src));
+ RB(dst) = RDIR_B(src);
}
/******************************************
@@ -2008,7 +2076,7 @@ void z8002_device::Z21_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
- RW(dst) = RDMEM_W(AS_DATA, addr_from_reg(src));
+ RW(dst) = RDIR_W(src);
}
/******************************************
@@ -2030,8 +2098,9 @@ void z8002_device::Z22_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) & ~bit);
+ WRMEM_B(space, addr, RDMEM_B(space, addr) & ~bit);
}
/******************************************
@@ -2053,8 +2122,9 @@ void z8002_device::Z23_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) & ~bit);
+ WRMEM_W(space, addr, RDMEM_W(space, addr) & ~bit);
}
/******************************************
@@ -2076,8 +2146,9 @@ void z8002_device::Z24_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) | bit);
+ WRMEM_B(space, addr, RDMEM_B(space, addr) | bit);
}
/******************************************
@@ -2099,8 +2170,9 @@ void z8002_device::Z25_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) | bit);
+ WRMEM_W(space, addr, RDMEM_W(space, addr) | bit);
}
/******************************************
@@ -2122,7 +2194,7 @@ void z8002_device::Z26_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- if (RDMEM_B(AS_DATA, addr_from_reg(dst)) & bit) CLR_Z; else SET_Z;
+ if (RDIR_B(dst) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -2144,7 +2216,7 @@ void z8002_device::Z27_ddN0_imm4()
{
GET_BIT(OP0);
GET_DST(OP0,NIB2);
- if (RDMEM_W(AS_DATA, addr_from_reg(dst)) & bit) CLR_Z; else SET_Z;
+ if (RDIR_W(dst) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -2155,8 +2227,9 @@ void z8002_device::Z28_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, INCB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(space, addr, INCB(RDMEM_B(space, addr), i4p1));
}
/******************************************
@@ -2167,8 +2240,9 @@ void z8002_device::Z29_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, INCW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(space, addr, INCW(RDMEM_W(space, addr), i4p1));
}
/******************************************
@@ -2179,8 +2253,9 @@ void z8002_device::Z2A_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_B(AS_DATA, addr, DECB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(space, addr, DECB(RDMEM_B(space, addr), i4p1));
}
/******************************************
@@ -2191,8 +2266,9 @@ void z8002_device::Z2B_ddN0_imm4m1()
{
GET_I4M1(OP0,NIB3);
GET_DST(OP0,NIB2);
+ address_space &space = dst == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(dst);
- WRMEM_W(AS_DATA, addr, DECW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(space, addr, DECW(RDMEM_W(space, addr), i4p1));
}
/******************************************
@@ -2203,9 +2279,10 @@ void z8002_device::Z2C_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
+ address_space &space = src == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(src);
- uint8_t tmp = RDMEM_B( AS_DATA, addr);
- WRMEM_B(AS_DATA, addr, RB(dst));
+ uint8_t tmp = RDMEM_B(space, addr);
+ WRMEM_B(space, addr, RB(dst));
RB(dst) = tmp;
}
@@ -2217,9 +2294,10 @@ void z8002_device::Z2D_ssN0_dddd()
{
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
+ address_space &space = src == SP ? *m_stack : *m_data;
uint32_t addr = addr_from_reg(src);
- uint16_t tmp = RDMEM_W(AS_DATA, addr);
- WRMEM_W(AS_DATA, addr, RW(dst));
+ uint16_t tmp = RDMEM_W(space, addr);
+ WRMEM_W(space, addr, RW(dst));
RW(dst) = tmp;
}
@@ -2231,7 +2309,7 @@ void z8002_device::Z2E_ddN0_ssss()
{
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
- WRMEM_B(AS_DATA, addr_from_reg(dst), RB(src));
+ WRIR_B(dst, RB(src));
}
/******************************************
@@ -2242,7 +2320,7 @@ void z8002_device::Z2F_ddN0_ssss()
{
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
- WRMEM_W(AS_DATA, addr_from_reg(dst), RW(src));
+ WRIR_W(dst, RW(src));
}
/******************************************
@@ -2253,7 +2331,7 @@ void z8002_device::Z30_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RB(dst) = RDMEM_B(AS_PROGRAM, dsp16);
+ RB(dst) = RDMEM_B(*m_program, dsp16);
}
/******************************************
@@ -2265,8 +2343,7 @@ void z8002_device::Z30_ssN0_dddd_imm16()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(src), idx16);
- RB(dst) = RDMEM_B(AS_DATA, idx16);
+ RB(dst) = RDBX_B(src, idx16);
}
/******************************************
@@ -2277,7 +2354,7 @@ void z8002_device::Z31_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RW(dst) = RDMEM_W(AS_PROGRAM, dsp16);
+ RW(dst) = RDMEM_W(*m_program, dsp16);
}
/******************************************
@@ -2289,8 +2366,7 @@ void z8002_device::Z31_ssN0_dddd_imm16()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(src), idx16);
- RW(dst) = RDMEM_W(AS_DATA, idx16);
+ RW(dst) = RDBX_W(src, idx16);
}
/******************************************
@@ -2301,7 +2377,7 @@ void z8002_device::Z32_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_B(AS_PROGRAM, dsp16, RB(src));
+ WRMEM_B(*m_program, dsp16, RB(src));
}
/******************************************
@@ -2313,8 +2389,7 @@ void z8002_device::Z32_ddN0_ssss_imm16()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(dst), idx16);
- WRMEM_B(AS_DATA, idx16, RB(src));
+ WRBX_B(dst, idx16, RB(src));
}
/******************************************
@@ -2325,7 +2400,7 @@ void z8002_device::Z33_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_W(AS_PROGRAM, dsp16, RW(src));
+ WRMEM_W(*m_program, dsp16, RW(src));
}
/******************************************
@@ -2337,8 +2412,7 @@ void z8002_device::Z33_ddN0_ssss_imm16()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(dst), idx16);
- WRMEM_W(AS_DATA, idx16, RW(src));
+ WRBX_W(dst, idx16, RW(src));
}
/******************************************
@@ -2378,7 +2452,7 @@ void z8002_device::Z35_0000_dddd_dsp16()
{
GET_DST(OP0,NIB3);
GET_DSP16;
- RL(dst) = RDMEM_L(AS_PROGRAM, dsp16);
+ RL(dst) = RDMEM_L(*m_program, dsp16);
}
/******************************************
@@ -2390,8 +2464,7 @@ void z8002_device::Z35_ssN0_dddd_imm16()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(src), idx16);
- RL(dst) = RDMEM_L(AS_DATA, idx16);
+ RL(dst) = RDBX_L(src, idx16);
}
/******************************************
@@ -2426,7 +2499,7 @@ void z8002_device::Z37_0000_ssss_dsp16()
{
GET_SRC(OP0,NIB3);
GET_DSP16;
- WRMEM_L(AS_PROGRAM, dsp16, RL(src));
+ WRMEM_L(*m_program, dsp16, RL(src));
}
/******************************************
@@ -2438,8 +2511,7 @@ void z8002_device::Z37_ddN0_ssss_imm16()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX16(OP1);
- idx16 = addr_add(addr_from_reg(dst), idx16);
- WRMEM_L(AS_DATA, idx16, RL(src));
+ WRBX_L(dst, idx16, RL(src));
}
/******************************************
@@ -2465,14 +2537,15 @@ void z8002_device::Z39_ssN0_0000()
CHECK_PRIVILEGED_INSTR();
GET_SRC(OP0,NIB2);
uint16_t fcw;
+ address_space &space = src == SP ? *m_stack : *m_data;
if (get_segmented_mode()) {
uint32_t addr = addr_from_reg(src);
- fcw = RDMEM_W(AS_DATA, addr + 2);
- set_pc(segmented_addr(RDMEM_L(AS_DATA, addr + 4)));
+ fcw = RDMEM_W(space, addr + 2);
+ set_pc(segmented_addr(RDMEM_L(space, addr + 4)));
}
else {
- fcw = RDMEM_W(AS_DATA, RW(src));
- set_pc(RDMEM_W(AS_DATA, (uint16_t)(RW(src) + 2)));
+ fcw = RDMEM_W(space, RW(src));
+ set_pc(RDMEM_W(space, (uint16_t)(RW(src) + 2)));
}
if ((fcw ^ m_fcw) & F_SEG) printf("ldps 1 (0x%05x): changing from %ssegmented mode to %ssegmented mode\n", m_pc, (m_fcw & F_SEG) ? "non-" : "", (fcw & F_SEG) ? "" : "non-");
CHANGE_FCW(fcw); /* check for user/system mode change */
@@ -2489,7 +2562,7 @@ void z8002_device::Z3A_ssss_0000_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_B(AS_DATA, addr_from_reg(dst), RDPORT_B( 0, RW(src)));
+ WRIR_B(dst, RDPORT_B( 0, RW(src)));
add_to_addr_reg(dst, 1);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
}
@@ -2506,7 +2579,7 @@ void z8002_device::Z3A_ssss_0001_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_B(AS_DATA, RW(dst), RDPORT_B( 1, RW(src)));
+ WRIR_B(dst, RDPORT_B( 1, RW(src)));
RW(dst)++;
RW(src)++;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2524,7 +2597,7 @@ void z8002_device::Z3A_ssss_0010_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_B( 0, RW(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ WRPORT_B( 0, RW(dst), RDIR_B(src));
add_to_addr_reg(src, 1);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
}
@@ -2541,7 +2614,7 @@ void z8002_device::Z3A_ssss_0011_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_B( 1, RW(dst), RDMEM_B(AS_DATA, RW(src)));
+ WRPORT_B( 1, RW(dst), RDIR_W(src));
RW(dst)++;
RW(src)++;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2607,7 +2680,7 @@ void z8002_device::Z3A_ssss_1000_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_B(AS_DATA, RW(dst), RDPORT_B( 0, RW(src)));
+ WRIR_B(dst, RDPORT_B( 0, RW(src)));
RW(dst)--;
RW(src)--;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2625,7 +2698,7 @@ void z8002_device::Z3A_ssss_1001_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_B(AS_DATA, RW(dst), RDPORT_B( 1, RW(src)));
+ WRIR_B(dst, RDPORT_B( 1, RW(src)));
RW(dst)--;
RW(src)--;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2643,7 +2716,7 @@ void z8002_device::Z3A_ssss_1010_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_B( 0, RW(dst), RDMEM_B(AS_DATA, RW(src)));
+ WRPORT_B( 0, RW(dst), RDIR_B(src));
RW(dst)--;
RW(src)--;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2661,7 +2734,7 @@ void z8002_device::Z3A_ssss_1011_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_B( 1, RW(dst), RDMEM_B(AS_DATA, RW(src)));
+ WRPORT_B( 1, RW(dst), RDIR_B(src));
RW(dst)--;
RW(src)--;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2679,7 +2752,7 @@ void z8002_device::Z3B_ssss_0000_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, RW(dst), RDPORT_W( 0, RW(src)));
+ WRIR_W(dst, RDPORT_W( 0, RW(src)));
RW(dst) += 2;
RW(src) += 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2697,7 +2770,7 @@ void z8002_device::Z3B_ssss_0001_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, RW(dst), RDPORT_W( 1, RW(src)));
+ WRIR_W(dst, RDPORT_W( 1, RW(src)));
RW(dst) += 2;
RW(src) += 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2715,7 +2788,7 @@ void z8002_device::Z3B_ssss_0010_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_W( 0, RW(dst), RDMEM_W(AS_DATA, RW(src)));
+ WRPORT_W( 0, RW(dst), RDIR_W(src));
RW(dst) += 2;
RW(src) += 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2733,7 +2806,7 @@ void z8002_device::Z3B_ssss_0011_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_W( 1, RW(dst), RDMEM_W(AS_DATA, RW(src)));
+ WRPORT_W( 1, RW(dst), RDIR_W(src));
RW(dst) += 2;
RW(src) += 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2799,7 +2872,7 @@ void z8002_device::Z3B_ssss_1000_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, RW(dst), RDPORT_W( 0, RW(src)));
+ WRIR_W(dst, RDPORT_W( 0, RW(src)));
RW(dst) -= 2;
RW(src) -= 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2817,7 +2890,7 @@ void z8002_device::Z3B_ssss_1001_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, RW(dst), RDPORT_W( 1, RW(src)));
+ WRIR_W(dst, RDPORT_W( 1, RW(src)));
RW(dst) -= 2;
RW(src) -= 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2835,7 +2908,7 @@ void z8002_device::Z3B_ssss_1010_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_W( 0, RW(dst), RDMEM_W(AS_DATA, RW(src)));
+ WRPORT_W( 0, RW(dst), RDIR_W(src));
RW(dst) -= 2;
RW(src) -= 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2853,7 +2926,7 @@ void z8002_device::Z3B_ssss_1011_0000_aaaa_dddd_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRPORT_W( 1, RW(dst), RDMEM_W(AS_DATA, RW(src)));
+ WRPORT_W( 1, RW(dst), RDIR_W(src));
RW(dst) -= 2;
RW(src) -= 2;
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -2915,7 +2988,7 @@ void z8002_device::Z40_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ADDB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ADDB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -2928,7 +3001,7 @@ void z8002_device::Z40_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ADDB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ADDB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -2939,7 +3012,7 @@ void z8002_device::Z41_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ADDW(RW(dst), RDMEM_W(AS_DATA, addr)); /* EHC */
+ RW(dst) = ADDW(RW(dst), RDMEM_W(*m_data, addr)); /* EHC */
}
/******************************************
@@ -2952,7 +3025,7 @@ void z8002_device::Z41_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ADDW(RW(dst), RDMEM_W(AS_DATA, addr)); /* ASG */
+ RW(dst) = ADDW(RW(dst), RDMEM_W(*m_data, addr)); /* ASG */
}
/******************************************
@@ -2963,7 +3036,7 @@ void z8002_device::Z42_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = SUBB(RB(dst), RDMEM_B(AS_DATA, addr)); /* EHC */
+ RB(dst) = SUBB(RB(dst), RDMEM_B(*m_data, addr)); /* EHC */
}
/******************************************
@@ -2976,7 +3049,7 @@ void z8002_device::Z42_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = SUBB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = SUBB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -2987,7 +3060,7 @@ void z8002_device::Z43_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = SUBW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = SUBW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3000,7 +3073,7 @@ void z8002_device::Z43_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = SUBW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = SUBW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3011,7 +3084,7 @@ void z8002_device::Z44_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ORB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ORB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3024,7 +3097,7 @@ void z8002_device::Z44_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ORB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ORB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3035,7 +3108,7 @@ void z8002_device::Z45_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ORW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = ORW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3048,7 +3121,7 @@ void z8002_device::Z45_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ORW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = ORW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3059,7 +3132,7 @@ void z8002_device::Z46_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = ANDB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ANDB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3072,7 +3145,7 @@ void z8002_device::Z46_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = ANDB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = ANDB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3083,7 +3156,7 @@ void z8002_device::Z47_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = ANDW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = ANDW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3096,7 +3169,7 @@ void z8002_device::Z47_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = ANDW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = ANDW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3107,7 +3180,7 @@ void z8002_device::Z48_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = XORB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = XORB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3120,7 +3193,7 @@ void z8002_device::Z48_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = XORB(RB(dst), RDMEM_B(AS_DATA, addr));
+ RB(dst) = XORB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3131,7 +3204,7 @@ void z8002_device::Z49_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = XORW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = XORW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3144,7 +3217,7 @@ void z8002_device::Z49_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = XORW(RW(dst), RDMEM_W(AS_DATA, addr));
+ RW(dst) = XORW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3155,7 +3228,7 @@ void z8002_device::Z4A_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr));
+ CPB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3168,7 +3241,7 @@ void z8002_device::Z4A_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPB(RB(dst), RDMEM_B(AS_DATA, addr));
+ CPB(RB(dst), RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3179,7 +3252,7 @@ void z8002_device::Z4B_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr));
+ CPW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3192,7 +3265,7 @@ void z8002_device::Z4B_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPW(RW(dst), RDMEM_W(AS_DATA, addr));
+ CPW(RW(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3202,7 +3275,7 @@ void z8002_device::Z4B_ssN0_dddd_addr()
void z8002_device::Z4C_0000_0000_addr()
{
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, COMB(RDMEM_W(AS_DATA, addr)));
+ WRMEM_B(*m_data, addr, COMB(RDMEM_W(*m_data, addr)));
}
/******************************************
@@ -3213,7 +3286,7 @@ void z8002_device::Z4C_0000_0001_addr_imm8()
{
GET_ADDR(OP1);
GET_IMM8(OP2);
- CPB(RDMEM_B(AS_DATA, addr), imm8);
+ CPB(RDMEM_B(*m_data, addr), imm8);
}
/******************************************
@@ -3223,7 +3296,7 @@ void z8002_device::Z4C_0000_0001_addr_imm8()
void z8002_device::Z4C_0000_0010_addr()
{
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, NEGB(RDMEM_B(AS_DATA, addr)));
+ WRMEM_B(*m_data, addr, NEGB(RDMEM_B(*m_data, addr)));
}
/******************************************
@@ -3233,7 +3306,7 @@ void z8002_device::Z4C_0000_0010_addr()
void z8002_device::Z4C_0000_0100_addr()
{
GET_ADDR(OP1);
- TESTB(RDMEM_B(AS_DATA, addr));
+ TESTB(RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3244,7 +3317,7 @@ void z8002_device::Z4C_0000_0101_addr_imm8()
{
GET_ADDR(OP1);
GET_IMM8(OP2);
- WRMEM_B(AS_DATA, addr, imm8);
+ WRMEM_B(*m_data, addr, imm8);
}
/******************************************
@@ -3254,8 +3327,8 @@ void z8002_device::Z4C_0000_0101_addr_imm8()
void z8002_device::Z4C_0000_0110_addr()
{
GET_ADDR(OP1);
- if (RDMEM_B(AS_DATA, addr) & S08) SET_S; else CLR_S;
- WRMEM_B(AS_DATA, addr, 0xff);
+ if (RDMEM_B(*m_data, addr) & S08) SET_S; else CLR_S;
+ WRMEM_B(*m_data, addr, 0xff);
}
/******************************************
@@ -3265,7 +3338,7 @@ void z8002_device::Z4C_0000_0110_addr()
void z8002_device::Z4C_0000_1000_addr()
{
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, 0);
+ WRMEM_B(*m_data, addr, 0);
}
/******************************************
@@ -3277,7 +3350,7 @@ void z8002_device::Z4C_ddN0_0000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, COMB(RDMEM_B(AS_DATA, addr)));
+ WRMEM_B(*m_data, addr, COMB(RDMEM_B(*m_data, addr)));
}
/******************************************
@@ -3290,7 +3363,7 @@ void z8002_device::Z4C_ddN0_0001_addr_imm8()
GET_ADDR(OP1);
GET_IMM8(OP2);
addr = addr_add(addr, RW(dst));
- CPB(RDMEM_B(AS_DATA, addr), imm8);
+ CPB(RDMEM_B(*m_data, addr), imm8);
}
/******************************************
@@ -3302,7 +3375,7 @@ void z8002_device::Z4C_ddN0_0010_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, NEGB(RDMEM_B(AS_DATA, addr)));
+ WRMEM_B(*m_data, addr, NEGB(RDMEM_B(*m_data, addr)));
}
/******************************************
@@ -3314,7 +3387,7 @@ void z8002_device::Z4C_ddN0_0100_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTB(RDMEM_B(AS_DATA, addr));
+ TESTB(RDMEM_B(*m_data, addr));
}
/******************************************
@@ -3327,7 +3400,7 @@ void z8002_device::Z4C_ddN0_0101_addr_imm8()
GET_ADDR(OP1);
GET_IMM8(OP2);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, imm8);
+ WRMEM_B(*m_data, addr, imm8);
}
/******************************************
@@ -3339,8 +3412,8 @@ void z8002_device::Z4C_ddN0_0110_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_B(AS_DATA, addr) & S08) SET_S; else CLR_S;
- WRMEM_B(AS_DATA, addr, 0xff);
+ if (RDMEM_B(*m_data, addr) & S08) SET_S; else CLR_S;
+ WRMEM_B(*m_data, addr, 0xff);
}
/******************************************
@@ -3352,7 +3425,7 @@ void z8002_device::Z4C_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, 0);
+ WRMEM_B(*m_data, addr, 0);
}
/******************************************
@@ -3362,7 +3435,7 @@ void z8002_device::Z4C_ddN0_1000_addr()
void z8002_device::Z4D_0000_0000_addr()
{
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, COMW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(*m_data, addr, COMW(RDMEM_W(*m_data, addr)));
}
/******************************************
@@ -3373,7 +3446,7 @@ void z8002_device::Z4D_0000_0001_addr_imm16()
{
GET_ADDR(OP1);
GET_IMM16(OP2);
- CPW(RDMEM_W(AS_DATA, addr), imm16);
+ CPW(RDMEM_W(*m_data, addr), imm16);
}
/******************************************
@@ -3383,7 +3456,7 @@ void z8002_device::Z4D_0000_0001_addr_imm16()
void z8002_device::Z4D_0000_0010_addr()
{
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, NEGW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(*m_data, addr, NEGW(RDMEM_W(*m_data, addr)));
}
/******************************************
@@ -3393,7 +3466,7 @@ void z8002_device::Z4D_0000_0010_addr()
void z8002_device::Z4D_0000_0100_addr()
{
GET_ADDR(OP1);
- TESTW(RDMEM_W(AS_DATA, addr));
+ TESTW(RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3404,7 +3477,7 @@ void z8002_device::Z4D_0000_0101_addr_imm16()
{
GET_ADDR(OP1);
GET_IMM16(OP2);
- WRMEM_W(AS_DATA, addr, imm16);
+ WRMEM_W(*m_data, addr, imm16);
}
/******************************************
@@ -3414,8 +3487,8 @@ void z8002_device::Z4D_0000_0101_addr_imm16()
void z8002_device::Z4D_0000_0110_addr()
{
GET_ADDR(OP1);
- if (RDMEM_W(AS_DATA, addr) & S16) SET_S; else CLR_S;
- WRMEM_W(AS_DATA, addr, 0xffff);
+ if (RDMEM_W(*m_data, addr) & S16) SET_S; else CLR_S;
+ WRMEM_W(*m_data, addr, 0xffff);
}
/******************************************
@@ -3425,7 +3498,7 @@ void z8002_device::Z4D_0000_0110_addr()
void z8002_device::Z4D_0000_1000_addr()
{
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, 0);
+ WRMEM_W(*m_data, addr, 0);
}
/******************************************
@@ -3437,7 +3510,7 @@ void z8002_device::Z4D_ddN0_0000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, COMW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(*m_data, addr, COMW(RDMEM_W(*m_data, addr)));
}
/******************************************
@@ -3450,7 +3523,7 @@ void z8002_device::Z4D_ddN0_0001_addr_imm16()
GET_ADDR(OP1);
GET_IMM16(OP2);
addr = addr_add(addr, RW(dst));
- CPW(RDMEM_W(AS_DATA, addr), imm16);
+ CPW(RDMEM_W(*m_data, addr), imm16);
}
/******************************************
@@ -3462,7 +3535,7 @@ void z8002_device::Z4D_ddN0_0010_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, NEGW(RDMEM_W(AS_DATA, addr)));
+ WRMEM_W(*m_data, addr, NEGW(RDMEM_W(*m_data, addr)));
}
/******************************************
@@ -3474,7 +3547,7 @@ void z8002_device::Z4D_ddN0_0100_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTW(RDMEM_W(AS_DATA, addr));
+ TESTW(RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3487,7 +3560,7 @@ void z8002_device::Z4D_ddN0_0101_addr_imm16()
GET_ADDR(OP1);
GET_IMM16(OP2);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, imm16);
+ WRMEM_W(*m_data, addr, imm16);
}
/******************************************
@@ -3499,8 +3572,8 @@ void z8002_device::Z4D_ddN0_0110_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_W(AS_DATA, addr) & S16) SET_S; else CLR_S;
- WRMEM_W(AS_DATA, addr, 0xffff);
+ if (RDMEM_W(*m_data, addr) & S16) SET_S; else CLR_S;
+ WRMEM_W(*m_data, addr, 0xffff);
}
/******************************************
@@ -3512,7 +3585,7 @@ void z8002_device::Z4D_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, 0);
+ WRMEM_W(*m_data, addr, 0);
}
/******************************************
@@ -3525,7 +3598,7 @@ void z8002_device::Z4E_ddN0_ssN0_addr()
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, RB(src));
+ WRMEM_B(*m_data, addr, RB(src));
}
/******************************************
@@ -3536,7 +3609,7 @@ void z8002_device::Z50_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- CPL(RL(dst), RDMEM_L(AS_DATA, addr));
+ CPL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3549,7 +3622,7 @@ void z8002_device::Z50_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- CPL(RL(dst), RDMEM_L(AS_DATA, addr));
+ CPL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3560,7 +3633,7 @@ void z8002_device::Z51_ddN0_0000_addr()
{
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
- PUSHL(dst, RDMEM_L(AS_DATA, addr));
+ PUSHL(dst, RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3573,7 +3646,7 @@ void z8002_device::Z51_ddN0_ssN0_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- PUSHL(dst, RDMEM_L(AS_DATA, addr));
+ PUSHL(dst, RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3584,7 +3657,7 @@ void z8002_device::Z52_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = SUBL(RL(dst), RDMEM_L(AS_DATA, addr));
+ RL(dst) = SUBL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3597,7 +3670,7 @@ void z8002_device::Z52_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = SUBL(RL(dst), RDMEM_L(AS_DATA, addr));
+ RL(dst) = SUBL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3608,7 +3681,7 @@ void z8002_device::Z53_ddN0_0000_addr()
{
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
- PUSHW(dst, RDMEM_W(AS_DATA, addr));
+ PUSHW(dst, RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3621,7 +3694,7 @@ void z8002_device::Z53_ddN0_ssN0_addr()
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- PUSHW(dst, RDMEM_W(AS_DATA, addr));
+ PUSHW(dst, RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3632,7 +3705,7 @@ void z8002_device::Z54_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = RDMEM_L(AS_DATA, addr);
+ RL(dst) = RDMEM_L(*m_data, addr);
}
/******************************************
@@ -3645,7 +3718,7 @@ void z8002_device::Z54_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = RDMEM_L(AS_DATA, addr);
+ RL(dst) = RDMEM_L(*m_data, addr);
}
/******************************************
@@ -3656,7 +3729,7 @@ void z8002_device::Z55_ssN0_0000_addr()
{
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
- WRMEM_L(AS_DATA, addr, POPL(src));
+ WRMEM_L(*m_data, addr, POPL(src));
}
/******************************************
@@ -3669,7 +3742,7 @@ void z8002_device::Z55_ssN0_ddN0_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_L(AS_DATA, addr, POPL(src));
+ WRMEM_L(*m_data, addr, POPL(src));
}
/******************************************
@@ -3680,7 +3753,7 @@ void z8002_device::Z56_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = ADDL(RL(dst), RDMEM_L(AS_DATA, addr));
+ RL(dst) = ADDL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3693,7 +3766,7 @@ void z8002_device::Z56_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = ADDL(RL(dst), RDMEM_L(AS_DATA, addr));
+ RL(dst) = ADDL(RL(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3704,7 +3777,7 @@ void z8002_device::Z57_ssN0_0000_addr()
{
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, POPW(src));
+ WRMEM_W(*m_data, addr, POPW(src));
}
/******************************************
@@ -3717,7 +3790,7 @@ void z8002_device::Z57_ssN0_ddN0_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, POPW(src));
+ WRMEM_W(*m_data, addr, POPW(src));
}
/******************************************
@@ -3728,7 +3801,7 @@ void z8002_device::Z58_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RQ(dst) = MULTL(RQ(dst), RDMEM_L(AS_DATA, addr));
+ RQ(dst) = MULTL(RQ(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3741,7 +3814,7 @@ void z8002_device::Z58_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RQ(dst) = MULTL(RQ(dst), RDMEM_L(AS_DATA, addr));
+ RQ(dst) = MULTL(RQ(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3752,7 +3825,7 @@ void z8002_device::Z59_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = MULTW(RL(dst), RDMEM_W(AS_DATA, addr));
+ RL(dst) = MULTW(RL(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3765,7 +3838,7 @@ void z8002_device::Z59_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = MULTW(RL(dst), RDMEM_W(AS_DATA, addr));
+ RL(dst) = MULTW(RL(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3776,7 +3849,7 @@ void z8002_device::Z5A_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RQ(dst) = DIVL(RQ(dst), RDMEM_L(AS_DATA, addr));
+ RQ(dst) = DIVL(RQ(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3789,7 +3862,7 @@ void z8002_device::Z5A_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RQ(dst) = DIVL(RQ(dst), RDMEM_L(AS_DATA, addr));
+ RQ(dst) = DIVL(RQ(dst), RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3800,7 +3873,7 @@ void z8002_device::Z5B_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RL(dst) = DIVW(RL(dst), RDMEM_W(AS_DATA, addr));
+ RL(dst) = DIVW(RL(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3813,7 +3886,7 @@ void z8002_device::Z5B_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RL(dst) = DIVW(RL(dst), RDMEM_W(AS_DATA, addr));
+ RL(dst) = DIVW(RL(dst), RDMEM_W(*m_data, addr));
}
/******************************************
@@ -3826,7 +3899,7 @@ void z8002_device::Z5C_0000_0001_0000_dddd_0000_nmin1_addr()
GET_CNT(OP1,NIB3);
GET_ADDR(OP2);
while (cnt-- >= 0) {
- RW(dst) = RDMEM_W(AS_DATA, addr);
+ RW(dst) = RDMEM_W(*m_data, addr);
dst = (dst+1) & 15;
addr = addr_add (addr, 2);
}
@@ -3839,7 +3912,7 @@ void z8002_device::Z5C_0000_0001_0000_dddd_0000_nmin1_addr()
void z8002_device::Z5C_0000_1000_addr()
{
GET_ADDR(OP1);
- TESTL(RDMEM_L(AS_DATA, addr));
+ TESTL(RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3852,7 +3925,7 @@ void z8002_device::Z5C_0000_1001_0000_ssss_0000_nmin1_addr()
GET_CNT(OP1,NIB3);
GET_ADDR(OP2);
while (cnt-- >= 0) {
- WRMEM_W(AS_DATA, addr, RW(src));
+ WRMEM_W(*m_data, addr, RW(src));
src = (src+1) & 15;
addr = addr_add (addr, 2);
}
@@ -3867,7 +3940,7 @@ void z8002_device::Z5C_ddN0_1000_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- TESTL(RDMEM_L(AS_DATA, addr));
+ TESTL(RDMEM_L(*m_data, addr));
}
/******************************************
@@ -3882,7 +3955,7 @@ void z8002_device::Z5C_ddN0_1001_0000_ssN0_0000_nmin1_addr()
GET_ADDR(OP2);
addr = addr_add(addr, RW(dst));
while (cnt-- >= 0) {
- WRMEM_W(AS_DATA, addr, RW(src));
+ WRMEM_W(*m_data, addr, RW(src));
src = (src+1) & 15;
addr = addr_add(addr, 2);
}
@@ -3900,7 +3973,7 @@ void z8002_device::Z5C_ssN0_0001_0000_dddd_0000_nmin1_addr()
GET_ADDR(OP2);
addr = addr_add(addr, RW(src));
while (cnt-- >= 0) {
- RW(dst) = RDMEM_W(AS_DATA, addr);
+ RW(dst) = RDMEM_W(*m_data, addr);
dst = (dst+1) & 15;
addr = addr_add(addr, 2);
}
@@ -3914,7 +3987,7 @@ void z8002_device::Z5D_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_L(AS_DATA, addr, RL(src));
+ WRMEM_L(*m_data, addr, RL(src));
}
/******************************************
@@ -3927,7 +4000,7 @@ void z8002_device::Z5D_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_L(AS_DATA, addr, RL(src));
+ WRMEM_L(*m_data, addr, RL(src));
}
/******************************************
@@ -4026,7 +4099,7 @@ void z8002_device::Z60_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RB(dst) = RDMEM_B(AS_DATA, addr);
+ RB(dst) = RDMEM_B(*m_data, addr);
}
/******************************************
@@ -4039,7 +4112,7 @@ void z8002_device::Z60_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RB(dst) = RDMEM_B(AS_DATA, addr);
+ RB(dst) = RDMEM_B(*m_data, addr);
}
/******************************************
@@ -4050,7 +4123,7 @@ void z8002_device::Z61_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- RW(dst) = RDMEM_W(AS_DATA, addr);
+ RW(dst) = RDMEM_W(*m_data, addr);
}
/******************************************
@@ -4063,7 +4136,7 @@ void z8002_device::Z61_ssN0_dddd_addr()
GET_SRC(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(src));
- RW(dst) = RDMEM_W(AS_DATA, addr);
+ RW(dst) = RDMEM_W(*m_data, addr);
}
/******************************************
@@ -4074,7 +4147,7 @@ void z8002_device::Z62_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) & ~bit);
+ WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) & ~bit);
}
/******************************************
@@ -4087,7 +4160,7 @@ void z8002_device::Z62_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) & ~bit);
+ WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) & ~bit);
}
/******************************************
@@ -4098,7 +4171,7 @@ void z8002_device::Z63_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) & ~bit);
+ WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) & ~bit);
}
/******************************************
@@ -4111,7 +4184,7 @@ void z8002_device::Z63_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) & ~bit);
+ WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) & ~bit);
}
/******************************************
@@ -4122,7 +4195,7 @@ void z8002_device::Z64_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) | bit);
+ WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) | bit);
}
/******************************************
@@ -4135,7 +4208,7 @@ void z8002_device::Z64_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, RDMEM_B(AS_DATA, addr) | bit);
+ WRMEM_B(*m_data, addr, RDMEM_B(*m_data, addr) | bit);
}
/******************************************
@@ -4146,7 +4219,7 @@ void z8002_device::Z65_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) | bit);
+ WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) | bit);
}
/******************************************
@@ -4159,7 +4232,7 @@ void z8002_device::Z65_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, RDMEM_W(AS_DATA, addr) | bit);
+ WRMEM_W(*m_data, addr, RDMEM_W(*m_data, addr) | bit);
}
/******************************************
@@ -4170,7 +4243,7 @@ void z8002_device::Z66_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- if (RDMEM_B(AS_DATA, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_B(*m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4183,7 +4256,7 @@ void z8002_device::Z66_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_B(AS_DATA, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_B(*m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4194,7 +4267,7 @@ void z8002_device::Z67_0000_imm4_addr()
{
GET_BIT(OP0);
GET_ADDR(OP1);
- if (RDMEM_W(AS_DATA, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_W(*m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4207,7 +4280,7 @@ void z8002_device::Z67_ddN0_imm4_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- if (RDMEM_W(AS_DATA, addr) & bit) CLR_Z; else SET_Z;
+ if (RDMEM_W(*m_data, addr) & bit) CLR_Z; else SET_Z;
}
/******************************************
@@ -4218,7 +4291,7 @@ void z8002_device::Z68_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, INCB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(*m_data, addr, INCB(RDMEM_B(*m_data, addr), i4p1));
}
/******************************************
@@ -4231,7 +4304,7 @@ void z8002_device::Z68_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, INCB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(*m_data, addr, INCB(RDMEM_B(*m_data, addr), i4p1));
}
/******************************************
@@ -4242,7 +4315,7 @@ void z8002_device::Z69_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, INCW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(*m_data, addr, INCW(RDMEM_W(*m_data, addr), i4p1));
}
/******************************************
@@ -4255,7 +4328,7 @@ void z8002_device::Z69_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, INCW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(*m_data, addr, INCW(RDMEM_W(*m_data, addr), i4p1));
}
/******************************************
@@ -4266,7 +4339,7 @@ void z8002_device::Z6A_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, DECB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(*m_data, addr, DECB(RDMEM_B(*m_data, addr), i4p1));
}
/******************************************
@@ -4279,7 +4352,7 @@ void z8002_device::Z6A_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, DECB(RDMEM_B(AS_DATA, addr), i4p1));
+ WRMEM_B(*m_data, addr, DECB(RDMEM_B(*m_data, addr), i4p1));
}
/******************************************
@@ -4290,7 +4363,7 @@ void z8002_device::Z6B_0000_imm4m1_addr()
{
GET_I4M1(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, DECW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(*m_data, addr, DECW(RDMEM_W(*m_data, addr), i4p1));
}
/******************************************
@@ -4303,7 +4376,7 @@ void z8002_device::Z6B_ddN0_imm4m1_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, DECW(RDMEM_W(AS_DATA, addr), i4p1));
+ WRMEM_W(*m_data, addr, DECW(RDMEM_W(*m_data, addr), i4p1));
}
/******************************************
@@ -4314,8 +4387,8 @@ void z8002_device::Z6C_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- uint8_t tmp = RDMEM_B(AS_DATA, addr);
- WRMEM_B(AS_DATA, addr, RB(dst));
+ uint8_t tmp = RDMEM_B(*m_data, addr);
+ WRMEM_B(*m_data, addr, RB(dst));
RB(dst) = tmp;
}
@@ -4330,8 +4403,8 @@ void z8002_device::Z6C_ssN0_dddd_addr()
GET_ADDR(OP1);
uint8_t tmp;
addr = addr_add(addr, RW(src));
- tmp = RDMEM_B(AS_DATA, addr);
- WRMEM_B(AS_DATA, addr, RB(dst));
+ tmp = RDMEM_B(*m_data, addr);
+ WRMEM_B(*m_data, addr, RB(dst));
RB(dst) = tmp;
}
@@ -4343,8 +4416,8 @@ void z8002_device::Z6D_0000_dddd_addr()
{
GET_DST(OP0,NIB3);
GET_ADDR(OP1);
- uint16_t tmp = RDMEM_W(AS_DATA, addr);
- WRMEM_W(AS_DATA, addr, RW(dst));
+ uint16_t tmp = RDMEM_W(*m_data, addr);
+ WRMEM_W(*m_data, addr, RW(dst));
RW(dst) = tmp;
}
@@ -4359,8 +4432,8 @@ void z8002_device::Z6D_ssN0_dddd_addr()
GET_ADDR(OP1);
uint16_t tmp;
addr = addr_add(addr, RW(src));
- tmp = RDMEM_W(AS_DATA, addr);
- WRMEM_W(AS_DATA, addr, RW(dst));
+ tmp = RDMEM_W(*m_data, addr);
+ WRMEM_W(*m_data, addr, RW(dst));
RW(dst) = tmp;
}
@@ -4372,7 +4445,7 @@ void z8002_device::Z6E_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_B(AS_DATA, addr, RB(src));
+ WRMEM_B(*m_data, addr, RB(src));
}
/******************************************
@@ -4385,7 +4458,7 @@ void z8002_device::Z6E_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_B(AS_DATA, addr, RB(src));
+ WRMEM_B(*m_data, addr, RB(src));
}
/******************************************
@@ -4396,7 +4469,7 @@ void z8002_device::Z6F_0000_ssss_addr()
{
GET_SRC(OP0,NIB3);
GET_ADDR(OP1);
- WRMEM_W(AS_DATA, addr, RW(src));
+ WRMEM_W(*m_data, addr, RW(src));
}
/******************************************
@@ -4409,7 +4482,7 @@ void z8002_device::Z6F_ddN0_ssss_addr()
GET_DST(OP0,NIB2);
GET_ADDR(OP1);
addr = addr_add(addr, RW(dst));
- WRMEM_W(AS_DATA, addr, RW(src));
+ WRMEM_W(*m_data, addr, RW(src));
}
/******************************************
@@ -4421,7 +4494,7 @@ void z8002_device::Z70_ssN0_dddd_0000_xxxx_0000_0000()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX(OP1,NIB1);
- RB(dst) = RDMEM_B(AS_DATA, addr_add(addr_from_reg(src), RW(idx)));
+ RB(dst) = RDBX_B(src, RW(idx));
}
/******************************************
@@ -4433,7 +4506,7 @@ void z8002_device::Z71_ssN0_dddd_0000_xxxx_0000_0000()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX(OP1,NIB1);
- RW(dst) = RDMEM_W(AS_DATA, addr_add(addr_from_reg(src), RW(idx)));
+ RW(dst) = RDBX_W(src, RW(idx));
}
/******************************************
@@ -4445,7 +4518,7 @@ void z8002_device::Z72_ddN0_ssss_0000_xxxx_0000_0000()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX(OP1,NIB1);
- WRMEM_B(AS_DATA, addr_add(addr_from_reg(dst), RW(idx)), RB(src));
+ WRBX_B(dst, RW(idx), RB(src));
}
/******************************************
@@ -4457,7 +4530,7 @@ void z8002_device::Z73_ddN0_ssss_0000_xxxx_0000_0000()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX(OP1,NIB1);
- WRMEM_W(AS_DATA, addr_add(addr_from_reg(dst), RW(idx)), RW(src));
+ WRBX_W(dst, RW(idx), RW(src));
}
/******************************************
@@ -4487,7 +4560,7 @@ void z8002_device::Z75_ssN0_dddd_0000_xxxx_0000_0000()
GET_DST(OP0,NIB3);
GET_SRC(OP0,NIB2);
GET_IDX(OP1,NIB1);
- RL(dst) = RDMEM_L(AS_DATA, addr_add(addr_from_reg(src), RW(idx)));
+ RL(dst) = RDBX_L(src, RW(idx));
}
/******************************************
@@ -4534,7 +4607,7 @@ void z8002_device::Z77_ddN0_ssss_0000_xxxx_0000_0000()
GET_SRC(OP0,NIB3);
GET_DST(OP0,NIB2);
GET_IDX(OP1,NIB1);
- WRMEM_L(AS_DATA, addr_add(addr_from_reg(dst), RW(idx)), RL(src));
+ WRBX_L(dst, RW(idx), RL(src));
}
/******************************************
@@ -4561,12 +4634,12 @@ void z8002_device::Z79_0000_0000_addr()
GET_ADDR(OP1);
uint16_t fcw;
if (get_segmented_mode()) {
- fcw = RDMEM_W(AS_DATA, addr + 2);
- set_pc(segmented_addr(RDMEM_L(AS_DATA, addr + 4)));
+ fcw = RDMEM_W(*m_data, addr + 2);
+ set_pc(segmented_addr(RDMEM_L(*m_data, addr + 4)));
}
else {
- fcw = RDMEM_W(AS_DATA, addr);
- set_pc(RDMEM_W(AS_DATA, (uint16_t)(addr + 2)));
+ fcw = RDMEM_W(*m_data, addr);
+ set_pc(RDMEM_W(*m_data, (uint16_t)(addr + 2)));
}
CHANGE_FCW(fcw); /* check for user/system mode change */
}
@@ -4583,12 +4656,12 @@ void z8002_device::Z79_ssN0_0000_addr()
uint16_t fcw;
addr = addr_add(addr, RW(src));
if (get_segmented_mode()) {
- fcw = RDMEM_W(AS_DATA, addr + 2);
- set_pc(segmented_addr(RDMEM_L(AS_DATA, addr + 4)));
+ fcw = RDMEM_W(*m_data, addr + 2);
+ set_pc(segmented_addr(RDMEM_L(*m_data, addr + 4)));
}
else {
- fcw = RDMEM_W(AS_DATA, addr);
- m_pc = RDMEM_W(AS_DATA, (uint16_t)(addr + 2));
+ fcw = RDMEM_W(*m_data, addr);
+ m_pc = RDMEM_W(*m_data, (uint16_t)(addr + 2));
}
if ((fcw ^ m_fcw) & F_SEG) printf("ldps 3 (0x%05x): changing from %ssegmented mode to %ssegmented mode\n", m_pc, (fcw & F_SEG) ? "non-" : "", (fcw & F_SEG) ? "" : "non-");
CHANGE_FCW(fcw); /* check for user/system mode change */
@@ -5915,7 +5988,7 @@ void z8002_device::ZB8_ddN0_0010_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
+ uint8_t xlt = RDBX_B(src, RDIR_B(dst));
RB(1) = xlt; /* load RH1 */
if (xlt) CLR_Z; else SET_Z;
add_to_addr_reg(dst, 1);
@@ -5931,7 +6004,7 @@ void z8002_device::ZB8_ddN0_0110_0000_rrrr_ssN0_1110()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
+ uint8_t xlt = RDBX_B(src, RDIR_B(dst));
RB(1) = xlt; /* load RH1 */
if (xlt) CLR_Z; else SET_Z;
add_to_addr_reg(dst, 1);
@@ -5952,7 +6025,7 @@ void z8002_device::ZB8_ddN0_1010_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
+ uint8_t xlt = RDBX_B(src, RDIR_B(dst));
RB(1) = xlt; /* load RH1 */
if (xlt) CLR_Z; else SET_Z;
sub_from_addr_reg(dst, 1);
@@ -5968,7 +6041,7 @@ void z8002_device::ZB8_ddN0_1110_0000_rrrr_ssN0_1110()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
+ uint8_t xlt = RDBX_B(src, RDIR_B(dst));
RB(1) = xlt; /* load RH1 */
if (xlt) CLR_Z; else SET_Z;
sub_from_addr_reg(dst, 1);
@@ -5989,8 +6062,10 @@ void z8002_device::ZB8_ddN0_0000_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
- WRMEM_B(AS_DATA, addr_from_reg(dst), xlt);
+ address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ uint32_t dstaddr = addr_from_reg(dst);
+ uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
+ WRMEM_B(dstspace, dstaddr, xlt);
RB(1) = xlt; /* destroy RH1 */
add_to_addr_reg(dst, 1);
if (--RW(cnt)) CLR_V; else SET_V;
@@ -6005,8 +6080,10 @@ void z8002_device::ZB8_ddN0_0100_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
- WRMEM_B(AS_DATA, addr_from_reg(dst), xlt);
+ address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ uint32_t dstaddr = addr_from_reg(dst);
+ uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
+ WRMEM_B(dstspace, dstaddr, xlt);
RB(1) = xlt; /* destroy RH1 */
add_to_addr_reg(dst, 1);
if (--RW(cnt)) { CLR_V; m_pc -= 4; } else SET_V;
@@ -6021,8 +6098,10 @@ void z8002_device::ZB8_ddN0_1000_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
- WRMEM_B(AS_DATA, addr_from_reg(dst), xlt);
+ address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ uint32_t dstaddr = addr_from_reg(dst);
+ uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
+ WRMEM_B(dstspace, dstaddr, xlt);
RB(1) = xlt; /* destroy RH1 */
sub_from_addr_reg(dst, 1);
if (--RW(cnt)) CLR_V; else SET_V;
@@ -6037,8 +6116,10 @@ void z8002_device::ZB8_ddN0_1100_0000_rrrr_ssN0_0000()
GET_DST(OP0,NIB2);
GET_SRC(OP1,NIB2);
GET_CNT(OP1,NIB1);
- uint8_t xlt = RDMEM_B(AS_DATA, addr_from_reg(src) + RDMEM_B(AS_DATA, addr_from_reg(dst)));
- WRMEM_B(AS_DATA, addr_from_reg(dst), xlt);
+ address_space &dstspace = dst == SP ? *m_stack : *m_data;
+ uint32_t dstaddr = addr_from_reg(dst);
+ uint8_t xlt = RDBX_B(src, RDMEM_B(dstspace, dstaddr));
+ WRMEM_B(dstspace, dstaddr, xlt);
RB(1) = xlt; /* destroy RH1 */
sub_from_addr_reg(dst, 1);
if (--RW(cnt)) { CLR_V; m_pc -= 4; } else SET_V;
@@ -6069,7 +6150,7 @@ void z8002_device::ZBA_ssN0_0000_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RB(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6103,7 +6184,7 @@ void z8002_device::ZBA_ssN0_0001_0000_rrrr_ddN0_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3); /* repeat? */
- WRMEM_B(AS_DATA, addr_from_reg(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ WRIR_B(dst, RDIR_B(src));
add_to_addr_reg(src, 1);
add_to_addr_reg(dst, 1);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -6119,7 +6200,7 @@ void z8002_device::ZBA_ssN0_0010_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RDMEM_B(AS_DATA, addr_from_reg(dst)), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RDIR_B(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6153,7 +6234,7 @@ void z8002_device::ZBA_ssN0_0100_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RB(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6186,7 +6267,7 @@ void z8002_device::ZBA_ssN0_0110_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RDMEM_B(AS_DATA, addr_from_reg(dst)), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RDIR_B(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6220,7 +6301,7 @@ void z8002_device::ZBA_ssN0_1000_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RB(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6254,7 +6335,7 @@ void z8002_device::ZBA_ssN0_1001_0000_rrrr_ddN0_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_B(AS_DATA, addr_from_reg(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ WRIR_B(dst, RDIR_B(src));
sub_from_addr_reg(src, 1);
sub_from_addr_reg(dst, 1);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -6270,7 +6351,7 @@ void z8002_device::ZBA_ssN0_1010_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RDMEM_B(AS_DATA, addr_from_reg(dst)), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RDIR_B(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6304,7 +6385,7 @@ void z8002_device::ZBA_ssN0_1100_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RB(dst), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RB(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6337,7 +6418,7 @@ void z8002_device::ZBA_ssN0_1110_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPB(RDMEM_B(AS_DATA, addr_from_reg(dst)), RDMEM_B(AS_DATA, addr_from_reg(src)));
+ CPB(RDIR_B(dst), RDIR_B(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6371,7 +6452,7 @@ void z8002_device::ZBB_ssN0_0000_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RW(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6405,7 +6486,7 @@ void z8002_device::ZBB_ssN0_0001_0000_rrrr_ddN0_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, addr_from_reg(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ WRIR_W(dst, RDIR_W(src));
add_to_addr_reg(src, 2);
add_to_addr_reg(dst, 2);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -6421,7 +6502,7 @@ void z8002_device::ZBB_ssN0_0010_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RDMEM_W(AS_DATA, addr_from_reg(dst)), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RDIR_W(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6455,7 +6536,7 @@ void z8002_device::ZBB_ssN0_0100_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RW(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6488,7 +6569,7 @@ void z8002_device::ZBB_ssN0_0110_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RDMEM_W(AS_DATA, addr_from_reg(dst)), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RDIR_W(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6522,7 +6603,7 @@ void z8002_device::ZBB_ssN0_1000_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RW(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6556,7 +6637,7 @@ void z8002_device::ZBB_ssN0_1001_0000_rrrr_ddN0_x000()
GET_CNT(OP1,NIB1);
GET_DST(OP1,NIB2);
GET_CCC(OP1,NIB3);
- WRMEM_W(AS_DATA, addr_from_reg(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ WRIR_W(dst, RDIR_W(src));
sub_from_addr_reg(src, 2);
sub_from_addr_reg(dst, 2);
if (--RW(cnt)) { CLR_V; if (cc == 0) m_pc -= 4; } else SET_V;
@@ -6572,7 +6653,7 @@ void z8002_device::ZBB_ssN0_1010_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RDMEM_W(AS_DATA, addr_from_reg(dst)), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RDIR_W(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6606,7 +6687,7 @@ void z8002_device::ZBB_ssN0_1100_0000_rrrr_dddd_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RW(dst), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RW(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
@@ -6639,7 +6720,7 @@ void z8002_device::ZBB_ssN0_1110_0000_rrrr_ddN0_cccc()
GET_CCC(OP1,NIB3);
GET_DST(OP1,NIB2);
GET_CNT(OP1,NIB1);
- CPW(RDMEM_W(AS_DATA, addr_from_reg(dst)), RDMEM_W(AS_DATA, addr_from_reg(src)));
+ CPW(RDIR_W(dst), RDIR_W(src));
switch (cc) {
case 0: if (CC0) SET_Z; else CLR_Z; break;
case 1: if (CC1) SET_Z; else CLR_Z; break;
diff --git a/src/devices/machine/i82355.cpp b/src/devices/machine/i82355.cpp
index d37d44d2ebe..18741710489 100644
--- a/src/devices/machine/i82355.cpp
+++ b/src/devices/machine/i82355.cpp
@@ -280,13 +280,12 @@ void i82355_device::global_config(u8 data)
void i82355_device::identify_board()
{
- logerror("%s: Board identified as %c%c%c (%04X) product %02X.%02X\n", machine().describe_context(),
+ // Use standard format for naming .CFG and .OVL files
+ logerror("%s: EISA board identified as %c%c%c%04X\n", machine().describe_context(),
((m_id.w.h & 0x7c00) >> 10) + 'A' - 1,
((m_id.w.h & 0x03e0) >> 5) + 'A' - 1,
(m_id.w.h & 0x001f) + 'A' - 1,
- m_id.w.h,
- m_id.b.h,
- m_id.b.l);
+ m_id.w.l);
}
diff --git a/src/devices/machine/nscsi_cd.cpp b/src/devices/machine/nscsi_cd.cpp
index b58a179161a..ebfa49f1cae 100644
--- a/src/devices/machine/nscsi_cd.cpp
+++ b/src/devices/machine/nscsi_cd.cpp
@@ -14,6 +14,7 @@ DEFINE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device, "nxm5301sun
DEFINE_DEVICE_TYPE(NSCSI_XM5401SUN, nscsi_toshiba_xm5401_sun_device, "nxm5401sun", "XM-5401B Sun 4x CD-ROM (New)")
DEFINE_DEVICE_TYPE(NSCSI_XM5701, nscsi_toshiba_xm5701_device, "nxm5701", "XM-5701B 12x CD-ROM (New)")
DEFINE_DEVICE_TYPE(NSCSI_XM5701SUN, nscsi_toshiba_xm5701_sun_device, "nxm5701sun", "XM-5701B Sun 12x CD-ROM (New)")
+DEFINE_DEVICE_TYPE(NSCSI_CDROM_APPLE, nscsi_cdrom_apple_device, "scsi_cdrom_apple", "Apple SCSI CD-ROM")
nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
nscsi_cdrom_device(mconfig, NSCSI_CDROM, tag, owner, "Sony", "CDU-76S", "1.0", 0x00, 0x05)
@@ -55,6 +56,11 @@ nscsi_toshiba_xm5701_sun_device::nscsi_toshiba_xm5701_sun_device(const machine_c
{
}
+nscsi_cdrom_apple_device::nscsi_cdrom_apple_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ nscsi_cdrom_device(mconfig, NSCSI_CDROM_APPLE, tag, owner, "Sony", "CDU-76S", "1.0", 0x00, 0x05)
+{
+}
+
nscsi_cdrom_device::nscsi_cdrom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: nscsi_full_device(mconfig, type, tag, owner, clock)
, cdrom(nullptr)
@@ -624,3 +630,30 @@ bool nscsi_cdrom_sgi_device::scsi_command_done(uint8_t command, uint8_t length)
return nscsi_full_device::scsi_command_done(command, length);
}
}
+/*
+ The Apple II SCSI Card firmware demands that ASC on a failing TEST_UNIT_READY be either 0x28 or 0xb0.
+ 0x28 is MEDIA_CHANGED, 0xb0 is vendor-specific. If the drive returns the normal 0x3A for disc-not-present,
+ the firmware assumes the drive is broken and retries the TEST_UNIT_READY for 60 seconds before giving up
+ and booting the machine.
+*/
+void nscsi_cdrom_apple_device::scsi_command()
+{
+ switch (scsi_cmdbuf[0]) {
+ case SC_TEST_UNIT_READY:
+ LOG("command TEST UNIT READY (AppleCD)\n");
+ if(cdrom)
+ {
+ scsi_status_complete(SS_GOOD);
+ }
+ else
+ {
+ sense(false, SK_NOT_READY, 0xb0);
+ scsi_status_complete(SS_CHECK_CONDITION);
+ }
+ break;
+
+ default:
+ nscsi_cdrom_device::scsi_command();
+ break;
+ }
+}
diff --git a/src/devices/machine/nscsi_cd.h b/src/devices/machine/nscsi_cd.h
index 48097cea42f..9f10e52023a 100644
--- a/src/devices/machine/nscsi_cd.h
+++ b/src/devices/machine/nscsi_cd.h
@@ -37,11 +37,12 @@ protected:
virtual uint8_t scsi_get_data(int id, int pos) override;
virtual void scsi_put_data(int buf, int offset, uint8_t data) override;
+ cdrom_file *cdrom;
+
private:
static constexpr uint32_t bytes_per_sector = 2048;
uint8_t sector_buffer[bytes_per_sector];
- cdrom_file *cdrom;
uint32_t bytes_per_block;
int lba, cur_sector;
required_device<cdrom_image_device> image;
@@ -103,6 +104,15 @@ public:
nscsi_toshiba_xm5701_sun_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
};
+class nscsi_cdrom_apple_device : public nscsi_cdrom_device
+{
+public:
+ nscsi_cdrom_apple_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
+
+protected:
+ virtual void scsi_command() override;
+};
+
DECLARE_DEVICE_TYPE(NSCSI_CDROM, nscsi_cdrom_device)
DECLARE_DEVICE_TYPE(NSCSI_CDROM_SGI, nscsi_cdrom_sgi_device)
DECLARE_DEVICE_TYPE(NSCSI_RRD45, nscsi_dec_rrd45_device)
@@ -111,5 +121,6 @@ DECLARE_DEVICE_TYPE(NSCSI_XM5301SUN, nscsi_toshiba_xm5301_sun_device)
DECLARE_DEVICE_TYPE(NSCSI_XM5401SUN, nscsi_toshiba_xm5401_sun_device)
DECLARE_DEVICE_TYPE(NSCSI_XM5701, nscsi_toshiba_xm5701_device)
DECLARE_DEVICE_TYPE(NSCSI_XM5701SUN, nscsi_toshiba_xm5701_sun_device)
+DECLARE_DEVICE_TYPE(NSCSI_CDROM_APPLE, nscsi_cdrom_apple_device)
#endif // MAME_MACHINE_NSCSI_CD_H
diff --git a/src/devices/machine/sunplus_gcm394.cpp b/src/devices/machine/sunplus_gcm394.cpp
index 5e6061582b5..f63d69e9bcf 100644
--- a/src/devices/machine/sunplus_gcm394.cpp
+++ b/src/devices/machine/sunplus_gcm394.cpp
@@ -136,7 +136,7 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7824_w) { LOGMASKED(LOG_GCM39
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7835_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7835_w %04x\n", machine().describe_context(), data); m_7835 = data; }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7860_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7860_r\n", machine().describe_context()); return m_7860; }
+READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7860_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7860_r\n", machine().describe_context()); return m_porta_in(); }
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7860_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7860_w %04x\n", machine().describe_context(), data); m_7860 = data; }
READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7861_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7861_r\n", machine().describe_context()); return m_7861; }
@@ -181,10 +181,19 @@ WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_78f0_w) { LOGMASKED(LOG_GCM39
// **************************************** 79xx region stubs *************************************************
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7934_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7934_r\n", machine().describe_context()); return m_7934; }
+READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7934_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7934_r\n", machine().describe_context()); return 0x0000; }
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7934_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7934_w %04x\n", machine().describe_context(), data); m_7934 = data; }
-READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7936_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7936_r\n", machine().describe_context()); return m_7936; }
+// value of 7935 is read then written in irq6, nothing happens unless bit 0x0100 was set, which could be some kind of irq source being acked?
+READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7935_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7935_r\n", machine().describe_context()); return m_7935; }
+WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7935_w)
+{
+ LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7935_w %04x\n", machine().describe_context(), data);
+ m_7935 &= ~data;
+ checkirq6();
+}
+
+READ16_MEMBER(sunplus_gcm394_base_device::unkarea_7936_r) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7936_r\n", machine().describe_context()); return 0x0000; }
WRITE16_MEMBER(sunplus_gcm394_base_device::unkarea_7936_w) { LOGMASKED(LOG_GCM394, "%s:sunplus_gcm394_base_device::unkarea_7936_w %04x\n", machine().describe_context(), data); m_7936 = data; }
// **************************************** fallthrough logger etc. *************************************************
@@ -276,7 +285,8 @@ void sunplus_gcm394_base_device::map(address_map &map)
// 73xx-77xx = ram areas?
// ######################################################################################################################################################################################
- map(0x007300, 0x0073ff).ram().w("palette", FUNC(palette_device::write16)).share("palette");
+ map(0x007300, 0x0073ff).rw(m_spg_video, FUNC(gcm394_base_video_device::palette_r), FUNC(gcm394_base_video_device::palette_w));
+
map(0x007400, 0x0077ff).ram().share("spriteram");
// ######################################################################################################################################################################################
@@ -347,12 +357,14 @@ void sunplus_gcm394_base_device::map(address_map &map)
// ######################################################################################################################################################################################
map(0x007934, 0x007934).rw(FUNC(sunplus_gcm394_base_device::unkarea_7934_r), FUNC(sunplus_gcm394_base_device::unkarea_7934_w));
+ map(0x007935, 0x007935).rw(FUNC(sunplus_gcm394_base_device::unkarea_7935_r), FUNC(sunplus_gcm394_base_device::unkarea_7935_w));
map(0x007936, 0x007936).rw(FUNC(sunplus_gcm394_base_device::unkarea_7936_r), FUNC(sunplus_gcm394_base_device::unkarea_7936_w));
// ######################################################################################################################################################################################
// 7axx region = system (including dma)
// ######################################################################################################################################################################################
+
map(0x007a80, 0x007a86).w(FUNC(sunplus_gcm394_base_device::system_dma_params_w));
map(0x007abf, 0x007abf).rw(FUNC(sunplus_gcm394_base_device::system_dma_status_r), FUNC(sunplus_gcm394_base_device::system_dma_trigger_w));
@@ -368,6 +380,10 @@ void sunplus_gcm394_base_device::map(address_map &map)
void sunplus_gcm394_base_device::device_start()
{
+ m_porta_in.resolve_safe(0);
+
+ m_unk_timer = timer_alloc(0);
+ m_unk_timer->adjust(attotime::never);
}
void sunplus_gcm394_base_device::device_reset()
@@ -434,10 +450,34 @@ void sunplus_gcm394_base_device::device_reset()
// 79xx unknown
m_7934 = 0x0000;
+ m_7935 = 0x0000;
m_7936 = 0x0000;
+ m_unk_timer->adjust(attotime::from_hz(60), 0, attotime::from_hz(60));
+}
+
+void sunplus_gcm394_base_device::checkirq6()
+{
+ if (m_7935 & 0x0100)
+ m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, ASSERT_LINE);
+ else
+ m_cpu->set_state_unsynced(UNSP_IRQ6_LINE, CLEAR_LINE);
+}
+
+void sunplus_gcm394_base_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case 0:
+ {
+ m_7935 |= 0x0100;
+ checkirq6();
+ break;
+ }
+ }
}
+
WRITE_LINE_MEMBER(sunplus_gcm394_base_device::videoirq_w)
{
m_cpu->set_state_unsynced(UNSP_IRQ5_LINE, state);
@@ -451,9 +491,6 @@ void sunplus_gcm394_base_device::device_add_mconfig(machine_config &config)
GCM394_VIDEO(config, m_spg_video, DERIVED_CLOCK(1, 1), m_cpu, m_screen);
m_spg_video->write_video_irq_callback().set(FUNC(sunplus_gcm394_base_device::videoirq_w));
- m_spg_video->set_palette(m_palette);
-
- PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 256);
}
diff --git a/src/devices/machine/sunplus_gcm394.h b/src/devices/machine/sunplus_gcm394.h
index 70480f4d9ed..c822893b543 100644
--- a/src/devices/machine/sunplus_gcm394.h
+++ b/src/devices/machine/sunplus_gcm394.h
@@ -24,8 +24,8 @@ public:
, device_mixer_interface(mconfig, *this, 2)
, m_cpu(*this, finder_base::DUMMY_TAG)
, m_screen(*this, finder_base::DUMMY_TAG)
- , m_palette(*this, "palette")
, m_spg_video(*this, "spgvideo")
+ , m_porta_in(*this)
{
}
@@ -33,6 +33,8 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { return m_spg_video->screen_update(screen, bitmap, cliprect); }
+ auto porta_in() { return m_porta_in.bind(); }
+
DECLARE_WRITE_LINE_MEMBER(vblank) { m_spg_video->vblank(state); }
virtual void device_add_mconfig(machine_config& config) override;
@@ -44,9 +46,10 @@ protected:
required_device<unsp_device> m_cpu;
required_device<screen_device> m_screen;
- required_device<palette_device> m_palette;
required_device<gcm394_video_device> m_spg_video;
+ devcb_read16 m_porta_in;
+
uint16_t m_dma_params[7];
// unk 78xx
@@ -109,6 +112,7 @@ protected:
// unk 79xx
uint16_t m_7934;
+ uint16_t m_7935;
uint16_t m_7936;
@@ -194,12 +198,24 @@ private:
DECLARE_READ16_MEMBER(unkarea_7934_r);
DECLARE_WRITE16_MEMBER(unkarea_7934_w);
+
+ DECLARE_READ16_MEMBER(unkarea_7935_r);
+ DECLARE_WRITE16_MEMBER(unkarea_7935_w);
+
DECLARE_READ16_MEMBER(unkarea_7936_r);
DECLARE_WRITE16_MEMBER(unkarea_7936_w);
DECLARE_WRITE_LINE_MEMBER(videoirq_w);
+
+ void checkirq6();
+
+ emu_timer *m_unk_timer;
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+
};
+
+
class sunplus_gcm394_device : public sunplus_gcm394_base_device
{
public:
diff --git a/src/devices/machine/sunplus_gcm394_video.cpp b/src/devices/machine/sunplus_gcm394_video.cpp
index a07ea7c44f8..9b8c442d229 100644
--- a/src/devices/machine/sunplus_gcm394_video.cpp
+++ b/src/devices/machine/sunplus_gcm394_video.cpp
@@ -13,23 +13,24 @@ DEFINE_DEVICE_TYPE(GCM394_VIDEO, gcm394_video_device, "gcm394_video", "SunPlus G
#define LOG_GCM394_VIDEO_DMA (1U << 3)
#define LOG_GCM394_TMAP (1U << 2)
-#define LOG_GCM394 (1U << 1)
+#define LOG_GCM394_VIDEO (1U << 1)
-#define VERBOSE (LOG_GCM394_VIDEO_DMA)
+#define VERBOSE (LOG_GCM394_VIDEO_DMA | LOG_GCM394_VIDEO)
#include "logmacro.h"
gcm394_base_video_device::gcm394_base_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, type, tag, owner, clock)
- , device_gfx_interface(mconfig, *this, nullptr)
+ //, device_gfx_interface(mconfig, *this, nullptr)
, device_video_interface(mconfig, *this)
, m_cpu(*this, finder_base::DUMMY_TAG)
, m_screen(*this, finder_base::DUMMY_TAG)
// , m_scrollram(*this, "scrollram")
- , m_paletteram(*this, "^palette")
, m_spriteram(*this, "^spriteram")
, m_video_irq_cb(*this)
+ , m_palette(*this, "palette")
+ , m_gfxdecode(*this, "gfxdecode")
{
}
@@ -53,8 +54,9 @@ void gcm394_base_video_device::device_start()
m_video_irq_cb.resolve();
- uint8_t* gfxregion = memregion(":maincpu")->base();
- int gfxregion_size = memregion(":maincpu")->bytes();
+
+ m_gfxregion = memregion(":maincpu")->base();
+ m_gfxregionsize = memregion(":maincpu")->bytes();
int gfxelement = 0;
@@ -70,8 +72,8 @@ void gcm394_base_video_device::device_start()
{ STEP16(0,4 * 16) },
16 * 16 * 4
};
- obj_layout.total = gfxregion_size / (16 * 16 * 4 / 8);
- set_gfx(gfxelement, std::make_unique<gfx_element>(&palette(), obj_layout, gfxregion, 0, 0x10, 0));
+ obj_layout.total = m_gfxregionsize / (16 * 16 * 4 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x10, 0));
gfxelement++;
}
@@ -87,8 +89,8 @@ void gcm394_base_video_device::device_start()
{ STEP16(0,4 * 32) },
16 * 32 * 4
};
- obj_layout.total = gfxregion_size / (16 * 32 * 4 / 8);
- set_gfx(gfxelement, std::make_unique<gfx_element>(&palette(), obj_layout, gfxregion, 0, 0x10, 0));
+ obj_layout.total = m_gfxregionsize / (16 * 32 * 4 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x10, 0));
gfxelement++;
}
@@ -104,11 +106,66 @@ void gcm394_base_video_device::device_start()
{ STEP32(0,4 * 16) },
32 * 16 * 4
};
- obj_layout.total = gfxregion_size / (32 * 16 * 4 / 8);
- set_gfx(gfxelement, std::make_unique<gfx_element>(&palette(), obj_layout, gfxregion, 0, 0x10, 0));
+ obj_layout.total = m_gfxregionsize / (32 * 16 * 4 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x10, 0));
gfxelement++;
}
+ if (1)
+ {
+ gfx_layout obj_layout =
+ {
+ 32,32,
+ 0,
+ 4,
+ { STEP4(0,1) },
+ { STEP32(0,4) },
+ { STEP32(0,4 * 32) },
+ 32 * 32 * 4
+ };
+ obj_layout.total = m_gfxregionsize / (32 * 32 * 4 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x10, 0));
+ gfxelement++;
+ }
+
+ if (1)
+ {
+ gfx_layout obj_layout =
+ {
+ 8,16,
+ 0,
+ 2,
+ { 0,1 },
+ { STEP8(0,2) },
+ { STEP16(0,2 * 8) },
+ 8 * 16 * 2
+ };
+ obj_layout.total = m_gfxregionsize / (8 * 16 * 2 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x40, 0));
+ gfxelement++;
+ }
+
+ if (1)
+ {
+ const uint32_t texlayout_xoffset[64] = { STEP64(0,2) };
+ const uint32_t texlayout_yoffset[32] = { STEP32(0,2*64) };
+
+ gfx_layout obj_layout =
+ {
+ 64,32,
+ 0,
+ 2,
+ { 0,1 },
+ EXTENDED_XOFFS,
+ EXTENDED_YOFFS,
+ 32 * 64 * 2,
+ texlayout_xoffset,
+ texlayout_yoffset
+ };
+ obj_layout.total = m_gfxregionsize / (16 * 32 * 2 / 8);
+ m_gfxdecode->set_gfx(gfxelement, std::make_unique<gfx_element>(m_palette, obj_layout, m_gfxregion, 0, 0x40, 0));
+ gfxelement++;
+ }
save_item(NAME(m_spriteextra));
}
@@ -123,6 +180,10 @@ void gcm394_base_video_device::device_reset()
for (int i=0;i<0x100;i++)
m_spriteextra[i] = 0x0000;
+ for (int i=0;i<0x100;i++)
+ m_paletteram[i] = machine().rand()&0x7fff;
+
+
m_707f = 0x0000;
m_703a = 0x0000;
m_7062 = 0x0000;
@@ -158,14 +219,13 @@ void gcm394_base_video_device::device_reset()
inline uint16_t gcm394_base_video_device::read_data(uint32_t offset)
{
- address_space &space = m_cpu->space(AS_PROGRAM);
- uint16_t b = space.read_word(offset);
+ uint16_t b = m_gfxregion[(offset * 2) & (m_gfxregionsize - 1)] | (m_gfxregion[(offset * 2 + 1) & (m_gfxregionsize - 1)] << 8);
return b;
}
template<gcm394_base_video_device::blend_enable_t Blend, gcm394_base_video_device::rowscroll_enable_t RowScroll, gcm394_base_video_device::flipx_t FlipX>
-void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t bitmap_addr, uint16_t tile, int32_t h, int32_t w, uint8_t bpp, uint32_t yflipmask, uint32_t palette_offset)
+void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t bitmap_addr, uint32_t tile, int32_t h, int32_t w, uint8_t bpp, uint32_t yflipmask, uint32_t palette_offset)
{
uint32_t nc_bpp = ((bpp) + 1) << 1;
@@ -173,8 +233,14 @@ void gcm394_base_video_device::draw(const rectangle &cliprect, uint32_t line, ui
palette_offset <<= nc_bpp;
uint32_t bits_per_row = nc_bpp * w / 16;
- uint32_t words_per_tile = bits_per_row * h;
+ //uint32_t words_per_tile = bits_per_row * h;
+
+ uint32_t words_per_tile = 8; // seems to be correct for sprites regardless of size / bpp
+
uint32_t m = bitmap_addr + words_per_tile * tile + bits_per_row * (line ^ yflipmask);
+
+ m += (0x300000 / 2);
+
uint32_t bits = 0;
uint32_t nbits = 0;
uint32_t y = line;
@@ -301,7 +367,9 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
const bool row_scroll = (tilectrl & 0x0010);
const bool flip_x = (tileattr & TILE_X_FLIP);
const uint32_t yflipmask = tileattr & TILE_Y_FLIP ? tile_h - 1 : 0;
- const uint32_t palette_offset = (tileattr & 0x0f00) >> 4;
+ uint32_t palette_offset = (tileattr & 0x0f00) >> 4;
+
+ palette_offset |= 0x0900;
const uint8_t bpp = tileattr & 0x0003;
@@ -346,11 +414,13 @@ void gcm394_base_video_device::draw_page(const rectangle &cliprect, uint32_t sca
void gcm394_base_video_device::draw_sprite(const rectangle &cliprect, uint32_t scanline, int priority, uint32_t base_addr)
{
uint32_t bitmap_addr = 0;// 0x40 * m_video_regs[0x22];
- uint16_t tile = m_spriteram[base_addr + 0];
+ uint32_t tile = m_spriteram[base_addr + 0];
int16_t x = m_spriteram[base_addr + 1];
int16_t y = m_spriteram[base_addr + 2];
uint16_t attr = m_spriteram[base_addr + 3];
+ tile |= m_spriteextra[base_addr / 4] << 16;
+
if (!tile)
{
return;
@@ -389,7 +459,9 @@ void gcm394_base_video_device::draw_sprite(const rectangle &cliprect, uint32_t s
bool flip_x = (attr & TILE_X_FLIP);
const uint8_t bpp = attr & 0x0003;
const uint32_t yflipmask = attr & TILE_Y_FLIP ? h - 1 : 0;
- const uint32_t palette_offset = (attr & 0x0f00) >> 4;
+ uint32_t palette_offset = (attr & 0x0f00) >> 4;
+
+ palette_offset |= 0x0d00;
if (blend)
{
@@ -428,8 +500,11 @@ uint32_t gcm394_base_video_device::screen_update(screen_device &screen, bitmap_r
{
for (int i = 0; i < 4; i++)
{
- draw_page(cliprect, scanline, i, page1_addr, page1_regs);
- draw_page(cliprect, scanline, i, page2_addr, page2_regs);
+ if (1)
+ {
+ draw_page(cliprect, scanline, i, page1_addr, page1_regs);
+ draw_page(cliprect, scanline, i, page2_addr, page2_regs);
+ }
draw_sprites(cliprect, scanline, i);
}
}
@@ -532,17 +607,17 @@ WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device0_regs_w)
// offsets 0,1,4,5,6,7 used in main IRQ code
// offsets 2,3 only cleared on startup
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device0_regs_w %01x %04x\n", machine().describe_context(), offset, data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device0_regs_w %01x %04x\n", machine().describe_context(), offset, data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device0_unk0_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device0_unk0_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device0_unk0_w %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device0_unk1_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device0_unk1_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device0_unk1_w %04x\n", machine().describe_context(), data);
}
// **************************************** unknown video device 1 (another tilemap? sprite layer?) *************************************************
@@ -552,34 +627,34 @@ WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device1_regs_w)
// offsets 0,1,4,5,6,7 used in main IRQ code
// offsets 2,3 only cleared on startup
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device1_regs_w %01x %04x\n", machine().describe_context(), offset, data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device1_regs_w %01x %04x\n", machine().describe_context(), offset, data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device1_unk0_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device1_unk0_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device1_unk0_w %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device1_unk1_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device1_unk1_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device1_unk1_w %04x\n", machine().describe_context(), data);
}
// **************************************** unknown video device 2 (sprite control?) *************************************************
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device2_unk0_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device2_unk0_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device2_unk0_w %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device2_unk1_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device2_unk1_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device2_unk1_w %04x\n", machine().describe_context(), data);
}
WRITE16_MEMBER(gcm394_base_video_device::unknown_video_device2_unk2_w)
{
- LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::unknown_video_device2_unk2_w %04x\n", machine().describe_context(), data);
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::unknown_video_device2_unk2_w %04x\n", machine().describe_context(), data);
}
// **************************************** video DMA device *************************************************
@@ -657,35 +732,72 @@ WRITE16_MEMBER(gcm394_base_video_device::video_dma_unk_w)
-READ16_MEMBER(gcm394_base_video_device::video_707f_r) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_707f_r\n", machine().describe_context()); return m_707f; }
-WRITE16_MEMBER(gcm394_base_video_device::video_707f_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_707f_w %04x\n", machine().describe_context(), data); m_707f = data; }
+READ16_MEMBER(gcm394_base_video_device::video_707f_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_707f_r\n", machine().describe_context()); return m_707f; }
+WRITE16_MEMBER(gcm394_base_video_device::video_707f_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_707f_w %04x\n", machine().describe_context(), data); m_707f = data; }
-READ16_MEMBER(gcm394_base_video_device::video_703a_r) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_703a_r\n", machine().describe_context()); return m_703a; }
-WRITE16_MEMBER(gcm394_base_video_device::video_703a_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_703a_w %04x\n", machine().describe_context(), data); m_703a = data; }
+READ16_MEMBER(gcm394_base_video_device::video_703a_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_703a_r\n", machine().describe_context()); return m_703a; } // something to do with palette access, maybe bank?
+WRITE16_MEMBER(gcm394_base_video_device::video_703a_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_703a_w %04x\n", machine().describe_context(), data); m_703a = data; }
-READ16_MEMBER(gcm394_base_video_device::video_7062_r) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7062_r\n", machine().describe_context()); return m_7062; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7062_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7062_w %04x\n", machine().describe_context(), data); m_7062 = data; }
+READ16_MEMBER(gcm394_base_video_device::video_7062_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7062_r\n", machine().describe_context()); return m_7062; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7062_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7062_w %04x\n", machine().describe_context(), data); m_7062 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7063_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7063_w %04x\n", machine().describe_context(), data); m_7063 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7063_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7063_w %04x\n", machine().describe_context(), data); m_7063 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_702a_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_702a_w %04x\n", machine().describe_context(), data); m_702a = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_702a_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_702a_w %04x\n", machine().describe_context(), data); m_702a = data; }
// read in IRQ
-READ16_MEMBER(gcm394_base_video_device::video_7030_r) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7030_r\n", machine().describe_context()); return m_7030; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7030_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7030_w %04x\n", machine().describe_context(), data); m_7030 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_703c_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_703c_w %04x\n", machine().describe_context(), data); m_703c = data; }
-
-WRITE16_MEMBER(gcm394_base_video_device::video_7080_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7080_w %04x\n", machine().describe_context(), data); m_7080 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7081_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7081_w %04x\n", machine().describe_context(), data); m_7081 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7082_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7082_w %04x\n", machine().describe_context(), data); m_7082 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7083_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7083_w %04x\n", machine().describe_context(), data); m_7083 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7084_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7084_w %04x\n", machine().describe_context(), data); m_7084 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7085_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7085_w %04x\n", machine().describe_context(), data); m_7085 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7086_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7086_w %04x\n", machine().describe_context(), data); m_7086 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7087_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7087_w %04x\n", machine().describe_context(), data); m_7087 = data; }
-WRITE16_MEMBER(gcm394_base_video_device::video_7088_w) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7088_w %04x\n", machine().describe_context(), data); m_7088 = data; }
-
-READ16_MEMBER(gcm394_base_video_device::video_7083_r) { LOGMASKED(LOG_GCM394, "%s:gcm394_base_video_device::video_7083_r\n", machine().describe_context()); return m_7083; }
+READ16_MEMBER(gcm394_base_video_device::video_7030_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7030_r\n", machine().describe_context()); return m_7030; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7030_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7030_w %04x\n", machine().describe_context(), data); m_7030 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_703c_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_703c_w %04x\n", machine().describe_context(), data); m_703c = data; }
+
+WRITE16_MEMBER(gcm394_base_video_device::video_7080_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7080_w %04x\n", machine().describe_context(), data); m_7080 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7081_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7081_w %04x\n", machine().describe_context(), data); m_7081 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7082_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7082_w %04x\n", machine().describe_context(), data); m_7082 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7083_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7083_w %04x\n", machine().describe_context(), data); m_7083 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7084_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7084_w %04x\n", machine().describe_context(), data); m_7084 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7085_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7085_w %04x\n", machine().describe_context(), data); m_7085 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7086_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7086_w %04x\n", machine().describe_context(), data); m_7086 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7087_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7087_w %04x\n", machine().describe_context(), data); m_7087 = data; }
+WRITE16_MEMBER(gcm394_base_video_device::video_7088_w) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7088_w %04x\n", machine().describe_context(), data); m_7088 = data; }
+
+READ16_MEMBER(gcm394_base_video_device::video_7083_r) { LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::video_7083_r\n", machine().describe_context()); return m_7083; }
+
+WRITE16_MEMBER(gcm394_base_video_device::palette_w)
+{
+ LOGMASKED(LOG_GCM394_VIDEO, "%s:gcm394_base_video_device::palette_w %04x : %04x (value of 0x703a is %04x)\n", machine().describe_context().c_str(), offset, data, m_703a);
+
+ if (m_703a & 0xfff0)
+ {
+ fatalerror("palette writes with m_703a %04x\n", m_703a);
+ }
+ else
+ {
+ offset |= (m_703a & 0x000f) << 8;
+
+ m_paletteram[offset] = data;
+
+ uint32_t pal = m_rgb555_to_rgb888[data & 0x7fff];
+ int r = (pal >> 16) & 0xff;
+ int g = (pal >> 8) & 0xff;
+ int b = (pal >> 0) & 0xff;
+
+ m_palette->set_pen_color(offset, rgb_t(r, g, b));
+ }
+}
+
+READ16_MEMBER(gcm394_base_video_device::palette_r)
+{
+ if (m_703a & 0xfff0)
+ {
+ fatalerror("palette read with m_703a %04x\n", m_703a);
+ }
+ else
+ {
+ offset |= (m_703a & 0x000f) << 8;
+ return m_paletteram[offset];
+ }
+}
+
void gcm394_base_video_device::check_video_irq()
{
@@ -710,3 +822,14 @@ WRITE_LINE_MEMBER(gcm394_base_video_device::vblank)
}
}
+static GFXDECODE_START( gfx )
+GFXDECODE_END
+
+void gcm394_base_video_device::device_add_mconfig(machine_config &config)
+{
+ PALETTE(config, m_palette).set_format(palette_device::xRGB_555, 256*0x10);
+ GFXDECODE(config, m_gfxdecode, m_palette, gfx);
+
+}
+
+
diff --git a/src/devices/machine/sunplus_gcm394_video.h b/src/devices/machine/sunplus_gcm394_video.h
index 28ca2d0f1ff..4dfe3106e77 100644
--- a/src/devices/machine/sunplus_gcm394_video.h
+++ b/src/devices/machine/sunplus_gcm394_video.h
@@ -13,8 +13,9 @@
#include "cpu/unsp/unsp.h"
#include "screen.h"
+#include "emupal.h"
-class gcm394_base_video_device : public device_t, public device_gfx_interface, public device_video_interface
+class gcm394_base_video_device : public device_t, public device_video_interface
{
public:
gcm394_base_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -22,9 +23,6 @@ public:
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(vblank);
-// DECLARE_READ16_MEMBER(video_r);
-// DECLARE_WRITE16_MEMBER(video_w);
-
void write_tmap_regs(int tmap, uint16_t* regs, int offset, uint16_t data);
DECLARE_READ16_MEMBER(tmap0_regs_r);
@@ -84,8 +82,16 @@ public:
DECLARE_READ16_MEMBER(video_7083_r);
+ DECLARE_READ16_MEMBER(palette_r);
+ DECLARE_WRITE16_MEMBER(palette_w);
+
auto write_video_irq_callback() { return m_video_irq_cb.bind(); };
+ uint8_t* m_gfxregion;
+ uint32_t m_gfxregionsize;
+
+ virtual void device_add_mconfig(machine_config& config) override;
+
protected:
enum
@@ -132,7 +138,7 @@ protected:
};
template<blend_enable_t Blend, rowscroll_enable_t RowScroll, flipx_t FlipX>
- void draw(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t bitmap_addr, uint16_t tile, int32_t h, int32_t w, uint8_t bpp, uint32_t yflipmask, uint32_t palette_offset);
+ void draw(const rectangle &cliprect, uint32_t line, uint32_t xoff, uint32_t yoff, uint32_t bitmap_addr, uint32_t tile, int32_t h, int32_t w, uint8_t bpp, uint32_t yflipmask, uint32_t palette_offset);
void draw_page(const rectangle &cliprect, uint32_t scanline, int priority, uint32_t bitmap_addr, uint16_t *regs);
void draw_sprites(const rectangle& cliprect, uint32_t scanline, int priority);
void draw_sprite(const rectangle& cliprect, uint32_t scanline, int priority, uint32_t base_addr);
@@ -144,7 +150,6 @@ protected:
required_device<unsp_device> m_cpu;
required_device<screen_device> m_screen;
// required_shared_ptr<uint16_t> m_scrollram;
- required_shared_ptr<uint16_t> m_paletteram;
required_shared_ptr<uint16_t> m_spriteram;
uint16_t m_page1_addr;
@@ -185,8 +190,13 @@ protected:
uint16_t m_video_irq_status;
uint16_t m_spriteextra[0x100];
+ uint16_t m_paletteram[0x100*0x10];
uint16_t read_data(uint32_t offset);
+
+ required_device<palette_device> m_palette;
+ required_device<gfxdecode_device> m_gfxdecode;
+
};
class gcm394_video_device : public gcm394_base_video_device
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index 1aa29704db7..80706f0b7f5 100755
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -1283,6 +1283,18 @@ void lua_engine::initialize()
* driver.manufacturer
* driver.compatible_with
* driver.default_layout
+ * driver.orientation - screen rotation degree (rot0/90/180/270)
+ * driver.type - machine type (arcade/console/computer/other)
+ * driver.not_working - not considered working
+ * driver.supports_save - supports save states
+ * driver.no_cocktail - screen flip support is missing
+ * driver.is_bios_root - this driver entry is a BIOS root
+ * driver.requires_artwork - requires external artwork for key game elements
+ * driver.clickable_artwork - artwork is clickable and requires mouse cursor
+ * driver.unofficial - unofficial hardware modification
+ * driver.no_sound_hw - system has no sound output
+ * driver.mechanical - contains mechanical parts (pinball, redemption games, ...)
+ * driver.is_incomplete - official system with blatantly incomplete hardware/software
*/
sol().registry().new_usertype<game_driver>("game_driver", "new", sol::no_constructor,
@@ -1293,7 +1305,59 @@ void lua_engine::initialize()
"year", sol::readonly(&game_driver::year),
"manufacturer", sol::readonly(&game_driver::manufacturer),
"compatible_with", sol::readonly(&game_driver::compatible_with),
- "default_layout", sol::readonly(&game_driver::default_layout));
+ "default_layout", sol::readonly(&game_driver::default_layout),
+ "orientation", sol::property([](game_driver const &driver) {
+ std::string rot;
+ switch (driver.flags & machine_flags::MASK_ORIENTATION)
+ {
+ case machine_flags::ROT0:
+ rot = "rot0";
+ break;
+ case machine_flags::ROT90:
+ rot = "rot90";
+ break;
+ case machine_flags::ROT180:
+ rot = "rot180";
+ break;
+ case machine_flags::ROT270:
+ rot = "rot270";
+ break;
+ default:
+ rot = "undefined";
+ break;
+ }
+ return rot;
+ }),
+ "type", sol::property([](game_driver const &driver) {
+ std::string type;
+ switch (driver.flags & machine_flags::MASK_TYPE)
+ {
+ case machine_flags::TYPE_ARCADE:
+ type = "arcade";
+ break;
+ case machine_flags::TYPE_CONSOLE:
+ type = "console";
+ break;
+ case machine_flags::TYPE_COMPUTER:
+ type = "computer";
+ break;
+ default:
+ type = "other";
+ break;
+ }
+ return type;
+ }),
+ "not_working", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::NOT_WORKING) > 0; }),
+ "supports_save", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::SUPPORTS_SAVE) > 0; }),
+ "no_cocktail", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::NO_COCKTAIL) > 0; }),
+ "is_bios_root", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::IS_BIOS_ROOT) > 0; }),
+ "requires_artwork", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::REQUIRES_ARTWORK) > 0; }),
+ "clickable_artwork", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::CLICKABLE_ARTWORK) > 0; }),
+ "unofficial", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::UNOFFICIAL) > 0; }),
+ "no_sound_hw", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::NO_SOUND_HW) > 0; }),
+ "mechanical", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::MECHANICAL) > 0; }),
+ "is_incomplete", sol::property([](game_driver const &driver) { return (driver.flags & machine_flags::IS_INCOMPLETE) > 0; }
+ ));
/* debugger_manager library (requires debugger to be active)
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp
index 7118d77c3a3..3d954504264 100644
--- a/src/lib/netlist/analog/nld_bjt.cpp
+++ b/src/lib/netlist/analog/nld_bjt.cpp
@@ -178,7 +178,7 @@ namespace analog
NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
, m_RB(*this, "m_RB", true)
, m_RC(*this, "m_RC", true)
- , m_BC_dummy(*this, "m_BC", true)
+ , m_BC(*this, "m_BC", true)
, m_gB(1e-9)
, m_gC(1e-9)
, m_V(0.0)
@@ -187,15 +187,10 @@ namespace analog
register_subalias("B", m_RB.m_P);
register_subalias("E", m_RB.m_N);
register_subalias("C", m_RC.m_P);
- //register_term("_E1", m_RC.m_N);
-
- //register_term("_B1", m_BC_dummy.m_P);
- //register_term("_C1", m_BC_dummy.m_N);
connect(m_RB.m_N, m_RC.m_N);
-
- connect(m_RB.m_P, m_BC_dummy.m_P);
- connect(m_RC.m_P, m_BC_dummy.m_N);
+ connect(m_RB.m_P, m_BC.m_P);
+ connect(m_RC.m_P, m_BC.m_N);
}
NETLIB_RESETI();
@@ -206,10 +201,7 @@ namespace analog
private:
nld_twoterm m_RB;
nld_twoterm m_RC;
-
- // FIXME: this is needed so we have all terminals belong to one net list
-
- nld_twoterm m_BC_dummy;
+ nld_twoterm m_BC;
nl_double m_gB; // base conductance / switch on
nl_double m_gC; // collector conductance / switch on
@@ -306,7 +298,7 @@ namespace analog
m_RB.set_G_V_I(exec().gmin(), 0.0, 0.0);
m_RC.set_G_V_I(exec().gmin(), 0.0, 0.0);
- m_BC_dummy.set_G_V_I(exec().gmin() / 10.0, 0.0, 0.0);
+ m_BC.set_G_V_I(exec().gmin() / 10.0, 0.0, 0.0);
}
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp
index b2d371a6946..ae58a43feba 100644
--- a/src/lib/netlist/devices/nld_74161.cpp
+++ b/src/lib/netlist/devices/nld_74161.cpp
@@ -9,6 +9,8 @@
#include "netlist/nl_base.h"
#include "nlid_system.h"
+#include <array>
+
namespace netlist
{
namespace devices
@@ -91,7 +93,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr const netlist_time delay[4] =
+ static constexpr const std::array<netlist_time, 4> delay =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index 495d8e0194a..42d4d06b429 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -10,6 +10,8 @@
#include "netlist/nl_base.h"
#include "nlid_system.h"
+#include <array>
+
namespace netlist
{
namespace devices
@@ -48,7 +50,7 @@ namespace netlist
void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
{
// 0: High-to-low 40 ns, 1: Low-to-high 25 ns
- static constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ static constexpr const std::array<netlist_time, 2> delay = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
m_Q.push(stateQ, delay[stateQ]);
m_QQ.push(stateQQ, delay[stateQQ]);
}
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index f687f5a1faa..64f9daefcd5 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -286,10 +286,10 @@ namespace devices
// nld_dummy_input
// -----------------------------------------------------------------------------
- NETLIB_OBJECT_DERIVED(dummy_input, base_dummy)
+ NETLIB_OBJECT(dummy_input)
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(dummy_input, base_dummy)
+ NETLIB_CONSTRUCTOR(dummy_input)
, m_I(*this, "I")
{
}
@@ -308,10 +308,10 @@ namespace devices
// nld_frontier
// -----------------------------------------------------------------------------
- NETLIB_OBJECT_DERIVED(frontier, base_dummy)
+ NETLIB_OBJECT(frontier)
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy)
+ NETLIB_CONSTRUCTOR(frontier)
, m_RIN(*this, "m_RIN", true)
, m_ROUT(*this, "m_ROUT", true)
, m_I(*this, "_I")
diff --git a/src/lib/netlist/macro/nlm_cd4xxx.cpp b/src/lib/netlist/macro/nlm_cd4xxx.cpp
index a46fc66d623..8844b3f8154 100644
--- a/src/lib/netlist/macro/nlm_cd4xxx.cpp
+++ b/src/lib/netlist/macro/nlm_cd4xxx.cpp
@@ -28,17 +28,16 @@ static NETLIST_START(CD4001_DIP)
CD4001_NOR(s3)
CD4001_NOR(s4)
- DUMMY_INPUT(VSS)
- DUMMY_INPUT(VDD)
-
+ NET_C(s1.VCC, s2.VCC, s3.VCC, s4.VCC)
+ NET_C(s1.VDD, s2.VDD, s3.VDD, s4.VDD)
DIPPINS( /* +--------------+ */
- s1.A, /* A1 |1 ++ 14| VCC */ VDD.I,
+ s1.A, /* A1 |1 ++ 14| VCC */ s1.VCC,
s1.B, /* B1 |2 13| A6 */ s4.B,
s1.Q, /* A2 |3 12| Y6 */ s4.A,
s2.Q, /* Y2 |4 4001 11| A5 */ s4.Q,
s2.A, /* A3 |5 10| Y5 */ s3.Q,
s2.B, /* Y3 |6 9| A4 */ s3.B,
- VSS.I, /* GND |7 8| Y4 */ s3.A
+ s1.VDD, /* GND |7 8| Y4 */ s3.A
/* +--------------+ */
)
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index 0f1577eb63c..34c0791e312 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -218,8 +218,8 @@ static NETLIST_START(LM3900)
ALIAS(PLUS, R1.1) // Positive input
ALIAS(MINUS, R2.1) // Negative input
ALIAS(OUT, G1.OP) // Opamp output ...
- ALIAS(VCC, G1.ON) // V- terminal
- ALIAS(GND, DUMMY.I) // V+ terminal
+ ALIAS(GND, G1.ON) // V- terminal
+ ALIAS(VCC, DUMMY.I) // V+ terminal
DUMMY_INPUT(DUMMY)
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp
index f264b0ff220..915e94791f6 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.cpp
+++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp
@@ -401,7 +401,7 @@ static NETLIST_START(TTL_7425_DIP)
A.A, /* A1 |1 ++ 14| VCC */ A.VCC,
A.B, /* B1 |2 13| D2 */ B.D,
X.I, /* X1 |3 12| C2 */ B.C,
- A.C, /* C1 |4 7425 11| X2 */ X.I,
+ A.C, /* C1 |4 7425 11| X2 */ X.I,
A.D, /* D1 |5 10| B2 */ B.B,
A.Q, /* Y1 |6 9| A2 */ B.A,
A.GND,/* GND |7 8| Y2 */ B.Q
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index e61e5fd21d6..8b5f0960aad 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -43,10 +43,10 @@ class NETLIB_NAME(name) : public NETLIB_NAME(pclass)
* Used to start defining a netlist device class.
* The simplest device without inputs or outputs would look like this:
*
- * NETLIB_OBJECT(base_dummy)
+ * NETLIB_OBJECT(some_object)
* {
* public:
- * NETLIB_CONSTRUCTOR(base_dummy) { }
+ * NETLIB_CONSTRUCTOR(some_object) { }
* };
*
* Also refer to #NETLIB_CONSTRUCTOR.
@@ -1280,17 +1280,6 @@ namespace netlist
};
// -----------------------------------------------------------------------------
- // nld_base_dummy : basis for dummy devices
- // FIXME: this is not the right place to define this
- // -----------------------------------------------------------------------------
-
- NETLIB_OBJECT(base_dummy)
- {
- public:
- NETLIB_CONSTRUCTOR(base_dummy) { }
- };
-
- // -----------------------------------------------------------------------------
// queue_t
// -----------------------------------------------------------------------------
diff --git a/src/mame/drivers/at.cpp b/src/mame/drivers/at.cpp
index 23fd791a9b9..98cdfce67a2 100644
--- a/src/mame/drivers/at.cpp
+++ b/src/mame/drivers/at.cpp
@@ -149,6 +149,7 @@ public:
void at386(machine_config &config);
void m290(machine_config &config);
void ncrpc8(machine_config &config);
+ void n8810m15(machine_config &config);
void n8810m55(machine_config &config);
void ews286(machine_config &config);
@@ -854,6 +855,14 @@ void at_state::comportii(machine_config &config)
}
// Nixdorf 8810 M55
+void at_state::n8810m15(machine_config &config)
+{
+ ibm5170(config);
+ m_maincpu->set_clock(6000000);
+ subdevice<isa16_slot_device>("isa1")->set_default_option("cga");
+}
+
+// Nixdorf 8810 M55
void at_state::n8810m55(machine_config &config)
{
ibm5170(config);
@@ -1077,6 +1086,26 @@ ROM_START( at )
ROMX_LOAD( "precise 860407_low.bin", 0x10000, 0x8000, CRC(d839c074) SHA1(473ca7b42914ce12f2d6c91afb0b2c2e65194489), ROM_SKIP(1) | ROM_BIOS(29) )
ROMX_LOAD( "precise 860407_high.bin", 0x10001, 0x8000, CRC(b5e13c54) SHA1(07f5806fb53d0cb7ef7b54312fd6aa163d58b9a5), ROM_SKIP(1) | ROM_BIOS(29) )
// ROM_LOAD( "precise_860407_keyboard_mcu.bin", 0x0000, 0x800, CRC(d1faad5c) SHA1(cb315a3da632c969012c298bb8e1cf8883b70501))
+ // 30: BIOS-String: D286-1149-083090-K0 - WIN 286 BIOS
+ ROM_SYSTEM_BIOS(30, "6wb5", "KT216WB5-HI Rev.2")
+ ROMX_LOAD( "kt216wb5_even.bin", 0x10000, 0x8000, CRC(6b5509c0) SHA1(73b303b90cc0cd23b7e13362019193c938a2e502), ROM_SKIP(1) | ROM_BIOS(30) )
+ ROMX_LOAD( "kt216wb5_odd.bin", 0x10001, 0x8000, CRC(af541ada) SHA1(26d2617dbe8c15f1b0d4782375bcb291a7923703), ROM_SKIP(1) | ROM_BIOS(30) )
+ // 31: BIOS-String: DH12-1112-061390-K0 - HT-12 286 BIOS
+ ROM_SYSTEM_BIOS(31, "mat286revd", "MAT 286 Rev.D")
+ ROMX_LOAD( "mat286revd.bin", 0x10000, 0x10000, CRC(deeea2da) SHA1(c9186f835c7c12b28befa75851cb8ac7e1f95cbb), ROM_BIOS(31) )
+ // 32: BIOS-String: D286-1295-091589-K0
+ ROM_SYSTEM_BIOS(32, "topvlsi", "Toptek VLSI")
+ ROMX_LOAD( "toptek_vlsi.bin", 0x10000, 0x10000, CRC(f1d05c2e) SHA1(05540f6af6a3209107a7fd29e526e61d12c32b6e), ROM_BIOS(32) )
+ // 33: DTK Corp. 286 Computer - DTK 286 Chipset ROM BIOS Version 3.26 - #24062890N
+ ROM_SYSTEM_BIOS(33, "ptm1632c", "UNIT PTM1632C DTK V.3.26")
+ ROMX_LOAD( "ptm1632c_l.bin", 0x10000, 0x8000, CRC(df0bc27c) SHA1(f94e2decd13c285c23b6a61c035cab88fa00ba6e), ROM_SKIP(1) | ROM_BIOS(33))
+ ROMX_LOAD( "ptm1632c_h.bin", 0x10001, 0x8000, CRC(a80136e0) SHA1(5edc2d387efb42cf70361197de808ce1b06d8aec), ROM_SKIP(1) | ROM_BIOS(33))
+ // 34: BIOS-String: DH12-1343-061390-K0
+ ROM_SYSTEM_BIOS(34, "headland", "Headland")
+ ROMX_LOAD( "286_headland.bin", 0x10000, 0x10000, CRC(06ea67ae) SHA1(d827f14c4307b76f727bf2a8323330992b74dd89), ROM_BIOS(34) )
+ // 35: BIOS-String: 20-0300-00834-00101111-050591-SARC286 / [80286 Standard System 2V1]
+ ROM_SYSTEM_BIOS(35, "sarcrev12", "SARC Rev. 1.2")
+ ROMX_LOAD( "sarcrev12.bin", 0x10000, 0x10000, CRC(1c5e3f2d) SHA1(1fcc8b1b9d9383467223dd41e420f9352beca654), ROM_BIOS(35) )
ROM_END
@@ -1598,7 +1627,33 @@ ROM_START( pc70iii )
ROM_SYSTEM_BIOS(1, "pc70v101", "PC70 V1.00.01")
ROMX_LOAD("cbm-pc70c-bios-lo-v1.00.01-xxxxxx-00.bin", 0x00000, 0x10000, CRC(6c8bbd31) SHA1(63d1739a58a0d441ebdd543e3994984c433aedb4), ROM_SKIP(1) | ROM_BIOS(1))
ROMX_LOAD("cbm-pc70c-bios-hi-v1.00.01-xxxxxx-00.bin", 0x00001, 0x10000, CRC(ef279cdd) SHA1(d250368b2f731e842d6f280a6134f1e38846874b), ROM_SKIP(1) | ROM_BIOS(1))
- ROM_END
+ROM_END
+
+// Commodore Tower 386
+ROM_START( comt386 )
+ ROM_REGION(0x20000, "bios", 0)
+ // Phoenix 80386 ROM BIOS PLUS Version 1.10 22 - Twinhead International Corporation
+ ROM_LOAD16_BYTE( "cbm-t386-bios-lo-v1.1022c-.bin", 0x10000, 0x8000, CRC(6857777e) SHA1(e80dbffd3523c9a1b027f57138c55768fc8328a6))
+ ROM_LOAD16_BYTE( "cbm-t386-bios-hi-v1.1022c-.bin", 0x10001, 0x8000, CRC(6a321a7e) SHA1(c350fb273522f742c6008deda00ed13947a269b7))
+ROM_END
+
+// Commodore Tower 486
+ROM_START( comt486 )
+ ROM_REGION(0x20000, "bios", 0)
+ // 0: BIOS-String: 40-0500-DG1112-00101111-070791-SOLUTION-0 - 4D3FF Rev.D (092892)
+ ROM_SYSTEM_BIOS(0, "v0", "Tower 486 V0")
+ ROMX_LOAD( "cbm-t486dx-bios-v-xxxxxx-xx.bin", 0x10000, 0x10000, CRC(f51c0ca0) SHA1(2b08a606ae2f37b3e72d687f890d729a58fd3ccd), ROM_BIOS(0))
+ // continuous chirps
+ ROM_SYSTEM_BIOS(1, "v1", "Tower 486 V1")
+ ROMX_LOAD( "cbm-t486dx-66-bios-v1.01-391566-02.bin", 0x10000, 0x10000, CRC(3d740698) SHA1(888f23d85b41c07e15e2811b76194cf478bc80cd), ROM_BIOS(1))
+ // BIOS-String: 40-0103-001283-00101111-0606-SYM_486-0 - Commodore 486DX2-66 BIOS Version 1.03 391684-02
+ ROM_SYSTEM_BIOS(2, "v2", "Tower 486 V2")
+ ROMX_LOAD( "cbm-t486dx-66-bios-v1.03-391684-02.bin", 0x10000, 0x10000, CRC(13e8b04b) SHA1(dc5c84d228f802f7580b3f3b8e70cf8f74de5d79), ROM_BIOS(2))
+ // BIOS-String: 40-0103-001283-00101111-060692-SYM_486-0 - Commodore 486DX-50 BIOS Version 1.03 391522-03
+ ROM_SYSTEM_BIOS(3, "v3", "Tower 486 V3")
+ ROMX_LOAD( "cbm-t486dx-50-bios-v1.03-.bin", 0x10000, 0x10000, CRC(e02bb928) SHA1(6ea121b214403390d382ca4685cfabcbcca1a28b), ROM_BIOS(3))
+ROM_END
+
// Apricot Qi 300 (Rev D,E & F Motherboard)
ROM_START( xb42663 )
@@ -1734,6 +1789,7 @@ ROM_START( aprfte )
ROM_LOAD( "1-2r2-4.486", 0x00000, 0x20000, CRC(bccc236d) SHA1(0765299363e68cf65710a688c360a087856ece8f))
ROM_END
+// Amstrad MegaPC
ROM_START( megapc )
ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF)
ROM_REGION(0x20000, "bios", 0)
@@ -1741,6 +1797,7 @@ ROM_START( megapc )
ROM_LOAD16_BYTE( "211253-bios hi.u19", 0x00001, 0x10000, CRC(6acb573f) SHA1(376d483db2bd1c775d46424e1176b24779591525))
ROM_END
+// Amstrad MegaPC Plus
ROM_START( megapcpl )
ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF)
ROM_REGION(0x20000, "bios", 0)
@@ -1748,6 +1805,7 @@ ROM_START( megapcpl )
ROM_LOAD16_BYTE( "486slc.u19", 0x00001, 0x10000, CRC(6fb7e3e9) SHA1(c439cb5a0d83176ceb2a3555e295dc1f84d85103))
ROM_END
+// Amstrad MegaPC Plus (Winbond chipset)
ROM_START( megapcpla )
ROM_REGION(0x40000, "bios", 0)
ROM_LOAD( "megapc_bios.bin", 0x00000, 0x10000, CRC(b84938a2) SHA1(cecab72a96993db4f7c648c229b4211a8c53a380))
@@ -1789,13 +1847,15 @@ ROM_START( mbc28 ) // Complains about missing mouse hardware
ROM_END
// Siemens PCD-2
+ // ROM_LOAD( "vga_nmc27c256q_435-0029-04_1988_video7_arrow.bin", 0x8000, 0x0800, CRC(0d8d7dff) SHA(cb5b2ab78d480ec3164d16c9c75f1449fa81a0e7) ) // Video7 VGA card
+ // ROM_LOAD( "vga_nmc27c256q_435-0030-04_1988_video7_arrow.bin", 0x8000, 0x0800, CRC(0935c003) SHA(35ac571818f616b856da8bbf6a7a9172f68b3ab6) )
ROM_START( pcd2 )
ROM_REGION(0x20000,"bios", 0)
ROM_LOAD16_BYTE( "bios_tandon_188782-032a_rev_5.21_low.bin", 0x10000, 0x8000, CRC(a8fbffd3) SHA1(8a3ad5bc7f86ff984be10a8b1ae4542be4c80e5f) )
ROM_LOAD16_BYTE( "bios_tandon_188782-031a_rev_5.21_high.bin", 0x10001, 0x8000, CRC(8d7dfdcc) SHA1(d1d58c0ad7db60399f9a93db48feb10e44ffd624) )
- // ROM_LOAD( "kbd_8742_award_upi_1.61_rev_1.01.bin", 0x0000, 0x0800, CRC(bb8a1979) SHA(43d35ecf76e5e8d5ddf6c32b0f6f628a7542d6e4) ) // 8742 keyboard controller
- // ROM_LOAD( "vga_nmc27c256q_435-0029-04_1988_video7_arrow.bin", 0x8000, 0x0800, CRC(0d8d7dff) SHA(cb5b2ab78d480ec3164d16c9c75f1449fa81a0e7) ) // Video7 VGA card
- // ROM_LOAD( "vga_nmc27c256q_435-0030-04_1988_video7_arrow.bin", 0x8000, 0x0800, CRC(0935c003) SHA(35ac571818f616b856da8bbf6a7a9172f68b3ab6) )
+
+ ROM_REGION( 0x0800, "keyboard", 0 ) // reporting keyboard controller failure
+ ROM_LOAD( "kbd_8742_award_upi_1.61_rev_1.01.bin", 0x000, 0x800, CRC(bb8a1979) SHA1(43d35ecf76e5e8d5ddf6c32b0f6f628a7542d6e4) ) // 8742 keyboard controller
ROM_END
// Compaq Portable II
@@ -1861,6 +1921,40 @@ ROM_START( ncrpc8 )
ROM_LOAD ("ncr_keyboard_mcu_35091.bin", 0x0000, 0x800, CRC(632556cc) SHA1(b35f30bd0664fc1c2775a594f248d1e30237900a))
ROM_END
+// Nixdorf 8810 M15 Laptop - PC07 - boot from harddisk doesn't work
+ROM_START( n8810m15 )
+ // ROM_LOAD("charagene_v1.1_daft2c2.bin", 0x00000, 0x4000, CRC(dd324efd) SHA1(67fd91277733596bfad8506dc92d9f776e563dda)) // CGA chargen
+
+ ROM_REGION(0x20000, "bios", 0 )
+ ROM_LOAD16_BYTE( "rbios_even_daft2a3.bin", 0x10000, 0x8000, CRC(790abf68) SHA1(fbdb5e628ee9a605c8c1485a3fbb67736ff03153))
+ ROM_LOAD16_BYTE( "rbios_odd_daft2b3.bin", 0x10001, 0x8000, CRC(b09a812a) SHA1(c1b3321715260f9cd8c810325dc10c674ea05174))
+ROM_END
+
+// Nixdorf 8810 M16 Laptop - PC17 - CGA version - boot from harddisk doesn't work
+ROM_START( n8810m16c )
+ // ROM_LOAD("201cg rev 1.0.u78", 0x00000, 0x4000, CRC(3e31143b) SHA1(489da357e0ab8a469a3fb81cce160637486c87bc)) // CGA chargen
+ ROM_REGION(0x20000, "bios", 0 )
+ ROM_LOAD16_BYTE( "nmc27c256.u35", 0x10000, 0x8000, CRC(51acd116) SHA1(1a0bf24af4eba48d0deb0132a523e131902d2bcd))
+ ROM_LOAD16_BYTE( "nmc27c256.u36", 0x10001, 0x8000, CRC(fb47f9da) SHA1(d9bd4aea850a83764454a5c86c8da09f7c640fd6))
+ ROM_REGION( 0x0800, "keyboard", 0 )
+ ROM_LOAD( "d8749h.u69", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) )
+ROM_END
+
+// Nixdorf 8810 M16 Laptop - PC17 - VGA version - boot from harddisk doesn't work
+ROM_START( n8810m16v )
+ // ROM_LOAD("8810m16vga_27c256_221vb_123g1.bin", 0x00000, 0x4000, CRC(3bc80739) SHA1(3d6d7fb01681eccbc0b560818654d5aa1e3c5230)) // C&T VGA BIOS for 82C455
+ ROM_REGION(0x20000, "bios", 0 )
+ ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_a.bin", 0x10000, 0x8000, CRC(1de5e49b) SHA1(759878e13801278de96700bbef318a49cca68054))
+ ROM_LOAD16_BYTE( "8810m16vga_27c256_286bios_a2531511_b.bin", 0x10001, 0x8000, CRC(a65cf1f8) SHA1(30d46b49e87f272540e24a278848122b3c40bdaf))
+ ROM_REGION( 0x0800, "keyboard", 0 )
+ ROM_LOAD( "8810m16vga_8749_201kb_rev3a.bin", 0x000, 0x0800, CRC(030051da) SHA1(91b60228452cd1d6af99786402bd3b4d3efc2f05) )
+ROM_END
+
+// Nixdorf 8810 M30
+ROM_START( n8810m30 )
+ ROM_REGION(0x20000, "bios", 0 )
+ ROM_LOAD( "at286bios_53889.00.0.17jr.bin", 0x00000, 0x20000, CRC(74870212) SHA1(adb3f379c9aeee6a5beb946d23af6eea706aca1d) )
+ROM_END
// Nixdorf 8810 M55
ROM_START( n8810m55 )
@@ -1877,7 +1971,64 @@ ROM_START( m290 )
ROM_REGION( 0x0800, "keyboard", 0 )
ROM_LOAD( "m290_csl0_1.10.bin", 0x000, 0x0800, CRC(d767d496) SHA1(84246f7b39e0a005425948931cf93624b831e121) )
ROM_END
-
+
+// Siemens-Nixdorf PCD-3Nsx notebook
+ROM_START( pcd3nsx )
+ ROM_REGION( 0x20000, "bios", 0 )
+ // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - failure at 100000-10FFFF - Resume memory backup failure
+ ROM_SYSTEM_BIOS(0, "pcd3nsxno1", "pcd3nsxno1")
+ ROMX_LOAD( "3n102l30.bin", 0x00000, 0x20000, CRC(02384c19) SHA1(552dc41b40272027e2b031187f8ab1e1513751b9), ROM_BIOS(0) )
+ // Phoenix 80386 ROM BIOS PLUS Version 1.10.00 - Memory high address failure at 100000-10FFFF - Resume memory backup failure
+ ROM_SYSTEM_BIOS(1, "pcd3nsxno2", "pcd3nsxno2")
+ ROMX_LOAD( "3n120l40.bin", 0x00000, 0x20000, CRC(1336dd75) SHA1(80306d85f417c51a5235ac2f02ceb58bdb51205f), ROM_BIOS(1) )
+ROM_END
+
+// Siemens-Nixdorf 486 mainboards and BIOS versions
+// The same mainboards were used in various case versions to get the different model lines, so an identification by the mainboard number (Dxxx) is safest
+ROM_START( pcd4x )
+ ROM_REGION( 0x20000, "bios", 0 )
+ // D756, was used in PCD-4Lsx, contains Cirrus Logic VGA ROM
+ ROM_SYSTEM_BIOS(0, "d756v320r316", "D756 BIOS V3.20 R3.16")
+ ROMX_LOAD( "fts_biosupdated756noflashbiosepromv320_320316_149.bin", 0x00000, 0x20000, CRC(2ab60725) SHA1(333b64424c08ecbbaf47110c99ad0335da211489), ROM_BIOS(0) )
+ // D674, was used in PCD-4M, PCD-4Msx, PCD-4RSXA/4RA
+ ROM_SYSTEM_BIOS(1, "d674v320r316", "D674 BIOS V3.20 R3.16")
+ ROMX_LOAD( "fts_biosupdated674noflashbiosepromv320_320316_144.bin", 0x00000, 0x20000, CRC(1293d27c) SHA1(22f36c4a5a0912011ed54ff917244f412208ffc0), ROM_BIOS(1) )
+ // D802, was used in PCD-4HVL
+ ROM_SYSTEM_BIOS(2, "d802v320r316", "D802 BIOS V3.20 R3.34.802")
+ // PCD-4NL, contains C&T VGA BIOS
+ ROMX_LOAD( "fts_biosupdated802noflashbiosepromv320_320334_152.bin", 0x00000, 0x20000, CRC(fb1cd3d2) SHA1(98043c6f0299e1c56e5f266ea5f117ae456447ff), ROM_BIOS(2) )
+ROM_END
+
+// Siemens-Nixdorf PCD-4NL 486 subnotebook
+// PhoenixBIOS(TM) A486 Version 1.03
+// complains about "Pointer device failure" and "Memory failure at 00100000, read AA55 expecting 002C
+ROM_START( pcd4nl )
+ ROM_REGION( 0x20000, "bios", 0 )
+ ROM_LOAD( "pcd4nl.bin", 0x00000, 0x20000, CRC(8adb4900) SHA1(a01c665fed769ff815bc2e5ae30901f7e12d721b) )
+ROM_END
+
+// Siemens-Nixdorf PCD-4ND 486 notebook - display remains blank
+ROM_START( pcd4nd )
+ ROM_REGION( 0x20000, "bios", 0 )
+ ROM_SYSTEM_BIOS(0, "pcd4ndno1", "pcd4ndno1")
+ ROMX_LOAD( "bf3m51.bin", 0x00000, 0x20000, CRC(6a2f90dd) SHA1(75704a83976e4bb02a028e761d01bd053cc0d4e7), ROM_BIOS(0) )
+ ROM_SYSTEM_BIOS(1, "pcd4ndno2", "pcd4ndno2")
+ ROMX_LOAD( "bf3q42.bin", 0x00000, 0x20000, CRC(fa81cf6e) SHA1(91313a6856ca22f40710a6c9c8a65f8e340784ab), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS(2, "pcd4ndno3", "pcd4ndno3")
+ ROMX_LOAD( "pcd-4nd_flash_28010.bin", 0x00000, 0x20000, CRC(53c0beea) SHA1(bfa17947529c51a8c9315884e156c01ddd23c0d8), ROM_BIOS(2) )
+ROM_END
+
+// Triumph-Adler Walkstation 386 SX - German version of the Olivetti S20 - screen remains blank
+ROM_START( walk386sx )
+ ROM_REGION( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS
+ ROM_LOAD( "cthj01_1014.bin", 0x00000, 0x20000, CRC(805084b9) SHA1(a92d78050844ccbcce53109c42603639aedd2335) )
+ROM_END
+
+// Triumph-Adler Walkstation 386DX - German version of the Olivetti D33 - screen remains blank
+ROM_START( walk386dx )
+ ROM_REGION( 0x20000, "bios", 0 ) // contains Cirrus Logic VGA BIOS
+ ROM_LOAD( "am28f010_ctaa060125rc.bin", 0x00000, 0x20000, CRC(6cc540fe) SHA1(9853793d5433bbc5efc09c7f31c4a8a8f78d4549) )
+ROM_END
// Nokia Data WS286
//ROM_START(nws286 ) // Computer is grey with Nokia logo.
@@ -1942,17 +2093,29 @@ COMP( 199?, pc70iii, ibm5170, 0, at486, 0, at_state, init_at
COMP( 1990, c286lt, ibm5170, 0, atvga, 0, at_state, init_at, "Commodore Business Machines", "Laptop C286LT", MACHINE_NOT_WORKING )
COMP( 1991, c386sxlt, ibm5170, 0, at386sx, 0, at_state, init_at, "Commodore Business Machines", "Laptop C386SX-LT", MACHINE_NOT_WORKING )
COMP( 199?, csl286, ibm5170, 0, atvga, 0, at_state, init_at, "Commodore Business Machines", "SL 286-16", MACHINE_NOT_WORKING )
+COMP( 199?, comt386, ibm5170, 0, at386, 0, at_state, init_at, "Commodore Business Machines", "Tower 386", MACHINE_NOT_WORKING )
+COMP( 199?, comt486, ibm5170, 0, at486, 0, at_state, init_at, "Commodore Business Machines", "Tower 486", MACHINE_NOT_WORKING )
COMP( 1988, dsys200, ibm5170, 0, atvga, 0, at_state, init_at, "Dell Computer Corporation", "System 200", MACHINE_NOT_WORKING )
COMP( 1995, ficpio2, ibm5170, 0, ficpio2, 0, at_state, init_atpci, "FIC", "486-PIO-2", MACHINE_NOT_WORKING )
COMP( 1985, k286i, ibm5170, 0, k286i, 0, at_state, init_at, "Kaypro", "286i", MACHINE_NOT_WORKING )
COMP( 1991, t2000sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Toshiba", "T2000SX", MACHINE_NOT_WORKING )
COMP( 199?, mbc28, ibm5170, 0, at386sx, 0, at_state, init_at, "Sanyo", "MBC-28", MACHINE_NOT_WORKING )
COMP( 1986, pcd2, ibm5170, 0, ibm5170, 0, at_state, init_at, "Siemens", "PCD-2", MACHINE_NOT_WORKING )
+COMP( 199?, pcd3nsx, ibm5170, 0, at386sx, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-3Nsx", MACHINE_NOT_WORKING )
+COMP( 199?, pcd4x, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4H, PCD-4M", MACHINE_NOT_WORKING )
+COMP( 199?, pcd4nl, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4NL", MACHINE_NOT_WORKING )
+COMP( 199?, pcd4nd, ibm5170, 0, at486, 0, at_state, init_at, "Siemens-Nixdorf", "PCD-4ND", MACHINE_NOT_WORKING )
+COMP( 199?, walk386sx, ibm5170, 0, at386sx, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386 SX", MACHINE_NOT_WORKING )
+COMP( 199?, walk386dx, ibm5170, 0, at386, 0, at_state, init_at, "Triumph-Adler", "Walkstation 386DX", MACHINE_NOT_WORKING )
COMP( 1987, comportii ,ibm5170, 0, comportii, 0, at_state, init_at, "Compaq", "Portable II", MACHINE_NOT_WORKING )
COMP( 1987, comportiii,ibm5170, 0, comportiii,0, at_state, init_at, "Compaq", "Portable III", MACHINE_NOT_WORKING )
COMP( 1988, comslt286, ibm5170, 0, atvga, 0, at_state, init_at, "Compaq", "SLT/286", MACHINE_NOT_WORKING )
COMP( 1986, ews286, ibm5170, 0, ews286, 0, at_state, init_at, "Ericsson", "Ericsson WS286", MACHINE_NOT_WORKING )
COMP( 1986, ncrpc8, ibm5170, 0, atvga, 0, at_state, init_at, "NCR", "PC-8", MACHINE_NOT_WORKING )
+COMP( 198?, n8810m15, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M15", MACHINE_NOT_WORKING )
+COMP( 198?, n8810m16c, ibm5170, 0, n8810m15, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 CGA version", MACHINE_NOT_WORKING )
+COMP( 198?, n8810m16v, ibm5170, 0, atvga, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M16 VGA version", MACHINE_NOT_WORKING )
+COMP( 198?, n8810m30, ibm5170, 0, neat, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M30", MACHINE_NOT_WORKING )
COMP( 1986, n8810m55, ibm5170, 0, n8810m55, 0, at_state, init_at, "Nixdorf Computer AG", "8810 M55", MACHINE_NOT_WORKING )
COMP( 198?, m290, ibm5170, 0, atvga, 0, at_state, init_at, "Olivetti", "M290", MACHINE_NOT_WORKING )
//COMP( 1988, nws286, ibm5170, 0, ews286, 0, at_state, at, "Nokia Data", "Nokia Data WS286", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/c900.cpp b/src/mame/drivers/c900.cpp
index bec1220521e..c7d95650768 100644
--- a/src/mame/drivers/c900.cpp
+++ b/src/mame/drivers/c900.cpp
@@ -32,6 +32,7 @@ To Do:
#include "emu.h"
#include "cpu/z8000/z8000.h"
+#include "cpu/m6502/m6510.h"
#include "machine/z80scc.h"
#include "bus/rs232/rs232.h"
#include "machine/z8536.h"
@@ -46,6 +47,7 @@ public:
c900_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
+ , m_fdcpu(*this, "fdcpu")
, m_spkrdev(*this, "speaker")
{ }
@@ -56,8 +58,12 @@ private:
void data_map(address_map &map);
void io_map(address_map &map);
+ void special_io_map(address_map &map);
void mem_map(address_map &map);
+ void fdc_map(address_map &map);
+
required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_fdcpu;
required_device<speaker_sound_device> m_spkrdev;
};
@@ -84,6 +90,17 @@ void c900_state::io_map(address_map &map)
map(0x0100, 0x013f).rw("scc", FUNC(scc8030_device::zbus_r), FUNC(scc8030_device::zbus_w)).umask16(0x00ff);
}
+void c900_state::special_io_map(address_map &map)
+{
+ // TODO: Z8010 MMU
+}
+
+void c900_state::fdc_map(address_map &map)
+{
+ map(0x0000, 0x01ff).noprw(); // internal
+ map(0xe000, 0xffff).rom().region("fdc", 0);
+}
+
static INPUT_PORTS_START( c900 )
INPUT_PORTS_END
@@ -112,6 +129,10 @@ void c900_state::c900(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &c900_state::mem_map);
m_maincpu->set_addrmap(AS_DATA, &c900_state::data_map);
m_maincpu->set_addrmap(AS_IO, &c900_state::io_map);
+ m_maincpu->set_addrmap(z8001_device::AS_SIO, &c900_state::special_io_map);
+
+ M6508(config, m_fdcpu, 12_MHz_XTAL / 8); // PH1/PH2 = 1.5 MHz
+ m_fdcpu->set_addrmap(AS_PROGRAM, &c900_state::fdc_map);
GFXDECODE(config, "gfxdecode", "palette", gfx_c900);
PALETTE(config, "palette", palette_device::MONOCHROME);
diff --git a/src/mame/drivers/compc.cpp b/src/mame/drivers/compc.cpp
index 4b83f0c23d7..75c37c6e4a5 100644
--- a/src/mame/drivers/compc.cpp
+++ b/src/mame/drivers/compc.cpp
@@ -62,6 +62,7 @@ public:
void compc(machine_config &config);
void pc10iii(machine_config &config);
+ void compc1(machine_config &config);
void compc_io(address_map &map);
void compc_map(address_map &map);
void compciii_io(address_map &map);
@@ -306,6 +307,34 @@ ROM_START(pc10iii)
ROMX_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6), ROM_BIOS(8))
ROM_END
+
+/*********************************************************** Commodore PC-1 ***
+
+Links: http://www.amiga-stuff.com/hardware/pc-i.html , http://www.zimmers.net/cbmpics/cpci.html
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz
+RAM: 512K / 640K
+Bus: Proprietary expansion slot, carrying almost all ISA signals
+Video: On board, MDA/Hercules/CGA
+Mass storage: 1x 5.25" 360K
+On board ports: Floppy, floppy expansion (for Amiga A1010/1011 (720 KB, 3.5") or A1020 (360 KB, 5.25" drives), speaker (but no speaker fitted), mouse,
+Options: 8087 FPU
+Expansion: Expansion box: 2x ISA
+
+******************************************************************************/
+
+ROM_START( compc1 )
+ ROM_DEFAULT_BIOS("bios12")
+ ROM_REGION(0x10000, "bios", 0)
+ ROM_SYSTEM_BIOS(0, "bios11", "PC-1 BIOS Rev. 1.1")
+ ROMX_LOAD("pc1_bios.bin", 0xc000, 0x4000, CRC(e37367c8) SHA1(9aac9c38b4ebdb9a740e393199c2eff75a0bde03), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "bios12", "PC-1 BIOS Rev. 1.2")
+ ROMX_LOAD("cbm-pci-bios-v1.2-380270-02.bin", 0xc000, 0x4000, CRC(7f744f87) SHA1(07f94a7e8ca4ddd1c738b304d24358711b4cd2ca), ROM_BIOS(1))
+ ROM_REGION(0x8000, "gfx1", 0)
+ ROM_LOAD("pc1_char.bin", 0x0000, 0x4000, CRC(ee6c27f0) SHA1(e769cc3a49a1d708bd74eb4ac85bb6ea67220d38))
+ROM_END
+
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1984, compc10, ibm5150, 0, compc, compc, compc_state, empty_init, "Commodore Business Machines", "Commodore PC 10", MACHINE_NOT_WORKING )
COMP( 1987, pc10iii, ibm5150, 0, pc10iii, compciii, compc_state, empty_init, "Commodore Business Machines", "Commodore PC-10 III", MACHINE_NOT_WORKING )
+COMP( 198?, compc1, ibm5150, 0, pc10iii, compciii, compc_state, empty_init, "Commodore Business Machines", "PC-1", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/eti660.cpp b/src/mame/drivers/eti660.cpp
index 4d5f9cafeeb..2d2f74b099a 100644
--- a/src/mame/drivers/eti660.cpp
+++ b/src/mame/drivers/eti660.cpp
@@ -29,9 +29,9 @@
- sometimes there's no sound when started. You may need to hard reset until it beeps.
- doesn't run programs for other chip-8 computers (this might be normal?)
- we support BIN files, but have none to test with.
- - probable CPU bugs:
+ - possible CPU bugs?:
- in Invaders, can't shoot them
- - in Maze, the result is rubbish (these work in Emma02 emulator)
+ - in Maze, the result is rubbish (works in Emma02 emulator v1.21, but not in v1.30)
**************************************************************************************************/
diff --git a/src/mame/drivers/firetrk.cpp b/src/mame/drivers/firetrk.cpp
index 6e7d25d71a6..9f1be21a6da 100644
--- a/src/mame/drivers/firetrk.cpp
+++ b/src/mame/drivers/firetrk.cpp
@@ -923,7 +923,7 @@ ROM_START( firetrk )
ROM_REGION( 0x4000, "maincpu", 0 )
ROM_LOAD( "032823-02.c1", 0x2000, 0x800, CRC(9570bdd3) SHA1(4d26a9490d05d53da55fc59459a4dce5bca6c761) )
ROM_LOAD( "032824-01.d1", 0x2800, 0x800, CRC(a5fc5629) SHA1(bf20510d8623eda2740ff296a7813a3e6f7ec76e) )
- ROM_LOAD_NIB_HIGH( "032816-01.k1", 0x3000, 0x800, CRC(c0535598) SHA1(15cb6985b0b22140b7fae1e050e0b63dd4d0f793) )
+ ROM_LOAD_NIB_HIGH( "032816-01.k1", 0x3000, 0x800, CRC(c0535598) SHA1(15cb6985b0b22140b7fae1e050e0b63dd4d0f793) ) // one PCB has been found with this ROM labeled 032816-02.k1, CRC matches
ROM_LOAD_NIB_LOW ( "032820-01.k2", 0x3000, 0x800, CRC(5733f9ed) SHA1(0f19a40793dadfb7de2c2b54a44929b414d0f4ed) )
ROM_LOAD_NIB_HIGH( "032815-01.j1", 0x3800, 0x800, CRC(506ee759) SHA1(d111356c84f3d9942a27fbe243e716d14c258a16) )
ROM_LOAD_NIB_LOW ( "032819-01.j2", 0x3800, 0x800, CRC(f1c3fa87) SHA1(d75cf4ad0bcac3289c068837fc24cfe84ce7542a) )
diff --git a/src/mame/drivers/genpc.cpp b/src/mame/drivers/genpc.cpp
index 3628dd1248c..8e92da4b568 100644
--- a/src/mame/drivers/genpc.cpp
+++ b/src/mame/drivers/genpc.cpp
@@ -197,9 +197,8 @@ ROM_START(pc)
ROMX_LOAD( "pcpi-192.rom", 0x00000, 0x2000, CRC(ef2da5ce) SHA1(95376440be1276e6f1c16fe49c847056bb1e4d5c),ROM_BIOS(39))
ROM_SYSTEM_BIOS(40, "fday17", "Faraday 5 slot PC") // use pcherc
ROMX_LOAD( "fdaypc17.rom", 0x00000, 0x2000, CRC(26bb29ac) SHA1(5a58680b9193f4323db3e7894f853dc82d17f4ee),ROM_BIOS(40))
-
-
-
+ ROM_SYSTEM_BIOS(41, "tava238", "Tava DTK Erso V2.38")
+ ROMX_LOAD( "tava_dtk_erso_bios_2.38_u87.bin", 0x00000, 0x2000, CRC(34f5c0e5) SHA1(5a1590f948670a5ef85a1ee7cbb40387fced8a1f), ROM_BIOS(41))
ROM_END
#define rom_pcmda rom_pc
diff --git a/src/mame/drivers/hh_sm510.cpp b/src/mame/drivers/hh_sm510.cpp
index cbe81efbc5d..1e1a66e13dd 100644
--- a/src/mame/drivers/hh_sm510.cpp
+++ b/src/mame/drivers/hh_sm510.cpp
@@ -8858,43 +8858,81 @@ ROM_END
/***************************************************************************
- Tronica Space Rescue (model MG-9)
- * PCB label MG-9 080492
- * Sharp SM510 label 0015 224B TRONICA (no decap)
+ Tronica Shuttle Voyage (MG-8)
+ * Sharp SM510 label 0019 238E TRONICA (no decap)
* lcd screen with custom segments, 1-bit sound
+ Even though the serial is MG-8, the back of the game says 1983, newer than MG-9?
+ Thief in Garden (model TG-18) is the exact same MCU, but different graphics.
+
***************************************************************************/
-class trsrescue_state : public hh_sm510_state
+class trshutvoy_state : public hh_sm510_state
{
public:
- trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) :
+ trshutvoy_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_sm510_state(mconfig, type, tag)
{ }
- void trsrescue(machine_config &config);
+ void trshutvoy(machine_config &config);
+ void tigarden(machine_config &config);
};
// config
-static INPUT_PORTS_START( trsrescue )
+static INPUT_PORTS_START( trshutvoy )
PORT_START("IN.0") // S1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3")
PORT_START("IN.1") // S2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7")
+
+ PORT_START("IN.2") // S3
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=")
+
+ PORT_START("IN.3") // S4
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_MULTIPLY)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_DIVIDE)
+
+ PORT_START("IN.4") // S5
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.5") // S6
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
+
+ PORT_START("IN.6") // S7
+ PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F
+
+ PORT_START("IN.7") // S8
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode")
+ PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("ACL")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL")
+
+ PORT_START("FAKE") // Up/Sound are electronically the same button
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound")
INPUT_PORTS_END
-void trsrescue_state::trsrescue(machine_config &config)
+void trshutvoy_state::trshutvoy(machine_config &config)
{
/* basic machine hardware */
SM510(config, m_maincpu);
@@ -8908,7 +8946,7 @@ void trsrescue_state::trsrescue(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(1533, 1080);
+ screen.set_size(1496, 1080);
screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -8919,14 +8957,32 @@ void trsrescue_state::trsrescue(machine_config &config)
m_speaker->add_route(ALL_OUTPUTS, "mono", 0.25);
}
+void trshutvoy_state::tigarden(machine_config &config)
+{
+ trshutvoy(config);
+
+ /* video hardware */
+ screen_device *screen = subdevice<screen_device>("screen");
+ screen->set_size(1515, 1080);
+ screen->set_visarea_full();
+}
+
// roms
-ROM_START( trsrescue )
+ROM_START( trshutvoy )
ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) )
+ ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) )
- ROM_REGION( 178600, "svg", 0)
- ROM_LOAD( "trsrescue.svg", 0, 178600, CRC(2fa7b2d9) SHA1(5d1fc88db3129c9126f0c05ea55fb5f117e02871) )
+ ROM_REGION( 221654, "svg", 0)
+ ROM_LOAD( "trshutvoy.svg", 0, 221654, CRC(470a7ff5) SHA1(b297601d8a5a9c4aef414605632849e0b1925caa) )
+ROM_END
+
+ROM_START( tigarden )
+ ROM_REGION( 0x1000, "maincpu", 0 )
+ ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) )
+
+ ROM_REGION( 409084, "svg", 0)
+ ROM_LOAD( "tigarden.svg", 0, 409084, CRC(cfda5138) SHA1(1bc4ed65ae0cdca3e1e9458d68ca4d6e0fc0e901) )
ROM_END
@@ -8935,77 +8991,43 @@ ROM_END
/***************************************************************************
- Tronica Thief in Garden (model TG-18)
- * Sharp SM510 label 0019 238E TRONICA (no decap)
+ Tronica Space Rescue (model MG-9)
+ * PCB label MG-9 080492
+ * Sharp SM510 label 0015 224B TRONICA (no decap)
* lcd screen with custom segments, 1-bit sound
***************************************************************************/
-class tigarden_state : public hh_sm510_state
+class trsrescue_state : public hh_sm510_state
{
public:
- tigarden_state(const machine_config &mconfig, device_type type, const char *tag) :
+ trsrescue_state(const machine_config &mconfig, device_type type, const char *tag) :
hh_sm510_state(mconfig, type, tag)
{ }
- void tigarden(machine_config &config);
+ void trsrescue(machine_config &config);
};
// config
-static INPUT_PORTS_START( tigarden )
+static INPUT_PORTS_START( trsrescue )
PORT_START("IN.0") // S1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("0")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("1")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("2")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("3")
-
- PORT_START("IN.1") // S2
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("4")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("5")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("6")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("7")
-
- PORT_START("IN.2") // S3
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("8")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("9")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(".")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("=")
-
- PORT_START("IN.3") // S4
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("+")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME("-")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_MULTIPLY)
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHANGED_CB(input_changed) PORT_NAME(UTF8_DIVIDE)
-
- PORT_START("IN.4") // S5
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_CHANGED_CB(input_changed) PORT_NAME("ALM")
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_CHANGED_CB(input_changed) PORT_NAME("%")
- PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_CHANGED_CB(input_changed) PORT_NAME("C")
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.5") // S6
- PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_UNUSED )
-
- PORT_START("IN.6") // S7
- PORT_BIT( 0x01, 0x01, IPT_CUSTOM ) PORT_CONDITION("FAKE", 0x03, NOTEQUALS, 0x00) // Up/Sound
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED )
- PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CHANGED_CB(input_changed) // F
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_CHANGED_CB(input_changed) PORT_16WAY
- PORT_START("IN.7") // S8
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_CHANGED_CB(input_changed) PORT_NAME("Mode")
- PORT_BIT( 0x0e, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_START("IN.1") // S2
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Alarm")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game B")
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_CHANGED_CB(input_changed) PORT_NAME("Game A")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_CHANGED_CB(input_changed) PORT_NAME("Time")
PORT_START("ACL")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL")
-
- PORT_START("FAKE") // Up/Sound are electronically the same button
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_CHANGED_CB(input_changed) PORT_16WAY
- PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_VOLUME_DOWN ) PORT_CHANGED_CB(input_changed) PORT_NAME("Sound")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_CHANGED_CB(acl_button) PORT_NAME("ACL")
INPUT_PORTS_END
-void tigarden_state::tigarden(machine_config &config)
+void trsrescue_state::trsrescue(machine_config &config)
{
/* basic machine hardware */
SM510(config, m_maincpu);
@@ -9019,7 +9041,7 @@ void tigarden_state::tigarden(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_SVG));
screen.set_svg_region("svg");
screen.set_refresh_hz(50);
- screen.set_size(1515, 1080);
+ screen.set_size(1533, 1080);
screen.set_visarea_full();
TIMER(config, "display_decay").configure_periodic(FUNC(hh_sm510_state::display_decay_tick), attotime::from_msec(1));
@@ -9032,12 +9054,12 @@ void tigarden_state::tigarden(machine_config &config)
// roms
-ROM_START( tigarden )
+ROM_START( trsrescue )
ROM_REGION( 0x1000, "maincpu", 0 )
- ROM_LOAD( "0019_238e", 0x0000, 0x1000, CRC(8bd0eadd) SHA1(7bb5eb30d569901dce52d777bc01c0979e4afa06) )
+ ROM_LOAD( "0015_224b", 0x0000, 0x1000, CRC(f58a3832) SHA1(2d843b3520de66463e628cea9344a04015d1f5f1) )
- ROM_REGION( 409084, "svg", 0)
- ROM_LOAD( "tigarden.svg", 0, 409084, CRC(cfda5138) SHA1(1bc4ed65ae0cdca3e1e9458d68ca4d6e0fc0e901) )
+ ROM_REGION( 178600, "svg", 0)
+ ROM_LOAD( "trsrescue.svg", 0, 178600, CRC(2fa7b2d9) SHA1(5d1fc88db3129c9126f0c05ea55fb5f117e02871) )
ROM_END
@@ -9269,7 +9291,10 @@ CONS( 1996, tinday, 0, 0, tinday, tinday, tinday_state,
// Tiger 72-xxx models
CONS( 1992, tbatmana, 0, 0, tbatmana, tbatmana, tbatmana_state, empty_init, "Tiger Electronics", "Batman: The Animated Series (handheld)", MACHINE_SUPPORTS_SAVE )
-// misc
+// Tronica
+CONS( 1983, trshutvoy, 0, 0, trshutvoy, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Shuttle Voyage", MACHINE_SUPPORTS_SAVE )
+CONS( 1983, tigarden, trshutvoy, 0, tigarden, trshutvoy, trshutvoy_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE )
CONS( 1982, trsrescue, 0, 0, trsrescue, trsrescue, trsrescue_state, empty_init, "Tronica", "Space Rescue", MACHINE_SUPPORTS_SAVE )
-CONS( 1983, tigarden, 0, 0, tigarden, tigarden, tigarden_state, empty_init, "Tronica", "Thief in Garden", MACHINE_SUPPORTS_SAVE )
+
+// misc
CONS( 1989, nummunch, 0, 0, nummunch, nummunch, nummunch_state, empty_init, "VTech", "Electronic Number Muncher", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/m20.cpp b/src/mame/drivers/m20.cpp
index c2150c67c66..4c43bb26821 100644
--- a/src/mame/drivers/m20.cpp
+++ b/src/mame/drivers/m20.cpp
@@ -236,7 +236,7 @@ WRITE_LINE_MEMBER( m20_state::timer_tick_w )
*/
if(m_apb)
m_apb->nvi_w(state);
- m_maincpu->set_input_line(INPUT_LINE_IRQ0, state ? HOLD_LINE /*ASSERT_LINE*/ : CLEAR_LINE);
+ m_maincpu->set_input_line(z8001_device::NVI_LINE, state ? HOLD_LINE /*ASSERT_LINE*/ : CLEAR_LINE);
}
@@ -744,7 +744,7 @@ WRITE_LINE_MEMBER(m20_state::int_w)
{
if(m_apb && !m_apb->halted())
m_apb->vi_w(state);
- m_maincpu->set_input_line(INPUT_LINE_IRQ1, state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(z8001_device::VI_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
void m20_state::machine_start()
diff --git a/src/mame/drivers/metro.cpp b/src/mame/drivers/metro.cpp
index 1d8b82f2edd..e0e62ea73fe 100644
--- a/src/mame/drivers/metro.cpp
+++ b/src/mame/drivers/metro.cpp
@@ -4497,7 +4497,7 @@ HSync: 15.16kHz
***************************************************************************/
-ROM_START( lastfort )
+ROM_START( lastfort ) /* Japanese version on PCB VG420 */
ROM_REGION( 0x040000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "tr_jc09", 0x000000, 0x020000, CRC(8b98a49a) SHA1(15adca78d54973820d04f8b308dc58d0784eb900) )
ROM_LOAD16_BYTE( "tr_jc10", 0x000001, 0x020000, CRC(8d04da04) SHA1(5c7e65a39929e94d1fa99aeb5fed7030b110451f) )
@@ -4541,6 +4541,24 @@ ROM_START( lastfortk )
ROM_LOAD( "tr_jb11", 0x000000, 0x020000, CRC(83786a09) SHA1(910cf0ccf4493f2a80062149f6364dbb6a1c2a5d) )
ROM_END
+ROM_START( lastfortj ) /* Japanese version on PCB VG460-(A) */
+ ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */
+ ROM_LOAD16_BYTE( "tr_mja2.8g", 0x000000, 0x020000, CRC(4059a8c8) SHA1(05f271fb86a01359b1737bbfdf3c0a83364dd7d3) )
+ ROM_LOAD16_BYTE( "tr_mja3.10g", 0x000001, 0x020000, CRC(8fc6ddcd) SHA1(626070094fbbd982e1c8d699f171a1c500db1620) )
+
+ ROM_REGION( 0x20000, "audiocpu", 0 ) /* NEC78C10 Code */
+ ROM_LOAD( "tr_ma01.1i", 0x000000, 0x020000, CRC(8a8f5fef) SHA1(530b4966ec058cd80a2fc5f9e961239ce59d0b89) ) /* Same as parent set, but different label */
+
+ ROM_REGION( 0x200000, "vdp", 0 ) /* Gfx + Data (Addressable by CPU & Blitter) */
+ ROMX_LOAD( "tr_ma04.15f", 0x000000, 0x080000, CRC(5feafc6f) SHA1(eb50905eb0d25eb342e08d591907f79b5eadff43) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "tr_ma07.17d", 0x000002, 0x080000, CRC(7519d569) SHA1(c88932a19a48d45a19b777113a4719b18f42a297) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "tr_ma05.17f", 0x000004, 0x080000, CRC(5d917ba5) SHA1(34fc72924fa2877c1038d7f61b22f7667af01e9f) , ROM_GROUPWORD | ROM_SKIP(6))
+ ROMX_LOAD( "tr_ma06.15d", 0x000006, 0x080000, CRC(d366c04e) SHA1(e0a67688043cb45916860d32ff1076d9257e6ad9) , ROM_GROUPWORD | ROM_SKIP(6))
+
+ ROM_REGION( 0x40000, "oki", 0 ) /* Samples */
+ ROM_LOAD( "tr_ma08.1d", 0x000000, 0x020000, CRC(83786a09) SHA1(910cf0ccf4493f2a80062149f6364dbb6a1c2a5d) ) /* Same as parent set, but different label */
+ROM_END
+
ROM_START( lastfortg ) /* German version on PCB VG460-(A) */
ROM_REGION( 0x080000, "maincpu", 0 ) /* 68000 Code */
ROM_LOAD16_BYTE( "tr_ma02.8g", 0x000000, 0x020000, CRC(e6f40918) SHA1(c8c9369103530b2214c779c8a643ba9349b3eac5) )
@@ -5604,11 +5622,12 @@ GAME( 1992, pangpomsn, pangpoms, pangpoms, pangpoms, metro_state, init_metro,
GAME( 1992, skyalert, 0, skyalert, skyalert, metro_state, init_metro, ROT270, "Metro", "Sky Alert", MACHINE_SUPPORTS_SAVE )
GAME( 1993, ladykill, 0, karatour, ladykill, metro_state, init_karatour, ROT90, "Yanyaka (Mitchell license)", "Lady Killer", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1993, moegonta, ladykill, karatour, moegonta, metro_state, init_karatour, ROT90, "Yanyaka", "Moeyo Gonta!! (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1994, lastfort, 0, lastfort, lastfort, metro_state, init_metro, ROT0, "Metro", "Last Fortress - Toride (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, lastfort, 0, lastfort, lastfort, metro_state, init_metro, ROT0, "Metro", "Last Fortress - Toride (Japan, VG420 PCB)", MACHINE_SUPPORTS_SAVE ) // VG420 PCB
GAME( 1994, lastforte, lastfort, lastfort, lastfero, metro_state, init_metro, ROT0, "Metro", "Last Fortress - Toride (China, Rev C)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, lastfortea,lastfort, lastfort, lastfero, metro_state, init_metro, ROT0, "Metro", "Last Fortress - Toride (China, Rev A)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, lastfortk, lastfort, lastfort, lastfero, metro_state, init_metro, ROT0, "Metro", "Last Fortress - Toride (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, lastfortg, lastfort, lastforg, ladykill, metro_state, init_lastfortg,ROT0, "Metro", "Last Fortress - Toride (Germany)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, lastfortj, lastfort, lastforg, ladykill, metro_state, init_lastfortg,ROT0, "Metro", "Last Fortress - Toride (Japan, VG460 PCB)", MACHINE_SUPPORTS_SAVE ) // VG460-(A) PCB
+GAME( 1994, lastfortg, lastfort, lastforg, ladykill, metro_state, init_lastfortg,ROT0, "Metro", "Last Fortress - Toride (Germany)", MACHINE_SUPPORTS_SAVE ) // VG460-(A) PCB
// MTR5260 / MTR527
GAME( 1993, poitto, 0, poitto, poitto, metro_state, init_metro, ROT0, "Metro / Able Corp.", "Poitto!", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/microkit.cpp b/src/mame/drivers/microkit.cpp
index c57c2ceb475..dda3d5ed972 100644
--- a/src/mame/drivers/microkit.cpp
+++ b/src/mame/drivers/microkit.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Curt Coder
+// copyright-holders:Curt Coder, Robbbert
/*
RCA COSMAC Microkit
@@ -7,36 +7,25 @@
http://www.vintagecomputer.net/browse_thread.cfm?id=511
Press CR or LF to get the * prompt.
- Commands:
+ Commands (must be in UPPERcase):
$Pxxxx - Jump to address xxxx
?Mxxxx yyyy - Dump memory starting at xxxx for yyyy bytes
- !Mxxxx yy zz... - Write data (yy etc) to memory xxxx. Data gets entered when you
- press the space after the data.
+ !Mxxxx yyzz... - Write data (yy etc) to memory xxxx onwards.
There's no sound or storage facilities, therefore no software.
- ToDo:
- - No technical manual or schematic available, so the entire driver is bodgy guesswork.
- - Address 0 needs to be read/writeable, otherwise the numbers you enter will get
- internally corrupted.
- - Address 8000 is IDL which hangs the system, so program counter is preset to 8001.
- - The keyboard is hooked up serially, which is ok, but the output to the terminal
- is rubbish, so parallel is used so you can at least see something.
- - When you enter commands, you can't see what you're doing.
- - When you enter numbers, they display as rubbish or act as control codes. They
- internally work though.
- - The computer looks like a rack-mount metal box with a rudimentary front panel.
- Buttons are: Reset; Load; Run program; Run Utility
- There is a RUN LED.
- None of these items are emulated.
- It also has a power switch and lamp, and a fuse.
+ The computer looks like a rack-mount metal box with a rudimentary front panel.
+ - Buttons are: Reset; Load; Run program; Run Utility
+ - There is a RUN LED.
+ - It also has a power switch and lamp, and a fuse.
+ - According to the schematic there are LEDs on every data, address and status line.
*****************************************************************************************/
#include "emu.h"
#include "cpu/cosmac/cosmac.h"
#include "bus/rs232/rs232.h"
-#include "machine/terminal.h"
+#include "machine/cdp1852.h"
class microkit_state : public driver_device
@@ -44,13 +33,18 @@ class microkit_state : public driver_device
public:
microkit_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
+ , m_a15(1)
, m_maincpu(*this, "maincpu")
+ , m_rom(*this, "maincpu")
, m_rs232(*this, "rs232")
- , m_terminal(*this, "terminal")
{ }
void microkit(machine_config &config);
+ DECLARE_INPUT_CHANGED_MEMBER(reset_button);
+ DECLARE_INPUT_CHANGED_MEMBER(runp_button);
+ DECLARE_INPUT_CHANGED_MEMBER(runu_button);
+
private:
DECLARE_READ_LINE_MEMBER(clear_r);
DECLARE_WRITE8_MEMBER(ram_w);
@@ -59,63 +53,106 @@ private:
void microkit_io(address_map &map);
void microkit_mem(address_map &map);
+ virtual void machine_start() override;
virtual void machine_reset() override;
+ std::unique_ptr<uint8_t[]> m_ram;
uint8_t m_resetcnt;
- uint8_t m_ram_data;
+ bool m_a15;
required_device<cosmac_device> m_maincpu;
+ required_memory_region m_rom;
required_device<rs232_port_device> m_rs232;
- required_device<generic_terminal_device> m_terminal;
};
void microkit_state::microkit_mem(address_map &map)
{
- map(0x0000, 0x0000).rw(FUNC(microkit_state::ram_r), FUNC(microkit_state::ram_w));
- map(0x8000, 0x81ff).rom().region("maincpu", 0);
- map(0x8200, 0x83ff).ram();
+ map(0x0000, 0x01ff).rw(FUNC(microkit_state::ram_r),FUNC(microkit_state::ram_w));
+ map(0x0200, 0x0fff).ram();
+ map(0x8000, 0x81ff).rom().region("maincpu", 0); // CDP1832.U2
+ map(0x8c00, 0x8c1f).ram(); // CDP1824.U3 "Register Storage"
}
void microkit_state::microkit_io(address_map &map)
{
- map(0x07, 0x07).nopw(); // writes a lots of zeros here
+ map(0x05, 0x05).r("u4", FUNC(cdp1852_device::read)).w("u4", FUNC(cdp1852_device::write)); // user output port
+ map(0x06, 0x06).r("u5", FUNC(cdp1852_device::read)).w("u5", FUNC(cdp1852_device::write)); // user input port
+ map(0x07, 0x07).nopw(); // writes lots of zeros here
}
static INPUT_PORTS_START( microkit )
+ PORT_START("RESET")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET") PORT_CODE(KEYCODE_F3) PORT_CHANGED_MEMBER(DEVICE_SELF, microkit_state, reset_button, nullptr)
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RUN P") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, microkit_state, runp_button, nullptr)
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RUN U") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, microkit_state, runu_button, nullptr)
INPUT_PORTS_END
+INPUT_CHANGED_MEMBER(microkit_state::reset_button)
+{
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+ m_resetcnt = 0;
+}
+
+INPUT_CHANGED_MEMBER(microkit_state::runp_button)
+{
+ m_a15 = 0;
+ m_resetcnt = 0;
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
+INPUT_CHANGED_MEMBER(microkit_state::runu_button)
+{
+ m_a15 = 1;
+ m_resetcnt = 0;
+ m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? ASSERT_LINE : CLEAR_LINE);
+}
+
READ_LINE_MEMBER( microkit_state::clear_r )
{
- if (m_resetcnt < 0x10)
- m_maincpu->set_state_int(cosmac_device::COSMAC_R0, 0x8001); // skip IDL
if (m_resetcnt < 0x20)
m_resetcnt++;
- // set reset pin to normal
- return 1;
+
+ if (m_resetcnt < 0x10)
+ return 0;
+ else
+ if (m_resetcnt == 0x1c)
+ m_a15 = 0;
+
+ return 1;
}
READ8_MEMBER( microkit_state::ram_r )
{
- return m_ram_data;
+ if (m_a15)
+ return m_rom->base()[offset];
+ else
+ return m_ram[offset];
}
WRITE8_MEMBER( microkit_state::ram_w )
{
- m_ram_data = data;
- if (data > 0 && data < 0x80)
- m_terminal->write(data);
+ m_ram[offset] = data;
}
void microkit_state::machine_reset()
{
m_resetcnt = 0;
- m_ram_data = 0;
+ m_maincpu->reset();
+}
+
+void microkit_state::machine_start()
+{
+ // Register save state
+ save_item(NAME(m_resetcnt));
+ save_item(NAME(m_a15));
+ m_ram = make_unique_clear<uint8_t[]>(0x200);
+ save_pointer(NAME(m_ram), 0x200);
}
static DEVICE_INPUT_DEFAULTS_START( serial_keyb )
DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_300 )
DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_300 )
DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 )
- DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_8 )
- DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_NONE )
+ DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 )
+ DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_MARK )
DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_2 )
DEVICE_INPUT_DEFAULTS_END
@@ -123,23 +160,34 @@ DEVICE_INPUT_DEFAULTS_END
void microkit_state::microkit(machine_config &config)
{
// basic machine hardware
- CDP1802(config, m_maincpu, 1750000);
+ CDP1802(config, m_maincpu, 2_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &microkit_state::microkit_mem);
m_maincpu->set_addrmap(AS_IO, &microkit_state::microkit_io);
m_maincpu->wait_cb().set_constant(1);
m_maincpu->clear_cb().set(FUNC(microkit_state::clear_r));
+ m_maincpu->q_cb().set(m_rs232, FUNC(rs232_port_device::write_txd)).invert();
/* video hardware */
- RS232_PORT(config, m_rs232, default_rs232_devices, "keyboard");
+ RS232_PORT(config, m_rs232, default_rs232_devices, "terminal");
m_rs232->rxd_handler().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF4);
- m_rs232->set_option_device_input_defaults("keyboard", DEVICE_INPUT_DEFAULTS_NAME(serial_keyb));
- GENERIC_TERMINAL(config, m_terminal, 0);
+ m_rs232->set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(serial_keyb));
+
+ cdp1852_device &u4(CDP1852(config, "u4"));
+ u4.mode_cb().set_constant(1); // output
+
+ cdp1852_device &u5(CDP1852(config, "u5"));
+ u5.mode_cb().set_constant(0); // input
}
ROM_START( microkit )
- ROM_REGION( 0x200, "maincpu", ROMREGION_INVERT )
- ROM_LOAD( "3.2b", 0x000, 0x100, CRC(6799357e) SHA1(c46e3322b8b1b6534a7da04806be29fa265951b7) )
- ROM_LOAD( "4.2a", 0x100, 0x100, CRC(27267bad) SHA1(838df9be2dc175584a1a6ee1770039118e49482e) )
+ ROM_REGION( 0x200, "maincpu", 0 )
+ ROM_LOAD( "ut4.u2", 0x0000, 0x0200, CRC(ba642f8e) SHA1(8975a4c6a0bb699b53c753946aac54860054246a) )
+
+ // These are bad, with heaps of bugs
+ //ROM_REGION( 0x200, "maincpu", ROMREGION_INVERT )
+ //ROM_LOAD( "3.2b", 0x000, 0x100, CRC(6799357e) SHA1(c46e3322b8b1b6534a7da04806be29fa265951b7) )
+ //ROM_LOAD( "4.2a", 0x100, 0x100, CRC(27267bad) SHA1(838df9be2dc175584a1a6ee1770039118e49482e) )
+
ROM_END
-COMP( 1975, microkit, 0, 0, microkit, microkit, microkit_state, empty_init, "RCA", "COSMAC Microkit", MACHINE_IS_SKELETON )
+COMP( 1975, microkit, 0, 0, microkit, microkit, microkit_state, empty_init, "RCA", "COSMAC Microkit", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/mlanding.cpp b/src/mame/drivers/mlanding.cpp
index b6c3fa81384..4dfb1572506 100644
--- a/src/mame/drivers/mlanding.cpp
+++ b/src/mame/drivers/mlanding.cpp
@@ -82,17 +82,18 @@ public:
m_audiocpu(*this, "audiocpu"),
m_mechacpu(*this, "mechacpu"),
m_yoke(*this, "yokectrl"),
- m_msm1(*this, "msm1"),
- m_msm2(*this, "msm2"),
+ m_msm(*this, "msm%u", 1U),
m_ctc(*this, "ctc"),
m_dma_bank(*this, "dma_ram"),
- m_msm1_rom(*this, "adpcm1"),
- m_msm2_rom(*this, "adpcm2"),
+ m_msm_rom(*this, "adpcm%u", 1U),
m_g_ram(*this, "g_ram"),
m_cha_ram(*this, "cha_ram"),
m_dot_ram(*this, "dot_ram"),
m_power_ram(*this, "power_ram"),
- m_palette(*this, "palette")
+ m_palette(*this, "palette"),
+ m_io_dswa(*this, "DSWA"),
+ m_io_dswb(*this, "DSWB"),
+ m_io_limit(*this, "LIMIT%u", 0U)
{ }
void mlanding(machine_config &config);
@@ -109,7 +110,7 @@ private:
TIMER_DMA_COMPLETE
};
- static constexpr uint32_t c_dma_bank_words = 0x2000;
+ static constexpr u32 c_dma_bank_words = 0x2000;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_subcpu;
@@ -117,63 +118,65 @@ private:
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_mechacpu;
required_device<taitoio_yoke_device> m_yoke;
- required_device<msm5205_device> m_msm1;
- required_device<msm5205_device> m_msm2;
+ required_device_array<msm5205_device, 2> m_msm;
required_device<z80ctc_device> m_ctc;
required_memory_bank m_dma_bank;
- required_region_ptr<uint8_t> m_msm1_rom;
- required_region_ptr<uint8_t> m_msm2_rom;
+ required_region_ptr_array<u8, 2> m_msm_rom;
- required_shared_ptr<uint16_t> m_g_ram;
- required_shared_ptr<uint16_t> m_cha_ram;
- required_shared_ptr<uint16_t> m_dot_ram;
- required_shared_ptr<uint8_t> m_power_ram;
+ required_shared_ptr<u16> m_g_ram;
+ required_shared_ptr<u16> m_cha_ram;
+ required_shared_ptr<u16> m_dot_ram;
+ required_shared_ptr<u8> m_power_ram;
required_device<palette_device> m_palette;
- std::unique_ptr<uint16_t[]> m_dma_ram;
- uint8_t m_dma_cpu_bank;
- uint8_t m_dma_busy;
- uint16_t m_dsp_hold_signal;
-
- uint32_t m_msm_pos[2];
- uint8_t m_msm_reset[2];
- uint8_t m_msm_nibble[2];
- uint8_t m_msm2_vck;
- uint8_t m_msm2_vck2;
-
- DECLARE_WRITE16_MEMBER(dma_start_w);
- DECLARE_WRITE16_MEMBER(dma_stop_w);
- DECLARE_WRITE16_MEMBER(output_w);
- DECLARE_READ16_MEMBER(input_r);
- DECLARE_READ16_MEMBER(analog1_lsb_r);
- DECLARE_READ16_MEMBER(analog2_lsb_r);
- DECLARE_READ16_MEMBER(analog3_lsb_r);
- DECLARE_READ16_MEMBER(analog1_msb_r);
- DECLARE_READ16_MEMBER(analog2_msb_r);
- DECLARE_READ16_MEMBER(analog3_msb_r);
- DECLARE_READ16_MEMBER(power_ram_r);
- DECLARE_WRITE16_MEMBER(power_ram_w);
-
- DECLARE_WRITE16_MEMBER(dsp_control_w);
- DECLARE_READ16_MEMBER(dsp_hold_signal_r);
-
- DECLARE_WRITE8_MEMBER(sound_bankswitch_w);
- DECLARE_WRITE8_MEMBER(msm5205_1_start_w);
- DECLARE_WRITE8_MEMBER(msm5205_1_stop_w);
- DECLARE_WRITE8_MEMBER(msm5205_1_addr_lo_w);
- DECLARE_WRITE8_MEMBER(msm5205_1_addr_hi_w);
- DECLARE_WRITE8_MEMBER(msm5205_2_start_w);
- DECLARE_WRITE8_MEMBER(msm5205_2_stop_w);
+ required_ioport m_io_dswa;
+ required_ioport m_io_dswb;
+ required_ioport_array<2> m_io_limit;
+
+ std::unique_ptr<u16[]> m_dma_ram;
+ u8 m_dma_cpu_bank;
+ u8 m_dma_busy;
+ u16 m_dsp_hold_signal;
+
+ u32 m_msm_pos[2];
+ u8 m_msm_reset[2];
+ u8 m_msm_nibble[2];
+ u8 m_msm2_vck;
+ u8 m_msm2_vck2;
+
+ void dma_start_w(u16 data = 0);
+ void dma_stop_w(u16 data = 0);
+ void output_w(u16 data);
+ u16 input_r();
+ u8 analog1_lsb_r();
+ u8 analog2_lsb_r();
+ u8 analog3_lsb_r();
+ u8 analog1_msb_r();
+ u8 analog2_msb_r();
+ u8 analog3_msb_r();
+ u8 power_ram_r(offs_t offset);
+ void power_ram_w(offs_t offset, u8 data);
+
+ void dsp_control_w(u16 data);
+ u16 dsp_hold_signal_r();
+
+ void sound_bankswitch_w(u8 data);
+ void msm5205_1_start_w(u8 data = 0);
+ void msm5205_1_stop_w(u8 data = 0);
+ void msm5205_1_addr_lo_w(u8 data);
+ void msm5205_1_addr_hi_w(u8 data);
+ void msm5205_2_start_w(u8 data);
+ void msm5205_2_stop_w(u8 data);
DECLARE_WRITE_LINE_MEMBER(msm5205_1_vck);
DECLARE_WRITE_LINE_MEMBER(z80ctc_to0);
- DECLARE_READ8_MEMBER(motor_r);
+ u8 motor_r();
- uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- uint32_t exec_dma();
- void msm5205_update(int chip);
+ u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ u32 exec_dma();
+ void msm5205_update(unsigned chip);
void audio_map_io(address_map &map);
void audio_map_prog(address_map &map);
@@ -195,7 +198,7 @@ private:
void mlanding_state::machine_start()
{
// Allocate two DMA RAM banks
- m_dma_ram = std::make_unique<uint16_t[]>(c_dma_bank_words * 2);
+ m_dma_ram = std::make_unique<u16[]>(c_dma_bank_words * 2);
m_dma_bank->configure_entries(0, 2, m_dma_ram.get(), c_dma_bank_words * 2);
// Register state for saving
@@ -224,8 +227,8 @@ void mlanding_state::machine_reset()
m_msm_reset[0] = 0;
m_msm_reset[1] = 0;
- m_msm1->reset_w(1);
- m_msm2->reset_w(1);
+ m_msm[0]->reset_w(1);
+ m_msm[1]->reset_w(1);
m_msm2_vck = 0;
m_msm2_vck2 = 0;
}
@@ -238,16 +241,16 @@ void mlanding_state::machine_reset()
*
*************************************/
-uint32_t mlanding_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+u32 mlanding_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
const pen_t *pens = m_palette->pens();
- for (uint32_t y = cliprect.min_y; y <= cliprect.max_y; ++y)
+ for (u32 y = cliprect.min_y; y <= cliprect.max_y; ++y)
{
- uint16_t *src = &m_g_ram[(112 + y) * 512 + cliprect.min_x];
- uint16_t *dst = &bitmap.pix16(y, cliprect.min_x);
+ u16 *src = &m_g_ram[(112 + y) * 512 + cliprect.min_x];
+ u16 *dst = &bitmap.pix16(y, cliprect.min_x);
- for (uint32_t x = cliprect.min_x; x <= cliprect.max_x; ++x)
+ for (u32 x = cliprect.min_x; x <= cliprect.max_x; ++x)
{
*dst++ = pens[*src++ & 0x3fff];
}
@@ -264,12 +267,12 @@ uint32_t mlanding_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
*
*************************************/
-WRITE16_MEMBER(mlanding_state::dma_start_w)
+void mlanding_state::dma_start_w(u16 data)
{
m_dma_cpu_bank ^= 1;
m_dma_bank->set_entry(m_dma_cpu_bank);
- uint32_t pixels = exec_dma();
+ const u32 pixels = exec_dma();
if (pixels)
{
@@ -281,7 +284,7 @@ WRITE16_MEMBER(mlanding_state::dma_start_w)
}
-WRITE16_MEMBER(mlanding_state::dma_stop_w)
+void mlanding_state::dma_stop_w(u16 data)
{
m_dma_busy = 0;
timer_set(attotime::never);
@@ -305,58 +308,58 @@ WRITE16_MEMBER(mlanding_state::dma_stop_w)
3 ........ ....xxxx Colour
*/
-uint32_t mlanding_state::exec_dma()
+u32 mlanding_state::exec_dma()
{
- uint32_t pixcnt = 0;
- uint32_t gram_mask = m_g_ram.bytes() - 1;
- uint16_t *dma_ram = &m_dma_ram[(m_dma_cpu_bank ^ 1) * c_dma_bank_words];
+ u32 pixcnt = 0;
+ const u32 gram_mask = m_g_ram.bytes() - 1;
+ const u16 *dma_ram = &m_dma_ram[(m_dma_cpu_bank ^ 1) * c_dma_bank_words];
// Process the entries in DMA RAM
- for (uint32_t offs = 0; offs < c_dma_bank_words; offs += 4)
+ for (u32 offs = 0; offs < c_dma_bank_words; offs += 4)
{
- uint16_t attr = dma_ram[offs];
+ const u16 attr = dma_ram[offs];
if (attr == 0)
continue;
- uint16_t code = attr & 0x1fff;
+ u16 code = attr & 0x1fff;
- uint16_t xword = dma_ram[offs + 1];
- uint16_t yword = dma_ram[offs + 2];
+ const u16 xword = dma_ram[offs + 1];
+ const u16 yword = dma_ram[offs + 2];
- uint16_t x = xword & 0x1ff;
- uint16_t y = yword & 0x1ff;
- uint16_t sx = ((xword >> 11) & 0x1f) + 1;
- uint16_t sy = ((yword >> 11) & 0x1f) + 1;
+ const u16 x = xword & 0x1ff;
+ const u16 y = yword & 0x1ff;
+ const u16 sx = ((xword >> 11) & 0x1f) + 1;
+ const u16 sy = ((yword >> 11) & 0x1f) + 1;
- uint8_t colour = dma_ram[offs + 3] & 0xff;
+ const u8 colour = dma_ram[offs + 3] & 0xff;
if ((attr & 0x2000) == 0)
{
// Normal draw mode
- uint8_t basepix = colour << 4;
+ const u8 basepix = colour << 4;
- for (uint32_t j = 0; j < sx; ++j)
+ for (u32 j = 0; j < sx; ++j)
{
- for (uint32_t k = 0; k < sy; ++k)
+ for (u32 k = 0; k < sy; ++k)
{
// Draw an 8x8 tile
- for (uint32_t y1 = 0; y1 < 8; ++y1)
+ for (u32 y1 = 0; y1 < 8; ++y1)
{
- uint16_t *src = &m_cha_ram[(code * 2 * 8) + y1 * 2];
- uint32_t byteaddr = ((y + k * 8 + y1) * 512 + (j * 8 + x)) * 2;
+ const u16 *src = &m_cha_ram[(code * 2 * 8) + y1 * 2];
+ u32 byteaddr = ((y + k * 8 + y1) * 512 + (j * 8 + x)) * 2;
- uint8_t *pixdata = reinterpret_cast<uint8_t *>(m_g_ram.target()) + BYTE_XOR_BE(1);
+ u8 *pixdata = reinterpret_cast<u8 *>(m_g_ram.target()) + BYTE_XOR_BE(1);
- uint8_t p2 = *src & 0xff;
- uint8_t p1 = *src++ >> 8;
- uint8_t p4 = *src;
- uint8_t p3 = *src++ >> 8;
+ const u8 p2 = *src & 0xff;
+ const u8 p1 = *src++ >> 8;
+ const u8 p4 = *src;
+ const u8 p3 = *src++ >> 8;
// Draw 8 pixels
- for (uint32_t x1 = 0; x1 < 8; ++x1)
+ for (u32 x1 = 0; x1 < 8; ++x1)
{
- uint16_t pix = (BIT(p4, x1) << 3) | (BIT(p3, x1) << 2) | (BIT(p2, x1) << 1) | BIT(p1, x1);
+ const u16 pix = (BIT(p4, x1) << 3) | (BIT(p3, x1) << 2) | (BIT(p2, x1) << 1) | BIT(p1, x1);
if ((attr & 0x8000) == 0)
{
@@ -382,16 +385,16 @@ uint32_t mlanding_state::exec_dma()
else
{
// Set pixel or palette data
- for (uint32_t y1 = 0; y1 < sy * 8; ++y1)
+ for (u32 y1 = 0; y1 < sy * 8; ++y1)
{
- uint32_t byteaddr = (((y + y1) * 512) + x) * 2;
+ u32 byteaddr = (((y + y1) * 512) + x) * 2;
if ((attr & 0x4000) == 0)
{
// Clear pixel data
- uint8_t *pixdata = reinterpret_cast<uint8_t *>(m_g_ram.target()) + BYTE_XOR_BE(1);
+ u8 *pixdata = reinterpret_cast<u8 *>(m_g_ram.target()) + BYTE_XOR_BE(1);
- for (uint32_t x1 = 0; x1 < sx * 8; ++x1)
+ for (u32 x1 = 0; x1 < sx * 8; ++x1)
{
pixdata[byteaddr & gram_mask] = colour;
byteaddr += 2;
@@ -401,9 +404,9 @@ uint32_t mlanding_state::exec_dma()
else
{
// Clear palette data
- uint8_t *paldata = reinterpret_cast<uint8_t *>(m_g_ram.target()) + BYTE_XOR_BE(0);
+ u8 *paldata = reinterpret_cast<u8 *>(m_g_ram.target()) + BYTE_XOR_BE(0);
- for (uint32_t x1 = 0; x1 < sx * 8; ++x1)
+ for (u32 x1 = 0; x1 < sx * 8; ++x1)
{
paldata[byteaddr & gram_mask] = colour;
byteaddr += 2;
@@ -439,7 +442,7 @@ void mlanding_state::device_timer(emu_timer &timer, device_timer_id id, int para
*
*************************************/
-READ16_MEMBER(mlanding_state::input_r)
+u16 mlanding_state::input_r()
{
/*
FEDCBA98 76543210
@@ -448,13 +451,13 @@ READ16_MEMBER(mlanding_state::input_r)
x....... ........ DMA busy
*/
- uint8_t dswa = ioport("DSWA")->read();
- uint8_t dswb = ioport("DSWB")->read() & 0x7f;
+ const u8 dswa = m_io_dswa->read();
+ const u8 dswb = m_io_dswb->read() & 0x7f;
return m_dma_busy << 15 | dswb << 8 | dswa;
}
-WRITE16_MEMBER(mlanding_state::output_w)
+void mlanding_state::output_w(u16 data)
{
/*
76543210
@@ -481,25 +484,25 @@ WRITE16_MEMBER(mlanding_state::output_w)
*
*************************************/
-READ16_MEMBER(mlanding_state::analog1_msb_r)
+u8 mlanding_state::analog1_msb_r()
{
return (m_yoke->throttle_r() >> 4) & 0xff;
}
-READ16_MEMBER(mlanding_state::analog2_msb_r)
+u8 mlanding_state::analog2_msb_r()
{
return (m_yoke->stickx_r() >> 4) & 0xff;
}
-READ16_MEMBER(mlanding_state::analog3_msb_r)
+u8 mlanding_state::analog3_msb_r()
{
return (m_yoke->sticky_r() >> 4) & 0xff;
}
-READ16_MEMBER(mlanding_state::analog1_lsb_r)
+u8 mlanding_state::analog1_lsb_r()
{
/*
76543210
@@ -509,13 +512,13 @@ READ16_MEMBER(mlanding_state::analog1_lsb_r)
.x...... Slot down
*/
- uint8_t res = (ioport("LIMIT0")->read() & 0x70) | (m_yoke->throttle_r() & 0xf);
+ const u8 res = (m_io_limit[0]->read() & 0x70) | (m_yoke->throttle_r() & 0xf);
return res;
}
-READ16_MEMBER(mlanding_state::analog2_lsb_r)
+u8 mlanding_state::analog2_lsb_r()
{
/*
76543210
@@ -525,7 +528,7 @@ READ16_MEMBER(mlanding_state::analog2_lsb_r)
}
-READ16_MEMBER(mlanding_state::analog3_lsb_r)
+u8 mlanding_state::analog3_lsb_r()
{
/*
76543210
@@ -534,7 +537,7 @@ READ16_MEMBER(mlanding_state::analog3_lsb_r)
..x..... Handle left
.x...... Handle up
*/
- uint8_t res = (ioport("LIMIT1")->read() & 0x70) | (m_yoke->sticky_r() & 0xf);
+ const u8 res = (m_io_limit[1]->read() & 0x70) | (m_yoke->sticky_r() & 0xf);
return res;
}
@@ -546,13 +549,13 @@ READ16_MEMBER(mlanding_state::analog3_lsb_r)
*
*************************************/
-READ16_MEMBER(mlanding_state::dsp_hold_signal_r)
+u16 mlanding_state::dsp_hold_signal_r()
{
return m_dsp_hold_signal;
}
-WRITE16_MEMBER(mlanding_state::dsp_control_w)
+void mlanding_state::dsp_control_w(u16 data)
{
/*
1 after zeroing 'dot' RAM
@@ -569,22 +572,20 @@ WRITE16_MEMBER(mlanding_state::dsp_control_w)
*
*************************************/
-WRITE8_MEMBER(mlanding_state::sound_bankswitch_w)
+void mlanding_state::sound_bankswitch_w(u8 data)
{
// Unused?
}
-void mlanding_state::msm5205_update(int chip)
+void mlanding_state::msm5205_update(unsigned chip)
{
if (m_msm_reset[chip])
return;
- const uint8_t *rom = chip ? m_msm2_rom : m_msm1_rom;
- uint8_t data = rom[m_msm_pos[chip]];
- msm5205_device *msm = chip ? m_msm2 : m_msm1;
+ const u8 data = m_msm_rom[chip][m_msm_pos[chip]];
- msm->write_data((m_msm_nibble[chip] ? data : data >> 4) & 0xf);
+ m_msm[chip]->write_data((m_msm_nibble[chip] ? data : data >> 4) & 0xf);
if (m_msm_nibble[chip])
++m_msm_pos[chip];
@@ -607,7 +608,7 @@ WRITE_LINE_MEMBER(mlanding_state::z80ctc_to0)
// CTC output is divided by 2
if (m_msm2_vck)
{
- m_msm2->vclk_w(1);
+ m_msm[1]->vclk_w(1);
}
else
{
@@ -618,13 +619,13 @@ WRITE_LINE_MEMBER(mlanding_state::z80ctc_to0)
if (m_msm_pos[1] == 0x2000)
{
m_msm_pos[1] = 0;
- m_msm2->reset_w(1);
- m_msm2->vclk_w(0);
- m_msm2->reset_w(0);
+ m_msm[1]->reset_w(1);
+ m_msm[1]->vclk_w(0);
+ m_msm[1]->reset_w(0);
}
else
{
- m_msm2->vclk_w(0);
+ m_msm[1]->vclk_w(0);
}
}
@@ -634,48 +635,48 @@ WRITE_LINE_MEMBER(mlanding_state::z80ctc_to0)
}
-WRITE8_MEMBER(mlanding_state::msm5205_1_start_w)
+void mlanding_state::msm5205_1_start_w(u8 data)
{
m_msm_reset[0] = 0;
- m_msm1->reset_w(0);
+ m_msm[0]->reset_w(0);
}
-WRITE8_MEMBER(mlanding_state::msm5205_1_stop_w)
+void mlanding_state::msm5205_1_stop_w(u8 data)
{
m_msm_reset[0] = 1;
m_msm_nibble[0] = 0;
m_msm_pos[0] &= ~0xff;
- m_msm1->reset_w(1);
+ m_msm[0]->reset_w(1);
}
-WRITE8_MEMBER(mlanding_state::msm5205_1_addr_lo_w)
+void mlanding_state::msm5205_1_addr_lo_w(u8 data)
{
m_msm_pos[0] &= ~0x0ff00;
m_msm_pos[0] |= data << 8;
}
-WRITE8_MEMBER(mlanding_state::msm5205_1_addr_hi_w)
+void mlanding_state::msm5205_1_addr_hi_w(u8 data)
{
m_msm_pos[0] &= ~0x70000;
m_msm_pos[0] |= (data & 7) << 16;
}
-WRITE8_MEMBER(mlanding_state::msm5205_2_start_w)
+void mlanding_state::msm5205_2_start_w(u8 data)
{
m_msm_reset[1] = 0;
- m_msm2->reset_w(0);
+ m_msm[1]->reset_w(0);
}
-WRITE8_MEMBER(mlanding_state::msm5205_2_stop_w)
+void mlanding_state::msm5205_2_stop_w(u8 data)
{
m_msm_reset[1] = 1;
m_msm_nibble[1] = 0;
- m_msm2->reset_w(1);
+ m_msm[1]->reset_w(1);
}
@@ -686,20 +687,19 @@ WRITE8_MEMBER(mlanding_state::msm5205_2_stop_w)
*
*************************************/
-READ16_MEMBER(mlanding_state::power_ram_r)
+u8 mlanding_state::power_ram_r(offs_t offset)
{
return m_power_ram[offset];
}
-WRITE16_MEMBER(mlanding_state::power_ram_w)
+void mlanding_state::power_ram_w(offs_t offset, u8 data)
{
- if (ACCESSING_BITS_0_7)
- m_power_ram[offset] = data & 0xff;
+ m_power_ram[offset] = data;
}
-READ8_MEMBER(mlanding_state::motor_r)
+u8 mlanding_state::motor_r()
{
/*
9001: RIGHT MOTOR: 1F=UP, 00=STOP, 2F=DOWN
@@ -738,16 +738,16 @@ void mlanding_state::main_map(address_map &map)
map(0x200000, 0x20ffff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x240004, 0x240005).nopr(); // Watchdog
map(0x240006, 0x240007).r(FUNC(mlanding_state::input_r));
- map(0x280000, 0x280fff).rw(FUNC(mlanding_state::power_ram_r), FUNC(mlanding_state::power_ram_w));
+ map(0x280000, 0x280fff).rw(FUNC(mlanding_state::power_ram_r), FUNC(mlanding_state::power_ram_w)).umask16(0x00ff);
map(0x290000, 0x290001).portr("IN1");
map(0x290002, 0x290003).portr("IN0");
map(0x2a0000, 0x2a0001).w(FUNC(mlanding_state::output_w));
- map(0x2b0000, 0x2b0001).r(FUNC(mlanding_state::analog1_msb_r));
- map(0x2b0002, 0x2b0003).r(FUNC(mlanding_state::analog1_lsb_r));
- map(0x2b0004, 0x2b0005).r(FUNC(mlanding_state::analog2_msb_r));
- map(0x2b0006, 0x2b0007).r(FUNC(mlanding_state::analog2_lsb_r));
- map(0x2c0000, 0x2c0001).r(FUNC(mlanding_state::analog3_msb_r));
- map(0x2c0002, 0x2c0003).r(FUNC(mlanding_state::analog3_lsb_r));
+ map(0x2b0001, 0x2b0001).r(FUNC(mlanding_state::analog1_msb_r));
+ map(0x2b0003, 0x2b0003).r(FUNC(mlanding_state::analog1_lsb_r));
+ map(0x2b0005, 0x2b0005).r(FUNC(mlanding_state::analog2_msb_r));
+ map(0x2b0007, 0x2b0007).r(FUNC(mlanding_state::analog2_lsb_r));
+ map(0x2c0001, 0x2c0001).r(FUNC(mlanding_state::analog3_msb_r));
+ map(0x2c0003, 0x2c0003).r(FUNC(mlanding_state::analog3_lsb_r));
map(0x2d0000, 0x2d0001).nopr();
map(0x2d0001, 0x2d0001).w("ciu", FUNC(pc060ha_device::master_port_w));
map(0x2d0003, 0x2d0003).rw("ciu", FUNC(pc060ha_device::master_comm_r), FUNC(pc060ha_device::master_comm_w));
@@ -992,14 +992,14 @@ void mlanding_state::mlanding(machine_config &config)
ymsnd.add_route(0, "mono", 0.50);
ymsnd.add_route(1, "mono", 0.50);
- MSM5205(config, m_msm1, 384_kHz_XTAL);
- m_msm1->vck_callback().set(FUNC(mlanding_state::msm5205_1_vck)); // VCK function
- m_msm1->set_prescaler_selector(msm5205_device::S48_4B); // 8 kHz, 4-bit
- m_msm1->add_route(ALL_OUTPUTS, "mono", 0.80);
+ MSM5205(config, m_msm[0], 384_kHz_XTAL);
+ m_msm[0]->vck_callback().set(FUNC(mlanding_state::msm5205_1_vck)); // VCK function
+ m_msm[0]->set_prescaler_selector(msm5205_device::S48_4B); // 8 kHz, 4-bit
+ m_msm[0]->add_route(ALL_OUTPUTS, "mono", 0.80);
- MSM5205(config, m_msm2, 384_kHz_XTAL);
- m_msm2->set_prescaler_selector(msm5205_device::SEX_4B); // Slave mode, 4-bit
- m_msm2->add_route(ALL_OUTPUTS, "mono", 0.10);
+ MSM5205(config, m_msm[1], 384_kHz_XTAL);
+ m_msm[1]->set_prescaler_selector(msm5205_device::SEX_4B); // Slave mode, 4-bit
+ m_msm[1]->add_route(ALL_OUTPUTS, "mono", 0.10);
}
diff --git a/src/mame/drivers/naomi.cpp b/src/mame/drivers/naomi.cpp
index d0e3dcf675a..3816df3f016 100644
--- a/src/mame/drivers/naomi.cpp
+++ b/src/mame/drivers/naomi.cpp
@@ -10328,6 +10328,7 @@ ROM_START( wccf116 )
ROM_END
// Sega Yonin Uchi Mahjong MJ (セガ四人打ち麻雀MJ), "Sega The 4Players Mah-Jong"
+// uses CRP-1231 card RW connected via 838-13661 RS422/RS232C converter BD, and 2x JVS I/O boards (or one special I/O ?).
ROM_START( mj1 )
NAOMIGD_BIOS
NAOMI_DEFAULT_EEPROM
@@ -10336,7 +10337,7 @@ ROM_START( mj1 )
DISK_IMAGE_READONLY( "cdp-10002b", 0, SHA1(bbbaf84c55a39c1ad4b82e01be731f65e07e7d18) ) // CD-R
ROM_REGION( 0x4000, "pic", ROMREGION_ERASEFF)
- // chip label is a guess
+ // chip label is a guess, probably incorrect
ROM_LOAD("317-0352-jpn.pic", 0x00, 0x4000, CRC(c2c45f9c) SHA1(d1ff2099db3d918846bb096d335cd7ef05df3901) )
ROM_END
diff --git a/src/mame/drivers/p8k.cpp b/src/mame/drivers/p8k.cpp
index 79efb9f0aae..e5e69c31d75 100644
--- a/src/mame/drivers/p8k.cpp
+++ b/src/mame/drivers/p8k.cpp
@@ -369,7 +369,7 @@ void p8k_state::p8k_16_iomap(address_map &map)
WRITE_LINE_MEMBER( p8k_state::p8k_16_daisy_interrupt )
{
- m_maincpu->set_input_line(INPUT_LINE_IRQ1, state ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(z8001_device::VI_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp
index c88fe5caf85..47fa8ded4ea 100644
--- a/src/mame/drivers/pc.cpp
+++ b/src/mame/drivers/pc.cpp
@@ -380,29 +380,6 @@ ROM_START( mpc1600 )
ROM_END
-/*********************************************************** Commodore PC-1 ***
-
-Links: http://www.amiga-stuff.com/hardware/pc-i.html , http://www.zimmers.net/cbmpics/cpci.html
-Form Factor: Desktop
-CPU: 8088 @ 4.77 MHz
-RAM: 512K / 640K
-Bus: Proprietary expansion slot, carrying almost all ISA signals
-Video: On board, MDA/Hercules/CGA
-Mass storage: 1x 5.25" 360K
-On board ports: Floppy, floppy expansion (for Amiga A1010/1011 (720 KB, 3.5") or A1020 (360 KB, 5.25" drives), speaker (but no speaker fitted), mouse,
-Options: 8087 FPU
-Expansion: Expansion box: 2x ISA
-
-******************************************************************************/
-
-
-ROM_START( compc1 )
- ROM_REGION(0x10000, "bios", 0)
- ROM_LOAD("pc1_bios.bin", 0xc000, 0x4000, CRC(e37367c8) SHA1(9aac9c38b4ebdb9a740e393199c2eff75a0bde03))
- ROM_REGION(0x8000, "gfx1", 0)
- ROM_LOAD("pc1_char.bin", 0x0000, 0x4000, CRC(ee6c27f0) SHA1(e769cc3a49a1d708bd74eb4ac85bb6ea67220d38))
-ROM_END
-
/********************************************************** Compaq Portable ***
Links: https://en.wikipedia.org/wiki/Compaq_Portable , http://oldcomputers.net/compaqi.html ,
@@ -1270,7 +1247,6 @@ COMP( 1984, dgone, ibm5150, 0, dgone, pccga, pc_state,
COMP( 1985, epc, ibm5150, 0, epc, pccga, pc_state, empty_init, "Ericsson Information System", "Ericsson PC" , MACHINE_NOT_WORKING )
COMP( 1985, eppc, ibm5150, 0, pccga, pccga, pc_state, empty_init, "Ericsson Information System", "Ericsson Portable PC", MACHINE_NOT_WORKING )
COMP( 1985, bw230, ibm5150, 0, bondwell, bondwell, pc_state, init_bondwell, "Bondwell Holding", "BW230 (PRO28 Series)", 0 )
-COMP( 1984, compc1, ibm5150, 0, pccga, pccga, pc_state, empty_init, "Commodore Business Machines", "Commodore PC-1" , MACHINE_NOT_WORKING )
COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pccga, pc_state, empty_init, "Schetmash", "Iskra 3104", MACHINE_NOT_WORKING )
COMP( 1989, mk88, ibm5150, 0, mk88, pccga, pc_state, empty_init, "<unknown>", "MK-88", MACHINE_NOT_WORKING )
COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, pc_state, empty_init, "<unknown>", "Poisk-2", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/pk8020.cpp b/src/mame/drivers/pk8020.cpp
index 734ce7c32a6..b15af81b4ec 100644
--- a/src/mame/drivers/pk8020.cpp
+++ b/src/mame/drivers/pk8020.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Miodrag Milanovic
+// copyright-holders:Miodrag Milanovic, AJR
/***************************************************************************
PK-8020 driver by Miodrag Milanovic
@@ -15,9 +15,10 @@
#include "bus/rs232/rs232.h"
#include "cpu/i8085/i8085.h"
+#include "machine/clock.h"
#include "machine/i8255.h"
+#include "machine/pit8253.h"
#include "formats/pk8020_dsk.h"
-#include "machine/ram.h"
#include "screen.h"
#include "softlist.h"
#include "speaker.h"
@@ -25,6 +26,7 @@
/* Address maps */
void pk8020_state::pk8020_mem(address_map &map)
{
+ map(0x0000, 0xffff).rw(FUNC(pk8020_state::memory_r), FUNC(pk8020_state::memory_w));
}
void pk8020_state::pk8020_io(address_map &map)
@@ -33,118 +35,145 @@ void pk8020_state::pk8020_io(address_map &map)
map.unmap_value_high();
}
+void pk8020_state::devices_map(address_map &map)
+{
+ map(0x00, 0x03).mirror(4).rw("ct", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
+ map(0x08, 0x0b).mirror(4).rw("iop3", FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x10, 0x11).mirror(6).rw("ios1", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x18, 0x1b).mirror(4).rw(m_fdc, FUNC(fd1793_device::read), FUNC(fd1793_device::write));
+ map(0x20, 0x21).mirror(6).rw("ios2", FUNC(i8251_device::read), FUNC(i8251_device::write));
+ map(0x28, 0x29).mirror(6).rw(m_inr, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x30, 0x33).mirror(4).rw("iop2", FUNC(i8255_device::read), FUNC(i8255_device::write));
+ map(0x38, 0x3b).mirror(4).rw("iop1", FUNC(i8255_device::read), FUNC(i8255_device::write));
+}
+
/* Input ports */
static INPUT_PORTS_START( pk8020 )
PORT_START("LINE0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_F9)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_F9)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G)
+
PORT_START("LINE1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O)
+
PORT_START("LINE2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W)
+
PORT_START("LINE3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("_") PORT_CODE(KEYCODE_EQUALS)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("^") PORT_CODE(KEYCODE_TILDE)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("_") PORT_CODE(KEYCODE_EQUALS)
+
PORT_START("LINE4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7)
+
PORT_START("LINE5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("?") PORT_CODE(KEYCODE_SLASH)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("?") PORT_CODE(KEYCODE_SLASH)
+
PORT_START("LINE6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STRN") PORT_CODE(KEYCODE_MINUS_PAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("STOP") PORT_CODE(KEYCODE_F12)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("IZ") PORT_CODE(KEYCODE_ASTERISK)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("VZ") PORT_CODE(KEYCODE_SLASH_PAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("STRN") PORT_CODE(KEYCODE_MINUS_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("STOP") PORT_CODE(KEYCODE_F12)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("IZ") PORT_CODE(KEYCODE_ASTERISK)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("VZ") PORT_CODE(KEYCODE_SLASH_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE)
+
PORT_START("LINE7")
- // All keys in this line are reversed logic
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alf") PORT_CODE(KEYCODE_F11)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Graf") PORT_CODE(KEYCODE_F10)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Prf") PORT_CODE(KEYCODE_ESC)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Sel") PORT_CODE(KEYCODE_RCONTROL)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Upr") PORT_CODE(KEYCODE_LCONTROL)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("OO") PORT_CODE(KEYCODE_LALT)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT)
+ // All keys in this line are reversed logic
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alf") PORT_CODE(KEYCODE_F11)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Graf") PORT_CODE(KEYCODE_F10)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Prf") PORT_CODE(KEYCODE_ESC)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Sel") PORT_CODE(KEYCODE_RCONTROL)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Upr") PORT_CODE(KEYCODE_LCONTROL)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("OO") PORT_CODE(KEYCODE_LALT)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT)
+
PORT_START("LINE8")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_1_PAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 2") PORT_CODE(KEYCODE_2_PAD)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 3") PORT_CODE(KEYCODE_3_PAD)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 7") PORT_CODE(KEYCODE_7_PAD)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 0") PORT_CODE(KEYCODE_0_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 1") PORT_CODE(KEYCODE_1_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 2") PORT_CODE(KEYCODE_2_PAD)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 3") PORT_CODE(KEYCODE_3_PAD)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 4") PORT_CODE(KEYCODE_4_PAD)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 5") PORT_CODE(KEYCODE_5_PAD)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 6") PORT_CODE(KEYCODE_6_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 7") PORT_CODE(KEYCODE_7_PAD)
+
PORT_START("LINE9")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 8") PORT_CODE(KEYCODE_8_PAD)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num 9") PORT_CODE(KEYCODE_9_PAD)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 8") PORT_CODE(KEYCODE_8_PAD)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num 9") PORT_CODE(KEYCODE_9_PAD)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Num .") PORT_CODE(KEYCODE_DEL_PAD)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE10")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE11")
- PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE12")
- PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE13")
- PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE14")
- PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
+
PORT_START("LINE15")
- PORT_BIT(0xFF, IP_ACTIVE_HIGH, IPT_UNUSED)
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED)
INPUT_PORTS_END
@@ -192,65 +221,76 @@ static void pk8020_floppies(device_slot_interface &device)
void pk8020_state::pk8020(machine_config &config)
{
/* basic machine hardware */
- I8080(config, m_maincpu, 20_MHz_XTAL / 8);
+ I8080(config, m_maincpu, 20_MHz_XTAL / 8); // КР580ВМ80А
m_maincpu->set_addrmap(AS_PROGRAM, &pk8020_state::pk8020_mem);
m_maincpu->set_addrmap(AS_IO, &pk8020_state::pk8020_io);
m_maincpu->set_vblank_int("screen", FUNC(pk8020_state::pk8020_interrupt));
- m_maincpu->set_irq_acknowledge_callback("pic8259", FUNC(pic8259_device::inta_cb));
+ m_maincpu->set_irq_acknowledge_callback("inr", FUNC(pic8259_device::inta_cb));
+
+ PLS100(config, m_decplm); // КР556РТ2 (82S100 equivalent; D31)
+
+ ADDRESS_MAP_BANK(config, m_devbank);
+ m_devbank->set_addrmap(0, &pk8020_state::devices_map);
+ m_devbank->set_data_width(8);
+ m_devbank->set_addr_width(6);
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(50);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
- screen.set_size(512, 256);
- screen.set_visarea(0, 512-1, 0, 256-1);
+ screen.set_raw(20_MHz_XTAL / 2, 640, 0, 512, 312, 0, 256);
screen.set_screen_update(FUNC(pk8020_state::screen_update_pk8020));
screen.set_palette(m_palette);
GFXDECODE(config, "gfxdecode", m_palette, gfx_pk8020);
PALETTE(config, m_palette, FUNC(pk8020_state::pk8020_palette), 16);
- I8255(config, m_ppi8255_1);
- m_ppi8255_1->in_pa_callback().set(FUNC(pk8020_state::pk8020_porta_r));
- m_ppi8255_1->out_pb_callback().set(FUNC(pk8020_state::pk8020_portb_w));
- m_ppi8255_1->in_pc_callback().set(FUNC(pk8020_state::pk8020_portc_r));
- m_ppi8255_1->out_pc_callback().set(FUNC(pk8020_state::pk8020_portc_w));
+ i8255_device &iop1(I8255(config, "iop1")); // КР580ВВ55А (D17)
+ iop1.in_pa_callback().set(FUNC(pk8020_state::ppi_porta_r));
+ iop1.out_pb_callback().set(FUNC(pk8020_state::floppy_control_w));
+ iop1.out_pc_callback().set(FUNC(pk8020_state::video_page_w));
+
+ i8255_device &iop2(I8255(config, "iop2")); // КР580ВВ55А (D16)
+ iop2.out_pc_callback().set(FUNC(pk8020_state::ppi_2_portc_w));
- I8255(config, m_ppi8255_2);
- m_ppi8255_2->out_pc_callback().set(FUNC(pk8020_state::pk8020_2_portc_w));
+ I8255(config, "iop3"); // КР580ВВ55А (D2)
- I8255(config, m_ppi8255_3);
+ pit8253_device &ct(PIT8253(config, "ct")); // КР580ВИ53
+ ct.set_clk<0>(20_MHz_XTAL / 10);
+ ct.out_handler<0>().set(FUNC(pk8020_state::pit_out0));
+ ct.set_clk<1>(20_MHz_XTAL / 10);
+ ct.out_handler<1>().set("ios1", FUNC(i8251_device::write_txc));
+ ct.out_handler<1>().append("ios1", FUNC(i8251_device::write_rxc));
+ ct.set_clk<2>((20_MHz_XTAL / 8) / 164);
+ ct.out_handler<2>().set(m_inr, FUNC(pic8259_device::ir5_w));
- PIT8253(config, m_pit8253, 0);
- m_pit8253->set_clk<0>(20_MHz_XTAL / 10);
- m_pit8253->out_handler<0>().set(FUNC(pk8020_state::pk8020_pit_out0));
- m_pit8253->set_clk<1>(20_MHz_XTAL / 10);
- m_pit8253->out_handler<1>().set(FUNC(pk8020_state::pk8020_pit_out1));
- m_pit8253->set_clk<2>((20_MHz_XTAL / 8) / 164);
- m_pit8253->out_handler<2>().set(m_pic8259, FUNC(pic8259_device::ir5_w));
+ PIC8259(config, m_inr); // КР580ВН59
+ m_inr->out_int_callback().set_inputline(m_maincpu, 0);
- PIC8259(config, m_pic8259, 0);
- m_pic8259->out_int_callback().set_inputline(m_maincpu, 0);
+ i8251_device &ios1(I8251(config, "ios1", 20_MHz_XTAL / 10)); // КР580ВВ51А (D10)
+ ios1.txd_handler().set("v24", FUNC(rs232_port_device::write_txd));
+ ios1.dtr_handler().set("v24", FUNC(rs232_port_device::write_rts));
+ ios1.rxrdy_handler().set(m_inr, FUNC(pic8259_device::ir1_w));
+ ios1.txrdy_handler().set(m_inr, FUNC(pic8259_device::ir2_w));
- I8251(config, m_rs232, 0);
- m_rs232->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
- m_rs232->rxrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir1_w));
- m_rs232->txrdy_handler().set(m_pic8259, FUNC(pic8259_device::ir2_w));
+ rs232_port_device &v24(RS232_PORT(config, "v24", default_rs232_devices, nullptr));
+ v24.rxd_handler().set("ios1", FUNC(i8251_device::write_rxd));
+ v24.dsr_handler().set("ios1", FUNC(i8251_device::write_dsr));
- rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
- rs232.rxd_handler().set(m_rs232, FUNC(i8251_device::write_rxd));
- rs232.cts_handler().set(m_rs232, FUNC(i8251_device::write_cts));
- rs232.dsr_handler().set(m_rs232, FUNC(i8251_device::write_dsr));
+ i8251_device &ios2(I8251(config, "ios2", 20_MHz_XTAL / 10)); // КР580ВВ51А (D11)
+ ios2.txd_handler().set("line", FUNC(rs232_port_device::write_txd));
+ ios2.rxrdy_handler().set(m_inr, FUNC(pic8259_device::ir3_w));
- I8251(config, m_lan, 0);
+ rs232_port_device &line(RS232_PORT(config, "line", default_rs232_devices, nullptr));
+ line.rxd_handler().set("ios2", FUNC(i8251_device::write_rxd));
- FD1793(config, m_wd1793, 20_MHz_XTAL / 20);
- m_wd1793->intrq_wr_callback().set(m_pic8259, FUNC(pic8259_device::ir7_w));
+ clock_device &c1(CLOCK(config, "c1", 20_MHz_XTAL / 8 / 4));
+ c1.signal_handler().set("ios2", FUNC(i8251_device::write_txc));
+ c1.signal_handler().append("ios2", FUNC(i8251_device::write_rxc));
- FLOPPY_CONNECTOR(config, "wd1793:0", pk8020_floppies, "qd", pk8020_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "wd1793:1", pk8020_floppies, "qd", pk8020_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "wd1793:2", pk8020_floppies, "qd", pk8020_state::floppy_formats);
- FLOPPY_CONNECTOR(config, "wd1793:3", pk8020_floppies, "qd", pk8020_state::floppy_formats);
+ KR1818VG93(config, m_fdc, 20_MHz_XTAL / 20); // КР1818ВГ93
+ m_fdc->intrq_wr_callback().set(m_inr, FUNC(pic8259_device::ir7_w));
+
+ for (auto &floppy : m_floppy)
+ FLOPPY_CONNECTOR(config, floppy, pk8020_floppies, "qd", pk8020_state::floppy_formats);
SOFTWARE_LIST(config, "flop_list").set_original("korvet_flop");
@@ -268,50 +308,66 @@ void pk8020_state::pk8020(machine_config &config)
/* ROM definition */
ROM_START( korvet )
- ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF)
ROM_DEFAULT_BIOS("v11")
ROM_SYSTEM_BIOS(0, "v11", "v1.1")
- ROMX_LOAD( "korvet11.rom", 0x10000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(0))
+ ROMX_LOAD("korvet11.rom", 0x0000, 0x6000, CRC(81bdc2af) SHA1(c3484c3f1f3d252475979283c073286b8661d2b9), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "v20", "v2.0")
- ROMX_LOAD( "korvet20.rom", 0x10000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(1))
+ ROMX_LOAD("korvet20.rom", 0x0000, 0x6000, CRC(d6c36a45) SHA1(dba67e63457251814ad5c0fe6bb6d584eea5c7d2), ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "cpm", "cpm")
- ROMX_LOAD( "cpm.rom", 0x10000, 0x4000, CRC(7a38d7f6) SHA1(fec6623291a38990b003e818683cd5edfb494c36), ROM_BIOS(2))
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "korvet2.fnt", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a))
+ ROMX_LOAD("cpm.rom", 0x0000, 0x4000, CRC(7a38d7f6) SHA1(fec6623291a38990b003e818683cd5edfb494c36), ROM_BIOS(2))
+
+ ROM_REGION(0x2000, "gfx1", 0)
+ ROM_LOAD("korvet2.fnt", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a))
+
+ ROM_REGION(0xf5, "decplm", 0)
+ ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP) // devised from documentation
ROM_END
ROM_START( neiva )
- ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "neiva_d22.bin", 0x10000, 0x2000, CRC(9cc28f67) SHA1(68f390e846e1290df68419d522088d5325682945))
- ROM_LOAD( "neiva_d23.bin", 0x12000, 0x2000, CRC(31b53dc4) SHA1(607f2a2d8b1de469125c6c02b9ffc65649b753a2))
- ROM_LOAD( "neiva_d24.bin", 0x14000, 0x2000, CRC(d05c80df) SHA1(1ec2fa9983be5579abff7247fc9b98fe50661bd9))
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "neiva_d21.bin", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a))
+ ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD("neiva_d22.bin", 0x0000, 0x2000, CRC(9cc28f67) SHA1(68f390e846e1290df68419d522088d5325682945))
+ ROM_LOAD("neiva_d23.bin", 0x2000, 0x2000, CRC(31b53dc4) SHA1(607f2a2d8b1de469125c6c02b9ffc65649b753a2))
+ ROM_LOAD("neiva_d24.bin", 0x4000, 0x2000, CRC(d05c80df) SHA1(1ec2fa9983be5579abff7247fc9b98fe50661bd9))
+
+ ROM_REGION(0x2000, "gfx1", 0)
+ ROM_LOAD("neiva_d21.bin", 0x0000, 0x2000, CRC(fb1cd3d4) SHA1(58f1d6e393253b1e8b497ce0880b6eff6d85b42a))
+
+ ROM_REGION(0xf5, "decplm", 0)
+ ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP)
ROM_END
ROM_START( kontur )
- ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF )
+ ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF)
ROM_SYSTEM_BIOS(0, "v1", "v1")
- ROMX_LOAD( "kontur.rom", 0x10000, 0x2000, CRC(92cd441e) SHA1(9a0f9079256cefc6169ae4ba2114841d1f380480), ROM_BIOS(0))
+ ROMX_LOAD("kontur.rom", 0x0000, 0x2000, CRC(92cd441e) SHA1(9a0f9079256cefc6169ae4ba2114841d1f380480), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "v2", "v2")
- ROMX_LOAD( "kontur2.rom", 0x10000, 0x2000, CRC(5256d101) SHA1(22022a3c6882dbc5ea28d7815f00c182bbaef9e1), ROM_BIOS(1))
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "kontur.fnt", 0x0000, 0x2000, CRC(14d33790) SHA1(6d5fcb214805c5fc44ef98a97219158ff7826ac0))
+ ROMX_LOAD("kontur2.rom", 0x0000, 0x2000, CRC(5256d101) SHA1(22022a3c6882dbc5ea28d7815f00c182bbaef9e1), ROM_BIOS(1))
+
+ ROM_REGION(0x2000, "gfx1", 0)
+ ROM_LOAD("kontur.fnt", 0x0000, 0x2000, CRC(14d33790) SHA1(6d5fcb214805c5fc44ef98a97219158ff7826ac0))
+
+ ROM_REGION(0xf5, "decplm", 0)
+ ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP)
ROM_END
ROM_START( bk8t )
- ROM_REGION( 0x16000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "kor1.bin", 0x10000, 0x2000, CRC(f1e16ddc) SHA1(e3a10c9ce3f333928eb0d5f9b84e159e41fae6ca))
- ROM_LOAD( "kor2.bin", 0x12000, 0x2000, CRC(d4431d97) SHA1(08f79785846369d410a4183f0d60b856d6d70199))
- ROM_LOAD( "kor3.bin", 0x14000, 0x2000, CRC(74781903) SHA1(caaa638afe80eb83fc30b07dd6d1e40b66ddc6d1))
- ROM_REGION( 0x2000, "gfx1", 0 )
- ROM_LOAD( "kor4.bin", 0x0000, 0x2000, CRC(d164bada) SHA1(c334e50fd31b1f42c7668b89772487971a6875cb))
+ ROM_REGION(0x6000, "maincpu", ROMREGION_ERASEFF)
+ ROM_LOAD("kor1.bin", 0x0000, 0x2000, CRC(f1e16ddc) SHA1(e3a10c9ce3f333928eb0d5f9b84e159e41fae6ca))
+ ROM_LOAD("kor2.bin", 0x2000, 0x2000, CRC(d4431d97) SHA1(08f79785846369d410a4183f0d60b856d6d70199))
+ ROM_LOAD("kor3.bin", 0x4000, 0x2000, CRC(74781903) SHA1(caaa638afe80eb83fc30b07dd6d1e40b66ddc6d1))
+
+ ROM_REGION(0x2000, "gfx1", 0)
+ ROM_LOAD("kor4.bin", 0x0000, 0x2000, CRC(d164bada) SHA1(c334e50fd31b1f42c7668b89772487971a6875cb))
+
+ ROM_REGION(0xf5, "decplm", 0)
+ ROM_LOAD("kr556rt2.d31", 0x00, 0xf5, CRC(3eae3879) SHA1(87f419e26d73d7b2f937c3fcae0415b74da37d97) BAD_DUMP)
ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1987, korvet, 0, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Korvet", 0)
-COMP( 1987, neiva, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Neiva", 0)
-COMP( 1987, kontur, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Kontur", 0)
-COMP( 1987, bk8t, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "BK-8T", 0)
+COMP( 1987, korvet, 0, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Korvet", MACHINE_SUPPORTS_SAVE)
+COMP( 1987, neiva, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Neiva", MACHINE_SUPPORTS_SAVE)
+COMP( 1987, kontur, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "PK8020 Kontur", MACHINE_SUPPORTS_SAVE)
+COMP( 1987, bk8t, korvet, 0, pk8020, pk8020, pk8020_state, empty_init, "<unknown>", "BK-8T", MACHINE_SUPPORTS_SAVE)
diff --git a/src/mame/drivers/polepos.cpp b/src/mame/drivers/polepos.cpp
index dc164dc106d..5d01b80123b 100644
--- a/src/mame/drivers/polepos.cpp
+++ b/src/mame/drivers/polepos.cpp
@@ -311,7 +311,7 @@ template<bool sub1> WRITE16_MEMBER(polepos_state::z8002_nvi_enable_w)
m_sub_irq_mask = data;
if (!data)
- (sub1 ? m_subcpu : m_subcpu2)->set_input_line(0, CLEAR_LINE);
+ (sub1 ? m_subcpu : m_subcpu2)->set_input_line(z8002_device::NVI_LINE, CLEAR_LINE);
}
CUSTOM_INPUT_MEMBER(polepos_state::auto_start_r)
@@ -388,8 +388,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(polepos_state::scanline)
if (scanline == 240 && m_sub_irq_mask) // VBLANK
{
- m_subcpu->set_input_line(0, ASSERT_LINE);
- m_subcpu2->set_input_line(0, ASSERT_LINE);
+ m_subcpu->set_input_line(z8002_device::NVI_LINE, ASSERT_LINE);
+ m_subcpu2->set_input_line(z8002_device::NVI_LINE, ASSERT_LINE);
}
}
@@ -407,9 +407,6 @@ void polepos_state::machine_start()
void polepos_state::machine_reset()
{
- /* set the interrupt vectors (this shouldn't be needed) */
- m_subcpu->set_input_line_vector(0, Z8000_NVI); // Z8002
- m_subcpu2->set_input_line_vector(0, Z8000_NVI); // Z8002
}
diff --git a/src/mame/drivers/r2dx_v33.cpp b/src/mame/drivers/r2dx_v33.cpp
index 1e27f46dc40..a70701efad0 100644
--- a/src/mame/drivers/r2dx_v33.cpp
+++ b/src/mame/drivers/r2dx_v33.cpp
@@ -403,7 +403,7 @@ void r2dx_v33_state::rdx_v33_map(address_map &map)
map(0x00600, 0x0063f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write));
//map(0x00640, 0x006bf).rw("obj", FUNC(seibu_encrypted_sprite_device::read), FUNC(seibu_encrypted_sprite_device::write));
- map(0x0068e, 0x0068f).nopw(); // sprite buffering
+ map(0x0068e, 0x0068f).w(m_spriteram, FUNC(buffered_spriteram16_device::write));
map(0x006b0, 0x006b1).w(FUNC(r2dx_v33_state::mcu_prog_w)); // could be encryption key uploads just like raiden2.cpp ?
map(0x006b2, 0x006b3).w(FUNC(r2dx_v33_state::mcu_prog_w2));
// map(0x006b4, 0x006b5).nopw();
@@ -432,8 +432,7 @@ void r2dx_v33_state::rdx_v33_map(address_map &map)
map(0x00800, 0x00fff).ram(); // copies eeprom here?
map(0x01000, 0x0bfff).ram();
- map(0x0c000, 0x0c7ff).ram().share("spriteram");
- map(0x0c800, 0x0cfff).ram();
+ map(0x0c000, 0x0cfff).ram().share("spriteram");
map(0x0d000, 0x0d7ff).ram(); //.w(FUNC(r2dx_v33_state::background_w)).share("back_data");
map(0x0d800, 0x0dfff).ram(); //.w(FUNC(r2dx_v33_state::foreground_w).share("fore_data");
map(0x0e000, 0x0e7ff).ram(); //.w(FUNC(r2dx_v33_state::midground_w).share("mid_data");
@@ -471,7 +470,7 @@ void r2dx_v33_state::nzeroteam_base_map(address_map &map)
map(0x00600, 0x0063f).rw("crtc", FUNC(seibu_crtc_device::read), FUNC(seibu_crtc_device::write));
//map(0x00640, 0x006bf)rw("obj", FUNC(seibu_encrypted_sprite_device::read), FUNC(seibu_encrypted_sprite_device::write));
- map(0x0068e, 0x0068f).nopw(); // sprite buffering
+ map(0x0068e, 0x0068f).w(m_spriteram, FUNC(buffered_spriteram16_device::write));
map(0x006b0, 0x006b1).w(FUNC(r2dx_v33_state::mcu_prog_w));
map(0x006b2, 0x006b3).w(FUNC(r2dx_v33_state::mcu_prog_w2));
// map(0x006b4, 0x006b5).nopw();
@@ -491,8 +490,7 @@ void r2dx_v33_state::nzeroteam_base_map(address_map &map)
map(0x00800, 0x00fff).ram();
map(0x01000, 0x0bfff).ram();
- map(0x0c000, 0x0c7ff).ram().share("spriteram");
- map(0x0c800, 0x0cfff).ram();
+ map(0x0c000, 0x0cfff).ram().share("spriteram");
map(0x0d000, 0x0d7ff).ram(); //.w(FUNC(r2dx_v33_state::background_w)).share("back_data");
map(0x0d800, 0x0dfff).ram(); //.w(FUNC(r2dx_v33_state::foreground_w)).share("fore_data");
map(0x0e000, 0x0e7ff).ram(); //.w(FUNC(r2dx_v33_state::midground_w)).share("mid_data");
@@ -747,6 +745,8 @@ void r2dx_v33_state::rdx_v33(machine_config &config)
crtc.layer_en_callback().set(FUNC(r2dx_v33_state::tilemap_enable_w));
crtc.layer_scroll_callback().set(FUNC(r2dx_v33_state::tile_scroll_w));
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
@@ -783,6 +783,8 @@ void r2dx_v33_state::nzerotea(machine_config &config)
crtc.layer_en_callback().set(FUNC(r2dx_v33_state::tilemap_enable_w));
crtc.layer_scroll_callback().set(FUNC(r2dx_v33_state::tile_scroll_w));
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
/* sound hardware */
SPEAKER(config, "mono").front_center();
diff --git a/src/mame/drivers/raiden2.cpp b/src/mame/drivers/raiden2.cpp
index 42fc06880d7..7ce33e9323f 100644
--- a/src/mame/drivers/raiden2.cpp
+++ b/src/mame/drivers/raiden2.cpp
@@ -583,7 +583,7 @@ void raiden2_state::raiden2_mem(address_map &map)
raiden2_cop_mem(map);
- map(0x0068e, 0x0068f).nopw(); //irq ack / sprite buffering?
+ map(0x0068e, 0x0068f).w(m_spriteram, FUNC(buffered_spriteram16_device::write));
map(0x00700, 0x0071f).lrw8("seibu_sound_rw",
[this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); },
@@ -628,7 +628,7 @@ void raiden2_state::zeroteam_mem(address_map &map)
map(0x00470, 0x00471).nopw();
map(0x006cc, 0x006cd).nopw();
- map(0x0068e, 0x0068f).nopw(); // irq ack / sprite buffering?
+ map(0x0068e, 0x0068f).w(m_spriteram, FUNC(buffered_spriteram16_device::write));
map(0x00700, 0x0071f).lrw8("seibu_sound_rw",
[this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); },
@@ -662,7 +662,7 @@ void raiden2_state::xsedae_mem(address_map &map)
map(0x00470, 0x00471).nopw();
map(0x006cc, 0x006cd).nopw();
- map(0x0068e, 0x0068f).nopw(); //irq ack / sprite buffering?
+ map(0x0068e, 0x0068f).w(m_spriteram, FUNC(buffered_spriteram16_device::write));
map(0x00700, 0x0071f).lrw8("seibu_sound_rw",
[this](offs_t offset) { return m_seibu_sound->main_r(offset >> 1); },
@@ -1060,6 +1060,8 @@ void raiden2_state::raiden2(machine_config &config)
crtc.layer_en_callback().set(FUNC(raiden2_state::tilemap_enable_w));
crtc.layer_scroll_callback().set(FUNC(raiden2_state::tile_scroll_w));
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
RAIDEN2COP(config, m_raiden2cop, 0);
m_raiden2cop->videoramout_cb().set(FUNC(raiden2_state::m_videoram_private_w));
m_raiden2cop->paletteramout_cb().set(m_palette, FUNC(palette_device::write16));
@@ -1122,6 +1124,8 @@ void raiden2_state::zeroteam(machine_config &config)
crtc.layer_en_callback().set(FUNC(raiden2_state::tilemap_enable_w));
crtc.layer_scroll_callback().set(FUNC(raiden2_state::tile_scroll_w));
+ BUFFERED_SPRITERAM16(config, m_spriteram);
+
RAIDEN2COP(config, m_raiden2cop, 0);
m_raiden2cop->videoramout_cb().set(FUNC(raiden2_state::m_videoram_private_w));
m_raiden2cop->paletteramout_cb().set(m_palette, FUNC(palette_device::write16));
diff --git a/src/mame/drivers/royalmah.cpp b/src/mame/drivers/royalmah.cpp
index dfa3385c00b..622baca8f21 100644
--- a/src/mame/drivers/royalmah.cpp
+++ b/src/mame/drivers/royalmah.cpp
@@ -2290,7 +2290,7 @@ static INPUT_PORTS_START( mjdiplob )
PORT_INCLUDE( mjctrl2 )
PORT_START("DSW1") /* DSW1 (inport $10 -> 0x76fa) */
- PORT_DIPNAME( 0x0f, 0x0f, "Pay Out Rate" )
+ PORT_DIPNAME( 0x0f, 0x0f, "Pay Out Rate" ) PORT_DIPLOCATION("SW1:1,2,3,4")
PORT_DIPSETTING( 0x0f, "96%" )
PORT_DIPSETTING( 0x0e, "93%" )
PORT_DIPSETTING( 0x0d, "90%" )
@@ -2307,65 +2307,65 @@ static INPUT_PORTS_START( mjdiplob )
PORT_DIPSETTING( 0x02, "56%" )
PORT_DIPSETTING( 0x01, "53%" )
PORT_DIPSETTING( 0x00, "50%" )
- PORT_DIPNAME( 0x30, 0x30, "Maximum Bet" )
+ PORT_DIPNAME( 0x30, 0x30, "Maximum Bet" ) PORT_DIPLOCATION("SW1:5,6")
PORT_DIPSETTING( 0x00, "1" )
PORT_DIPSETTING( 0x10, "5" )
PORT_DIPSETTING( 0x20, "10" )
PORT_DIPSETTING( 0x30, "20" )
- PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) // affects videoram - flip screen ?
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x40, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "Debug Mode ?" ) // check code at 0x0b94 and 0x0de2
+ PORT_DIPNAME( 0x40, 0x00, "Table Color" ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x00, "Green" )
+ PORT_DIPSETTING( 0x40, "Black" )
+ PORT_DIPNAME( 0x80, 0x80, "Debug Mode ?" ) PORT_DIPLOCATION("SW1:8") // check code at 0x0b94 and 0x0de2
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2") /* DSW2 (inport $62 -> 0x76fb) */
- PORT_DIPNAME( 0x03, 0x03, "Winnings" ) // check code at 0x09cd
+ PORT_DIPNAME( 0x03, 0x03, "Winnings" ) PORT_DIPLOCATION("SW2:1,2") // check code at 0x09cd
PORT_DIPSETTING( 0x00, "32 24 16 12 8 4 2 1" ) // table at 0x4b82
PORT_DIPSETTING( 0x03, "50 30 15 8 5 3 2 1" ) // table at 0x4b52
PORT_DIPSETTING( 0x02, "100 50 25 10 5 3 2 1" ) // table at 0x4b62
PORT_DIPSETTING( 0x01, "200 100 50 10 5 3 2 1" ) // table at 0x4b72
- PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unused ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unused ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x08, DEF_STR( On ) )
- PORT_DIPNAME( 0x30, 0x30, "Maximum Payout ?" ) // check code at 0x166c
+ PORT_DIPNAME( 0x04, 0x00, "Yakuman Bonus" ) PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, "Yakuman Bonus Period Control" ) PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPSETTING( 0x08, "First time only" )
+ PORT_DIPNAME( 0x30, 0x30, "Yakuman Bonus Timing Control" ) PORT_DIPLOCATION("SW2:5,6") // check code at 0x166c, Yakuman Bonus every x coins in
PORT_DIPSETTING( 0x00, "100" )
PORT_DIPSETTING( 0x10, "200" )
PORT_DIPSETTING( 0x20, "300" )
PORT_DIPSETTING( 0x30, "500" )
- PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) // check code at 0x2c64
+ PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7") // check code at 0x2c64, unused according to manual
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x40, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unknown ) ) // check code at 0x2c64
+ PORT_DIPNAME( 0x80, 0x00, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:8") // check code at 0x2c64, unused according to manual
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x80, DEF_STR( On ) )
- PORT_START("DSW3") /* DSW3 (inport $63 -> 0x76fc) */
- PORT_DIPNAME( 0x01, 0x00, "Special Combinations" ) // see notes
+ PORT_START("DSW3") /* DSW3 (inport $63 -> 0x76fc), switches 5-7 could do with verifying by someone who understands Japanese and mahjong (see MT05553 for manual) */
+ PORT_DIPNAME( 0x01, 0x00, "Baibai Bonus" ) PORT_DIPLOCATION("SW3:1") // see notes about 'Special Combinations'
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unused ) )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x02, DEF_STR( On ) )
- PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) ) // check code at 0x531f and 0x5375
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) ) // check code at 0x5240
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x08, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) // check code at 0x2411
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x10, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, DEF_STR( Unknown ) ) // check code at 0x2411 and 0x4beb
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x20, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x00, DEF_STR( Unknown ) ) // check code at 0x24ff, 0x25f2, 0x3fcf and 0x45d7
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x40, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "Full Tests" ) // seems to hang after the last animation
+ PORT_DIPNAME( 0x02, 0x00, "Don Den" ) PORT_DIPLOCATION("SW3:2")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x00, "W-Bet" ) PORT_DIPLOCATION("SW3:3") // check code at 0x531f and 0x5375
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x00, "Last Chance" ) PORT_DIPLOCATION("SW3:4") // check code at 0x5240
+ PORT_DIPSETTING( 0x08, "Free" )
+ PORT_DIPSETTING( 0x00, "Charge" )
+ PORT_DIPNAME( 0x10, 0x00, "Renchan Rate" ) PORT_DIPLOCATION("SW3:5") // check code at 0x2411
+ PORT_DIPSETTING( 0x00, "Good" )
+ PORT_DIPSETTING( 0x10, DEF_STR( Normal ) )
+ PORT_DIPNAME( 0x20, 0x00, "Renchan" ) PORT_DIPLOCATION("SW3:6") // check code at 0x2411 and 0x4beb
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x00, "Auto Tsumo?" ) PORT_DIPLOCATION("SW3:7") // check code at 0x24ff, 0x25f2, 0x3fcf and 0x45d7
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Full Tests" ) PORT_DIPLOCATION("SW3:8") // seems to hang after the last animation, unused according to manual
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
diff --git a/src/mame/drivers/seta.cpp b/src/mame/drivers/seta.cpp
index ae9b89720d7..930abcb8e43 100644
--- a/src/mame/drivers/seta.cpp
+++ b/src/mame/drivers/seta.cpp
@@ -2940,7 +2940,7 @@ uint16_t kiwame_state::input_r(offs_t offset)
switch( offset )
{
case 0x00/2: return m_key[i]->read();
- case 0x02/2: return 0xffff;
+ case 0x02/2: return m_key[i + 5]->read();
case 0x04/2: return m_coins->read();
// case 0x06/2:
case 0x08/2: return 0xffff;
@@ -5652,6 +5652,46 @@ bit 0 a b c d lc
PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_L )
PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY5")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_FLIP_FLOP ) PORT_PLAYER(2)
+ PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY6")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_B ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_F ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_J ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_N ) PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_REACH ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) PORT_PLAYER(2)
+ PORT_BIT( 0xffc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY7")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_A ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_E ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_I ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_M ) PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_KAN ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0xffc0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY8")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_C ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_G ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_K ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_CHI ) PORT_PLAYER(2)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_MAHJONG_RON ) PORT_PLAYER(2)
+ PORT_BIT( 0xffe0, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START("KEY9")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_D ) PORT_PLAYER(2)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_H ) PORT_PLAYER(2)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_L ) PORT_PLAYER(2)
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_PON ) PORT_PLAYER(2)
+ PORT_BIT( 0xfff0, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
diff --git a/src/mame/drivers/socrates.cpp b/src/mame/drivers/socrates.cpp
index d13ec3cbda1..8da5f16ae4d 100644
--- a/src/mame/drivers/socrates.cpp
+++ b/src/mame/drivers/socrates.cpp
@@ -2,12 +2,17 @@
// copyright-holders:Jonathan Gevaryahu
/******************************************************************************
*
-* V-tech Socrates Driver
-* Copyright (C) 2009-2013 Jonathan Gevaryahu AKA Lord Nightmare
+* V-tech Socrates-series devices
+* Copyright (C) 2009-2019 Jonathan Gevaryahu AKA Lord Nightmare
* with dumping help from Kevin 'kevtris' Horton
*
+* The devices in this driver all use a similar ASIC, presumably produced by
+* Toshiba for Vtech/Yeno, in a QFP package with 100 pins (30+20+30+20)
+* The asic variants seen in the wild are:
+* 27-0769 TC17G032AF-0248 (Socrates NTSC)
+* 27-0883 1732-8277 (Video Painter and Socrates PAL)
*
-TODO:
+TODO (socrates):
* The speech chip is a Toshiba tc8802AF (which is pin and speech
compatible with the older Toshiba t6803, but adds vsm rom read mode and
apparently does away with the melody mode); the chip is running at
@@ -117,6 +122,7 @@ public:
void init_socrates();
void init_iqunlimz();
+ void init_vpainter();
protected:
enum
@@ -144,7 +150,7 @@ protected:
uint16_t m_scroll_offset;
uint16_t m_kb_spi_buffer;
bool m_kb_spi_request;
- uint8_t m_kbmcu_type; // 0 for socrates, 1 for iqunlimz
+ uint8_t m_kbmcu_type; // 0 for socrates, 1 for iqunlimz, 2 for vpainter
uint16_t m_oldkeyvalue; // previous key pressed
uint16_t m_keyrepeat_holdoffcounter; // keyrepeat holdoff countdown
uint8_t m_io40_latch; // what was last written to speech reg (for open bus)?
@@ -176,7 +182,7 @@ protected:
DECLARE_READ8_MEMBER(socrates_cart_r);
DECLARE_READ8_MEMBER(read_f3);
DECLARE_WRITE8_MEMBER(kbmcu_reset);
- DECLARE_READ8_MEMBER(status_and_speech);
+ DECLARE_READ8_MEMBER(socrates_status_r);
DECLARE_WRITE8_MEMBER(speech_command);
DECLARE_READ8_MEMBER(keyboard_buffer_read);
DECLARE_WRITE8_MEMBER(keyboard_buffer_update);
@@ -204,8 +210,8 @@ protected:
void socrates_rambank_map(address_map &map);
void socrates_rombank_map(address_map &map);
- void z80_io(address_map &map);
- void z80_mem(address_map &map);
+ void socrates_io(address_map &map);
+ void socrates_mem(address_map &map);
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
};
@@ -419,6 +425,17 @@ void socrates_state::init_iqunlimz()
m_kbmcu_type = 1;
}
+void socrates_state::init_vpainter()
+{
+ uint8_t *gfx = memregion("vram")->base();
+
+ /* fill vram with its init powerup bit pattern, so startup has the checkerboard screen */
+ for (int i = 0; i < 0x10000; i++)
+ gfx[i] = (((i&0x1)?0x00:0xFF)^((i&0x100)?0x00:0xff));
+ m_maincpu->set_clock_scale(0.45f); /// TODO: RAM access waitstates etc. aren't emulated - slow the CPU to compensate
+ m_kbmcu_type = 2;
+}
+
READ8_MEMBER(socrates_state::common_rom_bank_r)
{
return m_rom_bank[offset];
@@ -471,7 +488,7 @@ WRITE8_MEMBER(socrates_state::kbmcu_reset) // reset the keyboard MCU, clear its
kbmcu_sim_reset();
}
-READ8_MEMBER(socrates_state::status_and_speech)// read 0x4x, some sort of status reg
+READ8_MEMBER(socrates_state::socrates_status_r)// read 0x4x, some sort of status reg
{
// bit 7 - speech status: high when speech is playing, low when it is not (or when speech cart is not present)
// bit 6 - unknown, usually set, possibly mcu ready state?
@@ -639,7 +656,7 @@ READ8_MEMBER( socrates_state::keyboard_buffer_read )
if (offset == 1) return m_kb_spi_buffer&0xFF;
else return (m_kb_spi_buffer&0xFF00)>>8;
}
- else // (m_kbmcu_type == 1) // iqunlimz hack, the system won't work without this?!?!
+ else // if ( (m_kbmcu_type == 1) || (m_kbmcu_type == 2) ) // iqunlimz hack, the system won't work without this?!?!
{
if (offset == 1) return (m_screen->vblank()?0x80:0)|(m_kbdrow[0]->read()&0xf);
else return (m_kb_spi_buffer&0xFF00)>>8;
@@ -980,7 +997,7 @@ INPUT_CHANGED_MEMBER( iqunlimz_state::send_input )
Address Maps
******************************************************************************/
-void socrates_state::z80_mem(address_map &map)
+void socrates_state::socrates_mem(address_map &map)
{
map.unmap_value_high();
map(0x0000, 0x3fff).rom(); /* system rom, bank 0 (fixed) */
@@ -1003,7 +1020,7 @@ void socrates_state::socrates_rambank_map(address_map &map)
map(0x0000, 0xffff).ram().region("vram", 0).mirror(0x30000);
}
-void socrates_state::z80_io(address_map &map)
+void socrates_state::socrates_io(address_map &map)
{
map.unmap_value_high();
map.global_mask(0xff);
@@ -1023,7 +1040,7 @@ void socrates_state::z80_io(address_map &map)
*/
map(0x20, 0x21).rw(FUNC(socrates_state::read_f3), FUNC(socrates_state::socrates_scroll_w)).mirror(0xE);
map(0x30, 0x30).rw(FUNC(socrates_state::read_f3), FUNC(socrates_state::kbmcu_reset)).mirror(0xF); /* resets the keyboard IR decoder MCU */
- map(0x40, 0x40).rw(FUNC(socrates_state::status_and_speech), FUNC(socrates_state::speech_command)).mirror(0xF); /* reads status register for vblank/hblank/speech, also reads and writes speech module */
+ map(0x40, 0x40).rw(FUNC(socrates_state::socrates_status_r), FUNC(socrates_state::speech_command)).mirror(0xF); /* reads status register for vblank/hblank/speech, also reads and writes speech module */
map(0x50, 0x51).rw(FUNC(socrates_state::keyboard_buffer_read), FUNC(socrates_state::keyboard_buffer_update)).mirror(0xE); /* Keyboard fifo read, pop fifo on write */
map(0x60, 0x60).rw(FUNC(socrates_state::read_f3), FUNC(socrates_state::reset_speech)).mirror(0xF); /* reset the speech module, or perhaps fire an NMI? */
map(0x70, 0xFF).r(FUNC(socrates_state::read_f3)); // nothing mapped here afaik
@@ -1388,7 +1405,7 @@ TIMER_CALLBACK_MEMBER(socrates_state::kbmcu_sim_cb)
// timer rate is a massive guess; we're assuming the mcu runs at the same speed as the cpu does,
// and the refresh rate depends on instructions per loop of mcu, which we've randomly guessed is 60 cycles.
m_kbmcu_sim_timer->adjust(m_maincpu->cycles_to_attotime(3000));
- /// TODO: dump the mcu and get rid of this...
+ /// TODO: dump the mcus and get rid of this...
if (m_kbmcu_type == 0)
{
// socrates keyboard MCU simulation: if a keyboard key is pressed, enqueue it into the fifo as needed
@@ -1447,7 +1464,7 @@ TIMER_CALLBACK_MEMBER(socrates_state::kbmcu_sim_cb)
m_oldkeyvalue = keyvalue; // set this new key to be the 'previous key'
}
}
- //else // m_kbmcu_type = 1 // this is currently hacked around by the input system so no code here
+ //else if (m_kbmcu_type == 1) // this is currently hacked around by the input system so no code here
//{
//}
@@ -1469,8 +1486,8 @@ void socrates_state::socrates(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(21'477'272)/6); /* Toshiba TMPZ84C00AP @ 3.579545 MHz, verified, xtal is divided by 6 */
- m_maincpu->set_addrmap(AS_PROGRAM, &socrates_state::z80_mem);
- m_maincpu->set_addrmap(AS_IO, &socrates_state::z80_io);
+ m_maincpu->set_addrmap(AS_PROGRAM, &socrates_state::socrates_mem);
+ m_maincpu->set_addrmap(AS_IO, &socrates_state::socrates_io);
m_maincpu->set_vblank_int("screen", FUNC(socrates_state::assert_irq));
config.m_minimum_quantum = attotime::from_hz(60);
@@ -1503,7 +1520,7 @@ void socrates_state::socrates_pal(machine_config &config)
{
socrates(config);
- m_maincpu->set_clock(XTAL(26'601'712)/8);
+ m_maincpu->set_clock(XTAL(26'601'712)/8); // XTAL verified, divider NOT verified; this is a later ASIC so the divider may be different
config.m_minimum_quantum = attotime::from_hz(50);
@@ -1552,7 +1569,7 @@ void iqunlimz_state::iqunlimz(machine_config &config)
******************************************************************************/
ROM_START(socrates)
- ROM_REGION(0x400000, "maincpu", ROMREGION_ERASEVAL(0xF3)) /* can technically address 4mb of rom via bankswitching; open bus area reads as 0xF3 */
+ ROM_REGION(0x400000, "maincpu", ROMREGION_ERASEVAL(0xF3)) /* can technically address 4mb of rom via bankswitching; open bus area reads as 0xF3 on fluke */
/* Socrates US NTSC */
/* all cart roms are 28 pin 23c1000/tc531000 128Kx8 roms */
/* cart port pinout:
@@ -1631,7 +1648,7 @@ ROM_START(profweis)
ROM_SYSTEM_BIOS(0, "89", "1989")
ROMX_LOAD("lh53216d.u1", 0x00000, 0x40000, CRC(6e801762) SHA1(b80574a3abacf18133dacb9d3a8d9e2916730423), ROM_BIOS(0)) // Label: "(Vtech) LH53216D // (C)1989 VIDEO TECHNOLOGY // 9119 D"
ROM_SYSTEM_BIOS(1, "88", "1988")
- ROMX_LOAD("27-00885-001-000.u1", 0x00000, 0x40000, CRC(fcaf8850) SHA1(a99011ee6a1ef63461c00d062278951252f117db), ROM_BIOS(1)) // Label: "(Vtech) 27-00884-001-000 // (C)1988 VIDEO TECHNOLOGY // 8911 D"
+ ROMX_LOAD("27-00885-000-000.u1", 0x00000, 0x40000, CRC(fcaf8850) SHA1(a99011ee6a1ef63461c00d062278951252f117db), ROM_BIOS(1)) // Label: "(Vtech) 27-00885-000-000 // (C)1988 VIDEO TECHNOLOGY // 8844 D"
ROM_REGION(0x10000, "vram", ROMREGION_ERASEFF) /* fill with ff, driver_init changes this to the 'correct' startup pattern */
@@ -1650,9 +1667,25 @@ ROM_START( iqunlimz )
ROM_REGION( 0x80000, "maincpu", 0 )
ROM_LOAD( "vtech.bin", 0x000000, 0x080000, CRC(f100c8a7) SHA1(6ad2a8accae2dd5c5c46ae953eef33cdd1ea3cf9) )
+ ROM_REGION(0x1000, "kbmcu", ROMREGION_ERASEFF)
+ ROM_LOAD("kbmcu.bin", 0x0000, 0x1000, NO_DUMP) /* keyboard reader MCU */
+
ROM_REGION( 0x40000, "vram", ROMREGION_ERASE )
ROM_END
+ROM_START( vpainter )
+ ROM_REGION(0x80000, "maincpu", ROMREGION_ERASEVAL(0xF3))
+ ROM_LOAD("lh531g02.u1", 0x00000, 0x20000, CRC(898defac) SHA1(8307e00b5ce3675ce71960e7cf2d1334197a1dce)) // Label: "(Vtech)LH531G02 // (C)1991 VIDEO TECHNOLOGY // 9211 D"
+
+ ROM_REGION(0x1000, "kbmcu", ROMREGION_ERASEFF)
+ ROM_LOAD("tmp47c241nj408.u6", 0x0000, 0x1000, NO_DUMP) /* key/touchpad reader MCU */
+
+ ///TODO: get rid of these regions in the status_read function or make it socrates-specific
+ ROM_REGION(0x2000, "speechint", ROMREGION_ERASE00) // doesn't exist? on vpainter, presumably reads as all zeroes
+ ROM_REGION(0x10000, "speechext", ROMREGION_ERASE00) // doesn't exist? on vpainter, presumably reads as all zeroes
+
+ ROM_REGION( 0x10000, "vram", ROMREGION_ERASE )
+ROM_END
/******************************************************************************
Drivers
@@ -1666,3 +1699,6 @@ COMP( 1988, profweis, socrates, 0, socrates_pal, socrates, socrates_state,
// ? goes here (spanish PAL)
COMP( 1991, iqunlimz, 0, 0, iqunlimz, iqunlimz, iqunlimz_state, init_iqunlimz, "Video Technology", "IQ Unlimited (Z80)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+
+COMP( 1991, vpainter, 0, 0, socrates_pal, socrates, socrates_state, init_vpainter, "Video Technology", "Video Painter (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND )
+// Master Video Painter goes here
diff --git a/src/mame/drivers/splus.cpp b/src/mame/drivers/splus.cpp
index 1810b6ee3f7..292968ef178 100644
--- a/src/mame/drivers/splus.cpp
+++ b/src/mame/drivers/splus.cpp
@@ -742,8 +742,8 @@ ROM_END
*************************/
// YEAR NAME PARENT MACHINE INPUT CLASS INIT ROT COMPANY FULLNAME FLAGS LAYOUT
-GAMEL( 1993, spset005, 0, splus, splus, splus_state, init_splus, ROT0, "IGT - International Game Technology", "S-Plus SET005 Set chip", MACHINE_NOT_WORKING, layout_splus )
-GAMEL( 1993, spset015, 0, splus, splus, splus_state, init_splus, ROT0, "IGT - International Game Technology", "S-Plus SET015 Set chip", MACHINE_NOT_WORKING, layout_splus )
-GAMEL( 1996, spset026, 0, splus, splus, splus_state, init_splus, ROT0, "IGT - International Game Technology", "S-Plus SET026 Set chip", MACHINE_NOT_WORKING, layout_splus )
+GAMEL( 1993, spset005, 0, splus, splus, splus_state, empty_init, ROT0, "IGT - International Game Technology", "S-Plus SET005 Set chip", MACHINE_NOT_WORKING, layout_splus )
+GAMEL( 1993, spset015, 0, splus, splus, splus_state, empty_init, ROT0, "IGT - International Game Technology", "S-Plus SET015 Set chip", MACHINE_NOT_WORKING, layout_splus )
+GAMEL( 1996, spset026, 0, splus, splus, splus_state, empty_init, ROT0, "IGT - International Game Technology", "S-Plus SET026 Set chip", MACHINE_NOT_WORKING, layout_splus )
GAMEL( 1994, spss4240, 0, splus, splus, splus_state, init_splus, ROT0, "IGT - International Game Technology", "S-Plus (SS4240) Coral Reef", MACHINE_NOT_WORKING, layout_splus )
diff --git a/src/mame/drivers/studio2.cpp b/src/mame/drivers/studio2.cpp
index 9be20ae273f..54a8b672af0 100644
--- a/src/mame/drivers/studio2.cpp
+++ b/src/mame/drivers/studio2.cpp
@@ -181,6 +181,12 @@ Notes:
- NE555 discrete sound
+
+ Usage
+ - All variants: Boot up, then press F3, then press a letter (Q,W,E,A) to choose an inbuilt game.
+ - If using a cart, boot up, press F3, then follow the instructions that came with the cart (usually press Q).
+ - Currently, Visicom cannot run any carts, and has no support for st2 files.
+
*/
#include "emu.h"
diff --git a/src/mame/drivers/sunplus_gcm394.cpp b/src/mame/drivers/sunplus_gcm394.cpp
index 0ce5af32a64..80515be47d0 100644
--- a/src/mame/drivers/sunplus_gcm394.cpp
+++ b/src/mame/drivers/sunplus_gcm394.cpp
@@ -31,6 +31,7 @@ public:
, m_screen(*this, "screen")
, m_spg(*this, "spg")
, m_bank(*this, "cartbank")
+ , m_io_p1(*this, "P1")
{ }
void base(machine_config &config);
@@ -46,16 +47,28 @@ protected:
required_device<sunplus_gcm394_device> m_spg;
optional_memory_bank m_bank;
+
+ required_ioport m_io_p1;
virtual void mem_map_4m(address_map &map);
private:
uint32_t m_current_bank;
+
+ DECLARE_READ16_MEMBER(porta_r);
};
+READ16_MEMBER(gcm394_game_state::porta_r)
+{
+ uint16_t data = m_io_p1->read();
+ logerror("Port A Read: %04x\n", data);
+ return data;
+}
+
void gcm394_game_state::base(machine_config &config)
{
GCM394(config, m_spg, XTAL(27'000'000), m_maincpu, m_screen);
+ m_spg->porta_in().set(FUNC(gcm394_game_state::porta_r));
UNSP_20(config, m_maincpu, XTAL(27'000'000)); // code at 8019 uses extended opcode, so must be 2.0+?
m_maincpu->set_addrmap(AS_PROGRAM, &gcm394_game_state::mem_map_4m);
@@ -107,6 +120,55 @@ void gcm394_game_state::mem_map_4m(address_map &map)
}
static INPUT_PORTS_START( gcm394 )
+ PORT_START("P1")
+ PORT_DIPNAME( 0x0001, 0x0001, "P1" )
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0200, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x1000, 0x1000, "Test 1/2" )
+ PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x2000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x8000, "Test 2/2" )
+ PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
diff --git a/src/mame/drivers/taito_f2.cpp b/src/mame/drivers/taito_f2.cpp
index a3c045859f3..bfd8be92126 100644
--- a/src/mame/drivers/taito_f2.cpp
+++ b/src/mame/drivers/taito_f2.cpp
@@ -3735,6 +3735,7 @@ void taitof2_state::driveout(machine_config &config)
SPEAKER(config, "rspeaker").front_right();
OKIM6295(config, m_oki, 1056000, okim6295_device::PIN7_HIGH); // clock frequency & pin 7 not verified
+ m_oki->set_addrmap(0, &taitof2_state::driveout_oki_map);
m_oki->add_route(ALL_OUTPUTS, "lspeaker", 1.0);
m_oki->add_route(ALL_OUTPUTS, "rspeaker", 1.0);
diff --git a/src/mame/drivers/tmc1800.cpp b/src/mame/drivers/tmc1800.cpp
index df9b2ee7941..a8e671b07e5 100644
--- a/src/mame/drivers/tmc1800.cpp
+++ b/src/mame/drivers/tmc1800.cpp
@@ -111,6 +111,18 @@ Notes:
- tmc2000: TOOL-2000 rom banking
- nano: correct time constant for EF4 RC circuit
+
+ Usage:
+ - Same as VIP except the machine begins in the stopped mode.
+ - So, to enter the monitor, hold C and press R
+ - The support for chip-8 is not yet written, due to missing roms.
+ - The screen for nano should be white not red (caused by using only the
+ red output of a colour crt controller)
+ - The monitor of the tmc1800 is difficult to read because the colour ram
+ contains random values.
+ - Both nano and tmc1800 seem to "work", but there's insufficient software
+ to test with.
+
*/
#include "emu.h"
@@ -875,5 +887,5 @@ void tmc1800_state::init_tmc1800()
// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
COMP( 1977, tmc1800, 0, 0, tmc1800, tmc1800, tmc1800_state, init_tmc1800, "Telercas Oy", "Telmac 1800", MACHINE_NOT_WORKING )
COMP( 1977, osc1000b, tmc1800, 0, osc1000b, tmc1800, osc1000b_state, empty_init, "OSCOM Oy", "OSCOM 1000B", MACHINE_NOT_WORKING )
-COMP( 1980, tmc2000, 0, 0, tmc2000, tmc2000, tmc2000_state, empty_init, "Telercas Oy", "Telmac 2000", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
-COMP( 1980, nano, tmc2000, 0, nano, nano, nano_state, empty_init, "OSCOM Oy", "OSCOM Nano", MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
+COMP( 1980, tmc2000, 0, 0, tmc2000, tmc2000, tmc2000_state, empty_init, "Telercas Oy", "Telmac 2000", MACHINE_SUPPORTS_SAVE )
+COMP( 1980, nano, tmc2000, 0, nano, nano, nano_state, empty_init, "OSCOM Oy", "OSCOM Nano", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/vip.cpp b/src/mame/drivers/vip.cpp
index bd77b9031fb..0d647146aa5 100644
--- a/src/mame/drivers/vip.cpp
+++ b/src/mame/drivers/vip.cpp
@@ -217,6 +217,18 @@ Notes:
* Quantities of 15 or more available less case and speaker (Assembled
keypad and circut board only). Price on request.
+
+Usage:
+ - If you turn it on as is, it quickly jumps into the weeds as it is expecting
+ valid code to exist at 0000. To enter the monitor, press R, hold C, press R,
+ (you will see the memory editor) then choose a command (0 for example).
+ - If you load a chip-8 cart, press R twice. If it doesn't do anything you may
+ need to do a hard reset, then hit R twice. R toggles between the CPU running
+ or stopped.
+ - There's also support for Super-Chip8 carts, but none seem to work.
+ - There's a slot option to use Tiny Basic, this starts up, but unable to type
+ anything.
+
*/
#include "emu.h"
diff --git a/src/mame/drivers/wicat.cpp b/src/mame/drivers/wicat.cpp
index 6265293fa9a..1dc3d941f9c 100644
--- a/src/mame/drivers/wicat.cpp
+++ b/src/mame/drivers/wicat.cpp
@@ -784,7 +784,7 @@ void wicat_state::wicat(machine_config &config)
m_videocpu->set_addrmap(AS_PROGRAM, &wicat_state::video_mem);
m_videocpu->set_addrmap(AS_IO, &wicat_state::video_io);
- INPUT_MERGER_ANY_HIGH(config, m_videoirq).output_handler().set_inputline(m_videocpu, INPUT_LINE_IRQ0);
+ INPUT_MERGER_ANY_HIGH(config, m_videoirq).output_handler().set_inputline(m_videocpu, z8002_device::NVI_LINE);
LS259(config, m_videoctrl);
m_videoctrl->q_out_cb<0>().set(FUNC(wicat_state::crtc_irq_clear_w));
@@ -799,7 +799,7 @@ void wicat_state::wicat(machine_config &config)
m_videodma->out_memw_callback().set(FUNC(wicat_state::vram_w));
m_videodma->out_iow_callback<0>().set(m_crtc, FUNC(i8275_device::dack_w));
- INPUT_MERGER_ALL_HIGH(config, "dmairq").output_handler().set_inputline(m_videocpu, INPUT_LINE_NMI);
+ INPUT_MERGER_ALL_HIGH(config, "dmairq").output_handler().set_inputline(m_videocpu, z8002_device::NMI_LINE);
IM6402(config, m_videouart, 0);
m_videouart->set_rrc(0);
diff --git a/src/mame/drivers/z100.cpp b/src/mame/drivers/z100.cpp
index bdaaee47aaa..8fb1ea5f5cd 100644
--- a/src/mame/drivers/z100.cpp
+++ b/src/mame/drivers/z100.cpp
@@ -702,7 +702,7 @@ void z100_state::z100(machine_config &config)
I8085A(config, "cpu85", 10_MHz_XTAL).set_disable();
- I8041(config, "upi", 6_MHz_XTAL).set_disable();
+ I8041(config, "kbdc", 6_MHz_XTAL); // TODO: keyboard LLE
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
@@ -776,8 +776,8 @@ ROM_START( z100 )
ROM_REGION( 0x4000, "ipl", 0 )
ROM_LOAD( "intel-d27128-1.bin", 0x0000, 0x4000, CRC(b21f0392) SHA1(69e492891cceb143a685315efe0752981a2d8143))
- ROM_REGION( 0x0400, "upi", ROMREGION_ERASE00 ) // 8041A keyboard controller
- ROM_LOAD( "444-109.u284", 0x0000, 0x0400, NO_DUMP )
+ ROM_REGION( 0x0400, "kbdc", ROMREGION_ERASE00 ) // 8041A keyboard controller
+ ROM_LOAD( "444-109.u204", 0x0000, 0x0400, CRC(45181029) SHA1(0e89649364d25cf2d8669d2a293ee162e274cb64) )
ROM_REGION( 0x0100, "vrmm", 0 ) // Video RAM Mapping Module
ROM_LOAD( "444-127.u370", 0x0000, 0x0100, CRC(ac386f6b) SHA1(2b62b939d704d90edf59923a8a1a51ef1902f4d7) BAD_DUMP ) // typed in from manual
diff --git a/src/mame/includes/galaga.h b/src/mame/includes/galaga.h
index edc973034df..2a8b3faa780 100644
--- a/src/mame/includes/galaga.h
+++ b/src/mame/includes/galaga.h
@@ -63,6 +63,8 @@ public:
void galaga_mem4(address_map &map);
void gatsbee_main_map(address_map &map);
+ void starfield_init();
+
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
diff --git a/src/mame/includes/pk8020.h b/src/mame/includes/pk8020.h
index 23ffb6f3cd5..ac1036b11c9 100644
--- a/src/mame/includes/pk8020.h
+++ b/src/mame/includes/pk8020.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Miodrag Milanovic
+// copyright-holders:Miodrag Milanovic, AJR
/*****************************************************************************
*
* includes/pk8020.h
@@ -12,10 +12,10 @@
#include "imagedev/cassette.h"
#include "imagedev/floppy.h"
+#include "machine/bankdev.h"
#include "machine/i8251.h"
-#include "machine/i8255.h"
#include "machine/pic8259.h"
-#include "machine/pit8253.h"
+#include "machine/pla.h"
#include "machine/ram.h"
#include "machine/wd_fdc.h"
#include "sound/spkrdev.h"
@@ -29,22 +29,17 @@ public:
pk8020_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
- m_ppi8255_1(*this, "ppi8255_1"),
- m_ppi8255_2(*this, "ppi8255_2"),
- m_ppi8255_3(*this, "ppi8255_3"),
- m_rs232(*this, "i8251line"),
- m_lan(*this, "i8251lan"),
+ m_decplm(*this, "decplm"),
+ m_devbank(*this, "devbank"),
m_ram(*this, RAM_TAG),
- m_wd1793(*this, "wd1793"),
- m_floppy0(*this, "wd1793:0"),
- m_floppy1(*this, "wd1793:1"),
- m_floppy2(*this, "wd1793:2"),
- m_floppy3(*this, "wd1793:3"),
- m_pit8253(*this, "pit8253"),
- m_pic8259(*this, "pic8259"),
+ m_ios(*this, "ios%u", 1U),
+ m_fdc(*this, "fdc"),
+ m_floppy(*this, "fdc:%u", 0U),
+ m_inr(*this, "inr"),
m_speaker(*this, "speaker"),
m_region_maincpu(*this, "maincpu"),
m_region_gfx1(*this, "gfx1"),
+ m_io_port(*this, "LINE%u", 0U),
m_palette(*this, "palette")
{ }
@@ -53,34 +48,40 @@ public:
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
+ virtual void video_start() override;
private:
DECLARE_FLOPPY_FORMATS(floppy_formats);
- DECLARE_READ8_MEMBER(keyboard_r);
- DECLARE_READ8_MEMBER(sysreg_r);
- DECLARE_WRITE8_MEMBER(sysreg_w);
- DECLARE_READ8_MEMBER(text_r);
- DECLARE_WRITE8_MEMBER(text_w);
- DECLARE_READ8_MEMBER(gzu_r);
- DECLARE_WRITE8_MEMBER(gzu_w);
- DECLARE_READ8_MEMBER(devices_r);
- DECLARE_WRITE8_MEMBER(devices_w);
+ uint8_t keyboard_r(offs_t offset);
+ void sysreg_w(offs_t offset, uint8_t data);
+ void color_w(uint8_t data);
+ void palette_w(uint8_t data);
+ void video_page_w(uint8_t data);
+ uint8_t text_r(offs_t offset);
+ void text_w(offs_t offset, uint8_t data);
+ uint8_t gzu_r(offs_t offset);
+ void gzu_w(offs_t offset, uint8_t data);
+ uint8_t devices_r(offs_t offset);
+ void devices_w(offs_t offset, uint8_t data);
+ uint8_t memory_r(offs_t offset);
+ void memory_w(offs_t offset, uint8_t data);
void pk8020_palette(palette_device &palette) const;
uint32_t screen_update_pk8020(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(pk8020_interrupt);
- DECLARE_READ8_MEMBER(pk8020_porta_r);
- DECLARE_WRITE8_MEMBER(pk8020_portc_w);
- DECLARE_WRITE8_MEMBER(pk8020_portb_w);
- DECLARE_READ8_MEMBER(pk8020_portc_r);
- DECLARE_WRITE8_MEMBER(pk8020_2_portc_w);
- DECLARE_WRITE_LINE_MEMBER(pk8020_pit_out0);
- DECLARE_WRITE_LINE_MEMBER(pk8020_pit_out1);
- void pk8020_set_bank(uint8_t data);
+ uint8_t ppi_porta_r();
+ void floppy_control_w(uint8_t data);
+ void ppi_2_portc_w(uint8_t data);
+ DECLARE_WRITE_LINE_MEMBER(pit_out0);
+
+ static const char *plm_select_name(uint8_t data);
+ void log_bank_select(uint8_t bank, offs_t start, offs_t end, uint8_t rdecplm, uint8_t wdecplm);
void pk8020_io(address_map &map);
void pk8020_mem(address_map &map);
+ void devices_map(address_map &map);
+ uint8_t m_bank_select;
uint8_t m_color;
uint8_t m_video_page;
uint8_t m_wide;
@@ -89,28 +90,21 @@ private:
uint8_t m_text_attr;
uint8_t m_takt;
uint8_t m_video_page_access;
- uint8_t m_portc_data;
uint8_t m_sound_gate;
uint8_t m_sound_level;
required_device<cpu_device> m_maincpu;
- required_device<i8255_device> m_ppi8255_1;
- required_device<i8255_device> m_ppi8255_2;
- required_device<i8255_device> m_ppi8255_3;
- required_device<i8251_device> m_rs232;
- required_device<i8251_device> m_lan;
+ required_device<pls100_device> m_decplm;
+ required_device<address_map_bank_device> m_devbank;
required_device<ram_device> m_ram;
- required_device<fd1793_device> m_wd1793;
- required_device<floppy_connector> m_floppy0;
- required_device<floppy_connector> m_floppy1;
- required_device<floppy_connector> m_floppy2;
- required_device<floppy_connector> m_floppy3;
- required_device<pit8253_device> m_pit8253;
- required_device<pic8259_device> m_pic8259;
+ required_device_array<i8251_device, 2> m_ios;
+ required_device<kr1818vg93_device> m_fdc;
+ required_device_array<floppy_connector, 4> m_floppy;
+ required_device<pic8259_device> m_inr;
required_device<speaker_sound_device> m_speaker;
required_memory_region m_region_maincpu;
required_region_ptr<uint8_t> m_region_gfx1;
- ioport_port *m_io_port[16];
+ required_ioport_array<16> m_io_port;
required_device<palette_device> m_palette;
};
diff --git a/src/mame/includes/raiden2.h b/src/mame/includes/raiden2.h
index 11012270e92..aacca62d6f1 100644
--- a/src/mame/includes/raiden2.h
+++ b/src/mame/includes/raiden2.h
@@ -7,6 +7,7 @@
#include "audio/seibu.h"
#include "machine/seibucop/seibucop.h"
+#include "video/bufsprite.h"
#include "video/seibu_crtc.h"
#include "emupal.h"
#include "screen.h"
@@ -62,7 +63,7 @@ protected:
std::unique_ptr<u16[]> m_mid_data;
std::unique_ptr<u16[]> m_text_data; // private buffers, allocated in init
std::unique_ptr<u16[]> m_palette_data;
- required_shared_ptr<u16> m_spriteram;
+ required_device<buffered_spriteram16_device> m_spriteram;
required_device<cpu_device> m_maincpu;
optional_device<seibu_sound_device> m_seibu_sound;
required_device<gfxdecode_device> m_gfxdecode;
diff --git a/src/mame/includes/seta.h b/src/mame/includes/seta.h
index 387f4591674..22e07968d40 100644
--- a/src/mame/includes/seta.h
+++ b/src/mame/includes/seta.h
@@ -378,7 +378,7 @@ private:
void kiwame_map(address_map &map);
required_device<tmp68301_device> m_maincpu;
- required_ioport_array<5> m_key;
+ required_ioport_array<10> m_key;
uint16_t m_kiwame_row_select;
};
diff --git a/src/mame/machine/hpc3.cpp b/src/mame/machine/hpc3.cpp
index 8cc75dfa594..164c6c933fc 100644
--- a/src/mame/machine/hpc3.cpp
+++ b/src/mame/machine/hpc3.cpp
@@ -414,11 +414,11 @@ READ32_MEMBER(hpc3_device::pbus4_r)
break;
case 0x0014/4:
ret = m_ioc2->get_map_int_mask(0);
- LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 0 Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
+ LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 0 Mask Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
break;
case 0x0018/4:
ret = m_ioc2->get_map_int_mask(1);
- LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 1 Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
+ LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 1 Mask Read: %08x & %08x\n", machine().describe_context(), ret, mem_mask);
break;
case 0x0030/4:
ret = m_ioc2->get_pit_reg(0);
@@ -457,11 +457,11 @@ WRITE32_MEMBER(hpc3_device::pbus4_w)
break;
case 0x0014/4:
m_ioc2->set_map_int_mask(0, data);
- LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 0 Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 0 Mask Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
break;
case 0x0018/4:
m_ioc2->set_map_int_mask(1, data);
- LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 1 Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
+ LOGMASKED(LOG_PBUS4, "%s: HPC3 INT3 Mapped Interrupt 1 Mask Write: %08x & %08x\n", machine().describe_context(), data, mem_mask);
break;
case 0x0020/4:
m_ioc2->set_timer_int_clear(data);
diff --git a/src/mame/machine/ioc2.cpp b/src/mame/machine/ioc2.cpp
index ff9c9fc80a9..5c5d1b3355b 100644
--- a/src/mame/machine/ioc2.cpp
+++ b/src/mame/machine/ioc2.cpp
@@ -23,7 +23,7 @@
#define LOG_PIT (1 << 10)
#define LOG_IRQS (1 << 11)
#define LOG_ALL (LOG_PI1 | LOG_SERIAL | LOG_MOUSEKBD | LOG_PANEL | LOG_SYSID | LOG_READ | LOG_DMA_SEL | LOG_RESET | LOG_WRITE | LOG_INT3 | LOG_PIT | LOG_IRQS)
-#define LOG_DEFAULT (LOG_ALL & ~(LOG_SYSID | LOG_MOUSEKBD))
+#define LOG_DEFAULT (LOG_ALL & ~(LOG_SYSID))
#define VERBOSE (0)
#include "logmacro.h"
@@ -238,23 +238,31 @@ void ioc2_device::set_mappable_int(uint8_t mask, bool state)
const uint8_t new0 = m_int3_map_mask_reg[0] & m_int3_map_status_reg;
if (old0 ^ new0)
{
- LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable0\n", state ? "Rais" : "Lower", mask, old,
- m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
- if (m_int3_map_mask_reg[0] & m_int3_map_status_reg)
- raise_local_irq(0, INT3_LOCAL0_MAPPABLE0);
- else
- lower_local_irq(0, INT3_LOCAL0_MAPPABLE0);
+ check_mappable_interrupt(0);
}
const uint8_t new1 = m_int3_map_mask_reg[1] & m_int3_map_status_reg;
if (old1 ^ new1)
{
- LOGMASKED(LOG_IRQS, "%sing Mappable interrupt mask %02x, interrupt status was %02x, now %02x, %sing mappable1\n", state ? "Rais" : "Lower", mask, old,
- m_int3_map_status_reg, (m_int3_map_mask_reg[0] & m_int3_map_status_reg) ? "rais" : "lower");
- if (m_int3_map_mask_reg[1] & m_int3_map_status_reg)
- raise_local_irq(1, INT3_LOCAL1_MAPPABLE1);
+ check_mappable_interrupt(1);
+ }
+}
+
+void ioc2_device::check_mappable_interrupt(int channel)
+{
+ if (channel == 0)
+ {
+ if (m_int3_map_mask_reg[channel] & m_int3_map_status_reg)
+ raise_local_irq(channel, INT3_LOCAL0_MAPPABLE0);
+ else
+ lower_local_irq(channel, INT3_LOCAL0_MAPPABLE0);
+ }
+ else
+ {
+ if (m_int3_map_mask_reg[channel] & m_int3_map_status_reg)
+ raise_local_irq(channel, INT3_LOCAL1_MAPPABLE1);
else
- lower_local_irq(1, INT3_LOCAL1_MAPPABLE1);
+ lower_local_irq(channel, INT3_LOCAL1_MAPPABLE1);
}
}
@@ -330,13 +338,13 @@ READ32_MEMBER(ioc2_device::read)
case KBD_MOUSE_REGS1:
{
- const uint8_t data = m_kbdc->data_r(space, (offset - KBD_MOUSE_REGS1) * 4);
+ const uint8_t data = m_kbdc->data_r(space, 0);
LOGMASKED(LOG_MOUSEKBD, "%s: Read Keyboard/Mouse Register 1: %02x\n", machine().describe_context(), data);
return data;
}
case KBD_MOUSE_REGS2:
{
- const uint8_t data = m_kbdc->data_r(space, (offset - KBD_MOUSE_REGS1) * 4);
+ const uint8_t data = m_kbdc->data_r(space, 4);
LOGMASKED(LOG_MOUSEKBD, "%s: Read Keyboard/Mouse Register 2: %02x\n", machine().describe_context(), data);
return data;
}
@@ -385,64 +393,44 @@ READ32_MEMBER(ioc2_device::read)
return m_write_reg;
case INT3_LOCAL0_STATUS_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Local0 Status Register: %02x\n", machine().describe_context(), m_int3_local_status_reg[0]);
return m_int3_local_status_reg[0];
- }
case INT3_LOCAL0_MASK_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Local0 Mask Register: %02x\n", machine().describe_context(), m_int3_local_mask_reg[0]);
return m_int3_local_mask_reg[0];
- }
case INT3_LOCAL1_STATUS_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Local1 Status Register: %02x\n", machine().describe_context(), m_int3_local_status_reg[1]);
return m_int3_local_status_reg[1];
- }
case INT3_LOCAL1_MASK_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Local1 Mask Register: %02x\n", machine().describe_context(), m_int3_local_mask_reg[1]);
return m_int3_local_mask_reg[1];
- }
case INT3_MAP_STATUS_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Map Status Register: %02x\n", machine().describe_context(), m_int3_map_status_reg);
return m_int3_map_status_reg;
- }
case INT3_MAP_MASK0_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Map Mask0 Register: %02x\n", machine().describe_context(), m_int3_map_mask_reg[0]);
return m_int3_map_mask_reg[0];
- }
case INT3_MAP_MASK1_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Map Mask1 Register: %02x\n", machine().describe_context(), m_int3_map_mask_reg[1]);
return m_int3_map_mask_reg[1];
- }
case INT3_MAP_POLARITY_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Map Polarity Register: %02x\n", machine().describe_context(), m_int3_map_pol_reg);
return m_int3_map_pol_reg;
- }
case INT3_TIMER_CLEAR_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Timer Clear (ignored)\n", machine().describe_context());
return 0;
- }
case INT3_ERROR_STATUS_REG:
- {
LOGMASKED(LOG_INT3, "%s: Read Interrupt Error Status Register: %02x\n", machine().describe_context(), m_int3_err_status_reg);
return m_int3_err_status_reg;
- }
case TIMER_COUNT0_REG:
{
@@ -514,28 +502,28 @@ WRITE32_MEMBER( ioc2_device::write )
case SERIAL1_CMD_REG:
LOGMASKED(LOG_SERIAL, "%s: Write Serial 1 Command Register: %02x\n", machine().describe_context(), (uint8_t)data);
- m_scc->ba_cd_w(space, (offset - SERIAL1_CMD_REG) ^ 3, data & 0xff);
+ m_scc->ba_cd_w(space, 3, data & 0xff);
return;
case SERIAL1_DATA_REG:
LOGMASKED(LOG_SERIAL, "%s: Write Serial 1 Data Register: %02x\n", machine().describe_context(), (uint8_t)data);
- m_scc->ba_cd_w(space, (offset - SERIAL1_CMD_REG) ^ 3, data & 0xff);
+ m_scc->ba_cd_w(space, 2, data & 0xff);
return;
case SERIAL2_CMD_REG:
LOGMASKED(LOG_SERIAL, "%s: Write Serial 2 Command Register: %02x\n", machine().describe_context(), (uint8_t)data);
- m_scc->ba_cd_w(space, (offset - SERIAL1_CMD_REG) ^ 3, data & 0xff);
+ m_scc->ba_cd_w(space, 1, data & 0xff);
return;
case SERIAL2_DATA_REG:
LOGMASKED(LOG_SERIAL, "%s: Write Serial 2 Data Register: %02x\n", machine().describe_context(), (uint8_t)data);
- m_scc->ba_cd_w(space, (offset - SERIAL1_CMD_REG) ^ 3, data & 0xff);
+ m_scc->ba_cd_w(space, 0, data & 0xff);
return;
case KBD_MOUSE_REGS1:
LOGMASKED(LOG_MOUSEKBD, "%s: Write Keyboard/Mouse Register 1: %02x\n", machine().describe_context(), (uint8_t)data);
- m_kbdc->data_w(space, (offset - KBD_MOUSE_REGS1) * 4, data & 0xff);
+ m_kbdc->data_w(space, 0, data & 0xff);
return;
case KBD_MOUSE_REGS2:
LOGMASKED(LOG_MOUSEKBD, "%s: Write Keyboard/Mouse Register 2: %02x\n", machine().describe_context(), (uint8_t)data);
- m_kbdc->data_w(space, (offset - KBD_MOUSE_REGS1) * 4, data & 0xff);
+ m_kbdc->data_w(space, 4, data & 0xff);
return;
case PANEL_REG:
@@ -575,7 +563,7 @@ WRITE32_MEMBER( ioc2_device::write )
return;
case WRITE_REG:
- LOGMASKED(LOG_RESET, "%s: Write Write Register: %02x\n", machine().describe_context(), (uint8_t)data);
+ LOGMASKED(LOG_WRITE, "%s: Write Write Register: %02x\n", machine().describe_context(), (uint8_t)data);
m_write_reg = data;
return;
@@ -587,43 +575,31 @@ WRITE32_MEMBER( ioc2_device::write )
return;
case INT3_LOCAL0_MASK_REG:
- {
LOGMASKED(LOG_INT3, "%s: Write Interrupt Local0 Mask Register: %02x\n", machine().describe_context(), (uint8_t)data);
set_local_int_mask(0, data);
return;
- }
-
case INT3_LOCAL1_MASK_REG:
- {
LOGMASKED(LOG_INT3, "%s: Write Interrupt Local1 Mask Register: %02x\n", machine().describe_context(), (uint8_t)data);
set_local_int_mask(1, data);
return;
- }
case INT3_MAP_MASK0_REG:
- // TODO: Implement mappable interrupts
LOGMASKED(LOG_INT3, "%s: Write Interrupt Map Mask0 Register: %02x\n", machine().describe_context(), (uint8_t)data);
set_map_int_mask(0, data);
return;
-
case INT3_MAP_MASK1_REG:
- // TODO: Implement mappable interrupts
LOGMASKED(LOG_INT3, "%s: Write Interrupt Map Mask1 Register: %02x\n", machine().describe_context(), (uint8_t)data);
set_map_int_mask(1, data);
return;
-
case INT3_MAP_POLARITY_REG:
// TODO: Mappable interrupt polarity select
LOGMASKED(LOG_INT3, "%s: Write Interrupt Map Polarity Register: %02x\n", machine().describe_context(), (uint8_t)data);
m_int3_map_pol_reg = data;
return;
-
case INT3_TIMER_CLEAR_REG:
- {
LOGMASKED(LOG_INT3, "%s: Write Interrupt Timer Clear Register: %02x\n", machine().describe_context(), (uint8_t)data);
set_timer_int_clear(data);
return;
- }
case TIMER_COUNT0_REG:
LOGMASKED(LOG_PIT, "%s: Write Timer Count0 Register: %02x\n", machine().describe_context(), (uint8_t)data);
@@ -660,6 +636,7 @@ void ioc2_device::set_local_int_mask(int channel, uint32_t mask)
void ioc2_device::set_map_int_mask(int channel, uint32_t mask)
{
m_int3_map_mask_reg[channel] = (uint8_t)mask;
+ check_mappable_interrupt(channel);
}
void ioc2_device::set_timer_int_clear(uint32_t data)
diff --git a/src/mame/machine/ioc2.h b/src/mame/machine/ioc2.h
index 5e99996e7c6..d53012010dc 100644
--- a/src/mame/machine/ioc2.h
+++ b/src/mame/machine/ioc2.h
@@ -32,7 +32,7 @@ public:
void raise_local_irq(int channel, uint8_t mask);
void lower_local_irq(int channel, uint8_t mask);
- enum
+ enum : uint8_t
{
INT3_LOCAL0_FIFO = 0x01,
INT3_LOCAL0_SCSI0 = 0x02,
@@ -44,7 +44,7 @@ public:
INT3_LOCAL0_MAPPABLE0 = 0x80,
};
- enum
+ enum : uint8_t
{
INT3_LOCAL1_GP0 = 0x01,
INT3_LOCAL1_PANEL = 0x02,
@@ -83,6 +83,7 @@ protected:
DECLARE_WRITE_LINE_MEMBER(duart_int_w);
void set_mappable_int(uint8_t mask, bool state);
+ void check_mappable_interrupt(int channel);
enum
{
diff --git a/src/mame/machine/m24_z8000.cpp b/src/mame/machine/m24_z8000.cpp
index 062dc11be3f..35e2ab879cd 100644
--- a/src/mame/machine/m24_z8000.cpp
+++ b/src/mame/machine/m24_z8000.cpp
@@ -187,7 +187,7 @@ IRQ_CALLBACK_MEMBER(m24_z8000_device::int_cb)
{
if (!irqline)
{
- m_z8000->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
+ m_z8000->set_input_line(z8001_device::NVI_LINE, CLEAR_LINE);
return 0xff; // NVI, value ignored
}
else
@@ -227,5 +227,5 @@ WRITE_LINE_MEMBER(m24_z8000_device::mo_w)
WRITE_LINE_MEMBER(m24_z8000_device::timer_irq_w)
{
m_timer_irq = state ? true : false;
- m_z8000->set_input_line(INPUT_LINE_IRQ0, state ? ASSERT_LINE : CLEAR_LINE);
+ m_z8000->set_input_line(z8001_device::NVI_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
diff --git a/src/mame/machine/pk8020.cpp b/src/mame/machine/pk8020.cpp
index 634735ecf2f..ba719d13f0d 100644
--- a/src/mame/machine/pk8020.cpp
+++ b/src/mame/machine/pk8020.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Miodrag Milanovic
+// copyright-holders:Miodrag Milanovic, AJR
/***************************************************************************
PK-8020 driver by Miodrag Milanovic
@@ -12,819 +12,106 @@
#include "emu.h"
#include "includes/pk8020.h"
-#include "cpu/i8085/i8085.h"
+#define DESCRIBE_DECPLM 1
-READ8_MEMBER(pk8020_state::keyboard_r)
-{
- uint8_t retVal=0x00;
- uint8_t line = 0;
- if (offset & 0x100) line=8;
-
- if (offset & 0x0001) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0002) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0004) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0008) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0010) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0020) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0040) retVal|=m_io_port[line]->read();
- line++;
- if (offset & 0x0080) retVal|=m_io_port[line]->read();
- line++;
-
- return retVal;
-}
-READ8_MEMBER(pk8020_state::sysreg_r)
-{
- return m_ram->pointer()[offset];
-}
-WRITE8_MEMBER(pk8020_state::sysreg_w)
+uint8_t pk8020_state::keyboard_r(offs_t offset)
{
- if (BIT(offset,7)==0) {
- pk8020_set_bank(data >> 2);
- } else if (BIT(offset,6)==0) {
- // Color
- m_color = data;
- } else if (BIT(offset,2)==0) {
- // Palette set
- uint8_t number = data & 0x0f;
- uint8_t color = data >> 4;
- uint8_t i = (color & 0x08) ? 0x3F : 0;
- uint8_t r = ((color & 0x04) ? 0xC0 : 0) + i;
- uint8_t g = ((color & 0x02) ? 0xC0 : 0) + i;
- uint8_t b = ((color & 0x01) ? 0xC0 : 0) + i;
- m_palette->set_pen_color( number, rgb_t(r,g,b) );
+ uint8_t result = 0xff;
+
+ if (BIT(offset, 8))
+ {
+ for (uint8_t line = 8; line < 16; line++)
+ if (BIT(offset, line - 8))
+ result &= m_io_port[line]->read();
+ }
+ else
+ {
+ for (uint8_t line = 0; line < 8; line++)
+ if (BIT(offset, line))
+ result &= m_io_port[line]->read();
}
-}
-READ8_MEMBER(pk8020_state::text_r)
-{
- if (m_attr == 3) m_text_attr=m_ram->pointer()[0x40400+offset];
- return m_ram->pointer()[0x40000+offset];
+ return result ^ 0xff;
}
-WRITE8_MEMBER(pk8020_state::text_w)
+void pk8020_state::sysreg_w(offs_t offset, uint8_t data)
{
- uint8_t *ram = m_ram->pointer();
- ram[0x40000+offset] = data;
- switch (m_attr) {
- case 0: break;
- case 1: ram[0x40400+offset]=0x01;break;
- case 2: ram[0x40400+offset]=0x00;break;
- case 3: ram[0x40400+offset]=m_text_attr;break;
+ if (!BIT(offset, 7))
+ {
+ m_bank_select = data & 0xfc;
+ logerror("%s: Bank select = %02X\n", machine().describe_context(), (data >> 2) & 0x1f);
}
-}
-READ8_MEMBER(pk8020_state::gzu_r)
-{
- uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
- uint8_t p0 = addr[offset];
- uint8_t p1 = addr[offset + 0x4000];
- uint8_t p2 = addr[offset + 0x8000];
- uint8_t retVal = 0;
- if(m_color & 0x80) {
- // Color mode
- if (!(m_color & 0x10)) {
- p0 ^= 0xff;
- }
- if (!(m_color & 0x20)) {
- p1 ^= 0xff;
- }
- if (!(m_color & 0x40)) {
- p2 ^= 0xff;
- }
- retVal = (p0 & p1 & p2) ^ 0xff;
- } else {
- // Plane mode
- if (m_color & 0x10) {
- retVal |= p0;
- }
- if (m_color & 0x20) {
- retVal |= p1;
- }
- if (m_color & 0x40) {
- retVal |= p2;
- }
- }
- return retVal;
+ if (!BIT(offset, 6))
+ color_w(data);
+ if (!BIT(offset, 2))
+ palette_w(data);
}
-WRITE8_MEMBER(pk8020_state::gzu_w)
+uint8_t pk8020_state::memory_r(offs_t offset)
{
- uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
- uint8_t *plane_0 = addr;
- uint8_t *plane_1 = addr + 0x4000;
- uint8_t *plane_2 = addr + 0x8000;
+ uint8_t select = m_decplm->read(bitswap<13>((offset & 0xff00) | m_bank_select, 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x8000);
+ uint8_t result = 0xff;
- if(m_color & 0x80)
- {
- // Color mode
- plane_0[offset] = (plane_0[offset] & ~data) | ((m_color & 2) ? data : 0);
- plane_1[offset] = (plane_1[offset] & ~data) | ((m_color & 4) ? data : 0);
- plane_2[offset] = (plane_2[offset] & ~data) | ((m_color & 8) ? data : 0);
- } else {
- // Plane mode
- uint8_t mask = (m_color & 1) ? data : 0;
- if (!(m_color & 0x02)) {
- plane_0[offset] = (plane_0[offset] & ~data) | mask;
- }
- if (!(m_color & 0x04)) {
- plane_1[offset] = (plane_1[offset] & ~data) | mask;
- }
- if (!(m_color & 0x08)) {
- plane_2[offset] = (plane_2[offset] & ~data) | mask;
- }
- }
-}
+ if (!BIT(select, 2))
+ result &= m_region_maincpu->base()[offset & 0x1fff];
+ if (!BIT(select, 3))
+ result &= m_region_maincpu->base()[(offset & 0x1fff) | 0x2000];
+ if (!BIT(select, 0))
+ result &= m_region_maincpu->base()[(offset & 0x1fff) | 0x4000];
+ if (!BIT(select, 1))
+ result &= keyboard_r(offset);
+ if (!BIT(select, 4))
+ result &= m_devbank->read8(offset);
-READ8_MEMBER(pk8020_state::devices_r)
-{
- switch(offset & 0x38)
- {
- case 0x00: return m_pit8253->read(offset & 3);
- case 0x08: return m_ppi8255_3->read(offset & 3);
- case 0x10: return m_rs232->read(offset & 1);
- case 0x18: return m_wd1793->read(offset & 0x03);
- case 0x20: return m_lan->read(offset & 1);
- case 0x28: return m_pic8259->read(offset & 1);
- case 0x30: return m_ppi8255_2->read(offset & 3);
- case 0x38: return m_ppi8255_1->read(offset & 3);
- }
- return 0xff;
-}
+ if ((select & 0xc0) == 0x00)
+ result &= m_ram->pointer()[offset];
+ else if ((select & 0xc0) == 0x40)
+ result &= gzu_r(offset & 0x3fff);
+ else if ((select & 0xc0) == 0x80)
+ result &= text_r(offset & 0x3ff);
-WRITE8_MEMBER(pk8020_state::devices_w)
-{
- switch(offset & 0x38)
- {
- case 0x00: m_pit8253->write(offset & 3, data); break;
- case 0x08: m_ppi8255_3->write(offset & 3,data); break;
- case 0x10: m_rs232->write(offset & 1, data); break;
- case 0x18: m_wd1793->write(offset & 0x03, data); break;
- case 0x20: m_lan->write(offset & 1, data); break;
- case 0x28: m_pic8259->write(offset & 1,data);break;
- case 0x30: m_ppi8255_2->write(offset & 3,data); break;
- case 0x38: m_ppi8255_1->write(offset & 3,data); break;
- }
+ return result;
}
-void pk8020_state::pk8020_set_bank(uint8_t data)
+void pk8020_state::memory_w(offs_t offset, uint8_t data)
{
- address_space &space = m_maincpu->space(AS_PROGRAM);
- uint8_t *mem = m_region_maincpu->base();
- uint8_t *ram = m_ram->pointer();
-
- switch(data & 0x1F) {
- case 0x00 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x37ff, "bank1");
- space.install_write_bank(0x0000, 0x37ff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0x3800, 0x39ff, "bank3");
- membank("bank3")->set_base(ram + 0x3800);
- // System reg
- space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),this));
- // RAM
- space.install_read_bank (0x4000, 0xffff, "bank4");
- space.install_write_bank(0x4000, 0xffff, "bank5");
- membank("bank4")->set_base(ram + 0x4000);
- membank("bank5")->set_base(ram + 0x4000);
- }
- break;
- case 0x01 : {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xffff, "bank3");
- space.install_write_bank(0x2000, 0xffff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- }
- break;
- case 0x02 : {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xffff, "bank3");
- space.install_write_bank(0x4000, 0xffff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- }
- break;
- case 0x03 : {
- // RAM
- space.install_read_bank (0x0000, 0xffff, "bank1");
- space.install_write_bank(0x0000, 0xffff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- }
- break;
- case 0x04 :
- case 0x05 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xf7ff, "bank3");
- space.install_write_bank(0x2000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x06 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xf7ff, "bank3");
- space.install_write_bank(0x4000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x07 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xf7ff, "bank1");
- space.install_write_bank(0x0000, 0xf7ff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank3");
- membank("bank3")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x08 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0x3800, 0x39ff, "bank3");
- membank("bank3")->set_base(ram + 0x3800);
- // System reg
- space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),this));
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank4");
- space.install_write_bank(0x4000, 0xbfff, "bank5");
- membank("bank4")->set_base(ram + 0x4000);
- membank("bank5")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
-
- }
- break;
- case 0x09 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbfff, "bank3");
- space.install_write_bank(0x2000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0A :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank3");
- space.install_write_bank(0x4000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0B :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbfff, "bank1");
- space.install_write_bank(0x0000, 0xbfff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x0C :
- case 0x0D :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0x3fff, "bank3");
- space.install_write_bank(0x2000, 0x3fff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank5");
- space.install_write_bank(0x8000, 0xfdff, "bank6");
- membank("bank5")->set_base(ram + 0x8000);
- membank("bank6")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x0E :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank5");
- space.install_write_bank(0x8000, 0xfdff, "bank6");
- membank("bank5")->set_base(ram + 0x8000);
- membank("bank6")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x0F :
- {
- // RAM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Video RAM
- space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- // RAM
- space.install_read_bank (0x8000, 0xfdff, "bank3");
- space.install_write_bank(0x8000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x8000);
- membank("bank4")->set_base(ram + 0x8000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x10 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xf7ff, "bank3");
- space.install_write_bank(0x6000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x11 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xf7ff, "bank3");
- space.install_write_bank(0x2000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x12 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xf7ff, "bank3");
- space.install_write_bank(0x4000, 0xf7ff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank5");
- membank("bank5")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x13 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xf7ff, "bank1");
- space.install_write_bank(0x0000, 0xf7ff, "bank2");
- membank("bank1")->set_base(ram + 0x0000);
- membank("bank2")->set_base(ram + 0x0000);
- // Keyboard
- space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),this));
- space.install_write_bank(0xf800, 0xf9ff, "bank3");
- membank("bank3")->set_base(ram + 0xf800);
- // System reg
- space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Devices
- space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // Text Video Memory
- space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),this));
- space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),this));
- }
- break;
- case 0x14 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xfdff, "bank3");
- space.install_write_bank(0x6000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x15 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xfdff, "bank3");
- space.install_write_bank(0x2000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x16 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xfdff, "bank3");
- space.install_write_bank(0x4000, 0xfdff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x17 :
- {
- // RAM
- space.install_read_bank (0x0000, 0xfdff, "bank1");
- space.install_write_bank(0x0000, 0xfdff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Devices
- space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),this));
- space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),this));
- // System reg
- space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- }
- break;
- case 0x18 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xbeff, "bank3");
- space.install_write_bank(0x6000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x19 :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbeff, "bank3");
- space.install_write_bank(0x2000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1A :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbeff, "bank3");
- space.install_write_bank(0x4000, 0xbeff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1B :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbeff, "bank1");
- space.install_write_bank(0x0000, 0xbeff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // System reg
- space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),this));
- space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),this));
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1C :
- {
- // ROM
- space.install_read_bank (0x0000, 0x5fff, "bank1");
- space.install_write_bank(0x0000, 0x5fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x6000, 0xbfff, "bank3");
- space.install_write_bank(0x6000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x6000);
- membank("bank4")->set_base(ram + 0x6000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1D :
- {
- // ROM
- space.install_read_bank (0x0000, 0x1fff, "bank1");
- space.install_write_bank(0x0000, 0x1fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x2000, 0xbfff, "bank3");
- space.install_write_bank(0x2000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x2000);
- membank("bank4")->set_base(ram + 0x2000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1E :
- {
- // ROM
- space.install_read_bank (0x0000, 0x3fff, "bank1");
- space.install_write_bank(0x0000, 0x3fff, "bank2");
- membank("bank1")->set_base(mem + 0x10000);
- membank("bank2")->set_base(ram + 0x0000);
- // RAM
- space.install_read_bank (0x4000, 0xbfff, "bank3");
- space.install_write_bank(0x4000, 0xbfff, "bank4");
- membank("bank3")->set_base(ram + 0x4000);
- membank("bank4")->set_base(ram + 0x4000);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
- case 0x1F :
- {
- // RAM
- space.install_read_bank (0x0000, 0xbfff, "bank1");
- space.install_write_bank(0x0000, 0xbfff, "bank2");
- membank("bank1")->set_base(ram);
- membank("bank2")->set_base(ram);
- // Video RAM
- space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),this));
- space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),this));
- }
- break;
+ uint8_t select = m_decplm->read(bitswap<13>((offset & 0xff00) | m_bank_select, 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x2000);
- }
-}
+ if (!BIT(select, 5))
+ sysreg_w(offset, data);
+ if (!BIT(select, 4))
+ m_devbank->write8(offset, data);
-READ8_MEMBER(pk8020_state::pk8020_porta_r)
-{
- return 0xf0 | (m_takt <<1) | (m_text_attr)<<3;
+ if ((select & 0xc0) == 0x00)
+ m_ram->pointer()[offset] = data;
+ else if ((select & 0xc0) == 0x40)
+ gzu_w(offset & 0x3fff, data);
+ else if ((select & 0xc0) == 0x80)
+ text_w(offset & 0x3ff, data);
}
-WRITE8_MEMBER(pk8020_state::pk8020_portc_w)
+uint8_t pk8020_state::ppi_porta_r()
{
- m_video_page_access =(data>>6) & 3;
- m_attr = (data >> 4) & 3;
- m_wide = (data >> 3) & 1;
- m_font = (data >> 2) & 1;
- m_video_page = (data & 3);
-
-
- m_portc_data = data;
+ return 0xf0 | (m_takt <<1) | (m_text_attr)<<3;
}
-WRITE8_MEMBER(pk8020_state::pk8020_portb_w)
+void pk8020_state::floppy_control_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
// Turn all motors off
- if (m_floppy0->get_device()) m_floppy0->get_device()->mon_w(1);
- if (m_floppy1->get_device()) m_floppy1->get_device()->mon_w(1);
- if (m_floppy2->get_device()) m_floppy2->get_device()->mon_w(1);
- if (m_floppy3->get_device()) m_floppy3->get_device()->mon_w(1);
+ for (int n = 0; n < 4; n++)
+ if (m_floppy[n]->get_device())
+ m_floppy[n]->get_device()->mon_w(1);
- if (BIT(data, 0)) floppy = m_floppy0->get_device();
- if (BIT(data, 1)) floppy = m_floppy1->get_device();
- if (BIT(data, 2)) floppy = m_floppy2->get_device();
- if (BIT(data, 3)) floppy = m_floppy3->get_device();
+ for (int n = 0; n < 4; n++)
+ if (BIT(data, n))
+ floppy = m_floppy[n]->get_device();
- m_wd1793->set_floppy(floppy);
+ m_fdc->set_floppy(floppy);
if (floppy)
{
@@ -835,20 +122,15 @@ WRITE8_MEMBER(pk8020_state::pk8020_portb_w)
// todo: at least bit 5 and bit 7 is connected to something too...
}
-READ8_MEMBER(pk8020_state::pk8020_portc_r)
-{
- return m_portc_data;
-}
-
-WRITE8_MEMBER(pk8020_state::pk8020_2_portc_w)
+void pk8020_state::ppi_2_portc_w(uint8_t data)
{
m_sound_gate = BIT(data,3);
m_speaker->level_w(m_sound_gate ? m_sound_level : 0);
}
-WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out0)
+WRITE_LINE_MEMBER(pk8020_state::pit_out0)
{
m_sound_level = state;
@@ -856,27 +138,88 @@ WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out0)
}
-WRITE_LINE_MEMBER(pk8020_state::pk8020_pit_out1)
+const char *pk8020_state::plm_select_name(uint8_t data)
{
+ switch (data)
+ {
+ case 0xfb:
+ case 0xf7:
+ case 0xfe:
+ return "ROM";
+
+ case 0x3f:
+ return "RAM";
+
+ case 0xfd:
+ return "keyboard";
+
+ case 0xdf:
+ return "system reg";
+
+ case 0xef:
+ return "devices";
+
+ case 0xbf:
+ return "text video memory";
+
+ case 0x7f:
+ return "video RAM";
+
+ default:
+ return "multiple/unknown";
+ }
}
+void pk8020_state::log_bank_select(uint8_t bank, offs_t start, offs_t end, uint8_t rdecplm, uint8_t wdecplm)
+{
+ if (rdecplm == wdecplm)
+ logerror("Bank select %02X, %04X-%04Xh: read/write %s (%02X)\n", bank, start, end, plm_select_name(rdecplm), rdecplm);
+ else
+ logerror("Bank select %02X, %04X-%04Xh: read %s (%02X), write %s (%02X)\n", bank, start, end, plm_select_name(rdecplm), rdecplm, plm_select_name(wdecplm), wdecplm);
+}
void pk8020_state::machine_start()
{
- static const char *const keynames[] = {
- "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
- "LINE8", "LINE9", "LINE10", "LINE11", "LINE12", "LINE13", "LINE14", "LINE15"
- };
+ m_ios[0]->write_cts(0);
+ m_ios[1]->write_cts(0);
+ m_ios[1]->write_dsr(0);
+ m_takt = 0;
+
+ save_item(NAME(m_bank_select));
+ save_item(NAME(m_takt));
+ save_item(NAME(m_sound_gate));
+ save_item(NAME(m_sound_level));
- for ( int i = 0; i < 16; i++ )
+ if (DESCRIBE_DECPLM)
{
- m_io_port[i] = ioport(keynames[i]);
+ for (uint8_t bank = 0; bank < 0x20; bank++)
+ {
+ uint8_t rdecplm = 0;
+ uint8_t wdecplm = 0;
+ offs_t start = 0x0000;
+
+ for (offs_t offset = 0x0000; offset < 0x10000; offset += 0x100)
+ {
+ uint8_t rdecplm_test = m_decplm->read(bitswap<13>((offset & 0xff00) | (bank << 2), 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x8000);
+ uint8_t wdecplm_test = m_decplm->read(bitswap<13>((offset & 0xff00) | (bank << 2), 2, 5, 6, 4, 12, 3, 13, 8, 9, 11, 15, 10, 14) | 0x2000);
+
+ if (rdecplm != rdecplm_test || wdecplm != wdecplm_test)
+ {
+ if (offset != 0x0000)
+ log_bank_select(bank, start, offset - 1, rdecplm, wdecplm);
+ rdecplm = rdecplm_test;
+ wdecplm = wdecplm_test;
+ start = offset;
+ }
+ }
+ log_bank_select(bank, start, 0xffff, rdecplm, wdecplm);
+ }
}
}
void pk8020_state::machine_reset()
{
- pk8020_set_bank(0);
+ m_bank_select = 0;
m_sound_gate = 0;
m_sound_level = 0;
@@ -885,5 +228,5 @@ void pk8020_state::machine_reset()
INTERRUPT_GEN_MEMBER(pk8020_state::pk8020_interrupt)
{
m_takt ^= 1;
- m_pic8259->ir4_w(1);
+ m_inr->ir4_w(1);
}
diff --git a/src/mame/machine/seibucop/seibucop_dma.hxx b/src/mame/machine/seibucop/seibucop_dma.hxx
index 98b76b26c7f..e57e2c19d03 100644
--- a/src/mame/machine/seibucop/seibucop_dma.hxx
+++ b/src/mame/machine/seibucop/seibucop_dma.hxx
@@ -174,10 +174,10 @@ void raiden2cop_device::dma_zsorting(uint16_t data)
}
switch(cop_sort_param) {
case 2:
- std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b){ return a.sorting_key > b.sorting_key; });
+ std::stable_sort(entries.begin(), entries.end(), [](const auto &a, const auto &b){ return a.sorting_key > b.sorting_key; });
break;
case 1:
- std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b){ return a.sorting_key < b.sorting_key; });
+ std::stable_sort(entries.begin(), entries.end(), [](const auto &a, const auto &b){ return a.sorting_key < b.sorting_key; });
break;
}
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index caca574df0d..530b08379ee 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -2398,24 +2398,30 @@ at386 // 19?? IBM AT 386
at486 // 19?? IBM AT 486
atvga // 19?? AT VGA
at386sx // 19?? AT VGA 386sx
-c286lt // 1990 Commodore Laptop 286-LT
-csl286 // Commodore SL 286-16
+c286lt // 1990 Commodore Laptop 286-LT
+csl286 // Commodore SL 286-16
c386sx16 // 1990 Commodore 386SX-16
-c386sxlt // 1992 Commodore Laptop C386SX-LT
-dt386 // Commodore DT386
-dt486 // Commodore DT486
+c386sxlt // 1992 Commodore Laptop C386SX-LT
+dt386 // Commodore DT386
+dt486 // Commodore DT486
pc30iii // Commodore PC 30-III
pc40iii // Commodore PC 40-III
-pc45iii // Commodore PC 45-III
-pc50ii // Commodore PC 50-II
-pc60iii // Commodore PC 60-III
-pc70iii // Commodore PC 70-III
+pc45iii // Commodore PC 45-III
+pc50ii // Commodore PC 50-II
+pc60iii // Commodore PC 60-III
+pc70iii // Commodore PC 70-III
+comt386 // Commodore Tower 386
+comt486 // Commodore Tower 486
mbc28 // Sanyo MBC-28
comportii // Compaq Portable II
comportiii // Compaq Portable III
comslt286 // Compaq SLT/286
dsys200 // Dell System 200
pcd2 // 1986 Siemens PCD-2
+pcd3nsx // Siemens-Nixdorf PCD-3Nsx
+pcd4x // Siemens-Nixdorf PCD-4H and other 486 desktops and towers
+pcd4nl // Siemens-Nixdorf PCD-4NL 486 subnotebook
+pcd4nd // Siemens-Nixdorf 486 notebook
ct386sx //
ec1842 //
ec1849 //
@@ -2427,18 +2433,24 @@ ibm5170 // 1984 IBM PC/AT 5170, original 6 MHz model
ibm5170a // 1985 IBM PC/AT 5170, enhanced 8 MHz model
ibmps1es // IBM PS/1 (Spanish)
k286i // 1985 Kaypro 286i
-m290 // Olivetti M290
+m290 // Olivetti M290
megapc // 1992 Amstrad plc
megapcpl //
megapcpla // AMI BIOS version with Winbond WINBUS chipset
neat // 1989 New Enhanced AT chipset, AMI BIOS
ncrpc8 // 1986 NCR PC-8
+n8810m15 // Nixdorf 8810 M15 Laptop - PC07
+n8810m16c // Nixdorf 8810 M16 Laptop - PC17 - CGA version
+n8810m16v // Nixdorf 8810 M16 Laptop - PC17 - VGA version
+n8810m30 // Nixdorf 8810 M30
n8810m55 // 1986 Nixdorf 8810 M55
//nws286 // 1988 Nokia WS286
pc2386 //
qi600 // 1988 Apricot Qi 600 (Neptune Motherboard
qi900 // 1990 Apricot Qi 900 (Scorpion Motherboard)
t2000sx //
+walk386sx // Triumph-Adler Walkstation 386 SX
+walk386dx // Triumph-Adler Walkstation 386 DX
xb42639 // 1989 Apricot XEN-S (Venus I Motherboard 286) (Bios:3.10.17i)
xb42639a // 1990 Apricot XEN-S (Venus II Motherboard 286) (Bios:1.02.17)
xb42663 // 1988 Apricot Qi 300 (Rev D,E & F Motherboard)
@@ -10098,6 +10110,7 @@ mercenario // bootleg
@source:compc.cpp
compc10 // 1984 Commodore PC-10, PC-20 and PC-30
pc10iii // 1987 Commodore PC-10 III
+compc1 // 1984 Commodore PC-1
@source:compgolf.cpp
compgolf // (c) 1985 Data East Corporation (Japan)
@@ -15203,6 +15216,7 @@ trobhood // Tiger
trobocop2 // Tiger
trobocop3 // Tiger
trockteer // Tiger
+trshutvoy // Tronica
trsrescue // Tronica
tsddragon // Tiger
tsf2010 // Tiger
@@ -21389,10 +21403,11 @@ gunmast // (c) 1994
karatour // (c) 1992 Mitchell
karatourj // (c) 1992 Mitchell
ladykill // (c) 1993 Yanyaka + Mitchell license - (Arcade TV Game List - P.101, Right, 2 from Bottom)
-lastfort // (c) 1994
+lastfort // (c) 1994 - VG420 PCB version
lastforte // (c) 1994
lastfortea // (c) 1994
-lastfortg // (c) 1994
+lastfortg // (c) 1994 - VG460-(A) PCB version
+lastfortj // (c) 1994 - VG460-(A) PCB version
lastfortk // (c) 1994
moegonta // (c) 1993 Yanyaka (Japan) (Arcade TV Game List - P.101, Right, 2 from Bottom)
mouja // (c) 1996 Etona (Japan)
@@ -31274,7 +31289,6 @@ ataripc1 // Atari PC1
ataripc3 // Atari PC3
bw230 // 1985 Bondwell (CGA)
cadd810 // CompuAdd 810
-compc1 // 1984 Commodore PC-1
comport // Compaq Portable
dgone // 1984 Data General/One
eagle1600 //
@@ -35878,6 +35892,7 @@ iqunlimz // 1991 IQ Unlimited (Z80)
profweis // 1988 (Yeno) Professor Weiss-Alles (Germany)
socrates // 1988 Socrates Educational Video System (USA)
socratfc // 1988 Socrates SAITOUT (French Canada)
+vpainter // 1991 Video Painter
@source:softbox.cpp
softbox //
diff --git a/src/mame/video/galaga.cpp b/src/mame/video/galaga.cpp
index e7ed005f62f..58ae9e4533d 100644
--- a/src/mame/video/galaga.cpp
+++ b/src/mame/video/galaga.cpp
@@ -11,6 +11,12 @@
#include "emu.h"
#include "includes/galaga.h"
+#define LOG_DEBUG (1 << 0U)
+#define LOG_ALL (LOG_DEBUG)
+
+#define VERBOSE (LOG_ALL)
+
+#include "logmacro.h"
#define MAX_STARS 252
#define STARS_COLOR_BASE (64*4+64*4)
@@ -376,7 +382,99 @@ void galaga_state::galaga_palette(palette_device &palette) const
palette.set_pen_indirect(64*4 + 64*4 + i, 32 + i);
}
+/***************************************************************************
+
+ Star field documentation
+
+ Couriersud, May 2019:
+
+ The code below was manually applied based on a pull request from
+ Jindřich Makovička. He based his work on information published by
+ Wolfgang Scherr about the 05XX on pin4.at.
+
+ Wolfgang shared is VHDL implementation with the MAME team. I have
+ created a spreadsheet implementation for his decode logic.
+
+ Both implementations use the same Galois type LFSR( tap 15,12,10,5).
+ Using the same seed value, the following holds true:
+
+ Decode_W(lfsr[t-4]) = Decode_J(lfsr[t])
+
+ The two decoding algorithm (Wolfgang, Jindřich) thus deliver the same
+ results but with a 4 clock difference.
+
+ Jindřich's code filters out stars with y<4. This matches the starfield
+ measurements documented above. Wolfgang states that his code matches his
+ measurements and there are stars with y<4.
+ We need to have a closer look at this.
+
+ Both implementations are complex compared to other star field gnerators
+ used in the industry. We thus now have two decoding solutions matching
+ the output. I wonder if there is a simpler one.
+
+***************************************************************************/
+
+void galaga_state::starfield_init()
+{
+ const uint16_t feed = 0x9420;
+ int idx = 0;
+ for (uint16_t sf = 0; sf < 4; ++sf)
+ {
+ // starfield select flags
+ uint16_t sf1 = (sf >> 1) & 1;
+ uint16_t sf2 = sf & 1;
+
+ uint16_t i = 0x70cc;
+ for (int cnt = 0; cnt < 65535; ++cnt)
+ {
+ // output enable lookup
+ uint16_t xor1 = i ^ (i >> 3);
+ uint16_t xor2 = xor1 ^ (i >> 2);
+ uint16_t oe = (sf1 ? 0 : 0x4000) | ((sf1 ^ sf2) ? 0 : 0x1000);
+ if ((i & 0x8007) == 0x8007
+ && (~i & 0x2008) == 0x2008
+ && (xor1 & 0x0100) == (sf1 ? 0 : 0x0100)
+ && (xor2 & 0x0040) == (sf2 ? 0 : 0x0040)
+ && (i & 0x5000) == oe
+ && cnt >= 256 * 4)
+ {
+ // color lookup
+ uint16_t xor3 = (i >> 1) ^ (i >> 6);
+ uint16_t clr =
+ (((i >> 9) & 0x07)
+ | ((xor3 ^ (i >> 4) ^ (i >> 7)) & 0x08)
+ | (~xor3 & 0x10)
+ | (((i >> 2) ^ (i >> 5)) & 0x20))
+ ^ ((i & 0x4000) ? 0 : 0x24)
+ ^ ((((i >> 2) ^ i) & 0x1000) ? 0x21 : 0);
+#if 0
+ m_star_seed_tab[idx].x = cnt % 256;
+ m_star_seed_tab[idx].y = cnt / 256;
+ m_star_seed_tab[idx].col = clr;
+ m_star_seed_tab[idx].set = sf;
+#else
+ int x = cnt % 256;
+ int y = cnt / 256;
+ int col = clr;
+ int set = sf;
+
+ if ((x != s_star_seed_tab[idx].x) || (y != s_star_seed_tab[idx].y)
+ || (col != s_star_seed_tab[idx].col) || (s_star_seed_tab[idx].set != set))
+ LOGMASKED(LOG_DEBUG, "Mismatch: %d %d %d %d %d %d %d %d\n", x, y, col, set, s_star_seed_tab[idx].x,
+ s_star_seed_tab[idx].y, s_star_seed_tab[idx].col, s_star_seed_tab[idx].set);
+#endif
+ ++idx;
+ }
+
+ // update the LFSR
+ if (i & 1)
+ i = (i >> 1) ^ feed;
+ else
+ i = (i >> 1);
+ }
+ }
+}
/***************************************************************************
@@ -433,6 +531,8 @@ VIDEO_START_MEMBER(galaga_state,galaga)
save_item(NAME(m_stars_scrollx));
save_item(NAME(m_stars_scrolly));
save_item(NAME(m_galaga_gfxbank));
+
+ starfield_init();
}
diff --git a/src/mame/video/pk8020.cpp b/src/mame/video/pk8020.cpp
index c640cd501f9..b4915f1135b 100644
--- a/src/mame/video/pk8020.cpp
+++ b/src/mame/video/pk8020.cpp
@@ -11,7 +11,127 @@
#include "emu.h"
#include "includes/pk8020.h"
-#include "machine/ram.h"
+
+void pk8020_state::video_start()
+{
+ m_color = 0;
+ m_text_attr = 0;
+
+ save_item(NAME(m_color));
+ save_item(NAME(m_video_page));
+ save_item(NAME(m_wide));
+ save_item(NAME(m_font));
+ save_item(NAME(m_attr));
+ save_item(NAME(m_text_attr));
+ save_item(NAME(m_video_page_access));
+}
+
+void pk8020_state::color_w(uint8_t data)
+{
+ // Color
+ m_color = data;
+}
+
+void pk8020_state::palette_w(uint8_t data)
+{
+ // Palette set
+ uint8_t number = data & 0x0f;
+ uint8_t color = data >> 4;
+ uint8_t i = (color & 0x08) ? 0x3F : 0;
+ uint8_t r = ((color & 0x04) ? 0xC0 : 0) + i;
+ uint8_t g = ((color & 0x02) ? 0xC0 : 0) + i;
+ uint8_t b = ((color & 0x01) ? 0xC0 : 0) + i;
+ m_palette->set_pen_color( number, rgb_t(r,g,b) );
+}
+
+void pk8020_state::video_page_w(uint8_t data)
+{
+ m_video_page_access =(data>>6) & 3;
+ m_attr = (data >> 4) & 3;
+ m_wide = (data >> 3) & 1;
+ m_font = (data >> 2) & 1;
+ m_video_page = (data & 3);
+}
+
+uint8_t pk8020_state::text_r(offs_t offset)
+{
+ if (m_attr == 3) m_text_attr=m_ram->pointer()[0x40400+offset];
+ return m_ram->pointer()[0x40000+offset];
+}
+
+void pk8020_state::text_w(offs_t offset, uint8_t data)
+{
+ uint8_t *ram = m_ram->pointer();
+ ram[0x40000+offset] = data;
+ switch (m_attr) {
+ case 0: break;
+ case 1: ram[0x40400+offset]=0x01;break;
+ case 2: ram[0x40400+offset]=0x00;break;
+ case 3: ram[0x40400+offset]=m_text_attr;break;
+ }
+}
+
+uint8_t pk8020_state::gzu_r(offs_t offset)
+{
+ uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
+ uint8_t p0 = addr[offset];
+ uint8_t p1 = addr[offset + 0x4000];
+ uint8_t p2 = addr[offset + 0x8000];
+ uint8_t retVal = 0;
+ if(m_color & 0x80) {
+ // Color mode
+ if (!(m_color & 0x10)) {
+ p0 ^= 0xff;
+ }
+ if (!(m_color & 0x20)) {
+ p1 ^= 0xff;
+ }
+ if (!(m_color & 0x40)) {
+ p2 ^= 0xff;
+ }
+ retVal = (p0 & p1 & p2) ^ 0xff;
+ } else {
+ // Plane mode
+ if (m_color & 0x10) {
+ retVal |= p0;
+ }
+ if (m_color & 0x20) {
+ retVal |= p1;
+ }
+ if (m_color & 0x40) {
+ retVal |= p2;
+ }
+ }
+ return retVal;
+}
+
+void pk8020_state::gzu_w(offs_t offset, uint8_t data)
+{
+ uint8_t *addr = m_ram->pointer() + 0x10000 + (m_video_page_access * 0xC000);
+ uint8_t *plane_0 = addr;
+ uint8_t *plane_1 = addr + 0x4000;
+ uint8_t *plane_2 = addr + 0x8000;
+
+ if(m_color & 0x80)
+ {
+ // Color mode
+ plane_0[offset] = (plane_0[offset] & ~data) | ((m_color & 2) ? data : 0);
+ plane_1[offset] = (plane_1[offset] & ~data) | ((m_color & 4) ? data : 0);
+ plane_2[offset] = (plane_2[offset] & ~data) | ((m_color & 8) ? data : 0);
+ } else {
+ // Plane mode
+ uint8_t mask = (m_color & 1) ? data : 0;
+ if (!(m_color & 0x02)) {
+ plane_0[offset] = (plane_0[offset] & ~data) | mask;
+ }
+ if (!(m_color & 0x04)) {
+ plane_1[offset] = (plane_1[offset] & ~data) | mask;
+ }
+ if (!(m_color & 0x08)) {
+ plane_2[offset] = (plane_2[offset] & ~data) | mask;
+ }
+ }
+}
uint32_t pk8020_state::screen_update_pk8020(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
diff --git a/src/mame/video/raiden2.cpp b/src/mame/video/raiden2.cpp
index 6c795891891..116ef9c0e78 100644
--- a/src/mame/video/raiden2.cpp
+++ b/src/mame/video/raiden2.cpp
@@ -40,7 +40,6 @@ WRITE16_MEMBER(raiden2_state::m_videoram_private_w)
void raiden2_state::draw_sprites(const rectangle &cliprect)
{
- u16 *source = m_spriteram + (0x1000/2)-4;
m_sprite_bitmap.fill(0xf, cliprect);
gfx_element *gfx = m_gfxdecode->gfx(2);
@@ -52,8 +51,9 @@ void raiden2_state::draw_sprites(const rectangle &cliprect)
06 yyyy yyyy yyyy yyyy y = ypos
*/
- while (source >= m_spriteram)
+ for (int srcindex = (m_spriteram->bytes()/2)-4; srcindex >= 0; srcindex -= 4)
{
+ u16 *source = &m_spriteram->buffer()[srcindex];
int tile_number = source[1];
int sx = source[2];
int sy = source[3];
@@ -144,8 +144,6 @@ void raiden2_state::draw_sprites(const rectangle &cliprect)
tile_number++;
}
}
-
- source -= 4;
}
}