diff options
Diffstat (limited to 'src')
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, µkit_state::microkit_mem); m_maincpu->set_addrmap(AS_IO, µkit_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; } } |