summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp117
-rw-r--r--src/devices/bus/coco/coco_t4426.h3
-rw-r--r--src/devices/bus/vme/vme.cpp4
-rw-r--r--src/devices/bus/vme/vme_mvme350.c257
-rw-r--r--src/devices/bus/vme/vme_mzr8105.cpp (renamed from src/mame/bus/vme/mzr8105.cpp)2
-rw-r--r--src/devices/bus/vme/vme_mzr8105.h (renamed from src/mame/bus/vme/mzr8105.h)2
-rw-r--r--src/devices/bus/vme/vme_mzr8300.cpp (renamed from src/mame/bus/vme/mzr8300.cpp)2
-rw-r--r--src/devices/bus/vme/vme_mzr8300.h (renamed from src/mame/bus/vme/mzr8300.h)2
-rw-r--r--src/devices/cpu/m6805/m6805.cpp156
-rw-r--r--src/devices/cpu/m6805/m6805.h72
-rw-r--r--src/devices/machine/6821pia.cpp71
-rw-r--r--src/devices/machine/gen_latch.cpp43
-rw-r--r--src/devices/machine/gen_latch.h7
-rw-r--r--src/devices/machine/mc68681.cpp157
-rw-r--r--src/devices/machine/mc68681.h94
-rw-r--r--src/devices/machine/netlist.cpp48
-rw-r--r--src/devices/machine/netlist.h2
-rw-r--r--src/devices/video/zeus2.cpp379
-rw-r--r--src/devices/video/zeus2.h10
-rw-r--r--src/emu/natkeyboard.cpp25
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp29
-rw-r--r--src/lib/netlist/analog/nld_opamps.h5
-rw-r--r--src/lib/netlist/devices/net_lib.cpp199
-rw-r--r--src/lib/netlist/devices/net_lib.h2
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp2
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp12
-rw-r--r--src/lib/netlist/devices/nld_truthtable.h10
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp4
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h70
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp34
-rw-r--r--src/lib/netlist/macro/nlm_opamp.h3
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp28
-rw-r--r--src/lib/netlist/nl_base.cpp18
-rw-r--r--src/lib/netlist/nl_base.h141
-rw-r--r--src/lib/netlist/nl_config.h10
-rw-r--r--src/lib/netlist/nl_factory.cpp44
-rw-r--r--src/lib/netlist/nl_factory.h80
-rw-r--r--src/lib/netlist/nl_parser.cpp59
-rw-r--r--src/lib/netlist/nl_setup.cpp125
-rw-r--r--src/lib/netlist/nl_setup.h14
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp28
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp2
-rw-r--r--src/lib/netlist/plib/pfmtlog.h2
-rw-r--r--src/lib/netlist/plib/pstream.cpp4
-rw-r--r--src/lib/netlist/plib/pstream.h4
-rw-r--r--src/lib/netlist/plib/pstring.cpp22
-rw-r--r--src/lib/netlist/plib/pstring.h6
-rw-r--r--src/lib/netlist/plib/ptypes.h2
-rw-r--r--src/lib/netlist/plib/putil.cpp8
-rw-r--r--src/lib/netlist/plib/putil.h5
-rw-r--r--src/lib/netlist/prg/nltool.cpp36
-rw-r--r--src/lib/netlist/prg/nlwav.cpp4
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h4
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp2
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp38
-rw-r--r--src/lib/netlist/tools/nl_convert.h4
-rw-r--r--src/lib/util/unicode.cpp89
-rw-r--r--src/lib/util/unicode.h8
-rw-r--r--src/mame/audio/mario.cpp249
-rw-r--r--src/mame/audio/nl_mario.cpp306
-rw-r--r--src/mame/audio/nl_mario.h4
-rw-r--r--src/mame/drivers/40love.cpp16
-rw-r--r--src/mame/drivers/aerofgt.cpp74
-rw-r--r--src/mame/drivers/aleisttl.cpp2
-rw-r--r--src/mame/drivers/alpha68k.cpp4
-rw-r--r--src/mame/drivers/armedf.cpp2
-rw-r--r--src/mame/drivers/ashnojoe.cpp23
-rw-r--r--src/mame/drivers/asuka.cpp27
-rw-r--r--src/mame/drivers/atvtrack.cpp63
-rw-r--r--src/mame/drivers/bigevglf.cpp52
-rw-r--r--src/mame/drivers/bking.cpp74
-rw-r--r--src/mame/drivers/bublbobl.cpp64
-rw-r--r--src/mame/drivers/buggychl.cpp15
-rw-r--r--src/mame/drivers/crospang.cpp10
-rw-r--r--src/mame/drivers/crshrace.cpp14
-rw-r--r--src/mame/drivers/dcheese.cpp29
-rw-r--r--src/mame/drivers/ddenlovr.cpp376
-rw-r--r--src/mame/drivers/flstory.cpp60
-rw-r--r--src/mame/drivers/gkigt.cpp12
-rw-r--r--src/mame/drivers/gsword.cpp449
-rw-r--r--src/mame/drivers/harddriv.cpp7
-rw-r--r--src/mame/drivers/lkage.cpp80
-rw-r--r--src/mame/drivers/lsasquad.cpp48
-rw-r--r--src/mame/drivers/mzr8105.cpp2
-rw-r--r--src/mame/drivers/namcos2.cpp142
-rw-r--r--src/mame/drivers/namcos21.cpp105
-rw-r--r--src/mame/drivers/nycaptor.cpp51
-rw-r--r--src/mame/drivers/osbexec.cpp38
-rw-r--r--src/mame/drivers/pc.cpp573
-rw-r--r--src/mame/drivers/peyper.cpp13
-rw-r--r--src/mame/drivers/rm380z.cpp23
-rw-r--r--src/mame/drivers/rohga.cpp309
-rw-r--r--src/mame/drivers/slapfght.cpp70
-rw-r--r--src/mame/drivers/vd.cpp143
-rw-r--r--src/mame/includes/40love.h6
-rw-r--r--src/mame/includes/aerofgt.h15
-rw-r--r--src/mame/includes/apollo.h11
-rw-r--r--src/mame/includes/ashnojoe.h3
-rw-r--r--src/mame/includes/asuka.h19
-rw-r--r--src/mame/includes/bigevglf.h17
-rw-r--r--src/mame/includes/bking.h15
-rw-r--r--src/mame/includes/bublbobl.h32
-rw-r--r--src/mame/includes/buggychl.h6
-rw-r--r--src/mame/includes/crospang.h1
-rw-r--r--src/mame/includes/crshrace.h2
-rw-r--r--src/mame/includes/dcheese.h3
-rw-r--r--src/mame/includes/flstory.h33
-rw-r--r--src/mame/includes/gsword.h128
-rw-r--r--src/mame/includes/harddriv.h9
-rw-r--r--src/mame/includes/lkage.h34
-rw-r--r--src/mame/includes/lsasquad.h25
-rw-r--r--src/mame/includes/mario.h4
-rw-r--r--src/mame/includes/msisaac.h4
-rw-r--r--src/mame/includes/namcofl.h2
-rw-r--r--src/mame/includes/namconb1.h2
-rw-r--r--src/mame/includes/namcos1.h2
-rw-r--r--src/mame/includes/namcos2.h44
-rw-r--r--src/mame/includes/namcos21.h14
-rw-r--r--src/mame/includes/nycaptor.h32
-rw-r--r--src/mame/includes/rm380z.h5
-rw-r--r--src/mame/includes/rohga.h1
-rw-r--r--src/mame/includes/slapfght.h30
-rw-r--r--src/mame/includes/taito_f3.h1
-rw-r--r--src/mame/includes/xbox.h1
-rw-r--r--src/mame/includes/xbox_nv2a.h33
-rw-r--r--src/mame/layout/racedrivpan.lay18
-rw-r--r--src/mame/machine/bigevglf.cpp80
-rw-r--r--src/mame/machine/bublbobl.cpp93
-rw-r--r--src/mame/machine/buggychl.cpp234
-rw-r--r--src/mame/machine/buggychl.h48
-rw-r--r--src/mame/machine/flstory.cpp125
-rw-r--r--src/mame/machine/harddriv.cpp51
-rw-r--r--src/mame/machine/lkage.cpp141
-rw-r--r--src/mame/machine/lsasquad.cpp107
-rw-r--r--src/mame/machine/namco_c139.cpp107
-rw-r--r--src/mame/machine/namco_c139.h67
-rw-r--r--src/mame/machine/namco_c148.cpp250
-rw-r--r--src/mame/machine/namco_c148.h143
-rw-r--r--src/mame/machine/namcos2.cpp325
-rw-r--r--src/mame/machine/nl_stuntcyc.cpp19
-rw-r--r--src/mame/machine/nycaptor.cpp94
-rw-r--r--src/mame/machine/slapfght.cpp131
-rw-r--r--src/mame/machine/tait8741.cpp180
-rw-r--r--src/mame/machine/tait8741.h77
-rw-r--r--src/mame/machine/taito68705interface.cpp354
-rw-r--r--src/mame/machine/taito68705interface.h86
-rw-r--r--src/mame/machine/xbox.cpp21
-rw-r--r--src/mame/mame.lst8
-rw-r--r--src/mame/mess.flt1
-rw-r--r--src/mame/video/aerofgt.cpp41
-rw-r--r--src/mame/video/gsword.cpp167
-rw-r--r--src/mame/video/namco_c116.cpp (renamed from src/mame/video/c116.cpp)6
-rw-r--r--src/mame/video/namco_c116.h (renamed from src/mame/video/c116.h)0
-rw-r--r--src/mame/video/namcos2.cpp5
-rw-r--r--src/mame/video/namcos21.cpp15
-rw-r--r--src/mame/video/rm380z.cpp37
-rw-r--r--src/mame/video/taito_f3.cpp14
-rw-r--r--src/mame/video/xbox_nv2a.cpp201
-rw-r--r--src/osd/modules/debugger/osx/debugconsole.mm2
-rw-r--r--src/osd/modules/render/bgfx/chainentry.cpp2
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp5
-rw-r--r--src/osd/modules/render/bgfx/effectmanager.cpp6
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.cpp8
-rw-r--r--src/osd/modules/render/drawbgfx.cpp11
164 files changed, 5179 insertions, 4774 deletions
diff --git a/src/devices/bus/coco/coco_t4426.cpp b/src/devices/bus/coco/coco_t4426.cpp
index 601e6887413..b969ac9bcbb 100644
--- a/src/devices/bus/coco/coco_t4426.cpp
+++ b/src/devices/bus/coco/coco_t4426.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Joakim Larsson Edstrom
/***************************************************************************
*
- * coco_t4426.c
+ * coco_t4426.cpp
*
* Terco T4426 CNC Programming Station multi cart
*
@@ -46,14 +46,16 @@
#define LOG_GENERAL 0x01
#define LOG_SETUP 0x02
#define LOG_PRINTF 0x04
+#define LOG_PIA 0x08
-#define VERBOSE 0 // (LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
+#define VERBOSE 0 //(LOG_PIA | LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
+#define LOGPIA(...) LOGMASK(LOG_PIA, __VA_ARGS__)
#if VERBOSE & LOG_PRINTF
#define logerror printf
@@ -77,19 +79,34 @@
IMPLEMENTATION
***************************************************************************/
-// TODO: Figure out address mapping for these devices
static MACHINE_CONFIG_FRAGMENT(coco_t4426)
- MCFG_DEVICE_ADD(UART_TAG, ACIA6850, 0)
+ MCFG_DEVICE_ADD(UART_TAG, ACIA6850, 0) // TODO: Figure out address mapping for ACIA
MCFG_DEVICE_ADD(PIA_TAG, PIA6821, 0)
+ MCFG_PIA_WRITEPA_HANDLER(WRITE8(coco_t4426_device, pia_A_w))
MACHINE_CONFIG_END
ROM_START( coco_t4426 )
- ROM_REGION(0x8000, CARTSLOT_TAG, ROMREGION_ERASE00)
- // First of 8 banked ROM:s TODO: Add the banking and the other ROM:s
- ROM_LOAD("tercoED4426-0-8549-5.3.bin", 0x0000, 0x2000, CRC(45665428) SHA1(ff49a79275772c4c4ab1ae29db662c9b10a744a7))
-
+ ROM_REGION(0x1a000, CARTSLOT_TAG, ROMREGION_ERASE00)
+
+ // 8 banked ROM:s TODO: Add the banking and the other ROM:s
+ ROM_LOAD("tercoED4426-0-8549-5.3.bin", 0x00000, 0x2000, CRC(45665428) SHA1(ff49a79275772c4c4ab1ae29db662c9b10a744a7))
+ ROM_LOAD("tercoED4426-1-8549-5.3.bin", 0x03000, 0x2000, CRC(44baba33) SHA1(01cee1b208c158e598e7ecd2189b5e0ffa7f3ab9))
+ ROM_LOAD("tercoPD4426-2-8632-6.4.bin", 0x06000, 0x2000, CRC(258e443a) SHA1(9d8901f3e70ae4f8526dde1b5208b22f066f801f))
+ ROM_LOAD("tercoPD4426-3-8638-6.4.bin", 0x09000, 0x2000, CRC(640d1de4) SHA1(5ae7427cb5729fd3920361855d954ea1f97f6ae5))
+ ROM_LOAD("tercoCA4426-4-8549-3.4.bin", 0x0c000, 0x2000, CRC(df18397b) SHA1(2f9de210c039619c649be223c37a4eff873fa600))
+ ROM_LOAD("tercoCA4426-5-8549-3.4.bin", 0x0f000, 0x2000, CRC(3fcdf92e) SHA1(ec1589f8d62701ca3faf2a85a57ab2e1f61d2137))
+ ROM_LOAD("tercoCA4426-6-8549-3.4.bin", 0x13000, 0x2000, CRC(27652ccf) SHA1(529a6f736666ae6660483e547d076725606b1c1d))
+ ROM_LOAD("tercoCA4426-7-8549-3.4.bin", 0x16000, 0x2000, CRC(f6640569) SHA1(03f70dcc5f7ab60cd908427d45ebd85b6f464b93))
// Main cartridge ROM
ROM_LOAD("tercoPMOS4426-8549-4.31.bin", 0x2000, 0x1000, CRC(bc65c45c) SHA1(e50cfd1d61e29fe05eb795d8bf6303e7b91ed8e5))
+ // Interleaved copies for the fixed ROM for banking to work (nw yet though)
+ ROM_RELOAD(0x05000,0x1000)
+ ROM_RELOAD(0x08000,0x1000)
+ ROM_RELOAD(0x0b000,0x1000)
+ ROM_RELOAD(0x0e000,0x1000)
+ ROM_RELOAD(0x12000,0x1000)
+ ROM_RELOAD(0x15000,0x1000)
+ ROM_RELOAD(0x18000,0x1000)
ROM_END
//**************************************************************************
@@ -111,6 +128,7 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, device_type
,device_cococart_interface( mconfig, *this )
,m_cart(nullptr)
,m_owner(nullptr)
+ ,m_select(0)
,m_autostart(*this, ":" CART_AUTOSTART_TAG)
,m_uart(*this, UART_TAG)
,m_pia(*this, PIA_TAG)
@@ -122,6 +140,7 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, const char *
,device_cococart_interface( mconfig, *this )
,m_cart(nullptr)
,m_owner(nullptr)
+ ,m_select(0)
,m_autostart(*this, ":" CART_AUTOSTART_TAG)
,m_uart(*this, UART_TAG)
,m_pia(*this, PIA_TAG)
@@ -134,6 +153,7 @@ coco_t4426_device::coco_t4426_device(const machine_config &mconfig, const char *
void coco_t4426_device::device_start()
{
+ LOG("%s()\n", FUNCNAME );
m_cart = dynamic_cast<device_image_interface *>(owner());
m_owner = dynamic_cast<cococart_slot_device *>(owner());
}
@@ -145,6 +165,7 @@ void coco_t4426_device::device_start()
machine_config_constructor coco_t4426_device::device_mconfig_additions() const
{
+ LOG("%s()\n", FUNCNAME );
return MACHINE_CONFIG_NAME( coco_t4426 );
}
@@ -154,6 +175,7 @@ machine_config_constructor coco_t4426_device::device_mconfig_additions() const
const tiny_rom_entry *coco_t4426_device::device_rom_region() const
{
+ LOG("%s()\n", FUNCNAME );
return ROM_NAME( coco_t4426 );
}
@@ -163,39 +185,96 @@ const tiny_rom_entry *coco_t4426_device::device_rom_region() const
void coco_t4426_device::device_reset()
{
+ LOG("%s()\n", FUNCNAME );
auto cart_line = cococart_slot_device::line_value::Q;
m_owner->cart_set_line(cococart_slot_device::line::CART, cart_line);
}
/*-------------------------------------------------
- get_cart_base
--------------------------------------------------*/
-
-uint8_t* coco_t4426_device::get_cart_base()
-{
- return memregion(CARTSLOT_TAG)->base();
-}
-
-/*-------------------------------------------------
read
+ The 4426 cartridge PIA is located at ff44-ff47
-------------------------------------------------*/
READ8_MEMBER(coco_t4426_device::read)
{
uint8_t result = 0x00;
- LOG("%s()\n", FUNCNAME);
- LOGSETUP(" * Offs:%02x -> %02x\n", offset, result);
+ LOG("%s", FUNCNAME);
+ if ((offset >= 0x04) && (offset <= 0x07))
+ result = m_pia->read(space, offset - 0x04);
+
+ LOG(" - Offs:%04x Data:%02x\n", offset, result);
return result;
}
/*-------------------------------------------------
write
+ The 4426 cartridge PIA is located at ff44-ff47
-------------------------------------------------*/
WRITE8_MEMBER(coco_t4426_device::write)
{
LOG("%s(%02x)\n", FUNCNAME, data);
LOGSETUP(" * Offs:%02x <- %02x\n", offset, data);
+
+ if ((offset >= 0x04) && (offset <= 0x07))
+ m_pia->write(space, offset - 0x04, data);
+}
+
+/*----------------------------------------------------
+ pia_A_w - PIA port A write
+
+ The T4426 cartridge PIA Port A is connected to
+ the CE* input of each 2764 ROM and used for banking
+ in the correct BASIC module at C000-DFFF
+ The main cartridge ROM at E000-FF00 is fixed however
+-----------------------------------------------------*/
+#define ROM0 (~0x01 & 0xff)
+#define ROM1 (~0x02 & 0xff)
+#define ROM2 (~0x04 & 0xff)
+#define ROM3 (~0x08 & 0xff)
+#define ROM4 (~0x10 & 0xff)
+#define ROM5 (~0x20 & 0xff)
+#define ROM6 (~0x40 & 0xff)
+#define ROM7 (~0x80 & 0xff)
+
+WRITE8_MEMBER( coco_t4426_device::pia_A_w )
+{
+ LOGPIA("%s(%02x)\n", FUNCNAME, data);
+ m_select = data;
+ cart_base_changed();
+}
+
+/*-------------------------------------------------
+ get_cart_base
+-------------------------------------------------*/
+
+uint8_t* coco_t4426_device::get_cart_base()
+{
+ LOG("%s - m_select %02x -> %02x\n", FUNCNAME, m_select, ~m_select & 0xff );
+ uint8_t *base = memregion(CARTSLOT_TAG)->base();
+
+ switch (m_select)
+ {
+ case 0:
+ case ROM0: base = (uint8_t *) (base + 0x00000); break;
+ case ROM1: base = (uint8_t *) (base + 0x03000); break;
+ case ROM2: base = (uint8_t *) (base + 0x06000); break;
+ case ROM3: base = (uint8_t *) (base + 0x09000); break;
+ case ROM4: base = (uint8_t *) (base + 0x0c000); break;
+ case ROM5: base = (uint8_t *) (base + 0x0f000); break;
+ case ROM6: base = (uint8_t *) (base + 0x13000); break;
+ case ROM7: base = (uint8_t *) (base + 0x16000); break;
+ }
+
+#if 0 // Print the beginning of the selected ROM bank, seems to be correct but is not mapped in correctly via coco12.cpp m_sam->read yet
+ printf("\n");
+ for (int i = 0; i < 48; i++) printf("%02x ", *((uint8_t *)(base + i)));
+ printf("\n");
+ for (int i = 0; i < 48; i++) printf("'%c'", *((uint8_t *)(base + i)));
+ printf("\n");
+#endif
+
+ return base;
}
diff --git a/src/devices/bus/coco/coco_t4426.h b/src/devices/bus/coco/coco_t4426.h
index 72cd86a811d..a0ec0532142 100644
--- a/src/devices/bus/coco/coco_t4426.h
+++ b/src/devices/bus/coco/coco_t4426.h
@@ -30,6 +30,8 @@ public:
virtual const tiny_rom_entry *device_rom_region() const override;
virtual uint8_t* get_cart_base() override;
+ DECLARE_WRITE8_MEMBER( pia_A_w );
+
protected:
// device-level overrides
virtual void device_start() override;
@@ -38,6 +40,7 @@ protected:
// internal state
device_image_interface *m_cart;
cococart_slot_device *m_owner;
+ uint8_t m_select;
optional_ioport m_autostart;
diff --git a/src/devices/bus/vme/vme.cpp b/src/devices/bus/vme/vme.cpp
index 381b7e3075e..9f0ad5ea2d1 100644
--- a/src/devices/bus/vme/vme.cpp
+++ b/src/devices/bus/vme/vme.cpp
@@ -68,8 +68,8 @@
#include "emu.h"
#include "vme.h"
-#include "bus/vme/mzr8105.h"
-#include "bus/vme/mzr8300.h"
+#include "bus/vme/vme_mzr8105.h"
+#include "bus/vme/vme_mzr8300.h"
#define LOG_GENERAL 0x01
#define LOG_SETUP 0x02
diff --git a/src/devices/bus/vme/vme_mvme350.c b/src/devices/bus/vme/vme_mvme350.c
deleted file mode 100644
index 69bbbe618d7..00000000000
--- a/src/devices/bus/vme/vme_mvme350.c
+++ /dev/null
@@ -1,257 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Joakim Larsson Edstrom
-/***************************************************************************
- *
- * Motorola MVME-350 6U Intelligent Tape Controller driver, initially derived
- * from hk68v10.c
- *
- * 31/08/2015
- *
- * I baught this board from http://www.retrotechnology.com without documentation.
- * It has a Motorola 68010 CPU @ 10MHz, 128 Mb RAM and two 2764 EPROMS with
- * QIC-02 tape controller firmware. The board also populates a 68230 PIT and loads
- * of descrete TTL components.
- *
- *
- * ||
- * || ||
- * ||||--||
- * ||||--||
- * || ||__________________________________________________________ ___
- * ||_______________________________________________________ |_| |
- * || |74F74 | xxxxx | xxxxx | 74LS245 | 74ALS645| | | |
- * || |______|________|_________|___________| ________| | | |
- * || |74F74 | xxxxx | xxxxx | 74LS245 | 74ALS645| | | |
- * || |______|________|_________|___________| ________| | | |
- * || |74LS02| 74LS08||Am25LS251| 74S38 |74LS20|Jumpers | | |
- * || |______|_______||_________|_______|______|______| | |VME|
- * || |74F04 | 74LS32||74LS374 | 74LS374 |74S244 | | | |
- * ||+---+ |______|_______||_________|___________|_________| | |P1 |
- * |||CON| |74F04 | 74LS85||74S244 | 74S240 |PAL | | | |
- * ||| | |______|_______||_________|___________|_________| | | |
- * ||| | |74LS04| | |74S244 | | | |
- * ||| | |______| | PIT |_________| | | |
- * ||| | |74LS125 | MC68230L10 |74LS145 | | | |
- * ||| | |______| __|_______________________|---------| | | |
- * ||| | |74LS74| |25LS251 | | RAM |74S244 | |_| |
- * ||+---+ ---------- |---------- | HM6264P-12 |---------| |___|
- * || | PAL | | 74245 | |______________|74S244 | |
- * || +--------- |_________| | U40 27128 |---------| |
- * || | 74F32 | | || System ROM |74LS682 | |
- * Red || +-------- | CPU || |-+-------| |
- * FAIL ||LED | 74F138| | MC68010 |+--------------+ |DIPSW__| |
- * Red || +-------- | || RAM | |74S38 | |
- * HALT ||LED | 74F32 | |__________|| HM6264P-12 | |______ | |
- * Green || +-------+ |74245 |+--------------+ |74F08 | |
- * RUN ||LED |XTAL | |__________|| U47 27128 | |______ | |___
- * ||+---+|20MHz | |74244 || System ROM | |74F00 | _| |
- * |||CON|--------+___|__________|+--------------+_|_______| | | |
- * ||| |74LS08 |74F74 |74LS148| |PAL | | PAL | | | |
- * ||| |________|________|_______| |________|_|_________| | | |
- * ||| | 74LS138|74F32 | PAL | |74F74 |Am29823 | | | |
- * ||| |________|________|_______| |________|-+---------| | |VME|
- * ||| | 74LS11 |74F04 |74LS374| |74LS374 | |74S240 | | | |
- * ||| |________|________|_______| |________|_|---------| | |P2 |
- * ||| | 74F138 |BLANK |74LS374| |74LS374 |74S240 | | | |
- * ||| |________|________|_______| +----------+---------| | | |
- * ||| | 74LS08 |74F32 |74LS11|74LS393|74LS393|resistors | | |
- * ||| |________|________|______|______ |_______|________| | | |
- * ||| |DM2585 |74F74 |DM2230| 74LS00| 74F02 |74F32 | | | |
- * ||+---+--------+--------+------+-------+---------+------| | | |
- * || |74LS74 |74F20 |74S260| 74S74 | 74F08 |74LS02| | | |
- * || +------------------------------------------+------| | | |
- * || |DM2353 |74F10 |74F32 | 74LS32| 74F08 |DM2353| |_| |
- * || +------------------------------------------+------+-+ |___|
- * || ||------------------------------------------------------------+-+
- * ||||--||
- * ||||--||
- * ||
- *
- * History of Motorola VME division (https://en.wikipedia.org/wiki/VMEbus)
- *---------------------------------
- * When Motorola released the 68000 processor 1979 the ambition of the deisgners
- * was also to standardize a versatile CPU bus to be able to build computer
- * systems without constructing PCB:s from scratch. This become VersaBus but the
- * boards was really too big and the computer world already saw the systems shrink
- * in size. Motorola's design center in Munich proposed to use the smaller and
- * already used Euroboard form factor and call it Versabus-E. This later became
- * VME which was standardized in the VITA organization 1981
- *
- * Misc links about Motorola VME division and this board:
- * http://bitsavers.trailing-edge.com/pdf/motorola/_dataBooks/1987_Microcomputer_Systems_and_Components.pdf
- *
- * Description
- * ------------
- * Streaming Tape Controller released 1984 with the following feature set
- *
- * - Double High (6U) VMEmodule
- * - QIC-02 Streaming Tape Interface
- * - Supports One 01C-02 compatible 1/4-inch Streaming Tape Drive
- * - Standard VMEbus Interface
- * - Supports 24- or 32-bit DMA Addressing/16-bit Data
- * - Generates Seven Levels of VMEbus Interrupts with Programmable Interrupt Vector
- * - 10 MHz MC68010 Microprocessor
- * - 90Kb/s Continuous Transfer Rate for QIC-02 Interface, 200Kb/s Burst rate
- * - Controls Tape Cartridges Offering 20Mb, 45Mb and 60Mb of Formatted Data Storage
- * - MC68230 PIT-based Timer
- * - 16Kb of Static RAM Provides Buffer Storage and CPU Workspace
- * - Multitasking Kernel-based Firmware Package
- * - Buffered Pipe Communication Protocol Allows Multiple Hosts to Oueue Commands Without Interlock
- * - High Level Command/Status Packets offer efficient Operating System Support
- * - Permits Chaining of Host Command
- *
- * Address Map
- * --------------------------------------------------------------------------
- * Local to VME Decscription
- * --------------------------------------------------------------------------
- * 0x000000 Up to 128Kb System ROM with RESET vector
- * 0x020000 RAM with vectors
- * 0x020500 RAM Top of stack
- * 0x040000 PIT device?
- * 0x060000 RAM?
- * 0x080000 PIT device?
- * --------------------------------------------------------------------------
- *
- * Interrupt sources MVME
- * ----------------------------------------------------------
- * Description Device Lvl IRQ VME board
- * /Board Vector Address
- * ----------------------------------------------------------
- * On board Sources
- *
- * Off board Sources (other VME boards)
- *
- * ----------------------------------------------------------
- *
- * DMAC Channel Assignments
- * ----------------------------------------------------------
- * Channel M10 V10
- * ----------------------------------------------------------
- *
- *
- * TODO:
- * - Dump the ROMs (DONE)
- * - Setup a working address map (STARTED)
- * - Get documentation for VME interface
- * - Add VME bus driver
- * - Hook up a CPU board that supports boot from tape (ie MVME-162, MVME 147)
- * - Get a tape file with a bootable data on it.
- *
- ****************************************************************************/
-
-#include "emu.h"
-#include "cpu/m68000/m68000.h"
-#include "machine/68230pit.h"
-
-#define LOG(x) x
-
-class mvme350_state : public driver_device
-{
-public:
-mvme350_state(const machine_config &mconfig, device_type type, const char *tag) :
- driver_device (mconfig, type, tag),
- m_maincpu (*this, "maincpu"),
- m_pit(*this, "pit")
-{
-}
-
-DECLARE_READ16_MEMBER (vme_a24_r);
-DECLARE_WRITE16_MEMBER (vme_a24_w);
-DECLARE_READ16_MEMBER (vme_a16_r);
-DECLARE_WRITE16_MEMBER (vme_a16_w);
-virtual void machine_start ();
-virtual void machine_reset ();
-protected:
-
-private:
- required_device<cpu_device> m_maincpu;
- required_device<pit68230_device> m_pit;
-
-};
-
-static ADDRESS_MAP_START (mvme350_mem, AS_PROGRAM, 16, mvme350_state)
-ADDRESS_MAP_UNMAP_HIGH
- AM_RANGE (0x000000, 0x01ffff) AM_ROM /* 128 Mb ROM */
- AM_RANGE (0x020000, 0x03ffff) AM_RAM /* 128 Mb RAM */
-#if 1
- AM_RANGE(0x040000, 0x040035) AM_DEVREADWRITE8("pit", pit68230_device, read, write, 0x00ff) /* PIT ?*/
- AM_RANGE(0x060000, 0x06001f) AM_RAM /* Area is cleared on start */
- AM_RANGE(0x080000, 0x080035) AM_DEVREADWRITE8("pit", pit68230_device, read, write, 0x00ff) /* PIT ?*/
-#endif
-//AM_RANGE(0x100000, 0xfeffff) AM_READWRITE(vme_a24_r, vme_a24_w) /* VMEbus Rev B addresses (24 bits) - not verified */
-//AM_RANGE(0xff0000, 0xffffff) AM_READWRITE(vme_a16_r, vme_a16_w) /* VMEbus Rev B addresses (16 bits) - not verified */
-ADDRESS_MAP_END
-
-/* Input ports */
-static INPUT_PORTS_START (mvme350)
-INPUT_PORTS_END
-
-/* Start it up */
-void mvme350_state::machine_start ()
-{
- LOG (logerror ("machine_start\n"));
-}
-
-void mvme350_state::machine_reset ()
-{
- LOG (logerror ("machine_reset\n"));
-}
-
-#if 0
-/* Dummy VME access methods until the VME bus device is ready for use */
-READ16_MEMBER (mvme350_state::vme_a24_r){
- LOG (logerror ("vme_a24_r\n"));
- return (uint16_t) 0;
-}
-
-WRITE16_MEMBER (mvme350_state::vme_a24_w){
- LOG (logerror ("vme_a24_w\n"));
-}
-
-READ16_MEMBER (mvme350_state::vme_a16_r){
- LOG (logerror ("vme_16_r\n"));
- return (uint16_t) 0;
-}
-
-WRITE16_MEMBER (mvme350_state::vme_a16_w){
- LOG (logerror ("vme_a16_w\n"));
-}
-#endif
-
-/*
- * Machine configuration
- */
-static MACHINE_CONFIG_START (mvme350, mvme350_state)
- /* basic machine hardware */
- MCFG_CPU_ADD ("maincpu", M68010, XTAL_10MHz)
- MCFG_CPU_PROGRAM_MAP (mvme350_mem)
- /* PIT Parallel Interface and Timer device, assuming strapped for on board clock */
- MCFG_DEVICE_ADD("pit", PIT68230, XTAL_16MHz / 2)
-
-MACHINE_CONFIG_END
-
-/* ROM definitions */
-ROM_START (mvme350)
-ROM_REGION (0x1000000, "maincpu", 0)
-
-ROM_LOAD16_BYTE ("mvme350U40v2.3.bin", 0x0000, 0x4000, CRC (bcef82ef) SHA1 (e6fdf26e4714cbaeb3e97d7b5acf02d64d8ad744))
-ROM_LOAD16_BYTE ("mvme350U47v2.3.bin", 0x0001, 0x4000, CRC (582ce095) SHA1 (d0929dbfeb0cfda63df6b5bc29ee27fbf665def7))
-
-/*
- * System ROM information
- *
- * The ROMs known commands from different sources:
- *
- * It communicates with the master through data buffers in shared memory and VME bus interrupts
- * as desribed in
- * http://bitsavers.trailing-edge.com/pdf/motorola/_dataBooks/1987_Microcomputer_Systems_and_Components.pdf
- *
- * The board is pretty boring as stand alone, it initializes everything and then executes a STOP instruction
- * awaiting a CPU on the VME bus to request its services. However, it enables boot from tape devices, we just
- * need a MVME-131 and a dump of a VersaDOS or Motorola UNIX System V system tape and some work.
- */
-ROM_END
-
-/* Driver */
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP (1984, mvme350, 0, 0, mvme350, mvme350, driver_device, 0, "Motorola", "MVME-350", MACHINE_NO_SOUND_HW | MACHINE_TYPE_COMPUTER )
diff --git a/src/mame/bus/vme/mzr8105.cpp b/src/devices/bus/vme/vme_mzr8105.cpp
index e0a722ab0eb..017255ba9e1 100644
--- a/src/mame/bus/vme/mzr8105.cpp
+++ b/src/devices/bus/vme/vme_mzr8105.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Joakim Larsson Edstrom
#include "emu.h"
-#include "mzr8105.h"
+#include "vme_mzr8105.h"
#define LOG_GENERAL 0x01
#define LOG_SETUP 0x02
diff --git a/src/mame/bus/vme/mzr8105.h b/src/devices/bus/vme/vme_mzr8105.h
index 50041eac7fe..55aa77d25c5 100644
--- a/src/mame/bus/vme/mzr8105.h
+++ b/src/devices/bus/vme/vme_mzr8105.h
@@ -5,8 +5,6 @@
#pragma once
#include "bus/vme/vme.h"
-//#include "includes/mzr8105.h"
-#include "bus/vme/mzr8105.h"
extern const device_type VME_MZR8105;
diff --git a/src/mame/bus/vme/mzr8300.cpp b/src/devices/bus/vme/vme_mzr8300.cpp
index 669f1579b28..f6d27379994 100644
--- a/src/mame/bus/vme/mzr8300.cpp
+++ b/src/devices/bus/vme/vme_mzr8300.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Joakim Larsson Edstrom
#include "emu.h"
-#include "mzr8300.h"
+#include "vme_mzr8300.h"
#include "machine/z80sio.h"
#define LOG_GENERAL 0x01
diff --git a/src/mame/bus/vme/mzr8300.h b/src/devices/bus/vme/vme_mzr8300.h
index 009e47c8dd6..7f8ae0922ae 100644
--- a/src/mame/bus/vme/mzr8300.h
+++ b/src/devices/bus/vme/vme_mzr8300.h
@@ -5,8 +5,6 @@
#pragma once
#include "bus/vme/vme.h"
-//#include "includes/mzr8300.h"
-#include "bus/vme/mzr8300.h"
extern const device_type VME_MZR8300;
diff --git a/src/devices/cpu/m6805/m6805.cpp b/src/devices/cpu/m6805/m6805.cpp
index 278505b8c1e..6c2f3de6622 100644
--- a/src/devices/cpu/m6805/m6805.cpp
+++ b/src/devices/cpu/m6805/m6805.cpp
@@ -415,7 +415,7 @@ m6805_base_device::m6805_base_device(const machine_config &mconfig, const char *
{
}
-m6805_base_device::m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_constructor internal_map, const char *shortname, const char *source)
+m6805_base_device::m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source)
: cpu_device(mconfig, type, name, tag, owner, clock, shortname, source),
m_program_config("program", ENDIANNESS_BIG, 8, addr_width, 0, internal_map)
{
@@ -965,63 +965,146 @@ void m68705_device::execute_set_input(int inputnum, int state)
/* ddr - direction registers */
-WRITE8_MEMBER(m68705_new_device::mc68705_ddrA_w)
+WRITE8_MEMBER(m68705_new_device::internal_ddrA_w)
{
+ const u8 ddr_old = m_ddrA;
m_ddrA = data;
+
+ // update outputs if lines switched to output
+ if ((m_ddrA & ~ddr_old) != 0)
+ update_portA_state();
}
-WRITE8_MEMBER(m68705_new_device::mc68705_ddrB_w)
+WRITE8_MEMBER(m68705_new_device::internal_ddrB_w)
{
+ const u8 ddr_old = m_ddrB;
m_ddrB = data;
+
+ // update outputs if lines switched to output
+ if ((m_ddrB & ~ddr_old) != 0)
+ update_portB_state();
}
-WRITE8_MEMBER(m68705_new_device::mc68705_ddrC_w)
+WRITE8_MEMBER(m68705_new_device::internal_ddrC_w)
{
+ const u8 ddr_old = m_ddrC;
m_ddrC = data;
+
+ // update outputs if lines switched to output
+ if ((m_ddrC & ~ddr_old) != 0)
+ update_portC_state();
}
/* read ports */
-READ8_MEMBER(m68705_new_device::mc68705_portA_r)
+READ8_MEMBER(m68705_new_device::internal_portA_r)
{
- m_portA_in = m_portA_cb_r(0, ~m_ddrA); // pass the direction register as mem_mask so that externally we know which lines were actually pulled
- uint8_t res = (m_portA_out & m_ddrA) | (m_portA_in & ~m_ddrA);
+ if (!m_portA_cb_r.isnull())
+ m_portA_in = m_portA_cb_r(space, 0, ~m_ddrA); // pass the direction register as mem_mask so that externally we know which lines were actually pulled
+ u8 res = (m_portA_out & m_ddrA) | (m_portA_in & ~m_ddrA);
return res;
-
}
-READ8_MEMBER(m68705_new_device::mc68705_portB_r)
+READ8_MEMBER(m68705_new_device::internal_portB_r)
{
- m_portB_in = m_portB_cb_r(0, ~m_ddrB);
- uint8_t res = (m_portB_out & m_ddrB) | (m_portB_in & ~m_ddrB);
+ if (!m_portB_cb_r.isnull())
+ m_portB_in = m_portB_cb_r(space, 0, ~m_ddrB);
+ u8 res = (m_portB_out & m_ddrB) | (m_portB_in & ~m_ddrB);
return res;
}
-READ8_MEMBER(m68705_new_device::mc68705_portC_r)
+READ8_MEMBER(m68705_new_device::internal_portC_r)
{
- m_portC_in = m_portC_cb_r(0, ~m_ddrC);
- uint8_t res = (m_portC_out & m_ddrC) | (m_portC_in & ~m_ddrC);
+ if (!m_portC_cb_r.isnull())
+ m_portC_in = m_portC_cb_r(space, 0, ~m_ddrC);
+ u8 res = (m_portC_out & m_ddrC) | (m_portC_in & ~m_ddrC);
return res;
}
/* write ports */
-WRITE8_MEMBER(m68705_new_device::mc68705_portA_w)
+WRITE8_MEMBER(m68705_new_device::internal_portA_w)
{
- m_portA_cb_w(0, data, m_ddrA); // pass the direction register as mem_mask so that externally we know which lines were actually pushed
+ // load the output latch
m_portA_out = data;
+
+ // update the output lines
+ update_portA_state();
}
-WRITE8_MEMBER(m68705_new_device::mc68705_portB_w)
+void m68705_new_device::update_portA_state()
{
- m_portB_cb_w(0, data, m_ddrB);
+ // pass bits through DDR output mask
+ m_portA_in = (m_portA_out & m_ddrA) | (m_portA_in & ~m_ddrA);
+
+ // pass the direction register as mem_mask as mem_mask so that externally we know which lines were actually pushed
+ m_portA_cb_w(space(AS_PROGRAM), 0, m_portA_in, m_ddrA);
+}
+
+WRITE8_MEMBER(m68705_new_device::internal_portB_w)
+{
+ // load the output latch
m_portB_out = data;
+
+ // update the output lines
+ update_portB_state();
}
-WRITE8_MEMBER(m68705_new_device::mc68705_portC_w)
+void m68705_new_device::update_portB_state()
{
- m_portC_cb_w(0, data, m_ddrC);
+ // pass bits through DDR output mask
+ m_portB_in = (m_portB_out & m_ddrB) | (m_portB_in & ~m_ddrB);
+
+ // pass the direction register as mem_mask as mem_mask so that externally we know which lines were actually pushed
+ m_portB_cb_w(space(AS_PROGRAM), 0, m_portB_in, m_ddrB);
+}
+
+WRITE8_MEMBER(m68705_new_device::internal_portC_w)
+{
+ // load the output latch
m_portC_out = data;
+
+ // update the output lines
+ update_portC_state();
+}
+
+void m68705_new_device::update_portC_state()
+{
+ // pass bits through DDR output mask
+ m_portC_in = (m_portC_out & m_ddrC) | (m_portC_in & ~m_ddrC);
+
+ // pass the direction register as mem_mask as mem_mask so that externally we know which lines were actually pushed
+ m_portC_cb_w(space(AS_PROGRAM), 0, m_portC_in, m_ddrC);
+}
+
+READ8_MEMBER(m68705_new_device::pa_r)
+{
+ return m_portA_in;
+}
+
+READ8_MEMBER(m68705_new_device::pb_r)
+{
+ return m_portB_in;
+}
+
+READ8_MEMBER(m68705_new_device::pc_r)
+{
+ return m_portC_in;
+}
+
+WRITE8_MEMBER(m68705_new_device::pa_w)
+{
+ COMBINE_DATA(&m_portA_in);
+}
+
+WRITE8_MEMBER(m68705_new_device::pb_w)
+{
+ COMBINE_DATA(&m_portB_in);
+}
+
+WRITE8_MEMBER(m68705_new_device::pc_w)
+{
+ COMBINE_DATA(&m_portC_in);
}
/*
@@ -1079,13 +1162,13 @@ selftest rom at similar area; selftest roms differ between the U2 and U3 version
*/
-ADDRESS_MAP_START( m68705_internal_map, AS_PROGRAM, 8, m68705_new_device )
- AM_RANGE(0x000, 0x000) AM_READWRITE(mc68705_portA_r, mc68705_portA_w)
- AM_RANGE(0x001, 0x001) AM_READWRITE(mc68705_portB_r, mc68705_portB_w)
- AM_RANGE(0x002, 0x002) AM_READWRITE(mc68705_portC_r, mc68705_portC_w)
- AM_RANGE(0x004, 0x004) AM_WRITE(mc68705_ddrA_w)
- AM_RANGE(0x005, 0x005) AM_WRITE(mc68705_ddrB_w)
- AM_RANGE(0x006, 0x006) AM_WRITE(mc68705_ddrC_w)
+DEVICE_ADDRESS_MAP_START( internal_map, 8, m68705_new_device )
+ AM_RANGE(0x000, 0x000) AM_READWRITE(internal_portA_r, internal_portA_w)
+ AM_RANGE(0x001, 0x001) AM_READWRITE(internal_portB_r, internal_portB_w)
+ AM_RANGE(0x002, 0x002) AM_READWRITE(internal_portC_r, internal_portC_w)
+ AM_RANGE(0x004, 0x004) AM_WRITE(internal_ddrA_w)
+ AM_RANGE(0x005, 0x005) AM_WRITE(internal_ddrB_w)
+ AM_RANGE(0x006, 0x006) AM_WRITE(internal_ddrC_w)
AM_RANGE(0x010, 0x07f) AM_RAM
AM_RANGE(0x080, 0x7ff) AM_ROM
@@ -1111,10 +1194,23 @@ void m68705_new_device::device_start()
m_portB_cb_w.resolve_safe();
m_portC_cb_w.resolve_safe();
- m_portA_cb_r.resolve_safe(0xff);
- m_portB_cb_r.resolve_safe(0xff);
- m_portC_cb_r.resolve_safe(0xff);
+ m_portA_cb_r.resolve();
+ m_portB_cb_r.resolve();
+ m_portC_cb_r.resolve();
+
+ m_portA_in = 0xff;
+ m_portB_in = 0xff;
+ m_portC_in = 0xff;
+}
+
+void m68705_new_device::device_reset()
+{
+ m68705_device::device_reset();
+ // all bits of ports A, B and C revert to inputs on reset
+ m_ddrA = 0;
+ m_ddrB = 0;
+ m_ddrC = 0;
}
/****************************************************************************
diff --git a/src/devices/cpu/m6805/m6805.h b/src/devices/cpu/m6805/m6805.h
index 24b75f57158..f0d6e5200a7 100644
--- a/src/devices/cpu/m6805/m6805.h
+++ b/src/devices/cpu/m6805/m6805.h
@@ -28,7 +28,7 @@ class m6805_base_device : public cpu_device
public:
// construction/destruction
m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, const char *shortname, const char *source);
- m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_constructor internal_map, const char *shortname, const char *source);
+ m6805_base_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source);
protected:
// device-level overrides
@@ -330,7 +330,7 @@ public:
m68705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: m6805_base_device(mconfig, tag, owner, clock, M68705, "M68705", 12, "m68705", __FILE__) { }
- m68705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_constructor internal_map, const char *shortname, const char *source)
+ m68705_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, const device_type type, const char *name, uint32_t addr_width, address_map_delegate internal_map, const char *shortname, const char *source)
: m6805_base_device(mconfig, tag, owner, clock, type, name, addr_width, internal_map, shortname, source) { }
@@ -345,26 +345,24 @@ protected:
// ======================> m68705_new_device
-ADDRESS_MAP_EXTERN(m68705_internal_map, 8);
-
#define MCFG_M68705_PORTA_W_CB(_devcb) \
- m68705_new_device::set_portA_cb_w(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portA_cb_w(*device, DEVCB_##_devcb);
#define MCFG_M68705_PORTB_W_CB(_devcb) \
- m68705_new_device::set_portB_cb_w(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portB_cb_w(*device, DEVCB_##_devcb);
#define MCFG_M68705_PORTC_W_CB(_devcb) \
- m68705_new_device::set_portC_cb_w(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portC_cb_w(*device, DEVCB_##_devcb);
#define MCFG_M68705_PORTA_R_CB(_devcb) \
- m68705_new_device::set_portA_cb_r(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portA_cb_r(*device, DEVCB_##_devcb);
#define MCFG_M68705_PORTB_R_CB(_devcb) \
- m68705_new_device::set_portB_cb_r(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portB_cb_r(*device, DEVCB_##_devcb);
#define MCFG_M68705_PORTC_R_CB(_devcb) \
- m68705_new_device::set_portC_cb_r(*device, DEVCB_##_devcb);
+ devcb = &m68705_new_device::set_portC_cb_r(*device, DEVCB_##_devcb);
class m68705_new_device : public m68705_device
@@ -372,7 +370,7 @@ class m68705_new_device : public m68705_device
public:
// construction/destruction
m68705_new_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : m68705_device(mconfig, tag, owner, clock, M68705_NEW, "M68705 (NEW)", 11, ADDRESS_MAP_NAME( m68705_internal_map ), "m68705_new", __FILE__),
+ : m68705_device(mconfig, tag, owner, clock, M68705_NEW, "M68705 (NEW)", 11, address_map_delegate(FUNC(m68705_new_device::internal_map), this), "m68705_new", __FILE__),
m_portA_in(0),
m_portB_in(0),
m_portC_in(0),
@@ -399,31 +397,44 @@ public:
template<class _Object> static devcb_base &set_portB_cb_r(device_t &device, _Object object) { return downcast<m68705_new_device &>(device).m_portB_cb_r.set_callback(object); }
template<class _Object> static devcb_base &set_portC_cb_r(device_t &device, _Object object) { return downcast<m68705_new_device &>(device).m_portC_cb_r.set_callback(object); }
- DECLARE_READ8_MEMBER(mc68705_portA_r);
- DECLARE_READ8_MEMBER(mc68705_portB_r);
- DECLARE_READ8_MEMBER(mc68705_portC_r);
-
- DECLARE_WRITE8_MEMBER(mc68705_portA_w);
- DECLARE_WRITE8_MEMBER(mc68705_portB_w);
- DECLARE_WRITE8_MEMBER(mc68705_portC_w);
+ DECLARE_READ8_MEMBER(pa_r);
+ DECLARE_READ8_MEMBER(pb_r);
+ DECLARE_READ8_MEMBER(pc_r);
- DECLARE_WRITE8_MEMBER(mc68705_ddrA_w);
- DECLARE_WRITE8_MEMBER(mc68705_ddrB_w);
- DECLARE_WRITE8_MEMBER(mc68705_ddrC_w);
+ DECLARE_WRITE8_MEMBER(pa_w);
+ DECLARE_WRITE8_MEMBER(pb_w);
+ DECLARE_WRITE8_MEMBER(pc_w);
protected:
+ DECLARE_ADDRESS_MAP(internal_map, 8);
+
+ DECLARE_READ8_MEMBER(internal_portA_r);
+ DECLARE_READ8_MEMBER(internal_portB_r);
+ DECLARE_READ8_MEMBER(internal_portC_r);
+
+ DECLARE_WRITE8_MEMBER(internal_portA_w);
+ DECLARE_WRITE8_MEMBER(internal_portB_w);
+ DECLARE_WRITE8_MEMBER(internal_portC_w);
- uint8_t m_portA_in;
- uint8_t m_portB_in;
- uint8_t m_portC_in;
+ DECLARE_WRITE8_MEMBER(internal_ddrA_w);
+ DECLARE_WRITE8_MEMBER(internal_ddrB_w);
+ DECLARE_WRITE8_MEMBER(internal_ddrC_w);
- uint8_t m_portA_out;
- uint8_t m_portB_out;
- uint8_t m_portC_out;
+ void update_portA_state();
+ void update_portB_state();
+ void update_portC_state();
- uint8_t m_ddrA;
- uint8_t m_ddrB;
- uint8_t m_ddrC;
+ u8 m_portA_in;
+ u8 m_portB_in;
+ u8 m_portC_in;
+
+ u8 m_portA_out;
+ u8 m_portB_out;
+ u8 m_portC_out;
+
+ u8 m_ddrA;
+ u8 m_ddrB;
+ u8 m_ddrC;
/* Callbacks */
devcb_write8 m_portA_cb_w;
@@ -437,6 +448,7 @@ protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_reset() override;
// virtual void execute_set_input(int inputnum, int state) override;
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index d47e7ffe1cb..1951beee11b 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -9,14 +9,27 @@
#include "emu.h"
#include "6821pia.h"
-
//**************************************************************************
// MACROS
//**************************************************************************
-#define VERBOSE 0
+#define LOG_GENERAL 0x01
+#define LOG_SETUP 0x02
+#define LOG_PRINTF 0x04
+#define LOG_CA1 0x08
+
+#define VERBOSE 0 //(LOG_PRINTF | LOG_SETUP | LOG_GENERAL)
+
+#define LOGMASK(mask, ...) do { if (VERBOSE & mask) logerror(__VA_ARGS__); } while (0)
+#define LOGLEVEL(mask, level, ...) do { if ((VERBOSE & mask) >= level) logerror(__VA_ARGS__); } while (0)
+
+#define LOG(...) LOGMASK(LOG_GENERAL, __VA_ARGS__)
+#define LOGSETUP(...) LOGMASK(LOG_SETUP, __VA_ARGS__)
+#define LOGCA1(...) LOGMASK(LOG_CA1, __VA_ARGS__)
-#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
+#if VERBOSE & LOG_PRINTF
+#define logerror printf
+#endif
#define PIA_IRQ1 (0x80)
#define PIA_IRQ2 (0x40)
@@ -426,7 +439,7 @@ uint8_t pia6821_device::port_a_r()
}
}
- LOG(("PIA #%s: port A read = %02X\n", tag(), ret));
+ LOG("PIA #%s: port A read = %02X\n", tag(), ret);
return ret;
}
@@ -440,7 +453,7 @@ uint8_t pia6821_device::ddr_a_r()
{
uint8_t ret = m_ddr_a;
- LOG(("PIA #%s: DDR A read = %02X\n", tag(), ret));
+ LOG("PIA #%s: DDR A read = %02X\n", tag(), ret);
return ret;
}
@@ -468,7 +481,7 @@ uint8_t pia6821_device::port_b_r()
m_irq_b2 = false;
update_interrupts();
- LOG(("PIA #%s: port B read = %02X\n", tag(), ret));
+ LOG("PIA #%s: port B read = %02X\n", tag(), ret);
return ret;
}
@@ -482,7 +495,7 @@ uint8_t pia6821_device::ddr_b_r()
{
uint8_t ret = m_ddr_b;
- LOG(("PIA #%s: DDR B read = %02X\n", tag(), ret));
+ LOG("PIA #%s: DDR B read = %02X\n", tag(), ret);
return ret;
}
@@ -531,7 +544,7 @@ uint8_t pia6821_device::control_a_r()
ret |= PIA_IRQ2;
}
- LOG(("PIA #%s: control A read = %02X\n", tag(), ret));
+ LOG("PIA #%s: control A read = %02X\n", tag(), ret);
return ret;
}
@@ -576,7 +589,7 @@ uint8_t pia6821_device::control_b_r()
ret |= PIA_IRQ2;
}
- LOG(("PIA #%s: control B read = %02X\n", tag(), ret));
+ LOG("PIA #%s: control B read = %02X\n", tag(), ret);
return ret;
}
@@ -638,7 +651,7 @@ void pia6821_device::send_to_out_a_func(const char* message)
// input pins are pulled high
uint8_t data = get_out_a_value();
- LOG(("PIA #%s: %s = %02X\n", tag(), message, data));
+ LOG("PIA #%s: %s = %02X\n", tag(), message, data);
if(!m_out_a_handler.isnull())
{
@@ -665,7 +678,7 @@ void pia6821_device::send_to_out_b_func(const char* message)
// input pins are high-impedance - we just send them as zeros for backwards compatibility
uint8_t data = get_out_b_value();
- LOG(("PIA #%s: %s = %02X\n", tag(), message, data));
+ LOG("PIA #%s: %s = %02X\n", tag(), message, data);
if(!m_out_b_handler.isnull())
{
@@ -704,15 +717,15 @@ void pia6821_device::ddr_a_w(uint8_t data)
{
if(data == 0x00)
{
- LOG(("PIA #%s: DDR A write = %02X (input mode)\n", tag(), data));
+ LOG("PIA #%s: DDR A write = %02X (input mode)\n", tag(), data);
}
else if(data == 0xff)
{
- LOG(("PIA #%s: DDR A write = %02X (output mode)\n", tag(), data));
+ LOG("PIA #%s: DDR A write = %02X (output mode)\n", tag(), data);
}
else
{
- LOG(("PIA #%s: DDR A write = %02X (mixed mode)\n", tag(), data));
+ LOG("PIA #%s: DDR A write = %02X (mixed mode)\n", tag(), data);
}
if(m_ddr_a != data)
@@ -759,15 +772,15 @@ void pia6821_device::ddr_b_w(uint8_t data)
{
if (data == 0x00)
{
- LOG(("PIA #%s: DDR B write = %02X (input mode)\n", tag(), data));
+ LOG("PIA #%s: DDR B write = %02X (input mode)\n", tag(), data);
}
else if (data == 0xff)
{
- LOG(("PIA #%s: DDR B write = %02X (output mode)\n", tag(), data));
+ LOG("PIA #%s: DDR B write = %02X (output mode)\n", tag(), data);
}
else
{
- LOG(("PIA #%s: DDR B write = %02X (mixed mode)\n", tag(), data));
+ LOG("PIA #%s: DDR B write = %02X (mixed mode)\n", tag(), data);
}
if(m_ddr_b != data)
@@ -789,7 +802,7 @@ void pia6821_device::control_a_w(uint8_t data)
// bit 7 and 6 are read only
data &= 0x3f;
- LOG(("PIA #%s: control A write = %02X\n", tag(), data));
+ LOG("PIA #%s: control A write = %02X\n", tag(), data);
// update the control register
m_ctl_a = data;
@@ -829,7 +842,7 @@ void pia6821_device::control_b_w(uint8_t data)
// bit 7 and 6 are read only
data &= 0x3f;
- LOG(("PIA #%s: control B write = %02X\n", tag(), data));
+ LOG("PIA #%s: control B write = %02X\n", tag(), data);
// update the control register
m_ctl_b = data;
@@ -902,7 +915,7 @@ void pia6821_device::set_a_input(uint8_t data, uint8_t z_mask)
{
assert_always(m_in_a_handler.isnull(), "pia6821_porta_w() called when in_a_func implemented");
- LOG(("PIA #%s: set input port A = %02X\n", tag(), data));
+ LOG("PIA #%s: set input port A = %02X\n", tag(), data);
m_in_a = data;
m_port_a_z_mask = z_mask;
@@ -938,12 +951,12 @@ uint8_t pia6821_device::a_output()
WRITE_LINE_MEMBER( pia6821_device::ca1_w )
{
- LOG(("PIA #%s: set input CA1 = %d\n", tag(), state));
+ LOGCA1("PIA #%s: set input CA1 = %d\n", tag(), state);
// the new state has caused a transition
if((m_in_ca1 != state) && ((state && C1_LOW_TO_HIGH(m_ctl_a)) || (!state && C1_HIGH_TO_LOW(m_ctl_a))))
{
- LOG(("PIA #%s: CA1 triggering\n", tag()));
+ LOGCA1("PIA #%s: CA1 triggering\n", tag());
// mark the IRQ
m_irq_a1 = true;
@@ -970,12 +983,12 @@ WRITE_LINE_MEMBER( pia6821_device::ca1_w )
WRITE_LINE_MEMBER( pia6821_device::ca2_w )
{
- LOG(("PIA #%s: set input CA2 = %d\n", tag(), state));
+ LOG("PIA #%s: set input CA2 = %d\n", tag(), state);
// if input mode and the new state has caused a transition
if(C2_INPUT(m_ctl_a) && (m_in_ca2 != state) && ((state && C2_LOW_TO_HIGH(m_ctl_a)) || (!state && C2_HIGH_TO_LOW(m_ctl_a))))
{
- LOG(("PIA #%s: CA2 triggering\n", tag()));
+ LOG("PIA #%s: CA2 triggering\n", tag());
// mark the IRQ
m_irq_a2 = true;
@@ -1025,7 +1038,7 @@ void pia6821_device::portb_w(uint8_t data)
{
assert_always(m_in_b_handler.isnull(), "pia_set_input_b() called when in_b_func implemented");
- LOG(("PIA #%s: set input port B = %02X\n", tag(), data));
+ LOG("PIA #%s: set input port B = %02X\n", tag(), data);
m_in_b = data;
m_in_b_pushed = true;
@@ -1050,12 +1063,12 @@ uint8_t pia6821_device::b_output()
WRITE_LINE_MEMBER( pia6821_device::cb1_w )
{
- LOG(("PIA #%s: set input CB1 = %d\n", tag(), state));
+ LOG("PIA #%s: set input CB1 = %d\n", tag(), state);
// the new state has caused a transition
if((m_in_cb1 != state) && ((state && C1_LOW_TO_HIGH(m_ctl_b)) || (!state && C1_HIGH_TO_LOW(m_ctl_b))))
{
- LOG(("PIA #%s: CB1 triggering\n", tag()));
+ LOG("PIA #%s: CB1 triggering\n", tag());
// mark the IRQ
m_irq_b1 = 1;
@@ -1081,14 +1094,14 @@ WRITE_LINE_MEMBER( pia6821_device::cb1_w )
WRITE_LINE_MEMBER( pia6821_device::cb2_w )
{
- LOG(("PIA #%s: set input CB2 = %d\n", tag(), state));
+ LOG("PIA #%s: set input CB2 = %d\n", tag(), state);
// if input mode and the new state has caused a transition
if (C2_INPUT(m_ctl_b) &&
(m_in_cb2 != state) &&
((state && C2_LOW_TO_HIGH(m_ctl_b)) || (!state && C2_HIGH_TO_LOW(m_ctl_b))))
{
- LOG(("PIA #%s: CB2 triggering\n", tag()));
+ LOG("PIA #%s: CB2 triggering\n", tag());
// mark the IRQ
m_irq_b2 = 1;
diff --git a/src/devices/machine/gen_latch.cpp b/src/devices/machine/gen_latch.cpp
index 7be65c67943..f41f6df5fca 100644
--- a/src/devices/machine/gen_latch.cpp
+++ b/src/devices/machine/gen_latch.cpp
@@ -26,7 +26,7 @@ const device_type GENERIC_LATCH_16 = &device_creator<generic_latch_16_device>;
generic_latch_base_device::generic_latch_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- m_latch_read(false),
+ m_latch_written(false),
m_data_pending_cb(*this)
{
}
@@ -38,7 +38,16 @@ generic_latch_base_device::generic_latch_base_device(const machine_config &mconf
void generic_latch_base_device::device_start()
{
m_data_pending_cb.resolve_safe();
- save_item(NAME(m_latch_read));
+ save_item(NAME(m_latch_written));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void generic_latch_base_device::device_reset()
+{
+ m_latch_written = false;
}
//-------------------------------------------------
@@ -48,20 +57,20 @@ void generic_latch_base_device::device_start()
READ_LINE_MEMBER(generic_latch_base_device::pending_r)
{
- return !m_latch_read;
+ return m_latch_written ? 1 : 0;
}
//-------------------------------------------------
-// set_latch_read - helper to signal that latch
-// has been read or is waiting to be read
+// set_latch_written - helper to signal that latch
+// has been written or has been read
//-------------------------------------------------
-void generic_latch_base_device::set_latch_read(bool latch_read)
+void generic_latch_base_device::set_latch_written(bool latch_written)
{
- if (m_latch_read != latch_read)
+ if (m_latch_written != latch_written)
{
- m_latch_read = latch_read;
- m_data_pending_cb(!latch_read);
+ m_latch_written = latch_written;
+ m_data_pending_cb(latch_written ? 1 : 0);
}
}
@@ -77,7 +86,7 @@ generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, co
READ8_MEMBER( generic_latch_8_device::read )
{
- set_latch_read(true);
+ set_latch_written(false);
return m_latched_value;
}
@@ -115,13 +124,13 @@ void generic_latch_8_device::sync_callback(void *ptr, s32 param)
{
u8 value = param;
- // if the latch hasn't been read and the value is changed, log a warning
- if (!is_latch_read() && m_latched_value != value)
+ // if the latch has been written and the value is changed, log a warning
+ if (is_latch_written() && m_latched_value != value)
logerror("Warning: latch written before being read. Previous: %02x, new: %02x\n", m_latched_value, value);
// store the new value and mark it not read
m_latched_value = value;
- set_latch_read(false);
+ set_latch_written(true);
}
//-------------------------------------------------
@@ -147,7 +156,7 @@ generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig,
READ16_MEMBER( generic_latch_16_device::read )
{
- set_latch_read(true);
+ set_latch_written(false);
return m_latched_value;
}
@@ -185,13 +194,13 @@ void generic_latch_16_device::sync_callback(void *ptr, s32 param)
{
u16 value = param;
- // if the latch hasn't been read and the value is changed, log a warning
- if (!is_latch_read() && m_latched_value != value)
+ // if the latch has been written and the value is changed, log a warning
+ if (is_latch_written() && m_latched_value != value)
logerror("Warning: latch written before being read. Previous: %02x, new: %02x\n", m_latched_value, value);
// store the new value and mark it not read
m_latched_value = value;
- set_latch_read(false);
+ set_latch_written(true);
}
//-------------------------------------------------
diff --git a/src/devices/machine/gen_latch.h b/src/devices/machine/gen_latch.h
index 4cfa73a1c4c..2c000d2fce7 100644
--- a/src/devices/machine/gen_latch.h
+++ b/src/devices/machine/gen_latch.h
@@ -46,12 +46,13 @@ public:
protected:
virtual void device_start() override;
+ virtual void device_reset() override;
- bool is_latch_read() const { return m_latch_read; }
- void set_latch_read(bool latch_read);
+ bool is_latch_written() const { return m_latch_written; }
+ void set_latch_written(bool latch_written);
private:
- bool m_latch_read;
+ bool m_latch_written;
devcb_write_line m_data_pending_cb;
};
diff --git a/src/devices/machine/mc68681.cpp b/src/devices/machine/mc68681.cpp
index 577b9355c39..2f79b82da1b 100644
--- a/src/devices/machine/mc68681.cpp
+++ b/src/devices/machine/mc68681.cpp
@@ -1,7 +1,9 @@
// license:BSD-3-Clause
// copyright-holders:Mariusz Wojcieszek, R. Belmont
/*
+ 2681 DUART
68681 DUART
+ 28C94 QUART
Written by Mariusz Wojcieszek
Updated by Jonathan Gevaryahu AKA Lord Nightmare
@@ -50,9 +52,12 @@ static const int baud_rate_ACR_1[] = { 75, 110, 134, 150, 300, 600, 1200, 2000,
#define CHANA_TAG "cha"
#define CHANB_TAG "chb"
+#define CHANC_TAG "chc"
+#define CHAND_TAG "chd"
// device type definition
const device_type MC68681 = &device_creator<mc68681_device>;
+const device_type SC28C94 = &device_creator<sc28c94_device>;
const device_type MC68681_CHANNEL = &device_creator<mc68681_channel>;
MACHINE_CONFIG_FRAGMENT( duart68681 )
@@ -60,17 +65,28 @@ MACHINE_CONFIG_FRAGMENT( duart68681 )
MCFG_DEVICE_ADD(CHANB_TAG, MC68681_CHANNEL, 0)
MACHINE_CONFIG_END
+MACHINE_CONFIG_FRAGMENT( quart28c94 )
+ MCFG_DEVICE_ADD(CHANA_TAG, MC68681_CHANNEL, 0)
+ MCFG_DEVICE_ADD(CHANB_TAG, MC68681_CHANNEL, 0)
+ MCFG_DEVICE_ADD(CHANC_TAG, MC68681_CHANNEL, 0)
+ MCFG_DEVICE_ADD(CHAND_TAG, MC68681_CHANNEL, 0)
+MACHINE_CONFIG_END
+
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
-mc68681_device::mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, MC68681, "MC68681 DUART", tag, owner, clock, "mc68681", __FILE__),
+mc68681_base_device::mc68681_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
m_chanA(*this, CHANA_TAG),
m_chanB(*this, CHANB_TAG),
+ m_chanC(*this, CHANC_TAG),
+ m_chanD(*this, CHAND_TAG),
write_irq(*this),
write_a_tx(*this),
write_b_tx(*this),
+ write_c_tx(*this),
+ write_d_tx(*this),
read_inport(*this),
write_outport(*this),
ip3clk(0),
@@ -83,14 +99,24 @@ mc68681_device::mc68681_device(const machine_config &mconfig, const char *tag, d
{
}
+mc68681_device::mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mc68681_base_device(mconfig, MC68681, "MC68681 DUART", tag, owner, clock, "mc68681", __FILE__)
+{
+}
+
+sc28c94_device::sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : mc68681_base_device(mconfig, SC28C94, "SC28C94 QUART", tag, owner, clock, "sc28c94", __FILE__)
+{
+}
+
//-------------------------------------------------
// static_set_clocks - configuration helper to set
// the external clocks
//-------------------------------------------------
-void mc68681_device::static_set_clocks(device_t &device, int clk3, int clk4, int clk5, int clk6)
+void mc68681_base_device::static_set_clocks(device_t &device, int clk3, int clk4, int clk5, int clk6)
{
- mc68681_device &duart = downcast<mc68681_device &>(device);
+ mc68681_base_device &duart = downcast<mc68681_base_device &>(device);
duart.ip3clk = clk3;
duart.ip4clk = clk4;
duart.ip5clk = clk5;
@@ -101,15 +127,17 @@ void mc68681_device::static_set_clocks(device_t &device, int clk3, int clk4, int
device start callback
-------------------------------------------------*/
-void mc68681_device::device_start()
+void mc68681_base_device::device_start()
{
write_irq.resolve_safe();
write_a_tx.resolve_safe();
write_b_tx.resolve_safe();
+ write_c_tx.resolve_safe();
+ write_d_tx.resolve_safe();
read_inport.resolve();
write_outport.resolve_safe();
- duart_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mc68681_device::duart_timer_callback),this), nullptr);
+ duart_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mc68681_base_device::duart_timer_callback),this), nullptr);
save_item(NAME(ACR));
save_item(NAME(IMR));
@@ -125,7 +153,7 @@ void mc68681_device::device_start()
device reset callback
-------------------------------------------------*/
-void mc68681_device::device_reset()
+void mc68681_base_device::device_reset()
{
ACR = 0; /* Interrupt Vector Register */
IVR = 0x0f; /* Interrupt Vector Register */
@@ -141,12 +169,17 @@ void mc68681_device::device_reset()
write_outport(OPR ^ 0xff);
}
-machine_config_constructor mc68681_device::device_mconfig_additions() const
+machine_config_constructor mc68681_base_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( duart68681 );
}
-void mc68681_device::update_interrupts()
+machine_config_constructor sc28c94_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( quart28c94 );
+}
+
+void mc68681_base_device::update_interrupts()
{
/* update SR state and update interrupt ISR state for the following bits:
SRn: bits 7-4: handled elsewhere.
@@ -208,7 +241,7 @@ void mc68681_device::update_interrupts()
}
}
-double mc68681_device::duart68681_get_ct_rate()
+double mc68681_base_device::duart68681_get_ct_rate()
{
double rate = 0.0f;
@@ -250,19 +283,19 @@ double mc68681_device::duart68681_get_ct_rate()
return rate;
}
-uint16_t mc68681_device::duart68681_get_ct_count()
+uint16_t mc68681_base_device::duart68681_get_ct_count()
{
double clock = duart68681_get_ct_rate();
return (duart_timer->remaining() * clock).as_double();
}
-void mc68681_device::duart68681_start_ct(int count)
+void mc68681_base_device::duart68681_start_ct(int count)
{
double clock = duart68681_get_ct_rate();
duart_timer->adjust(attotime::from_hz(clock) * count, 0);
}
-TIMER_CALLBACK_MEMBER( mc68681_device::duart_timer_callback )
+TIMER_CALLBACK_MEMBER( mc68681_base_device::duart_timer_callback )
{
if (ACR & 0x40)
{
@@ -320,13 +353,41 @@ TIMER_CALLBACK_MEMBER( mc68681_device::duart_timer_callback )
}
-READ8_MEMBER( mc68681_device::read )
+READ8_MEMBER( sc28c94_device::read )
+{
+ uint8_t r = 0;
+ offset &= 0x1f;
+
+ if (offset < 0x10)
+ {
+ return mc68681_base_device::read(space, offset, mem_mask);
+ }
+
+ switch (offset)
+ {
+ case 0x10: /* MR1A/MR2C */
+ case 0x11: /* SRC */
+ case 0x13: /* Rx Holding Register C */
+ r = m_chanC->read_chan_reg(offset & 3);
+ break;
+
+ case 0x18: /* MR1D/MR2D */
+ case 0x19: /* SRD */
+ case 0x1b: /* RHRD */
+ r = m_chanD->read_chan_reg(offset & 3);
+ break;
+ }
+
+ return r;
+}
+
+READ8_MEMBER( mc68681_base_device::read )
{
uint8_t r = 0xff;
offset &= 0xf;
- LOG(( "Reading 68681 (%s) reg %x (%s) ", tag(), offset, duart68681_reg_read_names[offset] ));
+ LOG(( "Reading 68681 (%s) reg %x (%s)\n", tag(), offset, duart68681_reg_read_names[offset] ));
switch (offset)
{
@@ -424,7 +485,34 @@ READ8_MEMBER( mc68681_device::read )
return r;
}
-WRITE8_MEMBER( mc68681_device::write )
+WRITE8_MEMBER( sc28c94_device::write )
+{
+ offset &= 0x1f;
+
+ if (offset < 0x10)
+ {
+ mc68681_base_device::write(space, offset, data, mem_mask);
+ }
+
+ switch(offset)
+ {
+ case 0x10: /* MRC */
+ case 0x11: /* CSRC */
+ case 0x12: /* CRC */
+ case 0x13: /* THRC */
+ m_chanC->write_chan_reg(offset&3, data);
+ break;
+
+ case 0x18: /* MRC */
+ case 0x19: /* CSRC */
+ case 0x1a: /* CRC */
+ case 0x1b: /* THRC */
+ m_chanD->write_chan_reg(offset&3, data);
+ break;
+ }
+}
+
+WRITE8_MEMBER( mc68681_base_device::write )
{
offset &= 0x0f;
LOG(( "Writing 68681 (%s) reg %x (%s) with %04x\n", tag(), offset, duart68681_reg_write_names[offset], data ));
@@ -516,7 +604,7 @@ WRITE8_MEMBER( mc68681_device::write )
}
}
-WRITE_LINE_MEMBER( mc68681_device::ip0_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip0_w )
{
uint8_t newIP = (IP_last_state & ~0x01) | ((state == ASSERT_LINE) ? 1 : 0);
@@ -536,7 +624,7 @@ WRITE_LINE_MEMBER( mc68681_device::ip0_w )
IP_last_state = newIP;
}
-WRITE_LINE_MEMBER( mc68681_device::ip1_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip1_w )
{
uint8_t newIP = (IP_last_state & ~0x02) | ((state == ASSERT_LINE) ? 2 : 0);
@@ -556,7 +644,7 @@ WRITE_LINE_MEMBER( mc68681_device::ip1_w )
IP_last_state = newIP;
}
-WRITE_LINE_MEMBER( mc68681_device::ip2_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip2_w )
{
uint8_t newIP = (IP_last_state & ~0x04) | ((state == ASSERT_LINE) ? 4 : 0);
@@ -576,7 +664,7 @@ WRITE_LINE_MEMBER( mc68681_device::ip2_w )
IP_last_state = newIP;
}
-WRITE_LINE_MEMBER( mc68681_device::ip3_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip3_w )
{
uint8_t newIP = (IP_last_state & ~0x08) | ((state == ASSERT_LINE) ? 8 : 0);
@@ -596,21 +684,21 @@ WRITE_LINE_MEMBER( mc68681_device::ip3_w )
IP_last_state = newIP;
}
-WRITE_LINE_MEMBER( mc68681_device::ip4_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip4_w )
{
uint8_t newIP = (IP_last_state & ~0x10) | ((state == ASSERT_LINE) ? 0x10 : 0);
// TODO: special mode for ip4 (Ch. A Rx clock)
IP_last_state = newIP;
}
-WRITE_LINE_MEMBER( mc68681_device::ip5_w )
+WRITE_LINE_MEMBER( mc68681_base_device::ip5_w )
{
uint8_t newIP = (IP_last_state & ~0x20) | ((state == ASSERT_LINE) ? 0x20 : 0);
// TODO: special mode for ip5 (Ch. B Tx clock)
IP_last_state = newIP;
}
-mc68681_channel *mc68681_device::get_channel(int chan)
+mc68681_channel *mc68681_base_device::get_channel(int chan)
{
if (chan == 0)
{
@@ -620,7 +708,7 @@ mc68681_channel *mc68681_device::get_channel(int chan)
return m_chanB;
}
-int mc68681_device::calc_baud(int ch, uint8_t data)
+int mc68681_base_device::calc_baud(int ch, uint8_t data)
{
int baud_rate;
@@ -661,15 +749,16 @@ int mc68681_device::calc_baud(int ch, uint8_t data)
LOG(( "Unsupported transmitter clock: channel %d, clock select = %02x\n", ch, data ));
}
+ //printf("%s ch %d setting baud to %d\n", tag(), ch, baud_rate);
return baud_rate;
}
-void mc68681_device::clear_ISR_bits(int mask)
+void mc68681_base_device::clear_ISR_bits(int mask)
{
ISR &= ~mask;
}
-void mc68681_device::set_ISR_bits(int mask)
+void mc68681_base_device::set_ISR_bits(int mask)
{
ISR |= mask;
}
@@ -690,7 +779,7 @@ mc68681_channel::mc68681_channel(const machine_config &mconfig, const char *tag,
void mc68681_channel::device_start()
{
- m_uart = downcast<mc68681_device *>(owner());
+ m_uart = downcast<mc68681_base_device *>(owner());
m_ch = m_uart->get_ch(this); // get our channel number
save_item(NAME(CR));
@@ -793,15 +882,23 @@ void mc68681_channel::tra_callback()
if ((MR2&0xC0) != 0x80)
{
int bit = transmit_register_get_data_bit();
-// printf("%s ch %d transmit %d\n", tag(), m_ch, bit);
+ //printf("%s ch %d transmit %d\n", tag(), m_ch, bit);
if (m_ch == 0)
{
m_uart->write_a_tx(bit);
}
- else
+ else if (m_ch == 1)
{
m_uart->write_b_tx(bit);
}
+ else if (m_ch == 2)
+ {
+ m_uart->write_c_tx(bit);
+ }
+ else if (m_ch == 3)
+ {
+ m_uart->write_d_tx(bit);
+ }
}
else // must call this to advance the transmitter
{
@@ -1157,7 +1254,7 @@ void mc68681_channel::write_TX(uint8_t data)
printf("Write %02x to TX when TX not ready!\n", data);
}*/
-// printf("%s ch %d Tx %02x\n", tag(), m_ch, data);
+ //printf("%s ch %d Tx %02x\n", tag(), m_ch, data);
tx_ready = 0;
SR &= ~STATUS_TRANSMITTER_READY;
diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h
index f2093fc66cc..b502a33db12 100644
--- a/src/devices/machine/mc68681.h
+++ b/src/devices/machine/mc68681.h
@@ -11,28 +11,38 @@
MCFG_DEVICE_REPLACE(_tag, MC68681, _clock)
#define MCFG_MC68681_IRQ_CALLBACK(_cb) \
- devcb = &mc68681_device::set_irq_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_irq_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_A_TX_CALLBACK(_cb) \
- devcb = &mc68681_device::set_a_tx_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_a_tx_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_B_TX_CALLBACK(_cb) \
- devcb = &mc68681_device::set_b_tx_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_b_tx_cb(*device, DEVCB_##_cb);
// deprecated: use ipX_w() instead
#define MCFG_MC68681_INPORT_CALLBACK(_cb) \
- devcb = &mc68681_device::set_inport_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_inport_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_OUTPORT_CALLBACK(_cb) \
- devcb = &mc68681_device::set_outport_cb(*device, DEVCB_##_cb);
+ devcb = &mc68681_base_device::set_outport_cb(*device, DEVCB_##_cb);
#define MCFG_MC68681_SET_EXTERNAL_CLOCKS(_a, _b, _c, _d) \
- mc68681_device::static_set_clocks(*device, _a, _b, _c, _d);
+ mc68681_base_device::static_set_clocks(*device, _a, _b, _c, _d);
+
+// SC28C94 specific callbacks
+#define MCFG_SC28C94_ADD(_tag, _clock) \
+ MCFG_DEVICE_ADD(_tag, SC28C94, _clock)
+
+#define MCFG_SC28C94_C_TX_CALLBACK(_cb) \
+ devcb = &sc28c94_device::set_c_tx_cb(*device, DEVCB_##_cb);
+
+#define MCFG_SC28C94_D_TX_CALLBACK(_cb) \
+ devcb = &sc28c94_device::set_d_tx_cb(*device, DEVCB_##_cb);
#define MC68681_RX_FIFO_SIZE 3
// forward declaration
-class mc68681_device;
+class mc68681_base_device;
// mc68681_channel class
class mc68681_channel : public device_t, public device_serial_interface
@@ -86,7 +96,7 @@ private:
uint8_t tx_data;
uint8_t tx_ready;
- mc68681_device *m_uart;
+ mc68681_base_device *m_uart;
void write_MR(uint8_t data);
void write_CR(uint8_t data);
@@ -94,34 +104,36 @@ private:
void recalc_framing();
};
-class mc68681_device : public device_t
+class mc68681_base_device : public device_t
{
friend class mc68681_channel;
public:
- mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ mc68681_base_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source);
required_device<mc68681_channel> m_chanA;
required_device<mc68681_channel> m_chanB;
+ optional_device<mc68681_channel> m_chanC;
+ optional_device<mc68681_channel> m_chanD;
// inline configuration helpers
static void static_set_clocks(device_t &device, int clk3, int clk4, int clk5, int clk6);
// API
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ virtual DECLARE_READ8_MEMBER(read);
+ virtual DECLARE_WRITE8_MEMBER(write);
uint8_t get_irq_vector() { m_read_vector = true; return IVR; }
DECLARE_WRITE_LINE_MEMBER( rx_a_w ) { m_chanA->device_serial_interface::rx_w((uint8_t)state); }
DECLARE_WRITE_LINE_MEMBER( rx_b_w ) { m_chanB->device_serial_interface::rx_w((uint8_t)state); }
- template<class _Object> static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_irq.set_callback(object); }
- template<class _Object> static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_a_tx.set_callback(object); }
- template<class _Object> static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_b_tx.set_callback(object); }
- template<class _Object> static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).read_inport.set_callback(object); }
- template<class _Object> static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast<mc68681_device &>(device).write_outport.set_callback(object); }
+ template<class _Object> static devcb_base &set_irq_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_irq.set_callback(object); }
+ template<class _Object> static devcb_base &set_a_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_a_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_b_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_b_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_inport_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).read_inport.set_callback(object); }
+ template<class _Object> static devcb_base &set_outport_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_outport.set_callback(object); }
- devcb_write_line write_irq, write_a_tx, write_b_tx;
+ devcb_write_line write_irq, write_a_tx, write_b_tx, write_c_tx, write_d_tx;
devcb_read8 read_inport;
devcb_write8 write_outport;
int32_t ip3clk, ip4clk, ip5clk, ip6clk;
@@ -166,15 +178,59 @@ private:
uint16_t duart68681_get_ct_count();
void duart68681_start_ct(int count);
int calc_baud(int ch, uint8_t data);
- int get_ch(mc68681_channel *ch) { return (ch == m_chanA) ? 0 : 1; }
void clear_ISR_bits(int mask);
void set_ISR_bits(int mask);
void update_interrupts();
+ int get_ch(mc68681_channel *ch)
+ {
+ if (ch == m_chanA)
+ {
+ return 0;
+ }
+ else if (ch == m_chanB)
+ {
+ return 1;
+ }
+ else if (ch == m_chanC)
+ {
+ return 2;
+ }
+
+ return 3;
+ }
+
mc68681_channel *get_channel(int chan);
};
+class mc68681_device : public mc68681_base_device
+{
+public:
+ mc68681_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+};
+
+class sc28c94_device : public mc68681_base_device
+{
+public:
+ sc28c94_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ template<class _Object> static devcb_base &set_c_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_c_tx.set_callback(object); }
+ template<class _Object> static devcb_base &set_d_tx_cb(device_t &device, _Object object) { return downcast<mc68681_base_device &>(device).write_d_tx.set_callback(object); }
+
+ DECLARE_WRITE_LINE_MEMBER( rx_c_w ) { m_chanC->device_serial_interface::rx_w((uint8_t)state); }
+ DECLARE_WRITE_LINE_MEMBER( rx_d_w ) { m_chanD->device_serial_interface::rx_w((uint8_t)state); }
+
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
+
+protected:
+ virtual machine_config_constructor device_mconfig_additions() const override;
+
+private:
+};
+
extern const device_type MC68681;
+extern const device_type SC28C94;
extern const device_type MC68681_CHANNEL;
#endif //_N68681_H
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 7ba29e26fb7..90cf78d6315 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -72,7 +72,7 @@ void netlist_mame_analog_input_t::device_start()
m_param = dynamic_cast<netlist::param_double_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
}
if (m_mult != 1.0 || m_offset != 0.0)
{
@@ -183,7 +183,7 @@ void netlist_mame_int_input_t::device_start()
m_param = dynamic_cast<netlist::param_int_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
}
}
@@ -215,7 +215,7 @@ void netlist_mame_logic_input_t::device_start()
m_param = dynamic_cast<netlist::param_logic_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
}
}
@@ -282,7 +282,7 @@ void netlist_ram_pointer_t::device_start()
m_param = dynamic_cast<netlist::param_ptr_t *>(p);
if (m_param == nullptr)
{
- fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.cstr());
+ fatalerror("device %s wrong parameter type for %s\n", basetag(), m_param_name.c_str());
}
m_data = (*m_param)();
@@ -375,22 +375,22 @@ void netlist_mame_t::vlog(const plib::plog_level &l, const pstring &ls) const
switch (l)
{
case plib::plog_level::DEBUG:
- m_parent.logerror("netlist DEBUG: %s\n", errstr.cstr());
+ m_parent.logerror("netlist DEBUG: %s\n", errstr.c_str());
break;
case plib::plog_level::INFO:
- m_parent.logerror("netlist INFO: %s\n", errstr.cstr());
+ m_parent.logerror("netlist INFO: %s\n", errstr.c_str());
break;
case plib::plog_level::VERBOSE:
- m_parent.logerror("netlist VERBOSE: %s\n", errstr.cstr());
+ m_parent.logerror("netlist VERBOSE: %s\n", errstr.c_str());
break;
case plib::plog_level::WARNING:
- m_parent.logerror("netlist WARNING: %s\n", errstr.cstr());
+ m_parent.logerror("netlist WARNING: %s\n", errstr.c_str());
break;
case plib::plog_level::ERROR:
- m_parent.logerror("netlist ERROR: %s\n", errstr.cstr());
+ m_parent.logerror("netlist ERROR: %s\n", errstr.c_str());
break;
case plib::plog_level::FATAL:
- emu_fatalerror error("netlist ERROR: %s\n", errstr.cstr());
+ emu_fatalerror error("netlist ERROR: %s\n", errstr.c_str());
throw error;
}
}
@@ -554,38 +554,38 @@ ATTR_COLD void netlist_mame_device_t::save_state()
{
for (auto const & s : netlist().state().save_list())
{
- netlist().log().debug("saving state for {1}\n", s->m_name.cstr());
+ netlist().log().debug("saving state for {1}\n", s->m_name.c_str());
if (s->m_dt.is_float)
{
if (s->m_dt.size == sizeof(double))
{
double *td = s->resolved<double>();
- if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count);
+ if (td != nullptr) save_pointer(td, s->m_name.c_str(), s->m_count);
}
else if (s->m_dt.size == sizeof(float))
{
float *td = s->resolved<float>();
- if (td != nullptr) save_pointer(td, s->m_name.cstr(), s->m_count);
+ if (td != nullptr) save_pointer(td, s->m_name.c_str(), s->m_count);
}
else
- netlist().log().fatal("Unknown floating type for {1}\n", s->m_name.cstr());
+ netlist().log().fatal("Unknown floating type for {1}\n", s->m_name.c_str());
}
else if (s->m_dt.is_integral)
{
if (s->m_dt.size == sizeof(int64_t))
- save_pointer((int64_t *) s->m_ptr, s->m_name.cstr(), s->m_count);
+ save_pointer((int64_t *) s->m_ptr, s->m_name.c_str(), s->m_count);
else if (s->m_dt.size == sizeof(int32_t))
- save_pointer((int32_t *) s->m_ptr, s->m_name.cstr(), s->m_count);
+ save_pointer((int32_t *) s->m_ptr, s->m_name.c_str(), s->m_count);
else if (s->m_dt.size == sizeof(int16_t))
- save_pointer((int16_t *) s->m_ptr, s->m_name.cstr(), s->m_count);
+ save_pointer((int16_t *) s->m_ptr, s->m_name.c_str(), s->m_count);
else if (s->m_dt.size == sizeof(int8_t))
- save_pointer((int8_t *) s->m_ptr, s->m_name.cstr(), s->m_count);
+ save_pointer((int8_t *) s->m_ptr, s->m_name.c_str(), s->m_count);
#if (PHAS_INT128)
else if (s->m_dt.size == sizeof(INT128))
- save_pointer((int64_t *) s->m_ptr, s->m_name.cstr(), s->m_count * 2);
+ save_pointer((int64_t *) s->m_ptr, s->m_name.c_str(), s->m_count * 2);
#endif
else
- netlist().log().fatal("Unknown integral type size {1} for {2}\n", s->m_dt.size, s->m_name.cstr());
+ netlist().log().fatal("Unknown integral type size {1} for {2}\n", s->m_dt.size, s->m_name.c_str());
}
else if (s->m_dt.is_custom)
{
@@ -627,11 +627,11 @@ void netlist_mame_cpu_device_t::device_start()
netlist::detail::net_t *n = netlist().m_nets[i].get();
if (n->is_logic())
{
- state_add(i*2, n->name().cstr(), downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
+ state_add(i*2, n->name().c_str(), downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
}
else
{
- state_add(i*2+1, n->name().cstr(), downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr()).formatstr("%20s");
+ state_add(i*2+1, n->name().c_str(), downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr()).formatstr("%20s");
}
}
@@ -664,7 +664,7 @@ ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(std::ostream &str
{
int dpc = netlist().queue().size() - relpc - 1;
// FIXME: 50 below fixes crash in mame-debugger. It's based on try on error.
- util::stream_format(stream, "%c %s @%10.7f", (relpc == 0) ? '*' : ' ', netlist().queue()[dpc].m_object->name().cstr(),
+ util::stream_format(stream, "%c %s @%10.7f", (relpc == 0) ? '*' : ' ', netlist().queue()[dpc].m_object->name().c_str(),
netlist().queue()[dpc].m_exec_time.as_double());
}
@@ -795,7 +795,7 @@ void netlist_mame_sound_device_t::sound_stream_update(sound_stream &stream, stre
std::unique_ptr<plib::pistream> netlist_source_memregion_t::stream(const pstring &name)
{
- memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(m_name.cstr());
+ memory_region *mem = downcast<netlist_mame_t &>(setup().netlist()).machine().root_device().memregion(m_name.c_str());
return plib::make_unique_base<plib::pistream, plib::pimemstream>(mem->base(), mem->bytes());
}
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 9428da5d348..8466c39e070 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -797,7 +797,7 @@ public:
{
int pos = (upto - m_last_buffer) / m_sample;
if (pos >= BUFSIZE)
- netlist().log().fatal("sound {1}: exceeded BUFSIZE\n", name().cstr());
+ netlist().log().fatal("sound {1}: exceeded BUFSIZE\n", name().c_str());
while (m_last_pos < pos )
{
m_buffer[m_last_pos++] = (stream_sample_t) m_cur;
diff --git a/src/devices/video/zeus2.cpp b/src/devices/video/zeus2.cpp
index c606405c643..2ce5214e463 100644
--- a/src/devices/video/zeus2.cpp
+++ b/src/devices/video/zeus2.cpp
@@ -279,8 +279,9 @@ uint32_t zeus2_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap
READ32_MEMBER( zeus2_device::zeus2_r )
{
int logit = (offset != 0x00 && offset != 0x01 &&
- offset != 0x48 && offset != 0x49 &&
- offset != 0x54 && offset != 0x58 && offset != 0x59 && offset != 0x5a);
+ offset != 0x48 && offset != 0x49
+ && offset != 0x54 && offset != 0x58 && offset != 0x59 && offset != 0x5a
+ );
logit &= LOG_REGS;
uint32_t result = m_zeusbase[offset];
#if TRACK_REG_USAGE
@@ -331,8 +332,8 @@ WRITE32_MEMBER( zeus2_device::zeus2_w )
{
int logit = (offset != 0x08 &&
(offset != 0x20 || data != 0) &&
- offset != 0x40 && offset != 0x41 && offset != 0x48 && offset != 0x49 && offset != 0x4e &&
- offset != 0x50 && offset != 0x51 && offset != 0x57 && offset != 0x58 && offset != 0x59 && offset != 0x5a && offset != 0x5e
+ offset != 0x40 && offset != 0x41 && offset != 0x48 && offset != 0x49 && offset != 0x4e
+ && offset != 0x50 && offset != 0x51 && offset != 0x57 && offset != 0x58 && offset != 0x59 && offset != 0x5a && offset != 0x5e
);
logit &= LOG_REGS;
if (logit)
@@ -461,7 +462,7 @@ void zeus2_device::zeus2_register_update(offs_t offset, uint32_t oldval, int log
break;
case 0x2a:
- // 0x000000c0 = bilenear off
+ // 0x000000c0 = bilinear off
if (logit) logerror("\tRend Force Off");
break;
@@ -665,11 +666,29 @@ void zeus2_device::zeus2_register_update(offs_t offset, uint32_t oldval, int log
logerror("\t[40]=%08X [4E]=%08X\n", m_zeusbase[0x40], m_zeusbase[0x4e]);
break;
- case 0x50:
- {
+ case 0x50: case 0x51: case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5e:
+ // m_zeusbase[0x5e]:
+ // bits 3:0 select which offset triggers an access
+ // bit 4: clear error
+ // bit 5: 24 bit (1) / 32 bit mode (0)
+ // bit 6: enable autoincrement wave address
+ // bit 7 autoincrement desination address?
+ // bit 8 autoincrement row/col address by 1 (0) or 2 (1)
+ if ((offset & 0xf) == (m_zeusbase[0x5e] & 0xf)) {
+
int code = (m_zeusbase[0x50] >> 16) & 0xf;
- if (code == 0x1) {
+ // If the address is auto-increment then don't load new value
+ // In reality address is latched by a write to 0x50
+ if (offset == 0x51 && (m_zeusbase[0x5e] & 0x40)) {
+ m_zeusbase[0x51] = oldval;
+ }
+
+ switch (code) {
+ case 0:
+ // NOP
+ break;
+ case 1:
// SGRAM Special Mode Register Write
if (m_zeusbase[0x51] == 0x00200000) {
// SGRAM Mask Register
@@ -684,106 +703,39 @@ void zeus2_device::zeus2_register_update(offs_t offset, uint32_t oldval, int log
if (m_zeusbase[0x58] != m_zeusbase[0x59])
logerror("zeus2_register_update: Warning! Different fill colors are set.\n");
}
- }
- else if (code == 0x8) {
- // Fast fill
- // Unknown what the exact bit fields are, this is a just a guess
- // Atlantis: 0x00983FFF => clear entire frame buffer, 0x00981FFF => clear one frame
- // crusnexo: 0x007831FF => clear one frame
- // thegrid: 0x008831FF => clear one frame
- // thegrid: 0x0079FFFF => clear entire frame buffer at 51=0 then 51=00800000, only seen at initial tests in thegrid
- uint32_t addr = frame_addr_from_phys_addr(m_zeusbase[0x51]);
- uint32_t numBytes = (m_zeusbase[0x50] & 0xffff) + 1;
- numBytes *= 0x40;
- if (m_zeusbase[0x50] & 0x10000) {
- addr = 0x0;
- numBytes = WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8;
- //printf("Clearing buffer: numBytes: %08X addr: %08X reg50: %08X\n", numBytes, addr, m_zeusbase[0x50]);
- }
- if (logit)
- logerror(" -- Clearing buffer: numBytes: %08X addr: %08X reg51: %08X", numBytes, addr, m_zeusbase[0x51]);
- memset(&m_frameColor[addr], m_fill_color, numBytes);
- memset(&m_frameDepth[addr], m_fill_depth, numBytes);
- }
- else if ((m_zeusbase[0x5e] >> 16) != 0xf208 && !(m_zeusbase[0x5e] & 0xffff)) {
- /* If 0x5e==0xf20a0000 (atlantis) or 0xf20d0000 (the grid) then process the read/write now */
- /*
- m_zeusbase[0x5e]:
- bit 0-1: which register triggers write through
- bit 3: enable write through via these registers
- bit 4: seems to be set during reads, when 0x51 is used for latching
- bit 5: unknown, currently used to specify ordering, but this is suspect
- bit 6: enable autoincrement on write through
- */
- if (code == 0x9)
+ break;
+ case 0x2:
+ frame_read();
+ break;
+ case 0x8:
{
- frame_write();
- }
- else if (code == 0x2) {
- /* Do the read */
- frame_read();
+ // Fast fill
+ // Atlantis: 0x00983FFF => clear entire frame buffer, 0x00981FFF => clear one frame
+ // crusnexo: 0x007831FF => clear one frame
+ // thegrid: 0x008831FF => clear one frame
+ // thegrid: 0x0079FFFF => clear entire frame buffer at 51=0 then 51=00800000, only seen at initial tests in thegrid
+ uint32_t addr = frame_addr_from_phys_addr(m_zeusbase[0x51]);
+ uint32_t numBytes = (m_zeusbase[0x50] & 0xffff) + 1;
+ numBytes *= 0x40;
+ if (m_zeusbase[0x50] & 0x10000) {
+ addr = 0x0;
+ numBytes = WAVERAM1_WIDTH * WAVERAM1_HEIGHT * 8;
+ //printf("Clearing buffer: numBytes: %08X addr: %08X reg50: %08X\n", numBytes, addr, m_zeusbase[0x50]);
+ }
+ if (logit)
+ logerror(" -- Clearing buffer: numBytes: %08X addr: %08X reg51: %08X", numBytes, addr, m_zeusbase[0x51]);
+ memset(&m_frameColor[addr], m_fill_color, numBytes);
+ memset(&m_frameDepth[addr], m_fill_depth, numBytes);
}
- /* make sure we log anything else */
- //else if (logit || m_zeusbase[0x50] != 0x0)
- // logerror("\tw[50]=%08X [5E]=%08X\n", m_zeusbase[0x50], m_zeusbase[0x5e]);
- }
- }
- break;
- case 0x51:
- // Set rendering location
- /* in this mode, crusnexo expects the reads to immediately latch */
- //if ((m_zeusbase[0x50] == 0x00a20000) || (m_zeusbase[0x50] == 0x00720000))
- if (m_zeusbase[0x50] == 0x00a20000)
- oldval = m_zeusbase[0x51];
-
- /* this is the address, except in read mode, where it latches values */
- if ((m_zeusbase[0x5e] & 0x10) || (m_zeusbase[0x50] == 0x00a20000))
- {
- m_zeusbase[0x51] = oldval;
- frame_read();
- }
- break;
-
- case 0x57:
- /* thegrid uses this to write either left or right halves of pixels */
- //if (m_zeusbase[0x50] == 0x00e90000)
- //{
- // uint32_t addr = frame_addr_from_reg51();
- // if (m_zeusbase[0x57] & 1)
- // m_frameColor[addr] = m_zeusbase[0x58];
- // if (m_zeusbase[0x57] & 4)
- // m_frameColor[addr+1] = m_zeusbase[0x59];
- //}
-
- ///* make sure we log anything else */
- //else if (logit)
- // logerror("\t[50]=%08X [5E]=%08X\n", m_zeusbase[0x50], m_zeusbase[0x5e]);
- break;
-
- case 0x58:
- case 0x59:
- case 0x5a:
- /* if we're in write mode, process it */
- if (m_zeusbase[0x50] == 0x00890000)
- {
- /*
- m_zeusbase[0x5e]:
- bit 0-1: which register triggers write through
- bit 3: enable write through via these registers
- bit 4: seems to be set during reads, when 0x51 is used for latching
- bit 5: unknown, currently used to specify ordering, but this is suspect
- bit 6: enable autoincrement on write through
- */
- if ((m_zeusbase[0x5e] & 0x08) && (offset & 3) == (m_zeusbase[0x5e] & 3))
- {
+ break;
+ case 0x9:
frame_write();
+ break;
+ default:
+ logerror("unknown code = %x offset = %x", code, offset);
+ break;
}
}
-
- /* make sure we log anything else */
- else if ((m_zeusbase[0x5e] >> 16) == 0xf208)
- if (logit)
- logerror("\t[50]=%08X [5E]=%08X", m_zeusbase[0x50], m_zeusbase[0x5e]);
break;
// 0x60, 0x61, 0x62 Translation matrix, set using fifo command
@@ -1025,7 +977,7 @@ if (subregdata_count[which] < 256)
break;
case 0x0b:
- if (logit) logerror("\t(R%02X) = %4i Pixel ALU IntB", which, value);
+ if (logit) logerror("\t(R%02X) = %4i Pixel ALU IntB (Obj Light Color)", which, value);
break;
case 0x0c:
@@ -1365,7 +1317,7 @@ void zeus2_device::zeus2_draw_model(uint32_t baseaddr, uint16_t count, int logit
logerror("texdata\n");
}
else if (logit)
- logerror("unknown offset\n");
+ logerror("unknown offset %08X %08X\n", databuffer[0], databuffer[1]);
break;
case 0x31: /* thegrid */
@@ -1469,9 +1421,14 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
// int16_t normal[3];
// int32_t rotnormal[3];
- if (logit)
- m_state->logerror("quad %d\n", m_state->zeus_quad_size);
-
+ if (logit) {
+ m_state->logerror("quad %d", m_state->zeus_quad_size);
+#if PRINT_TEX_INFO
+ m_state->logerror(" %s\n", m_state->tex_info());
+#else
+ m_state->logerror("\n");
+#endif
+ }
//if (machine().input().code_pressed(KEYCODE_Q) && (m_state->m_renderRegs[0x5] != 0x1fdf00)) return;
//if (machine().input().code_pressed(KEYCODE_E) && (m_state->m_renderRegs[0x5] != 0x07f540)) return;
//if (machine().input().code_pressed(KEYCODE_R) && (m_state->m_renderRegs[0x5] != 0x081580)) return;
@@ -1640,48 +1597,51 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
y *= fScale;
z *= fScale;
}
+#if PRINT_TEX_INFO
+ if (logit && i == 0) {
+ m_state->check_tex(texdata, z, m_state->zeus_matrix[2][2], m_state->zeus_point[2]);
+ }
+#endif
vert[i].x = x * m_state->zeus_matrix[0][0] + y * m_state->zeus_matrix[0][1] + z * m_state->zeus_matrix[0][2];
vert[i].y = x * m_state->zeus_matrix[1][0] + y * m_state->zeus_matrix[1][1] + z * m_state->zeus_matrix[1][2];
vert[i].p[0] = x * m_state->zeus_matrix[2][0] + y * m_state->zeus_matrix[2][1] + z * m_state->zeus_matrix[2][2];
- if (1 || !(m_state->m_renderRegs[0x14] & 0x000001)) {
+ if (1) {
vert[i].x += m_state->zeus_point[0];
vert[i].y += m_state->zeus_point[1];
vert[i].p[0] += m_state->zeus_point[2];
}
- //if (0)
- // //vert[i].p[0] += m_state->zbase;
- // vert[i].p[0] += reinterpret_cast<float&>(m_state->m_zeusbase[0x63]);
- //else {
+
+ if (0) {
int shift;
shift = 1024 >> m_state->m_zeusbase[0x6c];
vert[i].p[0] += shift;
- // //float zScale = reinterpret_cast<float&>(m_state->m_zeusbase[0x63]);
- // //vert[i].p[0] += zScale;
- //}
+ }
vert[i].p[2] += (texdata >> 16) << 2;
vert[i].p[1] *= 256.0f / 4.0f;
vert[i].p[2] *= 256.0f / 4.0f;
// back face cull using polygon normal and first vertex
- if (1 && i == 0)
+ if (0 && i == 0)
{
- int8_t normal[3];
float rotnormal[3];
+ int8_t normal[3];
normal[0] = databuffer[0] >> 0;
normal[1] = databuffer[0] >> 8;
normal[2] = databuffer[0] >> 16;
+ //m_state->logerror("norm: %i %i %i\n", normal[0], normal[1], normal[2]);
+ if (normal[2] != -128) {
+ rotnormal[0] = normal[0] * m_state->zeus_matrix[0][0] + normal[1] * m_state->zeus_matrix[0][1] + normal[2] * m_state->zeus_matrix[0][2];
+ rotnormal[1] = normal[0] * m_state->zeus_matrix[1][0] + normal[1] * m_state->zeus_matrix[1][1] + normal[2] * m_state->zeus_matrix[1][2];
+ rotnormal[2] = normal[0] * m_state->zeus_matrix[2][0] + normal[1] * m_state->zeus_matrix[2][1] + normal[2] * m_state->zeus_matrix[2][2];
- rotnormal[0] = normal[0] * m_state->zeus_matrix[0][0] + normal[1] * m_state->zeus_matrix[0][1] + normal[2] * m_state->zeus_matrix[0][2];
- rotnormal[1] = normal[0] * m_state->zeus_matrix[1][0] + normal[1] * m_state->zeus_matrix[1][1] + normal[2] * m_state->zeus_matrix[1][2];
- rotnormal[2] = normal[0] * m_state->zeus_matrix[2][0] + normal[1] * m_state->zeus_matrix[2][1] + normal[2] * m_state->zeus_matrix[2][2];
-
- float dot = rotnormal[0] * vert[0].x + rotnormal[1] * vert[0].y + rotnormal[2] * vert[0].p[0];
+ float dot = rotnormal[0] * vert[0].x + rotnormal[1] * vert[0].y + rotnormal[2] * vert[0].p[0];
- if (dot >= 0)
- return;
+ if (dot >= 0)
+ return;
+ }
}
@@ -1697,13 +1657,21 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
unknown[0], unknown[1], unknown[2], unknown[3], unknown[4], unknown[5], unknown[6], unknown[7],
unknownFloat[0], unknownFloat[1], unknownFloat[2], unknownFloat[3]);
}
- bool enable_perspective = true; // !(m_state->m_renderRegs[0x14] & 0x2);
- float clipVal = enable_perspective ? 1.0f / 512.0f / 4.0f : 0.0f;
- //float clipVal = m_state->m_zbufmin / 4096.0f;
- numverts = this->zclip_if_less(4, &vert[0], &clipvert[0], 4, clipVal);
- if (numverts < 3)
- return;
-
+ //bool enable_perspective = true; // !(m_state->m_renderRegs[0x14] & 0x2);
+ //float clipVal = enable_perspective ? 1.0f / 512.0f / 4.0f : 0.0f;
+ float clipVal = m_state->m_zbufmin / 4096.0f;
+ if (1) {
+ numverts = this->zclip_if_less(4, &vert[0], &clipvert[0], 4, clipVal);
+ if (numverts < 3)
+ return;
+ }
+ else {
+ numverts = 4;
+ clipvert[0] = vert[0];
+ clipvert[1] = vert[1];
+ clipvert[2] = vert[2];
+ clipvert[3] = vert[3];
+ }
float xOrigin = reinterpret_cast<float&>(m_state->m_zeusbase[0x6a]);
float yOrigin = reinterpret_cast<float&>(m_state->m_zeusbase[0x6b]);
@@ -1712,31 +1680,38 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
maxx = maxy = -1000.0f;
for (i = 0; i < numverts; i++)
{
+ if (0 && (m_state->m_renderRegs[0x14] & 0x1)) {
+ clipvert[i].p[0] += reinterpret_cast<float&>(m_state->m_zeusbase[0x63]);
+ }
// mwskinsa has R14=0x40a1 for tips box which has z=0
//if (!(m_state->m_renderRegs[0x14] & 0x1)) {
- if (enable_perspective) {
+ //if (enable_perspective) {
// 412.0f here works for crusnexo
// 1024.0f works for mwskinsa
- float ooz = oozBase / clipvert[i].p[0];
+ float ooz = oozBase / (clipvert[i].p[0] + (1024 >> m_state->m_zeusbase[0x6c]));
+ //ooz = oozBase / (oozBase - clipvert[i].p[0]);
//float ooz = 1024.0f / clipvert[i].p[0];
//float ooz = float(1 << m_state->m_zeusbase[0x6c]) / clipvert[i].p[0];
clipvert[i].x *= ooz;
clipvert[i].y *= ooz;
- }
+ //}
if (1) {
//clipvert[i].x += 256.5f / 1.0f;
//clipvert[i].y += 200.5f / 1.0f;
clipvert[i].x += xOrigin;
clipvert[i].y += yOrigin;
+ //clipvert[i].p[0] += reinterpret_cast<float&>(m_state->m_zeusbase[0x63]);
+ //clipvert[i].p[0] *= -1.0f;
}
- clipvert[i].p[0] *= 65536.0f * 16.0f;
+ //clipvert[i].p[0] *= 65536.0f * 16.0f;
+ clipvert[i].p[0] *= 4096.0f;
maxx = std::max(maxx, clipvert[i].x);
maxy = std::max(maxy, clipvert[i].y);
if (logextra & logit)
- m_state->logerror("\t\t\tTranslated=(%f,%f)\n", (double)clipvert[i].x, (double)clipvert[i].y);
+ m_state->logerror("\t\t\tTranslated=(%f,%f, %f) scale = %f\n", (double)clipvert[i].x, (double)clipvert[i].y, (double)clipvert[i].p[0], ooz);
}
for (i = 0; i < numverts; i++)
{
@@ -1807,7 +1782,7 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
extra.solidcolor = 0;//m_zeusbase[0x00] & 0x7fff;
extra.zbufmin = m_state->m_zbufmin;
extra.alpha = 0;//m_zeusbase[0x4e];
- extra.transcolor = 0x100; // (texmode & 0x100) ? 0 : 0x100;
+ extra.transcolor = 0; // (texmode & 0x100) ? 0 : 0x100;
extra.texbase = WAVERAM_BLOCK0_EXT(m_state->zeus_texbase);
extra.palbase = m_state->waveram0_ptr_from_expanded_addr(m_state->m_zeusbase[0x41]);
//extra.depth_test_enable = !(m_state->m_renderRegs[0x40] & 0x020000);
@@ -1817,7 +1792,7 @@ void zeus2_renderer::zeus2_draw_quad(const uint32_t *databuffer, uint32_t texdat
//extra.depth_test_enable = !(m_state->m_renderRegs[0x40] & 0x000002);
//extra.depth_test_enable = true; // (texmode & 0x0010);
extra.depth_write_enable = true;
- extra.get_texel = (m_state->m_palSize==256) ? m_state->get_texel_8bit : m_state->get_texel_4bit;
+ extra.get_texel = ((texmode & 0x3) == 0) ? m_state->get_texel_4bit : m_state->get_texel_8bit;
// Note: Before being converted to the "poly.h" interface, this used to call the polylgcy function
// poly_render_quad_fan. The behavior seems to be the same as it once was after a few short
// tests, but the (numverts == 5) statement below may actually be a quad fan instead of a 5-sided
@@ -1872,12 +1847,14 @@ void zeus2_renderer::render_poly_8bit(int32_t scanline, const extent_t& extent,
int u1 = (u0 + 1);
int v1 = (v0 + 1);
uint8_t texel0 = object.get_texel(texbase, v0, u0, texwidth);
- if (texel0 == transcolor)
- continue;
+ //if (texel0 == transcolor)
+ // continue;
uint8_t texel1 = object.get_texel(texbase, v0, u1, texwidth);
uint8_t texel2 = object.get_texel(texbase, v1, u0, texwidth);
uint8_t texel3 = object.get_texel(texbase, v1, u1, texwidth);
//if (texel0 != transcolor)
+ if ((texel0 != transcolor) && (texel1 != transcolor) && (texel2 != transcolor) && (texel3 != transcolor))
+ //if (1)
{
uint32_t color0 = m_state->m_pal_table[texel0];
uint32_t color1 = m_state->m_pal_table[texel1];
@@ -1929,3 +1906,123 @@ void zeus2_device::log_render_info(uint32_t texdata)
logerror(" %02X=%08X", i, m_zeusbase[i]);
logerror("\n");
}
+
+#if PRINT_TEX_INFO
+#include <iomanip>
+
+void zeus2_device::check_tex(uint32_t &texmode, float &zObj, float &zMat, float &zOff)
+{
+ if (tex_map.count(zeus_texbase) == 0) {
+ std::string infoStr;
+ std::stringstream infoStream;
+ infoStream << "tex=0x" << std::setw(8) << std::setfill('0') << std::hex << zeus_texbase << " ";
+ infoStream << "pal=0x" << std::setw(4) << std::setfill('0') << (m_curPalTableSrc>>16) << ", 0x" << std::setw(4) << (m_curPalTableSrc & 0xffff) << " ";
+ infoStream << "texdata=" << std::setw(8) << std::hex << texmode << " ";
+ infoStream << "(6c)=" << m_zeusbase[0x6c] << " ";
+ infoStream << "(63)=" << std::dec << reinterpret_cast<float&>(m_zeusbase[0x63]) << " ";
+ infoStream << "zObj=" << std::dec << zObj << " ";
+ infoStream << "zMat=" << std::dec << zMat << " ";
+ infoStream << "zOff=" << std::dec << zOff << " ";
+ infoStream << "R40=" << std::setw(6) << std::hex << m_renderRegs[0x40] << " ";
+ infoStream << "R14=" << m_renderRegs[0x14] << " ";
+ infoStream << "R0C=" << std::setw(3) << m_renderRegs[0x0c] << " ";
+ infoStream << "R0D=" << std::setw(3) << m_renderRegs[0x0d] << " ";
+ infoStr += infoStream.str();
+ infoStr += tex_info();
+
+ tex_map.insert(std::pair<uint32_t, std::string>(zeus_texbase, infoStr));
+ osd_printf_info("%s\n", infoStr.c_str());
+ }
+}
+
+std::string zeus2_device::tex_info(void)
+{
+ std::string retVal;
+ switch (zeus_texbase) {
+ // crusnexo
+ case 0x01fc00: retVal = "credits / insert coin"; break;
+ case 0x1dc000: retVal = "copywrite text"; break;
+ case 0x0e7400: retVal = "tire"; break;
+ case 0x0e8800: retVal = "star behind tire"; break;
+ case 0x0e6800: retVal = "crusn exotica text"; break;
+ case 0x02a400: retVal = "Yellow Letters / Numbers"; break;
+ case 0x1fd000: retVal = "Star burst in license plate screen"; break;
+ case 0x1e9800: retVal = "Red Letter in license plate screen"; break;
+ case 0x0c1c00: retVal = "Car parts"; break;
+ case 0x0006f000: retVal = "license plate background"; break;
+ case 0x0006f400: retVal = "blue on white license plate names"; break;
+ case 0x00047800: retVal = "baby body"; break;
+ case 0x000e7000: retVal = "crusn exotica yellow glow"; break;
+ case 0x0002b000: retVal = "blue crusn stencil behind leader list"; break;
+ case 0x001f4800: retVal = "number keypad"; break;
+ case 0x001e7800: retVal = "register now logo"; break;
+ case 0x001e5000: retVal = "blue start game / enter code / earn miles"; break;
+ case 0x0001c800: retVal = "black letters silver back track select / crusn"; break;
+ case 0x001df400: retVal = "first place / free race logo"; break;
+ case 0x001ddc00: retVal = "secret car logo"; break;
+ case 0x0006e800: retVal = "???"; break;
+ case 0x001f1c00: retVal = "black 0-9 on silver background"; break;
+ case 0x001ec800: retVal = "black on silver holland/amazon/sahara"; break;
+ case 0x001f7800: retVal = "license plate background white"; break;
+ case 0x001f7000: retVal = "red Hot Times writing"; break;
+ case 0x001eb000: retVal = "black numbers 0-10 on silver background"; break;
+ case 0x00100800: retVal = "sunset and stars sky background"; break;
+ case 0x00108c00: retVal = "asphalt surface"; break;
+ case 0x0010c000: retVal = "wood surface?"; break;
+ case 0x0010e400: retVal = "palm tree"; break;
+ case 0x00118c00: retVal = "highway green signs"; break;
+ case 0x000f6400: retVal = "glowing feather?"; break;
+ case 0x00112c00: retVal = "fancy street lamps"; break;
+ case 0x00032400: retVal = "lady driver body"; break;
+ case 0x000b5400: retVal = "blue firebird car"; break;
+ case 0x00089c00: retVal = "brown hummer car"; break;
+ case 0x00110c00: retVal = "oak tree"; break;
+ case 0x00115400: retVal = "welcome to las vegas sign"; break;
+ case 0x000f3c00: retVal = "star or headlight?"; break;
+ case 0x00127400: retVal = "another (lod) star or headlight?"; break;
+
+
+ // mwskinsa
+ case 0x1fdf00: retVal = "Skins Tip Box, s=256"; break;
+ case 0x07f540: retVal = "Left main intro"; break;
+ case 0x081580: retVal = "Right main intro"; break;
+ case 0x14db00: retVal = "silver letter b, s=64"; break;
+ case 0x14d880: retVal = "letter a"; break;
+ case 0x14e000: retVal = "letter d"; break;
+ case 0x0014dd80: retVal = "silver letter c, s=64"; break;
+ case 0x0014fb80: retVal = "silver letter o, s=64"; break;
+ case 0x0014ec80: retVal = "silver letter i, s=64"; break;
+ case 0x0014f900: retVal = "silver letter n, s=64"; break;
+ case 0x00150580: retVal = "silver letter s, s=64"; break;
+ case 0x00150800: retVal = "silver letter t, s=64"; break;
+ case 0x00150300: retVal = "silver letter r, s=64"; break;
+ case 0x0014e780: retVal = "silver letter g, s=64"; break;
+ case 0x00153280: retVal = "silver letter C, s=64"; break;
+ case 0x0014e280: retVal = "silver letter e, s=64"; break;
+ case 0x0014b800: retVal = "silver letter O, s=64"; break;
+ case 0x00152d80: retVal = "silver letter A, s=64"; break;
+ case 0x0014f680: retVal = "silver letter m, s=64"; break;
+ case 0x00142b40: retVal = "black screen?"; break;
+ case 0x00004740: retVal = "picture bridge over water, s=256"; break;
+ case 0x00005c80: retVal = "picture water shore, s=256"; break;
+ case 0x000030c0: retVal = "left leaderboard background graphics, s=256"; break;
+ case 0x00003c00: retVal = "right leaderboard background graphics, s=256"; break;
+ case 0x00040bc0: retVal = "extreme mode, s=256"; break;
+ case 0x00091630: retVal = "photo wild eye guy, s=64"; break;
+ case 0x00159d80: retVal = "white M s=32, t=4"; break;
+ case 0x0015a080: retVal = "white 9 s=32, t=4"; break;
+ case 0x00159f00: retVal = "white P s=32, t=4"; break;
+ case 0x00145a40: retVal = "white crossbar? s=32, t=4"; break;
+ case 0x00145c40: retVal = "white crossbar2? s=32, t=4"; break;
+ case 0x00159300: retVal = "white _ s=32, t=4"; break;
+ case 0x00158d00: retVal = "white 1 s=32, t=4"; break;
+ case 0x00158e80: retVal = "white 4 s=32, t=4"; break;
+ case 0x0001c080: retVal = "maybe checkboard"; break;
+
+ // thegrid
+ //case 0x0001c080: retVal = "maybe checkboard"; break;
+ default: retVal = "Unknown"; break;
+ }
+ return retVal;
+}
+#endif
diff --git a/src/devices/video/zeus2.h b/src/devices/video/zeus2.h
index 960eefbd8c6..4c53d5b2dbe 100644
--- a/src/devices/video/zeus2.h
+++ b/src/devices/video/zeus2.h
@@ -22,6 +22,7 @@
#define DUMP_WAVE_RAM 0
#define TRACK_REG_USAGE 0
+#define PRINT_TEX_INFO 0
#define WAVERAM0_WIDTH 1024
#define WAVERAM0_HEIGHT 2048
@@ -154,6 +155,10 @@ public:
enum { THEGRID, CRUSNEXO, MWSKINS };
int m_system;
+#if PRINT_TEX_INFO
+ void check_tex(uint32_t &texmode, float &zObj, float &zMat, float &zOff);
+ std::string tex_info(void);
+#endif
protected:
// device-level overrides
@@ -173,6 +178,7 @@ private:
void log_fifo_command(const uint32_t *data, int numwords, const char *suffix);
void print_fifo_command(const uint32_t *data, int numwords, const char *suffix);
void log_render_info(uint32_t texdata);
+
/*************************************
* Member variables
*************************************/
@@ -186,6 +192,10 @@ private:
int m_yScale;
+#if PRINT_TEX_INFO
+ std::map<uint32_t, std::string> tex_map;
+#endif
+
#if TRACK_REG_USAGE
struct reg_info
{
diff --git a/src/emu/natkeyboard.cpp b/src/emu/natkeyboard.cpp
index fd39bc7b5e0..a5d856a20e9 100644
--- a/src/emu/natkeyboard.cpp
+++ b/src/emu/natkeyboard.cpp
@@ -372,7 +372,13 @@ void natural_keyboard::set_in_use(bool usage)
for (auto &port : machine().ioport().ports())
for (ioport_field &field : port.second->fields())
if (field.type() == IPT_KEYBOARD)
+ {
field.live().lockout = usage;
+
+ // clear pressed status when going out of use
+ if (!usage)
+ field.set_value(0);
+ }
}
}
@@ -722,8 +728,23 @@ void natural_keyboard::timer(void *ptr, int param)
const bool new_keydown = !m_status_keydown;
const keycode_map_entry *const code = find_code(m_buffer[m_bufbegin]);
if (code != nullptr)
- for (int fieldnum = 0; fieldnum < ARRAY_LENGTH(code->field) && code->field[fieldnum] != nullptr; fieldnum++)
- code->field[fieldnum]->set_value(new_keydown);
+ {
+ for (int fieldnum = 0; fieldnum < ARRAY_LENGTH(code->field); fieldnum++)
+ {
+ ioport_field *const field = code->field[fieldnum];
+ if (field == nullptr)
+ break;
+
+ // special handling for toggle fields
+ if (field->live().toggle)
+ {
+ if (new_keydown)
+ field->set_value(!field->digital_value());
+ }
+ else
+ field->set_value(new_keydown);
+ }
+ }
// proceed to next character when keydown expires
if (!new_keydown)
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index d587f691e56..3dc6711c406 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -8,35 +8,6 @@
#include "nld_opamps.h"
#include "devices/net_lib.h"
-NETLIST_START(opamp_lm3900)
-
- /*
- * Fast norton opamp model without bandwidth
- */
-
- /* Terminal definitions for calling netlists */
-
- ALIAS(PLUS, R1.1) // Positive input
- ALIAS(MINUS, R2.1) // Negative input
- ALIAS(OUT, G1.OP) // Opamp output ...
- ALIAS(VM, G1.ON) // V- terminal
- ALIAS(VP, DUMMY.I) // V+ terminal
-
- DUMMY_INPUT(DUMMY)
-
- /* The opamp model */
-
- RES(R1, 1)
- RES(R2, 1)
- NET_C(R1.1, G1.IP)
- NET_C(R2.1, G1.IN)
- NET_C(R1.2, R2.2, G1.ON)
- VCVS(G1)
- PARAM(G1.G, 10000000)
- //PARAM(G1.RI, 1)
- PARAM(G1.RO, RES_K(8))
-
-NETLIST_END()
namespace netlist
{
diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h
index 5d9825d4b21..95060dfdbd3 100644
--- a/src/lib/netlist/analog/nld_opamps.h
+++ b/src/lib/netlist/analog/nld_opamps.h
@@ -23,15 +23,10 @@
NET_REGISTER_DEV(OPAMP, name) \
NETDEV_PARAMI(name, MODEL, model)
-#define LM3900(name) \
- SUBMODEL(opamp_lm3900, name)
-
// ----------------------------------------------------------------------------------------
// Devices ...
// ----------------------------------------------------------------------------------------
-NETLIST_EXTERNAL(opamp_lm3900)
-
namespace netlist
{
namespace devices
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index 5250135feb8..9f23283ac6b 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -63,7 +63,7 @@ NETLIST_END()
#define ENTRY1(nic, name, defparam) factory.register_device<nic>( # name, xstr(nic), defparam );
#define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam)
-#define NETLIB_DEVICE_DECL(chip) extern factory_creator_ptr_t decl_ ## chip;
+#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip;
#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) );
#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
@@ -72,7 +72,7 @@ namespace netlist
{
namespace devices
{
-static void initialize_factory(factory_list_t &factory)
+static void initialize_factory(factory::list_t &factory)
{
ENTRY(R, RES, "R")
ENTRY(POT, POT, "R")
@@ -80,15 +80,15 @@ static void initialize_factory(factory_list_t &factory)
ENTRY(C, CAP, "C")
ENTRY(L, IND, "L")
ENTRY(D, DIODE, "MODEL")
- ENTRY(VCVS, VCVS, "-")
- ENTRY(VCCS, VCCS, "-")
- ENTRY(CCCS, CCCS, "-")
- ENTRY(LVCCS, LVCCS, "-")
+ ENTRY(VCVS, VCVS, "")
+ ENTRY(VCCS, VCCS, "")
+ ENTRY(CCCS, CCCS, "")
+ ENTRY(LVCCS, LVCCS, "")
ENTRY(VS, VS, "V")
ENTRY(CS, CS, "I")
ENTRY(OPAMP, OPAMP, "MODEL")
- ENTRYX(dummy_input, DUMMY_INPUT, "-")
- ENTRYX(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly
+ ENTRYX(dummy_input, DUMMY_INPUT, "")
+ ENTRYX(frontier, FRONTIER_DEV, "+I,+G,+Q") // not intended to be used directly
ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
ENTRY(QBJT_EB, QBJT_EB, "MODEL")
ENTRY(QBJT_switch, QBJT_SW, "MODEL")
@@ -96,106 +96,107 @@ static void initialize_factory(factory_list_t &factory)
ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY")
ENTRYX(analog_input, ANALOG_INPUT, "IN")
ENTRYX(log, LOG, "+I")
- ENTRYX(logD, LOGD, "+I,I2")
+ ENTRYX(logD, LOGD, "+I,+I2")
ENTRYX(clock, CLOCK, "FREQ")
ENTRYX(extclock, EXTCLOCK, "FREQ")
ENTRYX(mainclock, MAINCLOCK, "FREQ")
- ENTRYX(gnd, GND, "-")
- ENTRYX(netlistparams, PARAMETER, "-")
+ ENTRYX(gnd, GND, "")
+ ENTRYX(netlistparams, PARAMETER, "")
ENTRY(solver, SOLVER, "FREQ")
- ENTRYX(res_sw, RES_SWITCH, "+IN,P1,P2")
- ENTRY(switch1, SWITCH, "-")
- ENTRY(switch2, SWITCH2, "-")
- ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R")
- ENTRYX(nicDelay, NETDEV_DELAY, "-")
- ENTRYX(2716, EPROM_2716, "+GQ,EPQ,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10")
- ENTRYX(2102A, RAM_2102A, "+CEQ,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,RWQ,DI")
- ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,B,C,D")
- ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ")
- ENTRYX(7473, TTL_7473, "+CLK,J,K,CLRQ")
- ENTRYX(7473A, TTL_7473A, "+CLK,J,K,CLRQ")
- ENTRYX(7474, TTL_7474, "+CLK,D,CLRQ,PREQ")
- ENTRYX(7475, TTL_7475, "-")
- ENTRYX(7477, TTL_7477, "-")
- ENTRYX(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0")
- ENTRYX(7485, TTL_7485, "+A0,A1,A2,A3,B0,B1,B2,B3,LTIN,EQIN,GTIN")
- ENTRYX(7490, TTL_7490, "+A,B,R1,R2,R91,R92")
- ENTRYX(7493, TTL_7493, "+CLKA,CLKB,R1,R2")
- ENTRYX(74107, TTL_74107, "+CLK,J,K,CLRQ")
- ENTRYX(74107A, TTL_74107A, "+CLK,J,K,CLRQ")
- ENTRYX(74123, TTL_74123, "-")
- ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G")
- ENTRYX(74161, TTL_74161, "+A,B,C,D,CLRQ,LOADQ,CLK,ENABLEP,ENABLET")
- ENTRYX(74165, TTL_74165, "+CLK,CLKINH,SH_LDQ,SER,A,B,C,D,E,F,G,H")
- ENTRYX(74166, TTL_74166, "+CLK,CLKINH,SH_LDQ,SER,A,B,C,D,E,F,G,H,CLRQ")
- ENTRYX(74174, TTL_74174, "+CLK,D1,D2,D3,D4,D5,D6,CLRQ")
- ENTRYX(74175, TTL_74175, "+CLK,D1,D2,D3,D4,CLRQ")
- ENTRYX(74192, TTL_74192, "+A,B,C,D,CLEAR,LOADQ,CU,CD")
- ENTRYX(74193, TTL_74193, "+A,B,C,D,CLEAR,LOADQ,CU,CD")
- ENTRYX(74194, TTL_74194, "+CLK,S0,S1,SRIN,A,B,C,D,SLIN,CLRQ")
- ENTRYX(74365, TTL_74365, "+G1Q,G2Q,A1,A2,A3,A4,A5,A6")
- //ENTRY(74279, TTL_74279, "-") // only dip available
+ ENTRYX(res_sw, RES_SWITCH, "+IN,+P1,+P2")
+ ENTRY(switch1, SWITCH, "")
+ ENTRY(switch2, SWITCH2, "")
+ ENTRYX(nicRSFF, NETDEV_RSFF, "+S,+R")
+ ENTRYX(nicDelay, NETDEV_DELAY, "")
+ ENTRYX(2716, EPROM_2716, "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
+ ENTRYX(2102A, RAM_2102A, "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
+ ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,+B,+C,+D")
+ ENTRYX(7448, TTL_7448, "+A,+B,+C,+D,+LTQ,+BIQ,+RBIQ")
+ ENTRYX(7473, TTL_7473, "+CLK,+J,+K,+CLRQ")
+ ENTRYX(7473A, TTL_7473A, "+CLK,+J,+K,+CLRQ")
+ ENTRYX(7474, TTL_7474, "+CLK,+D,+CLRQ,+PREQ")
+ ENTRYX(7475, TTL_7475, "")
+ ENTRYX(7477, TTL_7477, "")
+ ENTRYX(7483, TTL_7483, "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0")
+ ENTRYX(7485, TTL_7485, "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN")
+ ENTRYX(7490, TTL_7490, "+A,+B,+R1,+R2,+R91,+R92")
+ ENTRYX(7493, TTL_7493, "+CLKA,+CLKB,+R1,+R2")
+ ENTRYX(74107, TTL_74107, "+CLK,+J,+K,+CLRQ")
+ ENTRYX(74107A, TTL_74107A, "+CLK,+J,+K,+CLRQ")
+ ENTRYX(74123, TTL_74123, "")
+ ENTRYX(74153, TTL_74153, "+C0,+C1,+C2,+C3,+A,+B,+G")
+ ENTRYX(74161, TTL_74161, "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET")
+ ENTRYX(74165, TTL_74165, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H")
+ ENTRYX(74166, TTL_74166, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H,+CLRQ")
+ ENTRYX(74174, TTL_74174, "+CLK,+D1,+D2,+D3,+D4,+D5,+D6,+CLRQ")
+ ENTRYX(74175, TTL_74175, "+CLK,+D1,+D2,+D3,+D4,+CLRQ")
+ ENTRYX(74192, TTL_74192, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ ENTRYX(74193, TTL_74193, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ ENTRYX(74194, TTL_74194, "+CLK,+S0,+S1,+SRIN,+A,+B,+C,+D,+SLIN,+CLRQ")
+ ENTRYX(74365, TTL_74365, "+G1Q,+G2Q,+A1,+A2,+A3,+A4,+A5,+A6")
+ //ENTRY(74279, TTL_74279, "") // only dip available
ENTRYX(SN74LS629, SN74LS629, "CAP")
- ENTRYX(82S16, TTL_82S16, "-")
- ENTRYX(82S115, PROM_82S115, "+CE1Q,CE2,A0,A1,A2,A3,A4,A5,A6,A7,A8,STROBE")
- ENTRYX(82S123, PROM_82S123, "+CEQ,A0,A1,A2,A3,A4")
- ENTRYX(82S126, PROM_82S126, "+CE1Q,CE2Q,A0,A1,A2,A3,A4,A5,A6,A7")
- ENTRYX(9310, TTL_9310, "-")
- ENTRYX(9312, TTL_9312, "+A,B,C,D0,D1,D2,D3,D4,D5,D6,D7,G")
- ENTRYX(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
- ENTRYX(9322, TTL_9322, "+SELECT,A1,B1,A2,B2,A3,B3,A4,B4,STROBE")
- ENTRYX(9334, TTL_9334, "+CQ,EQ,D,A0,A1,A2")
- ENTRYX(AM2847, TTL_AM2847, "+CP,INA,INB,INC,IND,RCA,RCB,RCC,RCD")
+ ENTRYX(82S16, TTL_82S16, "")
+ ENTRYX(82S115, PROM_82S115, "+CE1Q,+CE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+STROBE")
+ ENTRYX(82S123, PROM_82S123, "+CEQ,+A0,+A1,+A2,+A3,+A4")
+ ENTRYX(82S126, PROM_82S126, "+CE1Q,+CE2Q,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7")
+ ENTRYX(9310, TTL_9310, "")
+ ENTRYX(9312, TTL_9312, "+A,+B,+C,+D0,+D1,+D2,+D3,+D4,+D5,+D6,+D7,+G")
+ ENTRYX(9316, TTL_9316, "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
+ ENTRYX(9322, TTL_9322, "+SELECT,+A1,+B1,+A2,+B2,+A3,+B3,+A4,+B4,+STROBE")
+ ENTRYX(9334, TTL_9334, "+CQ,+EQ,+D,+A0,+A1,+A2")
+ ENTRYX(AM2847, TTL_AM2847, "+CP,+INA,+INB,+INC,+IND,+RCA,+RCB,+RCC,+RCD")
ENTRYX(CD4020, CD4020, "")
ENTRYX(CD4066_GATE, CD4066_GATE, "")
+ ENTRYX(CD4316_GATE, CD4316_GATE, "")
/* entries with suffix WI are legacy only */
- ENTRYX(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS")
+ ENTRYX(CD4020, CD4020_WI, "+IP,+RESET,+VDD,+VSS")
//ENTRY(4066, CD_4066, "+A,B")
- ENTRYX(NE555, NE555, "-")
- ENTRYX(r2r_dac, R2R_DAC, "+VIN,R,N")
- ENTRYX(tristate, TTL_TRISTATE, "+CEQ1,D1,CEQ2,D2")
- ENTRYX(tristate3, TTL_TRISTATE3, "-")
- ENTRYX(2102A_dip, RAM_2102A_DIP, "-")
- ENTRYX(2716_dip, EPROM_2716_DIP, "-")
- ENTRYX(4538_dip, CD4538_DIP, "-")
- ENTRYX(7448_dip, TTL_7448_DIP, "-")
- ENTRYX(7450_dip, TTL_7450_DIP, "-")
- ENTRYX(7473_dip, TTL_7473_DIP, "-")
- ENTRYX(7473A_dip, TTL_7473A_DIP, "-")
- ENTRYX(7474_dip, TTL_7474_DIP, "-")
- ENTRYX(7475_dip, TTL_7475_DIP, "-")
- ENTRYX(7477_dip, TTL_7477_DIP, "-")
- ENTRYX(7483_dip, TTL_7483_DIP, "-")
- ENTRYX(7485_dip, TTL_7485_DIP, "-")
- ENTRYX(7490_dip, TTL_7490_DIP, "-")
- ENTRYX(7493_dip, TTL_7493_DIP, "-")
- ENTRYX(74107_dip, TTL_74107_DIP, "-")
- ENTRYX(74123_dip, TTL_74123_DIP, "-")
- ENTRYX(74153_dip, TTL_74153_DIP, "-")
- ENTRYX(74161_dip, TTL_74161_DIP, "-")
- ENTRYX(74165_dip, TTL_74165_DIP, "-")
- ENTRYX(74166_dip, TTL_74166_DIP, "-")
- ENTRYX(74174_dip, TTL_74174_DIP, "-")
- ENTRYX(74175_dip, TTL_74175_DIP, "-")
- ENTRYX(74192_dip, TTL_74192_DIP, "-")
- ENTRYX(74193_dip, TTL_74193_DIP, "-")
- ENTRYX(74194_dip, TTL_74194_DIP, "-")
- ENTRYX(74279_dip, TTL_74279_DIP, "-")
- ENTRYX(74365_dip, TTL_74365_DIP, "-")
- ENTRYX(82S16_dip, TTL_82S16_DIP, "-")
- ENTRYX(82S115_dip, PROM_82S115_DIP, "-")
- ENTRYX(82S123_dip, PROM_82S123_DIP, "-")
- ENTRYX(82S126_dip, PROM_82S126_DIP, "-")
- ENTRYX(9602_dip, TTL_9602_DIP, "-")
- ENTRYX(9310_dip, TTL_9310_DIP, "-")
- ENTRYX(9312_dip, TTL_9312_DIP, "-")
- ENTRYX(9316_dip, TTL_9316_DIP, "-")
- ENTRYX(9322_dip, TTL_9322_DIP, "-")
- ENTRYX(9334_dip, TTL_9334_DIP, "-")
- ENTRYX(AM2847_dip, TTL_AM2847_DIP, "-")
+ ENTRYX(NE555, NE555, "")
+ ENTRYX(r2r_dac, R2R_DAC, "VIN,R,N")
+ ENTRYX(tristate, TTL_TRISTATE, "+CEQ1,+D1,+CEQ2,+D2")
+ ENTRYX(tristate3, TTL_TRISTATE3, "")
+ ENTRYX(2102A_dip, RAM_2102A_DIP, "")
+ ENTRYX(2716_dip, EPROM_2716_DIP, "")
+ ENTRYX(4538_dip, CD4538_DIP, "")
+ ENTRYX(7448_dip, TTL_7448_DIP, "")
+ ENTRYX(7450_dip, TTL_7450_DIP, "")
+ ENTRYX(7473_dip, TTL_7473_DIP, "")
+ ENTRYX(7473A_dip, TTL_7473A_DIP, "")
+ ENTRYX(7474_dip, TTL_7474_DIP, "")
+ ENTRYX(7475_dip, TTL_7475_DIP, "")
+ ENTRYX(7477_dip, TTL_7477_DIP, "")
+ ENTRYX(7483_dip, TTL_7483_DIP, "")
+ ENTRYX(7485_dip, TTL_7485_DIP, "")
+ ENTRYX(7490_dip, TTL_7490_DIP, "")
+ ENTRYX(7493_dip, TTL_7493_DIP, "")
+ ENTRYX(74107_dip, TTL_74107_DIP, "")
+ ENTRYX(74123_dip, TTL_74123_DIP, "")
+ ENTRYX(74153_dip, TTL_74153_DIP, "")
+ ENTRYX(74161_dip, TTL_74161_DIP, "")
+ ENTRYX(74165_dip, TTL_74165_DIP, "")
+ ENTRYX(74166_dip, TTL_74166_DIP, "")
+ ENTRYX(74174_dip, TTL_74174_DIP, "")
+ ENTRYX(74175_dip, TTL_74175_DIP, "")
+ ENTRYX(74192_dip, TTL_74192_DIP, "")
+ ENTRYX(74193_dip, TTL_74193_DIP, "")
+ ENTRYX(74194_dip, TTL_74194_DIP, "")
+ ENTRYX(74279_dip, TTL_74279_DIP, "")
+ ENTRYX(74365_dip, TTL_74365_DIP, "")
+ ENTRYX(82S16_dip, TTL_82S16_DIP, "")
+ ENTRYX(82S115_dip, PROM_82S115_DIP, "")
+ ENTRYX(82S123_dip, PROM_82S123_DIP, "")
+ ENTRYX(82S126_dip, PROM_82S126_DIP, "")
+ ENTRYX(9602_dip, TTL_9602_DIP, "")
+ ENTRYX(9310_dip, TTL_9310_DIP, "")
+ ENTRYX(9312_dip, TTL_9312_DIP, "")
+ ENTRYX(9316_dip, TTL_9316_DIP, "")
+ ENTRYX(9322_dip, TTL_9322_DIP, "")
+ ENTRYX(9334_dip, TTL_9334_DIP, "")
+ ENTRYX(AM2847_dip, TTL_AM2847_DIP, "")
ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
- ENTRYX(NE555_dip, NE555_DIP, "-")
- ENTRYX(MM5837_dip, MM5837_DIP, "-")
+ ENTRYX(NE555_dip, NE555_DIP, "")
+ ENTRYX(MM5837_dip, MM5837_DIP, "")
}
} //namespace devices
@@ -203,7 +204,7 @@ static void initialize_factory(factory_list_t &factory)
namespace netlist
{
- void initialize_factory(factory_list_t &factory)
+ void initialize_factory(factory::list_t &factory)
{
devices::initialize_factory(factory);
}
diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h
index c9c0b6b3917..585df6aa369 100644
--- a/src/lib/netlist/devices/net_lib.h
+++ b/src/lib/netlist/devices/net_lib.h
@@ -81,7 +81,7 @@ NETLIST_EXTERNAL(bjt_models)
NETLIST_EXTERNAL(family_models)
namespace netlist {
- void initialize_factory(netlist::factory_list_t &factory);
+ void initialize_factory(factory::list_t &factory);
}
#endif
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index 56b322dbc2f..8b4d11c374b 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -62,7 +62,7 @@ namespace netlist
register_subalias("2", m_C);
register_subalias("3", m_LTQ);
register_subalias("4", m_BIQ);
- register_subalias("5",m_RBIQ);
+ register_subalias("5", m_RBIQ);
register_subalias("6", m_D);
register_subalias("7", m_A);
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index 6e96facabae..a87aada2cd6 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -71,7 +71,7 @@ namespace netlist
{
NETLIB_CONSTRUCTOR_DERIVED(7493_dip, 7493)
{
- register_subalias("1", B.m_I);
+ register_subalias("1", "CLKB");
register_subalias("2", m_R1);
register_subalias("3", m_R2);
@@ -80,13 +80,13 @@ namespace netlist
// register_subalias("6", ); --> NC
// register_subalias("7", ); --> NC
- register_subalias("8", C.m_Q);
- register_subalias("9", B.m_Q);
+ register_subalias("8", "QC");
+ register_subalias("9", "QB");
// register_subalias("10", ); -. GND
- register_subalias("11", D.m_Q);
- register_subalias("12", A.m_Q);
+ register_subalias("11", "QD");
+ register_subalias("12", "QA");
// register_subalias("13", ); -. NC
- register_subalias("14", A.m_I);
+ register_subalias("14", "CLKA");
}
};
diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h
index 6fcd746578f..564699cd89b 100644
--- a/src/lib/netlist/devices/nld_truthtable.h
+++ b/src/lib/netlist/devices/nld_truthtable.h
@@ -235,7 +235,7 @@ namespace netlist
desc.setup(m_desc, disabled_ignore * 0);
#if 0
- printf("%s\n", name().cstr());
+ printf("%s\n", name().c_str());
for (int j=0; j < m_size; j++)
printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]);
@@ -261,7 +261,7 @@ namespace netlist
}
public:
- void inc_active() noexcept override
+ void inc_active() NL_NOEXCEPT override
{
if (m_NI > 1)
if (++m_active == 1)
@@ -270,7 +270,7 @@ namespace netlist
}
}
- void dec_active() noexcept override
+ void dec_active() NL_NOEXCEPT override
{
/* FIXME:
* Based on current measurements there is no point to disable
@@ -366,13 +366,13 @@ namespace netlist
plib::pstring_vector_t m_desc;
};
- class netlist_base_factory_truthtable_t : public base_factory_t
+ class netlist_base_factory_truthtable_t : public factory::element_t
{
P_PREVENT_COPYING(netlist_base_factory_truthtable_t)
public:
netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param)
- : base_factory_t(name, classname, def_param), m_family(family_TTL())
+ : factory::element_t(name, classname, def_param), m_family(family_TTL())
{}
virtual ~netlist_base_factory_truthtable_t()
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index 6ecad8656a2..080f9a27a4b 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -53,9 +53,9 @@ namespace netlist
else
netlist().log().warning("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
#if (0)
- printf("%s %s\n", out_proxied->name().cstr(), out_proxied->device().name().cstr());
+ printf("%s %s\n", out_proxied->name().c_str(), out_proxied->device().name().c_str());
auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::type_t::OUTPUT, false);
- if (x) printf("==> %s\n", x->name().cstr());
+ if (x) printf("==> %s\n", x->name().c_str());
#endif
}
diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h
index bcda8fa4e2a..50920c5cf80 100644
--- a/src/lib/netlist/devices/nlid_proxy.h
+++ b/src/lib/netlist/devices/nlid_proxy.h
@@ -61,20 +61,41 @@ namespace netlist
// nld_a_to_d_proxy
// -----------------------------------------------------------------------------
- NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_proxy)
+ NETLIB_OBJECT_DERIVED(base_a_to_d_proxy, base_proxy)
+ {
+ public:
+
+ virtual ~nld_base_a_to_d_proxy() {}
+
+ virtual logic_output_t &out() { return m_Q; }
+
+ protected:
+
+ nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name,
+ logic_input_t *in_proxied, detail::core_terminal_t *in_proxy)
+ : nld_base_proxy(anetlist, name, in_proxied, in_proxy)
+ , m_Q(*this, "Q")
+ {
+ }
+
+ private:
+
+ logic_output_t m_Q;
+
+ };
+
+ NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_a_to_d_proxy)
{
public:
nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied)
- : nld_base_proxy(anetlist, name, in_proxied, &m_I)
+ : nld_base_a_to_d_proxy(anetlist, name, in_proxied, &m_I)
, m_I(*this, "I")
- , m_Q(*this, "Q")
{
}
virtual ~nld_a_to_d_proxy() {}
analog_input_t m_I;
- logic_output_t m_Q;
protected:
@@ -88,9 +109,9 @@ namespace netlist
if (supply_V == 0.0) supply_V = 5.0;
if (m_I.Q_Analog() > logic_family().high_thresh_V(0.0, supply_V))
- m_Q.push(1, NLTIME_FROM_NS(1));
+ out().push(1, NLTIME_FROM_NS(1));
else if (m_I.Q_Analog() < logic_family().low_thresh_V(0.0, supply_V))
- m_Q.push(0, NLTIME_FROM_NS(1));
+ out().push(0, NLTIME_FROM_NS(1));
else
{
// do nothing
@@ -141,43 +162,6 @@ namespace netlist
bool m_is_timestep;
};
-
- class factory_lib_entry_t : public base_factory_t
- {
- P_PREVENT_COPYING(factory_lib_entry_t)
- public:
-
- factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname,
- const pstring &def_param)
- : base_factory_t(name, classname, def_param), m_setup(setup) { }
-
- class wrapper : public device_t
- {
- public:
- wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name), m_devname(devname)
- {
- anetlist.setup().namespace_push(name);
- anetlist.setup().include(m_devname);
- anetlist.setup().namespace_pop();
- }
- protected:
- NETLIB_RESETI() { }
- NETLIB_UPDATEI() { }
-
- pstring m_devname;
- };
-
- plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
- {
- return plib::owned_ptr<device_t>::Create<wrapper>(this->name(), anetlist, name);
- }
-
- private:
- setup_t &m_setup;
- };
-
-
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index 08dc5f60b27..146f95b72b4 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -52,7 +52,7 @@ static NETLIST_START(opamp_layout_2_13_9_4)
A.GND, /* |4 11| */ NC,
B.N1, /* |5 10| */ B.OUT,
B.PLUS, /* |6 9| */ B.VCC,
- B.MINUS /* |7 8| */ B.N2
+ B.MINUS, /* |7 8| */ B.N2
/* +--------------+ */
)
NET_C(A.GND, B.GND)
@@ -186,6 +186,37 @@ static NETLIST_START(LM747A_DIP)
NETLIST_END()
+static NETLIST_START(LM3900)
+
+ /*
+ * Fast norton opamp model without bandwidth
+ */
+
+ /* Terminal definitions for calling netlists */
+
+ ALIAS(PLUS, R1.1) // Positive input
+ ALIAS(MINUS, R2.1) // Negative input
+ ALIAS(OUT, G1.OP) // Opamp output ...
+ ALIAS(VM, G1.ON) // V- terminal
+ ALIAS(VP, DUMMY.I) // V+ terminal
+
+ DUMMY_INPUT(DUMMY)
+
+ /* The opamp model */
+
+ RES(R1, 1)
+ RES(R2, 1)
+ NET_C(R1.1, G1.IP)
+ NET_C(R2.1, G1.IN)
+ NET_C(R1.2, R2.2, G1.ON)
+ VCVS(G1)
+ PARAM(G1.G, 10000000)
+ //PARAM(G1.RI, 1)
+ PARAM(G1.RO, RES_K(8))
+
+NETLIST_END()
+
+
NETLIST_START(OPAMP_lib)
LOCAL_LIB_ENTRY(opamp_layout_4_4_11)
LOCAL_LIB_ENTRY(opamp_layout_2_8_4)
@@ -209,5 +240,6 @@ NETLIST_START(OPAMP_lib)
LOCAL_LIB_ENTRY(UA741_DIP14)
LOCAL_LIB_ENTRY(LM747_DIP)
LOCAL_LIB_ENTRY(LM747A_DIP)
+ LOCAL_LIB_ENTRY(LM3900)
NETLIST_END()
diff --git a/src/lib/netlist/macro/nlm_opamp.h b/src/lib/netlist/macro/nlm_opamp.h
index f349f11911c..6e3c1f615e7 100644
--- a/src/lib/netlist/macro/nlm_opamp.h
+++ b/src/lib/netlist/macro/nlm_opamp.h
@@ -20,6 +20,9 @@
#define LM358_DIP(name) \
NET_REGISTER_DEV(LM358_DIP, name)
+#define LM3900(name) \
+ NET_REGISTER_DEV(LM3900, name)
+
/* ----------------------------------------------------------------------------
* External declarations
* ---------------------------------------------------------------------------*/
diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp
index 2120d88eb3f..c66314366d2 100644
--- a/src/lib/netlist/macro/nlm_ttl74xx.cpp
+++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp
@@ -588,7 +588,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|1|22")
TT_LINE("X,0|1|22")
@@ -604,7 +604,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,0|1|22")
TT_LINE("X,1|0|15")
@@ -619,7 +619,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "A")
+ TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "+A")
TT_HEAD(" A | Q ")
TT_LINE(" 0 | 1 |22")
TT_LINE(" 1 | 0 |15")
@@ -634,7 +634,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7408_AND, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7408_AND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|0|15")
TT_LINE("X,0|0|15")
@@ -642,7 +642,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "A,B,C")
+ TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("0,X,X|1|22")
TT_LINE("X,0,X|1|22")
@@ -660,7 +660,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7411_AND, 3, 1, "A,B,C")
+ TRUTHTABLE_START(TTL_7411_AND, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("0,X,X|0|15")
TT_LINE("X,0,X|0|15")
@@ -696,7 +696,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "A,B,C,D")
+ TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "+A,+B,+C,+D")
TT_HEAD("A,B,C,D|Q ")
TT_LINE("0,X,X,X|1|22")
TT_LINE("X,0,X,X|1|22")
@@ -716,7 +716,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "A,B,C,D")
+ TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "+A,+B,+C,+D")
TT_HEAD("A,B,C,D|Q ")
TT_LINE("1,X,X,X|0|15")
TT_LINE("X,1,X,X|0|15")
@@ -735,7 +735,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "A,B,C")
+ TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("1,X,X|0|15")
TT_LINE("X,1,X|0|15")
@@ -758,7 +758,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "A,B,C,D,E,F,G,H")
+ TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "+A,+B,+C,+D,+E,+F,+G,+H")
TT_HEAD("A,B,C,D,E,F,G,H|Q ")
TT_LINE("0,X,X,X,X,X,X,X|1|22")
TT_LINE("X,0,X,X,X,X,X,X|1|22")
@@ -780,7 +780,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7432_OR, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7432_OR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("1,X|1|22")
TT_LINE("X,1|1|22")
@@ -800,7 +800,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7437_NAND, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7437_NAND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|1|22")
TT_LINE("X,0|1|22")
@@ -817,7 +817,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "A,B")
+ TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,0|0|15")
TT_LINE("0,1|1|22")
@@ -837,7 +837,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
- TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "A,B,C,D,E")
+ TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "+A,+B,+C,+D,+E")
TT_HEAD("A,B,C,D,E|Q ")
TT_LINE("0,0,0,0,0|1|10")
TT_LINE("X,X,X,X,1|0|12")
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 76ce59db5ac..aa6cfc5b340 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -71,6 +71,10 @@ public:
{
return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
+ virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override
+ {
+ return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ }
};
class logic_family_cd4xxx_t : public logic_family_desc_t
@@ -91,6 +95,10 @@ public:
{
return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
+ virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override
+ {
+ return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ }
};
const logic_family_desc_t *family_TTL()
@@ -138,7 +146,7 @@ void detail::queue_t::on_pre_save()
pstring p = this->listptr()[i].m_object->name();
std::size_t n = p.len();
if (n > 63) n = 63;
- std::strncpy(m_names[i].m_buf, p.cstr(), n);
+ std::strncpy(m_names[i].m_buf, p.c_str(), n);
m_names[i].m_buf[n] = 0;
}
}
@@ -722,8 +730,12 @@ void detail::net_t::reset()
m_active++;
}
-void detail::net_t::register_con(detail::core_terminal_t &terminal)
+void detail::net_t::add_terminal(detail::core_terminal_t &terminal)
{
+ for (auto t : m_core_terms)
+ if (t == &terminal)
+ netlist().log().fatal("net {1}: duplicate terminal {2}", name(), t->name());
+
terminal.set_net(this);
m_core_terms.push_back(&terminal);
@@ -735,7 +747,7 @@ void detail::net_t::register_con(detail::core_terminal_t &terminal)
void detail::net_t::move_connections(detail::net_t &dest_net)
{
for (auto &ct : m_core_terms)
- dest_net.register_con(*ct);
+ dest_net.add_terminal(*ct);
m_core_terms.clear();
m_active = 0;
}
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index f72665c62bc..045f7c9b1cb 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -169,6 +169,7 @@ namespace netlist
class NETLIB_NAME(netlistparams);
class NETLIB_NAME(base_proxy);
class NETLIB_NAME(base_d_to_a_proxy);
+ class NETLIB_NAME(base_a_to_d_proxy);
}
namespace detail {
@@ -203,6 +204,7 @@ namespace netlist
};
class logic_output_t;
+ class logic_input_t;
class analog_net_t;
class logic_net_t;
class net_t;
@@ -225,8 +227,11 @@ namespace netlist
public:
logic_family_desc_t() {}
virtual ~logic_family_desc_t() {}
+
virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
logic_output_t *proxied) const = 0;
+ virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name,
+ logic_input_t *proxied) const = 0;
double fixed_V() const { return m_fixed_V; }
double low_thresh_V(const double VN, const double VP) const { return VN + (VP - VN) * m_low_thresh_PCNT; }
@@ -297,9 +302,9 @@ namespace netlist
const T &value //!< Initial value after construction
);
//! Copy Constructor.
- state_var(const state_var &rhs) noexcept = default;
+ state_var(const state_var &rhs) NL_NOEXCEPT = default;
//! Move Constructor.
- state_var(state_var &&rhs) noexcept = default;
+ state_var(state_var &&rhs) NL_NOEXCEPT = default;
//! Assignment operator to assign value of a state var.
state_var &operator=(state_var rhs) { std::swap(rhs.m_value, this->m_value); return *this; }
//! Assignment operator to assign value of type T.
@@ -327,8 +332,8 @@ namespace netlist
{
public:
state_var(device_t &dev, const pstring name, const T & value);
- state_var(const state_var &rhs) noexcept = default;
- state_var(state_var &&rhs) noexcept = default;
+ state_var(const state_var &rhs) NL_NOEXCEPT = default;
+ state_var(state_var &&rhs) NL_NOEXCEPT = default;
state_var &operator=(const state_var rhs) { m_value = rhs.m_value; return *this; }
state_var &operator=(const T rhs) { m_value = rhs; return *this; }
T & operator[](const std::size_t i) { return m_value[i]; }
@@ -491,8 +496,8 @@ namespace netlist
const net_t & net() const { return *m_net;}
net_t & net() { return *m_net;}
- bool is_logic() const noexcept;
- bool is_analog() const noexcept;
+ bool is_logic() const NL_NOEXCEPT;
+ bool is_analog() const NL_NOEXCEPT;
bool is_state(const state_e astate) const { return (m_state == astate); }
state_e state() const { return m_state; }
@@ -519,8 +524,8 @@ namespace netlist
{
}
- const analog_net_t & net() const noexcept;
- analog_net_t & net() noexcept;
+ const analog_net_t & net() const NL_NOEXCEPT;
+ analog_net_t & net() NL_NOEXCEPT;
};
// -----------------------------------------------------------------------------
@@ -604,8 +609,8 @@ namespace netlist
devices::nld_base_proxy *get_proxy() const { return m_proxy; }
void set_proxy(devices::nld_base_proxy *proxy) { m_proxy = proxy; }
- logic_net_t & net() noexcept;
- const logic_net_t & net() const noexcept;
+ logic_net_t & net() NL_NOEXCEPT;
+ const logic_net_t & net() const NL_NOEXCEPT;
protected:
@@ -622,7 +627,7 @@ namespace netlist
public:
logic_input_t(core_device_t &dev, const pstring &aname);
- netlist_sig_t Q() const noexcept;
+ netlist_sig_t Q() const NL_NOEXCEPT;
netlist_sig_t operator()() const NL_NOEXCEPT
{
@@ -662,7 +667,7 @@ namespace netlist
/*! returns voltage at terminal.
* \returns voltage at terminal.
*/
- nl_double Q_Analog() const noexcept;
+ nl_double Q_Analog() const NL_NOEXCEPT;
};
@@ -682,16 +687,16 @@ namespace netlist
void reset();
- void register_con(core_terminal_t &terminal);
+ void add_terminal(core_terminal_t &terminal);
- bool is_logic() const noexcept;
- bool is_analog() const noexcept;
+ bool is_logic() const NL_NOEXCEPT;
+ bool is_analog() const NL_NOEXCEPT;
void toggle_new_Q() { m_new_Q ^= 1; }
void force_queue_execution() { m_new_Q = (m_cur_Q ^ 1); }
- void push_to_queue(const netlist_time delay) noexcept;
- void reschedule_in_queue(const netlist_time delay) noexcept;
+ void push_to_queue(const netlist_time delay) NL_NOEXCEPT;
+ void reschedule_in_queue(const netlist_time delay) NL_NOEXCEPT;
bool is_queued() const { return m_in_queue == 1; }
void update_devs() NL_NOEXCEPT;
@@ -702,7 +707,7 @@ namespace netlist
bool isRailNet() const { return !(m_railterminal == nullptr); }
core_terminal_t & railterminal() const { return *m_railterminal; }
- std::size_t num_cons() const noexcept { return m_core_terms.size(); }
+ std::size_t num_cons() const NL_NOEXCEPT { return m_core_terms.size(); }
void inc_active(core_terminal_t &term) NL_NOEXCEPT;
void dec_active(core_terminal_t &term) NL_NOEXCEPT;
@@ -742,7 +747,7 @@ namespace netlist
netlist_sig_t new_Q() const { return m_new_Q; }
void initial(const netlist_sig_t val) { m_cur_Q = m_new_Q = val; }
- void set_Q(const netlist_sig_t newQ, const netlist_time delay) noexcept
+ void set_Q(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT
{
if (newQ != m_new_Q)
{
@@ -751,7 +756,7 @@ namespace netlist
}
}
- void set_Q_time(const netlist_sig_t newQ, const netlist_time at) noexcept
+ void set_Q_time(const netlist_sig_t newQ, const netlist_time at) NL_NOEXCEPT
{
if (newQ != m_new_Q)
{
@@ -806,7 +811,7 @@ namespace netlist
void initial(const netlist_sig_t val);
- void push(const netlist_sig_t newQ, const netlist_time delay) noexcept
+ void push(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT
{
m_my_net.set_Q(newQ, delay); // take the shortcut
}
@@ -821,11 +826,11 @@ namespace netlist
public:
analog_output_t(core_device_t &dev, const pstring &aname);
- void push(const nl_double val) noexcept { set_Q(val); }
+ void push(const nl_double val) NL_NOEXCEPT { set_Q(val); }
void initial(const nl_double val);
private:
- void set_Q(const nl_double newQ) noexcept;
+ void set_Q(const nl_double newQ) NL_NOEXCEPT;
analog_net_t m_my_net;
};
@@ -955,28 +960,6 @@ namespace netlist
virtual void changed() override { }
};
- template <typename ST, std::size_t AW, std::size_t DW>
- class param_rom_t final: public param_data_t
- {
- public:
-
- param_rom_t(device_t &device, const pstring name)
- : param_data_t(device, name)
- {
- stream()->read(&m_data[0],1<<AW);
- }
-
- const ST & operator[] (std::size_t n) { return m_data[n]; }
-
- protected:
- virtual void changed() override
- {
- stream()->read(&m_data[0],1<<AW);
- }
- private:
- ST m_data[1 << AW];
- };
-
// -----------------------------------------------------------------------------
// core_device_t
// -----------------------------------------------------------------------------
@@ -1014,7 +997,7 @@ namespace netlist
void set_delegate_pointer();
void stop_dev();
- void do_inc_active() noexcept
+ void do_inc_active() NL_NOEXCEPT
{
if (m_hint_deactivate)
{
@@ -1023,7 +1006,7 @@ namespace netlist
}
}
- void do_dec_active() noexcept
+ void do_dec_active() NL_NOEXCEPT
{
if (m_hint_deactivate)
dec_active();
@@ -1039,8 +1022,8 @@ namespace netlist
protected:
virtual void update() NL_NOEXCEPT { }
- virtual void inc_active() noexcept { }
- virtual void dec_active() noexcept { }
+ virtual void inc_active() NL_NOEXCEPT { }
+ virtual void dec_active() NL_NOEXCEPT { }
virtual void stop() { }
virtual void reset() { }
@@ -1177,7 +1160,7 @@ namespace netlist
devices::NETLIB_NAME(gnd) *gnd() const { return m_gnd; }
nl_double gmin() const;
- void push_to_queue(detail::net_t &out, const netlist_time attime) noexcept;
+ void push_to_queue(detail::net_t &out, const netlist_time attime) NL_NOEXCEPT;
void remove_from_queue(detail::net_t &out) NL_NOEXCEPT;
void process_queue(const netlist_time &delta);
@@ -1294,25 +1277,55 @@ namespace netlist
};
// -----------------------------------------------------------------------------
+ // rom parameter
+ // -----------------------------------------------------------------------------
+
+ template <typename ST, std::size_t AW, std::size_t DW>
+ class param_rom_t final: public param_data_t
+ {
+ public:
+
+ param_rom_t(device_t &device, const pstring name)
+ : param_data_t(device, name)
+ {
+ auto f = stream();
+ if (f != nullptr)
+ f->read(&m_data[0],1<<AW);
+ else
+ device.netlist().log().warning("Rom {1} not found", Value());
+ }
+
+ const ST & operator[] (std::size_t n) { return m_data[n]; }
+
+ protected:
+ virtual void changed() override
+ {
+ stream()->read(&m_data[0],1<<AW);
+ }
+ private:
+ ST m_data[1 << AW];
+ };
+
+ // -----------------------------------------------------------------------------
// inline implementations
// -----------------------------------------------------------------------------
- inline bool detail::core_terminal_t::is_logic() const noexcept
+ inline bool detail::core_terminal_t::is_logic() const NL_NOEXCEPT
{
return dynamic_cast<const logic_t *>(this) != nullptr;
}
- inline bool detail::core_terminal_t::is_analog() const noexcept
+ inline bool detail::core_terminal_t::is_analog() const NL_NOEXCEPT
{
return dynamic_cast<const analog_t *>(this) != nullptr;
}
- inline bool detail::net_t::is_logic() const noexcept
+ inline bool detail::net_t::is_logic() const NL_NOEXCEPT
{
return dynamic_cast<const logic_net_t *>(this) != nullptr;
}
- inline bool detail::net_t::is_analog() const noexcept
+ inline bool detail::net_t::is_analog() const NL_NOEXCEPT
{
return dynamic_cast<const analog_net_t *>(this) != nullptr;
}
@@ -1353,7 +1366,7 @@ namespace netlist
}
}
- inline void detail::net_t::push_to_queue(const netlist_time delay) noexcept
+ inline void detail::net_t::push_to_queue(const netlist_time delay) NL_NOEXCEPT
{
if (!is_queued() && (num_cons() != 0))
{
@@ -1366,7 +1379,7 @@ namespace netlist
}
}
- inline void detail::net_t::reschedule_in_queue(const netlist_time delay) noexcept
+ inline void detail::net_t::reschedule_in_queue(const netlist_time delay) NL_NOEXCEPT
{
if (is_queued())
netlist().remove_from_queue(*this);
@@ -1379,39 +1392,39 @@ namespace netlist
}
}
- inline const analog_net_t & analog_t::net() const noexcept
+ inline const analog_net_t & analog_t::net() const NL_NOEXCEPT
{
return static_cast<const analog_net_t &>(core_terminal_t::net());
}
- inline analog_net_t & analog_t::net() noexcept
+ inline analog_net_t & analog_t::net() NL_NOEXCEPT
{
return static_cast<analog_net_t &>(core_terminal_t::net());
}
inline nl_double terminal_t::operator ()() const { return net().Q_Analog(); }
- inline logic_net_t & logic_t::net() noexcept
+ inline logic_net_t & logic_t::net() NL_NOEXCEPT
{
return *static_cast<logic_net_t *>(&core_terminal_t::net());
}
- inline const logic_net_t & logic_t::net() const noexcept
+ inline const logic_net_t & logic_t::net() const NL_NOEXCEPT
{
return static_cast<const logic_net_t &>(core_terminal_t::net());
}
- inline netlist_sig_t logic_input_t::Q() const noexcept
+ inline netlist_sig_t logic_input_t::Q() const NL_NOEXCEPT
{
return net().Q();
}
- inline nl_double analog_input_t::Q_Analog() const noexcept
+ inline nl_double analog_input_t::Q_Analog() const NL_NOEXCEPT
{
return net().Q_Analog();
}
- inline void analog_output_t::set_Q(const nl_double newQ) noexcept
+ inline void analog_output_t::set_Q(const nl_double newQ) NL_NOEXCEPT
{
if (newQ != net().Q_Analog())
{
@@ -1421,7 +1434,7 @@ namespace netlist
}
}
- inline void netlist_t::push_to_queue(detail::net_t &out, const netlist_time attime) noexcept
+ inline void netlist_t::push_to_queue(detail::net_t &out, const netlist_time attime) NL_NOEXCEPT
{
m_queue.push(attime, &out);
}
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index 14598d2dccf..3181e486dde 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -51,7 +51,7 @@
*/
// This will be autodetected
-//#define NL_PMF_TYPE 0
+// #define NL_PMF_TYPE 0
#define NL_PMF_TYPE_VIRTUAL 0
#define NL_PMF_TYPE_GNUC_PMF 1
@@ -82,16 +82,16 @@
* linear memory pool. This is based of the assumption that
* due to enhanced locality there will be less cache misses.
* Your mileage may vary.
+ * This will cause crashes on OSX and thus is ignored on OSX.
*
*/
-#define USE_MEMPOOL (1)
+#define USE_MEMPOOL (0)
#define USE_TRUTHTABLE (1)
//============================================================
// Solver defines
//============================================================
-#define USE_MATRIX_GS (0)
#define USE_GABS (1)
// savings are eaten up by effort
// FIXME: Convert into solver parameter
@@ -165,5 +165,9 @@ using nl_double = double;
#endif
#endif
+#ifdef __APPLE__
+#undef USE_MEMPOOL
+#define USE_MEMPOOL (0)
+#endif
#endif /* NLCONFIG_H_ */
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index f1d3281aa81..1e5a8e11b44 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -12,45 +12,28 @@
#include "nl_setup.h"
#include "plib/putil.h"
-namespace netlist
+namespace netlist { namespace factory
{
// ----------------------------------------------------------------------------------------
// net_device_t_base_factory
// ----------------------------------------------------------------------------------------
-const plib::pstring_vector_t base_factory_t::term_param_list()
-{
- if (m_def_param.startsWith("+"))
- return plib::pstring_vector_t(m_def_param.substr(1), ",");
- else
- return plib::pstring_vector_t();
-}
-
-const plib::pstring_vector_t base_factory_t::def_params()
-{
- if (m_def_param.startsWith("+") || m_def_param.equals("-"))
- return plib::pstring_vector_t();
- else
- return plib::pstring_vector_t(m_def_param, ",");
-}
-
-
-factory_list_t::factory_list_t( setup_t &setup)
+list_t::list_t( setup_t &setup)
: m_setup(setup)
{
}
-factory_list_t::~factory_list_t()
+list_t::~list_t()
{
clear();
}
-void factory_list_t::error(const pstring &s)
+void list_t::error(const pstring &s)
{
m_setup.log().fatal("{1}", s);
}
-base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
+factory::element_t * list_t::factory_by_name(const pstring &devname)
{
for (auto & e : *this)
{
@@ -62,4 +45,21 @@ base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
return nullptr; // appease code analysis
}
+// -----------------------------------------------------------------------------
+// factory_lib_entry_t: factory class to wrap macro based chips/elements
+// -----------------------------------------------------------------------------
+
+plib::owned_ptr<device_t> library_element_t::Create(netlist_t &anetlist, const pstring &name)
+{
+ return plib::owned_ptr<device_t>::Create<wrapper>(anetlist, name);
}
+
+void library_element_t::macro_actions(netlist_t &anetlist, const pstring &name)
+{
+ anetlist.setup().namespace_push(name);
+ anetlist.setup().include(this->name());
+ anetlist.setup().namespace_pop();
+}
+
+
+} }
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 6a53797d0d8..b7750751e06 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -17,32 +17,31 @@
#include "plib/putil.h"
#include "nl_base.h"
-#define NETLIB_DEVICE_IMPL(chip) factory_creator_ptr_t decl_ ## chip = factory_creator_t< NETLIB_NAME(chip) >;
+#define NETLIB_DEVICE_IMPL(chip) factory::constructor_ptr_t decl_ ## chip = factory::constructor_t< NETLIB_NAME(chip) >;
-namespace netlist
+namespace netlist { namespace factory
{
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
- class base_factory_t
+ class element_t
{
- P_PREVENT_COPYING(base_factory_t)
+ P_PREVENT_COPYING(element_t)
public:
- base_factory_t(const pstring &name, const pstring &classname,
+ element_t(const pstring &name, const pstring &classname,
const pstring &def_param)
: m_name(name), m_classname(classname), m_def_param(def_param)
{}
- virtual ~base_factory_t() {}
+ virtual ~element_t() {}
virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
+ virtual void macro_actions(netlist_t &anetlist, const pstring &name) {};
const pstring &name() const { return m_name; }
const pstring &classname() const { return m_classname; }
const pstring &param_desc() const { return m_def_param; }
- const plib::pstring_vector_t term_param_list();
- const plib::pstring_vector_t def_params();
protected:
pstring m_name; /* device name */
@@ -51,13 +50,13 @@ namespace netlist
};
template <class C>
- class factory_t : public base_factory_t
+ class device_element_t : public element_t
{
- P_PREVENT_COPYING(factory_t)
+ P_PREVENT_COPYING(device_element_t)
public:
- factory_t(const pstring &name, const pstring &classname,
+ device_element_t(const pstring &name, const pstring &classname,
const pstring &def_param)
- : base_factory_t(name, classname, def_param) { }
+ : element_t(name, classname, def_param) { }
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
@@ -65,20 +64,20 @@ namespace netlist
}
};
- class factory_list_t : public std::vector<std::unique_ptr<base_factory_t>>
+ class list_t : public std::vector<std::unique_ptr<element_t>>
{
public:
- factory_list_t(setup_t &m_setup);
- ~factory_list_t();
+ list_t(setup_t &m_setup);
+ ~list_t();
template<class device_class>
void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- register_device(std::unique_ptr<base_factory_t>(new factory_t<device_class>(name, classname, def_param)));
+ register_device(std::unique_ptr<element_t>(new device_element_t<device_class>(name, classname, def_param)));
}
- void register_device(std::unique_ptr<base_factory_t> factory)
+ void register_device(std::unique_ptr<element_t> factory)
{
for (auto & e : *this)
if (e->name() == factory->name())
@@ -86,12 +85,12 @@ namespace netlist
push_back(std::move(factory));
}
- base_factory_t * factory_by_name(const pstring &devname);
+ element_t * factory_by_name(const pstring &devname);
template <class C>
- bool is_class(base_factory_t *f)
+ bool is_class(element_t *f)
{
- return dynamic_cast<factory_t<C> *>(f) != nullptr;
+ return dynamic_cast<device_element_t<C> *>(f) != nullptr;
}
private:
@@ -104,16 +103,49 @@ namespace netlist
// factory_creator_ptr_t
// -----------------------------------------------------------------------------
- using factory_creator_ptr_t = std::unique_ptr<base_factory_t> (*)(const pstring &name, const pstring &classname,
+ using constructor_ptr_t = std::unique_ptr<element_t> (*)(const pstring &name, const pstring &classname,
const pstring &def_param);
template <typename T>
- std::unique_ptr<base_factory_t> factory_creator_t(const pstring &name, const pstring &classname,
+ std::unique_ptr<element_t> constructor_t(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- return std::unique_ptr<base_factory_t>(new factory_t<T>(name, classname, def_param));
+ return std::unique_ptr<element_t>(new device_element_t<T>(name, classname, def_param));
}
-}
+ // -----------------------------------------------------------------------------
+ // factory_lib_entry_t: factory class to wrap macro based chips/elements
+ // -----------------------------------------------------------------------------
+
+ class library_element_t : public element_t
+ {
+ P_PREVENT_COPYING(library_element_t)
+ public:
+
+ library_element_t(setup_t &setup, const pstring &name, const pstring &classname,
+ const pstring &def_param)
+ : element_t(name, classname, def_param), m_setup(setup) { }
+
+ class wrapper : public device_t
+ {
+ public:
+ wrapper(netlist_t &anetlist, const pstring &name)
+ : device_t(anetlist, name)
+ {
+ }
+ protected:
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI() { }
+ };
+
+ plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override;
+
+ void macro_actions(netlist_t &anetlist, const pstring &name) override;
+
+ private:
+ setup_t &m_setup;
+ };
+
+} }
#endif /* NLFACTORY_H_ */
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp
index 6760873a4af..b2588faaaa8 100644
--- a/src/lib/netlist/nl_parser.cpp
+++ b/src/lib/netlist/nl_parser.cpp
@@ -316,7 +316,7 @@ void parser_t::dippins()
error(plib::pfmt("expected a comma, found <{1}>")(n.str()) );
}
if ((pins.size() % 2) == 1)
- error("You must pass an equal number of pins to DIPPINS");
+ error(plib::pfmt("You must pass an equal number of pins to DIPPINS, first pin is {}")(pins[0]));
std::size_t n = pins.size();
for (std::size_t i = 0; i < n / 2; i++)
{
@@ -356,35 +356,29 @@ void parser_t::netdev_hint()
void parser_t::device(const pstring &dev_type)
{
- if (m_setup.is_library_item(dev_type))
- {
- pstring devname = get_identifier();
- m_setup.namespace_push(devname);
- m_setup.include(dev_type);
- m_setup.namespace_pop();
- require_token(m_tok_param_right);
- }
- else
- {
- base_factory_t *f = m_setup.factory().factory_by_name(dev_type);
- plib::pstring_vector_t termlist = f->term_param_list();
- plib::pstring_vector_t def_params = f->def_params();
+ factory::element_t *f = m_setup.factory().factory_by_name(dev_type);
+ auto paramlist = plib::pstring_vector_t(f->param_desc(), ",");
- std::size_t cnt;
+ pstring devname = get_identifier();
- pstring devname = get_identifier();
+ m_setup.register_dev(dev_type, m_setup.build_fqn(devname));
+ m_setup.log().debug("Parser: IC: {1}\n", devname);
- m_setup.register_dev(dev_type, m_setup.build_fqn(devname));
-
- m_setup.log().debug("Parser: IC: {1}\n", devname);
+ for (pstring tp : paramlist)
+ {
+ require_token(m_tok_comma);
+ if (tp.startsWith("+"))
+ {
+ pstring output_name = get_identifier();
+ m_setup.log().debug("Link: {1} {2}\n", tp, output_name);
- cnt = 0;
- while (cnt < def_params.size())
+ m_setup.register_link(devname + "." + tp.substr(1), output_name);
+ }
+ else
{
- pstring paramfq = devname + "." + def_params[cnt];
+ pstring paramfq = devname + "." + tp;
m_setup.log().debug("Defparam: {1}\n", paramfq);
- require_token(m_tok_comma);
token_t tok = get_token();
if (tok.is_type(STRING))
{
@@ -395,24 +389,11 @@ void parser_t::device(const pstring &dev_type)
nl_double val = eval_param(tok);
m_setup.register_param(paramfq, val);
}
- cnt++;
}
-
- token_t tok = get_token();
- cnt = 0;
- while (tok.is(m_tok_comma) && cnt < termlist.size())
- {
- pstring output_name = get_identifier();
-
- m_setup.register_link(devname + "." + termlist[cnt], output_name);
-
- cnt++;
- tok = get_token();
- }
- if (cnt != termlist.size())
- error(plib::pfmt("Input count mismatch for {1} - expected {2} found {3}")(devname)(termlist.size())(cnt));
- require_token(tok, m_tok_param_right);
}
+
+ // error(plib::pfmt("Input count mismatch for {1} - expected {2} found {3}")(devname)(termlist.size())(cnt));
+ require_token(m_tok_param_right);
}
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 06cef2a0947..5c68449f6c4 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -103,27 +103,17 @@ void setup_t::namespace_pop()
void setup_t::register_lib_entry(const pstring &name)
{
- if (plib::container::contains(m_lib, name))
- log().warning("Lib entry collection already contains {1}. IGNORED", name);
- else
- m_lib.push_back(name);
+ factory().register_device(plib::make_unique_base<factory::element_t, factory::library_element_t>(*this, name, name, ""));
}
void setup_t::register_dev(const pstring &classname, const pstring &name)
{
- if (plib::container::contains(m_lib, classname))
- {
- namespace_push(name);
- include(classname);
- namespace_pop();
- }
- else
- {
- auto f = factory().factory_by_name(classname);
- if (f == nullptr)
- log().fatal("Class {1} not found!\n", classname);
- m_device_factory.push_back(std::pair<pstring, base_factory_t *>(build_fqn(name), f));
- }
+ auto f = factory().factory_by_name(classname);
+ if (f == nullptr)
+ log().fatal("Class {1} not found!\n", classname);
+ /* make sure we parse macro library entries */
+ f->macro_actions(netlist(), build_fqn(name));
+ m_device_factory.push_back(std::pair<pstring, factory::element_t *>(build_fqn(name), f));
}
bool setup_t::device_exists(const pstring name) const
@@ -165,7 +155,7 @@ void setup_t::register_dippins_arr(const pstring &terms)
{
plib::pstring_vector_t list(terms,", ");
if (list.size() == 0 || (list.size() % 2) == 1)
- log().fatal("You must pass an equal number of pins to DIPPINS");
+ log().fatal("You must pass an equal number of pins to DIPPINS {1}" , build_fqn(""));
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
@@ -207,7 +197,7 @@ double setup_t::get_initial_param_val(const pstring name, const double def)
if (i != m_param_values.end())
{
double vald = 0;
- if (sscanf(i->second.cstr(), "%lf", &vald) != 1)
+ if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
log().fatal("Invalid number conversion {1} : {2}\n", name, i->second);
return vald;
}
@@ -221,7 +211,7 @@ int setup_t::get_initial_param_val(const pstring name, const int def)
if (i != m_param_values.end())
{
double vald = 0;
- if (sscanf(i->second.cstr(), "%lf", &vald) != 1)
+ if (sscanf(i->second.c_str(), "%lf", &vald) != 1)
log().fatal("Invalid number conversion {1} : {2}\n", name, i->second);
return static_cast<int>(vald);
}
@@ -349,7 +339,7 @@ const pstring setup_t::resolve_alias(const pstring &name) const
ret = temp;
auto p = m_alias.find(ret);
temp = (p != m_alias.end() ? p->second : "");
- } while (temp != "");
+ } while (temp != "" && temp != ret);
log().debug("{1}==>{2}\n", name, ret);
return ret;
@@ -445,7 +435,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
}
out.net().m_core_terms.clear(); // clear the list
- out.net().register_con(new_proxy->in());
+ out.net().add_terminal(new_proxy->in());
out_cast.set_proxy(proxy);
proxy = new_proxy.get();
@@ -455,6 +445,52 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out)
return proxy;
}
+devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp)
+{
+ nl_assert(inp.is_analog());
+
+ logic_input_t &incast = dynamic_cast<logic_input_t &>(inp);
+ devices::nld_base_proxy *proxy = incast.get_proxy();
+
+ if (proxy != nullptr)
+ return proxy;
+ else
+ {
+ log().debug("connect_terminal_input: connecting proxy\n");
+ pstring x = plib::pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt);
+ auto new_proxy = incast.logic_family()->create_a_d_proxy(netlist(), x, &incast);
+ //auto new_proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
+ incast.set_proxy(new_proxy.get());
+ m_proxy_cnt++;
+
+ auto ret = new_proxy.get();
+
+#if 1
+ /* connect all existing terminals to new net */
+
+ if (inp.has_net())
+ {
+ for (auto & p : inp.net().m_core_terms)
+ {
+ p->clear_net(); // de-link from all nets ...
+ if (!connect(ret->proxy_term(), *p))
+ log().fatal("Error connecting {1} to {2}\n", ret->proxy_term().name(), (*p).name());
+ }
+ inp.net().m_core_terms.clear(); // clear the list
+ }
+ ret->out().net().add_terminal(inp);
+#else
+ if (inp.has_net())
+ //fatalerror("logic inputs can only belong to one net!\n");
+ merge_nets(ret->out().net(), inp.net());
+ else
+ ret->out().net().add_terminal(inp);
+#endif
+ netlist().register_dev(std::move(new_proxy));
+ return ret;
+ }
+}
+
void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet)
{
netlist().log().debug("merging nets ...\n");
@@ -484,17 +520,16 @@ void setup_t::connect_input_output(detail::core_terminal_t &in, detail::core_ter
{
if (out.is_analog() && in.is_logic())
{
+#if 0
logic_input_t &incast = dynamic_cast<logic_input_t &>(in);
pstring x = plib::pfmt("proxy_ad_{1}_{2}")(in.name())( m_proxy_cnt);
auto proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
incast.set_proxy(proxy.get());
m_proxy_cnt++;
+#endif
+ auto proxy = get_a_d_proxy(in);
- proxy->m_Q.net().register_con(in);
- out.net().register_con(proxy->m_I);
-
- netlist().register_dev(std::move(proxy));
-
+ out.net().add_terminal(proxy->proxy_term());
}
else if (out.is_logic() && in.is_analog())
{
@@ -508,7 +543,7 @@ void setup_t::connect_input_output(detail::core_terminal_t &in, detail::core_ter
if (in.has_net())
merge_nets(out.net(), in.net());
else
- out.net().register_con(in);
+ out.net().add_terminal(in);
}
}
@@ -522,22 +557,19 @@ void setup_t::connect_terminal_input(terminal_t &term, detail::core_terminal_t &
else if (inp.is_logic())
{
netlist().log().verbose("connect terminal {1} (in, {2}) to {3}\n", inp.name(), pstring(inp.is_analog() ? "analog" : inp.is_logic() ? "logic" : "?"), term.name());
+#if 0
logic_input_t &incast = dynamic_cast<logic_input_t &>(inp);
log().debug("connect_terminal_input: connecting proxy\n");
pstring x = plib::pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt);
auto proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
incast.set_proxy(proxy.get());
m_proxy_cnt++;
+#endif
+ auto proxy = get_a_d_proxy(inp);
- connect_terminals(term, proxy->m_I);
+ //out.net().register_con(proxy->proxy_term());
+ connect_terminals(term, proxy->proxy_term());
- if (inp.has_net())
- //fatalerror("logic inputs can only belong to one net!\n");
- merge_nets(proxy->m_Q.net(), inp.net());
- else
- proxy->m_Q.net().register_con(inp);
-
- netlist().register_dev(std::move(proxy));
}
else
{
@@ -554,7 +586,7 @@ void setup_t::connect_terminal_output(terminal_t &in, detail::core_terminal_t &o
if (in.has_net())
merge_nets(out.net(), in.net());
else
- out.net().register_con(in);
+ out.net().add_terminal(in);
}
else if (out.is_logic())
{
@@ -579,12 +611,12 @@ void setup_t::connect_terminals(detail::core_terminal_t &t1, detail::core_termin
else if (t2.has_net())
{
log().debug("T2 has net\n");
- t2.net().register_con(t1);
+ t2.net().add_terminal(t1);
}
else if (t1.has_net())
{
log().debug("T1 has net\n");
- t1.net().register_con(t2);
+ t1.net().add_terminal(t2);
}
else
{
@@ -592,8 +624,8 @@ void setup_t::connect_terminals(detail::core_terminal_t &t1, detail::core_termin
// FIXME: Nets should have a unique name
auto anet = plib::palloc<analog_net_t>(netlist(),"net." + t1.name());
t1.set_net(anet);
- anet->register_con(t2);
- anet->register_con(t1);
+ anet->add_terminal(t2);
+ anet->add_terminal(t1);
}
}
@@ -836,6 +868,10 @@ public:
{
return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
+ virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override
+ {
+ return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied);
+ }
};
const logic_family_desc_t *setup_t::family_from_model(const pstring &model)
@@ -994,7 +1030,8 @@ std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring name)
return strm;
}
}
- log().fatal("unable to find data named {1} in source collection", name);
+ //log().fatal("unable to find data named {1} in source collection", name);
+ log().warning("unable to find data named {1} in source collection", name);
return std::unique_ptr<plib::pistream>(nullptr);
}
@@ -1030,12 +1067,12 @@ bool source_t::parse(const pstring &name)
std::unique_ptr<plib::pistream> source_string_t::stream(const pstring &name)
{
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.cstr(), m_str.len());
+ return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), m_str.len());
}
std::unique_ptr<plib::pistream> source_mem_t::stream(const pstring &name)
{
- return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.cstr(), m_str.len());
+ return plib::make_unique_base<plib::pistream, plib::pimemstream>(m_str.c_str(), m_str.len());
}
std::unique_ptr<plib::pistream> source_file_t::stream(const pstring &name)
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index e560a3b9f79..1edc3b50781 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -92,7 +92,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
desc.classname = #cname ; \
desc.ni = in; \
desc.no = out; \
- desc.def_param = pstring("+") + def_params; \
+ desc.def_param = def_params; \
desc.family = "";
#define TT_HEAD(x) \
@@ -252,10 +252,8 @@ namespace netlist
void register_define(pstring def, pstring val) { m_defines.push_back(plib::ppreprocessor::define_t(def, val)); }
void register_define(pstring defstr);
- factory_list_t &factory() { return m_factory; }
- const factory_list_t &factory() const { return m_factory; }
-
- bool is_library_item(const pstring &name) const { return plib::container::contains(m_lib, name); }
+ factory::list_t &factory() { return m_factory; }
+ const factory::list_t &factory() const { return m_factory; }
/* model / family related */
@@ -275,7 +273,7 @@ namespace netlist
plib::plog_base<NL_DEBUG> &log();
const plib::plog_base<NL_DEBUG> &log() const;
- std::vector<std::pair<pstring, base_factory_t *>> m_device_factory;
+ std::vector<std::pair<pstring, factory::element_t *>> m_device_factory;
std::unordered_map<pstring, pstring> m_alias;
std::unordered_map<pstring, pstring> m_param_values;
@@ -300,17 +298,17 @@ namespace netlist
pstring objtype_as_str(detail::device_object_t &in) const;
devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out);
+ devices::nld_base_proxy *get_a_d_proxy(detail::core_terminal_t &inp);
netlist_t &m_netlist;
std::unordered_map<pstring, param_ref_t> m_params;
std::vector<link_t> m_links;
- factory_list_t m_factory;
+ factory::list_t m_factory;
std::unordered_map<pstring, pstring> m_models;
std::stack<pstring> m_namespace_stack;
source_t::list_t m_sources;
std::vector<plib::ppreprocessor::define_t> m_defines;
- std::vector<pstring> m_lib;
unsigned m_proxy_cnt;
unsigned m_frontier_cnt;
diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp
index 0ed2ca3a620..92f79f27702 100644
--- a/src/lib/netlist/plib/pdynlib.cpp
+++ b/src/lib/netlist/plib/pdynlib.cpp
@@ -62,8 +62,8 @@ dynlib::dynlib(const pstring libname)
: m_isLoaded(false), m_lib(nullptr)
{
#ifdef _WIN32
- //fprintf(stderr, "win: loading <%s>\n", libname.cstr());
- TCHAR *buffer = tstring_from_utf8(libname.cstr());
+ //fprintf(stderr, "win: loading <%s>\n", libname.c_str());
+ TCHAR *buffer = tstring_from_utf8(libname.c_str());
if (libname != "")
m_lib = LoadLibrary(buffer);
else
@@ -71,27 +71,27 @@ dynlib::dynlib(const pstring libname)
if (m_lib != nullptr)
m_isLoaded = true;
//else
- // fprintf(stderr, "win: library <%s> not found!\n", libname.cstr());
+ // fprintf(stderr, "win: library <%s> not found!\n", libname.c_str());
pfree_array(buffer);
#else
- //printf("loading <%s>\n", libname.cstr());
+ //printf("loading <%s>\n", libname.c_str());
if (libname != "")
- m_lib = dlopen(libname.cstr(), RTLD_LAZY);
+ m_lib = dlopen(libname.c_str(), RTLD_LAZY);
else
m_lib = dlopen(nullptr, RTLD_LAZY);
if (m_lib != nullptr)
m_isLoaded = true;
//else
- // printf("library <%s> not found: %s\n", libname.cstr(), dlerror());
+ // printf("library <%s> not found: %s\n", libname.c_str(), dlerror());
#endif
}
dynlib::dynlib(const pstring path, const pstring libname)
: m_isLoaded(false), m_lib(nullptr)
{
- // printf("win: loading <%s>\n", libname.cstr());
+ // printf("win: loading <%s>\n", libname.c_str());
#ifdef _WIN32
- TCHAR *buffer = tstring_from_utf8(libname.cstr());
+ TCHAR *buffer = tstring_from_utf8(libname.c_str());
if (libname != "")
m_lib = LoadLibrary(buffer);
else
@@ -100,20 +100,20 @@ dynlib::dynlib(const pstring path, const pstring libname)
m_isLoaded = true;
else
{
- //printf("win: library <%s> not found!\n", libname.cstr());
+ //printf("win: library <%s> not found!\n", libname.c_str());
}
pfree_array(buffer);
#else
- //printf("loading <%s>\n", libname.cstr());
+ //printf("loading <%s>\n", libname.c_str());
if (libname != "")
- m_lib = dlopen(libname.cstr(), RTLD_LAZY);
+ m_lib = dlopen(libname.c_str(), RTLD_LAZY);
else
m_lib = dlopen(nullptr, RTLD_LAZY);
if (m_lib != nullptr)
m_isLoaded = true;
else
{
- //printf("library <%s> not found!\n", libname.cstr());
+ //printf("library <%s> not found!\n", libname.c_str());
}
#endif
}
@@ -138,9 +138,9 @@ bool dynlib::isLoaded() const
void *dynlib::getsym_p(const pstring name)
{
#ifdef _WIN32
- return (void *) GetProcAddress((HMODULE) m_lib, name.cstr());
+ return (void *) GetProcAddress((HMODULE) m_lib, name.c_str());
#else
- return dlsym(m_lib, name.cstr());
+ return dlsym(m_lib, name.c_str());
#endif
}
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp
index 770a53af49d..73da6822d20 100644
--- a/src/lib/netlist/plib/pfmtlog.cpp
+++ b/src/lib/netlist/plib/pfmtlog.cpp
@@ -26,7 +26,7 @@ pfmt::pfmt(const pstring &fmt)
m_allocated = 2 * l;
m_str = palloc_array<char>(2 * l);
}
- memcpy(m_str, fmt.cstr(), l);
+ memcpy(m_str, fmt.c_str(), l);
}
pfmt::pfmt(const char *fmt)
diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h
index 0e8b7f46946..49f8ae62b44 100644
--- a/src/lib/netlist/plib/pfmtlog.h
+++ b/src/lib/netlist/plib/pfmtlog.h
@@ -122,7 +122,7 @@ public:
P &operator ()(const char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast<P &>(*this); }
P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast<P &>(*this); }
P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast<P &>(*this); }
- P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast<P &>(*this); }
+ P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.c_str() ); return static_cast<P &>(*this); }
template<typename T>
P &operator ()(const T x, const char *f = "")
diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp
index ad2010213f9..b9895036a12 100644
--- a/src/lib/netlist/plib/pstream.cpp
+++ b/src/lib/netlist/plib/pstream.cpp
@@ -58,7 +58,7 @@ void postream::write(pistream &strm)
pifilestream::pifilestream(const pstring &fname)
: pistream(0)
-, m_file(fopen(fname.cstr(), "rb"))
+, m_file(fopen(fname.c_str(), "rb"))
, m_pos(0)
, m_actually_close(true)
, m_filename(fname)
@@ -147,7 +147,7 @@ pstdin::pstdin()
// -----------------------------------------------------------------------------
pofilestream::pofilestream(const pstring &fname)
-: postream(0), m_file(fopen(fname.cstr(), "wb")), m_pos(0), m_actually_close(true), m_filename(fname)
+: postream(0), m_file(fopen(fname.c_str(), "wb")), m_pos(0), m_actually_close(true), m_filename(fname)
{
if (m_file == nullptr)
throw file_open_e(m_filename);
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h
index 20aaab83a3a..e400837c3ac 100644
--- a/src/lib/netlist/plib/pstream.h
+++ b/src/lib/netlist/plib/pstream.h
@@ -126,7 +126,7 @@ public:
void write(const pstring &text)
{
- write(text.cstr(), text.blen());
+ write(text.c_str(), text.blen());
}
void write(const char c)
@@ -325,7 +325,7 @@ class pistringstream : public pimemstream
P_PREVENT_COPYING(pistringstream)
public:
- pistringstream(const pstring &str) : pimemstream(str.cstr(), str.len()), m_str(str) { }
+ pistringstream(const pstring &str) : pimemstream(str.c_str(), str.len()), m_str(str) { }
private:
/* only needed for a reference till destruction */
diff --git a/src/lib/netlist/plib/pstring.cpp b/src/lib/netlist/plib/pstring.cpp
index d42ef6f4400..2506357c9a5 100644
--- a/src/lib/netlist/plib/pstring.cpp
+++ b/src/lib/netlist/plib/pstring.cpp
@@ -46,7 +46,7 @@ void pstring_t<F>::pcat(const pstring_t &s)
if (m_ptr->len() > 0)
std::memcpy(n->str(), m_ptr->str(), m_ptr->len());
if (slen > 0)
- std::memcpy(n->str() + m_ptr->len(), s.cstr(), slen);
+ std::memcpy(n->str() + m_ptr->len(), s.c_str(), slen);
*(n->str() + n->len()) = 0;
sfree(m_ptr);
m_ptr = n;
@@ -65,7 +65,7 @@ int pstring_t<F>::pcmp(const pstring_t &right) const
else
return -1;
}
- int ret = memcmp(m_ptr->str(), right.cstr(), l);
+ int ret = memcmp(m_ptr->str(), right.c_str(), l);
if (ret == 0)
{
if (this->blen() > right.blen())
@@ -102,7 +102,7 @@ template<typename F>
const pstring_t<F> pstring_t<F>::ucase() const
{
pstring_t ret = *this;
- ret.pcopy(cstr(), blen());
+ ret.pcopy(c_str(), blen());
for (std::size_t i=0; i<ret.len(); i++)
ret.m_ptr->str()[i] = static_cast<char>(toupper(static_cast<int>(ret.m_ptr->str()[i])));
return ret;
@@ -230,7 +230,7 @@ double pstring_t<F>::as_double(bool *error) const
if (error != nullptr)
*error = false;
- ret = strtod(cstr(), &e);
+ ret = strtod(c_str(), &e);
if (*e != 0)
if (error != nullptr)
*error = true;
@@ -246,9 +246,9 @@ long pstring_t<F>::as_long(bool *error) const
if (error != nullptr)
*error = false;
if (startsWith("0x"))
- ret = strtol(substr(2).cstr(), &e, 16);
+ ret = strtol(substr(2).c_str(), &e, 16);
else
- ret = strtol(cstr(), &e, 10);
+ ret = strtol(c_str(), &e, 10);
if (*e != 0)
if (error != nullptr)
*error = true;
@@ -279,7 +279,7 @@ bool pstring_t<F>::startsWith(const pstring_t &arg) const
if (arg.blen() > blen())
return false;
else
- return (memcmp(arg.cstr(), cstr(), arg.blen()) == 0);
+ return (memcmp(arg.c_str(), c_str(), arg.blen()) == 0);
}
template<typename F>
@@ -288,7 +288,7 @@ bool pstring_t<F>::endsWith(const pstring_t &arg) const
if (arg.blen() > blen())
return false;
else
- return (memcmp(cstr()+this->blen()-arg.blen(), arg.cstr(), arg.blen()) == 0);
+ return (memcmp(c_str()+this->blen()-arg.blen(), arg.c_str(), arg.blen()) == 0);
}
@@ -299,7 +299,7 @@ bool pstring_t<F>::startsWith(const mem_t *arg) const
if (alen > blen())
return false;
else
- return (memcmp(arg, cstr(), alen) == 0);
+ return (memcmp(arg, c_str(), alen) == 0);
}
template<typename F>
@@ -351,7 +351,7 @@ void pstringbuffer::pcopy(const pstring &from)
{
std::size_t nl = from.blen() + 1;
resize(nl);
- std::memcpy(m_ptr, from.cstr(), nl);
+ std::memcpy(m_ptr, from.c_str(), nl);
}
void pstringbuffer::pcat(const char *s)
@@ -377,7 +377,7 @@ void pstringbuffer::pcat(const pstring &s)
const std::size_t slen = s.blen();
const std::size_t nl = m_len + slen + 1;
resize(nl);
- std::memcpy(m_ptr + m_len, s.cstr(), slen);
+ std::memcpy(m_ptr + m_len, s.c_str(), slen);
m_len += slen;
m_ptr[m_len] = 0;
}
diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h
index 17132a5bf31..16bf61b08ee 100644
--- a/src/lib/netlist/plib/pstring.h
+++ b/src/lib/netlist/plib/pstring.h
@@ -90,7 +90,7 @@ public:
iterator end() const { return iterator(m_ptr->str() + blen()); }
// C string conversion helpers
- const mem_t *cstr() const { return m_ptr->str(); }
+ const mem_t *c_str() const { return m_ptr->str(); }
// concatenation operators
pstring_t& operator+=(const pstring_t &string) { pcat(string); return *this; }
@@ -356,7 +356,7 @@ public:
pstringbuffer &operator=(const pstringbuffer &string) { pcopy(string); return *this; }
// C string conversion helpers
- const char *cstr() const { return m_ptr; }
+ const char *c_str() const { return m_ptr; }
operator pstring() const { return pstring(m_ptr); }
@@ -405,7 +405,7 @@ namespace std
typedef std::size_t result_type;
result_type operator()(argument_type const& s) const
{
- const pstring::mem_t *string = s.cstr();
+ const pstring::mem_t *string = s.c_str();
result_type result = 5381;
for (pstring::mem_t c = *string; c != 0; c = *string++)
result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ static_cast<result_type>(c);
diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h
index 2e2d19994e4..9c477f71944 100644
--- a/src/lib/netlist/plib/ptypes.h
+++ b/src/lib/netlist/plib/ptypes.h
@@ -57,7 +57,7 @@ namespace plib
ename (e v) : m_v(v) { } \
bool set_from_string (const pstring &s) { \
static const char *strings = # __VA_ARGS__; \
- int f = from_string_int(strings, s.cstr()); \
+ int f = from_string_int(strings, s.c_str()); \
if (f>=0) { m_v = static_cast<e>(f); return true; } else { return false; } \
} \
operator e() const {return m_v;} \
diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp
index ad340017bc4..39e1b444f33 100644
--- a/src/lib/netlist/plib/putil.cpp
+++ b/src/lib/netlist/plib/putil.cpp
@@ -33,10 +33,10 @@ namespace plib
const pstring environment(const pstring &var, const pstring &default_val)
{
- if (getenv(var.cstr()) == nullptr)
+ if (getenv(var.c_str()) == nullptr)
return default_val;
else
- return pstring(getenv(var.cstr()));
+ return pstring(getenv(var.c_str()));
}
}
@@ -73,7 +73,7 @@ namespace plib
std::size_t p = static_cast<std::size_t>(-1);
for (std::size_t j=0; j < onstrl.size(); j++)
{
- if (std::memcmp(onstrl[j].cstr(), &(str.cstr()[i]), onstrl[j].blen())==0)
+ if (std::memcmp(onstrl[j].c_str(), &(str.c_str()[i]), onstrl[j].blen())==0)
{
p = j;
break;
@@ -90,7 +90,7 @@ namespace plib
}
else
{
- pstring::traits::code_t c = pstring::traits::code(str.cstr() + i);
+ pstring::traits::code_t c = pstring::traits::code(str.c_str() + i);
col += c;
i+=pstring::traits::codelen(c);
}
diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h
index cc388cd3393..9e79e958927 100644
--- a/src/lib/netlist/plib/putil.h
+++ b/src/lib/netlist/plib/putil.h
@@ -45,6 +45,11 @@ namespace plib
con.insert(con.begin() + static_cast<std::ptrdiff_t>(index), elem);
}
+ template <class C>
+ void remove(C &con, const typename C::value_type &elem)
+ {
+ con.erase(std::remove(con.begin(), con.end(), elem), con.end());
+ }
}
template <class C>
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index fbfa3a50c5c..086fe517a2f 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -181,7 +181,7 @@ protected:
void vlog(const plib::plog_level &l, const pstring &ls) const override
{
- pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.cstr());
+ pstring err = plib::pfmt("{}: {}\n")(l.name())(ls.c_str());
pout("{}", err);
if (l == plib::plog_level::FATAL)
throw netlist::nl_exception(err);
@@ -199,7 +199,7 @@ void usage(tool_options_t &opts)
{
pout("{}\n", opts.help(
"nltool serves as the Swiss Army knife to run, test and convert netlists.",
- "nltool [options]").cstr());
+ "nltool [options]").c_str());
}
struct input_t
@@ -214,7 +214,7 @@ struct input_t
{
char buf[400];
double t;
- int e = sscanf(line.cstr(), "%lf,%[^,],%lf", &t, buf, &m_value);
+ int e = sscanf(line.c_str(), "%lf,%[^,],%lf", &t, buf, &m_value);
if ( e!= 3)
throw netlist::nl_exception(plib::pfmt("error {1} scanning line {2}\n")(e)(line));
m_time = netlist::netlist_time::from_double(t);
@@ -346,7 +346,7 @@ static void listdevices(tool_options_t &opts)
if (opts.opt_quiet())
nt.log().warning.set_enabled(false);
- netlist::factory_list_t &list = nt.setup().factory();
+ netlist::factory::list_t &list = nt.setup().factory();
nt.setup().register_source(plib::make_unique_base<netlist::source_t,
netlist::source_proc_t>(nt.setup(), "dummy", &netlist_dummy));
@@ -363,6 +363,7 @@ static void listdevices(tool_options_t &opts)
pstring out = plib::pfmt("{1} {2}(<id>")(f->classname(),"-20")(f->name());
std::vector<pstring> terms;
+ f->macro_actions(nt.setup().netlist(), f->name() + "_lc");
auto d = f->Create(nt.setup().netlist(), f->name() + "_lc");
// get the list of terminals ...
@@ -381,10 +382,12 @@ static void listdevices(tool_options_t &opts)
if (t.first.startsWith(d->name()))
{
pstring tn(t.first.substr(d->name().len()+1));
+ //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), tn.c_str());
if (tn.find(".") == tn.end())
{
terms.push_back(tn);
pstring resolved = nt.setup().resolve_alias(t.first);
+ //printf("\t%s %s %s\n", t.first.c_str(), t.second.c_str(), resolved.c_str());
if (resolved != t.first)
{
auto found = std::find(terms.begin(), terms.end(), resolved.substr(d->name().len()+1));
@@ -395,27 +398,22 @@ static void listdevices(tool_options_t &opts)
}
}
- if (f->param_desc().startsWith("+"))
+ out += "," + f->param_desc();
+ for (auto p : plib::pstring_vector_t(f->param_desc(),",") )
{
- out += "," + f->param_desc().substr(1);
- terms.clear();
- }
- else if (f->param_desc() == "-")
- {
- /* no params at all */
- }
- else
- {
- out += "," + f->param_desc();
+ if (p.startsWith("+"))
+ {
+ plib::container::remove(terms, p.substr(1));
+ }
}
out += ")";
- printf("%s\n", out.cstr());
+ printf("%s\n", out.c_str());
if (terms.size() > 0)
{
pstring t = "";
for (auto & j : terms)
t += "," + j;
- printf("Terminals: %s\n", t.substr(1).cstr());
+ printf("\tTerminals: %s\n", t.substr(1).c_str());
}
devs.push_back(std::move(d));
}
@@ -514,11 +512,11 @@ int main(int argc, char *argv[])
result = c.result();
}
/* present result */
- pout_strm.write(result.cstr());
+ pout_strm.write(result.c_str());
}
else
{
- perr("Unknown command {}\n", cmd.cstr());
+ perr("Unknown command {}\n", cmd.c_str());
usage(opts);
return 1;
}
diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp
index ea5fc450f2b..32ca8c6e173 100644
--- a/src/lib/netlist/prg/nlwav.cpp
+++ b/src/lib/netlist/prg/nlwav.cpp
@@ -148,7 +148,7 @@ static void convert(nlwav_options_t &opts)
{
#if 1
double t = 0.0; double v = 0.0;
- sscanf(line.cstr(), "%lf %lf", &t, &v);
+ sscanf(line.c_str(), "%lf %lf", &t, &v);
while (t >= ct)
{
outsam += (ct - lt) * cursam;
@@ -203,7 +203,7 @@ static void convert(nlwav_options_t &opts)
static void usage(plib::pstream_fmt_writer_t &fw, nlwav_options_t &opts)
{
fw("{}\n", opts.help("Convert netlist log files into wav files.\n",
- "nltool [options]").cstr());
+ "nltool [options]").c_str());
}
diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h
index 55d9d630224..e644ce40085 100644
--- a/src/lib/netlist/solver/nld_ms_w.h
+++ b/src/lib/netlist/solver/nld_ms_w.h
@@ -300,7 +300,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
for (unsigned i = 0; i < rowcount; i++)
{
if (H[i][i] == 0.0)
- printf("%s H singular\n", this->name().cstr());
+ printf("%s H singular\n", this->name().c_str());
const nl_double f = 1.0 / H[i][i];
for (unsigned j = i+1; j < rowcount; j++)
{
@@ -355,7 +355,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::solve_non_dynamic(const bool newton_
tmp += A(i,j) * new_V[j];
}
if (std::abs(tmp-RHS(i)) > 1e-6)
- printf("%s failed on row %d: %f RHS: %f\n", this->name().cstr(), i, std::abs(tmp-RHS(i)), RHS(i));
+ printf("%s failed on row %d: %f RHS: %f\n", this->name().c_str(), i, std::abs(tmp-RHS(i)), RHS(i));
}
if (newton_raphson)
{
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index b9c69884382..3f4deb0340f 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -163,7 +163,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets)
nl_assert(p->net().is_analog());
net_proxy_output->m_proxied_net = static_cast<analog_net_t *>(&p->net());
}
- net_proxy_output->net().register_con(*p);
+ net_proxy_output->net().add_terminal(*p);
// FIXME: repeated
net_proxy_output->net().rebuild_list();
log().debug("Added input\n");
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index db1fb5bb3c9..3dc021cce64 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -121,7 +121,7 @@ void nl_convert_base_t::dump_nl()
{
net_t *net = m_nets[m_ext_alias[i]].get();
// use the first terminal ...
- out("ALIAS({}, {})\n", m_ext_alias[i].cstr(), net->terminals()[0].cstr());
+ out("ALIAS({}, {})\n", m_ext_alias[i].c_str(), net->terminals()[0].c_str());
// if the aliased net only has this one terminal connected ==> don't dump
if (net->terminals().size() == 1)
net->set_no_export();
@@ -138,14 +138,14 @@ void nl_convert_base_t::dump_nl()
std::size_t j = sorted[i];
if (m_devs[j]->has_value())
- out("{}({}, {})\n", m_devs[j]->type().cstr(),
- m_devs[j]->name().cstr(), get_nl_val(m_devs[j]->value()).cstr());
+ out("{}({}, {})\n", m_devs[j]->type().c_str(),
+ m_devs[j]->name().c_str(), get_nl_val(m_devs[j]->value()).c_str());
else if (m_devs[j]->has_model())
- out("{}({}, \"{}\")\n", m_devs[j]->type().cstr(),
- m_devs[j]->name().cstr(), m_devs[j]->model().cstr());
+ out("{}({}, \"{}\")\n", m_devs[j]->type().c_str(),
+ m_devs[j]->name().c_str(), m_devs[j]->model().c_str());
else
- out("{}({})\n", m_devs[j]->type().cstr(),
- m_devs[j]->name().cstr());
+ out("{}({})\n", m_devs[j]->type().c_str(),
+ m_devs[j]->name().c_str());
}
// print nets
for (auto & i : m_nets)
@@ -153,11 +153,11 @@ void nl_convert_base_t::dump_nl()
net_t * net = i.second.get();
if (!net->is_no_export())
{
- //printf("Net {}\n", net->name().cstr());
- out("NET_C({}", net->terminals()[0].cstr() );
+ //printf("Net {}\n", net->name().c_str());
+ out("NET_C({}", net->terminals()[0].c_str() );
for (std::size_t j=1; j<net->terminals().size(); j++)
{
- out(", {}", net->terminals()[j].cstr() );
+ out(", {}", net->terminals()[j].c_str() );
}
out(")\n");
}
@@ -178,7 +178,7 @@ const pstring nl_convert_base_t::get_nl_val(const double val)
break;
i++;
}
- return plib::pfmt(m_units[i].m_func.cstr())(val / m_units[i].m_mult);
+ return plib::pfmt(m_units[i].m_func.c_str())(val / m_units[i].m_mult);
}
}
double nl_convert_base_t::get_sp_unit(const pstring &unit)
@@ -190,7 +190,7 @@ double nl_convert_base_t::get_sp_unit(const pstring &unit)
return m_units[i].m_mult;
i++;
}
- fprintf(stderr, "Unit %s unknown\n", unit.cstr());
+ fprintf(stderr, "Unit %s unknown\n", unit.c_str());
return 0.0;
}
@@ -269,12 +269,12 @@ void nl_convert_spice_t::process_line(const pstring &line)
out("// {}\n", line.substr(1));
break;
case '*':
- out("// {}\n", line.substr(1).cstr());
+ out("// {}\n", line.substr(1).c_str());
break;
case '.':
if (tt[0].equals(".SUBCKT"))
{
- out("NETLIST_START({})\n", tt[1].cstr());
+ out("NETLIST_START({})\n", tt[1].c_str());
for (std::size_t i=2; i<tt.size(); i++)
add_ext_alias(tt[i]);
}
@@ -284,7 +284,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
out("NETLIST_END()\n");
}
else
- out("// {}\n", line.cstr());
+ out("// {}\n", line.c_str());
break;
case 'Q':
{
@@ -304,7 +304,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
if (m.size() == 2)
{
if (m[1].len() != 4)
- fprintf(stderr, "error with model desc %s\n", model.cstr());
+ fprintf(stderr, "error with model desc %s\n", model.c_str());
pins = m[1].left(m[1].begin() + 3);
}
add_device("QBJT_EB", tt[0], m[0]);
@@ -346,7 +346,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
//add_term(tt[2], tt[0] + ".2");
}
else
- fprintf(stderr, "Voltage Source %s not connected to GND\n", tt[0].cstr());
+ fprintf(stderr, "Voltage Source %s not connected to GND\n", tt[0].c_str());
break;
case 'I': // Input pin special notation
{
@@ -379,7 +379,7 @@ void nl_convert_spice_t::process_line(const pstring &line)
break;
}
default:
- out("// IGNORED {}: {}\n", tt[0].cstr(), line.cstr());
+ out("// IGNORED {}: {}\n", tt[0].c_str(), line.c_str());
}
}
}
@@ -485,7 +485,7 @@ void nl_convert_eagle_t::convert(const pstring &contents)
}
else
{
- out("Unexpected {}\n", token.str().cstr());
+ out("Unexpected {}\n", token.str().c_str());
return;
}
}
diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h
index fa496a092d7..859c5ea1e9c 100644
--- a/src/lib/netlist/tools/nl_convert.h
+++ b/src/lib/netlist/tools/nl_convert.h
@@ -204,7 +204,7 @@ public:
void verror(const pstring &msg, int line_num, const pstring &line) override
{
- m_convert.out("{} (line {}): {}\n", msg.cstr(), line_num, line.cstr());
+ m_convert.out("{} (line {}): {}\n", msg.c_str(), line_num, line.c_str());
}
@@ -273,7 +273,7 @@ public:
void verror(const pstring &msg, int line_num, const pstring &line) override
{
- m_convert.out("{} (line {}): {}\n", msg.cstr(), line_num, line.cstr());
+ m_convert.out("{} (line {}): {}\n", msg.c_str(), line_num, line.c_str());
}
diff --git a/src/lib/util/unicode.cpp b/src/lib/util/unicode.cpp
index a6c5515fbf6..b3e92e4094e 100644
--- a/src/lib/util/unicode.cpp
+++ b/src/lib/util/unicode.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Aaron Giles
/*********************************************************************
- unicode.c
+ unicode.cpp
Unicode related functions
@@ -10,6 +10,12 @@
#include "unicode.h"
+#ifdef _WIN32
+#define UTF8PROC_DLLEXPORT
+#endif
+
+#include "utf8proc/utf8proc.h"
+
//-------------------------------------------------
// uchar_isvalid - return true if a given
@@ -346,6 +352,87 @@ int utf16f_from_uchar(char16_t *utf16string, size_t count, char32_t uchar)
//-------------------------------------------------
+// internal_normalize_unicode - uses utf8proc to
+// normalize unicode
+//-------------------------------------------------
+
+static std::string internal_normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form, bool null_terminated)
+{
+ // convert the normalization form
+ int options;
+ switch (normalization_form)
+ {
+ case unicode_normalization_form::C:
+ options = UTF8PROC_STABLE | UTF8PROC_COMPOSE;
+ break;
+ case unicode_normalization_form::D:
+ options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE;
+ break;
+ case unicode_normalization_form::KC:
+ options = UTF8PROC_STABLE | UTF8PROC_COMPOSE | UTF8PROC_COMPAT;
+ break;
+ case unicode_normalization_form::KD:
+ options = UTF8PROC_STABLE | UTF8PROC_DECOMPOSE | UTF8PROC_COMPAT;
+ break;
+ default:
+ throw false;
+ }
+
+ // was this null terminated?
+ if (null_terminated)
+ options |= UTF8PROC_NULLTERM;
+
+ // invoke utf8proc
+ utf8proc_uint8_t *utf8proc_result;
+ utf8proc_ssize_t utf8proc_result_length = utf8proc_map((utf8proc_uint8_t *) s, length, &utf8proc_result, (utf8proc_option_t)options);
+
+ // conver the result
+ std::string result;
+ if (utf8proc_result)
+ {
+ if (utf8proc_result_length > 0)
+ result = std::string((const char *)utf8proc_result, utf8proc_result_length);
+ free(utf8proc_result);
+ }
+
+ return result;
+}
+
+
+//-------------------------------------------------
+// normalize_unicode - uses utf8proc to normalize
+// unicode
+//-------------------------------------------------
+
+std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form)
+{
+ return internal_normalize_unicode(s.c_str(), s.length(), normalization_form, false);
+}
+
+
+//-------------------------------------------------
+// normalize_unicode - uses utf8proc to normalize
+// unicode
+//-------------------------------------------------
+
+std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form)
+{
+ return internal_normalize_unicode(s, 0, normalization_form, true);
+}
+
+
+//-------------------------------------------------
+// normalize_unicode - uses utf8proc to normalize
+// unicode
+//-------------------------------------------------
+
+std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form)
+{
+ return internal_normalize_unicode(s, length, normalization_form, false);
+}
+
+
+//-------------------------------------------------
// utf8_previous_char - return a pointer to the
// previous character in a string
//-------------------------------------------------
diff --git a/src/lib/util/unicode.h b/src/lib/util/unicode.h
index 5cc6db383ee..ef5267794e6 100644
--- a/src/lib/util/unicode.h
+++ b/src/lib/util/unicode.h
@@ -72,6 +72,9 @@
#define UTF8_UP "\xe2\x86\x91" /* cursor up */
#define UTF8_DOWN "\xe2\x86\x93" /* cursor down */
+enum class unicode_normalization_form { C, D, KC, KD };
+
+
/***************************************************************************
FUNCTION PROTOTYPES
@@ -97,6 +100,11 @@ std::string utf8_from_uchar(char32_t uchar);
int utf16_from_uchar(char16_t *utf16string, size_t count, char32_t uchar);
int utf16f_from_uchar(char16_t *utf16string, size_t count, char32_t uchar);
+// unicode normalization
+std::string normalize_unicode(const std::string &s, unicode_normalization_form normalization_form);
+std::string normalize_unicode(const char *s, unicode_normalization_form normalization_form);
+std::string normalize_unicode(const char *s, size_t length, unicode_normalization_form normalization_form);
+
// misc UTF-8 helpers
const char *utf8_previous_char(const char *utf8string);
bool utf8_is_valid_string(const char *utf8string);
diff --git a/src/mame/audio/mario.cpp b/src/mame/audio/mario.cpp
index 7ef691acc68..c7fd9b96292 100644
--- a/src/mame/audio/mario.cpp
+++ b/src/mame/audio/mario.cpp
@@ -6,7 +6,7 @@
#include "sound/ay8910.h"
#include "includes/mario.h"
-
+#include "audio/nl_mario.h"
/****************************************************************
*
@@ -14,9 +14,6 @@
*
****************************************************************/
-/* FIXME: Capacitor aging - only in for calibration now */
-/* Adjustments are needed to bring this close to recordings */
-
#define RUN_VCO_VOLTAGE (0.0) /* 5 in schematics */
#define USE_8039 (0) /* set to 1 to try 8039 hack */
@@ -43,243 +40,6 @@
#if !OLD_SOUND
-/* ---------------------------------------------------------------------- */
-/* mario sound */
-/* ---------------------------------------------------------------------- */
-static NETLIST_START(nl_mario_snd0)
-
- RES(R17, RES_K(27)) /* 20 according to parts list */
- /* 27 verified, 30K in schematics */
- CAP(C14, CAP_U(4.7)) /* verified */
-
- TTL_74123(2H_A)
- NET_C(2H_A.VCC, V5)
- NET_C(2H_A.GND, GND)
- NET_C(SOUND0.Q, 2H_A.B)
- NET_C(GND, 2H_A.A)
- NET_C(2H_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */
- DIODE(D1, "1N4148") /* FIXME: try to identify */
- TTL_7404_INVERT(1H_A, 2H_A.QQ)
- NET_C(R17.1, V5)
- NET_C(R17.2, D1.A, C14.1)
- NET_C(D1.K, 2H_A.RC)
- NET_C(C14.2, 2H_A.C)
-
- RES(R6, RES_K(4.7)) /* verified */
- CAP(C3, CAP_U(10)) /* verified */
-
- NET_C(1H_A.Q, R6.1)
- NET_C(R6.2, C3.1, 1J_A.FC)
- NET_C(R6.2, 2J_A.FC)
- NET_C(C3.2, GND)
-
- //#define MR_C6 CAP_N(3.9) /* verified */
-
- SN74LS629(1J_A, CAP_N(3.9))
- NET_C(1J_A.RNG, V5)
- NET_C(1J_A.ENQ, ttllow)
- NET_C(GND, 1J_A.GND)
-
- //#define MR_C17 CAP_N(22) /* verified */
-
- SN74LS629(2J_A, CAP_N(22))
- NET_C(2J_A.RNG, V5)
- NET_C(2J_A.ENQ, ttllow)
- NET_C(GND, 2J_A.GND)
-
- TTL_7486_XOR(1K_A, 1J_A.Y, 2J_A.Y)
- TTL_7408_AND(2K_A, 2H_A.Q, 1K_A)
-NETLIST_END()
-
-/* ---------------------------------------------------------------------- */
-/* skid sound */
-/* ---------------------------------------------------------------------- */
-
-// FIXME: Diodes are 1S953
-static NETLIST_START(nl_mario_snd7)
-
- RES(R61, RES_K(47))
- CAP(C41, CAP_U(4.7)) /* verified */
-
- TTL_74123(4L_A)
- NET_C(4L_A.VCC, V5)
- NET_C(4L_A.GND, GND)
- NET_C(SOUND7.Q, 4L_A.B)
- NET_C(GND, 4L_A.A)
- NET_C(4L_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */
- DIODE(D10, "1N4148") /* FIXME: try to identify */
- TTL_7404_INVERT(4J_A, 4L_A.Q)
- NET_C(R61.1, V5)
- NET_C(R61.2, D10.A, C41.1)
- NET_C(D10.K, 4L_A.RC)
- NET_C(C41.2, 4L_A.C)
-
- RES(R65, RES_K(10))
- CAP(C44, CAP_U(3.3)) /* verified */
-
- SN74LS629(4K_A, CAP_U(0.022))
- NET_C(4K_A.RNG, V5)
- NET_C(4K_A.ENQ, ttllow)
- NET_C(GND, 4K_A.GND)
- NET_C(R65.1, 4J_A.Q)
- NET_C(R65.2, 4K_A.FC, C44.1)
- NET_C(C44.2, GND)
-
- CD4020_WI(3H, 4K_B.Y, ttllow, V5, GND)
- TTL_7404_INVERT(4J_B, 3H.Q12)
-
- RES(R64, RES_K(20))
- CAP(C43, CAP_U(3.3)) /* verified */
-
- SN74LS629(4K_B, CAP_U(0.0047))
- NET_C(4K_B.RNG, V5)
- NET_C(4K_B.ENQ, ttllow)
- NET_C(GND, 4K_B.GND)
- NET_C(R64.1, 4J_B.Q)
- NET_C(R64.2, 4K_B.FC, C43.1)
- NET_C(C43.2, GND)
-
- TTL_7486_XOR(1K_C, 3H.Q4, 4K_A.Y)
- TTL_7408_AND(2K_C, 4L_A.Q, 1K_C)
-
-NETLIST_END()
-
-/* ---------------------------------------------------------------------- */
-/* DAC sound */
-/* ---------------------------------------------------------------------- */
-static NETLIST_START(nl_mario_dac)
- RES(R34, RES_M(2))
- RES(R35, RES_M(1))
- RES(R36, RES_M(1.8))
- LM3900(3M_1)
- NET_C(3M_1.VM, GND)
- NET_C(3M_1.VP, V5)
-
- NET_C(DAC.VOUT, R34.1)
- NET_C(3M_1.MINUS, R34.2, R35.2)
- NET_C(3M_1.OUT, R35.1)
- NET_C(3M_1.PLUS, R36.1)
- NET_C(R36.2, GND)
-
- RES(R21, RES_M(1.8))
- RES(R23, RES_K(10))
- RES(R25, RES_K(10))
- RES(R37, RES_K(750))
- RES(R38, RES_K(360))
- RES(R39, RES_K(750))
-
- CAP(C18, CAP_P(100))
- CAP(C19, CAP_U(10))
- CAP(C20, CAP_U(1))
- CAP(C30, CAP_P(100))
-
- LM3900(3M_2)
- NET_C(3M_2.VM, GND)
- NET_C(3M_2.VP, V5)
-
- NET_C(R35.1, C20.1)
- NET_C(C20.2, R37.1)
- NET_C(R37.2, R38.2, C18.1, R39.2)
-
- NET_C(C18.2, GND)
- NET_C(R38.1, C30.2, 3M_2.MINUS)
- NET_C(3M_2.OUT, R39.1, C30.1)
-
- NET_C(R21.1, 3M_2.PLUS)
- NET_C(R21.2, C19.1, R25.2, R23.1)
- NET_C(C19.2, R23.2, GND)
- NET_C(R25.1, V5)
-NETLIST_END()
-
-static NETLIST_START(nl_mario)
-
- LOCAL_SOURCE(nl_mario_snd0)
- LOCAL_SOURCE(nl_mario_snd7)
- LOCAL_SOURCE(nl_mario_dac)
-
- SOLVER(Solver, 48000)
- PARAM(Solver.ACCURACY, 1e-6)
- PARAM(Solver.SOR_FACTOR, 1.0)
- PARAM(Solver.GS_THRESHOLD, 5)
- PARAM(Solver.GS_LOOPS, 1)
- //PARAM(Solver.LTE, 5e-2)
- PARAM(Solver.DYNAMIC_TS, 0)
- ANALOG_INPUT(V5, 5)
-
- TTL_INPUT(SOUND0, 1)
- INCLUDE(nl_mario_snd0)
-
- TTL_INPUT(SOUND7, 1)
- INCLUDE(nl_mario_snd7)
-
- R2R_DAC(DAC, 3.4, 10000.0, 8)
- NET_C(DAC.VGND, GND)
-
- INCLUDE(nl_mario_dac)
-
- /* ---------------------------------------------------------------------- */
- /* mixing */
- /* ---------------------------------------------------------------------- */
-
- RES(R20, RES_K(22)) /* verified */
- RES(R19, RES_K(22)) /* verified */
- RES(R40, RES_K(22)) /* verified */
- RES(R41, RES_K(100)) /* verified */
- CAP(C31, CAP_U(0.022)) /* */
-
- NET_C(2K_A.Q, R20.1)
- NET_C(GND, R19.1) //FIXME
- NET_C(2K_C.Q, R41.1)
-
- NET_C(R39.1, R40.1)
-
- NET_C(R20.2, R19.2, R40.2, R41.2, C31.1)
- NET_C(C31.2, GND)
-
- CAP(C32, CAP_U(1)) /* verified */
- RES(R42, RES_K(43)) /* verified */
- RES(R43, RES_K(100)) /* verified */
-
- NET_C(C31.1, C32.1)
- NET_C(C32.2, R42.1, R43.2, Q10.B)
- //NET_C(C32.2, R42.1, R43.2)
- NET_C(R43.1, V5)
- NET_C(R42.2, GND)
-#if 1
- RES(R63, RES_K(1)) /* */
- RES(R62, 150) /* */
-
- QBJT_EB(Q10, "2SC1815")
-
- NET_C(R62.2, GND)
- NET_C(R62.1, Q10.E)
-
- NET_C(R63.1, V5)
- NET_C(R63.2, Q10.C)
-
- CAP(C42, CAP_U(0.1))
- CAP(C47, CAP_U(4.7))
- RES(VR1, RES_K(10))
-
- NET_C(C42.1, C47.1, R62.1)
- NET_C(C42.2, GND)
- NET_C(C47.2, VR1.1)
- NET_C(VR1.2, GND)
-#endif
- /* ---------------------------------------------------------------------- */
- /* Output */
- /* ---------------------------------------------------------------------- */
-
- RES(ROUT, 1000000)
-
- //NET_C(Q10.C, ROUT.1)
- //NET_C(R43.2, ROUT.1)
- NET_C(VR1.1, ROUT.1)
-
- NET_C(GND, ROUT.2)
-
- OPTIMIZE_FRONTIER(R40.1, RES_K(22), 50)
-NETLIST_END()
#else
/****************************************************************
@@ -687,7 +447,7 @@ void mario_state::sound_reset()
address_space &space = machine().device("audiocpu")->memory().space(AS_PROGRAM);
#if USE_8039
- set_ea(machine, 1);
+ set_ea(space, 1);
#endif
/* FIXME: convert to latch8 */
@@ -797,6 +557,8 @@ WRITE8_MEMBER(mario_state::mario_sh2_w)
{
#if OLD_SOUND
m_discrete->write(space, DS_SOUND1_INP, 0);
+#else
+ m_audio_snd1->write(data);
#endif
}
@@ -895,10 +657,11 @@ MACHINE_CONFIG_FRAGMENT( mario_audio )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1)
#else
MCFG_SOUND_ADD("snd_nl", NETLIST_SOUND, 48000)
- MCFG_NETLIST_SETUP(nl_mario)
+ MCFG_NETLIST_SETUP(mario)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MCFG_NETLIST_LOGIC_INPUT("snd_nl", "snd0", "SOUND0.IN", 0)
+ MCFG_NETLIST_LOGIC_INPUT("snd_nl", "snd1", "SOUND1.IN", 0)
MCFG_NETLIST_LOGIC_INPUT("snd_nl", "snd7", "SOUND7.IN", 0)
MCFG_NETLIST_INT_INPUT("snd_nl", "dac", "DAC.VAL", 0, 255)
diff --git a/src/mame/audio/nl_mario.cpp b/src/mame/audio/nl_mario.cpp
new file mode 100644
index 00000000000..1f6c2fb4ab6
--- /dev/null
+++ b/src/mame/audio/nl_mario.cpp
@@ -0,0 +1,306 @@
+// license:BSD-3-Clause
+// copyright-holders:Couriersud
+#include "netlist/devices/net_lib.h"
+
+/* ----------------------------------------------------------------------------
+ * Library section header START
+ * ---------------------------------------------------------------------------*/
+
+#ifndef __PLIB_PREPROCESSOR__
+
+#endif
+
+/* ----------------------------------------------------------------------------
+ * Library section header END
+ * ---------------------------------------------------------------------------*/
+
+/* ----------------------------------------------------------------------------
+ * Mario schematics
+ * ---------------------------------------------------------------------------*/
+
+/* ---------------------------------------------------------------------- */
+/* mario sound */
+/* ---------------------------------------------------------------------- */
+static NETLIST_START(nl_mario_snd0)
+
+ RES(R17, RES_K(27)) /* 20 according to parts list */
+ /* 27 verified, 30K in schematics */
+ CAP(C14, CAP_U(4.7)) /* verified */
+
+ TTL_74123(2H_A)
+ NET_C(2H_A.VCC, V5)
+ NET_C(2H_A.GND, GND)
+ NET_C(SOUND0.Q, 2H_A.B)
+ NET_C(GND, 2H_A.A)
+ NET_C(2H_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */
+ DIODE(D1, "1N4148") /* FIXME: try to identify */
+ TTL_7404_INVERT(1H_A, 2H_A.QQ)
+ NET_C(R17.1, V5)
+ NET_C(R17.2, D1.A, C14.1)
+ NET_C(D1.K, 2H_A.RC)
+ NET_C(C14.2, 2H_A.C)
+
+ RES(R6, RES_K(4.7)) /* verified */
+ CAP(C3, CAP_U(10)) /* verified */
+
+ NET_C(1H_A.Q, R6.1)
+ NET_C(R6.2, C3.1, 1J_A.FC)
+ NET_C(R6.2, 2J_A.FC)
+ NET_C(C3.2, GND)
+
+ // #define MR_C6 CAP_N(3.9) /* verified */
+
+ SN74LS629(1J_A, CAP_N(3.9))
+ NET_C(1J_A.RNG, V5)
+ NET_C(1J_A.ENQ, ttllow)
+ NET_C(GND, 1J_A.GND)
+
+ // #define MR_C17 CAP_N(22) /* verified */
+
+ SN74LS629(2J_A, CAP_N(22))
+ NET_C(2J_A.RNG, V5)
+ NET_C(2J_A.ENQ, ttllow)
+ NET_C(GND, 2J_A.GND)
+
+ TTL_7486_XOR(1K_A, 1J_A.Y, 2J_A.Y)
+ TTL_7408_AND(2K_A, 2H_A.Q, 1K_A)
+NETLIST_END()
+
+/* ---------------------------------------------------------------------- */
+/* luigi sound */
+/* ---------------------------------------------------------------------- */
+static NETLIST_START(nl_mario_snd1)
+
+ RES(R18, RES_K(30)) /* 20 according to parts list */
+ /* 27 verified, 30K in schematics */
+ CAP(C15, CAP_U(4.7)) /* verified */
+
+ TTL_74123(2H_B)
+ NET_C(2H_B.VCC, V5)
+ NET_C(2H_B.GND, GND)
+ NET_C(SOUND1.Q, 2H_B.B)
+ NET_C(GND, 2H_B.A)
+ NET_C(2H_B.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */
+ DIODE(D8, "1N4148") /* FIXME: try to identify */
+ TTL_7404_INVERT(1H_B, 2H_B.QQ)
+ NET_C(R18.1, V5)
+ NET_C(R18.2, D8.A, C15.1)
+ NET_C(D8.K, 2H_B.RC)
+ NET_C(C15.2, 2H_B.C)
+
+ RES(R7, RES_K(4.7)) /* verified */
+ CAP(C4, CAP_U(4.7)) /* verified */
+
+ NET_C(1H_B.Q, R7.1)
+ NET_C(R7.2, C4.1, 1J_B.FC)
+ NET_C(R7.2, 2J_B.FC)
+ NET_C(C4.2, GND)
+
+ SN74LS629(1J_B, CAP_N(39)) /* C5 */
+ NET_C(1J_B.RNG, V5)
+ NET_C(1J_B.ENQ, ttllow)
+ NET_C(GND, 1J_B.GND)
+
+ SN74LS629(2J_B, CAP_N(6.8)) /* C16 */
+ NET_C(2J_B.RNG, V5)
+ NET_C(2J_B.ENQ, ttllow)
+ NET_C(GND, 2J_B.GND)
+
+ TTL_7486_XOR(1K_B, 1J_B.Y, 2J_B.Y)
+ TTL_7408_AND(2K_B, 2H_B.Q, 1K_B)
+NETLIST_END()
+
+/* ---------------------------------------------------------------------- */
+/* skid sound */
+/* ---------------------------------------------------------------------- */
+
+// FIXME: Diodes are 1S953
+static NETLIST_START(nl_mario_snd7)
+
+ RES(R61, RES_K(47))
+ CAP(C41, CAP_U(4.7)) /* verified */
+
+ TTL_74123(4L_A)
+ NET_C(4L_A.VCC, V5)
+ NET_C(4L_A.GND, GND)
+ NET_C(SOUND7.Q, 4L_A.B)
+ NET_C(GND, 4L_A.A)
+ NET_C(4L_A.CLRQ, ttlhigh) /* NOT IN SCHEMATICS */
+ DIODE(D10, "1N4148") /* FIXME: try to identify */
+ TTL_7404_INVERT(4J_A, 4L_A.Q)
+ NET_C(R61.1, V5)
+ NET_C(R61.2, D10.A, C41.1)
+ NET_C(D10.K, 4L_A.RC)
+ NET_C(C41.2, 4L_A.C)
+
+ RES(R65, RES_K(10))
+ CAP(C44, CAP_U(3.3)) /* verified */
+
+ SN74LS629(4K_A, CAP_U(0.022))
+ NET_C(4K_A.RNG, V5)
+ NET_C(4K_A.ENQ, ttllow)
+ NET_C(GND, 4K_A.GND)
+ NET_C(R65.1, 4J_A.Q)
+ NET_C(R65.2, 4K_A.FC, C44.1)
+ NET_C(C44.2, GND)
+
+ CD4020_WI(3H, 4K_B.Y, ttllow, V5, GND)
+ TTL_7404_INVERT(4J_B, 3H.Q12)
+
+ RES(R64, RES_K(20))
+ CAP(C43, CAP_U(3.3)) /* verified */
+
+ SN74LS629(4K_B, CAP_U(0.0047))
+ NET_C(4K_B.RNG, V5)
+ NET_C(4K_B.ENQ, ttllow)
+ NET_C(GND, 4K_B.GND)
+ NET_C(R64.1, 4J_B.Q)
+ NET_C(R64.2, 4K_B.FC, C43.1)
+ NET_C(C43.2, GND)
+
+ TTL_7486_XOR(1K_C, 3H.Q4, 4K_A.Y)
+ TTL_7408_AND(2K_C, 4L_A.Q, 1K_C)
+
+NETLIST_END()
+
+/* ---------------------------------------------------------------------- */
+/* DAC sound */
+/* ---------------------------------------------------------------------- */
+static NETLIST_START(nl_mario_dac)
+ RES(R34, RES_M(2))
+ RES(R35, RES_M(1))
+ RES(R36, RES_M(1.8))
+ LM3900(3M_1)
+ NET_C(3M_1.VM, GND)
+ NET_C(3M_1.VP, V5)
+
+ NET_C(DAC.VOUT, R34.1)
+ NET_C(3M_1.MINUS, R34.2, R35.2)
+ NET_C(3M_1.OUT, R35.1)
+ NET_C(3M_1.PLUS, R36.1)
+ NET_C(R36.2, GND)
+
+ RES(R21, RES_M(1.8))
+ RES(R23, RES_K(10))
+ RES(R25, RES_K(10))
+ RES(R37, RES_K(750))
+ RES(R38, RES_K(360))
+ RES(R39, RES_K(750))
+
+ CAP(C18, CAP_P(100))
+ CAP(C19, CAP_U(10))
+ CAP(C20, CAP_U(1))
+ CAP(C30, CAP_P(100))
+
+ LM3900(3M_2)
+ NET_C(3M_2.VM, GND)
+ NET_C(3M_2.VP, V5)
+
+ NET_C(R35.1, C20.1)
+ NET_C(C20.2, R37.1)
+ NET_C(R37.2, R38.2, C18.1, R39.2)
+
+ NET_C(C18.2, GND)
+ NET_C(R38.1, C30.2, 3M_2.MINUS)
+ NET_C(3M_2.OUT, R39.1, C30.1)
+
+ NET_C(R21.1, 3M_2.PLUS)
+ NET_C(R21.2, C19.1, R25.2, R23.1)
+ NET_C(C19.2, R23.2, GND)
+ NET_C(R25.1, V5)
+NETLIST_END()
+
+NETLIST_START(mario)
+
+ LOCAL_SOURCE(nl_mario_snd0)
+ LOCAL_SOURCE(nl_mario_snd1)
+ LOCAL_SOURCE(nl_mario_snd7)
+ LOCAL_SOURCE(nl_mario_dac)
+
+ SOLVER(Solver, 48000)
+ PARAM(Solver.ACCURACY, 1e-6)
+ PARAM(Solver.SOR_FACTOR, 1.0)
+ PARAM(Solver.GS_THRESHOLD, 5)
+ PARAM(Solver.GS_LOOPS, 1)
+ /* Dynamic timestepping avoids excessive newton loops on startup */
+ PARAM(Solver.DYNAMIC_LTE, 5e-2)
+ PARAM(Solver.DYNAMIC_TS, 1)
+ ANALOG_INPUT(V5, 5)
+
+ TTL_INPUT(SOUND0, 1)
+ INCLUDE(nl_mario_snd0)
+
+ TTL_INPUT(SOUND1, 1)
+ INCLUDE(nl_mario_snd1)
+
+ TTL_INPUT(SOUND7, 1)
+ INCLUDE(nl_mario_snd7)
+
+ R2R_DAC(DAC, 3.4, 10000.0, 8)
+ NET_C(DAC.VGND, GND)
+
+ INCLUDE(nl_mario_dac)
+
+ /* ---------------------------------------------------------------------- */
+ /* mixing */
+ /* ---------------------------------------------------------------------- */
+
+ RES(R20, RES_K(22)) /* verified */
+ RES(R19, RES_K(22)) /* verified */
+ RES(R40, RES_K(22)) /* verified */
+ RES(R41, RES_K(100)) /* verified */
+ CAP(C31, CAP_U(0.022)) /* */
+
+ NET_C(2K_A.Q, R20.1)
+ NET_C(2K_B.Q, R19.1)
+ NET_C(2K_C.Q, R41.1)
+
+ NET_C(R39.1, R40.1)
+
+ NET_C(R20.2, R19.2, R40.2, R41.2, C31.1)
+ NET_C(C31.2, GND)
+
+ CAP(C32, CAP_U(1)) /* verified */
+ RES(R42, RES_K(43)) /* verified */
+ RES(R43, RES_K(100)) /* verified */
+
+ NET_C(C31.1, C32.1)
+ NET_C(C32.2, R42.1, R43.2, Q10.B)
+ //NET_C(C32.2, R42.1, R43.2)
+ NET_C(R43.1, V5)
+ NET_C(R42.2, GND)
+#if 1
+ RES(R63, RES_K(1)) /* */
+ RES(R62, 150) /* */
+
+ QBJT_EB(Q10, "2SC1815")
+
+ NET_C(R62.2, GND)
+ NET_C(R62.1, Q10.E)
+
+ NET_C(R63.1, V5)
+ NET_C(R63.2, Q10.C)
+
+ CAP(C42, CAP_U(0.1))
+ CAP(C47, CAP_U(4.7))
+ RES(VR1, RES_K(10))
+
+ NET_C(C42.1, C47.1, R62.1)
+ NET_C(C42.2, GND)
+ NET_C(C47.2, VR1.1)
+ NET_C(VR1.2, GND)
+#endif
+ /* ---------------------------------------------------------------------- */
+ /* Output */
+ /* ---------------------------------------------------------------------- */
+
+ RES(ROUT, 1000000)
+
+ //NET_C(Q10.C, ROUT.1)
+ //NET_C(R43.2, ROUT.1)
+ NET_C(VR1.1, ROUT.1)
+
+ NET_C(GND, ROUT.2)
+
+ OPTIMIZE_FRONTIER(R40.1, RES_K(22), 50)
+NETLIST_END()
diff --git a/src/mame/audio/nl_mario.h b/src/mame/audio/nl_mario.h
new file mode 100644
index 00000000000..f974efed7e1
--- /dev/null
+++ b/src/mame/audio/nl_mario.h
@@ -0,0 +1,4 @@
+// license:BSD-3-Clause
+// copyright-holders:Andrew Gardner, Couriersud
+
+NETLIST_EXTERNAL(mario)
diff --git a/src/mame/drivers/40love.cpp b/src/mame/drivers/40love.cpp
index 27fcab8b205..004d9b0b6a3 100644
--- a/src/mame/drivers/40love.cpp
+++ b/src/mame/drivers/40love.cpp
@@ -628,8 +628,8 @@ WRITE8_MEMBER(fortyl_state::to_main_w)
static ADDRESS_MAP_START( 40love_map, AS_PROGRAM, 8, fortyl_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x87ff) AM_RAM /* M5517P on main board */
- AM_RANGE(0x8800, 0x8800) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_mcu_r, buggychl_mcu_w)
- AM_RANGE(0x8801, 0x8801) AM_DEVREAD("bmcu", buggychl_mcu_device, buggychl_mcu_status_r) AM_WRITE(pix1_mcu_w) //pixel layer related
+ AM_RANGE(0x8800, 0x8800) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_RANGE(0x8801, 0x8801) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_status_r) AM_WRITE(pix1_mcu_w) //pixel layer related
AM_RANGE(0x8802, 0x8802) AM_WRITE(bank_select_w)
AM_RANGE(0x8803, 0x8803) AM_READWRITE(pix2_r, pix2_w) //pixel layer related
AM_RANGE(0x8804, 0x8804) AM_READWRITE(from_snd_r, sound_command_w)
@@ -1011,8 +1011,6 @@ MACHINE_RESET_MEMBER(fortyl_state,common)
MACHINE_RESET_MEMBER(fortyl_state,40love)
{
- m_mcu->set_input_line(0, CLEAR_LINE);
-
MACHINE_RESET_CALL_MEMBER(common);
}
@@ -1046,9 +1044,7 @@ static MACHINE_CONFIG_START( 40love, fortyl_state )
MCFG_CPU_PROGRAM_MAP(sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(fortyl_state, irq0_line_hold, 2*60) /* source/number of IRQs is unknown */
- MCFG_CPU_ADD("mcu",M68705,18432000/6) /* OK */
- MCFG_CPU_PROGRAM_MAP(buggychl_mcu_map)
- MCFG_DEVICE_ADD("bmcu", BUGGYCHL_MCU, 0)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, 18432000/6) /* OK */
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* high interleave to ensure proper synchronization of CPUs */
MCFG_MACHINE_START_OVERRIDE(fortyl_state,40love)
@@ -1107,9 +1103,7 @@ static MACHINE_CONFIG_START( undoukai, fortyl_state )
MCFG_CPU_PROGRAM_MAP(sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(fortyl_state, irq0_line_hold, 2*60) /* source/number of IRQs is unknown */
-// MCFG_CPU_ADD("mcu",M68705,18432000/6)
-// MCFG_CPU_PROGRAM_MAP(buggychl_mcu_map)
-// MCFG_DEVICE_ADD("bmcu", BUGGYCHL_MCU, 0)
+// MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, 18432000/6)
MCFG_MACHINE_START_OVERRIDE(fortyl_state,undoukai)
MCFG_MACHINE_RESET_OVERRIDE(fortyl_state,undoukai) /* init machine */
@@ -1175,7 +1169,7 @@ ROM_START( 40love )
ROM_LOAD( "a30-12.u38", 0x8000, 0x2000, CRC(f7afd475) SHA1(dd09d5ca7fec5e0454f9efb8ebc722561010f124) )
ROM_LOAD( "a30-13.u39", 0xa000, 0x2000, CRC(e806630f) SHA1(09022aae88ea0171a0aacf3260fa3a95e8faeb21) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a30-14" , 0x0000, 0x0800, CRC(c4690279) SHA1(60bc77e03b9be434bb97a374a2fedeb8d049a660) )
ROM_REGION( 0x8000, "gfx1", 0 )
diff --git a/src/mame/drivers/aerofgt.cpp b/src/mame/drivers/aerofgt.cpp
index 9846b97e08a..3fd5d2b8953 100644
--- a/src/mame/drivers/aerofgt.cpp
+++ b/src/mame/drivers/aerofgt.cpp
@@ -67,36 +67,21 @@ Verification still needed for the other PCBs.
#include "sound/3812intf.h"
#include "includes/aerofgt.h"
-WRITE16_MEMBER(aerofgt_state::sound_command_w)
-{
- if (ACCESSING_BITS_0_7)
- {
- m_pending_command = 1;
- m_soundlatch->write(space, offset, data & 0xff);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
- }
-}
-WRITE16_MEMBER(aerofgt_state::turbofrc_sound_command_w)
+WRITE8_MEMBER(aerofgt_state::sound_command_w)
{
- if (ACCESSING_BITS_8_15)
- {
- m_pending_command = 1;
- m_soundlatch->write(space, offset, (data >> 8) & 0xff);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
- }
+ m_pending_command = 1;
+ m_soundlatch->write(space, 0, data);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
-WRITE16_MEMBER(aerofgt_state::aerfboot_soundlatch_w)
+WRITE8_MEMBER(aerofgt_state::aerfboot_soundlatch_w)
{
- if(ACCESSING_BITS_8_15)
- {
- m_soundlatch->write(space, 0, (data >> 8) & 0xff);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
- }
+ m_soundlatch->write(space, 0, data);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
-READ16_MEMBER(aerofgt_state::pending_command_r)
+READ8_MEMBER(aerofgt_state::pending_command_r)
{
return m_pending_command;
}
@@ -111,7 +96,6 @@ WRITE8_MEMBER(aerofgt_state::aerofgt_sh_bankswitch_w)
membank("bank1")->set_entry(data & 0x03);
}
-
WRITE16_MEMBER(aerofgt_state::pspikesb_oki_banking_w)
{
m_oki->set_rom_bank(data & 3);
@@ -153,10 +137,10 @@ static ADDRESS_MAP_START( pspikes_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffc000, 0xffc3ff) AM_WRITEONLY AM_SHARE("spriteram3")
AM_RANGE(0xffd000, 0xffdfff) AM_RAM AM_SHARE("rasterram") /* bg1 scroll registers */
AM_RANGE(0xffe000, 0xffefff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
- AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE(pspikes_palette_bank_w)
- AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE(pspikes_gfxbank_w)
+ AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE8(pspikes_palette_bank_w, 0x00ff)
+ AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE8(pspikes_gfxbank_w, 0x00ff)
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW") AM_WRITE(aerofgt_bg1scrolly_w)
- AM_RANGE(0xfff006, 0xfff007) AM_READWRITE(pending_command_r, sound_command_w)
+ AM_RANGE(0xfff006, 0xfff007) AM_READWRITE8(pending_command_r, sound_command_w, 0x00ff)
ADDRESS_MAP_END
static ADDRESS_MAP_START( pspikesb_map, AS_PROGRAM, 16, aerofgt_state )
@@ -190,7 +174,7 @@ static ADDRESS_MAP_START( spikes91_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffd000, 0xffdfff) AM_RAM AM_SHARE("rasterram") /* bg1 scroll registers */
AM_RANGE(0xffe000, 0xffefff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0")
- AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE(pspikes_gfxbank_w)
+ AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE8(pspikes_gfxbank_w, 0x00ff)
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW") AM_WRITE(aerofgt_bg1scrolly_w)
AM_RANGE(0xfff006, 0xfff007) AM_NOP
AM_RANGE(0xfff008, 0xfff009) AM_WRITE(spikes91_lookup_w)
@@ -204,8 +188,8 @@ static ADDRESS_MAP_START( pspikesc_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffc000, 0xffcbff) AM_RAM AM_SHARE("spriteram3")
AM_RANGE(0xffd000, 0xffdfff) AM_RAM AM_SHARE("rasterram") /* bg1 scroll registers */
AM_RANGE(0xffe000, 0xffefff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
- AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE(pspikes_palette_bank_w)
- AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE(pspikes_gfxbank_w)
+ AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE8(pspikes_palette_bank_w, 0x00ff)
+ AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE8(pspikes_gfxbank_w, 0x00ff)
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW")
AM_RANGE(0xfff004, 0xfff005) AM_WRITE(aerofgt_bg1scrolly_w)
AM_RANGE(0xfff006, 0xfff007) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff)
@@ -223,11 +207,11 @@ static ADDRESS_MAP_START( karatblz_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0x0fc000, 0x0fc7ff) AM_RAM AM_SHARE("spriteram3")
AM_RANGE(0x0fe000, 0x0fe7ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x0ff000, 0x0ff001) AM_READ_PORT("IN0")
- AM_RANGE(0x0ff002, 0x0ff003) AM_READ_PORT("IN1") AM_WRITE(karatblz_gfxbank_w)
+ AM_RANGE(0x0ff002, 0x0ff003) AM_READ_PORT("IN1") AM_WRITE8(karatblz_gfxbank_w, 0xff00)
AM_RANGE(0x0ff004, 0x0ff005) AM_READ_PORT("IN2")
- AM_RANGE(0x0ff006, 0x0ff007) AM_READ_PORT("IN3") AM_WRITE(sound_command_w)
+ AM_RANGE(0x0ff006, 0x0ff007) AM_READ_PORT("IN3") AM_WRITE8(sound_command_w, 0x00ff)
AM_RANGE(0x0ff008, 0x0ff009) AM_READ_PORT("DSW") AM_WRITE(aerofgt_bg1scrollx_w)
- AM_RANGE(0x0ff00a, 0x0ff00b) AM_READ(pending_command_r) AM_WRITE(aerofgt_bg1scrolly_w)
+ AM_RANGE(0x0ff00a, 0x0ff00b) AM_READ8(pending_command_r, 0x00ff) AM_WRITE(aerofgt_bg1scrolly_w)
AM_RANGE(0x0ff00c, 0x0ff00d) AM_WRITE(aerofgt_bg2scrollx_w)
AM_RANGE(0x0ff00e, 0x0ff00f) AM_WRITE(aerofgt_bg2scrolly_w)
ADDRESS_MAP_END
@@ -240,10 +224,10 @@ static ADDRESS_MAP_START( spinlbrk_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffc000, 0xffc7ff) AM_RAM AM_SHARE("spriteram3")
AM_RANGE(0xffd000, 0xffd1ff) AM_RAM AM_SHARE("rasterram") /* bg1 scroll registers */
AM_RANGE(0xffe000, 0xffe7ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
- AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE(spinlbrk_gfxbank_w)
+ AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE8(spinlbrk_gfxbank_w, 0x00ff)
AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE(aerofgt_bg2scrollx_w)
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW")
- AM_RANGE(0xfff006, 0xfff007) AM_WRITE(sound_command_w)
+ AM_RANGE(0xfff006, 0xfff007) AM_WRITE8(sound_command_w, 0x00ff)
// AM_RANGE(0xfff008, 0xfff009) - read when analog inputs are enabled
// AM_RANGE(0xfff00a, 0xfff00b) /
ADDRESS_MAP_END
@@ -263,11 +247,11 @@ static ADDRESS_MAP_START( turbofrc_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0x0ff000, 0x0ff001) AM_READ_PORT("IN0")
AM_RANGE(0x0ff002, 0x0ff003) AM_READ_PORT("IN1") AM_WRITE(aerofgt_bg1scrolly_w)
AM_RANGE(0x0ff004, 0x0ff005) AM_READ_PORT("DSW") AM_WRITE(aerofgt_bg2scrollx_w)
- AM_RANGE(0x0ff006, 0x0ff007) AM_READ(pending_command_r) AM_WRITE(aerofgt_bg2scrolly_w)
+ AM_RANGE(0x0ff006, 0x0ff007) AM_READ8(pending_command_r, 0x00ff) AM_WRITE(aerofgt_bg2scrolly_w)
AM_RANGE(0x0ff008, 0x0ff009) AM_READ_PORT("IN2")
AM_RANGE(0x0ff008, 0x0ff00b) AM_WRITE(turbofrc_gfxbank_w)
AM_RANGE(0x0ff00c, 0x0ff00d) AM_WRITENOP /* related to bg2 (written together with the scroll registers) */
- AM_RANGE(0x0ff00e, 0x0ff00f) AM_WRITE(turbofrc_sound_command_w)
+ AM_RANGE(0x0ff00e, 0x0ff00f) AM_WRITE8(sound_command_w, 0xff00)
ADDRESS_MAP_END
static ADDRESS_MAP_START( aerofgtb_map, AS_PROGRAM, 16, aerofgt_state )
@@ -283,10 +267,10 @@ static ADDRESS_MAP_START( aerofgtb_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0x0fe000, 0x0fe001) AM_READ_PORT("IN0")
AM_RANGE(0x0fe002, 0x0fe003) AM_READ_PORT("IN1") AM_WRITE(aerofgt_bg1scrolly_w)
AM_RANGE(0x0fe004, 0x0fe005) AM_READ_PORT("DSW1") AM_WRITE(aerofgt_bg2scrollx_w)
- AM_RANGE(0x0fe006, 0x0fe007) AM_READ(pending_command_r) AM_WRITE(aerofgt_bg2scrolly_w)
+ AM_RANGE(0x0fe006, 0x0fe007) AM_READ8(pending_command_r, 0x00ff) AM_WRITE(aerofgt_bg2scrolly_w)
AM_RANGE(0x0fe008, 0x0fe009) AM_READ_PORT("DSW2")
AM_RANGE(0x0fe008, 0x0fe00b) AM_WRITE(turbofrc_gfxbank_w)
- AM_RANGE(0x0fe00e, 0x0fe00f) AM_WRITE(turbofrc_sound_command_w)
+ AM_RANGE(0x0fe00e, 0x0fe00f) AM_WRITE8(sound_command_w, 0xff00)
AM_RANGE(0x0ff000, 0x0fffff) AM_RAM AM_SHARE("rasterram") /* used only for the scroll registers */
ADDRESS_MAP_END
@@ -309,9 +293,9 @@ static ADDRESS_MAP_START( aerofgt_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffffa4, 0xffffa5) AM_READ_PORT("SYSTEM")
AM_RANGE(0xffffa6, 0xffffa7) AM_READ_PORT("DSW1")
AM_RANGE(0xffffa8, 0xffffa9) AM_READ_PORT("DSW2")
- AM_RANGE(0xffffac, 0xffffad) AM_READ(pending_command_r) AM_WRITENOP /* ??? */
+ AM_RANGE(0xffffac, 0xffffad) AM_READ8(pending_command_r, 0x00ff) AM_WRITENOP /* ??? */
AM_RANGE(0xffffae, 0xffffaf) AM_READ_PORT("DSW3")
- AM_RANGE(0xffffc0, 0xffffc1) AM_WRITE(sound_command_w)
+ AM_RANGE(0xffffc0, 0xffffc1) AM_WRITE8(sound_command_w, 0x00ff)
ADDRESS_MAP_END
static ADDRESS_MAP_START( aerfboot_map, AS_PROGRAM, 16, aerofgt_state )
@@ -332,7 +316,7 @@ static ADDRESS_MAP_START( aerfboot_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0x0fe004, 0x0fe005) AM_WRITE(aerofgt_bg2scrollx_w)
AM_RANGE(0x0fe006, 0x0fe007) AM_WRITE(aerofgt_bg2scrolly_w)
AM_RANGE(0x0fe008, 0x0fe00b) AM_WRITE(turbofrc_gfxbank_w)
- AM_RANGE(0x0fe00e, 0x0fe00f) AM_WRITE(aerfboot_soundlatch_w)
+ AM_RANGE(0x0fe00e, 0x0fe00f) AM_WRITE8(aerfboot_soundlatch_w, 0xff00)
AM_RANGE(0x0fe010, 0x0fe011) AM_WRITENOP
AM_RANGE(0x0fe012, 0x0fe013) AM_WRITENOP
AM_RANGE(0x0fe400, 0x0fe401) AM_WRITENOP
@@ -380,10 +364,10 @@ static ADDRESS_MAP_START( wbbc97_map, AS_PROGRAM, 16, aerofgt_state )
AM_RANGE(0xffc000, 0xffc3ff) AM_WRITEONLY AM_SHARE("spriteram3")
AM_RANGE(0xffd000, 0xffdfff) AM_RAM AM_SHARE("rasterram") /* bg1 scroll registers */
AM_RANGE(0xffe000, 0xffefff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
- AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE(pspikes_palette_bank_w)
- AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE(pspikes_gfxbank_w)
+ AM_RANGE(0xfff000, 0xfff001) AM_READ_PORT("IN0") AM_WRITE8(pspikes_palette_bank_w, 0x00ff)
+ AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("IN1") AM_WRITE8(pspikes_gfxbank_w, 0x00ff)
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW") AM_WRITE(aerofgt_bg1scrolly_w)
- AM_RANGE(0xfff006, 0xfff007) AM_READNOP AM_WRITE(sound_command_w)
+ AM_RANGE(0xfff006, 0xfff007) AM_READNOP AM_WRITE8(sound_command_w, 0x00ff)
AM_RANGE(0xfff00e, 0xfff00f) AM_WRITE(wbbc97_bitmap_enable_w)
ADDRESS_MAP_END
diff --git a/src/mame/drivers/aleisttl.cpp b/src/mame/drivers/aleisttl.cpp
index 75021c37dda..df43a588445 100644
--- a/src/mame/drivers/aleisttl.cpp
+++ b/src/mame/drivers/aleisttl.cpp
@@ -7,7 +7,7 @@
Chase (aka Chase1) (1976)
Deluxe Soccer (1973)
Fire Power (1975) EG-1020-2
- F??tsball (1975)
+ Fütsball (1975)
Galaxy Raider (1974)
Hesitation (1974) AL-6500?
Hockey, Soccer, Tennis (1974)
diff --git a/src/mame/drivers/alpha68k.cpp b/src/mame/drivers/alpha68k.cpp
index 18ab41042a8..df37a9da3f3 100644
--- a/src/mame/drivers/alpha68k.cpp
+++ b/src/mame/drivers/alpha68k.cpp
@@ -1304,10 +1304,10 @@ INPUT_PORTS_END
static INPUT_PORTS_START( skyadvnt )
PORT_START("IN0")
- ALPHA68K_PLAYER_INPUT_LSB( 1, IPT_UNKNOWN, IPT_START1, IP_ACTIVE_LOW )
+ ALPHA68K_PLAYER_INPUT_LSB( 1, IPT_BUTTON3, IPT_START1, IP_ACTIVE_LOW )
PORT_START("IN1")
- ALPHA68K_PLAYER_INPUT_LSB( 2, IPT_UNKNOWN, IPT_START2, IP_ACTIVE_LOW )
+ ALPHA68K_PLAYER_INPUT_LSB( 2, IPT_BUTTON3, IPT_START2, IP_ACTIVE_LOW )
ALPHA68K_MCU
diff --git a/src/mame/drivers/armedf.cpp b/src/mame/drivers/armedf.cpp
index bcde88bf37b..d33b0a3b4c2 100644
--- a/src/mame/drivers/armedf.cpp
+++ b/src/mame/drivers/armedf.cpp
@@ -1568,7 +1568,7 @@ static MACHINE_CONFIG_START( bigfghtr, bigfghtr_state )
MCFG_CPU_IO_MAP(sound_portmap)
MCFG_CPU_PERIODIC_INT_DRIVER(armedf_state, irq0_line_hold, XTAL_8MHz/2/512) // ?
- MCFG_CPU_ADD("mcu", I8751, XTAL_16MHz/4) // i8741 disguised as i8751h? Former doesn't match address map, clock unknown.
+ MCFG_CPU_ADD("mcu", I8751, XTAL_16MHz/4)
MCFG_CPU_PROGRAM_MAP(bigfghtr_mcu_map)
MCFG_CPU_IO_MAP(bigfghtr_mcu_io_map)
diff --git a/src/mame/drivers/ashnojoe.cpp b/src/mame/drivers/ashnojoe.cpp
index 74328538f48..3bab957d1fc 100644
--- a/src/mame/drivers/ashnojoe.cpp
+++ b/src/mame/drivers/ashnojoe.cpp
@@ -87,15 +87,6 @@ READ16_MEMBER(ashnojoe_state::fake_4a00a_r)
return 0;
}
-WRITE16_MEMBER(ashnojoe_state::ashnojoe_soundlatch_w)
-{
- if (ACCESSING_BITS_0_7)
- {
- m_soundlatch_status = 1;
- m_soundlatch->write(space, 0, data & 0xff);
- }
-}
-
static ADDRESS_MAP_START( ashnojoe_map, AS_PROGRAM, 16, ashnojoe_state )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x040000, 0x041fff) AM_RAM_WRITE(ashnojoe_tileram3_w) AM_SHARE("tileram_3")
@@ -110,7 +101,7 @@ static ADDRESS_MAP_START( ashnojoe_map, AS_PROGRAM, 16, ashnojoe_state )
AM_RANGE(0x04a002, 0x04a003) AM_READ_PORT("P2")
AM_RANGE(0x04a004, 0x04a005) AM_READ_PORT("DSW")
AM_RANGE(0x04a006, 0x04a007) AM_WRITEONLY AM_SHARE("tilemap_reg")
- AM_RANGE(0x04a008, 0x04a009) AM_WRITE(ashnojoe_soundlatch_w)
+ AM_RANGE(0x04a008, 0x04a009) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0x00ff)
AM_RANGE(0x04a00a, 0x04a00b) AM_READ(fake_4a00a_r) // ??
AM_RANGE(0x04a010, 0x04a019) AM_WRITE(joe_tilemaps_xscroll_w)
AM_RANGE(0x04a020, 0x04a029) AM_WRITE(joe_tilemaps_yscroll_w)
@@ -124,15 +115,9 @@ WRITE8_MEMBER(ashnojoe_state::adpcm_w)
m_adpcm_byte = data;
}
-READ8_MEMBER(ashnojoe_state::sound_latch_r)
-{
- m_soundlatch_status = 0;
- return m_soundlatch->read(space, 0);
-}
-
READ8_MEMBER(ashnojoe_state::sound_latch_status_r)
{
- return m_soundlatch_status;
+ return m_soundlatch->pending_r();
}
static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, ashnojoe_state )
@@ -145,7 +130,7 @@ static ADDRESS_MAP_START( sound_portmap, AS_IO, 8, ashnojoe_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x01) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0x02, 0x02) AM_WRITE(adpcm_w)
- AM_RANGE(0x04, 0x04) AM_READ(sound_latch_r)
+ AM_RANGE(0x04, 0x04) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
AM_RANGE(0x06, 0x06) AM_READ(sound_latch_status_r)
ADDRESS_MAP_END
@@ -302,14 +287,12 @@ WRITE_LINE_MEMBER(ashnojoe_state::ashnojoe_vclk_cb)
void ashnojoe_state::machine_start()
{
save_item(NAME(m_adpcm_byte));
- save_item(NAME(m_soundlatch_status));
save_item(NAME(m_msm5205_vclk_toggle));
}
void ashnojoe_state::machine_reset()
{
m_adpcm_byte = 0;
- m_soundlatch_status = 0;
m_msm5205_vclk_toggle = 0;
}
diff --git a/src/mame/drivers/asuka.cpp b/src/mame/drivers/asuka.cpp
index 2c1b34d6724..77144702d7a 100644
--- a/src/mame/drivers/asuka.cpp
+++ b/src/mame/drivers/asuka.cpp
@@ -271,16 +271,16 @@ WRITE8_MEMBER(asuka_state::sound_bankswitch_2151_w)
WRITE_LINE_MEMBER(asuka_state::asuka_msm5205_vck)
{
- if (m_adpcm_data != -1)
- {
- m_msm->data_w(m_adpcm_data & 0x0f);
- m_adpcm_data = -1;
- }
- else
+ if (!state)
+ return;
+
+ m_adpcm_ff = !m_adpcm_ff;
+ m_adpcm_select->select_w(m_adpcm_ff);
+
+ if (m_adpcm_ff)
{
- m_adpcm_data = memregion("ymsnd")->base()[m_adpcm_pos];
+ m_adpcm_select->ba_w(m_sound_data[m_adpcm_pos]);
m_adpcm_pos = (m_adpcm_pos + 1) & 0xffff;
- m_msm->data_w(m_adpcm_data >> 4);
}
}
@@ -292,6 +292,7 @@ WRITE8_MEMBER(asuka_state::asuka_msm5205_address_w)
WRITE8_MEMBER(asuka_state::asuka_msm5205_start_w)
{
m_msm->reset_w(0);
+ m_adpcm_ff = false;
}
WRITE8_MEMBER(asuka_state::asuka_msm5205_stop_w)
@@ -778,7 +779,7 @@ void asuka_state::machine_start()
membank("audiobank")->configure_entries(0, 4, memregion("audiocpu")->base(), 0x04000);
save_item(NAME(m_adpcm_pos));
- save_item(NAME(m_adpcm_data));
+ save_item(NAME(m_adpcm_ff));
save_item(NAME(m_current_round));
save_item(NAME(m_current_bank));
@@ -792,7 +793,7 @@ void asuka_state::machine_start()
void asuka_state::machine_reset()
{
m_adpcm_pos = 0;
- m_adpcm_data = -1;
+ m_adpcm_ff = false;
m_current_round = 0;
m_current_bank = 0;
m_video_ctrl = 0;
@@ -930,6 +931,9 @@ static MACHINE_CONFIG_START( asuka, asuka_state )
MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8 kHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_DEVICE_ADD("adpcm_select", LS157, 0)
+ MCFG_74157_OUT_CB(DEVWRITE8("msm", msm5205_device, data_w))
+
MCFG_DEVICE_ADD("tc0140syt", TC0140SYT, 0)
MCFG_TC0140SYT_MASTER_CPU("maincpu")
MCFG_TC0140SYT_SLAVE_CPU("audiocpu")
@@ -1064,6 +1068,9 @@ static MACHINE_CONFIG_START( mofflott, asuka_state )
MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_S48_4B) /* 8 kHz */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_DEVICE_ADD("adpcm_select", LS157, 0)
+ MCFG_74157_OUT_CB(DEVWRITE8("msm", msm5205_device, data_w))
+
MCFG_DEVICE_ADD("tc0140syt", TC0140SYT, 0)
MCFG_TC0140SYT_MASTER_CPU("maincpu")
MCFG_TC0140SYT_SLAVE_CPU("audiocpu")
diff --git a/src/mame/drivers/atvtrack.cpp b/src/mame/drivers/atvtrack.cpp
index 398200c7fff..e7b08f6e31c 100644
--- a/src/mame/drivers/atvtrack.cpp
+++ b/src/mame/drivers/atvtrack.cpp
@@ -384,30 +384,54 @@ uint32_t atvtrack_state::screen_update_atvtrack(screen_device &screen, bitmap_rg
return 0;
}
-void atvtrack_state::machine_start()
+void get_altera10ke_eab(u8* dst, u8 *pof, int eab)
{
- uint8_t *src, *dst;
+ // extract Altera FLEX 10KE 4kbit Embedded Array Block (EAB)
+ u32 startbit = 0x45b * 8 + 1 + (0x25e6 * 8) * eab; // base ofsset actually depends on POF header size, however this EPC1PC8 dump havent it (bad dumper software?)
+
+ for (u32 bit = 0; bit < 4096; bit++)
+ {
+ u32 tbit = BITSWAP16(bit, 15, 14, 13, 12,
+ 9, 8, 7, 6, 5, 4, 3,
+ 11, 10,
+ 2, 1, 0);
+ tbit ^= 0x0fc0;
+ u32 pofbit = startbit + (tbit & 0x1f) + (((tbit >> 5) & 1) * 63) + (((tbit >> 6) & 0x3f) * 0x4D * 8);
+ dst[bit / 8] &= ~(1 << (bit & 7));
+ dst[bit / 8] |= ((pof[pofbit / 8] >> (pofbit & 7)) & 1) << (bit & 7);
+ }
+}
+void atvtrack_state::machine_start()
+{
m_nandaddressstep = 0;
m_nandregion = memregion("maincpu");
- address_space &as = m_maincpu->space(AS_PROGRAM);
- dst = (uint8_t *)(as.get_write_ptr(0x0c7f0000));
- src = m_nandregion->base()+0x10;
- // copy 0x10000 bytes from region "maincpu" offset 0x10 to 0x0c7f0000
- memcpy(dst, src, 0x10000);
}
void atvtrack_state::machine_reset()
{
- // Probably just after reset the cpu executes some bootsrtap routine from a memory inside the fpga.
- // The routine initializes the cpu, copies the boot program from the flash memories into the cpu sdram
- // and finally executes it.
- // Here there is the setup of the cpu, the boot program is copied in machine_start
- address_space &as = m_maincpu->space(AS_PROGRAM);
- // set cpu PC register to 0x0c7f0000
- m_maincpu->set_pc(0x0c7f0000);
- // set BCR2 to 1
- m_maincpu->sh4_internal_w(as, 0x3001, 1, 0xffffffff);
+ std::vector<u8> tdata(1024);
+ u8 *pof = memregion("fpga")->base();
+
+ // first 2 Altera's EABs is 2xSH4s shared RAM, its initial content is boot loader
+ // extract EABs 0 and 1 from POF
+ get_altera10ke_eab(&tdata[0], pof, 0);
+ get_altera10ke_eab(&tdata[512], pof, 1);
+
+ // deshuffle data bits and put it to shared RAM
+ u8 *dst = (u8*)(m_maincpu->space(AS_PROGRAM).get_write_ptr(0));
+ for (u32 i = 0; i < 256; i++)
+ {
+ u16 lword = tdata[i * 2 + 512] | (tdata[i * 2 + 513] << 8);
+ u16 hword = tdata[i * 2] | (tdata[i * 2 + 1] << 8);
+ lword = BITSWAP16(lword, 7, 9, 0, 10, 3, 11, 4, 12, 2, 15, 1, 13, 6, 8, 5, 14);
+ hword = BITSWAP16(hword, 5, 10, 7, 9, 6, 13, 3, 15, 2, 11, 1, 8, 0, 12, 4, 14);
+ dst[i * 4 + 0] = lword & 0xff;
+ dst[i * 4 + 1] = lword >> 8;
+ dst[i * 4 + 2] = hword & 0xff;
+ dst[i * 4 + 3] = hword >> 8;
+ }
+
m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
}
@@ -533,8 +557,8 @@ ROM_START( atvtrack )
ROM_LOAD32_BYTE("14.bin", 0x0000002, 0x1080000, CRC(67983453) SHA1(05389a0ffc1a1bae9bac16a53a97d78b6eccc626) )
ROM_LOAD32_BYTE("19.bin", 0x0000003, 0x1080000, CRC(9fc5c579) SHA1(8829329ef229564952aea2108ef1750dc226cbac) )
- ROM_REGION( 0x20000, "eeprom", ROMREGION_ERASEFF)
- ROM_LOAD("epc1pc8.ic23", 0x0000000, 0x1ff01, CRC(752444c7) SHA1(c77e8fcfcbe15b53eda25553763bdac45f0ef7df) ) // contains configuration data for the fpga, maybe used for some form of protection
+ ROM_REGION( 0x20000, "fpga", ROMREGION_ERASEFF)
+ ROM_LOAD("epc1pc8.ic23", 0x0000000, 0x1ff01, CRC(752444c7) SHA1(c77e8fcfcbe15b53eda25553763bdac45f0ef7df) ) // contains configuration data for the fpga
ROM_END
ROM_START( atvtracka )
@@ -543,6 +567,9 @@ ROM_START( atvtracka )
ROM_LOAD32_BYTE("k9f2808u0b.ic20", 0x0000001, 0x1080000, CRC(b0c34433) SHA1(852c79bb3d7082cd2c056140071ae7d71679ec1d) )
ROM_LOAD32_BYTE("k9f2808u0b.ic14", 0x0000002, 0x1080000, CRC(02a12085) SHA1(acb112c9c7b29d92610465fb92268ce787ca06f4) )
ROM_LOAD32_BYTE("k9f2808u0b.ic19", 0x0000003, 0x1080000, CRC(856c1e6a) SHA1(a6b2839120d61811c36cc6b4095de9cefceb394b) )
+
+ ROM_REGION( 0x20000, "fpga", ROMREGION_ERASEFF)
+ ROM_LOAD("epc1pc8.ic23", 0x0000000, 0x1ff01, CRC(752444c7) SHA1(c77e8fcfcbe15b53eda25553763bdac45f0ef7df) ) // contains configuration data for the fpga
ROM_END
/*
diff --git a/src/mame/drivers/bigevglf.cpp b/src/mame/drivers/bigevglf.cpp
index e93c9ac3ca4..6309831483b 100644
--- a/src/mame/drivers/bigevglf.cpp
+++ b/src/mame/drivers/bigevglf.cpp
@@ -346,8 +346,8 @@ static ADDRESS_MAP_START( bigevglf_sub_portmap, AS_IO, 8, bigevglf_state )
AM_RANGE(0x06, 0x06) AM_READ_PORT("DSW2")
AM_RANGE(0x07, 0x07) AM_READNOP
AM_RANGE(0x08, 0x08) AM_WRITE(beg_port08_w) /* muxed port select + other unknown stuff */
- AM_RANGE(0x0b, 0x0b) AM_READ(bigevglf_mcu_r)
- AM_RANGE(0x0c, 0x0c) AM_WRITE(bigevglf_mcu_w)
+ AM_RANGE(0x0b, 0x0b) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_r)
+ AM_RANGE(0x0c, 0x0c) AM_DEVWRITE("bmcu", taito68705_mcu_device, mcu_w)
AM_RANGE(0x0e, 0x0e) AM_WRITENOP /* 0-enable MCU, 1-keep reset line ASSERTED; D0 goes to the input of ls74 and the /Q of this ls74 goes to reset line on 68705 */
AM_RANGE(0x10, 0x17) AM_WRITE(beg13_a_clr_w)
AM_RANGE(0x18, 0x1f) AM_WRITE(beg13_b_set_w)
@@ -376,20 +376,6 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, bigevglf_state )
ADDRESS_MAP_END
-/*********************************************************************************/
-/* MCU */
-
-static ADDRESS_MAP_START( m68705_map, AS_PROGRAM, 8, bigevglf_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(bigevglf_68705_port_a_r, bigevglf_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(bigevglf_68705_port_b_r, bigevglf_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_READWRITE(bigevglf_68705_port_c_r, bigevglf_68705_port_c_w)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(bigevglf_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(bigevglf_68705_ddr_b_w)
- AM_RANGE(0x0006, 0x0006) AM_WRITE(bigevglf_68705_ddr_c_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
static const gfx_layout gfxlayout =
@@ -424,20 +410,10 @@ void bigevglf_state::machine_start()
save_item(NAME(m_from_sound));
save_item(NAME(m_sound_state));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_mcu_sent));
+
save_item(NAME(m_mcu_coin_bit5));
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_port_c_in));
- save_item(NAME(m_port_c_out));
- save_item(NAME(m_ddr_c));
- save_item(NAME(m_from_mcu));
+
}
void bigevglf_state::machine_reset()
@@ -457,20 +433,7 @@ void bigevglf_state::machine_reset()
m_from_sound = 0;
m_sound_state = 0;
- m_main_sent = 0;
- m_mcu_sent = 0;
m_mcu_coin_bit5 = 0;
-
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_port_c_in = 0;
- m_port_c_out = 0;
- m_ddr_c = 0;
- m_from_mcu = 0;
}
@@ -493,8 +456,7 @@ static MACHINE_CONFIG_START( bigevglf, bigevglf_state )
2 irqs/frame give good music tempo but also SOUND ERROR in test mode,
4 irqs/frame give SOUND OK in test mode but music seems to be running too fast */
- MCFG_CPU_ADD("mcu", M68705,2000000) /* ??? */
- MCFG_CPU_PROGRAM_MAP(m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU_BEG, 2000000) /* ??? */
MCFG_QUANTUM_TIME(attotime::from_hz(600)) /* 10 CPU slices per frame - interleaving is forced on the fly */
@@ -559,7 +521,7 @@ ROM_START( bigevglf )
ROM_LOAD( "a67-17", 0x4000, 0x4000, CRC(9f57deae) SHA1(dbdb3d77c3de0113ef6671aec854e4e44ee162ef))
ROM_LOAD( "a67-18", 0x8000, 0x4000, CRC(40d54fed) SHA1(bfa0922809bffafec15d3ef59ac8b8ad653860a1))
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a67_19-1", 0x0000, 0x0800, CRC(25691658) SHA1(aabf47abac43abe2ffed18ead1cb94e587149e6e))
ROM_REGION( 0x20000, "gfx1", 0 )
@@ -590,7 +552,7 @@ ROM_START( bigevglfj )
ROM_LOAD( "a67-17", 0x4000, 0x4000, CRC(9f57deae) SHA1(dbdb3d77c3de0113ef6671aec854e4e44ee162ef))
ROM_LOAD( "a67-18", 0x8000, 0x4000, CRC(40d54fed) SHA1(bfa0922809bffafec15d3ef59ac8b8ad653860a1))
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a67_19-1", 0x0000, 0x0800, CRC(25691658) SHA1(aabf47abac43abe2ffed18ead1cb94e587149e6e))
ROM_REGION( 0x20000, "gfx1", 0 )
diff --git a/src/mame/drivers/bking.cpp b/src/mame/drivers/bking.cpp
index 44b0adfa450..b4305d2351f 100644
--- a/src/mame/drivers/bking.cpp
+++ b/src/mame/drivers/bking.cpp
@@ -120,8 +120,8 @@ static ADDRESS_MAP_START( bking3_io_map, AS_IO, 8, bking_state )
// AM_RANGE(0x0c, 0x0c) AM_WRITE(bking_eport2_w) this is not shown to be connected anywhere
AM_RANGE(0x0d, 0x0d) AM_WRITE(bking_hitclr_w)
AM_RANGE(0x07, 0x1f) AM_READ(bking_pos_r)
- AM_RANGE(0x2f, 0x2f) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_mcu_r, buggychl_mcu_w)
- AM_RANGE(0x4f, 0x4f) AM_DEVREAD("bmcu", buggychl_mcu_device, buggychl_mcu_status_r) AM_WRITE(unk_w)
+ AM_RANGE(0x2f, 0x2f) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_RANGE(0x4f, 0x4f) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_status_r) AM_WRITE(unk_w)
AM_RANGE(0x60, 0x60) AM_READ(bking3_extrarom_r)
AM_RANGE(0x6f, 0x6f) AM_READWRITE(bking3_ext_check_r, bking3_addr_h_w)
AM_RANGE(0x8f, 0x8f) AM_WRITE(bking3_addr_l_w)
@@ -140,68 +140,6 @@ static ADDRESS_MAP_START( bking_audio_map, AS_PROGRAM, 8, bking_state )
AM_RANGE(0xe000, 0xefff) AM_ROM /* Space for diagnostic ROM */
ADDRESS_MAP_END
-#if 0
-READ8_MEMBER(bking_state::bking3_68705_port_a_r)
-{
- //printf("port_a_r = %02X\n",(m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a));
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(bking_state::bking3_68705_port_a_w)
-{
- m_port_a_out = data;
-// printf("port_a_out = %02X\n",data);
-}
-
-WRITE8_MEMBER(bking_state::bking3_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-READ8_MEMBER(bking_state::bking3_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(bking_state::bking3_68705_port_b_w)
-{
-// if(data != 0xff)
-// printf("port_b_out = %02X\n",data);
-
- if (~data & 0x02)
- {
- m_port_a_in = from_main;
- if (main_sent) m_mcu->set_input_line(0, CLEAR_LINE);
- main_sent = 0;
- }
-
- if (~data & 0x04)
- {
- /* 68705 is writing data for the Z80 */
- from_mcu = m_port_a_out;
- mcu_sent = 1;
- }
-
- if(data != 0xff && data != 0xfb && data != 0xfd)
- printf("port_b_w = %X\n",data);
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(bking_state::bking3_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-READ8_MEMBER(bking_state::bking3_68705_port_c_r)
-{
- int port_c_in = 0;
- if (main_sent) port_c_in |= 0x01;
- if (!mcu_sent) port_c_in |= 0x02;
-//logerror("%04x: 68705 port C read %02x\n",space.device().safe_pc(),port_c_in);
- return port_c_in;
-}
-#endif
static INPUT_PORTS_START( bking )
PORT_START("IN0")
@@ -440,8 +378,6 @@ void bking_state::machine_reset()
MACHINE_RESET_MEMBER(bking_state,bking3)
{
- m_mcu->set_input_line(0, CLEAR_LINE);
-
bking_state::machine_reset();
/* misc */
@@ -505,9 +441,7 @@ static MACHINE_CONFIG_DERIVED( bking3, bking )
MCFG_CPU_MODIFY("main_cpu")
MCFG_CPU_IO_MAP(bking3_io_map)
- MCFG_CPU_ADD("mcu", M68705, XTAL_3MHz) /* xtal is 3MHz, divided by 4 internally */
- MCFG_CPU_PROGRAM_MAP(buggychl_mcu_map)
- MCFG_DEVICE_ADD("bmcu", BUGGYCHL_MCU, 0)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, XTAL_3MHz) /* xtal is 3MHz, divided by 4 internally */
MCFG_MACHINE_START_OVERRIDE(bking_state,bking3)
MCFG_MACHINE_RESET_OVERRIDE(bking_state,bking3)
@@ -774,7 +708,7 @@ ROM_START( bking3 )
ROM_LOAD( "a24-19.4d", 0x1000, 0x1000, CRC(817f9c2a) SHA1(7365ecf2700e1fd13016408f5493f8d51aab5bbd) )
ROM_LOAD( "a24-20.4b", 0x2000, 0x1000, CRC(0e9e16d6) SHA1(43c69602a8d9c34c527ce54472db84168acc4ef4) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a24_22.ic17", 0x000000, 0x000800, CRC(27c497d5) SHA1(c6c72bbf0537da53148fa0a56d412ab46129d29c) ) //M68705P5S uC 3MHz xtal
ROM_REGION( 0x6000, "gfx1", 0 ) /* Tiles */
diff --git a/src/mame/drivers/bublbobl.cpp b/src/mame/drivers/bublbobl.cpp
index 434cc015df9..63ea6bf6330 100644
--- a/src/mame/drivers/bublbobl.cpp
+++ b/src/mame/drivers/bublbobl.cpp
@@ -389,9 +389,19 @@ static ADDRESS_MAP_START( tokio_map, AS_PROGRAM, 8, bublbobl_state )
AM_RANGE(0xfb00, 0xfb00) AM_WRITE(tokio_videoctrl_w)
AM_RANGE(0xfb80, 0xfb80) AM_WRITE(bublbobl_nmitrigger_w)
AM_RANGE(0xfc00, 0xfc00) AM_READWRITE(bublbobl_sound_status_r, bublbobl_sound_command_w)
- AM_RANGE(0xfe00, 0xfe00) AM_READWRITE(tokio_mcu_r, tokio_mcu_w)
ADDRESS_MAP_END
+static ADDRESS_MAP_START( tokio_map_mcu, AS_PROGRAM, 8, bublbobl_state )
+ AM_IMPORT_FROM(tokio_map)
+ AM_RANGE(0xfe00, 0xfe00) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( tokio_map_bootleg, AS_PROGRAM, 8, bublbobl_state )
+ AM_IMPORT_FROM(tokio_map)
+ AM_RANGE(0xfe00, 0xfe00) AM_READ( tokiob_mcu_r )
+ADDRESS_MAP_END
+
+
static ADDRESS_MAP_START( tokio_slave_map, AS_PROGRAM, 8, bublbobl_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x97ff) AM_RAM AM_SHARE("share1")
@@ -619,7 +629,7 @@ static INPUT_PORTS_START( dland )
PORT_DIPSETTING( 0x20, "100 (Cheat)")
INPUT_PORTS_END
-static INPUT_PORTS_START( tokio )
+static INPUT_PORTS_START( tokio_base )
PORT_START("DSW0")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SW A:1")
PORT_DIPSETTING( 0x00, DEF_STR( Upright ) )
@@ -669,8 +679,8 @@ static INPUT_PORTS_START( tokio )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(1)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_IMPULSE(1)
- PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, bublbobl_state,tokio_main_sent_r, nullptr)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, bublbobl_state,tokio_mcu_sent_r, nullptr)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_SPECIAL ) // see INPUT_PORTS_START( tokio )
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_SPECIAL ) // see INPUT_PORTS_START( tokio )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
@@ -695,7 +705,13 @@ static INPUT_PORTS_START( tokio )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
+static INPUT_PORTS_START( tokio )
+ PORT_INCLUDE( tokio_base )
+ PORT_MODIFY("IN0")
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("bmcu", taito68705_mcu_device, main_sent_r, nullptr)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER("bmcu", taito68705_mcu_device, mcu_sent_r, nullptr)
+INPUT_PORTS_END
/*************************************
*
@@ -744,15 +760,6 @@ MACHINE_RESET_MEMBER(bublbobl_state,common)
MACHINE_START_MEMBER(bublbobl_state,tokio)
{
MACHINE_START_CALL_MEMBER(common);
-
-
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
- save_item(NAME(m_from_mcu_latch));
- save_item(NAME(m_to_mcu_latch));
- save_item(NAME(m_old_portB));
}
@@ -767,7 +774,7 @@ static MACHINE_CONFIG_START( tokio, bublbobl_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_XTAL/4) // 6 MHz
- MCFG_CPU_PROGRAM_MAP(tokio_map)
+ MCFG_CPU_PROGRAM_MAP(tokio_map_mcu)
MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold)
MCFG_CPU_ADD("slave", Z80, MAIN_XTAL/4) // 6 MHz
@@ -777,12 +784,7 @@ static MACHINE_CONFIG_START( tokio, bublbobl_state )
MCFG_CPU_ADD("audiocpu", Z80, MAIN_XTAL/8) // 3 MHz
MCFG_CPU_PROGRAM_MAP(tokio_sound_map) // NMIs are triggered by the main CPU, IRQs are triggered by the YM2203
- MCFG_CPU_ADD("mcu", M68705_NEW, MAIN_XTAL/8) // 3 Mhz
- MCFG_M68705_PORTA_R_CB(READ8(bublbobl_state, tokio_mcu_porta_r))
- MCFG_M68705_PORTA_W_CB(WRITE8(bublbobl_state, tokio_mcu_porta_w))
- MCFG_M68705_PORTB_W_CB(WRITE8(bublbobl_state, tokio_mcu_portb_w))
- MCFG_M68705_PORTC_R_CB(READ8(bublbobl_state, tokio_mcu_portc_r))
-
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MAIN_XTAL/8) // 3 Mhz
MCFG_QUANTUM_PERFECT_CPU("maincpu")
@@ -816,9 +818,16 @@ static MACHINE_CONFIG_START( tokio, bublbobl_state )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( tokiob, tokio )
- MCFG_DEVICE_REMOVE("mcu")
+
+ MCFG_DEVICE_REMOVE("maincpu")
+ MCFG_DEVICE_REMOVE("bmcu")
+
+ MCFG_CPU_ADD("maincpu", Z80, MAIN_XTAL/4) // 6 MHz
+ MCFG_CPU_PROGRAM_MAP(tokio_map_bootleg)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", bublbobl_state, irq0_line_hold)
MACHINE_CONFIG_END
+
MACHINE_START_MEMBER(bublbobl_state,bublbobl)
{
MACHINE_START_CALL_MEMBER(common);
@@ -999,7 +1008,7 @@ ROM_START( tokio ) // newer japan set, has -1 revision of roms 02, 03 and 06
ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */
ROM_LOAD( "a71-07.ic10", 0x0000, 0x08000, CRC(f298cc7b) SHA1(ebf5c804aa07b7f198ec3e1f8d1e111cd89ebdf3) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller (68705P5) */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller (68705P5) */
ROM_LOAD( "a71__24.ic57", 0x0000, 0x0800, CRC(0f4b25de) SHA1(e2d82aa8d8cc6a86aaf5715ef9cb62f526fd5b11) )
ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) /* gfx roms, on gfx board */
@@ -1042,7 +1051,7 @@ ROM_START( tokioo ) // older japan set, has older roms 02, 03, 06
ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */
ROM_LOAD( "a71-07.ic10", 0x0000, 0x08000, CRC(f298cc7b) SHA1(ebf5c804aa07b7f198ec3e1f8d1e111cd89ebdf3) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller (68705P5) */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller (68705P5) */
ROM_LOAD( "a71__24.ic57", 0x0000, 0x0800, CRC(0f4b25de) SHA1(e2d82aa8d8cc6a86aaf5715ef9cb62f526fd5b11) )
ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) /* gfx roms, on gfx board */
@@ -1085,7 +1094,7 @@ ROM_START( tokiou )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* audio CPU */
ROM_LOAD( "a71-07.ic10", 0x0000, 0x08000, CRC(f298cc7b) SHA1(ebf5c804aa07b7f198ec3e1f8d1e111cd89ebdf3) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller (68705P5) */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller (68705P5) */
ROM_LOAD( "a71__24.ic57", 0x0000, 0x0800, CRC(0f4b25de) SHA1(e2d82aa8d8cc6a86aaf5715ef9cb62f526fd5b11) )
ROM_REGION( 0x80000, "gfx1", ROMREGION_INVERT ) /* gfx roms, on gfx board */
@@ -1871,12 +1880,7 @@ DRIVER_INIT_MEMBER(bublbobl_state,tokio)
m_video_enable = 1;
}
-DRIVER_INIT_MEMBER(bublbobl_state,tokiob)
-{
- DRIVER_INIT_CALL(tokio);
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xfe00, 0xfe00, read8_delegate(FUNC(bublbobl_state::tokiob_mcu_r),this) );
-}
DRIVER_INIT_MEMBER(bublbobl_state,dland)
{
@@ -1902,7 +1906,7 @@ DRIVER_INIT_MEMBER(bublbobl_state,dland)
GAME( 1986, tokio, 0, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito Corporation", "Tokio / Scramble Formation (newer)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, tokioo, tokio, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito Corporation", "Tokio / Scramble Formation (older)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, tokiou, tokio, tokio, tokio, bublbobl_state, tokio, ROT90, "Taito America Corporation (Romstar license)", "Tokio / Scramble Formation (US)", MACHINE_SUPPORTS_SAVE )
-GAME( 1986, tokiob, tokio, tokiob, tokio, bublbobl_state, tokiob, ROT90, "bootleg", "Tokio / Scramble Formation (bootleg)", MACHINE_SUPPORTS_SAVE )
+GAME( 1986, tokiob, tokio, tokiob, tokio_base, bublbobl_state, tokio, ROT90, "bootleg", "Tokio / Scramble Formation (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, bublbobl, 0, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.1)", MACHINE_SUPPORTS_SAVE )
GAME( 1986, bublbobl1, bublbobl, bublbobl, bublbobl, bublbobl_state, bublbobl, ROT0, "Taito Corporation", "Bubble Bobble (Japan, Ver 0.0)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/buggychl.cpp b/src/mame/drivers/buggychl.cpp
index 1ee00ce3b4e..9c802071125 100644
--- a/src/mame/drivers/buggychl.cpp
+++ b/src/mame/drivers/buggychl.cpp
@@ -140,8 +140,8 @@ static ADDRESS_MAP_START( buggychl_map, AS_PROGRAM, 8, buggychl_state )
AM_RANGE(0xd200, 0xd200) AM_WRITE(bankswitch_w)
AM_RANGE(0xd300, 0xd300) AM_DEVWRITE("watchdog", watchdog_timer_device, reset_w)
AM_RANGE(0xd303, 0xd303) AM_WRITE(buggychl_sprite_lookup_bank_w)
- AM_RANGE(0xd400, 0xd400) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_mcu_r, buggychl_mcu_w)
- AM_RANGE(0xd401, 0xd401) AM_DEVREAD("bmcu", buggychl_mcu_device, buggychl_mcu_status_r)
+ AM_RANGE(0xd400, 0xd400) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_RANGE(0xd401, 0xd401) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_status_r)
AM_RANGE(0xd500, 0xd57f) AM_WRITEONLY AM_SHARE("spriteram")
AM_RANGE(0xd600, 0xd600) AM_READ_PORT("DSW1")
AM_RANGE(0xd601, 0xd601) AM_READ_PORT("DSW2")
@@ -347,8 +347,6 @@ void buggychl_state::machine_start()
void buggychl_state::machine_reset()
{
- m_mcu->set_input_line(0, CLEAR_LINE);
-
m_sound_nmi_enable = 0;
m_pending_nmi = 0;
m_sl_bank = 0;
@@ -370,9 +368,8 @@ static MACHINE_CONFIG_START( buggychl, buggychl_state )
MCFG_CPU_PERIODIC_INT_DRIVER(buggychl_state, irq0_line_hold, 60*60) /* irq is timed, tied to the cpu clock and not to vblank */
/* nmi is caused by the main cpu */
- MCFG_CPU_ADD("mcu", M68705,8000000/2) /* 4 MHz */
- MCFG_CPU_PROGRAM_MAP(buggychl_mcu_map)
- MCFG_DEVICE_ADD("bmcu", BUGGYCHL_MCU, 0)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU,8000000/2) /* 4 MHz */
+
MCFG_WATCHDOG_ADD("watchdog")
@@ -438,7 +435,7 @@ ROM_START( buggychl )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound Z80 */
ROM_LOAD( "a22-24.28", 0x00000, 0x4000, CRC(1e7f841f) SHA1(2dc0787b08d32acb78291b689c02dbb83d04d08c) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 8k for the microcontroller */
ROM_LOAD( "a22-19.31", 0x00000, 0x0800, CRC(06a71df0) SHA1(28183e6769e1471e7f28dc2a9f5b54e14b7ef339) )
ROM_REGION( 0x20000, "gfx1", 0 ) /* sprites */
@@ -468,7 +465,7 @@ ROM_START( buggychlt )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* sound Z80 */
ROM_LOAD( "a22-24.28", 0x00000, 0x4000, CRC(1e7f841f) SHA1(2dc0787b08d32acb78291b689c02dbb83d04d08c) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 8k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 8k for the microcontroller */
ROM_LOAD( "a22-19.31", 0x00000, 0x0800, CRC(06a71df0) SHA1(28183e6769e1471e7f28dc2a9f5b54e14b7ef339) )
ROM_REGION( 0x20000, "gfx1", 0 ) /* sprites */
diff --git a/src/mame/drivers/crospang.cpp b/src/mame/drivers/crospang.cpp
index eb9a7f9d1bd..b2702b871ca 100644
--- a/src/mame/drivers/crospang.cpp
+++ b/src/mame/drivers/crospang.cpp
@@ -40,14 +40,6 @@
#include "includes/crospang.h"
-WRITE16_MEMBER(crospang_state::crospang_soundlatch_w)
-{
- if(ACCESSING_BITS_0_7)
- {
- m_soundlatch->write(space, 0, data & 0xff);
- }
-}
-
/* main cpu */
static ADDRESS_MAP_START( crospang_base_map, AS_PROGRAM, 16, crospang_state )
@@ -57,7 +49,7 @@ static ADDRESS_MAP_START( crospang_base_map, AS_PROGRAM, 16, crospang_state )
AM_RANGE(0x122000, 0x1227ff) AM_RAM_WRITE(crospang_bg_videoram_w) AM_SHARE("bg_videoram")
AM_RANGE(0x200000, 0x2005ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x210000, 0x2107ff) AM_RAM AM_SHARE("spriteram")
- AM_RANGE(0x270000, 0x270001) AM_WRITE(crospang_soundlatch_w)
+ AM_RANGE(0x270000, 0x270001) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0x00ff)
AM_RANGE(0x270004, 0x270007) AM_WRITENOP // ??
AM_RANGE(0x280000, 0x280001) AM_READ_PORT("P1_P2")
AM_RANGE(0x280002, 0x280003) AM_READ_PORT("COIN")
diff --git a/src/mame/drivers/crshrace.cpp b/src/mame/drivers/crshrace.cpp
index f56cc5643f2..b4ad32f78c0 100644
--- a/src/mame/drivers/crshrace.cpp
+++ b/src/mame/drivers/crshrace.cpp
@@ -143,14 +143,11 @@ WRITE8_MEMBER(crshrace_state::crshrace_sh_bankswitch_w)
m_z80bank->set_entry(data & 0x03);
}
-WRITE16_MEMBER(crshrace_state::sound_command_w)
+WRITE8_MEMBER(crshrace_state::sound_command_w)
{
- if (ACCESSING_BITS_0_7)
- {
- m_pending_command = 1;
- m_soundlatch->write(space, offset, data & 0xff);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
- }
+ m_pending_command = 1;
+ m_soundlatch->write(space, offset, data & 0xff);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
CUSTOM_INPUT_MEMBER(crshrace_state::country_sndpending_r)
@@ -164,7 +161,6 @@ WRITE8_MEMBER(crshrace_state::pending_command_clear_w)
}
-
static ADDRESS_MAP_START( crshrace_map, AS_PROGRAM, 16, crshrace_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x300000, 0x3fffff) AM_ROM AM_REGION("user1", 0)
@@ -180,7 +176,7 @@ static ADDRESS_MAP_START( crshrace_map, AS_PROGRAM, 16, crshrace_state )
AM_RANGE(0xfff002, 0xfff003) AM_READ_PORT("P2")
AM_RANGE(0xfff004, 0xfff005) AM_READ_PORT("DSW0")
AM_RANGE(0xfff006, 0xfff007) AM_READ_PORT("DSW2")
- AM_RANGE(0xfff008, 0xfff009) AM_WRITE(sound_command_w)
+ AM_RANGE(0xfff008, 0xfff009) AM_WRITE8(sound_command_w, 0x00ff)
AM_RANGE(0xfff00a, 0xfff00b) AM_READ_PORT("DSW1")
AM_RANGE(0xfff00e, 0xfff00f) AM_READ_PORT("P3")
AM_RANGE(0xfff020, 0xfff03f) AM_DEVWRITE("k053936", k053936_device, ctrl_w)
diff --git a/src/mame/drivers/dcheese.cpp b/src/mame/drivers/dcheese.cpp
index 2aad3a511de..59d07364a06 100644
--- a/src/mame/drivers/dcheese.cpp
+++ b/src/mame/drivers/dcheese.cpp
@@ -92,7 +92,6 @@ INTERRUPT_GEN_MEMBER(dcheese_state::dcheese_vblank)
void dcheese_state::machine_start()
{
save_item(NAME(m_irq_state));
- save_item(NAME(m_soundlatch_full));
save_item(NAME(m_sound_control));
save_item(NAME(m_sound_msb_latch));
}
@@ -107,7 +106,7 @@ void dcheese_state::machine_start()
CUSTOM_INPUT_MEMBER(dcheese_state::sound_latch_state_r)
{
- return m_soundlatch_full;
+ return m_soundlatch->pending_r();
}
@@ -123,18 +122,6 @@ WRITE16_MEMBER(dcheese_state::eeprom_control_w)
}
-WRITE16_MEMBER(dcheese_state::sound_command_w)
-{
- if (ACCESSING_BITS_0_7)
- {
- /* write the latch and set the IRQ */
- m_soundlatch_full = 1;
- m_audiocpu->set_input_line(0, ASSERT_LINE);
- m_soundlatch->write(space, 0, data & 0xff);
- }
-}
-
-
/*************************************
*
@@ -142,15 +129,6 @@ WRITE16_MEMBER(dcheese_state::sound_command_w)
*
*************************************/
-READ8_MEMBER(dcheese_state::sound_command_r)
-{
- /* read the latch and clear the IRQ */
- m_soundlatch_full = 0;
- m_audiocpu->set_input_line(0, CLEAR_LINE);
- return m_soundlatch->read(space, 0);
-}
-
-
READ8_MEMBER(dcheese_state::sound_status_r)
{
/* seems to be ready signal on BSMT or latching hardware */
@@ -202,7 +180,7 @@ static ADDRESS_MAP_START( main_cpu_map, AS_PROGRAM, 16, dcheese_state )
AM_RANGE(0x260000, 0x26001f) AM_WRITE(madmax_blitter_xparam_w)
AM_RANGE(0x280000, 0x28001f) AM_WRITE(madmax_blitter_yparam_w)
AM_RANGE(0x2a0000, 0x2a003f) AM_READWRITE(madmax_blitter_vidparam_r, madmax_blitter_vidparam_w)
- AM_RANGE(0x2e0000, 0x2e0001) AM_WRITE(sound_command_w)
+ AM_RANGE(0x2e0000, 0x2e0001) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0x00ff)
AM_RANGE(0x300000, 0x300001) AM_WRITE(madmax_blitter_unknown_w)
ADDRESS_MAP_END
@@ -217,7 +195,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_cpu_map, AS_PROGRAM, 8, dcheese_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x07ff) AM_READWRITE(sound_status_r, sound_control_w)
- AM_RANGE(0x0800, 0x0fff) AM_READ(sound_command_r)
+ AM_RANGE(0x0800, 0x0fff) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
AM_RANGE(0x1000, 0x10ff) AM_MIRROR(0x0700) AM_WRITE(bsmt_data_w)
AM_RANGE(0x1800, 0x1fff) AM_RAM
AM_RANGE(0x2000, 0xffff) AM_ROM
@@ -421,6 +399,7 @@ static MACHINE_CONFIG_START( dcheese, dcheese_state )
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_GENERIC_LATCH_8_ADD("soundlatch")
+ MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0))
MCFG_BSMT2000_ADD("bsmt", SOUND_OSC)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.2)
diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp
index 61a0a227402..96f7bdead39 100644
--- a/src/mame/drivers/ddenlovr.cpp
+++ b/src/mame/drivers/ddenlovr.cpp
@@ -265,24 +265,20 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(mjflove_blitter_r);
DECLARE_WRITE8_MEMBER(ddenlovr_bgcolor_w);
DECLARE_WRITE8_MEMBER(ddenlovr_bgcolor2_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_bgcolor_w);
DECLARE_WRITE8_MEMBER(ddenlovr_priority_w);
DECLARE_WRITE8_MEMBER(ddenlovr_priority2_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_priority_w);
DECLARE_WRITE8_MEMBER(ddenlovr_layer_enable_w);
DECLARE_WRITE8_MEMBER(ddenlovr_layer_enable2_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_layer_enable_w);
DECLARE_WRITE8_MEMBER(hanakanz_blitter_reg_w);
DECLARE_WRITE8_MEMBER(hanakanz_blitter_data_w);
DECLARE_WRITE8_MEMBER(rongrong_blitter_w);
- DECLARE_WRITE16_MEMBER(ddenlovr_blitter_w);
- DECLARE_WRITE16_MEMBER(ddenlovr_blitter_irq_ack_w);
+ DECLARE_WRITE8_MEMBER(ddenlovr_blitter_w);
+ DECLARE_WRITE8_MEMBER(ddenlovr_blitter_irq_ack_w);
DECLARE_READ8_MEMBER(rongrong_gfxrom_r);
DECLARE_READ16_MEMBER(ddenlovr_gfxrom_r);
- DECLARE_WRITE16_MEMBER(ddenlovr_coincounter_0_w);
- DECLARE_WRITE16_MEMBER(ddenlovr_coincounter_1_w);
+ DECLARE_WRITE8_MEMBER(ddenlovr_coincounter_0_w);
+ DECLARE_WRITE8_MEMBER(ddenlovr_coincounter_1_w);
DECLARE_WRITE8_MEMBER(rongrong_palette_w);
- DECLARE_WRITE16_MEMBER(ddenlovr_palette_w);
DECLARE_WRITE8_MEMBER(ddenlovr_palette_base_w);
DECLARE_WRITE8_MEMBER(ddenlovr_palette_base2_w);
DECLARE_WRITE8_MEMBER(ddenlovr_palette_mask_w);
@@ -291,30 +287,24 @@ public:
DECLARE_WRITE8_MEMBER(ddenlovr_transparency_pen2_w);
DECLARE_WRITE8_MEMBER(ddenlovr_transparency_mask_w);
DECLARE_WRITE8_MEMBER(ddenlovr_transparency_mask2_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_palette_base_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_palette_mask_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_transparency_pen_w);
- DECLARE_WRITE16_MEMBER(ddenlovr16_transparency_mask_w);
DECLARE_READ8_MEMBER(unk_r);
DECLARE_READ16_MEMBER(unk16_r);
- DECLARE_WRITE16_MEMBER(ddenlovr_select_16_w);
DECLARE_WRITE8_MEMBER(ddenlovr_select2_w);
- DECLARE_WRITE16_MEMBER(ddenlovr_select2_16_w);
DECLARE_READ8_MEMBER(rongrong_input2_r);
DECLARE_READ16_MEMBER(quiz365_input2_r);
DECLARE_WRITE8_MEMBER(rongrong_blitter_busy_w);
DECLARE_READ8_MEMBER(rongrong_blitter_busy_r);
- DECLARE_WRITE16_MEMBER(quiz365_coincounter_w);
+ DECLARE_WRITE8_MEMBER(quiz365_coincounter_w);
DECLARE_READ16_MEMBER(quiz365_protection_r);
DECLARE_WRITE16_MEMBER(quiz365_protection_w);
DECLARE_READ16_MEMBER(ddenlovj_dsw_r);
- DECLARE_WRITE16_MEMBER(ddenlovj_coincounter_w);
+ DECLARE_WRITE8_MEMBER(ddenlovj_coincounter_w);
DECLARE_READ16_MEMBER(ddenlovrk_protection1_r);
DECLARE_READ16_MEMBER(ddenlovrk_protection2_r);
DECLARE_WRITE16_MEMBER(ddenlovrk_protection2_w);
DECLARE_READ16_MEMBER(nettoqc_input_r);
DECLARE_READ16_MEMBER(nettoqc_protection1_r);
- DECLARE_WRITE16_MEMBER(nettoqc_coincounter_w);
+ DECLARE_WRITE8_MEMBER(nettoqc_coincounter_w);
DECLARE_READ16_MEMBER(ultrchmp_protection2_r);
DECLARE_WRITE16_MEMBER(ultrchmp_protection2_w);
DECLARE_READ8_MEMBER(rongrong_input_r);
@@ -425,12 +415,12 @@ public:
DECLARE_WRITE8_MEMBER(htengoku_dsw_w);
DECLARE_READ8_MEMBER(htengoku_dsw_r);
DECLARE_WRITE8_MEMBER( quizchq_oki_bank_w );
- DECLARE_WRITE16_MEMBER( ddenlovr_oki_bank_w );
- DECLARE_WRITE16_MEMBER( quiz365_oki_bank1_w );
- DECLARE_WRITE16_MEMBER( quiz365_oki_bank2_w );
+ DECLARE_WRITE8_MEMBER( ddenlovr_oki_bank_w );
+ DECLARE_WRITE8_MEMBER( quiz365_oki_bank1_w );
+ DECLARE_WRITE8_MEMBER( quiz365_oki_bank2_w );
DECLARE_WRITE8_MEMBER( ddenlovr_select_w );
DECLARE_READ8_MEMBER( quiz365_input_r );
- DECLARE_WRITE16_MEMBER( nettoqc_oki_bank_w );
+ DECLARE_WRITE8_MEMBER( nettoqc_oki_bank_w );
DECLARE_WRITE8_MEMBER( hanakanz_oki_bank_w );
DECLARE_WRITE8_MEMBER( mjchuuka_oki_bank_w );
DECLARE_READ8_MEMBER( hginga_dsw_r );
@@ -605,13 +595,6 @@ WRITE8_MEMBER(ddenlovr_state::ddenlovr_bgcolor2_w)
m_ddenlovr_bgcolor2 = data;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_bgcolor_w)
-{
- if (ACCESSING_BITS_0_7)
- ddenlovr_bgcolor_w(space, offset, data);
-}
-
-
WRITE8_MEMBER(ddenlovr_state::ddenlovr_priority_w)
{
m_ddenlovr_priority = data;
@@ -622,13 +605,6 @@ WRITE8_MEMBER(ddenlovr_state::ddenlovr_priority2_w)
m_ddenlovr_priority2 = data;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_priority_w)
-{
- if (ACCESSING_BITS_0_7)
- ddenlovr_priority_w(space, offset, data);
-}
-
-
WRITE8_MEMBER(ddenlovr_state::ddenlovr_layer_enable_w)
{
m_ddenlovr_layer_enable = data;
@@ -640,14 +616,6 @@ WRITE8_MEMBER(ddenlovr_state::ddenlovr_layer_enable2_w)
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_layer_enable_w)
-{
- if (ACCESSING_BITS_0_7)
- ddenlovr_layer_enable_w(space, offset, data);
-}
-
-
-
void ddenlovr_state::do_plot( int x, int y, int pen )
{
int addr, temp;
@@ -1511,26 +1479,22 @@ WRITE8_MEMBER(ddenlovr_state::rongrong_blitter_w)
blitter_w(space, 0, offset, data, 0xf8);
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_blitter_w)
+WRITE8_MEMBER(ddenlovr_state::ddenlovr_blitter_w)
{
- if (ACCESSING_BITS_0_7)
- blitter_w(space, 0, offset, data & 0xff, 0);
+ blitter_w(space, 0, offset, data, 0);
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_blitter_irq_ack_w)
+WRITE8_MEMBER(ddenlovr_state::ddenlovr_blitter_irq_ack_w)
{
- if (ACCESSING_BITS_0_7)
+ if (data & 1)
{
- if (data & 1)
- {
- m_ddenlovr_blitter_irq_enable = 1;
- }
- else
- {
- m_ddenlovr_blitter_irq_enable = 0;
- m_ddenlovr_blitter_irq_flag = 0;
- }
+ m_ddenlovr_blitter_irq_enable = 1;
+ }
+ else
+ {
+ m_ddenlovr_blitter_irq_enable = 0;
+ m_ddenlovr_blitter_irq_flag = 0;
}
}
@@ -1701,15 +1665,14 @@ CUSTOM_INPUT_MEMBER(ddenlovr_state::ddenlovr_blitter_irq_r)
return m_ddenlovr_blitter_irq_flag;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_coincounter_0_w)
+WRITE8_MEMBER(ddenlovr_state::ddenlovr_coincounter_0_w)
{
- if (ACCESSING_BITS_0_7)
- machine().bookkeeping().coin_counter_w(0, data & 1);
+ machine().bookkeeping().coin_counter_w(0, data & 1);
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_coincounter_1_w)
+
+WRITE8_MEMBER(ddenlovr_state::ddenlovr_coincounter_1_w)
{
- if (ACCESSING_BITS_0_7)
- machine().bookkeeping().coin_counter_w(1, data & 1);
+ machine().bookkeeping().coin_counter_w(1, data & 1);
}
@@ -1731,13 +1694,6 @@ WRITE8_MEMBER(ddenlovr_state::rongrong_palette_w)
m_palette->set_pen_color(indx, pal5bit(r), pal5bit(g), pal5bit(b));
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_palette_w)
-{
- if (ACCESSING_BITS_0_7)
- rongrong_palette_w(space, offset, data & 0xff);
-}
-
-
WRITE8_MEMBER(ddenlovr_state::ddenlovr_palette_base_w)
{
m_ddenlovr_palette_base[offset] = data;
@@ -1781,62 +1737,26 @@ WRITE8_MEMBER(ddenlovr_state::ddenlovr_transparency_mask2_w)
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_palette_base_w)
-{
- if (ACCESSING_BITS_0_7)
- m_ddenlovr_palette_base[offset] = data & 0xff;
-}
-
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_palette_mask_w)
-{
- if (ACCESSING_BITS_0_7)
- m_ddenlovr_palette_mask[offset] = data & 0xff;
-}
-
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_transparency_pen_w)
-{
- if (ACCESSING_BITS_0_7)
- m_ddenlovr_transparency_pen[offset] = data & 0xff;
-}
-
-WRITE16_MEMBER(ddenlovr_state::ddenlovr16_transparency_mask_w)
-{
- if (ACCESSING_BITS_0_7)
- m_ddenlovr_transparency_mask[offset] = data & 0xff;
-}
-
-
WRITE8_MEMBER(ddenlovr_state::quizchq_oki_bank_w )
{
m_oki->set_rom_bank(data & 1);
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_oki_bank_w )
+WRITE8_MEMBER(ddenlovr_state::ddenlovr_oki_bank_w )
{
- if (ACCESSING_BITS_0_7)
- {
- m_oki->set_rom_bank(data & 7);
- }
+ m_oki->set_rom_bank(data & 7);
}
-
-
-WRITE16_MEMBER(ddenlovr_state::quiz365_oki_bank1_w )
+WRITE8_MEMBER(ddenlovr_state::quiz365_oki_bank1_w )
{
- if (ACCESSING_BITS_0_7)
- {
- m_okibank = (m_okibank & 2) | (data & 1);
- m_oki->set_rom_bank(m_okibank);
- }
+ m_okibank = (m_okibank & 2) | (data & 1);
+ m_oki->set_rom_bank(m_okibank);
}
-WRITE16_MEMBER(ddenlovr_state::quiz365_oki_bank2_w )
+WRITE8_MEMBER(ddenlovr_state::quiz365_oki_bank2_w )
{
- if (ACCESSING_BITS_0_7)
- {
- m_okibank = (m_okibank & 1) | ((data & 1) << 1);
- m_oki->set_rom_bank(m_okibank);
- }
+ m_okibank = (m_okibank & 1) | ((data & 1) << 1);
+ m_oki->set_rom_bank(m_okibank);
}
@@ -1857,23 +1777,11 @@ WRITE8_MEMBER(ddenlovr_state::ddenlovr_select_w )
m_dsw_sel = data;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_select_16_w)
-{
- if (ACCESSING_BITS_0_7)
- m_dsw_sel = data;
-}
-
WRITE8_MEMBER(ddenlovr_state::ddenlovr_select2_w)
{
m_input_sel = data;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovr_select2_16_w)
-{
- if (ACCESSING_BITS_0_7)
- m_input_sel = data;
-}
-
READ8_MEMBER(ddenlovr_state::rongrong_input2_r)
{
// logerror("%04x: input2_r offset %d select %x\n", space.device().safe_pc(), offset, m_input_sel);
@@ -1933,15 +1841,12 @@ READ8_MEMBER(ddenlovr_state::rongrong_blitter_busy_r)
}
-WRITE16_MEMBER(ddenlovr_state::quiz365_coincounter_w)
+WRITE8_MEMBER(ddenlovr_state::quiz365_coincounter_w)
{
- if (ACCESSING_BITS_0_7)
+ if (m_input_sel == 0x1c)
{
- if (m_input_sel == 0x1c)
- {
- machine().bookkeeping().coin_counter_w(0, ~data & 1);
- machine().bookkeeping().coin_counter_w(1, ~data & 4);
- }
+ machine().bookkeeping().coin_counter_w(0, ~data & 1);
+ machine().bookkeeping().coin_counter_w(1, ~data & 4);
}
}
@@ -1968,25 +1873,25 @@ WRITE16_MEMBER(ddenlovr_state::quiz365_protection_w)
static ADDRESS_MAP_START( quiz365_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x000000, 0x17ffff) AM_ROM // ROM
- AM_RANGE(0x200000, 0x2003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0x200000, 0x2003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
AM_RANGE(0x200c02, 0x200c03) AM_READ(quiz365_protection_r) // Protection
AM_RANGE(0x200e0a, 0x200e0d) AM_WRITE(quiz365_protection_w) // Protection
// AM_RANGE(0x201000, 0x2017ff) AM_WRITEONLY // ?
- AM_RANGE(0x300200, 0x300201) AM_WRITE(ddenlovr_select2_16_w)
- AM_RANGE(0x300202, 0x300203) AM_WRITE(quiz365_coincounter_w) // Coin Counters + more stuff written on startup
+ AM_RANGE(0x300200, 0x300201) AM_WRITE8(ddenlovr_select2_w, 0x00ff)
+ AM_RANGE(0x300202, 0x300203) AM_WRITE8(quiz365_coincounter_w, 0x00ff) // Coin Counters + more stuff written on startup
AM_RANGE(0x300204, 0x300207) AM_READ(quiz365_input2_r) //
- AM_RANGE(0x300240, 0x300247) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0x300248, 0x30024f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0x300250, 0x300257) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0x300258, 0x30025f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0x300268, 0x300269) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0x30026a, 0x30026b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0x30026c, 0x30026d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0x300240, 0x300247) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0x300248, 0x30024f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0x300250, 0x300257) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0x300258, 0x30025f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0x300268, 0x300269) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0x30026a, 0x30026b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0x30026c, 0x30026d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0x300270, 0x300271) AM_READ(unk16_r) // ? must be 78 on startup (not necessary in ddlover)
- AM_RANGE(0x300280, 0x300283) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0x300280, 0x300283) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0x300286, 0x300287) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0x3002c0, 0x3002c1) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff)// Sound
@@ -1994,9 +1899,9 @@ static ADDRESS_MAP_START( quiz365_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x300340, 0x30035f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
AM_RANGE(0x300380, 0x300383) AM_DEVWRITE8("aysnd", ay8910_device, address_data_w, 0x00ff)
AM_RANGE(0x300384, 0x300385) AM_DEVREAD8("aysnd", ay8910_device, data_r, 0x00ff)
- AM_RANGE(0x3003c2, 0x3003c3) AM_WRITE(quiz365_oki_bank1_w)
- AM_RANGE(0x3003ca, 0x3003cb) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
- AM_RANGE(0x3003cc, 0x3003cd) AM_WRITE(quiz365_oki_bank2_w)
+ AM_RANGE(0x3003c2, 0x3003c3) AM_WRITE8(quiz365_oki_bank1_w, 0x00ff)
+ AM_RANGE(0x3003ca, 0x3003cb) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
+ AM_RANGE(0x3003cc, 0x3003cd) AM_WRITE8(quiz365_oki_bank2_w, 0x00ff)
AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM
ADDRESS_MAP_END
@@ -2011,14 +1916,11 @@ READ16_MEMBER(ddenlovr_state::ddenlovj_dsw_r)
return dsw;
}
-WRITE16_MEMBER(ddenlovr_state::ddenlovj_coincounter_w)
+WRITE8_MEMBER(ddenlovr_state::ddenlovj_coincounter_w)
{
- if (ACCESSING_BITS_0_7)
- {
- machine().bookkeeping().coin_counter_w(0, data & 0x01);
- machine().bookkeeping().coin_counter_w(1, data & 0x04);
- // data & 0x80 ?
- }
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x04);
+ // data & 0x80 ?
}
CUSTOM_INPUT_MEMBER(ddenlovr_state::ddenlovj_blitter_r)
@@ -2029,18 +1931,18 @@ CUSTOM_INPUT_MEMBER(ddenlovr_state::ddenlovj_blitter_r)
static ADDRESS_MAP_START( ddenlovj_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM
- AM_RANGE(0x200000, 0x2003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0x200000, 0x2003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
// AM_RANGE(0x201000, 0x2017ff) AM_WRITEONLY // ? B0 on startup, then 00
- AM_RANGE(0x300040, 0x300047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0x300048, 0x30004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0x300050, 0x300057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0x300058, 0x30005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0x300068, 0x300069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0x30006a, 0x30006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0x30006c, 0x30006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0x300040, 0x300047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0x300048, 0x30004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0x300050, 0x300057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0x300058, 0x30005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0x300068, 0x300069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0x30006a, 0x30006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0x30006c, 0x30006d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0x300070, 0x300071) AM_READ(unk16_r) // ? must be 78 on startup (not necessary in ddlover)
- AM_RANGE(0x300080, 0x300083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0x300080, 0x300083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0x300086, 0x300087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0x3000c0, 0x3000c3) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
@@ -2049,10 +1951,10 @@ static ADDRESS_MAP_START( ddenlovj_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x300182, 0x300183) AM_READ_PORT("P2")
AM_RANGE(0x300184, 0x300185) AM_READ_PORT("SYSTEM")
AM_RANGE(0x300186, 0x300187) AM_READ(ddenlovj_dsw_r) // DSW
- AM_RANGE(0x300188, 0x300189) AM_WRITE(ddenlovj_coincounter_w) // Coin Counters
+ AM_RANGE(0x300188, 0x300189) AM_WRITE8(ddenlovj_coincounter_w, 0x00ff)
AM_RANGE(0x30018a, 0x30018b) AM_WRITEONLY AM_SHARE("dsw_sel16") // DSW select
- AM_RANGE(0x30018c, 0x30018d) AM_WRITE(ddenlovr_oki_bank_w)
- AM_RANGE(0x3001ca, 0x3001cb) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
+ AM_RANGE(0x30018c, 0x30018d) AM_WRITE8(ddenlovr_oki_bank_w, 0x00ff)
+ AM_RANGE(0x3001ca, 0x3001cb) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
AM_RANGE(0x300240, 0x300241) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff)// Sound
AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM
ADDRESS_MAP_END
@@ -2087,27 +1989,27 @@ static ADDRESS_MAP_START( ddenlovrk_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x100000, 0x100001) AM_RAM_READ(ddenlovrk_protection1_r) AM_SHARE("protection1")
AM_RANGE(0x200000, 0x200001) AM_READWRITE(ddenlovrk_protection2_r, ddenlovrk_protection2_w) AM_SHARE("protection2")
- AM_RANGE(0xd00000, 0xd003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0xd00000, 0xd003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
// AM_RANGE(0xd01000, 0xd017ff) AM_RAM // ? B0 on startup, then 00
- AM_RANGE(0xe00040, 0xe00047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0xe00048, 0xe0004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0xe00050, 0xe00057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0xe00058, 0xe0005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0xe00068, 0xe00069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0xe00040, 0xe00047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0xe00048, 0xe0004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0xe00050, 0xe00057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0xe00058, 0xe0005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0xe00068, 0xe00069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0xe00070, 0xe00071) AM_READNOP
- AM_RANGE(0xe00080, 0xe00083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0xe00080, 0xe00083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0xe00086, 0xe00087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0xe00100, 0xe00101) AM_READ_PORT("P1")
AM_RANGE(0xe00102, 0xe00103) AM_READ_PORT("P2")
AM_RANGE(0xe00104, 0xe00105) AM_READ_PORT("SYSTEM")
AM_RANGE(0xe00200, 0xe00201) AM_READ_PORT("DSW")
- AM_RANGE(0xe00302, 0xe00303) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
- AM_RANGE(0xe00308, 0xe00309) AM_WRITE(ddenlovr_coincounter_0_w) // Coin Counters
- AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) //
+ AM_RANGE(0xe00302, 0xe00303) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
+ AM_RANGE(0xe00308, 0xe00309) AM_WRITE8(ddenlovr_coincounter_0_w, 0x00ff)
+ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE8(ddenlovr_coincounter_1_w, 0x00ff)
AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
@@ -2123,29 +2025,29 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( ddenlovr_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM // ROM
- AM_RANGE(0x300000, 0x300001) AM_WRITE( ddenlovr_oki_bank_w)
+ AM_RANGE(0x300000, 0x300001) AM_WRITE8(ddenlovr_oki_bank_w, 0x00ff)
- AM_RANGE(0xd00000, 0xd003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0xd00000, 0xd003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
// AM_RANGE(0xd01000, 0xd017ff) AM_RAM // ? B0 on startup, then 00
- AM_RANGE(0xe00040, 0xe00047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0xe00048, 0xe0004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0xe00050, 0xe00057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0xe00058, 0xe0005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0xe00068, 0xe00069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0xe00040, 0xe00047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0xe00048, 0xe0004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0xe00050, 0xe00057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0xe00058, 0xe0005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0xe00068, 0xe00069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0xe00070, 0xe00071) AM_READ(unk16_r) // ? must be 78 on startup (not necessary in ddlover)
- AM_RANGE(0xe00080, 0xe00083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0xe00080, 0xe00083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0xe00086, 0xe00087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0xe00100, 0xe00101) AM_READ_PORT("P1")
AM_RANGE(0xe00102, 0xe00103) AM_READ_PORT("P2")
AM_RANGE(0xe00104, 0xe00105) AM_READ_PORT("SYSTEM")
AM_RANGE(0xe00200, 0xe00201) AM_READ_PORT("DSW")
- AM_RANGE(0xe00302, 0xe00303) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
- AM_RANGE(0xe00308, 0xe00309) AM_WRITE(ddenlovr_coincounter_0_w) // Coin Counters
- AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) //
+ AM_RANGE(0xe00302, 0xe00303) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
+ AM_RANGE(0xe00308, 0xe00309) AM_WRITE8(ddenlovr_coincounter_0_w, 0x00ff)
+ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE8(ddenlovr_coincounter_1_w, 0x00ff)
AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
@@ -2185,41 +2087,35 @@ READ16_MEMBER(ddenlovr_state::nettoqc_protection1_r)
}
}
-WRITE16_MEMBER(ddenlovr_state::nettoqc_coincounter_w)
+WRITE8_MEMBER(ddenlovr_state::nettoqc_coincounter_w)
{
- if (ACCESSING_BITS_0_7)
- {
- machine().bookkeeping().coin_counter_w(0, data & 0x01);
- machine().bookkeeping().coin_counter_w(1, data & 0x04);
- // data & 0x80 ?
- }
+ machine().bookkeeping().coin_counter_w(0, data & 0x01);
+ machine().bookkeeping().coin_counter_w(1, data & 0x04);
+ // data & 0x80 ?
}
-WRITE16_MEMBER(ddenlovr_state::nettoqc_oki_bank_w )
+WRITE8_MEMBER(ddenlovr_state::nettoqc_oki_bank_w )
{
- if (ACCESSING_BITS_0_7)
- {
- m_oki->set_rom_bank(data & 3);
- }
+ m_oki->set_rom_bank(data & 3);
}
static ADDRESS_MAP_START( nettoqc_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x000000, 0x17ffff) AM_ROM // ROM
- AM_RANGE(0x200000, 0x2003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0x200000, 0x2003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
AM_RANGE(0x200c02, 0x200c03) AM_READ(nettoqc_protection1_r) // Protection 1
AM_RANGE(0x200e0a, 0x200e0d) AM_WRITEONLY AM_SHARE("protection1") // ""
AM_RANGE(0x201000, 0x2017ff) AM_WRITEONLY // ?
- AM_RANGE(0x300040, 0x300047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0x300048, 0x30004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0x300050, 0x300057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0x300058, 0x30005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0x300068, 0x300069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0x30006a, 0x30006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0x30006c, 0x30006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0x300040, 0x300047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0x300048, 0x30004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0x300050, 0x300057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0x300058, 0x30005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0x300068, 0x300069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0x30006a, 0x30006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0x30006c, 0x30006d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0x300070, 0x300071) AM_READ(unk16_r) // ? must be 78 on startup (not necessary in ddlover)
- AM_RANGE(0x300080, 0x300083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0x300080, 0x300083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0x300086, 0x300087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0x3000c0, 0x3000c3) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0x300100, 0x30011f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
@@ -2228,10 +2124,10 @@ static ADDRESS_MAP_START( nettoqc_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x300182, 0x300183) AM_READ_PORT("P2")
AM_RANGE(0x300184, 0x300185) AM_READ_PORT("SYSTEM")
AM_RANGE(0x300186, 0x300187) AM_READ(nettoqc_input_r) // DSW's
- AM_RANGE(0x300188, 0x300189) AM_WRITE(nettoqc_coincounter_w) // Coin Counters
- AM_RANGE(0x30018a, 0x30018b) AM_WRITE(ddenlovr_select_16_w) //
- AM_RANGE(0x30018c, 0x30018d) AM_WRITE(nettoqc_oki_bank_w)
- AM_RANGE(0x3001ca, 0x3001cb) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
+ AM_RANGE(0x300188, 0x300189) AM_WRITE8(nettoqc_coincounter_w, 0x00ff)
+ AM_RANGE(0x30018a, 0x30018b) AM_WRITE8(ddenlovr_select_w, 0x00ff)
+ AM_RANGE(0x30018c, 0x30018d) AM_WRITE8(nettoqc_oki_bank_w, 0x00ff)
+ AM_RANGE(0x3001ca, 0x3001cb) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
AM_RANGE(0x300240, 0x300241) AM_DEVREADWRITE8("oki", okim6295_device, read, write, 0x00ff) // Sound
AM_RANGE(0xff0000, 0xffffff) AM_RAM // RAM
ADDRESS_MAP_END
@@ -2258,31 +2154,31 @@ static ADDRESS_MAP_START( ultrchmp_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x224680, 0x224681) AM_RAM_READ(ultrchmp_protection2_r) AM_SHARE("protection2") // Protection 2
AM_RANGE(0x313570, 0x313571) AM_WRITE(ultrchmp_protection2_w) // "" + OKI bank
- AM_RANGE(0xd00000, 0xd003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0xd00000, 0xd003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
AM_RANGE(0xd00c02, 0xd00c03) AM_READ(nettoqc_protection1_r) // Protection 1
AM_RANGE(0xd00e0a, 0xd00e0d) AM_WRITEONLY AM_SHARE("protection1") // ""
AM_RANGE(0xd01000, 0xd017ff) AM_WRITEONLY // ?
- AM_RANGE(0xe00040, 0xe00047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0xe00048, 0xe0004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0xe00050, 0xe00057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0xe00058, 0xe0005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0xe00068, 0xe00069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0xe00040, 0xe00047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0xe00048, 0xe0004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0xe00050, 0xe00057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0xe00058, 0xe0005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0xe00068, 0xe00069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE8(ddenlovr_layer_enable_w, 0x00ff)
AM_RANGE(0xe00070, 0xe00071) AM_READNOP
- AM_RANGE(0xe00080, 0xe00083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0xe00080, 0xe00083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0xe00086, 0xe00087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0xe00100, 0xe00101) AM_READ_PORT("P1")
AM_RANGE(0xe00102, 0xe00103) AM_READ_PORT("P2")
AM_RANGE(0xe00104, 0xe00105) AM_READ_PORT("SYSTEM")
AM_RANGE(0xe00200, 0xe00201) AM_READ_PORT("DSW")
- AM_RANGE(0xe00302, 0xe00303) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
- AM_RANGE(0xe00308, 0xe00309) AM_WRITE(ddenlovr_coincounter_0_w) // Coin Counters
- AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) //
+ AM_RANGE(0xe00302, 0xe00303) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
+ AM_RANGE(0xe00308, 0xe00309) AM_WRITE8(ddenlovr_coincounter_0_w, 0x00ff)
+ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE8(ddenlovr_coincounter_1_w, 0x00ff)
AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write,0x00ff)
@@ -3749,18 +3645,18 @@ static ADDRESS_MAP_START( akamaru_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0x213570, 0x213571) AM_WRITE(akamaru_protection1_w) // OKI bank
AM_RANGE(0x624680, 0x624681) AM_READ(akamaru_protection1_r)
- AM_RANGE(0xd00000, 0xd003ff) AM_WRITE(ddenlovr_palette_w) // Palette
+ AM_RANGE(0xd00000, 0xd003ff) AM_WRITE8(rongrong_palette_w, 0x00ff)
// AM_RANGE(0xd01000, 0xd017ff) AM_WRITEONLY // 0
- AM_RANGE(0xe00040, 0xe00047) AM_WRITE(ddenlovr16_palette_base_w)
- AM_RANGE(0xe00048, 0xe0004f) AM_WRITE(ddenlovr16_palette_mask_w)
- AM_RANGE(0xe00050, 0xe00057) AM_WRITE(ddenlovr16_transparency_pen_w)
- AM_RANGE(0xe00058, 0xe0005f) AM_WRITE(ddenlovr16_transparency_mask_w)
- AM_RANGE(0xe00068, 0xe00069) AM_WRITE(ddenlovr16_bgcolor_w)
- AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE(ddenlovr16_priority_w)
- AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE(ddenlovr16_layer_enable_w)
+ AM_RANGE(0xe00040, 0xe00047) AM_WRITE8(ddenlovr_palette_base_w, 0x00ff)
+ AM_RANGE(0xe00048, 0xe0004f) AM_WRITE8(ddenlovr_palette_mask_w, 0x00ff)
+ AM_RANGE(0xe00050, 0xe00057) AM_WRITE8(ddenlovr_transparency_pen_w, 0x00ff)
+ AM_RANGE(0xe00058, 0xe0005f) AM_WRITE8(ddenlovr_transparency_mask_w, 0x00ff)
+ AM_RANGE(0xe00068, 0xe00069) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
+ AM_RANGE(0xe0006a, 0xe0006b) AM_WRITE8(ddenlovr_priority_w, 0x00ff)
+ AM_RANGE(0xe0006c, 0xe0006d) AM_WRITE8(ddenlovr_bgcolor_w, 0x00ff)
AM_RANGE(0xe00070, 0xe00071) AM_READ(unk16_r) // ? must be 78 on startup (not necessary in ddlover)
- AM_RANGE(0xe00080, 0xe00083) AM_WRITE(ddenlovr_blitter_w)
+ AM_RANGE(0xe00080, 0xe00083) AM_WRITE8(ddenlovr_blitter_w, 0x00ff)
AM_RANGE(0xe00086, 0xe00087) AM_READ(ddenlovr_gfxrom_r) // Video Chip
AM_RANGE(0xe00100, 0xe00101) AM_READ_PORT("P1")
@@ -3774,11 +3670,11 @@ static ADDRESS_MAP_START( akamaru_map, AS_PROGRAM, 16, ddenlovr_state )
AM_RANGE(0xe00200, 0xe00201) AM_READ(akamaru_dsw_r) // DSW
AM_RANGE(0xe00204, 0xe00205) AM_READ(akamaru_blitter_r) // Blitter Busy & IRQ
- AM_RANGE(0xe00302, 0xe00303) AM_WRITE(ddenlovr_blitter_irq_ack_w) // Blitter irq acknowledge
+ AM_RANGE(0xe00302, 0xe00303) AM_WRITE8(ddenlovr_blitter_irq_ack_w, 0x00ff)
AM_RANGE(0xe00304, 0xe00307) AM_WRITEONLY AM_SHARE("dsw_sel16") // DSW select
- AM_RANGE(0xe00308, 0xe00309) AM_WRITE(ddenlovr_coincounter_0_w) // Coin Counters
- AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE(ddenlovr_coincounter_1_w) //
+ AM_RANGE(0xe00308, 0xe00309) AM_WRITE8(ddenlovr_coincounter_0_w, 0x00ff)
+ AM_RANGE(0xe0030c, 0xe0030d) AM_WRITE8(ddenlovr_coincounter_1_w, 0x00ff)
AM_RANGE(0xe00400, 0xe00403) AM_DEVWRITE8("ym2413", ym2413_device, write, 0x00ff)
AM_RANGE(0xe00500, 0xe0051f) AM_DEVREADWRITE8("rtc", msm6242_device, read, write, 0x00ff)
diff --git a/src/mame/drivers/flstory.cpp b/src/mame/drivers/flstory.cpp
index 88505594557..47a3456f29c 100644
--- a/src/mame/drivers/flstory.cpp
+++ b/src/mame/drivers/flstory.cpp
@@ -70,7 +70,7 @@ static ADDRESS_MAP_START( flstory_map, AS_PROGRAM, 8, flstory_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(flstory_videoram_w) AM_SHARE("videoram")
AM_RANGE(0xc800, 0xcfff) AM_RAM /* unknown */
- AM_RANGE(0xd000, 0xd000) AM_READWRITE(flstory_mcu_r, flstory_mcu_w)
+ AM_RANGE(0xd000, 0xd000) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
AM_RANGE(0xd001, 0xd001) AM_WRITENOP /* watchdog? */
AM_RANGE(0xd002, 0xd002) AM_WRITENOP /* coin lock out? */
AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w)
@@ -81,7 +81,7 @@ static ADDRESS_MAP_START( flstory_map, AS_PROGRAM, 8, flstory_state )
AM_RANGE(0xd802, 0xd802) AM_READ_PORT("DSW2")
AM_RANGE(0xd803, 0xd803) AM_READ_PORT("SYSTEM")
AM_RANGE(0xd804, 0xd804) AM_READ_PORT("P1")
- AM_RANGE(0xd805, 0xd805) AM_READ(flstory_mcu_status_r)
+ AM_RANGE(0xd805, 0xd805) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_status_r)
AM_RANGE(0xd806, 0xd806) AM_READ_PORT("P2")
// AM_RANGE(0xda00, 0xda00) AM_WRITEONLY
AM_RANGE(0xdc00, 0xdc9f) AM_RAM AM_SHARE("spriteram")
@@ -441,17 +441,6 @@ static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, flstory_state )
AM_RANGE(0xe000, 0xefff) AM_ROM /* space for diagnostics ROM */
ADDRESS_MAP_END
-static ADDRESS_MAP_START( flstory_m68705_map, AS_PROGRAM, 8, flstory_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(flstory_68705_port_a_r, flstory_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(flstory_68705_port_b_r, flstory_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_READWRITE(flstory_68705_port_c_r, flstory_68705_port_c_w)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(flstory_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(flstory_68705_ddr_b_w)
- AM_RANGE(0x0006, 0x0006) AM_WRITE(flstory_68705_ddr_c_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
@@ -992,22 +981,12 @@ void flstory_state::machine_start()
save_item(NAME(m_snd_ctrl2));
save_item(NAME(m_snd_ctrl3));
/* mcu */
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_port_c_in));
- save_item(NAME(m_port_c_out));
- save_item(NAME(m_ddr_c));
save_item(NAME(m_mcu_select));
+ save_item(NAME(m_from_mcu));
}
+
+
MACHINE_RESET_MEMBER(flstory_state,flstory)
{
MACHINE_RESET_CALL_MEMBER(ta7630);
@@ -1026,20 +1005,8 @@ MACHINE_RESET_MEMBER(flstory_state,flstory)
m_snd_ctrl2 = 0;
m_snd_ctrl3 = 0;
/* mcu */
- m_from_main = 0;
- m_from_mcu = 0;
- m_mcu_sent = 0;
- m_main_sent = 0;
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_port_c_in = 0;
- m_port_c_out = 0;
- m_ddr_c = 0;
m_mcu_select = 0;
+ m_from_mcu = 0;
}
static MACHINE_CONFIG_START( flstory, flstory_state )
@@ -1054,8 +1021,7 @@ static MACHINE_CONFIG_START( flstory, flstory_state )
MCFG_CPU_PERIODIC_INT_DRIVER(flstory_state, irq0_line_hold, 2*60) /* IRQ generated by ??? */
/* NMI generated by the main CPU */
- MCFG_CPU_ADD("mcu", M68705, XTAL_18_432MHz/6) /* verified on pcb */
- MCFG_CPU_PROGRAM_MAP(flstory_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, XTAL_18_432MHz/6) /* verified on pcb */
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */
@@ -1316,7 +1282,7 @@ ROM_START( flstory )
ROM_LOAD( "snd.22", 0x0000, 0x2000, CRC(d58b201d) SHA1(1c9c2936ec95a8fa920d58668bea420c5e15008f) )
ROM_LOAD( "snd.23", 0x2000, 0x2000, CRC(25e7fd9d) SHA1(b9237459e3d8acf8502a693914e50714a37d515e) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a45.mcu", 0x0000, 0x0800, CRC(5378253c) SHA1(e1ae1ab01e470b896c1d74ad4088928602a21a1b) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -1340,7 +1306,7 @@ ROM_START( flstoryj )
ROM_LOAD( "a45_12.8", 0x0000, 0x2000, CRC(d6f593fb) SHA1(8551ef22c2cdd9df8d7949a178883f56ea56a4a2) )
ROM_LOAD( "a45_13.9", 0x2000, 0x2000, CRC(451f92f9) SHA1(f4196e6d3420983b74001303936d086a48b10827) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a45.mcu", 0x0000, 0x0800, CRC(5378253c) SHA1(e1ae1ab01e470b896c1d74ad4088928602a21a1b) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -1367,7 +1333,7 @@ ROM_START( onna34ro )
ROM_LOAD( "a52-15.37s", 0x6000, 0x2000, CRC(5afc21d0) SHA1(317d5fb3a48ce5e13e02c5c6431fa08ada115d27) )
ROM_LOAD( "a52-16.38s", 0x8000, 0x2000, CRC(ccf42aee) SHA1(a6eb01c5384724999631b55700dade430b71ca95) )
- ROM_REGION( 0x0800, "cpu2", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a52-17.54c", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -1394,7 +1360,7 @@ ROM_START( onna34roa )
ROM_LOAD( "a52-15.37s", 0x6000, 0x2000, CRC(5afc21d0) SHA1(317d5fb3a48ce5e13e02c5c6431fa08ada115d27) )
ROM_LOAD( "a52-16.38s", 0x8000, 0x2000, CRC(ccf42aee) SHA1(a6eb01c5384724999631b55700dade430b71ca95) )
- ROM_REGION( 0x0800, "cpu2", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a52-17.54c", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -1509,7 +1475,7 @@ ROM_START( victnine )
ROM_LOAD( "a16-16.38", 0x8000, 0x2000, CRC(9395351b) SHA1(8f97bdf03dec47bcaaa62fb66c545566776116be) )
ROM_LOAD( "a16-17.39", 0xa000, 0x2000, CRC(872270b3) SHA1(2298cb8ced6c3e9afb430faab1b38ba8f2fa93b5) )
- ROM_REGION( 0x0800, "cpu2", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a16-18.mcu", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x10000, "gfx1", ROMREGION_INVERT )
@@ -1578,7 +1544,7 @@ ROM_START( rumba )
ROM_LOAD( "a23_09.bin", 0x2000, 0x2000, CRC(d0a101d3) SHA1(c92bb1ce67bec394fd8ce303d9e61eac12493b5d) )
ROM_LOAD( "a23_10.bin", 0x4000, 0x2000, CRC(f9447bd4) SHA1(68c02249ca0e5b923cddb4bff8d090963b9c78e4) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a23-11.mc68705p5s", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x8000, "gfx1", ROMREGION_INVERT )
diff --git a/src/mame/drivers/gkigt.cpp b/src/mame/drivers/gkigt.cpp
index 9ea66279d0c..451b249cb1c 100644
--- a/src/mame/drivers/gkigt.cpp
+++ b/src/mame/drivers/gkigt.cpp
@@ -86,6 +86,7 @@ More chips (from eBay auction):
#include "emu.h"
#include "cpu/i960/i960.h"
#include "sound/ymz280b.h"
+#include "machine/nvram.h"
class igt_gameking_state : public driver_device
{
@@ -191,7 +192,9 @@ static ADDRESS_MAP_START( igt_gameking_mem, AS_PROGRAM, 32, igt_gameking_state )
AM_RANGE(0x00000000, 0x0007ffff) AM_ROM
AM_RANGE(0x08000000, 0x081fffff) AM_ROM AM_REGION("game", 0)
- AM_RANGE(0x10000000, 0x10ffffff) AM_RAM
+ // it's unclear how much of this is saved and how much total RAM there is.
+ AM_RANGE(0x10000000, 0x1001ffff) AM_RAM AM_SHARE("nvram")
+ AM_RANGE(0x10020000, 0x100fffff) AM_RAM
AM_RANGE(0x18000000, 0x181fffff) AM_RAM // igtsc writes from 18000000 to 1817ffff, ms3 all the way to 181fffff.
@@ -255,6 +258,7 @@ static MACHINE_CONFIG_START( igt_gameking, igt_gameking_state )
MCFG_SOUND_ADD("ymz", YMZ280B, XTAL_16_9344MHz) // enhanced sound on optional Media-Lite sub board
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_NVRAM_ADD_1FILL("nvram")
MACHINE_CONFIG_END
ROM_START( ms3 )
@@ -275,6 +279,9 @@ ROM_START( ms3 )
ROM_REGION( 0x200000, "snd", 0 )
ROM_LOAD( "1h5053xx.u6", 0x000000, 0x080000, CRC(6735c65a) SHA1(198cacec5441aa615c0de63a0b4e47265636bcee) )
+
+ ROM_REGION( 0x20000, "nvram", 0 )
+ ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(acbbc6d9) SHA1(6e86d24ad3793b41f1f23f80f9bdb22767abc3bf) )
ROM_END
ROM_START( ms72c )
@@ -295,6 +302,9 @@ ROM_START( ms72c )
ROM_REGION( 0x200000, "snd", 0 )
ROM_LOAD( "1H5008FA Multistar 7.u6", 0x000000, 0x100000, CRC(69656637) SHA1(28c2cf48856ee4f820146fdbd0f3c7e307892dc6) )
+
+ ROM_REGION( 0x20000, "nvram", 0 )
+ ROM_LOAD( "nvram", 0x000000, 0x020000, CRC(b5e42dbc) SHA1(f6afadb6877bca2cef40725b001c7918f9c99359) )
ROM_END
diff --git a/src/mame/drivers/gsword.cpp b/src/mame/drivers/gsword.cpp
index 7e7c2234c43..3232cf2eb29 100644
--- a/src/mame/drivers/gsword.cpp
+++ b/src/mame/drivers/gsword.cpp
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:Steve Ellenoff,Jarek Parchanski
+// copyright-holders:Steve Ellenoff,Jarek Parchanski,Vas Crabb
/*
Great Swordsman (Taito) 1984
Joshi Volleyball (Taito) 1983
@@ -9,9 +9,9 @@ TODO:
-joshi volleyball
-The incomplete graphic
-The implementation of DAC sound ?
- -MCU code DUMP and emulation
+ -MCU hookup is incomplete
-The true interrupt circuit of SUB CPU
- -unknown ROM (BANK ROM of sub-cpu ? )
+ -unknown ROM (BANK ROM of sub-cpu ?)
Credits:
- Steve Ellenoff: Original emulation and Mame driver
@@ -146,6 +146,7 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main :
#include "emu.h"
#include "includes/gsword.h"
+#include "cpu/mcs48/mcs48.h"
#include "cpu/z80/z80.h"
#include "machine/i8255.h"
#include "machine/tait8741.h"
@@ -166,20 +167,48 @@ int gsword_state::coins_in(void)
}
#endif
-#include "cpu/z80/z80.h"
+void gsword_state_base::machine_start()
+{
+ save_item(NAME(m_fake8910_0));
+ save_item(NAME(m_fake8910_1));
+}
+
+void gsword_state_base::machine_reset()
+{
+}
+
+WRITE8_MEMBER(gsword_state_base::ay8910_control_port_0_w)
+{
+ m_ay0->address_w(space,offset,data);
+ m_fake8910_0 = data;
+}
+WRITE8_MEMBER(gsword_state_base::ay8910_control_port_1_w)
+{
+ m_ay1->address_w(space,offset,data);
+ m_fake8910_1 = data;
+}
+
+READ8_MEMBER(gsword_state_base::fake_0_r)
+{
+ return m_fake8910_0+1;
+}
+READ8_MEMBER(gsword_state_base::fake_1_r)
+{
+ return m_fake8910_1+1;
+}
/* CPU 2 memory hack */
/* (402E) timeout upcount must be under 0AH */
/* (4004,4005) clear down counter , if (4004,4005)==0 then (402E)=0 */
-READ8_MEMBER(gsword_state::gsword_hack_r)
+READ8_MEMBER(gsword_state::hack_r)
{
- uint8_t data = m_cpu2_ram[offset + 4];
+ u8 const data = m_cpu2_ram[offset + 4];
/*if(offset==1)osd_printf_debug("CNT %02X%02X\n",m_cpu2_ram[5],m_cpu2_ram[4]); */
/* speedup timeout count down */
- if(m_protect_hack)
+ if (m_protect_hack)
{
switch(offset)
{
@@ -190,7 +219,55 @@ READ8_MEMBER(gsword_state::gsword_hack_r)
return data;
}
-READ8_MEMBER(gsword_state::gsword_8741_2_r )
+WRITE8_MEMBER(gsword_state::nmi_set_w)
+{
+/* osd_printf_debug("AY write %02X\n",data);*/
+
+ m_protect_hack = (data & 0x80) ? false : true;
+#if 0
+ /* An actual circuit isn't known. */
+ /* write ff,02,ff,fe, 17 x 0d,0f */
+ m_nmi_enable = ((data>>7) & (data&1) &1) == 0;
+
+
+#else
+ switch(data)
+ {
+ case 0xff:
+ m_nmi_enable = false; /* NMI must be disabled */
+ break;
+ case 0x02:
+ m_nmi_enable = false; /* ANY */
+ break;
+ case 0x0d:
+ m_nmi_enable = true;
+ break;
+ case 0x0f:
+ m_nmi_enable = true; /* NMI must be enabled */
+ break;
+ case 0xfe:
+ m_nmi_enable = true; /* NMI must be enabled */
+ break;
+ }
+ /* bit1= nmi disable , for ram check */
+ logerror("NMI control %02x\n",data);
+#endif
+}
+
+WRITE8_MEMBER(gsword_state::sound_command_w)
+{
+ m_soundlatch->write(space, 0, data);
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
+WRITE8_MEMBER(gsword_state::adpcm_data_w)
+{
+ m_msm->data_w(data & 0x0f); // bit 0..3
+ m_msm->reset_w(BIT(data, 5)); // bit 5
+ m_msm->vclk_w(BIT(data, 4)); // bit 4
+}
+
+READ8_MEMBER(gsword_state::i8741_2_r )
{
switch (offset)
{
@@ -207,7 +284,7 @@ READ8_MEMBER(gsword_state::gsword_8741_2_r )
return 0;
}
-READ8_MEMBER(gsword_state::gsword_8741_3_r )
+READ8_MEMBER(gsword_state::i8741_3_r )
{
switch (offset)
{
@@ -223,99 +300,166 @@ READ8_MEMBER(gsword_state::gsword_8741_3_r )
return 0;
}
+INTERRUPT_GEN_MEMBER(gsword_state::sound_interrupt)
+{
+ if (m_nmi_enable)
+ device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
+DRIVER_INIT_MEMBER(gsword_state, gsword)
+{
+#if 0
+ uint8_t *ROM2 = memregion("sub")->base();
+ ROM2[0x1da] = 0xc3; /* patch for rom self check */
+
+ ROM2[0x71e] = 0; /* patch for sound protection or time out function */
+ ROM2[0x71f] = 0;
+#endif
+#if 1
+ /* hack for sound protection or time out function */
+ m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::hack_r),this));
+#endif
+}
+
+DRIVER_INIT_MEMBER(gsword_state, gsword2)
+{
+#if 0
+ uint8_t *ROM2 = memregion("sub")->base();
+
+ ROM2[0x1da] = 0xc3; /* patch for rom self check */
+ ROM2[0x726] = 0; /* patch for sound protection or time out function */
+ ROM2[0x727] = 0;
+#endif
+#if 1
+ /* hack for sound protection or time out function */
+ m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::hack_r),this));
+#endif
+}
+
void gsword_state::machine_start()
{
- save_item(NAME(m_fake8910_0));
- save_item(NAME(m_fake8910_1));
- save_item(NAME(m_nmi_enable));
+ gsword_state_base::machine_start();
+
save_item(NAME(m_protect_hack));
+ save_item(NAME(m_nmi_enable));
}
void gsword_state::machine_reset()
{
- m_coins = 0;
+ gsword_state_base::machine_reset();
- /* snd CPU mask NMI during reset phase */
- m_nmi_enable = 0;
- m_protect_hack = 0;
+ m_protect_hack = false;
+ m_nmi_enable = false;
}
-INTERRUPT_GEN_MEMBER(gsword_state::gsword_snd_interrupt)
+
+READ8_MEMBER(josvolly_state::mcu1_p1_r)
{
- if(m_nmi_enable)
- device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ // the two MCUs appear to have port 1 tied together
+ return m_mcu1_p1 & m_mcu2_p1;
}
-WRITE8_MEMBER(gsword_state::nmi_set_w)
+READ8_MEMBER(josvolly_state::mcu1_p2_r)
{
-/* osd_printf_debug("AY write %02X\n",data);*/
+ // p27 needs to float high for the MCU to start in the right mode
+ // p20 and p21 drive the test inputs of the other MCU
+ // if DIPSW1:8 is allowed to pull p27 low, the game won't even boot to test mode
+ // DIPSW1:1 and DIPSW1:2 are shown in test mode, but switching them on will break comms
+ return 0x80U | ioport("DSW1")->read();
+}
- m_protect_hack = (data&0x80) ? 0 : 1;
-#if 0
- /* An actual circuit isn't known. */
- /* write ff,02,ff,fe, 17 x 0d,0f */
- m_nmi_enable = ((data>>7) & (data&1) &1) == 0;
+READ8_MEMBER(josvolly_state::mcu2_p1_r)
+{
+ // the two MCUs appear to have port 1 tied together
+ return m_mcu1_p1 & m_mcu2_p1;
+}
+READ8_MEMBER(josvolly_state::mcu2_p2_r)
+{
+ // p27 needs to be tied low for the MCU to start in the right mode
+ return 0x7fU & ioport("DSW2")->read();
+}
-#else
- switch(data)
- {
- case 0xff:
- m_nmi_enable = 0; /* NMI must be disabled */
- break;
- case 0x02:
- m_nmi_enable = 0; /* ANY */
- break;
- case 0x0d:
- m_nmi_enable = 1;
- break;
- case 0x0f:
- m_nmi_enable = 1; /* NMI must be enabled */
- break;
- case 0xfe:
- m_nmi_enable = 1; /* NMI must be enabled */
- break;
- }
- /* bit1= nmi disable , for ram check */
- logerror("NMI control %02x\n",data);
-#endif
+READ8_MEMBER(josvolly_state::mcu2_test_r)
+{
+ // TEST0 and TEST1 are driven by P20 and P21 on the other MCU
+ return BIT(m_mcu1_p2, offset);
}
-WRITE8_MEMBER(gsword_state::ay8910_control_port_0_w)
+WRITE8_MEMBER(josvolly_state::cpu2_nmi_enable_w)
{
- m_ay0->address_w(space,offset,data);
- m_fake8910_0 = data;
+ m_cpu2_nmi_enable = true;
+}
+
+WRITE8_MEMBER(josvolly_state::cpu2_irq_clear_w)
+{
+ m_audiocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
}
-WRITE8_MEMBER(gsword_state::ay8910_control_port_1_w)
+
+WRITE8_MEMBER(josvolly_state::mcu1_p1_w)
{
- m_ay1->address_w(space,offset,data);
- m_fake8910_1 = data;
+ if (data != m_mcu1_p1)
+ {
+ logerror("mcu1 p1 = 0x%02x\n", data);
+ m_mcu1_p1 = data;
+ }
}
-READ8_MEMBER(gsword_state::fake_0_r)
+WRITE8_MEMBER(josvolly_state::mcu1_p2_w)
{
- return m_fake8910_0+1;
+ if (data != m_mcu1_p2)
+ {
+ logerror("mcu1 p2 = 0x%02x\n", data);
+
+ // the second CPU somehow gets an NMI when data is available
+ // it's probably implemented by the logic arrays somehow
+ // this is just a hacky guess at how it works
+ if (m_cpu2_nmi_enable && (data & (data ^ m_mcu1_p2) & 0x01))
+ {
+ m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ m_cpu2_nmi_enable = false;
+ }
+
+ m_mcu1_p2 = data;
+ }
}
-READ8_MEMBER(gsword_state::fake_1_r)
+
+WRITE8_MEMBER(josvolly_state::mcu2_p1_w)
{
- return m_fake8910_1+1;
+ if (data != m_mcu2_p1)
+ {
+ logerror("mcu2 p1 = 0x%02x\n", data);
+ m_mcu2_p1 = data;
+ }
}
-WRITE8_MEMBER(gsword_state::gsword_adpcm_data_w)
+WRITE8_MEMBER(josvolly_state::mcu2_p2_w)
{
- m_msm->data_w (data & 0x0f); /* bit 0..3 */
- m_msm->reset_w(BIT(data, 5)); /* bit 5 */
- m_msm->vclk_w(BIT(data, 4)); /* bit 4 */
+ logerror("mcu2 p2 = 0x%02x\n", data);
}
-WRITE8_MEMBER(gsword_state::adpcm_soundcommand_w)
+void josvolly_state::machine_start()
{
- m_soundlatch->write(space, 0, data);
- m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+ gsword_state_base::machine_start();
+
+ save_item(NAME(m_cpu2_nmi_enable));
+ save_item(NAME(m_mcu1_p1));
+ save_item(NAME(m_mcu1_p2));
+ save_item(NAME(m_mcu2_p1));
+}
+
+void josvolly_state::machine_reset()
+{
+ gsword_state_base::machine_reset();
+
+ m_cpu2_nmi_enable = false;
+ m_mcu1_p1 = 0xffU;
+ m_mcu1_p2 = 0xffU;
+ m_mcu2_p1 = 0xffU;
}
-static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state )
+static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state_base )
AM_RANGE(0x0000, 0x8fff) AM_ROM
AM_RANGE(0x9000, 0x9fff) AM_RAM
AM_RANGE(0xa000, 0xa37f) AM_RAM
@@ -329,21 +473,16 @@ static ADDRESS_MAP_START( cpu1_map, AS_PROGRAM , 8, gsword_state )
AM_RANGE(0xb000, 0xb7ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
ADDRESS_MAP_END
+
static ADDRESS_MAP_START( cpu1_io_map, AS_IO, 8, gsword_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("taito8741", taito8741_4pack_device, read_0, write_0)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, gsword_state )
- ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_0, write_0)
-ADDRESS_MAP_END
-
-//
static ADDRESS_MAP_START( cpu2_map, AS_PROGRAM, 8, gsword_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram")
- AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w)
+ AM_RANGE(0x6000, 0x6000) AM_WRITE(sound_command_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state )
@@ -355,44 +494,58 @@ static ADDRESS_MAP_START( cpu2_io_map, AS_IO, 8, gsword_state )
AM_RANGE(0x61, 0x61) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w)
AM_RANGE(0x80, 0x80) AM_READWRITE(fake_1_r, ay8910_control_port_1_w)
AM_RANGE(0x81, 0x81) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w)
-//
+
AM_RANGE(0xe0, 0xe0) AM_READNOP /* ?? */
AM_RANGE(0xa0, 0xa0) AM_WRITENOP /* ?? */
- AM_RANGE(0xe0, 0xe0) AM_WRITENOP /* watch dog ?*/
+ AM_RANGE(0xe0, 0xe0) AM_WRITENOP /* watchdog? */
ADDRESS_MAP_END
-//
-
static ADDRESS_MAP_START( cpu3_map, AS_PROGRAM, 8, gsword_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
- AM_RANGE(0x8000, 0x8000) AM_WRITE(gsword_adpcm_data_w)
+ AM_RANGE(0x8000, 0x8000) AM_WRITE(adpcm_data_w)
AM_RANGE(0xa000, 0xa000) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, gsword_state )
+static ADDRESS_MAP_START( josvolly_cpu1_io_map, AS_IO, 8, josvolly_state )
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ AM_RANGE(0x7e, 0x7f) AM_DEVREADWRITE("mcu1", upi41_cpu_device, upi41_master_r, upi41_master_w)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, josvolly_state )
AM_RANGE(0x0000, 0x3fff) AM_ROM
AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram")
/* NEC D8255A with silkscreen removed and replaced with "AA 007" */
- AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("josvolly_aa_007", i8255_device, read, write)
+ AM_RANGE(0x8000, 0x8003) AM_DEVREADWRITE("aa_007", i8255_device, read, write)
// AM_RANGE(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w)
- AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_1, write_1)
+ AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("mcu2", upi41_cpu_device, upi41_master_r, upi41_master_w)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, gsword_state )
+static ADDRESS_MAP_START( josvolly_cpu2_io_map, AS_IO, 8, josvolly_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x00) AM_READWRITE(fake_0_r, ay8910_control_port_0_w)
AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("ay1", ay8910_device, data_r, data_w)
AM_RANGE(0x40, 0x40) AM_READWRITE(fake_1_r, ay8910_control_port_1_w)
AM_RANGE(0x41, 0x41) AM_DEVREADWRITE("ay2", ay8910_device, data_r, data_w)
- AM_RANGE(0x81, 0x81) AM_DEVWRITE("josvolly_8741", josvolly8741_4pack_device, nmi_enable_w)
- AM_RANGE(0xC1, 0xC1) AM_NOP // irq clear
+ AM_RANGE(0x81, 0x81) AM_WRITE(cpu2_nmi_enable_w);
+ AM_RANGE(0xC1, 0xC1) AM_WRITE(cpu2_irq_clear_w);
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( josvolly_mcu1_io_map, AS_IO, 8, josvolly_state )
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(mcu1_p1_r, mcu1_p1_w)
+ AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu1_p2_r, mcu1_p2_w)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( josvolly_mcu2_io_map, AS_IO, 8, josvolly_state )
+ AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(mcu2_p1_r, mcu2_p1_w)
+ AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu2_p2_r, mcu2_p2_w)
+ AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T1) AM_READ(mcu2_test_r)
ADDRESS_MAP_END
+
static INPUT_PORTS_START( gsword )
PORT_START("IN0") /* IN0 (8741-2 port1?) */
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_START1 )
@@ -539,44 +692,55 @@ static INPUT_PORTS_START( josvolly )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("DSW1") /* DSW1 */
- PORT_DIPNAME( 0x0c, 0x00, "DIP1-0c(982E)" )
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:1")
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:2")
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "982E" ) PORT_DIPLOCATION("DIPSW1:3,4")
PORT_DIPSETTING( 0x0c, "0" )
PORT_DIPSETTING( 0x08, "1" )
- PORT_DIPSETTING( 0x00, "2" )
- PORT_DIPSETTING( 0x0c, "3" )
- PORT_DIPNAME( 0x30, 0x00, "DIP1-30(982A)" )
- PORT_DIPSETTING( 0x30, "96H" )
- PORT_DIPSETTING( 0x20, "78H" )
- PORT_DIPSETTING( 0x10, "5AH" )
- PORT_DIPSETTING( 0x00, "3CH" )
- PORT_DIPNAME( 0x40, 0x40, "TEST_MODE" )
+ PORT_DIPSETTING( 0x04, "2" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPNAME( 0x30, 0x30, "982A" ) PORT_DIPLOCATION("DIPSW1:5,6")
+ PORT_DIPSETTING( 0x00, "60" )
+ PORT_DIPSETTING( 0x10, "90" )
+ PORT_DIPSETTING( 0x20, "120" )
+ PORT_DIPSETTING( 0x30, "150" )
+ PORT_DIPNAME( 0x40, 0x40, "TEST_MODE" ) PORT_DIPLOCATION("DIPSW1:7")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, "DIP1-80(982C)" )
- PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW1:8")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2") /* DSW2 */
-// PORT_DIPNAME( 0x01, 0x00, "DSW2-0" )
-// PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
-// PORT_DIPSETTING( 0x01, DEF_STR( On ) )
-// PORT_DIPNAME( 0x02, 0x00, "DSW2-1($9831)" )
-// PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
-// PORT_DIPSETTING( 0x02, DEF_STR( On ) )
- PORT_DIPNAME( 0x0C, 0x0C, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x01, 0x01, "982C" ) PORT_DIPLOCATION("DIPSW2:8")
+ PORT_DIPSETTING( 0x01, "0" )
+ PORT_DIPSETTING( 0x00, "1" )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("DIPSW2:7")
+ PORT_DIPSETTING( 0x02, DEF_STR( Upright ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("DIPSW2:6,5")
PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) )
PORT_DIPSETTING( 0x08, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x04, DEF_STR( 2C_1C ) )
- PORT_DIPSETTING( 0x0C, DEF_STR( 1C_1C ) )
- PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) )
+ PORT_DIPSETTING( 0x0c, DEF_STR( 1C_1C ) )
+ PORT_DIPNAME( 0x30, 0x30, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("DIPSW2:4,3")
PORT_DIPSETTING( 0x30, DEF_STR( 1C_1C ) )
PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0x20, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_5C ) )
-// PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
-// PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
+ PORT_DIPNAME( 0x40, 0x40, "9827" ) PORT_DIPLOCATION("DIPSW2:2")
+ PORT_DIPSETTING( 0x40, "1" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unused ) ) PORT_DIPLOCATION("DIPSW2:1")
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
INPUT_PORTS_END
+
static const gfx_layout gsword_text =
{
8,8, /* 8x8 characters */
@@ -636,7 +800,7 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_CPU_ADD("sub", Z80, XTAL_18MHz/6) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(cpu2_map)
MCFG_CPU_IO_MAP(cpu2_io_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, gsword_snd_interrupt, 4*60)
+ MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, sound_interrupt, 4*60)
MCFG_CPU_ADD("audiocpu", Z80, XTAL_18MHz/6) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(cpu3_map)
@@ -646,7 +810,7 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_TAITO8741_ADD("taito8741")
MCFG_TAITO8741_MODES(TAITO8741_MASTER,TAITO8741_SLAVE,TAITO8741_PORT,TAITO8741_PORT)
MCFG_TAITO8741_CONNECT(1,0,0,0)
- MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(gsword_state,gsword_8741_2_r),READ8(gsword_state,gsword_8741_3_r))
+ MCFG_TAITO8741_PORT_HANDLERS(IOPORT("DSW2"),IOPORT("DSW1"),READ8(gsword_state,i8741_2_r),READ8(gsword_state,i8741_3_r))
#if 1
/* to MCU timeout champbbj */
MCFG_QUANTUM_TIME(attotime::from_hz(6000))
@@ -683,27 +847,32 @@ static MACHINE_CONFIG_START( gsword, gsword_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( josvolly, gsword_state )
+static MACHINE_CONFIG_START( josvolly, josvolly_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", Z80, 18000000/6) /* ? */
+ MCFG_CPU_ADD("maincpu", Z80, 18000000/4) /* ? */
MCFG_CPU_PROGRAM_MAP(cpu1_map)
MCFG_CPU_IO_MAP(josvolly_cpu1_io_map)
- MCFG_CPU_PERIODIC_INT_DRIVER(gsword_state, irq0_line_hold, 2*60)
+ MCFG_CPU_PERIODIC_INT_DRIVER(josvolly_state, irq0_line_hold, 2*60)
MCFG_CPU_ADD("audiocpu", Z80, 12000000/4) /* ? */
MCFG_CPU_PROGRAM_MAP(josvolly_cpu2_map)
MCFG_CPU_IO_MAP(josvolly_cpu2_io_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", gsword_state, irq0_line_hold)
+ MCFG_CPU_VBLANK_INT_DRIVER("screen", josvolly_state, irq0_line_assert)
+
+ MCFG_DEVICE_ADD("mcu1", I8741, 18000000/2) /* ? */
+ MCFG_CPU_IO_MAP(josvolly_mcu1_io_map)
+
+ MCFG_DEVICE_ADD("mcu2", I8741, 12000000/2) /* ? */
+ MCFG_CPU_IO_MAP(josvolly_mcu2_io_map)
- MCFG_DEVICE_ADD("josvolly_aa_007", I8255, 0)
+ MCFG_DEVICE_ADD("aa_007", I8255, 0)
MCFG_I8255_IN_PORTA_CB(IOPORT("IN1")) // 1PL
- MCFG_I8255_IN_PORTB_CB(IOPORT("IN2")) // 2PL / ACK
+ MCFG_I8255_IN_PORTB_CB(IOPORT("IN2")) // 2PL / ACK
MCFG_I8255_IN_PORTC_CB(IOPORT("IN0")) // START
- MCFG_JOSVOLLY8741_ADD("josvolly_8741")
- MCFG_JOSVOLLY8741_CONNECT(1,0,0,0)
- MCFG_JOSVOLLY8741_PORT_HANDLERS(IOPORT("DSW1"),IOPORT("DSW2"),IOPORT("DSW1"),IOPORT("DSW2"))
+ // the second MCU polls the first MCU's outputs, so it needs tight sync
+ MCFG_QUANTUM_PERFECT_CPU("mcu2")
/* video hardware */
@@ -712,13 +881,13 @@ static MACHINE_CONFIG_START( josvolly, gsword_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
- MCFG_SCREEN_UPDATE_DRIVER(gsword_state, screen_update_gsword)
+ MCFG_SCREEN_UPDATE_DRIVER(josvolly_state, screen_update_gsword)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", gsword)
MCFG_PALETTE_ADD("palette", 64*4+64*4)
MCFG_PALETTE_INDIRECT_ENTRIES(256)
- MCFG_PALETTE_INIT_OWNER(gsword_state,josvolly)
+ MCFG_PALETTE_INIT_OWNER(josvolly_state, josvolly)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -727,7 +896,6 @@ static MACHINE_CONFIG_START( josvolly, gsword_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
MCFG_SOUND_ADD("ay2", AY8910, 1500000)
- MCFG_AY8910_PORT_A_WRITE_CB(WRITE8(gsword_state, nmi_set_w)) /* portA write */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
#if 0
@@ -851,11 +1019,12 @@ ROM_START( josvolly )
ROM_REGION( 0x04000, "user1", 0 ) /* music data and samples - not sure where it's mapped */
ROM_LOAD( "aa0-14.4j", 0x0000, 0x2000, CRC(436fe91f) SHA1(feb29501090c6db911e13ce6e9935ba004b0ce7e) )
- // there are other undumped chips on this, not sure how many
- // not hooked up yet
- ROM_REGION( 0x400, "mcu", 0 )
+ ROM_REGION( 0x400, "mcu1", 0 )
ROM_LOAD( "aa003.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) )
+ ROM_REGION( 0x400, "mcu2", 0 )
+ ROM_LOAD( "aa008.bin", 0x0000, 0x400, CRC(68b399d9) SHA1(053482d12c2b714c23fc80ad0589a2afd258a5a6) BAD_DUMP )
+
ROM_REGION( 0x4000, "gfx1", 0 )
ROM_LOAD( "aa0-10.9n", 0x0000, 0x2000, CRC(207c4f42) SHA1(4cf2922d55cfc9e68cc07c3252ea3b5619b8aca5) ) /* tiles */
ROM_LOAD( "aa1-11.9p", 0x2000, 0x1000, CRC(c130464a) SHA1(9d23577b8aaaffeefff3d8f93668d1b2bd0ba3d9) )
@@ -878,37 +1047,7 @@ ROM_START( josvolly )
ROM_LOAD( "005.3h", 0x0440, 0x0020, CRC(e8d6dec0) SHA1(d15cba9a4b24255d41046b15c2409391ab13ce95) ) /* address decoder? not used */
ROM_END
-DRIVER_INIT_MEMBER(gsword_state,gsword)
-{
-#if 0
- uint8_t *ROM2 = memregion("sub")->base();
- ROM2[0x1da] = 0xc3; /* patch for rom self check */
-
- ROM2[0x71e] = 0; /* patch for sound protection or time out function */
- ROM2[0x71f] = 0;
-#endif
-#if 1
- /* hack for sound protection or time out function */
- m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::gsword_hack_r),this));
-#endif
-}
-
-DRIVER_INIT_MEMBER(gsword_state,gsword2)
-{
-#if 0
- uint8_t *ROM2 = memregion("sub")->base();
-
- ROM2[0x1da] = 0xc3; /* patch for rom self check */
- ROM2[0x726] = 0; /* patch for sound protection or time out function */
- ROM2[0x727] = 0;
-#endif
-#if 1
- /* hack for sound protection or time out function */
- m_subcpu->space(AS_PROGRAM).install_read_handler(0x4004, 0x4005, read8_delegate(FUNC(gsword_state::gsword_hack_r),this));
-#endif
-}
-
-GAME( 1983, josvolly, 0, josvolly, josvolly, driver_device, 0, ROT90, "Allumer / Taito Corporation", "Joshi Volleyball", MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
+GAME( 1983, josvolly, 0, josvolly, josvolly, driver_device, 0, ROT90, "Allumer / Taito Corporation", "Joshi Volleyball", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1984, gsword, 0, gsword, gsword, gsword_state, gsword, ROT0, "Allumer / Taito Corporation", "Great Swordsman (World?)", MACHINE_SUPPORTS_SAVE )
GAME( 1984, gsword2, gsword, gsword, gsword, gsword_state, gsword2, ROT0, "Allumer / Taito Corporation", "Great Swordsman (Japan?)", MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/harddriv.cpp b/src/mame/drivers/harddriv.cpp
index 815cf4f2032..76a0c668f9b 100644
--- a/src/mame/drivers/harddriv.cpp
+++ b/src/mame/drivers/harddriv.cpp
@@ -461,7 +461,8 @@ harddriv_state::harddriv_state(const machine_config &mconfig, const char *tag, d
m_sound_int_state(0),
m_video_int_state(0),
m_palette(*this, "palette"),
- m_slapstic_device(*this, "slapstic")
+ m_slapstic_device(*this, "slapstic"),
+ m_rs232(*this, "rs232")
{
int i;
@@ -1445,6 +1446,10 @@ static MACHINE_CONFIG_FRAGMENT( driver_nomsp )
MCFG_MC68681_ADD("duartn68681", XTAL_3_6864MHz)
MCFG_MC68681_IRQ_CALLBACK(WRITELINE(harddriv_state, harddriv_duart_irq_handler))
+ MCFG_MC68681_A_TX_CALLBACK(DEVWRITELINE ("rs232", rs232_port_device, write_txd))
+
+ MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, nullptr)
+ MCFG_RS232_RXD_HANDLER(DEVWRITELINE ("duartn68681", mc68681_device, rx_a_w))
/* video hardware */
MCFG_PALETTE_ADD("palette", 1024)
diff --git a/src/mame/drivers/lkage.cpp b/src/mame/drivers/lkage.cpp
index d8d6a58e181..948f66c048b 100644
--- a/src/mame/drivers/lkage.cpp
+++ b/src/mame/drivers/lkage.cpp
@@ -139,7 +139,6 @@ static ADDRESS_MAP_START( lkage_map, AS_PROGRAM, 8, lkage_state )
AM_RANGE(0xf000, 0xf003) AM_RAM AM_SHARE("vreg") /* video registers */
AM_RANGE(0xf060, 0xf060) AM_WRITE(lkage_sound_command_w)
AM_RANGE(0xf061, 0xf061) AM_WRITENOP AM_READ(sound_status_r)
- AM_RANGE(0xf062, 0xf062) AM_READWRITE(lkage_mcu_r,lkage_mcu_w)
AM_RANGE(0xf063, 0xf063) AM_WRITENOP /* pulsed; nmi on sound cpu? */
AM_RANGE(0xf080, 0xf080) AM_READ_PORT("DSW1")
AM_RANGE(0xf081, 0xf081) AM_READ_PORT("DSW2")
@@ -147,7 +146,6 @@ static ADDRESS_MAP_START( lkage_map, AS_PROGRAM, 8, lkage_state )
AM_RANGE(0xf083, 0xf083) AM_READ_PORT("SYSTEM")
AM_RANGE(0xf084, 0xf084) AM_READ_PORT("P1")
AM_RANGE(0xf086, 0xf086) AM_READ_PORT("P2")
- AM_RANGE(0xf087, 0xf087) AM_READ(lkage_mcu_status_r)
AM_RANGE(0xf0a0, 0xf0a3) AM_RAM /* unknown */
AM_RANGE(0xf0c0, 0xf0c5) AM_RAM AM_SHARE("scroll")
AM_RANGE(0xf0e1, 0xf0e1) AM_WRITENOP /* pulsed */
@@ -156,6 +154,18 @@ static ADDRESS_MAP_START( lkage_map, AS_PROGRAM, 8, lkage_state )
AM_RANGE(0xf400, 0xffff) AM_RAM_WRITE(lkage_videoram_w) AM_SHARE("videoram")
ADDRESS_MAP_END
+static ADDRESS_MAP_START( lkage_map_mcu, AS_PROGRAM, 8, lkage_state )
+ AM_IMPORT_FROM(lkage_map)
+ AM_RANGE(0xf062, 0xf062) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_RANGE(0xf087, 0xf087) AM_DEVREAD("bmcu", taito68705_mcu_device, mcu_status_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( lkage_map_boot, AS_PROGRAM, 8, lkage_state )
+ AM_IMPORT_FROM(lkage_map)
+ AM_RANGE(0xf062, 0xf062) AM_READWRITE(fake_mcu_r,fake_mcu_w)
+ AM_RANGE(0xf087, 0xf087) AM_READ(fake_status_r)
+ADDRESS_MAP_END
+
READ8_MEMBER(lkage_state::port_fetch_r)
{
@@ -166,17 +176,6 @@ static ADDRESS_MAP_START( lkage_io_map, AS_IO, 8, lkage_state )
AM_RANGE(0x4000, 0x7fff) AM_READ(port_fetch_r)
ADDRESS_MAP_END
-static ADDRESS_MAP_START( lkage_m68705_map, AS_PROGRAM, 8, lkage_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(lkage_68705_port_a_r,lkage_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(lkage_68705_port_b_r,lkage_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_READWRITE(lkage_68705_port_c_r,lkage_68705_port_c_w)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(lkage_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(lkage_68705_ddr_b_w)
- AM_RANGE(0x0006, 0x0006) AM_WRITE(lkage_68705_ddr_c_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
/***************************************************************************/
@@ -489,20 +488,6 @@ void lkage_state::machine_start()
save_item(NAME(m_mcu_val));
save_item(NAME(m_sound_nmi_enable));
save_item(NAME(m_pending_nmi));
-
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_port_c_in));
- save_item(NAME(m_port_c_out));
- save_item(NAME(m_ddr_c));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
}
void lkage_state::machine_reset()
@@ -514,26 +499,13 @@ void lkage_state::machine_reset()
m_sound_nmi_enable = 0;
m_pending_nmi = 0;
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_port_c_in = 0;
- m_port_c_out = 0;
- m_ddr_c = 0;
- m_mcu_sent = 0;
- m_main_sent = 0;
- m_from_main = 0;
- m_from_mcu = 0;
}
static MACHINE_CONFIG_START( lkage, lkage_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CPU_CLOCK)
- MCFG_CPU_PROGRAM_MAP(lkage_map)
+ MCFG_CPU_PROGRAM_MAP(lkage_map_mcu)
MCFG_CPU_IO_MAP(lkage_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", lkage_state, irq0_line_hold)
@@ -541,8 +513,7 @@ static MACHINE_CONFIG_START( lkage, lkage_state )
MCFG_CPU_PROGRAM_MAP(lkage_sound_map)
/* IRQs are triggered by the YM2203 */
- MCFG_CPU_ADD("mcu", M68705,MCU_CLOCK)
- MCFG_CPU_PROGRAM_MAP(lkage_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU,MCU_CLOCK)
/* video hardware */
@@ -583,7 +554,7 @@ static MACHINE_CONFIG_START( lkageb, lkage_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,MAIN_CPU_CLOCK)
- MCFG_CPU_PROGRAM_MAP(lkage_map)
+ MCFG_CPU_PROGRAM_MAP(lkage_map_boot)
MCFG_CPU_IO_MAP(lkage_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", lkage_state, irq0_line_hold)
@@ -633,7 +604,7 @@ ROM_START( lkage )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound CPU) */
ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
- ROM_REGION( 0x10000, "mcu", 0 ) /* 68705 MCU code */
+ ROM_REGION( 0x10000, "bmcu:mcu", 0 ) /* 68705 MCU code */
ROM_LOAD( "a54-09.53", 0x0000, 0x0800, CRC(0e8b8846) SHA1(a4a105462b0127229bb7edfadd2e581c7e40f1cc) )
ROM_REGION( 0x4000, "user1", 0 ) /* data */
@@ -663,7 +634,7 @@ ROM_START( lkageo )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound CPU) */
ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
- ROM_REGION( 0x10000, "mcu", 0 ) /* 68705 MCU code */
+ ROM_REGION( 0x10000, "bmcu:mcu", 0 ) /* 68705 MCU code */
ROM_LOAD( "a54-09.53", 0x0000, 0x0800, CRC(0e8b8846) SHA1(a4a105462b0127229bb7edfadd2e581c7e40f1cc) )
ROM_REGION( 0x4000, "user1", 0 ) /* data */
@@ -693,7 +664,7 @@ ROM_START( lkageoo )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound CPU) */
ROM_LOAD( "a54-04.54", 0x0000, 0x8000, CRC(541faf9a) SHA1(b142ff3bd198f700697ec06ea92db3109ab5818e) )
- ROM_REGION( 0x10000, "mcu", 0 ) /* 68705 MCU code */
+ ROM_REGION( 0x10000, "bmcu:mcu", 0 ) /* 68705 MCU code */
ROM_LOAD( "a54-09.53", 0x0000, 0x0800, CRC(0e8b8846) SHA1(a4a105462b0127229bb7edfadd2e581c7e40f1cc) )
ROM_REGION( 0x4000, "user1", 0 ) /* data */
@@ -876,7 +847,7 @@ ROM_START( bygone )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Z80 code (sound CPU) */
ROM_LOAD( "a53_07.ic54", 0x0000, 0x8000, CRC(72f69a77) SHA1(dfc1050a4123b3c83ae733ece1b6fe2836beb901) )
- ROM_REGION( 0x10000, "mcu", 0 ) /* 68705 MCU code */
+ ROM_REGION( 0x10000, "bmcu:mcu", 0 ) /* 68705 MCU code */
ROM_LOAD( "a51_09.ic53", 0x0000, 0x0800, CRC(0e8b8846) SHA1(a4a105462b0127229bb7edfadd2e581c7e40f1cc) ) /* the same as lkage */
ROM_REGION( 0x4000, "user1", 0 ) /* data */
@@ -945,13 +916,6 @@ DRIVER_INIT_MEMBER(lkage_state,lkage)
m_sprite_dx=0;
}
-DRIVER_INIT_MEMBER(lkage_state,lkageb)
-{
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xf062, 0xf062, read8_delegate(FUNC(lkage_state::fake_mcu_r),this));
- m_maincpu->space(AS_PROGRAM).install_read_handler(0xf087, 0xf087, read8_delegate(FUNC(lkage_state::fake_status_r),this));
- m_maincpu->space(AS_PROGRAM).install_write_handler(0xf062, 0xf062, write8_delegate(FUNC(lkage_state::fake_mcu_w),this));
- m_sprite_dx=0;
-}
DRIVER_INIT_MEMBER(lkage_state,bygone)
{
@@ -961,7 +925,7 @@ DRIVER_INIT_MEMBER(lkage_state,bygone)
GAME( 1984, lkage, 0, lkage, lkage, lkage_state, lkage, ROT0, "Taito Corporation", "The Legend of Kage", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1984, lkageo, lkage, lkage, lkage, lkage_state, lkage, ROT0, "Taito Corporation", "The Legend of Kage (older)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1984, lkageoo, lkage, lkage, lkage, lkage_state, lkage, ROT0, "Taito Corporation", "The Legend of Kage (oldest)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1984, lkageb, lkage, lkageb, lkageb, lkage_state, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1984, lkageb2, lkage, lkageb, lkageb, lkage_state, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
-GAME( 1984, lkageb3, lkage, lkageb, lkageb, lkage_state, lkageb, ROT0, "bootleg", "The Legend of Kage (bootleg set 3)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1984, lkageb, lkage, lkageb, lkageb, lkage_state, lkage, ROT0, "bootleg", "The Legend of Kage (bootleg set 1)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1984, lkageb2, lkage, lkageb, lkageb, lkage_state, lkage, ROT0, "bootleg", "The Legend of Kage (bootleg set 2)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
+GAME( 1984, lkageb3, lkage, lkageb, lkageb, lkage_state, lkage, ROT0, "bootleg", "The Legend of Kage (bootleg set 3)", MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
GAME( 1985, bygone, 0, lkage, bygone, lkage_state, bygone, ROT0, "Taito Corporation", "Bygone (prototype)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE )
diff --git a/src/mame/drivers/lsasquad.cpp b/src/mame/drivers/lsasquad.cpp
index 3bcdbb13a74..dd661a45ea5 100644
--- a/src/mame/drivers/lsasquad.cpp
+++ b/src/mame/drivers/lsasquad.cpp
@@ -185,7 +185,7 @@ static ADDRESS_MAP_START( lsasquad_map, AS_PROGRAM, 8, lsasquad_state )
AM_RANGE(0xea00, 0xea00) AM_WRITE(lsasquad_bankswitch_w)
AM_RANGE(0xec00, 0xec00) AM_READWRITE(lsasquad_sound_result_r,lsasquad_sound_command_w)
AM_RANGE(0xec01, 0xec01) AM_READ(lsasquad_sound_status_r)
- AM_RANGE(0xee00, 0xee00) AM_READWRITE(lsasquad_mcu_r,lsasquad_mcu_w)
+ AM_RANGE(0xee00, 0xee00) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( lsasquad_sound_map, AS_PROGRAM, 8, lsasquad_state )
@@ -200,16 +200,6 @@ static ADDRESS_MAP_START( lsasquad_sound_map, AS_PROGRAM, 8, lsasquad_state )
AM_RANGE(0xe000, 0xefff) AM_ROM /* space for diagnostic ROM? */
ADDRESS_MAP_END
-static ADDRESS_MAP_START( lsasquad_m68705_map, AS_PROGRAM, 8, lsasquad_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(lsasquad_68705_port_a_r,lsasquad_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(lsasquad_68705_port_b_r,lsasquad_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_READ(lsasquad_mcu_status_r)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(lsasquad_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(lsasquad_68705_ddr_b_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
static ADDRESS_MAP_START( storming_map, AS_PROGRAM, 8, lsasquad_state )
@@ -392,7 +382,7 @@ static ADDRESS_MAP_START( daikaiju_map, AS_PROGRAM, 8, lsasquad_state )
AM_RANGE(0xea00, 0xea00) AM_WRITE(lsasquad_bankswitch_w)
AM_RANGE(0xec00, 0xec00) AM_WRITE(lsasquad_sound_command_w)
AM_RANGE(0xec01, 0xec01) AM_READ(lsasquad_sound_status_r)
- AM_RANGE(0xee00, 0xee00) AM_READWRITE(lsasquad_mcu_r, lsasquad_mcu_w)
+ AM_RANGE(0xee00, 0xee00) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( daikaiju_sound_map, AS_PROGRAM, 8, lsasquad_state )
@@ -549,16 +539,6 @@ MACHINE_START_MEMBER(lsasquad_state,lsasquad)
membank("bank1")->configure_entries(0, 8, &ROM[0x10000], 0x2000);
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
save_item(NAME(m_sound_pending));
save_item(NAME(m_sound_nmi_enable));
@@ -574,17 +554,6 @@ MACHINE_RESET_MEMBER(lsasquad_state,lsasquad)
m_pending_nmi = 0;
m_sound_cmd = 0;
m_sound_result = 0;
-
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_mcu_sent = 0;
- m_main_sent = 0;
- m_from_main = 0;
- m_from_mcu = 0;
}
/* Note: lsasquad clock values are not verified */
@@ -598,8 +567,8 @@ static MACHINE_CONFIG_START( lsasquad, lsasquad_state )
MCFG_CPU_ADD("audiocpu", Z80, MASTER_CLOCK / 8)
MCFG_CPU_PROGRAM_MAP(lsasquad_sound_map)
/* IRQs are triggered by the YM2203 */
- MCFG_CPU_ADD("mcu", M68705, MASTER_CLOCK / 8)
- MCFG_CPU_PROGRAM_MAP(lsasquad_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MASTER_CLOCK / 8)
+
MCFG_QUANTUM_TIME(attotime::from_hz(30000)) /* 500 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */
@@ -641,7 +610,7 @@ static MACHINE_CONFIG_DERIVED( storming, lsasquad )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(storming_map)
- MCFG_DEVICE_REMOVE("mcu")
+ MCFG_DEVICE_REMOVE("bmcu")
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( daikaiju, lsasquad_state )
@@ -655,8 +624,7 @@ static MACHINE_CONFIG_START( daikaiju, lsasquad_state )
MCFG_CPU_PROGRAM_MAP(daikaiju_sound_map)
/* IRQs are triggered by the YM2203 */
- MCFG_CPU_ADD("mcu", M68705, MASTER_CLOCK / 8)
- MCFG_CPU_PROGRAM_MAP(lsasquad_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU, MASTER_CLOCK / 8)
MCFG_QUANTUM_TIME(attotime::from_hz(30000)) /* 500 CPU slices per frame - an high value to ensure proper */
/* synchronization of the CPUs */
@@ -710,7 +678,7 @@ ROM_START( lsasquad )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */
ROM_LOAD( "a64-04.44", 0x0000, 0x8000, CRC(c238406a) SHA1(bb8f9d952c4568edb375328a1f9f6681a1bb5907) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a64-05.35", 0x0000, 0x0800, CRC(572677b9) SHA1(e098d5d842bcc81221ba56652a7019505d8be082) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -787,7 +755,7 @@ ROM_START( daikaiju )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* 64k for the second CPU */
ROM_LOAD( "a74_04.ic44", 0x0000, 0x8000, CRC(98a6a703) SHA1(0c169a7a5f8b26606f67ee7f14bd487951536ac5) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a74_05.ic35", 0x0000, 0x0800, CRC(d66df06f) SHA1(6a61eb15aef7f3b7a66ec9d87c0bdd731d6cb079) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
diff --git a/src/mame/drivers/mzr8105.cpp b/src/mame/drivers/mzr8105.cpp
index 129146b6e7e..539dab9d4f3 100644
--- a/src/mame/drivers/mzr8105.cpp
+++ b/src/mame/drivers/mzr8105.cpp
@@ -3,7 +3,7 @@
#include "emu.h"
#include "includes/mzr8105.h"
-#include "bus/vme/mzr8300.h"
+#include "bus/vme/vme_mzr8300.h"
#include "cpu/m68000/m68000.h"
#include "machine/clock.h"
diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp
index b64cbe946d6..5184630ca12 100644
--- a/src/mame/drivers/namcos2.cpp
+++ b/src/mame/drivers/namcos2.cpp
@@ -597,10 +597,9 @@ static ADDRESS_MAP_START( namcos2_68k_default_cpu_board_am, AS_PROGRAM, 16, namc
AM_RANGE(0x400000, 0x41ffff) AM_READWRITE(c123_tilemap_videoram_r,c123_tilemap_videoram_w)
AM_RANGE(0x420000, 0x42003f) AM_READWRITE(c123_tilemap_control_r,c123_tilemap_control_w)
AM_RANGE(0x440000, 0x44ffff) AM_READWRITE(paletteram_word_r,paletteram_word_w) AM_SHARE("paletteram")
- AM_RANGE(0x460000, 0x460fff) AM_READWRITE(dpram_word_r,dpram_word_w)
- AM_RANGE(0x468000, 0x468fff) AM_READWRITE(dpram_word_r,dpram_word_w) /* mirror */
- AM_RANGE(0x480000, 0x483fff) AM_READWRITE(serial_comms_ram_r,serial_comms_ram_w) AM_SHARE("serialram")
- AM_RANGE(0x4a0000, 0x4a000f) AM_READWRITE(serial_comms_ctrl_r,serial_comms_ctrl_w)
+ AM_RANGE(0x460000, 0x460fff) AM_MIRROR(0xf000) AM_READWRITE(dpram_word_r,dpram_word_w)
+ AM_RANGE(0x480000, 0x483fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0x4a0000, 0x4a000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
/*************************************************************/
@@ -618,14 +617,14 @@ static ADDRESS_MAP_START( master_default_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAMBANK(NAMCOS2_68K_MASTER_RAM)
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_default_am )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_default_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAMBANK(NAMCOS2_68K_SLAVE_RAM)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_default_am )
ADDRESS_MAP_END
@@ -645,14 +644,14 @@ static ADDRESS_MAP_START( master_finallap_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAMBANK(NAMCOS2_68K_MASTER_RAM)
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_finallap_am )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_finallap_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAMBANK(NAMCOS2_68K_SLAVE_RAM)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_finallap_am )
ADDRESS_MAP_END
@@ -669,14 +668,14 @@ static ADDRESS_MAP_START( master_sgunner_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAMBANK(NAMCOS2_68K_MASTER_RAM)
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_sgunner_am )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_sgunner_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAMBANK(NAMCOS2_68K_SLAVE_RAM)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_sgunner_am )
ADDRESS_MAP_END
@@ -694,14 +693,14 @@ static ADDRESS_MAP_START( master_metlhawk_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAMBANK(NAMCOS2_68K_MASTER_RAM)
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_metlhawk_am )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_metlhawk_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAMBANK(NAMCOS2_68K_SLAVE_RAM)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_metlhawk_am )
ADDRESS_MAP_END
@@ -724,14 +723,14 @@ static ADDRESS_MAP_START( master_luckywld_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAMBANK(NAMCOS2_68K_MASTER_RAM)
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_luckywld_am )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_luckywld_am, AS_PROGRAM, 16, namcos2_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAMBANK(NAMCOS2_68K_SLAVE_RAM)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_luckywld_am )
ADDRESS_MAP_END
@@ -1680,14 +1679,45 @@ via software as INT1
/* */
/*************************************************************/
+static MACHINE_CONFIG_START( configure_c148_standard, namcos2_state )
+ MCFG_NAMCO_C148_ADD("master_intc","maincpu",true)
+ namco_c148_device::link_c148_device(*device,"slave_intc");
+ MCFG_NAMCO_C148_EXT1_CB(WRITE8(namcos2_state, sound_reset_w))
+ MCFG_NAMCO_C148_EXT2_CB(WRITE8(namcos2_state, system_reset_w))
+
+ MCFG_NAMCO_C148_ADD("slave_intc","slave",false)
+ namco_c148_device::link_c148_device(*device,"master_intc");
+
+MACHINE_CONFIG_END
+
+// TODO: temp
+TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline)
+{
+ int scanline = param;
+ int cur_posirq = get_pos_irq_scanline();
+
+ if(scanline == 240)
+ {
+ m_master_intc->vblank_irq_trigger();
+ m_slave_intc->vblank_irq_trigger();
+ }
+
+ if(scanline == cur_posirq)
+ {
+ m_master_intc->pos_irq_trigger();
+ m_slave_intc->pos_irq_trigger();
+ // TODO: wrong place!
+ m_screen->update_partial(param);
+ }
+}
+
static MACHINE_CONFIG_START( default, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_default_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_default_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1704,6 +1734,9 @@ static MACHINE_CONFIG_START( default, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -1758,11 +1791,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( gollygho, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_default_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_default_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1779,6 +1811,9 @@ static MACHINE_CONFIG_START( gollygho, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -1806,11 +1841,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( finallap, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_finallap_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_finallap_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1827,6 +1861,9 @@ static MACHINE_CONFIG_START( finallap, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -1859,11 +1896,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( sgunner, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_sgunner_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_sgunner_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1880,6 +1916,9 @@ static MACHINE_CONFIG_START( sgunner, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -1909,11 +1948,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( sgunner2, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_sgunner_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_sgunner_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1935,6 +1973,9 @@ static MACHINE_CONFIG_START( sgunner2, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -1964,11 +2005,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( luckywld, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_luckywld_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_luckywld_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
@@ -1985,6 +2025,9 @@ static MACHINE_CONFIG_START( luckywld, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -2017,16 +2060,15 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( metlhawk, namcos2_state )
MCFG_CPU_ADD("maincpu", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(master_metlhawk_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos2_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000, M68K_CPU_CLOCK) /* 12.288MHz (49.152MHz OSC/4) */
MCFG_CPU_PROGRAM_MAP(slave_metlhawk_am)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos2_shared_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809, M68B09_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - Sound handling */
MCFG_CPU_PROGRAM_MAP(sound_default_am)
- MCFG_CPU_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60)
- MCFG_CPU_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120)
+ //MCFG_CPU_PERIODIC_INT_DRIVER(namcos2_shared_state, irq0_line_hold, 2*60)
+ //MCFG_CPU_PERIODIC_INT_DRIVER(namcos2_shared_state, irq1_line_hold, 120)
MCFG_CPU_ADD("mcu", HD63705, C65_CPU_CLOCK) /* 2.048MHz (49.152MHz OSC/24) - I/O handling */
MCFG_CPU_PROGRAM_MAP(mcu_default_am)
@@ -2038,6 +2080,9 @@ static MACHINE_CONFIG_START( metlhawk, namcos2_state )
MCFG_MACHINE_RESET_OVERRIDE(namcos2_state,namcos2)
MCFG_NVRAM_ADD_1FILL("nvram")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) )
MCFG_SCREEN_SIZE(384, 264)
@@ -2060,6 +2105,7 @@ static MACHINE_CONFIG_START( metlhawk, namcos2_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MCFG_YM2151_ADD("ymsnd", YM2151_SOUND_CLOCK) /* 3.579545MHz */
+ MCFG_YM2151_IRQ_HANDLER(INPUTLINE("audiocpu", 1))
MCFG_SOUND_ROUTE(0, "lspeaker", 0.80)
MCFG_SOUND_ROUTE(1, "rspeaker", 0.80)
MACHINE_CONFIG_END
@@ -5687,11 +5733,11 @@ DRIVER_INIT_MEMBER(namcos2_state,luckywld)
/* and metal hawk have the B version and dragon saber has the C version */
/* YEAR, NAME, PARENT, MACHINE, INPUT, STATE, INIT, MONITOR, COMPANY, FULLNAME */
-GAMEL(1987, finallap, 0, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev E)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1987, finallapd, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev D)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1987, finallapc, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1987, finallapjc, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Japan, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1987, finallapjb, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
+GAMEL(1987, finallap, 0, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev E)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1987, finallapd, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev D)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1987, finallapc, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1987, finallapjc, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Japan, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1987, finallapjb, finallap, finallap, finallap, namcos2_state, finallap, ROT0, "Namco", "Final Lap (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
GAME( 1988, assault, 0, default2, assault, namcos2_state, assault, ROT90, "Namco", "Assault (Rev B)", 0 )
GAME( 1988, assaultj, assault, default2, assault, namcos2_state, assaultj, ROT90, "Namco", "Assault (Japan)", 0 )
@@ -5708,9 +5754,9 @@ GAME( 1988, mirninja, 0, default, default, namcos2_state, mirninja, R
GAME( 1988, phelios, 0, default2, default, namcos2_state, phelios, ROT90, "Namco", "Phelios", 0)
GAME( 1988, pheliosj, phelios, default2, default, namcos2_state, phelios, ROT90, "Namco", "Phelios (Japan)", 0)
-GAME( 1989, dirtfoxj, 0, default2, dirtfox, namcos2_state, dirtfoxj, ROT90, "Namco", "Dirt Fox (Japan)", 0 )
+GAME( 1989, dirtfoxj, 0, default2, dirtfox, namcos2_state, dirtfoxj, ROT90, "Namco", "Dirt Fox (Japan)", MACHINE_NODEVICE_LAN )
-GAMEL(1989, fourtrax, 0, finallap, fourtrax, namcos2_state, fourtrax, ROT0, "Namco", "Four Trax", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
+GAMEL(1989, fourtrax, 0, finallap, fourtrax, namcos2_state, fourtrax, ROT0, "Namco", "Four Trax", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
GAME( 1989, valkyrie, 0, default3, default, namcos2_state, valkyrie, ROT90, "Namco", "Valkyrie No Densetsu (Japan)", 0 )
@@ -5729,8 +5775,8 @@ GAME( 1990, dsaber, 0, default3, default, namcos2_state, dsaber, R
GAME( 1990, dsabera, dsaber, default3, default, namcos2_state, dsaber, ROT90, "Namco", "Dragon Saber (World, older?)", 0 )
GAME( 1990, dsaberj, dsaber, default3, default, namcos2_state, dsaberj, ROT90, "Namco", "Dragon Saber (Japan, Rev B)", 0 )
-GAMEL(1990, finalap2, 0, finallap, finallap, namcos2_state, finalap2, ROT0, "Namco", "Final Lap 2", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1990, finalap2j, finalap2, finallap, finallap, namcos2_state, finalap2, ROT0, "Namco", "Final Lap 2 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
+GAMEL(1990, finalap2, 0, finallap, finallap, namcos2_state, finalap2, ROT0, "Namco", "Final Lap 2", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1990, finalap2j, finalap2, finallap, finallap, namcos2_state, finalap2, ROT0, "Namco", "Final Lap 2 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
GAME( 1990, gollygho, 0, gollygho, gollygho, namcos2_state, gollygho, ROT180, "Namco", "Golly! Ghost!", MACHINE_REQUIRES_ARTWORK )
@@ -5749,24 +5795,24 @@ GAME( 1991, cosmogngj, cosmogng, default, default, namcos2_state, cosmogng, R
GAME( 1992, bubbletr, 0, gollygho, bubbletr, namcos2_state, bubbletr, ROT180, "Namco", "Bubble Trouble (World, Rev B)", MACHINE_REQUIRES_ARTWORK )
GAME( 1992, bubbletrj, bubbletr, gollygho, bubbletr, namcos2_state, bubbletr, ROT180, "Namco", "Bubble Trouble (Japan, Rev C)", MACHINE_REQUIRES_ARTWORK )
-GAMEL(1992, finalap3, 0, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (World, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1992, finalap3a, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (World, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1992, finalap3j, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1992, finalap3jc, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (Japan - Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
-GAMEL(1992, finalap3bl, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND, layout_finallap )
+GAMEL(1992, finalap3, 0, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (World, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1992, finalap3a, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (World, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1992, finalap3j, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1992, finalap3jc, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (Japan - Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
+GAMEL(1992, finalap3bl, finalap3, finallap, finalap3, namcos2_state, finalap3, ROT0, "Namco", "Final Lap 3 (bootleg)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN, layout_finallap )
GAME( 1992, luckywld, 0, luckywld, luckywld, namcos2_state, luckywld, ROT0, "Namco", "Lucky & Wild", 0 )
GAME( 1992, luckywldj, luckywld, luckywld, luckywld, namcos2_state, luckywld, ROT0, "Namco", "Lucky & Wild (Japan)", 0 )
-GAME( 1992, suzuka8h, 0, luckywld, suzuka, namcos2_state, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1992, suzuka8hj, suzuka8h, luckywld, suzuka, namcos2_state, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1992, suzuka8h, 0, luckywld, suzuka, namcos2_state, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (World, Rev C)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN )
+GAME( 1992, suzuka8hj, suzuka8h, luckywld, suzuka, namcos2_state, suzuka8h, ROT0, "Namco", "Suzuka 8 Hours (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN )
GAME( 1992, sws, 0, default, default, namcos2_state, sws, ROT0, "Namco", "Super World Stadium (Japan)", 0 )
GAME( 1992, sws92, 0, default, default, namcos2_state, sws92, ROT0, "Namco", "Super World Stadium '92 (Japan)", 0 )
GAME( 1992, sws92g, sws92, default, default, namcos2_state, sws92g, ROT0, "Namco", "Super World Stadium '92 Gekitouban (Japan)", 0 )
-GAME( 1993, suzuk8h2, 0, luckywld, suzuka, namcos2_state, suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (World, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
-GAME( 1993, suzuk8h2j, suzuk8h2, luckywld, suzuka, namcos2_state, suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND )
+GAME( 1993, suzuk8h2, 0, luckywld, suzuka, namcos2_state, suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (World, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN )
+GAME( 1993, suzuk8h2j, suzuk8h2, luckywld, suzuka, namcos2_state, suzuk8h2, ROT0, "Namco", "Suzuka 8 Hours 2 (Japan, Rev B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_NODEVICE_LAN )
GAME( 1993, sws93, 0, default, default, namcos2_state, sws93, ROT0, "Namco", "Super World Stadium '93 (Japan)", 0 )
diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp
index f04b1cd8ba1..1e99e5b9ee3 100644
--- a/src/mame/drivers/namcos21.cpp
+++ b/src/mame/drivers/namcos21.cpp
@@ -67,7 +67,7 @@ STATUS:
- posirq handling broken
Driver's Eyes
- crashes
+ Left and Right screen
TODO: (*) Extract DSP BIOS
@@ -805,6 +805,7 @@ WRITE16_MEMBER(namcos21_state::dspram16_w)
int namcos21_state::init_dsp()
{
+ // TODO: what actually tests this?
uint16_t *pMem = (uint16_t *)memregion("dspmaster")->base();
/**
* DSP BIOS tests "CPU ID" on startup
@@ -1226,12 +1227,6 @@ WRITE8_MEMBER(namcos21_state::namcos2_dualportram_byte_w)
}
/******************************************************************************/
-WRITE16_MEMBER(namcos21_state::NAMCO_C139_SCI_buffer_w){}
-READ16_MEMBER(namcos21_state::NAMCO_C139_SCI_buffer_r){ return 0; }
-
-WRITE16_MEMBER(namcos21_state::NAMCO_C139_SCI_register_w){}
-READ16_MEMBER(namcos21_state::NAMCO_C139_SCI_register_r){ return 0; }
-/******************************************************************************/
/*************************************************************/
/* MASTER 68000 CPU Memory declarations */
@@ -1252,8 +1247,8 @@ static ADDRESS_MAP_START( common_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x8fffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_READWRITE(NAMCO_C139_SCI_buffer_r,NAMCO_C139_SCI_buffer_w)
- AM_RANGE(0xb80000, 0xb8000f) AM_READWRITE(NAMCO_C139_SCI_register_r,NAMCO_C139_SCI_register_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
AM_RANGE(0xc00000, 0xcfffff) AM_ROM AM_MIRROR(0x100000) AM_REGION("edata", 0)
ADDRESS_MAP_END
@@ -1261,14 +1256,14 @@ static ADDRESS_MAP_START( master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* private work RAM */
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_map )
ADDRESS_MAP_END
static ADDRESS_MAP_START( slave_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAM /* private work RAM */
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( common_map )
ADDRESS_MAP_END
@@ -1469,7 +1464,7 @@ static ADDRESS_MAP_START( winrun_master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* work RAM */
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_RANGE(0x250000, 0x25ffff) AM_RAM AM_SHARE("winrun_polydata")
AM_RANGE(0x260000, 0x26ffff) AM_RAM /* unused? */
AM_RANGE(0x280000, 0x281fff) AM_WRITE(winrun_dspbios_w) AM_SHARE("winrun_dspbios")
@@ -1481,34 +1476,35 @@ static ADDRESS_MAP_START( winrun_master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x87ffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_READWRITE(NAMCO_C139_SCI_buffer_r,NAMCO_C139_SCI_buffer_w)
- AM_RANGE(0xb80000, 0xb8000f) AM_READWRITE(NAMCO_C139_SCI_register_r,NAMCO_C139_SCI_register_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START( winrun_slave_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x13ffff) AM_RAM
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_RANGE(0x600000, 0x60ffff) AM_RAM AM_SHARE("gpu_comram")
AM_RANGE(0x800000, 0x87ffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_READWRITE(NAMCO_C139_SCI_buffer_r,NAMCO_C139_SCI_buffer_w)
- AM_RANGE(0xb80000, 0xb8000f) AM_READWRITE(NAMCO_C139_SCI_register_r,NAMCO_C139_SCI_register_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
+
static ADDRESS_MAP_START( winrun_gpu_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x07ffff) AM_ROM
AM_RANGE(0x100000, 0x100001) AM_READWRITE(winrun_gpu_color_r,winrun_gpu_color_w) /* ? */
AM_RANGE(0x180000, 0x19ffff) AM_RAM /* work RAM */
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos21_68k_gpu_C148_r,namcos21_68k_gpu_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("gpu_intc", namco_c148_device, map)
AM_RANGE(0x200000, 0x20ffff) AM_RAM AM_SHARE("gpu_comram")
AM_RANGE(0x400000, 0x40ffff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x410000, 0x41ffff) AM_RAM_DEVWRITE("palette", palette_device, write_ext) AM_SHARE("palette_ext")
AM_RANGE(0x600000, 0x6fffff) AM_ROM AM_REGION("gdata", 0)
AM_RANGE(0xc00000, 0xcfffff) AM_READWRITE(winrun_gpu_videoram_r,winrun_gpu_videoram_w)
AM_RANGE(0xd00000, 0xd0000f) AM_READWRITE(winrun_gpu_register_r,winrun_gpu_register_w)
-// AM_RANGE(0xe0000c, 0xe0000d) POSIRQ
+ AM_RANGE(0xe0000c, 0xe0000d) AM_DEVREADWRITE8("gpu_intc", namco_c148_device, ext_posirq_line_r,ext_posirq_line_w,0x00ff)
ADDRESS_MAP_END
@@ -1572,15 +1568,15 @@ static ADDRESS_MAP_START( driveyes_common_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x800000, 0x8fffff) AM_ROM AM_REGION("data", 0)
AM_RANGE(0x900000, 0x90ffff) AM_RAM AM_SHARE("sharedram")
AM_RANGE(0xa00000, 0xa00fff) AM_READWRITE(namcos2_68k_dualportram_word_r,namcos2_68k_dualportram_word_w)
- AM_RANGE(0xb00000, 0xb03fff) AM_READWRITE(NAMCO_C139_SCI_buffer_r,NAMCO_C139_SCI_buffer_w)
- AM_RANGE(0xb80000, 0xb8000f) AM_READWRITE(NAMCO_C139_SCI_register_r,NAMCO_C139_SCI_register_w)
+ AM_RANGE(0xb00000, 0xb03fff) AM_DEVREADWRITE("sci", namco_c139_device, ram_r, ram_w)
+ AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map)
ADDRESS_MAP_END
static ADDRESS_MAP_START( driveyes_master_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* private work RAM */
AM_RANGE(0x180000, 0x183fff) AM_READWRITE8(namcos2_68k_eeprom_r,namcos2_68k_eeprom_w,0x00ff)
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_master_C148_r,namcos2_68k_master_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("master_intc", namco_c148_device, map)
AM_RANGE(0x250000, 0x25ffff) AM_RAM AM_SHARE("winrun_polydata")
AM_RANGE(0x280000, 0x281fff) AM_WRITE(winrun_dspbios_w) AM_SHARE("winrun_dspbios")
AM_RANGE(0x380000, 0x38000f) AM_READWRITE(winrun_dspcomram_control_r,winrun_dspcomram_control_w)
@@ -1593,7 +1589,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( driveyes_slave_map, AS_PROGRAM, 16, namcos21_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x100000, 0x10ffff) AM_RAM /* private work RAM */
- AM_RANGE(0x1c0000, 0x1fffff) AM_READWRITE(namcos2_68k_slave_C148_r,namcos2_68k_slave_C148_w)
+ AM_RANGE(0x1c0000, 0x1fffff) AM_DEVICE("slave_intc", namco_c148_device, map)
AM_IMPORT_FROM( driveyes_common_map )
ADDRESS_MAP_END
@@ -1851,15 +1847,44 @@ MACHINE_START_MEMBER(namcos21_state,namcos21)
namcos2_kickstart = namcos21_kickstart;
}
+TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline)
+{
+ int scanline = param;
+// int cur_posirq = get_posirq_scanline()*2;
+
+ if(scanline == 240*2)
+ {
+ m_master_intc->vblank_irq_trigger();
+ m_slave_intc->vblank_irq_trigger();
+ if(m_gpu_intc)
+ m_gpu_intc->vblank_irq_trigger();
+ }
+
+ if(m_gpu_intc != nullptr)
+ {
+ if(scanline == (0xff-m_gpu_intc->get_posirq_line())*2)
+ m_gpu_intc->pos_irq_trigger();
+ }
+}
+
+static MACHINE_CONFIG_START( configure_c148_standard, namcos21_state )
+ MCFG_NAMCO_C148_ADD("master_intc","maincpu",true)
+ namco_c148_device::link_c148_device(*device,"slave_intc");
+ MCFG_NAMCO_C148_EXT1_CB(WRITE8(namcos21_state, sound_reset_w))
+ MCFG_NAMCO_C148_EXT2_CB(WRITE8(namcos21_state, system_reset_w))
+
+ MCFG_NAMCO_C148_ADD("slave_intc","slave",false)
+ namco_c148_device::link_c148_device(*device,"master_intc");
+
+MACHINE_CONFIG_END
static MACHINE_CONFIG_START( namcos21, namcos21_state )
MCFG_CPU_ADD("maincpu", M68000,12288000) /* Master */
MCFG_CPU_PROGRAM_MAP(master_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000,12288000) /* Slave */
MCFG_CPU_PROGRAM_MAP(slave_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809,3072000) /* Sound */
MCFG_CPU_PROGRAM_MAP(sound_map)
@@ -1898,6 +1923,9 @@ static MACHINE_CONFIG_START( namcos21, namcos21_state )
MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_namcos21)
MCFG_SCREEN_PALETTE("palette")
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_GFXDECODE_ADD("gfxdecode", "palette", namcos21)
MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS)
MCFG_PALETTE_FORMAT(XBRG)
@@ -1920,11 +1948,10 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_START( driveyes, namcos21_state )
MCFG_CPU_ADD("maincpu", M68000,12288000) /* Master */
MCFG_CPU_PROGRAM_MAP(driveyes_master_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000,12288000) /* Slave */
MCFG_CPU_PROGRAM_MAP(driveyes_slave_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809,3072000) /* Sound */
MCFG_CPU_PROGRAM_MAP(sound_map)
@@ -1952,6 +1979,9 @@ static MACHINE_CONFIG_START( driveyes, namcos21_state )
MCFG_DEVICE_ADD("gearbox", NAMCOIO_GEARBOX, 0)
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C139_ADD("sci")
+
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS_NAMCO480I
MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_driveyes)
@@ -1975,15 +2005,13 @@ static MACHINE_CONFIG_START( driveyes, namcos21_state )
MCFG_SOUND_ROUTE(1, "rspeaker", 0.30)
MACHINE_CONFIG_END
-
static MACHINE_CONFIG_START( winrun, namcos21_state )
MCFG_CPU_ADD("maincpu", M68000,12288000) /* Master */
MCFG_CPU_PROGRAM_MAP(winrun_master_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_master_vblank)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, screen_scanline, "screen", 0, 1)
MCFG_CPU_ADD("slave", M68000,12288000) /* Slave */
MCFG_CPU_PROGRAM_MAP(winrun_slave_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_slave_vblank)
MCFG_CPU_ADD("audiocpu", M6809,3072000) /* Sound */
MCFG_CPU_PROGRAM_MAP(sound_map)
@@ -2005,7 +2033,10 @@ static MACHINE_CONFIG_START( winrun, namcos21_state )
MCFG_CPU_ADD("gpu", M68000,12288000) /* graphics coprocessor */
MCFG_CPU_PROGRAM_MAP(winrun_gpu_map)
- MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_gpu_vblank)
+
+ MCFG_FRAGMENT_ADD(configure_c148_standard)
+ MCFG_NAMCO_C148_ADD("gpu_intc","gpu",false)
+ MCFG_NAMCO_C139_ADD("sci")
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
@@ -2726,13 +2757,13 @@ DRIVER_INIT_MEMBER(namcos21_state,driveyes)
/* YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR, COMPANY, FULLNAME, FLAGS */
GAME( 1988, winrun, 0, winrun, winrun, namcos21_state, winrun, ROT0, "Namco", "Winning Run", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, winrun, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, winrun, ROT0, "Namco", "Winning Run '91 (Japan)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1991, driveyes, 0, driveyes, driveyes, namcos21_state, driveyes, ROT0, "Namco", "Driver's Eyes (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, winrun, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
+GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, winrun, ROT0, "Namco", "Winning Run '91 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
+GAME( 1991, driveyes, 0, driveyes, driveyes, namcos21_state, driveyes, ROT0, "Namco", "Driver's Eyes (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN)
GAME( 1991, solvalou, 0, namcos21, s21default, namcos21_state, solvalou, ROT0, "Namco", "Solvalou (Japan)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1991, starblad, 0, namcos21, s21default, namcos21_state, starblad, ROT0, "Namco", "Starblade (World)", MACHINE_IMPERFECT_GRAPHICS )
GAME( 1991, starbladj, starblad, namcos21, s21default, namcos21_state, starblad, ROT0, "Namco", "Starblade (Japan)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1992, aircomb, 0, namcos21, aircomb, namcos21_state, aircomb, ROT0, "Namco", "Air Combat (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1992, aircomb, 0, namcos21, aircomb, namcos21_state, aircomb, ROT0, "Namco", "Air Combat (US)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // There's code for a SCI, is it even possible to play multiplayer?
GAME( 1992, aircombj, aircomb, namcos21, aircomb, namcos21_state, aircomb, ROT0, "Namco", "Air Combat (Japan)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1993, cybsled, 0, namcos21, cybsled, namcos21_state, cybsled, ROT0, "Namco", "Cyber Sled (World)", MACHINE_IMPERFECT_GRAPHICS )
-GAME( 1993, cybsledj, cybsled, namcos21, cybsled, namcos21_state, cybsled, ROT0, "Namco", "Cyber Sled (Japan)", MACHINE_IMPERFECT_GRAPHICS )
+GAME( 1993, cybsled, 0, namcos21, cybsled, namcos21_state, cybsled, ROT0, "Namco", "Cyber Sled (World)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
+GAME( 1993, cybsledj, cybsled, namcos21, cybsled, namcos21_state, cybsled, ROT0, "Namco", "Cyber Sled (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
diff --git a/src/mame/drivers/nycaptor.cpp b/src/mame/drivers/nycaptor.cpp
index eaff02007c6..e05984c5a80 100644
--- a/src/mame/drivers/nycaptor.cpp
+++ b/src/mame/drivers/nycaptor.cpp
@@ -311,7 +311,7 @@ static ADDRESS_MAP_START( nycaptor_master_map, AS_PROGRAM, 8, nycaptor_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1")
AM_RANGE(0xc000, 0xc7ff) AM_RAM_WRITE(nycaptor_videoram_w) AM_SHARE("videoram")
- AM_RANGE(0xd000, 0xd000) AM_READWRITE(nycaptor_mcu_r, nycaptor_mcu_w)
+ AM_RANGE(0xd000, 0xd000) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
AM_RANGE(0xd001, 0xd001) AM_WRITE(sub_cpu_halt_w)
AM_RANGE(0xd002, 0xd002) AM_READWRITE(nycaptor_generic_control_r, nycaptor_generic_control_w) /* bit 3 - memory bank at 0x8000-0xbfff */
AM_RANGE(0xd400, 0xd400) AM_READWRITE(from_snd_r, sound_command_w)
@@ -368,18 +368,6 @@ static ADDRESS_MAP_START( nycaptor_sound_map, AS_PROGRAM, 8, nycaptor_state )
AM_RANGE(0xe000, 0xefff) AM_NOP
ADDRESS_MAP_END
-static ADDRESS_MAP_START( nycaptor_m68705_map, AS_PROGRAM, 8, nycaptor_state )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_READWRITE(nycaptor_68705_port_a_r, nycaptor_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_READWRITE(nycaptor_68705_port_b_r, nycaptor_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_READWRITE(nycaptor_68705_port_c_r, nycaptor_68705_port_c_w)
- AM_RANGE(0x0004, 0x0004) AM_WRITE(nycaptor_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_WRITE(nycaptor_68705_ddr_b_w)
- AM_RANGE(0x0006, 0x0006) AM_WRITE(nycaptor_68705_ddr_c_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
-
/* Cycle Shooting */
@@ -755,19 +743,7 @@ void nycaptor_state::machine_start()
save_item(NAME(m_palette_bank));
save_item(NAME(m_gfxctrl));
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_port_c_in));
- save_item(NAME(m_port_c_out));
- save_item(NAME(m_ddr_c));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
+
}
void nycaptor_state::machine_reset()
@@ -783,19 +759,6 @@ void nycaptor_state::machine_reset()
m_palette_bank = 0;
m_gfxctrl = 0;
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_port_c_in = 0;
- m_port_c_out = 0;
- m_ddr_c = 0;
- m_mcu_sent = 0;
- m_main_sent = 0;
- m_from_main = 0;
- m_from_mcu = 0;
memset(m_vol_ctrl, 0, sizeof(m_vol_ctrl));
}
@@ -815,8 +778,7 @@ static MACHINE_CONFIG_START( nycaptor, nycaptor_state )
MCFG_CPU_PROGRAM_MAP(nycaptor_sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(nycaptor_state, irq0_line_hold, 2*60) /* IRQ generated by ??? */
- MCFG_CPU_ADD("mcu", M68705,2000000)
- MCFG_CPU_PROGRAM_MAP(nycaptor_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU,2000000)
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame - an high value to ensure proper synchronization of the CPUs */
@@ -882,8 +844,7 @@ static MACHINE_CONFIG_START( cyclshtg, nycaptor_state )
MCFG_CPU_PERIODIC_INT_DRIVER(nycaptor_state, irq0_line_hold, 2*60)
#ifdef USE_MCU
- MCFG_CPU_ADD("mcu", M68705,2000000)
- MCFG_CPU_PROGRAM_MAP(nycaptor_m68705_map)
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU,2000000)
#endif
MCFG_QUANTUM_TIME(attotime::from_hz(60))
@@ -1018,7 +979,7 @@ ROM_START( nycaptor )
ROM_LOAD( "a50_15", 0x0000, 0x4000, CRC(f8a604e5) SHA1(8fae920fd09584b5e5ccd0db8b8934b393a23d50) )
ROM_LOAD( "a50_16", 0x4000, 0x4000, CRC(fc24e11d) SHA1(ce1a1d7b809fa0f5f5e7a462047374b1b3f621c6) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a50_17", 0x0000, 0x0800, CRC(69fe08dc) SHA1(9bdac3e835f63bbb8806892169d89f43d447df21) )
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
@@ -1048,7 +1009,7 @@ ROM_START( cyclshtg )
ROM_LOAD( "a80_16.i26", 0x0000, 0x4000, CRC(ce171a48) SHA1(e5ae9bb22f58c8857737bc6f5317866819a4e4d1) )
ROM_LOAD( "a80_17.i25", 0x4000, 0x4000, CRC(a90b7bbc) SHA1(bd5c96861a59a1f84bb5032775b1c70efdb7066f) )
- ROM_REGION( 0x0800, "cpu3", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a80_18", 0x0000, 0x0800, NO_DUMP ) /* Missing */
ROM_REGION( 0x20000, "gfx1", ROMREGION_INVERT )
diff --git a/src/mame/drivers/osbexec.cpp b/src/mame/drivers/osbexec.cpp
index f2e4b8b3878..28d02a1b624 100644
--- a/src/mame/drivers/osbexec.cpp
+++ b/src/mame/drivers/osbexec.cpp
@@ -15,6 +15,7 @@
#include "machine/z80dart.h"
#include "machine/pit8253.h"
#include "machine/ram.h"
+#include "machine/input_merger.h"
#include "softlist.h"
#define MAIN_CLOCK 23961600
@@ -64,11 +65,9 @@ public:
/* PIA 0 (UD12) */
uint8_t m_pia0_porta;
uint8_t m_pia0_portb;
- int m_pia0_irq_state;
int m_pia0_cb2; /* 60/50 */
/* PIA 1 (UD8) */
- int m_pia1_irq_state;
/* Vblank counter ("RTC") */
uint8_t m_rtc;
@@ -99,13 +98,6 @@ public:
m_ram_c000 = m_vram_region->base();
}
- void update_irq_state()
- {
- if ( m_pia0_irq_state || m_pia1_irq_state )
- m_maincpu->set_input_line(0, ASSERT_LINE );
- else
- m_maincpu->set_input_line(0, CLEAR_LINE );
- }
DECLARE_WRITE8_MEMBER(osbexec_0000_w);
DECLARE_READ8_MEMBER(osbexec_c000_r);
DECLARE_WRITE8_MEMBER(osbexec_c000_w);
@@ -408,20 +400,6 @@ WRITE_LINE_MEMBER(osbexec_state::osbexec_pia0_cb2_w)
}
-WRITE_LINE_MEMBER(osbexec_state::osbexec_pia0_irq)
-{
- m_pia0_irq_state = state;
- update_irq_state();
-}
-
-
-WRITE_LINE_MEMBER(osbexec_state::osbexec_pia1_irq)
-{
- m_pia1_irq_state = state;
- update_irq_state();
-}
-
-
/*
* The Osborne Executive supports the following disc formats: (TODO: Verify)
* - Osborne single density: 40 tracks, 10 sectors per track, 256-byte sectors (100 KByte)
@@ -514,6 +492,9 @@ void osbexec_state::machine_reset()
m_video_timer->adjust( machine().first_screen()->time_until_pos( 0, 0 ) );
m_rtc = 0;
+
+ // D0 cleared on interrupt acknowledge cycle by a few TTL gates
+ m_maincpu->set_input_line_vector(0, 0xfe);
}
@@ -549,12 +530,15 @@ static MACHINE_CONFIG_START( osbexec, osbexec_state )
MCFG_PIA_WRITEPB_HANDLER(WRITE8(osbexec_state, osbexec_pia0_b_w))
MCFG_PIA_CA2_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_ca2_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_cb2_w))
- MCFG_PIA_IRQA_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_irq))
- MCFG_PIA_IRQB_HANDLER(WRITELINE(osbexec_state, osbexec_pia0_irq))
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in0_w))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in0_w))
MCFG_DEVICE_ADD("pia_1", PIA6821, 0)
- MCFG_PIA_IRQA_HANDLER(WRITELINE(osbexec_state, osbexec_pia1_irq))
- MCFG_PIA_IRQB_HANDLER(WRITELINE(osbexec_state, osbexec_pia1_irq))
+ MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in1_w))
+ MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("mainirq", input_merger_device, in1_w))
+
+ MCFG_INPUT_MERGER_ACTIVE_HIGH("mainirq")
+ MCFG_INPUT_MERGER_OUTPUT_HANDLER(INPUTLINE("maincpu", 0))
MCFG_Z80SIO2_ADD("sio", MAIN_CLOCK/6, 0, 0, 0, 0)
diff --git a/src/mame/drivers/pc.cpp b/src/mame/drivers/pc.cpp
index b0e4fcfa2c9..c89282b37da 100644
--- a/src/mame/drivers/pc.cpp
+++ b/src/mame/drivers/pc.cpp
@@ -19,12 +19,254 @@ Driver file for IBM PC, IBM PC XT, and related machines.
F0000-FDFFF NOP or ROM Basic + other Extensions
FE000-FFFFF ROM
+Data General One / DG-1
+=======================
+Links: http://www.1000bit.it/ad/bro/datageneral/DG-ONE-PersonalSystem.pdf , http://www.1000bit.it/ad/bro/datageneral/DG-ONE-Interduction-PR.pdf , http://www.oldcomputers.net/data-general-one.html , http://forums.bannister.org/ubbthreads.php?ubb=showflat&Number=30897&page=all
+Info: According to the discussion in the thread, the ROM we have is from the original version. Specs for later permutations can be found on oldcomputers.net
+Form Factor: Laptop
+CPU: 80C88 @ 4 MHz
+RAM: 128K - 256K - 384K - 512K internally
+Bus: no internal slots
+Video: On board, Text mode 80x25 with 8x8 or 8x10 characters, CGA
+Display: non-backlit LCD 640x256 pixels
+Mass storage: 1/2x Floppy 3.5" 720K
+On board Ports: Floppy, RTC, 1x RS232C + 1x RS232C/RS422 via 8251, speaker
+Options: ext. 5.25" Floppy, int. Bell 103A 300 Baud Modem, 8087 FPU
+Expansion: Expansion box, with 5 ISA slots and space for a 5.25" drive and a harddisk; specifically mentioned are the 5.25" drive, color graphics and memory expansion via ISA cards
+
+
+Bondwell BW230 (Pro28 series)
+=============
+Links: http://gallery.fdd5-25.net/details.php?image_id=3463&sessionid=1eaeb42abdf2758a020b16204a2a8e5a ; http://www.zonadepruebas.com/viewtopic.php?t=3696 ; ftp://ftp.whtech.com/emulators/mess/old/Complete%20MESS%20Geneve%20emulation/mess/sysinfo/bondwell.htm
+Info: Info is hard to come by. A BW230 is nowhere to be found, the links about the Pro28 series suggest an XT compatible built around a passive backplane and a slot CPU. This is confirmed by the old MESS info.
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz (MESS sysinfo: 3.75)/ 8 MHz
+RAM: 512K / 640K
+Bus: at least 2x ISA: 1) CPU, RAM, Floppy controller
+ 2) Graphics, Game, Parallel
+Video: Hercules/CGA
+Mass storage: 1x 5.25" 360K and 20/30MB Harddisk.
+
+
+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
+
+
+Commodore PC-10 III
+=============
+Links: http://dostalgie.de/downloads/pc10III-20III/PC10III_OM_COMMODORE_EN_DE.pdf ; ftp://ftp.zimmers.net/pub/cbm-pc/documents/PC-8088-Information.txt
+Info: PC10-III and PC20-III are the same machines - PC10 has two floppies, PC20 one floppy and one harddisk
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz / 7.16 MHz / 9.54 MHz
+RAM: 640K
+Bus: 3x ISA
+Video: On board: MDA/CGA/Hercules/Plantronics
+Mass storage: 1x Floppy 5.25" 360K and (PC10) another 360K or (PC20) 3.5" harddisk
+On board ports: Floppy, XT-IDE Harddisk, Mouse, serial, parallel, RTC, Speaker
+Options: 8087 FPU
+
+
+Zenith SuperSport
+=======================
+Links: http://www.focushacks.com/zenith/myzenith.html , http://retro-computing.blogspot.de/2006/08/zds-supersport-laptop.html , http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20Service%20Manual.pdf
+ http://www.minuszerodegrees.net/manuals/Zenith%20Data%20Systems/ZDS%20SupersPort%20-%20User%20and%20Technical%20Manual.pdf
+Info: ZWL-184 to distinguish it from the later 80286 based models
+Form Factor: Laptop
+CPU: 80C88 @ 4.77 MHz or 8 MHz
+RAM: 640 KB
+Bus: no internal slots
+Video: CGA
+Display: The second link has a picture of a working SuperSport. This shows the LCD display with a green background and blue text/graphics.
+Mass storage: 1x 3.5" 720K floppy and 1x720K floppy or 20MB harddisk
+On board ports: serial, parallel, ext. keyboard, ext. CGA video, ext. floppy
+Options: 2400 Baud Modem, 8087 FPU
+
+
+Siemens Sicomp PC16-05
+=======================
+Links: http://www.computerwoche.de/a/siemens-erweitert-pc-16-programm,1169752 , http://www.phantom.sannata.ru/museum/siemens_pc_16_05.shtml
+Info: Multitech PC/700 mainboard
+Form Factor: Desktop
+CPU: 8088 @ 4.77MHz / 8 MHz
+RAM: 640KB
+Bus: 6x ISA: 1) MDA/Hercules/CGA and parallel port
+ 2) Floppy, RTC and serial port
+ 3) (optional) MFM harddisk controller
+Video: MDA/Hercules, exchangable via ISA-slot
+Mass storage: 1x 5.25" 360K floppy and 1x 5.25" 360K floppy or MFM hard drive (10MB or 20MB)
+On board ports: parallel, serial, beeper
+Options: 8087 FPU
+
+
+NCR PC4i
+========
+Links: http://www.minuszerodegrees.net/manuals/NCR/NCR%20PC4i%20-%20Technical%20Reference%20Manual%20-%20January%201986.pdf
+Info: The earlier PC4 is not quite IBM compatible, the "i" in PC4i indicates full IBM compatibility.
+ The NCR Graphics card supports a special 640x400 video mode
+Form Factor: All-in-one desktop
+CPU: 8088 @ 4.77 MHz
+RAM: 256K, expandable to 640K
+Bus: 7x ISA: 1) (optional) RAM expansion board
+ 2) empty
+ 3) 32K Video/Graphics board (64K option)
+ 4) (optional) Alpha board
+ 5) empty
+ 6) (optional) MFM harddisk controller
+ 7) empty
+Video: K510: 4KB Alpha for internal monitor; K511: 32KB Graphics for internal monitor; K512: 32KB upgrade for K512; K140: 16KB Graphics for external monitor; K141: 4KB Alpha for external monitor
+Display: Mono or color CRT 640x400 pixel
+Mass storage: 1x 5.25" 360K floppy and 1x 5.25" 360K floppy or 10 MB harddisk
+On board ports: parallel, serial, speaker, floppy
+Options: 8087 FPU, K101 memory upgrade in 64K steps, 1.2MB floppy and controller board
+
+
+Olivetti M15
+============
+Links: http://www.1000bit.it/ad/bro/olivetti/olivettiM15.pdf , http://electrickery.xs4all.nl/comp/m15/ , http://electrickery.xs4all.nl/comp/m15/doc/M15_InstallationAndOperationsGuide.pdf
+ http://www.museotecnologicamente.it/olivetti-m-15-1987/ , http://www.museotecnologicamente.it/wp-content/uploads/M15_Depliant_inglese.pdf
+Info: The info brochure has a picture of a working M15. This shows the LCD display with a green background and blue text/graphics.
+Form Factor: Laptop
+CPU: 80C88 @ 4.77 MHz
+RAM: 256K / 512K
+Bus: no internal slots
+Video: 80x25 text mode, CGA
+Display: LCD
+Mass storage: 2x 3.5" 720K drives
+Ports: serial, parallel, ext. floppy, RTC
+Expansion: External 5.25" 360K floppy drive
+
+
IBM5550
=======
Information can be found at http://homepage3.nifty.com/ibm5550/index-e.html
It's a heavily modified IBM PC-XT machine, with a completely different
video HW too.
+
+Sharp PC-7000
+=============
+Links: http://oldcomputers.net/sharp-pc7000.html , http://curtamania.com/curta/database/brand/sharp/Sharp%20PC-7000/index.html , http://pcmuseum.de/pc7000.html
+Form Factor: Luggable
+CPU: 8086 @ 4.77 MHz or 7.37 MHz
+RAM: 320K / 704K
+Bus: no internal slots
+Video: 80x24 text, 600x200 pixel graphics
+Display: electroluminescent mono backlit (blue) LCD
+Mass storage: 2x 5.25" 360K floppies
+On board ports: serial, parallel
+Options: Modem, color video output
+
+
+Sanyo MBC-16
+============
+Links:
+Info: In the MBC-16 I had, the graphics card had a Sanyo sticker on it, so I assume that was the original graphics card for the machine.
+Form Factor: Desktop
+CPU: 8088 @ 8MHz
+RAM: 640KB
+Bus: 3x ISA: 1) ATI Graphics Solution SR https://sites.google.com/site/atiwonderseriesdatabase/
+Video: MDA/CGA/Plantronics
+Mass storage: 1 or 2 5.25" 360K floppies, MFM harddisk on hardcard or via seperate controller
+On board ports: serial, parallel, floppy
+
+
+Atari PC1
+=========
+Links: http://www.ataripc.net/pc1-8088/ ; http://krap.pl/mirrorz/atari/www.atari-computermuseum.de/pc.htm ; http://www.atari-computermuseum.de/pc1.htm
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz / 8 MHz
+RAM: 512K / 640KB
+Bus: ISA signals available on board, no slot
+Video: Hercules/CGA/EGA
+Mass storage: 1 5.25" 360K floppy
+On board ports: floppy, graphics, parallel, serial, mouse, external floppy
+Options: 8087 FPU
+Expansion: Up to two external floppy drives: PCF554, SF314 or SF354
+
+
+Atari PC2
+Links: http://www.binarydinosaurs.co.uk/Museum/atari/pc2.php ; http://www.ataripc.net/pc2-8088/ ; http://www.ataripc.net/components/
+Info: The Atari PC2 mainboard has only one ISA slot, but is expanded via a four slot riser card. BIOS is identical to later PC1 and PC3
+CPU: 8088 @ 4.77 MHz / 8 MHz
+RAM: 512K / 640KB
+Bus: 4x ISA
+Video: Hercules/CGA/EGA
+Mass storage: 1 5.25" 360K floppy and 1 5.25" 360K floppy or 20MB hard drive
+On board ports: floppy, graphics, parallel, serial, mouse
+Expansion: 8087 FPU
+
+Atari PC3
+=========
+Links: http://www.atari-computermuseum.de/pc1.htm , http://trelohra.blogspot.de/2015/06/atari-pc3.html , http://www.ataripc.net/pc3-8088/
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz or 8 MHz
+RAM: 640K
+Bus: 5x ISA: 1) Adaptec ACB-2072 RLL Controller Card
+Video: On-board MDA/CGA/Hercules/EGA
+Mass storage: 1x 5.25" 360K floppy + 30MB RLL harddisk
+On board ports: floppy, parallel, serial, mouse, speaker
+Options: 8087 FPU
+
+
+Eagle 1600
+==========
+Links: https://archive.org/details/bitsavers_eagleCompu00Brochure_9975235 , http://www.vcfed.org/forum/showthread.php?49510-Eagle-Computer-model-list , http://bitsavers.trailing-edge.com/pdf/eagleComputer/1600/1600_Series_Training_Notes.pdf
+Info: Eagle 1620 - 8086/128K, 2 Quad density floppy drives, 4 Expansion slots available, ~1983, Eagle 1630 - 8086/128K, 1 Quad density floppy drive, 10MB HD, 3 Expansion Slots available (Same as 1620 with hard drive), ~1983Eagle 1640 - 8086/512K, 1 Quad density floppy drive, 32MB HD, 3 Expansion Slots available, ~1984
+ The native floppy format is 780K, 2 sides, 80 tracks/side, 1024 bytes/sector, 5 sectors per track. Standard 360K disks can be read
+ Holding "T" and resetting starts a system diagnostics test
+Form Factor: Desktop
+CPU: 8086 @ 8 MHz
+RAM: 128K / 512K
+Bus: 8xISA: 1) SASI board, connects to a XEBEC Sl410 SASI => MFM bridge board
+ 2) Floppy controller
+ 3) empty
+ 4) Video/graphics controller board
+ 5) empty
+ 6) empty
+ 7) Serial board: 2x serial, one sync/async, one async only
+ 8) Parallel board
+Video: 80x25 text mode, 720x352 pixel graphics mode
+Mass storage: 1x 5.25" QD 780K floppy and 1x 5.25" QD 820K floppy or 10/30MB MFM harddisk
+Options: 8087 FPU, EagleNet File server, EightPort serial card, High Resolution color board and video, Video Cassette Adapter board for 80MB backup on video cassette
+
+VTech Laser Turbo XT
+=======================
+Links: http://minuszerodegrees.net/manuals.htm#VTech , http://minuszerodegrees.net/manuals/VTech/VTech%20-%20Laser%20Turbo%20XT%20-%20Brochure.pdf
+Form Factor: Desktop
+CPU: 8088 @ 4.77 MHz or 10 MHz
+RAM: 512K / 640K, additionally 512K or 1M EMS on board
+Bus: 8xISA: 1) Monochrome graphics/color graphics card
+ 2) Multi I/O Card (Floppy, 2x serial, parallel, game, RTC)
+ 3) (optional) hard disk controller
+Video: MDA/CGA/Hercules
+Mass storage: 2x 5.25" 360K floppies and 1 or 2 harddisks (20MB / 30MB / 40MB)
+On board ports: speaker
+Options: 8087 FPU
+
+VTech Laser XT/3
+=======================
+Links: http://minuszerodegrees.net/manuals.htm#VTech , http://th99.classic-computing.de/src/v/U-Z/52547.htm
+Form Factor: Desktop
+CPU: 8088 @ 4.77MHz or 10 MHz
+RAM: 512K / 640K, additionally 512K or 1M EMS on board
+Bus: 8x ISA: 1) Monochrome graphics/color graphics card http://th99.classic-computing.de/src/v/U-Z/52547.htm , alternatively an EGA card
+ 2) Multi I/O Card (Floppy, 2x serial, 1x parallel, game, RTC) http://th99.classic-computing.de/src/i/U-Z/52519.htm
+ 3) (optional) hard disk controller
+Video: MDA/Hercules/CGA
+Mass storage: 2x 5.25" 360K or 1x 5.25" 360K and 1x 3.5" 720K, additional harddisk optional
+On board ports: speaker
+Options: 8087 FPU
+
***************************************************************************/
@@ -141,22 +383,11 @@ static INPUT_PORTS_START( pccga )
PORT_BIT( 0x01, 0x01, IPT_UNUSED )
INPUT_PORTS_END
-static INPUT_PORTS_START( bondwell )
- PORT_INCLUDE(pccga)
-
- PORT_MODIFY("DSW2") /* IN3 */
- PORT_DIPNAME( 0x02, 0x02, "Turbo Switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pc_state, pc_turbo_callback, 0)
- PORT_DIPSETTING( 0x00, "Off (4.77 MHz)" )
- PORT_DIPSETTING( 0x02, "On (12 MHz)" )
-INPUT_PORTS_END
static DEVICE_INPUT_DEFAULTS_START( pccga )
DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20)
DEVICE_INPUT_DEFAULTS_END
-static DEVICE_INPUT_DEFAULTS_START( siemens )
- DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x30)
-DEVICE_INPUT_DEFAULTS_END
#define MCFG_CPU_PC(mem, port, type, clock) \
MCFG_CPU_ADD("maincpu", type, clock) \
@@ -164,6 +395,7 @@ DEVICE_INPUT_DEFAULTS_END
MCFG_CPU_IO_MAP(port##_io) \
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mb:pic8259", pic8259_device, inta_cb)
+
static MACHINE_CONFIG_START( pccga, pc_state )
/* basic machine hardware */
MCFG_CPU_PC(pc8, pc8, I8088, 4772720) /* 4,77 MHz */
@@ -175,6 +407,7 @@ static MACHINE_CONFIG_START( pccga, pc_state )
MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "lpt", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, "com", false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false)
/* keyboard */
MCFG_PC_KBDC_SLOT_ADD("mb:pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_IBM_PC_XT_83)
@@ -187,6 +420,46 @@ static MACHINE_CONFIG_START( pccga, pc_state )
MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( cfg_dual_720K )
+ MCFG_DEVICE_MODIFY("fdc:0")
+ MCFG_SLOT_DEFAULT_OPTION("35dd")
+ MCFG_DEVICE_MODIFY("fdc:1")
+ MCFG_SLOT_DEFAULT_OPTION("35dd")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_FRAGMENT( cfg_single_360K )
+ MCFG_DEVICE_MODIFY("fdc:0")
+ MCFG_SLOT_DEFAULT_OPTION("525dd")
+ MCFG_SLOT_FIXED(true)
+ MCFG_DEVICE_REMOVE("fdc:1")
+MACHINE_CONFIG_END
+
+
+//Data General One
+static MACHINE_CONFIG_DERIVED( dgone, pccga )
+ MCFG_DEVICE_MODIFY("isa2")
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
+MACHINE_CONFIG_END
+
+
+// Bondwell BW230
+static INPUT_PORTS_START( bondwell )
+ PORT_INCLUDE(pccga)
+
+ PORT_MODIFY("DSW2") /* IN3 */
+ PORT_DIPNAME( 0x02, 0x02, "Turbo Switch" ) PORT_CHANGED_MEMBER(DEVICE_SELF, pc_state, pc_turbo_callback, 0)
+ PORT_DIPSETTING( 0x00, "Off (4.77 MHz)" )
+ PORT_DIPSETTING( 0x02, "On (12 MHz)" )
+INPUT_PORTS_END
+
+static MACHINE_CONFIG_DERIVED(bondwell, pccga)
+ MCFG_DEVICE_REMOVE("maincpu")
+ MCFG_CPU_PC(pc8, pc8, I8088, 4772720) // turbo?
+MACHINE_CONFIG_END
+
+
+// Schetmash Iskra-3104
static DEVICE_INPUT_DEFAULTS_START( iskr3104 )
DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x00)
DEVICE_INPUT_DEFAULTS_END
@@ -214,6 +487,7 @@ static MACHINE_CONFIG_START( iskr3104, pc_state )
MACHINE_CONFIG_END
+//Poisk-2
static MACHINE_CONFIG_START( poisk2, pc_state )
/* basic machine hardware */
MCFG_CPU_PC(pc16, pc16, I8086, 4772720)
@@ -234,6 +508,15 @@ static MACHINE_CONFIG_START( poisk2, pc_state )
MCFG_RAM_EXTRA_OPTIONS("64K, 128K, 256K, 512K")
MACHINE_CONFIG_END
+
+//MK-88
+static MACHINE_CONFIG_DERIVED(mk88, poisk2)
+ MCFG_DEVICE_MODIFY("isa1")
+ MCFG_SLOT_DEFAULT_OPTION("cga_ec1841")
+MACHINE_CONFIG_END
+
+
+// Zenith SuperSport
static MACHINE_CONFIG_START( zenith, pc_state )
/* basic machine hardware */
MCFG_CPU_PC(zenith, pc8, I8088, XTAL_14_31818MHz/3) /* 4,77 MHz */
@@ -243,6 +526,7 @@ static MACHINE_CONFIG_START( zenith, pc_state )
MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "fdc_xt", false)
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "lpt", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, "com", false)
@@ -258,6 +542,22 @@ static MACHINE_CONFIG_START( zenith, pc_state )
MACHINE_CONFIG_END
+//NCR PC4i
+static MACHINE_CONFIG_DERIVED ( ncrpc4i, pccga )
+ //MCFG_DEVICE_MODIFY("mb:isa")
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa7", pc_isa8_cards, nullptr, false)
+
+ MCFG_DEVICE_MODIFY(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("640K")
+ MCFG_RAM_EXTRA_OPTIONS("64K, 128K, 256K, 512K")
+MACHINE_CONFIG_END
+
+
+// Siemens Sicomp PC16-05
+static DEVICE_INPUT_DEFAULTS_START( siemens )
+ DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x30)
+DEVICE_INPUT_DEFAULTS_END
static MACHINE_CONFIG_START( siemens, pc_state )
/* basic machine hardware */
@@ -282,6 +582,8 @@ static MACHINE_CONFIG_START( siemens, pc_state )
MACHINE_CONFIG_END
+
+// IBM 5550
static MACHINE_CONFIG_START( ibm5550, pc_state )
/* basic machine hardware */
MCFG_CPU_PC(pc16, ibm5550, I8086, 8000000)
@@ -302,21 +604,8 @@ static MACHINE_CONFIG_START( ibm5550, pc_state )
MCFG_RAM_EXTRA_OPTIONS("64K, 128K, 256K, 512K")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED(bondwell, pccga)
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_CPU_PC(pc8, pc8, I8088, 4772720) // turbo?
-MACHINE_CONFIG_END
-
-static MACHINE_CONFIG_DERIVED(mk88, poisk2)
- MCFG_DEVICE_MODIFY("isa1")
- MCFG_SLOT_DEFAULT_OPTION("cga_ec1841")
-MACHINE_CONFIG_END
-
-static MACHINE_CONFIG_DERIVED(eagle1600, pccga)
- MCFG_DEVICE_REMOVE("maincpu")
- MCFG_CPU_PC(pc16, pc16, I8086, 8000000)
-MACHINE_CONFIG_END
+// Olivetti M15
static DEVICE_INPUT_DEFAULTS_START( m15 )
DEVICE_INPUT_DEFAULTS("DSW0", 0x30, 0x20) // TODO: document correct dip settings
DEVICE_INPUT_DEFAULTS("DSW0", 0x01, 0x00)
@@ -325,12 +614,32 @@ DEVICE_INPUT_DEFAULTS_END
static MACHINE_CONFIG_DERIVED(m15, pccga)
MCFG_DEVICE_MODIFY("mb")
MCFG_DEVICE_INPUT_DEFAULTS(m15)
+ MCFG_DEVICE_MODIFY("isa2")
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_dual_720K)
MCFG_DEVICE_MODIFY(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("448K")
MCFG_RAM_EXTRA_OPTIONS("16K, 160K, 304K")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( laser_turbo_xt, pc_state )
+
+// Atari PC1
+static MACHINE_CONFIG_DERIVED(ataripc1, pccga)
+ MCFG_DEVICE_MODIFY("isa1")
+ MCFG_SLOT_DEFAULT_OPTION("ega")
+ MCFG_DEVICE_MODIFY("isa2")
+ MCFG_SLOT_OPTION_MACHINE_CONFIG("fdc_xt", cfg_single_360K)
+MACHINE_CONFIG_END
+
+
+//Eagle 1600
+static MACHINE_CONFIG_DERIVED(eagle1600, pccga)
+ MCFG_DEVICE_REMOVE("maincpu")
+ MCFG_CPU_PC(pc16, pc16, I8086, 8000000)
+MACHINE_CONFIG_END
+
+
+//Laser XT/3
+static MACHINE_CONFIG_START( laser_xt3, pc_state )
MCFG_CPU_PC(pc8, pc8, I8088, XTAL_14_31818MHz/3) /* 4,77 MHz */
MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
@@ -338,7 +647,7 @@ static MACHINE_CONFIG_START( laser_turbo_xt, pc_state )
MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC)
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false)
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) // floppy drive A is 5.25" 360K and B is 3.5" 720K
MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false)
@@ -351,13 +660,15 @@ static MACHINE_CONFIG_START( laser_turbo_xt, pc_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
- MCFG_RAM_EXTRA_OPTIONS("512K,768K,896K,1024K,1408K,1536K,1664K")
+ MCFG_RAM_EXTRA_OPTIONS("512K,1024K,1536K,1664K")
/* software lists */
MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
MACHINE_CONFIG_END
-static MACHINE_CONFIG_START( laser_xt3, pc_state )
+
+//Laser Turbo XT
+static MACHINE_CONFIG_START( laser_turbo_xt, pc_state )
MCFG_CPU_PC(pc8, pc8, I8088, XTAL_14_31818MHz/3) /* 4,77 MHz */
MCFG_IBM5160_MOTHERBOARD_ADD("mb","maincpu")
@@ -365,7 +676,7 @@ static MACHINE_CONFIG_START( laser_xt3, pc_state )
MCFG_ISA8_SLOT_ADD("mb:isa", "isa1", pc_isa8_cards, "cga", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa2", pc_isa8_cards, "com", false) // Multi I/O card (includes FDC)
- MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false) // floppy drive A is 5.25" 360K and B is 3.5" 720K
+ MCFG_ISA8_SLOT_ADD("mb:isa", "isa3", pc_isa8_cards, "fdc_xt", false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa4", pc_isa8_cards, nullptr, false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa5", pc_isa8_cards, nullptr, false)
MCFG_ISA8_SLOT_ADD("mb:isa", "isa6", pc_isa8_cards, nullptr, false)
@@ -378,44 +689,63 @@ static MACHINE_CONFIG_START( laser_xt3, pc_state )
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("640K")
- MCFG_RAM_EXTRA_OPTIONS("512K,1024K,1536K,1664K")
+ MCFG_RAM_EXTRA_OPTIONS("512K,768K,896K,1024K,1408K,1536K,1664K")
/* software lists */
MCFG_SOFTWARE_LIST_ADD("disk_list","ibm5150")
MACHINE_CONFIG_END
-ROM_START( bw230 )
- ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD("bondwell.bin", 0xe000, 0x2000, CRC(d435a405) SHA1(a57c705d1144c7b61940b6f5c05d785c272fc9bb))
-ROM_END
+//**************************************************************************
+// ROM DEFINITIONS
+//**************************************************************************
-ROM_START( sicpc1605 )
+ROM_START( dgone )
ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD("multitech pc-700 3.1.bin", 0xe000, 0x2000, CRC(0ac7a2e1) SHA1(b9c8504e21213d81a068dde9f51f9c973d726e7b))
+ ROM_LOAD( "dgone.bin", 0x8000, 0x08000, CRC(2c38c86e) SHA1(c0f85a000d1d13cd354965689e925d677822549e))
ROM_END
-ROM_START( ncrpc4i )
+ROM_START( bw230 )
ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD( "ncr_pc4i_biosrom_1985.bin",0xc000, 0x4000, CRC(b9732648) SHA1(0d5d96fbc36089ca4d893b0db84faffa8043a5e4))
+ ROM_LOAD("bondwell.bin", 0xe000, 0x2000, CRC(d435a405) SHA1(a57c705d1144c7b61940b6f5c05d785c272fc9bb))
ROM_END
-ROM_START( zdsupers )
- ROM_REGION(0x10000,"bios", 0)
- ROM_SYSTEM_BIOS( 0, "v31d", "v3.1d" )
- ROMX_LOAD( "z184m v3.1d.10d", 0x8000, 0x8000, CRC(44012c3b) SHA1(f2f28979798874386ca8ba3dd3ead24ae7c2aeb4), ROM_BIOS(1))
- ROM_SYSTEM_BIOS( 1, "v29e", "v2.9e" )
- ROMX_LOAD( "z184m v2.9e.10d", 0x8000, 0x8000, CRC(de2f200b) SHA1(ad5ce601669a82351e412fc6c1c70c47779a1e55), ROM_BIOS(2))
+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
-
-ROM_START( dgone )
- ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD( "dgone.bin", 0x8000, 0x08000, CRC(2c38c86e) SHA1(c0f85a000d1d13cd354965689e925d677822549e))
+// Note: Commodore PC20-III, PC10-III and COLT share the same BIOS
+ROM_START( pc10iii )
+ ROM_REGION(0x10000, "bios", 0)
+ ROM_DEFAULT_BIOS("v441")
+ ROM_SYSTEM_BIOS(0, "v435", "v4.35")
+ ROMX_LOAD("318085-01.u201", 0x8000, 0x8000, CRC(be752d1e) SHA1(5e5e63cd6d6269816cd691602e4c4d209fe3df67), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS(1, "v436", "v4.36")
+ ROMX_LOAD("318085-02.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(2))
+ ROM_SYSTEM_BIOS(2, "v436c", "v4.36c")
+ ROMX_LOAD("318085-04.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(3))
+ ROM_SYSTEM_BIOS(3, "v438", "v4.38")
+ ROMX_LOAD("318085-05.u201", 0x8000, 0x8000, CRC(ae9e6a31) SHA1(853ee251cf230818c407a8d13ef060a21c90a8c1), ROM_BIOS(4))
+ ROM_SYSTEM_BIOS(4, "v439", "v4.39")
+ ROMX_LOAD("318085-06.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(5))
+ ROM_SYSTEM_BIOS(5, "v440", "v4.40")
+ ROMX_LOAD("318085-07.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(6))
+ ROM_SYSTEM_BIOS(6, "v441", "v4.41")
+ ROMX_LOAD("318085-08.u201", 0x8000, 0x8000, CRC(7e228dc8) SHA1(958dfdd637bd31c01b949fac729d6973a7e630bc), ROM_BIOS(7))
+ ROM_REGION(0x8000, "gfx1", 0)
+ ROM_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6))
+ //ROM_LOAD("5788005.u33", 0x00000, 0x2000, BAD_DUMP CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* temp so you can read the text */
ROM_END
-ROM_START( ssam88s )
- ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD( "samsung_samtron_88s_vers_2.0a.bin", 0x8000, 0x08000, CRC(d1252a91) SHA1(469d15b6ecd7b70234975dc12c6bda4212a66652))
+ROM_START( iskr3104 )
+ ROM_REGION16_LE(0x10000,"bios", 0)
+ ROMX_LOAD( "198.bin", 0xc000, 0x2000, CRC(bcfd8e41) SHA1(e21ddf78839aa51fa5feb23f511ff5e2da31b433),ROM_SKIP(1))
+ ROMX_LOAD( "199.bin", 0xc001, 0x2000, CRC(2da5fe79) SHA1(14d5dccc141a0b3367f7f8a7188306fdf03c2b6c),ROM_SKIP(1))
+ // EGA card from Iskra-3104
+ //ROMX_LOAD( "143-03.bin", 0xc0001, 0x2000, CRC(d0706345) SHA1(e04bb40d944426a4ae2e3a614d3f4953d7132ede),ROM_SKIP(1))
+ //ROMX_LOAD( "143-02.bin", 0xc0000, 0x2000, CRC(c8c18ebb) SHA1(fd6dac76d43ab8b582e70f1d5cc931d679036fb9),ROM_SKIP(1))
ROM_END
ROM_START( mk88 )
@@ -432,15 +762,6 @@ ROM_START( mk88 )
ROMX_LOAD( "b88.bin", 0xe000, 0x2000, CRC(58a418df) SHA1(216398d4e4302ee7efcc2c8f9ff9d8a1161229ea), ROM_BIOS(3))
ROM_END
-ROM_START( iskr3104 )
- ROM_REGION16_LE(0x10000,"bios", 0)
- ROMX_LOAD( "198.bin", 0xc000, 0x2000, CRC(bcfd8e41) SHA1(e21ddf78839aa51fa5feb23f511ff5e2da31b433),ROM_SKIP(1))
- ROMX_LOAD( "199.bin", 0xc001, 0x2000, CRC(2da5fe79) SHA1(14d5dccc141a0b3367f7f8a7188306fdf03c2b6c),ROM_SKIP(1))
- // EGA card from Iskra-3104
- //ROMX_LOAD( "143-03.bin", 0xc0001, 0x2000, CRC(d0706345) SHA1(e04bb40d944426a4ae2e3a614d3f4953d7132ede),ROM_SKIP(1))
- //ROMX_LOAD( "143-02.bin", 0xc0000, 0x2000, CRC(c8c18ebb) SHA1(fd6dac76d43ab8b582e70f1d5cc931d679036fb9),ROM_SKIP(1))
-ROM_END
-
ROM_START( poisk2 )
ROM_REGION16_LE(0x10000,"bios", 0)
ROM_SYSTEM_BIOS(0, "v20", "v2.0")
@@ -470,6 +791,29 @@ ROM_START( mc1702 )
ROM_LOAD( "ba1m_(573rf5).rom", 0x0000, 0x0800, CRC(08d938e8) SHA1(957b6c691dbef75c1c735e8e4e81669d056971e4))
ROM_END
+ROM_START( zdsupers )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_SYSTEM_BIOS( 0, "v31d", "v3.1d" )
+ ROMX_LOAD( "z184m v3.1d.10d", 0x8000, 0x8000, CRC(44012c3b) SHA1(f2f28979798874386ca8ba3dd3ead24ae7c2aeb4), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 1, "v29e", "v2.9e" )
+ ROMX_LOAD( "z184m v2.9e.10d", 0x8000, 0x8000, CRC(de2f200b) SHA1(ad5ce601669a82351e412fc6c1c70c47779a1e55), ROM_BIOS(2))
+ROM_END
+
+ROM_START( sicpc1605 )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_LOAD("multitech pc-700 3.1.bin", 0xe000, 0x2000, CRC(0ac7a2e1) SHA1(b9c8504e21213d81a068dde9f51f9c973d726e7b))
+ROM_END
+
+ROM_START( ncrpc4i )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_LOAD( "ncr_pc4i_biosrom_1985.bin",0xc000, 0x4000, CRC(b9732648) SHA1(0d5d96fbc36089ca4d893b0db84faffa8043a5e4))
+ROM_END
+
+ROM_START( olivm15 )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_LOAD( "oliv_m15.bin",0xc000, 0x04000, CRC(bf2ef795) SHA1(02d497131f5ca2c78f2accd38ab0eab6813e3ebf))
+ROM_END
+
ROM_START( ibm5550 )
ROM_REGION16_LE(0x10000,"bios", 0)
ROM_LOAD( "ipl5550.rom", 0xc000, 0x4000, CRC(40cf34c9) SHA1(d41f77fdfa787b0e97ed311e1c084b8699a5b197))
@@ -481,47 +825,11 @@ ROM_START( pc7000 )
ROMX_LOAD( "mitsubishi-m5l27128k-2.bin", 0x8001, 0x4000, CRC(99b229a4) SHA1(5800c8bafed26873d8cfcc79a05f93a780a31c91), ROM_SKIP(1))
ROM_END
-ROM_START( olivm15 )
- ROM_REGION(0x10000,"bios", 0)
- ROM_LOAD( "oliv_m15.bin",0xc000, 0x04000, CRC(bf2ef795) SHA1(02d497131f5ca2c78f2accd38ab0eab6813e3ebf))
-ROM_END
-
ROM_START( sx16 )
ROM_REGION(0x10000,"bios", 0)
ROM_LOAD( "tmm27128ad.bin",0xc000, 0x4000, CRC(f8543362) SHA1(fef625e260ca89ba02174584bdc12db609f0780e))
ROM_END
-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
-
-
-// Note: Commodore PC20-III, PC10-III and COLT share the same BIOS
-ROM_START( pc10iii )
- ROM_REGION(0x10000, "bios", 0)
- ROM_DEFAULT_BIOS("v441")
- ROM_SYSTEM_BIOS(0, "v435", "v4.35")
- ROMX_LOAD("318085-01.u201", 0x8000, 0x8000, CRC(be752d1e) SHA1(5e5e63cd6d6269816cd691602e4c4d209fe3df67), ROM_BIOS(1))
- ROM_SYSTEM_BIOS(1, "v436", "v4.36")
- ROMX_LOAD("318085-02.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(2))
- ROM_SYSTEM_BIOS(2, "v436c", "v4.36c")
- ROMX_LOAD("318085-04.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(3))
- ROM_SYSTEM_BIOS(3, "v438", "v4.38")
- ROMX_LOAD("318085-05.u201", 0x8000, 0x8000, CRC(ae9e6a31) SHA1(853ee251cf230818c407a8d13ef060a21c90a8c1), ROM_BIOS(4))
- ROM_SYSTEM_BIOS(4, "v439", "v4.39")
- ROMX_LOAD("318085-06.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(5))
- ROM_SYSTEM_BIOS(5, "v440", "v4.40")
- ROMX_LOAD("318085-07.u201", 0x8000, 0x8000, NO_DUMP, ROM_BIOS(6))
- ROM_SYSTEM_BIOS(6, "v441", "v4.41")
- ROMX_LOAD("318085-08.u201", 0x8000, 0x8000, CRC(7e228dc8) SHA1(958dfdd637bd31c01b949fac729d6973a7e630bc), ROM_BIOS(7))
- ROM_REGION(0x8000, "gfx1", 0)
- ROM_LOAD("318086-02.u607", 0x0000, 0x8000, CRC(b406651c) SHA1(856f58353391a74a06ebb8ec9f8333d7d69e5fd6))
- //ROM_LOAD("5788005.u33", 0x00000, 0x2000, BAD_DUMP CRC(0bf56d70) SHA1(c2a8b10808bf51a3c123ba3eb1e9dd608231916f)) /* temp so you can read the text */
-ROM_END
-
ROM_START( mbc16 )
ROM_REGION(0x10000,"bios", 0)
ROM_LOAD( "mbc16.bin", 0xc000, 0x4000, CRC(f3e0934a) SHA1(e4b91c3d395be0414e20f23ad4919b8ac52639b2))
@@ -530,6 +838,14 @@ ROM_START( mbc16 )
ROM_LOAD( "atigssr.bin", 0x0000, 0x2000, CRC(aca81498) SHA1(0d84c89487ee7a6ac4c9e73fdb30c5fd8aa595f8))
ROM_END
+ROM_START ( ataripc1 )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_SYSTEM_BIOS( 0, "v3.06", "v3.06" )
+ ROMX_LOAD( "award_atari_pc_bios_3.06.bin", 0x8000, 0x8000, CRC(256427ce) SHA1(999f6af64b79f88c1d3492f386d9bee08efb50e7), ROM_BIOS(1))
+ ROM_SYSTEM_BIOS( 1, "v3.08", "v3.08" )
+ ROMX_LOAD( "award_atari_pc_bios_3.08.bin", 0x8000, 0x8000, CRC(929a2443) SHA1(8e98f3c9180c55b1f5521727779c016083d27960), ROM_BIOS(2)) //same as on Atari PC3, also used on Atari PC2
+ROM_END
+
ROM_START( ataripc3 )
ROM_REGION(0x10000,"bios", 0)
ROM_LOAD( "c101701-004 308.u61",0x8000, 0x8000, CRC(929a2443) SHA1(8e98f3c9180c55b1f5521727779c016083d27960))
@@ -541,6 +857,11 @@ ROM_START( ataripc3 )
ROM_LOAD( "c101681 6ffb.u60",0x000, 0x100, NO_DUMP ) // PAL20L10NC
ROM_END
+ROM_START( ssam88s )
+ ROM_REGION(0x10000,"bios", 0)
+ ROM_LOAD( "samsung_samtron_88s_vers_2.0a.bin", 0x8000, 0x08000, CRC(d1252a91) SHA1(469d15b6ecd7b70234975dc12c6bda4212a66652))
+ROM_END
+
ROM_START( eagle1600 )
ROM_REGION(0x10000,"bios", 0)
ROMX_LOAD( "eagle 1600 62-2732-001 rev e u403.bin",0xe000, 0x1000, CRC(3da1e96a) SHA1(77861ba5ebd056da1daf048f5abd459e0528666d), ROM_SKIP(1))
@@ -550,12 +871,12 @@ ROM_START( eagle1600 )
ROM_LOAD("eagle 1600 video char gen u301.bin", 0x00000, 0x1000, CRC(1a7e552f) SHA1(749058783eec9d96a70dc5fdbfccb56196f889dc))
ROM_END
-ROM_START(laser_turbo_xt)
+ROM_START( laser_turbo_xt )
ROM_REGION(0x10000, "bios", 0)
ROM_LOAD("laser_turbo_xt.bin", 0x0e000, 0x02000, CRC(0a6121d3) SHA1(59b1f8dd6fe981ef9a7700adebf6e1adda7cee90)) // version 1.11 - 27c64d
ROM_END
-ROM_START(laser_xt3)
+ROM_START( laser_xt3 )
ROM_REGION(0x10000, "bios", 0)
ROM_LOAD("laser_xt3.bin", 0x0e000, 0x02000, CRC(b45a7dd3) SHA1(62f17c408be0036d00a182e94c5c88b83d46b625)) // version 1.26 - 27c64
ROM_END
@@ -567,34 +888,26 @@ ROM_END
***************************************************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
-COMP( 1984, dgone, ibm5150, 0, pccga, pccga, driver_device, 0, "Data General", "Data General/One" , MACHINE_NOT_WORKING)/* CGA, 2x 3.5" disk drives */
-COMP( 1985, bw230, ibm5150, 0, bondwell, bondwell, pc_state, bondwell, "Bondwell Holding", "BW230 (PRO28 Series)", 0 )
-COMP( 1984, compc1, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-1" , MACHINE_NOT_WORKING)
-COMP( 1987, pc10iii, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-10 III" , MACHINE_NOT_WORKING)
-
-
-COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pccga, driver_device, 0, "Schetmash", "Iskra 3104", MACHINE_NOT_WORKING)
-COMP( 1989, mk88, ibm5150, 0, mk88, pccga, driver_device, 0, "<unknown>", "MK-88", MACHINE_NOT_WORKING)
-COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, driver_device, 0, "<unknown>", "Poisk-2", MACHINE_NOT_WORKING)
-COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, driver_device, 0, "<unknown>", "Elektronika MC-1702", MACHINE_NOT_WORKING)
-
-COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, driver_device, 0, "Zenith Data Systems", "SuperSport", 0)
-COMP( 1985, sicpc1605, ibm5150, 0, siemens, pccga, driver_device, 0, "Siemens", "Sicomp PC16-05", MACHINE_NOT_WORKING)
-COMP( 1985, ncrpc4i, ibm5150, 0, pccga, pccga, driver_device, 0, "NCR","PC4i", MACHINE_NOT_WORKING)
-
-COMP( 198?, olivm15, ibm5150, 0, m15, pccga, driver_device, 0, "Olivetti", "M15", 0)
-
-COMP( 1983, ibm5550, ibm5150, 0, ibm5550, pccga, driver_device, 0, "International Business Machines", "IBM 5550", MACHINE_NOT_WORKING)
-
-COMP( 1985, pc7000, ibm5150, 0, pccga, pccga, driver_device, 0, "Sharp", "PC-7000", MACHINE_NOT_WORKING)
-
-COMP( 1988, sx16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "SX-16", MACHINE_NOT_WORKING)
-COMP( 198?, mbc16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "MBC-16" , MACHINE_NOT_WORKING)
-
-COMP( 198?, ataripc3, ibm5150, 0, pccga, pccga, driver_device, 0, "Atari", "PC-3" , 0)
-COMP( 1989, ssam88s, ibm5150, 0, pccga, pccga, driver_device, 0, "Samsung", "Samtron 88S" , MACHINE_NOT_WORKING)
-COMP( 1983, eagle1600, ibm5150, 0, eagle1600, pccga, driver_device, 0, "Eagle", "1600" , MACHINE_NOT_WORKING)
-
-COMP ( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0)
-COMP ( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0)
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
+COMP( 1984, dgone, ibm5150, 0, dgone, pccga, driver_device, 0, "Data General", "Data General/One" , MACHINE_NOT_WORKING)/* CGA, 2x 3.5" disk drives */
+COMP( 1985, bw230, ibm5150, 0, bondwell, bondwell, pc_state, bondwell, "Bondwell Holding", "BW230 (PRO28 Series)", 0 )
+COMP( 1984, compc1, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-1" , MACHINE_NOT_WORKING)
+COMP( 1987, pc10iii, ibm5150, 0, pccga, pccga, driver_device, 0, "Commodore Business Machines", "Commodore PC-10 III" , MACHINE_NOT_WORKING)
+COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pccga, driver_device, 0, "Schetmash", "Iskra 3104", MACHINE_NOT_WORKING)
+COMP( 1989, mk88, ibm5150, 0, mk88, pccga, driver_device, 0, "<unknown>", "MK-88", MACHINE_NOT_WORKING)
+COMP( 1991, poisk2, ibm5150, 0, poisk2, pccga, driver_device, 0, "<unknown>", "Poisk-2", MACHINE_NOT_WORKING)
+COMP( 1990, mc1702, ibm5150, 0, pccga, pccga, driver_device, 0, "<unknown>", "Elektronika MC-1702", MACHINE_NOT_WORKING)
+COMP( 1987, zdsupers, ibm5150, 0, zenith, pccga, driver_device, 0, "Zenith Data Systems", "SuperSport", 0)
+COMP( 1985, sicpc1605, ibm5150, 0, siemens, pccga, driver_device, 0, "Siemens", "Sicomp PC16-05", MACHINE_NOT_WORKING)
+COMP( 1985, ncrpc4i, ibm5150, 0, ncrpc4i, pccga, driver_device, 0, "NCR", "PC4i", MACHINE_NOT_WORKING)
+COMP( 198?, olivm15, ibm5150, 0, m15, pccga, driver_device, 0, "Olivetti", "M15", 0)
+COMP( 1983, ibm5550, ibm5150, 0, ibm5550, pccga, driver_device, 0, "International Business Machines", "IBM 5550", MACHINE_NOT_WORKING)
+COMP( 1985, pc7000, ibm5150, 0, pccga, pccga, driver_device, 0, "Sharp", "PC-7000", MACHINE_NOT_WORKING)
+COMP( 1988, sx16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "SX-16", MACHINE_NOT_WORKING)
+COMP( 198?, mbc16, ibm5150, 0, pccga, pccga, driver_device, 0, "Sanyo", "MBC-16" , MACHINE_NOT_WORKING)
+COMP( 1987, ataripc1, ibm5150, 0, ataripc1, pccga, driver_device, 0, "Atari", "PC1" , 0)
+COMP( 1988, ataripc3, ibm5150, 0, pccga, pccga, driver_device, 0, "Atari", "PC3" , 0)
+COMP( 1989, ssam88s, ibm5150, 0, pccga, pccga, driver_device, 0, "Samsung", "Samtron 88S" , MACHINE_NOT_WORKING)
+COMP( 1983, eagle1600, ibm5150, 0, eagle1600, pccga, driver_device, 0, "Eagle", "1600" , MACHINE_NOT_WORKING)
+COMP( 1988, laser_turbo_xt, ibm5150, 0, laser_turbo_xt, 0, driver_device, 0, "VTech", "Laser Turbo XT" , 0)
+COMP( 1989, laser_xt3, ibm5150, 0, laser_xt3, 0, driver_device, 0, "VTech", "Laser XT/3" , 0)
diff --git a/src/mame/drivers/peyper.cpp b/src/mame/drivers/peyper.cpp
index 55729c2df7a..d9d2a56dccf 100644
--- a/src/mame/drivers/peyper.cpp
+++ b/src/mame/drivers/peyper.cpp
@@ -15,6 +15,7 @@
Nemesis (Peyper)
Odisea Paris-Dakar (Peyper)
Hang-On (Sonic)
+ Ator (Videodens)
Others not emulated (need roms):
Night Fever (Sonic)
@@ -831,6 +832,15 @@ ROM_START(wolfman)
ROM_END
/*-------------------------------------------------------------------
+/ Ator (198?)
+/-------------------------------------------------------------------*/
+ROM_START(ator)
+ ROM_REGION(0x6000, "maincpu", 0)
+ ROM_LOAD("1.bin", 0x0000, 0x2000, NO_DUMP)
+ ROM_LOAD("Ator 2 _0xBA29.BIN", 0x2000, 0x2000, CRC(21aad5c4) SHA1(e78da5d80682710db34cbbfeae5af54241c73371))
+ROM_END
+
+/*-------------------------------------------------------------------
/ Sir Lancelot (1994)
/-------------------------------------------------------------------*/
ROM_START(lancelot)
@@ -855,5 +865,6 @@ GAME( 1987, sonstwr2, sonstwar, peyper, sonstwar, peyper_state, peyper, ROT0
GAME( 1987, wolfman, 0, peyper, wolfman, peyper_state, wolfman, ROT0, "Peyper", "Wolf Man", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
GAME( 1986, nemesisp, 0, peyper, wolfman, peyper_state, wolfman, ROT0, "Peyper", "Nemesis", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
GAME( 1987, odisea, 0, peyper, odisea, peyper_state, wolfman, ROT0, "Peyper", "Odisea Paris-Dakar", MACHINE_MECHANICAL | MACHINE_NOT_WORKING )
-GAME( 1988, hangonp, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Sonic", "Hang-On (Sonic)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // inputs to be checked
+GAME( 1988, hangonp, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Sonic", "Hang-On (Sonic)", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // inputs to be checked
+GAME( 198?, ator, 0, peyper, sonstwar, peyper_state, peyper, ROT0, "Videodens", "Ator", MACHINE_MECHANICAL | MACHINE_NOT_WORKING ) // initial program ROM missing; no manual found
GAME( 1994, lancelot, 0, peyper, sonstwar, driver_device,0, ROT0, "Peyper", "Sir Lancelot", MACHINE_IS_SKELETON_MECHANICAL) // different hardware (see top of file)
diff --git a/src/mame/drivers/rm380z.cpp b/src/mame/drivers/rm380z.cpp
index 1d2d93d6bb7..53baa0c3c7c 100644
--- a/src/mame/drivers/rm380z.cpp
+++ b/src/mame/drivers/rm380z.cpp
@@ -170,12 +170,18 @@ static MACHINE_CONFIG_START( rm380z, rm380z_state )
MCFG_GENERIC_KEYBOARD_CB(WRITE8(rm380z_state, keyboard_put))
MACHINE_CONFIG_END
+static MACHINE_CONFIG_DERIVED( rm480z, rm380z )
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_SIZE(64*8, 24*11)
+ MCFG_SCREEN_VISIBLE_AREA(0, 64*8-1, 0, 24*11-1)
+ MCFG_SCREEN_UPDATE_DRIVER(rm380z_state, screen_update_rm480z)
+MACHINE_CONFIG_END
/* ROM definitions */
ROM_START( rm380z34d )
- ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 )
+ ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 )
ROM_LOAD( "cos34d-f.bin", 0x0000, 0x1000, CRC(eb128b40) SHA1(c46f358fb76459987e41750d052995563f2f7d53))
// chargen ROM is undumped, afaik
ROM_REGION( 0x1680, "chargen", 0 )
@@ -199,15 +205,22 @@ ROM_START( rm380z )
// chargen ROM is undumped, afaik
ROM_REGION( 0x1680, "chargen", 0 )
ROM_LOAD( "ch3.raw", 0x0000, 0x1680, BAD_DUMP CRC(c223622b) SHA1(185ef24896419d7ff46f71a760ac217de3811684))
- // The characters on the 480Z are very close (or identical) to the 380Z ones
- //ROM_REGION( 0x2000, "chargen", 0 )
- //ROM_LOAD( "CG06.BIN", 0x0000, 0x2000, CRC(15d40f7e) SHA1(a7266357eb9be849f77a97ff3013b236c0af8289))
+ROM_END
+
+ROM_START( rm480z )
+ ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 )
+ ROM_LOAD( "cos40b-m.bin", 0x0000, 0x1000, CRC(1f0b3a5c) SHA1(0b29cb2a3b7eaa3770b34f08c4fd42844f42700f))
+ ROM_LOAD( "cos40b-m_f600-f9ff.bin", 0x1000, 0x400, CRC(e3397d9d) SHA1(490a0c834b0da392daf782edc7d51ca8f0668b1a))
+ ROM_LOAD( "cos40b-m_1c00-1dff.bin", 0x1400, 0x200, CRC(0f759f44) SHA1(9689c1c1faa62c56def999cbedbbb0c8d928dcff))
+ ROM_REGION( 0x2000, "chargen", 0 )
+ ROM_LOAD( "cg06.bin", 0x0000, 0x2000, CRC(15d40f7e) SHA1(a7266357eb9be849f77a97ff3013b236c0af8289) )
ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */
-COMP(1978, rm380z, 0, 0, rm380z, rm380z, rm380z_state, rm380z, "Research Machines", "RM-380Z, COS 4.0B", MACHINE_NO_SOUND_HW)
+COMP(1978, rm380z, 0, 0, rm380z, rm380z, rm380z_state, rm380z, "Research Machines", "RM-380Z, COS 4.0B", MACHINE_NO_SOUND_HW)
COMP(1978, rm380z34d, rm380z, 0, rm380z, rm380z, rm380z_state, rm380z34d, "Research Machines", "RM-380Z, COS 3.4D", MACHINE_BTANB_FLAGS)
COMP(1978, rm380z34e, rm380z, 0, rm380z, rm380z, rm380z_state, rm380z34e, "Research Machines", "RM-380Z, COS 3.4E", MACHINE_BTANB_FLAGS)
+COMP(1981, rm480z, rm380z, 0, rm480z, rm380z, rm380z_state, rm380z34e, "Research Machines", "LINK RM-480Z", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW)
diff --git a/src/mame/drivers/rohga.cpp b/src/mame/drivers/rohga.cpp
index 8b3d103078b..3cb74af0a69 100644
--- a/src/mame/drivers/rohga.cpp
+++ b/src/mame/drivers/rohga.cpp
@@ -7,6 +7,7 @@
Rogha Armour Attack (c) 1991 Data East Corporation
Wizard Fire (c) 1992 Data East Corporation
Nitro Ball/Gun Ball (c) 1992 Data East Corporation
+ Hangzo (prototype) (c) 1992 Hot-B
Schmeiser Robo (c) 1993 Hot-B
This hardware is capable of alpha-blending on sprites and playfields
@@ -265,7 +266,7 @@ static ADDRESS_MAP_START( nitrobal_map, AS_PROGRAM, 16, rohga_state )
AM_RANGE(0xff8000, 0xffffff) AM_RAM
ADDRESS_MAP_END
-static ADDRESS_MAP_START( schmeisr_map, AS_PROGRAM, 16, rohga_state )
+static ADDRESS_MAP_START( hotb_base_map, AS_PROGRAM, 16, rohga_state )
AM_RANGE(0x000000, 0x0fffff) AM_ROM
AM_RANGE(0x200000, 0x20000f) AM_DEVWRITE("tilegen1", deco16ic_device, pf_control_w)
AM_RANGE(0x240000, 0x24000f) AM_DEVWRITE("tilegen2", deco16ic_device, pf_control_w)
@@ -284,17 +285,27 @@ static ADDRESS_MAP_START( schmeisr_map, AS_PROGRAM, 16, rohga_state )
AM_RANGE(0x3c2000, 0x3c2fff) AM_DEVREADWRITE("tilegen1", deco16ic_device, pf2_data_r, pf2_data_w)
AM_RANGE(0x3c4000, 0x3c4fff) AM_DEVREADWRITE("tilegen2", deco16ic_device, pf1_data_r, pf1_data_w)
AM_RANGE(0x3c6000, 0x3c6fff) AM_DEVREADWRITE("tilegen2", deco16ic_device, pf2_data_r, pf2_data_w)
- AM_RANGE(0x3c8000, 0x3c8fff) AM_MIRROR(0x1000) AM_RAM AM_SHARE("pf1_rowscroll")
+ AM_RANGE(0x3c8000, 0x3c9fff) AM_RAM AM_SHARE("pf1_rowscroll")
AM_RANGE(0x3ca000, 0x3cafff) AM_MIRROR(0x1000) AM_RAM AM_SHARE("pf2_rowscroll")
AM_RANGE(0x3cc000, 0x3ccfff) AM_MIRROR(0x1000) AM_RAM AM_SHARE("pf3_rowscroll")
AM_RANGE(0x3ce000, 0x3cefff) AM_MIRROR(0x1000) AM_RAM AM_SHARE("pf4_rowscroll")
AM_RANGE(0x3d0000, 0x3d07ff) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0x3e0000, 0x3e1fff) AM_MIRROR(0x2000) AM_RAM_DEVWRITE("deco_common", decocomn_device, buffered_palette_w) AM_SHARE("paletteram")
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( schmeisr_map, AS_PROGRAM, 16, rohga_state )
+ AM_IMPORT_FROM(hotb_base_map)
AM_RANGE(0xff0000, 0xff7fff) AM_RAM /* Main ram */
ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( hangzo_map, AS_PROGRAM, 16, rohga_state )
+ AM_IMPORT_FROM(hotb_base_map)
+ AM_RANGE(0x3f0000, 0x3f3fff) AM_RAM /* Main ram */
+ADDRESS_MAP_END
+
/******************************************************************************/
static ADDRESS_MAP_START( rohga_sound_map, AS_PROGRAM, 8, rohga_state )
@@ -338,7 +349,7 @@ static INPUT_PORTS_START( rohga )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_START("DSW")
- PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
@@ -347,7 +358,7 @@ static INPUT_PORTS_START( rohga )
PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
@@ -356,54 +367,46 @@ static INPUT_PORTS_START( rohga )
PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" )
+ PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" ) PORT_DIPLOCATION("SW1:8")
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( 0x3000, 0x3000, "Player's Vitality" )
+ PORT_DIPUNUSED_DIPLOC( 0x0100, 0x0100, "SW2:1" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x0200, 0x0200, "SW2:2" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x0400, 0x0400, "SW2:3" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x0800, 0x0800, "SW2:4" ) /* Listed as "Unused" */
+ PORT_DIPNAME( 0x3000, 0x3000, "Player's Vitality" ) PORT_DIPLOCATION("SW2:5,6")
PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x2000, DEF_STR( Low ) )
PORT_DIPSETTING( 0x1000, "Lowest" )
PORT_DIPSETTING( 0x0000, DEF_STR( High ) )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_START("DSW3") /* Dip switch bank 3 */
- PORT_DIPNAME( 0x0001, 0x0001, "Stage Clear Bonus" ) /* Life Recovery At stage clear */
+ PORT_DIPNAME( 0x0001, 0x0001, "Stage Clear Bonus" ) PORT_DIPLOCATION("SW3:1") /* Life Recovery At stage clear */
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:2")
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x000c, 0x000c, "Enemy's Vitality" )
+ PORT_DIPNAME( 0x000c, 0x000c, "Enemy's Vitality" ) PORT_DIPLOCATION("SW3:3,4")
PORT_DIPSETTING( 0x0008, DEF_STR( Low ) )
PORT_DIPSETTING( 0x000c, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0004, DEF_STR( High ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Highest ) )
- PORT_DIPNAME( 0x0030, 0x0030, "Enemy Encounter Rate" )
+ PORT_DIPNAME( 0x0030, 0x0030, "Enemy Encounter Rate" ) PORT_DIPLOCATION("SW3:5,6")
PORT_DIPSETTING( 0x0020, DEF_STR( Low ) )
PORT_DIPSETTING( 0x0030, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0010, DEF_STR( High ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Highest ) )
- PORT_DIPNAME( 0x00c0, 0x00c0, "Enemy's Weapon Speed" )
+ PORT_DIPNAME( 0x00c0, 0x00c0, "Enemy's Weapon Speed" ) PORT_DIPLOCATION("SW3:7,8")
PORT_DIPSETTING( 0x0080, "Slow" )
PORT_DIPSETTING( 0x00c0, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0040, "Fast" )
@@ -436,7 +439,7 @@ static INPUT_PORTS_START( wizdfire )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_START("DSW")
- PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
@@ -445,7 +448,7 @@ static INPUT_PORTS_START( wizdfire )
PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
@@ -454,31 +457,31 @@ static INPUT_PORTS_START( wizdfire )
PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" )
+ PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0000, "2" )
PORT_DIPSETTING( 0x0100, "3" )
PORT_DIPSETTING( 0x0300, "4" )
PORT_DIPSETTING( 0x0200, "5" )
- PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) )
+ PORT_DIPNAME( 0x0c00, 0x0c00, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:3,4")
PORT_DIPSETTING( 0x0800, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x3000, 0x3000, "Magic Gauge Speed" )
+ PORT_DIPNAME( 0x3000, 0x3000, "Magic Gauge Speed" ) PORT_DIPLOCATION("SW2:5,6")
PORT_DIPSETTING( 0x0000, "Very Slow" )
PORT_DIPSETTING( 0x1000, "Slow" )
PORT_DIPSETTING( 0x3000, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x2000, "Fast" )
- PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unused ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
@@ -509,7 +512,7 @@ static INPUT_PORTS_START( nitrobal )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_START("DSW")
- PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
@@ -518,7 +521,7 @@ static INPUT_PORTS_START( nitrobal )
PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
@@ -527,32 +530,32 @@ static INPUT_PORTS_START( nitrobal )
PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) )
PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" )
+ PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" ) PORT_DIPLOCATION("SW1:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
PORT_DIPSETTING( 0x0100, "1" )
PORT_DIPSETTING( 0x0000, "2" )
PORT_DIPSETTING( 0x0300, "3" )
PORT_DIPSETTING( 0x0200, "4" )
- PORT_DIPNAME( 0x0c00, 0x0c00, "Difficulty?" )
+ PORT_DIPNAME( 0x0c00, 0x0c00, "Difficulty?" ) PORT_DIPLOCATION("SW2:3,4")
PORT_DIPSETTING( 0x0800, DEF_STR( Easy ) )
PORT_DIPSETTING( 0x0c00, DEF_STR( Normal ) )
PORT_DIPSETTING( 0x0400, DEF_STR( Hard ) )
PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
- PORT_DIPNAME( 0x1000, 0x1000, "Split Coin Chutes" )
+ PORT_DIPNAME( 0x1000, 0x1000, "Split Coin Chutes" ) PORT_DIPLOCATION("SW2:5")
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Players) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Players) ) PORT_DIPLOCATION("SW2:6")
PORT_DIPSETTING( 0x2000, "2" )
PORT_DIPSETTING( 0x0000, "3" )
- PORT_DIPNAME( 0x4000, 0x4000, "Shot Button to Start" )
+ PORT_DIPNAME( 0x4000, 0x4000, "Shot Button to Start" ) PORT_DIPLOCATION("SW2:7")
PORT_DIPSETTING( 0x4000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
@@ -593,10 +596,10 @@ static INPUT_PORTS_START( schmeisr )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
PORT_START("DSW")
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) )
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x000e, 0x000e, DEF_STR( Coin_A ) )
+ PORT_DIPNAME( 0x000e, 0x000e, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:2,3,4")
PORT_DIPSETTING( 0x0000, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x0002, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0004, DEF_STR( 2C_1C ) )
@@ -605,7 +608,7 @@ static INPUT_PORTS_START( schmeisr )
PORT_DIPSETTING( 0x000a, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0008, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0006, DEF_STR( 1C_6C ) )
- PORT_DIPNAME( 0x0070, 0x0070, DEF_STR( Coin_B ) )
+ PORT_DIPNAME( 0x0070, 0x0070, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:5,6,7")
PORT_DIPSETTING( 0x0000, DEF_STR( 4C_1C ) )
PORT_DIPSETTING( 0x0010, DEF_STR( 3C_1C ) )
PORT_DIPSETTING( 0x0020, DEF_STR( 2C_1C ) )
@@ -614,59 +617,154 @@ static INPUT_PORTS_START( schmeisr )
PORT_DIPSETTING( 0x0050, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x0040, DEF_STR( 1C_4C ) )
PORT_DIPSETTING( 0x0030, DEF_STR( 1C_6C ) )
- PORT_SERVICE( 0x0080, IP_ACTIVE_LOW )
- 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( Demo_Sounds ) )
+ PORT_SERVICE_DIPLOC( 0x0080, IP_ACTIVE_LOW, "SW1:8" )
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPSETTING( 0x0200, DEF_STR( Easy ) )
+ PORT_DIPSETTING( 0x0300, DEF_STR( Normal ) )
+ PORT_DIPSETTING( 0x0100, DEF_STR( Hard ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Hardest ) )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:3")
PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0400, DEF_STR( On ) )
- PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) )
+ PORT_DIPUNUSED_DIPLOC( 0x0800, 0x0800, "SW2:4" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x1000, 0x1000, "SW2:5" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x2000, 0x2000, "SW2:6" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x4000, 0x4000, "SW2:7" ) /* Listed as "Unused" */
+ PORT_DIPUNUSED_DIPLOC( 0x8000, 0x8000, "SW2:8" ) /* Listed as "Unused" */
+
+ PORT_START("DSW3") /* Dip switch bank 3 - This bank of switches are _NOT_ shown in the test mode screen */
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:1")
+ PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:2")
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:3")
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, "Debug Mode" ) PORT_DIPLOCATION("SW3:4")
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:5")
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, "Freeze Screen" ) PORT_DIPLOCATION("SW3:6")
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:7")
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+INPUT_PORTS_END
+
+
+
+static INPUT_PORTS_START( hangzo )
+ PORT_START("INPUTS")
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_START2 )
+
+ PORT_START("SYSTEM")
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_VBLANK("screen")
+
+ PORT_START("DSW")
+ PORT_DIPNAME( 0x0007, 0x0007, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SW1:1,2,3")
+ PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0001, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0007, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0006, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0005, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0003, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0038, 0x0038, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SW1:4,5,6")
+ PORT_DIPSETTING( 0x0000, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x0038, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x0030, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x0028, DEF_STR( 1C_3C ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( 1C_4C ) )
+ PORT_DIPSETTING( 0x0018, DEF_STR( 1C_5C ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( 1C_6C ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:7")
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, "2 Credits to Start, 1 to Continue" ) PORT_DIPLOCATION("SW1:8")
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_DIPNAME( 0x0300, 0x0300, DEF_STR( Lives ) ) PORT_DIPLOCATION("SW2:1,2")
+ PORT_DIPSETTING( 0x0100, "1" )
+ PORT_DIPSETTING( 0x0000, "2" )
+ PORT_DIPSETTING( 0x0300, "3" )
+ PORT_DIPSETTING( 0x0200, "4" )
+ PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:3") /* Either 3 & 4 are Difficulty */
+ PORT_DIPSETTING( 0x0400, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4")
PORT_DIPSETTING( 0x0800, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:5") /* or more likely 5 & 6 are Player's Vitality like Rohga (all other dips seem to match Rohga) */
PORT_DIPSETTING( 0x1000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:6")
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, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Allow_Continue ) ) PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING( 0x0000, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x4000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW2:8")
PORT_DIPSETTING( 0x8000, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_START("DSW3") /* Dip switch bank 3 - This bank of switches are _NOT_ shown in the test mode screen */
- PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) )
+ PORT_START("DSW3")
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:1")
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0002, 0x0002, "Freeze Player" ) PORT_DIPLOCATION("SW3:2") /* With on, player will not fall down to playing field and be stuck floating at the top of the screen */
PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0004, 0x0004, "Freeze Frame" ) PORT_DIPLOCATION("SW3:3") /* P1 starts & stops freeze, when frozen P2 is single step frame */
PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0008, 0x0008, "Debug Mode" )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:4")
PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:5")
PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0020, 0x0020, "Freeze Screen" )
+ PORT_DIPNAME( 0x0020, 0x0020, "Freeze Screen" ) PORT_DIPLOCATION("SW3:6")
PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW3:7")
PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
- PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPNAME( 0x0080, 0x0080, "Debug Mode" ) PORT_DIPLOCATION("SW3:8")
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
INPUT_PORTS_END
+
+
/**********************************************************************************/
static const gfx_layout charlayout =
@@ -1090,7 +1188,7 @@ static MACHINE_CONFIG_START( schmeisr, rohga_state )
MCFG_DEVICE_ADD("tilegen1", DECO16IC, 0)
MCFG_DECO16IC_SPLIT(0)
- MCFG_DECO16IC_WIDTH12(1)
+ MCFG_DECO16IC_WIDTH12(1|4)
MCFG_DECO16IC_PF1_TRANS_MASK(0x0f)
MCFG_DECO16IC_PF2_TRANS_MASK(0x0f)
MCFG_DECO16IC_PF1_COL_BANK(0x00)
@@ -1146,6 +1244,16 @@ static MACHINE_CONFIG_START( schmeisr, rohga_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.40)
MACHINE_CONFIG_END
+
+
+static MACHINE_CONFIG_DERIVED( hangzo, schmeisr )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("maincpu")
+ MCFG_CPU_PROGRAM_MAP(hangzo_map)
+MACHINE_CONFIG_END
+
+
/**********************************************************************************/
ROM_START( rohga ) /* Asia/Europe v5.0 */
@@ -1414,6 +1522,7 @@ ROM_START( wolffang ) /* Japan */
ROM_LOAD( "hb-00.11p", 0x00000, 0x200, CRC(b7a7baad) SHA1(39781c3412493b985d3616ac31142fc00bbcddf4) ) /* ? */
ROM_END
+
ROM_START( wizdfire )
ROM_REGION(0x200000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "je-01.3d", 0x000000, 0x20000, CRC(b6d62367) SHA1(e9521b28660f62b70e6e33c3e9cf345fc106eff6) ) /* Version 2.1 Over Sea */
@@ -1686,6 +1795,7 @@ ROM_START( gunball )
ROM_LOAD( "jn-00.17l", 0x00000, 0x400, CRC(6ac77b84) SHA1(9e1e2cabdb20b819e592a0f07d15658062227fa4) ) /* Priority (unused) */
ROM_END
+
ROM_START( schmeisr )
ROM_REGION(0x100000, "maincpu", 0 ) /* 68000 code */
ROM_LOAD16_BYTE( "sr001j.8a", 0x000000, 0x80000, CRC(ed31f3ff) SHA1(3e0ae92a07ef94f377730c19069560bda864a64b) )
@@ -1721,6 +1831,49 @@ ROM_START( schmeisr )
ROM_LOAD( "hb-00.11p", 0x00000, 0x200, CRC(b7a7baad) SHA1(39781c3412493b985d3616ac31142fc00bbcddf4) )
ROM_END
+
+ROM_START( hangzo ) /* Found on a Data East DE-0353-3 PCB */
+ ROM_REGION(0x200000, "maincpu", 0 ) /* 68000 code */
+ ROM_LOAD16_BYTE( "Pro0H 12.18.2A.27C1001", 0x000000, 0x20000, CRC(ac8087db) SHA1(518193372cde6024fda96c6ed1862245e0bfb465) )
+ ROM_LOAD16_BYTE( "Pro0H 12.18.2D.27C1001", 0x000001, 0x20000, CRC(a6b7f4f4) SHA1(1b3a00ef124d130317171d9042018fbb30662fec) )
+ ROM_LOAD16_BYTE( "Pro1H 12.10.4A.27C010", 0x040000, 0x20000, CRC(0d04f43d) SHA1(167b595450f6f9b842dc909f6c61a96fa34b7991) )
+ ROM_LOAD16_BYTE( "Pro1L 12.10.4D.27C010", 0x040001, 0x20000, CRC(2e323918) SHA1(f3d9168f395e835b075dfcbb0464770044d350f3) )
+ ROM_LOAD16_BYTE( "Pro2H 12.10.6A.27C010", 0x080000, 0x20000, CRC(bb3185a6) SHA1(fa4ba7b4b53a5b3486c36441463a290b12c2acbe) )
+ ROM_LOAD16_BYTE( "Pro2L 12.10.6D.27C010", 0x080001, 0x20000, CRC(11ce97bb) SHA1(d9c1872762f9acaeed1ebc640a71fa7a4b9d013c) )
+
+ ROM_REGION(0x10000, "audiocpu", 0 ) /* Sound CPU */
+ ROM_LOAD( "SND 12.18.18P.27C512", 0x00000, 0x10000, CRC(97c592dc) SHA1(7a0e08f3ffd42d07d1d0a9db52c7fd85dba28bd8) )
+
+ ROM_REGION( 0x040000, "gfx1", ROMREGION_ERASEFF )
+ /* filled in later */
+
+ ROM_REGION( 0x100000, "gfx2", 0 )
+ ROM_LOAD( "BK1L 12.10.9A.574200", 0x000000, 0x080000, CRC(5199729b) SHA1(1cb8e7b91e5d0b3a699e47b6bbb3e6e9c53c8590) ) /* Encrypted tiles */
+ ROM_LOAD( "BK1H 12.10.11A.574200", 0x080000, 0x080000, CRC(85887bd8) SHA1(6cb6f9c9e6e5824c6b8006ab195f27014031907e) )
+
+ ROM_REGION( 0x200000, "gfx3", 0 )
+ ROM_LOAD( "BK23L 12.10.17D.574200", 0x000000, 0x080000, CRC(ed4e47c6) SHA1(b09ed1a6bf1b42139c7817bae18cd5580c42cf91) ) /* tiles 1 & 2 */
+ ROM_LOAD( "BK23H 12.10.18D.574200", 0x100000, 0x080000, CRC(6a725fb2) SHA1(f4da4da62eb7e3ec2f1a54b57eaf94dc748dec68) )
+
+ ROM_REGION( 0x400000, "gfx4", 0 )
+ ROM_LOAD( "OBJ01L 12.10.19A.27C4000", 0x000000, 0x080000, CRC(c141e310) SHA1(81eb0b977aaf44a110a663416e385ca617de8f28) ) /* 6bpp sprites */
+ ROM_LOAD( "OBJ01H 12.10.20A.27C4000", 0x100000, 0x080000, CRC(6a7b4252) SHA1(4bd588bc96c07cc9367afdeab4976af6f8dcc823) )
+ ROM_LOAD( "OBJ23L 12.10.19D.27C4000", 0x200000, 0x080000, CRC(0db6df6c) SHA1(fe7ef7b5a279656d9e46334c4833ab8911caa5db) )
+ ROM_LOAD( "OBJ23H 12.10.20D.27C4000", 0x300000, 0x080000, CRC(165031a1) SHA1(0e88fe45fd78d352fdbd398c1d98feefe1b43917) )
+
+ ROM_REGION(0x80000, "oki2", 0 ) /* Oki samples */
+ ROM_LOAD( "PCM16K 11.5.14P.574000", 0x00000, 0x80000, CRC(5b95c6c7) SHA1(587e7f87d085af3a5d24f317fffc1716c8027e43) )
+
+ ROM_REGION(0x80000, "oki1", 0 ) /* Oki samples */
+ ROM_LOAD( "PCM8K 11.5.15P.27C020", 0x00000, 0x40000, CRC(02682a9a) SHA1(914ffc7c16e90c1ac28a228df415a956684f8192) )
+
+ ROM_REGION( 512, "proms", ROMREGION_ERASEFF )
+ ROM_LOAD( "hb-00.11p", 0x00000, 0x200, CRC(b7a7baad) SHA1(39781c3412493b985d3616ac31142fc00bbcddf4) ) /* ? */
+ROM_END
+
+
+
+
/**********************************************************************************/
DRIVER_INIT_MEMBER(rohga_state,rohga)
@@ -1755,6 +1908,15 @@ DRIVER_INIT_MEMBER(rohga_state,schmeisr)
deco74_decrypt_gfx(machine(), "gfx2");
}
+DRIVER_INIT_MEMBER(rohga_state,hangzo)
+{
+ const uint8_t *src = memregion("gfx2")->base();
+ uint8_t *dst = memregion("gfx1")->base();
+
+ memcpy(dst, src, 0x20000);
+ memcpy(dst + 0x20000, src + 0x80000, 0x20000);
+}
+
GAME( 1991, rohga, 0, rohga, rohga, rohga_state, rohga, ROT0, "Data East Corporation", "Rohga Armor Force (Asia/Europe v5.0)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, rohga1, rohga, rohga, rohga, rohga_state, rohga, ROT0, "Data East Corporation", "Rohga Armor Force (Asia/Europe v3.0 set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1991, rohga2, rohga, rohga, rohga, rohga_state, rohga, ROT0, "Data East Corporation", "Rohga Armor Force (Asia/Europe v3.0 set 2)", MACHINE_SUPPORTS_SAVE )
@@ -1771,3 +1933,4 @@ GAME( 1992, nitrobala, nitrobal, nitrobal, nitrobal, rohga_state, nitrobal, ROT2
GAME( 1992, gunball, nitrobal, nitrobal, nitrobal, rohga_state, nitrobal, ROT270, "Data East Corporation", "Gun Ball (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, schmeisr, 0, schmeisr, schmeisr, rohga_state, schmeisr, ROT0, "Hot-B", "Schmeiser Robo (Japan)", MACHINE_SUPPORTS_SAVE | MACHINE_NO_COCKTAIL )
+GAME( 1992, hangzo, 0, hangzo, hangzo, rohga_state, hangzo, ROT0, "Hot-B", "Hangzo (Japan, prototype)", MACHINE_SUPPORTS_SAVE ) // ROM contains a '(c)1992 Data East Corporation' string, but other sources indicate the game is by Hot-B
diff --git a/src/mame/drivers/slapfght.cpp b/src/mame/drivers/slapfght.cpp
index 65520599436..ee1b1118165 100644
--- a/src/mame/drivers/slapfght.cpp
+++ b/src/mame/drivers/slapfght.cpp
@@ -290,11 +290,15 @@ static ADDRESS_MAP_START( tigerh_map, AS_PROGRAM, 8, slapfght_state )
AM_RANGE(0xe800, 0xe800) AM_WRITE(scrollx_lo_w)
AM_RANGE(0xe801, 0xe801) AM_WRITE(scrollx_hi_w)
AM_RANGE(0xe802, 0xe802) AM_WRITE(scrolly_w)
- AM_RANGE(0xe803, 0xe803) AM_READWRITE(tigerh_mcu_r, tigerh_mcu_w)
AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(fixram_w) AM_SHARE("fixvideoram")
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(fixcol_w) AM_SHARE("fixcolorram")
ADDRESS_MAP_END
+static ADDRESS_MAP_START( tigerh_map_mcu, AS_PROGRAM, 8, slapfght_state )
+ AM_RANGE(0xe803, 0xe803) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_IMPORT_FROM( tigerh_map )
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START( tigerhb1_map, AS_PROGRAM, 8, slapfght_state )
AM_RANGE(0xe803, 0xe803) AM_READWRITE(tigerhb1_prot_r, tigerhb1_prot_w)
AM_IMPORT_FROM( tigerh_map )
@@ -317,11 +321,15 @@ static ADDRESS_MAP_START( slapfigh_map, AS_PROGRAM, 8, slapfght_state )
AM_RANGE(0xe800, 0xe800) AM_WRITE(scrollx_lo_w)
AM_RANGE(0xe801, 0xe801) AM_WRITE(scrollx_hi_w)
AM_RANGE(0xe802, 0xe802) AM_WRITE(scrolly_w)
- AM_RANGE(0xe803, 0xe803) AM_READWRITE(tigerh_mcu_r, tigerh_mcu_w)
AM_RANGE(0xf000, 0xf7ff) AM_RAM_WRITE(fixram_w) AM_SHARE("fixvideoram")
AM_RANGE(0xf800, 0xffff) AM_RAM_WRITE(fixcol_w) AM_SHARE("fixcolorram")
ADDRESS_MAP_END
+static ADDRESS_MAP_START( slapfigh_map_mcu, AS_PROGRAM, 8, slapfght_state )
+ AM_RANGE(0xe803, 0xe803) AM_DEVREADWRITE("bmcu", taito68705_mcu_device, mcu_r, mcu_w)
+ AM_IMPORT_FROM( slapfigh_map )
+ADDRESS_MAP_END
+
static ADDRESS_MAP_START( slapfighb1_map, AS_PROGRAM, 8, slapfght_state )
AM_RANGE(0xe803, 0xe803) AM_NOP // no MCU
AM_IMPORT_FROM( slapfigh_map )
@@ -733,13 +741,7 @@ void slapfght_state::machine_start()
m_main_irq_enabled = false;
m_sound_nmi_enabled = false;
- m_mcu_sent = false;
- m_main_sent = false;
- m_from_main = 0;
- m_from_mcu = 0;
- m_from_mcu_latch = 0;
- m_to_mcu_latch = 0;
- m_old_portB = 0;
+
m_getstar_status = 0;
m_getstar_sequence_index = 0;
@@ -758,14 +760,6 @@ void slapfght_state::machine_start()
save_item(NAME(m_main_irq_enabled));
save_item(NAME(m_sound_nmi_enabled));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
-
- save_item(NAME(m_from_mcu_latch));
- save_item(NAME(m_to_mcu_latch));
- save_item(NAME(m_old_portB));
save_item(NAME(m_getstar_status));
save_item(NAME(m_getstar_sequence_index));
@@ -791,7 +785,7 @@ void slapfght_state::machine_reset()
MACHINE_RESET_MEMBER(slapfght_state,getstar)
{
// don't boot the mcu since we don't have a dump yet
- m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+// m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
machine_reset();
}
@@ -978,7 +972,7 @@ static MACHINE_CONFIG_START( tigerh, slapfght_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_36MHz/6) // 6MHz
- MCFG_CPU_PROGRAM_MAP(tigerh_map)
+ MCFG_CPU_PROGRAM_MAP(tigerh_map_mcu)
MCFG_CPU_IO_MAP(tigerh_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", slapfght_state, vblank_irq)
@@ -986,13 +980,7 @@ static MACHINE_CONFIG_START( tigerh, slapfght_state )
MCFG_CPU_PROGRAM_MAP(tigerh_sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(slapfght_state, sound_nmi, 360) // music speed, verified with pcb recording
- MCFG_CPU_ADD("mcu", M68705_NEW, XTAL_36MHz/12) // 3MHz
- MCFG_M68705_PORTA_R_CB(READ8(slapfght_state, tigerh_mcu_porta_r))
- MCFG_M68705_PORTA_W_CB(WRITE8(slapfght_state, tigerh_mcu_porta_w))
- MCFG_M68705_PORTB_W_CB(WRITE8(slapfght_state, tigerh_mcu_portb_w))
- MCFG_M68705_PORTC_R_CB(READ8(slapfght_state, tigerh_mcu_portc_r))
-
-
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU_TIGER, XTAL_36MHz/12) // 3MHz
MCFG_QUANTUM_PERFECT_CPU("maincpu")
@@ -1033,7 +1021,7 @@ static MACHINE_CONFIG_DERIVED( tigerhb1, tigerh )
MCFG_CPU_PROGRAM_MAP(tigerhb1_map)
MCFG_CPU_IO_MAP(tigerhb_io_map)
- MCFG_DEVICE_REMOVE("mcu")
+ MCFG_DEVICE_REMOVE("bmcu")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( tigerhb2, tigerhb1 )
@@ -1048,7 +1036,7 @@ static MACHINE_CONFIG_START( slapfigh, slapfght_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",Z80, XTAL_36MHz/6) // 6MHz
- MCFG_CPU_PROGRAM_MAP(slapfigh_map)
+ MCFG_CPU_PROGRAM_MAP(slapfigh_map_mcu)
MCFG_CPU_IO_MAP(slapfigh_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", slapfght_state, vblank_irq)
@@ -1056,11 +1044,8 @@ static MACHINE_CONFIG_START( slapfigh, slapfght_state )
MCFG_CPU_PROGRAM_MAP(tigerh_sound_map)
MCFG_CPU_PERIODIC_INT_DRIVER(slapfght_state, sound_nmi, 180)
- MCFG_CPU_ADD("mcu", M68705_NEW, XTAL_36MHz/12) // 3MHz
- MCFG_M68705_PORTA_R_CB(READ8(slapfght_state, tigerh_mcu_porta_r))
- MCFG_M68705_PORTA_W_CB(WRITE8(slapfght_state, tigerh_mcu_porta_w))
- MCFG_M68705_PORTB_W_CB(WRITE8(slapfght_state, slapfght_mcu_portb_w))
- MCFG_M68705_PORTC_R_CB(READ8(slapfght_state, slapfght_mcu_portc_r))
+ MCFG_DEVICE_ADD("bmcu", TAITO68705_MCU_SLAP, XTAL_36MHz/12) // 3MHz
+ MCFG_TAITO_M68705_EXTENSION_CB(WRITE8(slapfght_state, scroll_from_mcu_w))
MCFG_QUANTUM_PERFECT_CPU("maincpu")
@@ -1101,7 +1086,7 @@ static MACHINE_CONFIG_DERIVED( slapfighb1, slapfigh )
MCFG_CPU_PROGRAM_MAP(slapfighb1_map)
MCFG_CPU_IO_MAP(slapfighb1_io_map)
- MCFG_DEVICE_REMOVE("mcu")
+ MCFG_DEVICE_REMOVE("bmcu")
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( slapfighb2, slapfighb1 )
@@ -1118,6 +1103,9 @@ static MACHINE_CONFIG_DERIVED( getstar, slapfigh )
MCFG_CPU_PROGRAM_MAP(getstar_map)
MCFG_CPU_IO_MAP(getstar_io_map)
+ MCFG_DEVICE_MODIFY("bmcu:mcu")
+ MCFG_DEVICE_DISABLE()
+
MCFG_MACHINE_RESET_OVERRIDE(slapfght_state, getstar)
MACHINE_CONFIG_END
@@ -1302,7 +1290,7 @@ ROM_START( tigerh )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a47_03.12d", 0x0000, 0x2000, CRC(d105260f) SHA1(f6a0e393e29354bb37fb723828f3267d030a45ea) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a47_14.6a", 0x0000, 0x0800, CRC(4042489f) SHA1(b977e0821b6b1aa5a0a0f349cd78150af1a231df) )
ROM_REGION( 0x04000, "gfx1", 0 )
@@ -1339,7 +1327,7 @@ ROM_START( tigerhj )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a47_03.12d", 0x0000, 0x2000, CRC(d105260f) SHA1(f6a0e393e29354bb37fb723828f3267d030a45ea) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a47_14.6a", 0x0000, 0x0800, CRC(4042489f) SHA1(b977e0821b6b1aa5a0a0f349cd78150af1a231df) )
ROM_REGION( 0x04000, "gfx1", 0 )
@@ -1561,7 +1549,7 @@ ROM_START( alcon )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a77_02.12d", 0x0000, 0x2000, CRC(87f4705a) SHA1(a90d5644ce268f3321047a4f96df96ac294d2f1b) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a77_13.6a", 0x0000, 0x0800, CRC(a70c81d9) SHA1(f155ffd25a946b0459216a8f80ded16e6e2f9258) )
ROM_REGION( 0x04000, "gfx1", 0 )
@@ -1595,7 +1583,7 @@ ROM_START( slapfigh )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a77_02.12d", 0x0000, 0x2000, CRC(87f4705a) SHA1(a90d5644ce268f3321047a4f96df96ac294d2f1b) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a77_13.6a", 0x0000, 0x0800, CRC(a70c81d9) SHA1(f155ffd25a946b0459216a8f80ded16e6e2f9258) )
ROM_REGION( 0x04000, "gfx1", 0 )
@@ -1637,7 +1625,7 @@ ROM_START( slapfigha )
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "a76_03.12d", 0x0000, 0x2000, CRC(87f4705a) SHA1(a90d5644ce268f3321047a4f96df96ac294d2f1b) )
- ROM_REGION( 0x0800, "mcu", 0 )
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 )
ROM_LOAD( "a76_14.6a", 0x0000, 0x0800, NO_DUMP ) /* A77 MCU not compatible with this set */
ROM_REGION( 0x04000, "gfx1", 0 )
@@ -1899,7 +1887,7 @@ ROM_START( grdian )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Region 3 - sound cpu code */
ROM_LOAD( "a68-03.12d", 0x0000, 0x2000, CRC(18daa44c) SHA1(1a3d22a186c591321d1b836ee30d89fba4771122) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "a68_14.6a", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x04000, "gfx1", 0 ) /* Region 1 - temporary for gfx */
@@ -1933,7 +1921,7 @@ ROM_START( getstarj )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* Region 3 - sound cpu code */
ROM_LOAD( "a68-03.12d", 0x00000, 0x2000, CRC(18daa44c) SHA1(1a3d22a186c591321d1b836ee30d89fba4771122) )
- ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_REGION( 0x0800, "bmcu:mcu", 0 ) /* 2k for the microcontroller */
ROM_LOAD( "68705.6a", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x04000, "gfx1", 0 ) /* Region 1 - temporary for gfx */
diff --git a/src/mame/drivers/vd.cpp b/src/mame/drivers/vd.cpp
index ee0385c6156..84521e20623 100644
--- a/src/mame/drivers/vd.cpp
+++ b/src/mame/drivers/vd.cpp
@@ -5,10 +5,13 @@
PINBALL
Videodens
- PinMAME used as reference (unable to find any info at all on the net).
+ PinMAME used as reference. The Break '86 manual scan available on the net includes
+ a mostly illegible schematic.
Nothing in this driver is confirmed except where noted.
+ Ator runs on different hardware (peyper.cpp).
+
***************************************************************************************/
@@ -25,7 +28,7 @@ public:
m_maincpu(*this, "maincpu")
{ }
- DECLARE_READ8_MEMBER(dsw_r) { return 0; }
+ DECLARE_READ8_MEMBER(ack_r);
DECLARE_WRITE8_MEMBER(col_w);
DECLARE_WRITE8_MEMBER(disp_w);
DECLARE_WRITE8_MEMBER(lamp_w) { };
@@ -44,6 +47,12 @@ private:
};
+READ8_MEMBER(vd_state::ack_r)
+{
+ m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); // guess
+ return 0; // this value is not used
+}
+
static ADDRESS_MAP_START( vd_map, AS_PROGRAM, 8, vd_state )
AM_RANGE(0x0000, 0x5fff) AM_ROM
AM_RANGE(0x6000, 0x62ff) AM_RAM
@@ -52,49 +61,68 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( vd_io, AS_IO, 8, vd_state )
ADDRESS_MAP_GLOBAL_MASK(0xff)
- AM_RANGE(0x00,0x00) AM_READ_PORT("X0")
- AM_RANGE(0x01,0x01) AM_READ_PORT("X1")
- AM_RANGE(0x02,0x02) AM_READ_PORT("X2")
- AM_RANGE(0x03,0x03) AM_READ_PORT("X3")
- AM_RANGE(0x04,0x04) AM_READ_PORT("X4")
- AM_RANGE(0x05,0x05) AM_READ_PORT("X5")
- AM_RANGE(0x20,0x27) AM_WRITE(lamp_w)
- AM_RANGE(0x28,0x28) AM_WRITE(sol_w)
- AM_RANGE(0x40,0x44) AM_WRITE(disp_w)
- AM_RANGE(0x60,0x60) AM_DEVWRITE("ay1", ay8910_device, address_w)
- AM_RANGE(0x61,0x61) AM_READ_PORT("DSW") //AM_READ(dsw_r)
- AM_RANGE(0x62,0x62) AM_DEVWRITE("ay1", ay8910_device, data_w)
- AM_RANGE(0x80,0x80) AM_DEVWRITE("ay2", ay8910_device, address_w)
- AM_RANGE(0x82,0x82) AM_DEVWRITE("ay2", ay8910_device, data_w)
- AM_RANGE(0xa0,0xa0) AM_DEVREAD("ay2", ay8910_device, data_r)
- AM_RANGE(0xc0,0xc0) AM_WRITE(col_w)
+ AM_RANGE(0x00, 0x00) AM_READ_PORT("X0")
+ AM_RANGE(0x01, 0x01) AM_READ_PORT("X1")
+ AM_RANGE(0x02, 0x02) AM_READ_PORT("X2")
+ AM_RANGE(0x03, 0x03) AM_READ_PORT("X3")
+ AM_RANGE(0x04, 0x04) AM_READ_PORT("X4")
+ AM_RANGE(0x05, 0x05) AM_READ_PORT("X5")
+ AM_RANGE(0x20, 0x27) AM_WRITE(lamp_w)
+ AM_RANGE(0x28, 0x28) AM_WRITE(sol_w)
+ AM_RANGE(0x40, 0x44) AM_WRITE(disp_w)
+ AM_RANGE(0x60, 0x60) AM_DEVWRITE("ay1", ay8910_device, address_w)
+ AM_RANGE(0x61, 0x61) AM_DEVREAD("ay1", ay8910_device, data_r)
+ AM_RANGE(0x62, 0x62) AM_DEVWRITE("ay1", ay8910_device, data_w)
+ AM_RANGE(0x80, 0x80) AM_DEVWRITE("ay2", ay8910_device, address_w)
+ AM_RANGE(0x81, 0x81) AM_DEVREAD("ay2", ay8910_device, data_r) // probably never read
+ AM_RANGE(0x82, 0x82) AM_DEVWRITE("ay2", ay8910_device, data_w)
+ AM_RANGE(0xa0, 0xa0) AM_READ(ack_r)
+ AM_RANGE(0xc0, 0xc0) AM_WRITE(col_w)
ADDRESS_MAP_END
-static INPUT_PORTS_START( vd )
- PORT_START("DSW")
- PORT_DIPNAME( 0x0001, 0x0000, "Accounting #1")
- PORT_DIPSETTING(0x0000, DEF_STR(Off))
- PORT_DIPSETTING(0x0001, DEF_STR(On))
- PORT_DIPNAME( 0x0002, 0x0000, "Accounting #2")
- PORT_DIPSETTING(0x0000, DEF_STR(Off))
- PORT_DIPSETTING(0x0002, DEF_STR(On))
- PORT_DIPNAME( 0x0004, 0x0000, "Accounting #3")
- PORT_DIPSETTING(0x0000, DEF_STR(Off))
- PORT_DIPSETTING(0x0004, DEF_STR(On))
- PORT_DIPNAME( 0x0018, 0x0000, "Credits per coin (chute #1/#2)")
- PORT_DIPSETTING(0x0018, "0.5/3" )
- PORT_DIPSETTING(0x0000, "1/5" )
- PORT_DIPSETTING(0x0008, "1/6" )
- PORT_DIPSETTING(0x0010, "2/8" )
- PORT_DIPNAME( 0x0020, 0x0000, "S6")
- PORT_DIPSETTING(0x0000, "0" )
- PORT_DIPSETTING(0x0020, "1" )
- PORT_DIPNAME( 0x0040, 0x0000, "Match feature")
- PORT_DIPSETTING(0x0040, DEF_STR(Off))
- PORT_DIPSETTING(0x0000, DEF_STR(On))
- PORT_DIPNAME( 0x0080, 0x0000, "S8")
- PORT_DIPSETTING(0x0000, "0" )
- PORT_DIPSETTING(0x0080, "1" )
+static INPUT_PORTS_START( break86 )
+ PORT_START("DSW1") // "Micro Swicher Nº 1"
+ PORT_DIPUNKNOWN(0x01, 0x01) PORT_DIPLOCATION("SW1:8") // used but not described in service manual
+ PORT_DIPUNKNOWN(0x02, 0x02) PORT_DIPLOCATION("SW1:7") // used but not described in service manual
+ PORT_DIPUNKNOWN(0x04, 0x04) PORT_DIPLOCATION("SW1:6") // used but not described in service manual
+ PORT_DIPUNUSED(0x08, 0x08) PORT_DIPLOCATION("SW1:5")
+ PORT_DIPNAME(0x30, 0x30, "Power Bumpers") PORT_DIPLOCATION("SW1:4,3") // "Potencia Bu????s" (partly illegible)
+ PORT_DIPSETTING(0x00, "4")
+ PORT_DIPSETTING(0x10, "6")
+ PORT_DIPSETTING(0x20, "8")
+ PORT_DIPSETTING(0x30, "10")
+ PORT_DIPNAME(0xc0, 0xc0, "Bonus Balls") PORT_DIPLOCATION("SW1:2,1") // "Bonos Bola Extra" - "Nº de Bonos"
+ PORT_DIPSETTING(0xc0, "6")
+ PORT_DIPSETTING(0x80, "8")
+ PORT_DIPSETTING(0x40, "10")
+ PORT_DIPSETTING(0x00, "12")
+
+ PORT_START("DSW2") // "Micro Swicher Nº 2"
+ PORT_DIPNAME(0x03, 0x03, "Scoring") PORT_DIPLOCATION("SW2:8,7") // "Tanteo"
+ PORT_DIPSETTING(0x03, "800k / 1.4M / 2.0M / 2.6M") // = "Bola Extra," "1ª Partida," "2ª Partida," "High Score"
+ PORT_DIPSETTING(0x02, "1.0M / 1.6M / 2.2M / 2.8M")
+ PORT_DIPSETTING(0x01, "1.2M / 1.8M / 2.4M / 3.0M")
+ PORT_DIPSETTING(0x00, "1.4M / 2.0M / 2.6M / 3.2M")
+ PORT_DIPNAME(0x04, 0x04, "Balls/Game") PORT_DIPLOCATION("SW2:6") // "Bolas-Partida"
+ PORT_DIPSETTING(0x04, "3")
+ PORT_DIPSETTING(0x00, "5")
+ PORT_DIPNAME(0x18, 0x18, DEF_STR(Coinage)) PORT_DIPLOCATION("SW2:5,4") // "Monederos"
+ PORT_DIPSETTING(0x18, "25 Pts. = 1, 100 Pts. = 5")
+ PORT_DIPSETTING(0x10, "25 Pts. = 1, 100 Pts. = 6")
+ PORT_DIPSETTING(0x08, "25 Pts. = 2, 100 Pts. = 8")
+ PORT_DIPSETTING(0x00, "25 Pts. = 1/2, 100 Pts. = 3")
+ PORT_DIPNAME(0x20, 0x20, "Lottery") PORT_DIPLOCATION("SW2:3") // "Loteria"
+ PORT_DIPSETTING(0x00, DEF_STR(No))
+ PORT_DIPSETTING(0x20, DEF_STR(Yes))
+ PORT_DIPNAME(0x40, 0x40, "Musica-Reclamo") PORT_DIPLOCATION("SW2:2")
+ PORT_DIPSETTING(0x00, DEF_STR(No))
+ PORT_DIPSETTING(0x40, DEF_STR(Yes))
+ PORT_DIPNAME(0x80, 0x80, "Extra Ball/Score") PORT_DIPLOCATION("SW2:1") // "Bola Extra-Tanteo"
+ PORT_DIPSETTING(0x00, DEF_STR(No))
+ PORT_DIPSETTING(0x80, DEF_STR(Yes))
+
+ PORT_START("DSW3")
+ PORT_BIT(0xff, IP_ACTIVE_LOW, IPT_UNUSED) // SW3 not populated
PORT_START("X0")
PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_START1)
@@ -109,6 +137,10 @@ static INPUT_PORTS_START( vd )
PORT_START("X5")
INPUT_PORTS_END
+static INPUT_PORTS_START( papillon )
+ PORT_INCLUDE( break86 ) // differences unknown
+INPUT_PORTS_END
+
TIMER_DEVICE_CALLBACK_MEMBER( vd_state::irq )
{
if (m_t_c > 40)
@@ -120,8 +152,10 @@ TIMER_DEVICE_CALLBACK_MEMBER( vd_state::irq )
WRITE8_MEMBER( vd_state::disp_w )
{
segment[offset] = data;
+#if 0 // probably not how this works
if (!offset)
m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
+#endif
}
WRITE8_MEMBER( vd_state::col_w )
@@ -154,8 +188,11 @@ static MACHINE_CONFIG_START( vd, vd_state )
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("ay1", AY8910, 2000000) //?
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.33/3)
+ MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW2"))
+ MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW1"))
MCFG_SOUND_ADD("ay2", AY8910, 2000000) //?
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.33/3)
+ MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW3")) //?
/* Video */
MCFG_DEFAULT_LAYOUT(layout_vd)
@@ -163,6 +200,10 @@ MACHINE_CONFIG_END
/*-------------------------------------------------------------------
/ Break '86 (1986)
+/
+/ The title of this game is somewhat uncertain. The backglass says
+/ only "Break," the flyer also calls it "Super Break" and "Super
+/ Break '86", and the service manual's title page has "Modbreak."
/-------------------------------------------------------------------*/
ROM_START(break86)
ROM_REGION(0x10000, "maincpu", 0)
@@ -181,18 +222,6 @@ ROM_START(papillon)
ROM_LOAD("u6.dat", 0x4000, 0x2000, CRC(6b2867b3) SHA1(720fe8a65b447e839b0eb9ea21e0b3cb0e50cf7a))
ROM_END
-#if 0
-/*-------------------------------------------------------------------
-/ Ator (19??)
-/-------------------------------------------------------------------*/
-ROM_START(ator)
- ROM_REGION(0x10000, "maincpu", 0)
- ROM_LOAD("ator.u4", 0x0000, 0x2000, NO_DUMP)
- ROM_LOAD("ator.u5", 0x2000, 0x2000, NO_DUMP)
- ROM_LOAD("ator.u6", 0x4000, 0x2000, CRC(21aad5c4) SHA1(e78da5d80682710db34cbbfeae5af54241c73371))
-ROM_END
-#endif
-//GAME(19??, ator, 0, vd, vd, driver_device, 0, ROT0, "Videodens", "Ator", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, break86, 0, vd, vd, driver_device, 0, ROT0, "Videodens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
-GAME(1986, papillon, 0, vd, vd, driver_device, 0, ROT0, "Videodens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, break86, 0, vd, break86, driver_device, 0, ROT0, "Videodens", "Break '86", MACHINE_IS_SKELETON_MECHANICAL)
+GAME(1986, papillon, 0, vd, papillon, driver_device, 0, ROT0, "Videodens", "Papillon", MACHINE_IS_SKELETON_MECHANICAL)
diff --git a/src/mame/includes/40love.h b/src/mame/includes/40love.h
index 0cd5f127251..c420887828d 100644
--- a/src/mame/includes/40love.h
+++ b/src/mame/includes/40love.h
@@ -1,7 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
-#include "machine/buggychl.h"
+#include "machine/taito68705interface.h"
#include "machine/gen_latch.h"
#include "sound/msm5232.h"
@@ -18,7 +18,6 @@ public:
m_mcu_ram(*this, "mcu_ram"),
m_audiocpu(*this, "audiocpu"),
m_maincpu(*this, "maincpu"),
- m_mcu(*this, "mcu"),
m_bmcu(*this, "bmcu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
@@ -75,8 +74,7 @@ public:
/* devices */
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_maincpu;
- optional_device<cpu_device> m_mcu;
- optional_device<buggychl_mcu_device> m_bmcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/aerofgt.h b/src/mame/includes/aerofgt.h
index 8a7b75f2f07..7404cd3d689 100644
--- a/src/mame/includes/aerofgt.h
+++ b/src/mame/includes/aerofgt.h
@@ -78,27 +78,26 @@ public:
int m_pending_command;
/* handlers */
- DECLARE_WRITE16_MEMBER(sound_command_w);
- DECLARE_WRITE16_MEMBER(turbofrc_sound_command_w);
- DECLARE_WRITE16_MEMBER(aerfboot_soundlatch_w);
- DECLARE_READ16_MEMBER(pending_command_r);
+ DECLARE_WRITE8_MEMBER(sound_command_w);
+ DECLARE_WRITE8_MEMBER(aerfboot_soundlatch_w);
+ DECLARE_READ8_MEMBER(pending_command_r);
DECLARE_WRITE8_MEMBER(pending_command_clear_w);
DECLARE_WRITE8_MEMBER(aerofgt_sh_bankswitch_w);
DECLARE_WRITE8_MEMBER(aerfboot_okim6295_banking_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg1videoram_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg2videoram_w);
- DECLARE_WRITE16_MEMBER(pspikes_gfxbank_w);
+ DECLARE_WRITE8_MEMBER(pspikes_gfxbank_w);
DECLARE_WRITE16_MEMBER(pspikesb_gfxbank_w);
DECLARE_WRITE16_MEMBER(spikes91_lookup_w);
- DECLARE_WRITE16_MEMBER(karatblz_gfxbank_w);
- DECLARE_WRITE16_MEMBER(spinlbrk_gfxbank_w);
+ DECLARE_WRITE8_MEMBER(karatblz_gfxbank_w);
+ DECLARE_WRITE8_MEMBER(spinlbrk_gfxbank_w);
DECLARE_WRITE16_MEMBER(turbofrc_gfxbank_w);
DECLARE_WRITE16_MEMBER(aerofgt_gfxbank_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg1scrollx_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg1scrolly_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg2scrollx_w);
DECLARE_WRITE16_MEMBER(aerofgt_bg2scrolly_w);
- DECLARE_WRITE16_MEMBER(pspikes_palette_bank_w);
+ DECLARE_WRITE8_MEMBER(pspikes_palette_bank_w);
DECLARE_WRITE16_MEMBER(wbbc97_bitmap_enable_w);
DECLARE_WRITE16_MEMBER(pspikesb_oki_banking_w);
DECLARE_WRITE16_MEMBER(aerfboo2_okim6295_banking_w);
diff --git a/src/mame/includes/apollo.h b/src/mame/includes/apollo.h
index f51e422f35f..6bfd8ec7c3f 100644
--- a/src/mame/includes/apollo.h
+++ b/src/mame/includes/apollo.h
@@ -326,18 +326,17 @@ void apollo_csr_set_status_register(uint16_t mask, uint16_t data);
class apollo_sio: public mc68681_device
{
public:
- apollo_sio(const machine_config &mconfig, const char *tag,
- device_t *owner, uint32_t clock);
+ apollo_sio(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(read);
- DECLARE_WRITE8_MEMBER(write);
+ virtual DECLARE_READ8_MEMBER(read) override;
+ virtual DECLARE_WRITE8_MEMBER(write) override;
protected:
virtual void device_reset() override;
private:
- uint8_t m_csrb;
- uint8_t m_ip6;
+ uint8_t m_csrb;
+ uint8_t m_ip6;
};
extern const device_type APOLLO_SIO;
diff --git a/src/mame/includes/ashnojoe.h b/src/mame/includes/ashnojoe.h
index 74dbac38522..4735df63f43 100644
--- a/src/mame/includes/ashnojoe.h
+++ b/src/mame/includes/ashnojoe.h
@@ -51,7 +51,6 @@ public:
/* sound-related */
uint8_t m_adpcm_byte;
- int m_soundlatch_status;
int m_msm5205_vclk_toggle;
/* devices */
@@ -62,9 +61,7 @@ public:
required_device<generic_latch_8_device> m_soundlatch;
DECLARE_READ16_MEMBER(fake_4a00a_r);
- DECLARE_WRITE16_MEMBER(ashnojoe_soundlatch_w);
DECLARE_WRITE8_MEMBER(adpcm_w);
- DECLARE_READ8_MEMBER(sound_latch_r);
DECLARE_READ8_MEMBER(sound_latch_status_r);
DECLARE_WRITE16_MEMBER(ashnojoe_tileram_w);
DECLARE_WRITE16_MEMBER(ashnojoe_tileram2_w);
diff --git a/src/mame/includes/asuka.h b/src/mame/includes/asuka.h
index e2503666fc1..8dbd790738e 100644
--- a/src/mame/includes/asuka.h
+++ b/src/mame/includes/asuka.h
@@ -8,6 +8,7 @@
#include "machine/taitoio.h"
#include "sound/msm5205.h"
+#include "machine/74157.h"
#include "video/pc090oj.h"
#include "video/tc0100scn.h"
#include "video/tc0110pcr.h"
@@ -26,26 +27,28 @@ public:
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_msm(*this, "msm"),
+ m_adpcm_select(*this, "adpcm_select"),
+ m_sound_data(*this, "ymsnd"),
m_pc090oj(*this, "pc090oj"),
m_tc0100scn(*this, "tc0100scn"),
m_tc0110pcr(*this, "tc0110pcr"),
m_tc0220ioc(*this, "tc0220ioc") { }
/* video-related */
- uint16_t m_video_ctrl;
- uint16_t m_video_mask;
+ u16 m_video_ctrl;
+ u16 m_video_mask;
/* c-chip */
int m_current_round;
int m_current_bank;
- uint8_t m_cval[26];
- uint8_t m_cc_port;
- uint8_t m_restart_status;
+ u8 m_cval[26];
+ u8 m_cc_port;
+ u8 m_restart_status;
/* misc */
- int m_adpcm_pos;
- int m_adpcm_data;
+ u16 m_adpcm_pos;
+ bool m_adpcm_ff;
optional_shared_ptr<uint8_t> m_cadash_shared_ram;
@@ -53,6 +56,8 @@ public:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<msm5205_device> m_msm;
+ optional_device<ls157_device> m_adpcm_select;
+ optional_region_ptr<u8> m_sound_data;
required_device<pc090oj_device> m_pc090oj;
required_device<tc0100scn_device> m_tc0100scn;
required_device<tc0110pcr_device> m_tc0110pcr;
diff --git a/src/mame/includes/bigevglf.h b/src/mame/includes/bigevglf.h
index c450bf05c5d..f8cc2b1591e 100644
--- a/src/mame/includes/bigevglf.h
+++ b/src/mame/includes/bigevglf.h
@@ -1,6 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Jarek Burczynski, Tomasz Slanina
#include "sound/msm5232.h"
+#include "machine/taito68705interface.h"
class bigevglf_state : public driver_device
{
@@ -11,7 +12,7 @@ public:
m_spriteram1(*this, "spriteram1"),
m_spriteram2(*this, "spriteram2"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
@@ -38,18 +39,6 @@ public:
uint8_t m_sound_state;
/* MCU related */
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
- uint8_t m_port_c_in;
- uint8_t m_port_c_out;
- uint8_t m_ddr_c;
int m_mcu_coin_bit5;
/* misc */
@@ -59,7 +48,7 @@ public:
/* devices */
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
DECLARE_WRITE8_MEMBER(beg_banking_w);
DECLARE_WRITE8_MEMBER(beg_fromsound_w);
DECLARE_READ8_MEMBER(beg_fromsound_r);
diff --git a/src/mame/includes/bking.h b/src/mame/includes/bking.h
index 50b8e4467c2..03b13033fe3 100644
--- a/src/mame/includes/bking.h
+++ b/src/mame/includes/bking.h
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:Mike Balfour, Zsolt Vasvari
-#include "machine/buggychl.h"
+#include "machine/taito68705interface.h"
#include "machine/gen_latch.h"
class bking_state : public driver_device
@@ -11,7 +11,6 @@ public:
: driver_device(mconfig, type, tag),
m_playfield_ram(*this, "playfield_ram"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
m_bmcu(*this, "bmcu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
@@ -51,22 +50,12 @@ public:
/* devices */
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
- optional_device<buggychl_mcu_device> m_bmcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
-#if 0
- /* 68705 */
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
-#endif
DECLARE_READ8_MEMBER(bking_sndnmi_disable_r);
DECLARE_WRITE8_MEMBER(bking_sndnmi_enable_w);
DECLARE_WRITE8_MEMBER(bking_soundlatch_w);
diff --git a/src/mame/includes/bublbobl.h b/src/mame/includes/bublbobl.h
index 26168aca158..554508c3a19 100644
--- a/src/mame/includes/bublbobl.h
+++ b/src/mame/includes/bublbobl.h
@@ -2,6 +2,7 @@
// copyright-holders:Chris Moore, Nicola Salmoria
#include "machine/gen_latch.h"
+#include "machine/taito68705interface.h"
class bublbobl_state : public driver_device
{
@@ -17,13 +18,6 @@ public:
m_videoram(*this, "videoram"),
m_objectram(*this, "objectram"),
m_mcu_sharedram(*this, "mcu_sharedram"),
- m_mcu_sent(false),
- m_main_sent(false),
- m_from_main(0),
- m_from_mcu(0),
- m_from_mcu_latch(0),
- m_to_mcu_latch(0),
- m_old_portB(0),
m_maincpu(*this, "maincpu"),
m_mcu(*this, "mcu"),
m_audiocpu(*this, "audiocpu"),
@@ -73,14 +67,6 @@ public:
/* Bobble Bobble */
int m_ic43_a;
int m_ic43_b;
- /* Tokio */
- bool m_mcu_sent;
- bool m_main_sent;
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- uint8_t m_from_mcu_latch;
- uint8_t m_to_mcu_latch;
- uint8_t m_old_portB;
/* devices */
required_device<cpu_device> m_maincpu;
@@ -95,8 +81,6 @@ public:
DECLARE_WRITE8_MEMBER(tokio_bankswitch_w);
DECLARE_WRITE8_MEMBER(tokio_videoctrl_w);
DECLARE_WRITE8_MEMBER(bublbobl_nmitrigger_w);
- DECLARE_READ8_MEMBER(tokio_mcu_r);
- DECLARE_WRITE8_MEMBER(tokio_mcu_w);
DECLARE_READ8_MEMBER(tokiob_mcu_r);
DECLARE_WRITE8_MEMBER(bublbobl_sound_command_w);
@@ -132,20 +116,6 @@ public:
DECLARE_WRITE8_MEMBER(bublbobl_68705_port_b_w);
DECLARE_WRITE8_MEMBER(bublbobl_68705_ddr_b_w);
-
-
-
- DECLARE_CUSTOM_INPUT_MEMBER(tokio_mcu_sent_r);
- DECLARE_CUSTOM_INPUT_MEMBER(tokio_main_sent_r);
-
-
- DECLARE_READ8_MEMBER(tokio_mcu_porta_r);
- DECLARE_READ8_MEMBER(tokio_mcu_portc_r);
- DECLARE_WRITE8_MEMBER(tokio_mcu_porta_w);
- DECLARE_WRITE8_MEMBER(tokio_mcu_portb_w);
-
-
- DECLARE_DRIVER_INIT(tokiob);
DECLARE_DRIVER_INIT(tokio);
DECLARE_DRIVER_INIT(dland);
DECLARE_DRIVER_INIT(bublbobl);
diff --git a/src/mame/includes/buggychl.h b/src/mame/includes/buggychl.h
index 9f9b893bf7d..1941889a646 100644
--- a/src/mame/includes/buggychl.h
+++ b/src/mame/includes/buggychl.h
@@ -4,7 +4,7 @@
buggychl
*/
-#include "machine/buggychl.h"
+#include "machine/taito68705interface.h"
#include "machine/gen_latch.h"
#include "sound/msm5232.h"
@@ -20,7 +20,6 @@ public:
m_scrollh(*this, "scrollh"),
m_audiocpu(*this, "audiocpu"),
m_maincpu(*this, "maincpu"),
- m_mcu(*this, "mcu"),
m_bmcu(*this, "bmcu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
@@ -53,8 +52,7 @@ public:
/* devices */
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_maincpu;
- required_device<cpu_device> m_mcu;
- required_device<buggychl_mcu_device> m_bmcu;
+ required_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
diff --git a/src/mame/includes/crospang.h b/src/mame/includes/crospang.h
index 2a7b80e0059..0049f726a56 100644
--- a/src/mame/includes/crospang.h
+++ b/src/mame/includes/crospang.h
@@ -38,7 +38,6 @@ public:
required_device<gfxdecode_device> m_gfxdecode;
required_device<generic_latch_8_device> m_soundlatch;
- DECLARE_WRITE16_MEMBER(crospang_soundlatch_w);
DECLARE_WRITE16_MEMBER(bestri_tilebank_w);
DECLARE_WRITE16_MEMBER(bestri_bg_scrolly_w);
DECLARE_WRITE16_MEMBER(bestri_fg_scrolly_w);
diff --git a/src/mame/includes/crshrace.h b/src/mame/includes/crshrace.h
index 36ef377e777..9d1621000d8 100644
--- a/src/mame/includes/crshrace.h
+++ b/src/mame/includes/crshrace.h
@@ -54,7 +54,7 @@ public:
/* devices */
DECLARE_WRITE8_MEMBER(crshrace_sh_bankswitch_w);
- DECLARE_WRITE16_MEMBER(sound_command_w);
+ DECLARE_WRITE8_MEMBER(sound_command_w);
DECLARE_WRITE8_MEMBER(pending_command_clear_w);
DECLARE_WRITE16_MEMBER(crshrace_videoram1_w);
DECLARE_WRITE16_MEMBER(crshrace_videoram2_w);
diff --git a/src/mame/includes/dcheese.h b/src/mame/includes/dcheese.h
index 396cd2fc0db..853a3b46a83 100644
--- a/src/mame/includes/dcheese.h
+++ b/src/mame/includes/dcheese.h
@@ -38,7 +38,6 @@ public:
/* misc */
uint8_t m_irq_state[5];
- uint8_t m_soundlatch_full;
uint8_t m_sound_control;
uint8_t m_sound_msb_latch;
@@ -50,8 +49,6 @@ public:
required_device<generic_latch_8_device> m_soundlatch;
DECLARE_WRITE16_MEMBER(eeprom_control_w);
- DECLARE_WRITE16_MEMBER(sound_command_w);
- DECLARE_READ8_MEMBER(sound_command_r);
DECLARE_READ8_MEMBER(sound_status_r);
DECLARE_WRITE8_MEMBER(sound_control_w);
DECLARE_WRITE8_MEMBER(bsmt_data_w);
diff --git a/src/mame/includes/flstory.h b/src/mame/includes/flstory.h
index a64e59db53d..9abe811a42e 100644
--- a/src/mame/includes/flstory.h
+++ b/src/mame/includes/flstory.h
@@ -3,6 +3,7 @@
#include "machine/gen_latch.h"
#include "sound/msm5232.h"
+#include "machine/taito68705interface.h"
class flstory_state : public driver_device
{
@@ -15,7 +16,7 @@ public:
m_workram(*this, "workram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
@@ -46,26 +47,14 @@ public:
uint8_t m_snd_ctrl2;
uint8_t m_snd_ctrl3;
- /* protection */
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
- uint8_t m_port_c_in;
- uint8_t m_port_c_out;
- uint8_t m_ddr_c;
+ /* protection sims */
+ uint8_t m_from_mcu;
int m_mcu_select;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@@ -89,18 +78,6 @@ public:
DECLARE_WRITE8_MEMBER(nmi_enable_w);
DECLARE_READ8_MEMBER(rumba_mcu_r);
DECLARE_WRITE8_MEMBER(rumba_mcu_w);
- DECLARE_READ8_MEMBER(flstory_68705_port_a_r);
- DECLARE_WRITE8_MEMBER(flstory_68705_port_a_w);
- DECLARE_WRITE8_MEMBER(flstory_68705_ddr_a_w);
- DECLARE_READ8_MEMBER(flstory_68705_port_b_r);
- DECLARE_WRITE8_MEMBER(flstory_68705_port_b_w);
- DECLARE_WRITE8_MEMBER(flstory_68705_ddr_b_w);
- DECLARE_READ8_MEMBER(flstory_68705_port_c_r);
- DECLARE_WRITE8_MEMBER(flstory_68705_port_c_w);
- DECLARE_WRITE8_MEMBER(flstory_68705_ddr_c_w);
- DECLARE_WRITE8_MEMBER(flstory_mcu_w);
- DECLARE_READ8_MEMBER(flstory_mcu_r);
- DECLARE_READ8_MEMBER(flstory_mcu_status_r);
DECLARE_WRITE8_MEMBER(onna34ro_mcu_w);
DECLARE_READ8_MEMBER(onna34ro_mcu_r);
DECLARE_READ8_MEMBER(onna34ro_mcu_status_r);
diff --git a/src/mame/includes/gsword.h b/src/mame/includes/gsword.h
index 27496342010..24204bf4ed5 100644
--- a/src/mame/includes/gsword.h
+++ b/src/mame/includes/gsword.h
@@ -5,35 +5,33 @@
#include "sound/ay8910.h"
#include "sound/msm5205.h"
-class gsword_state : public driver_device
+class gsword_state_base : public driver_device
{
public:
- gsword_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_maincpu(*this, "maincpu"),
- m_audiocpu(*this, "audiocpu"),
- m_subcpu(*this, "sub"),
- m_ay0(*this, "ay1"),
- m_ay1(*this, "ay2"),
- m_msm(*this, "msm"),
- m_gfxdecode(*this, "gfxdecode"),
- m_palette(*this, "palette"),
- m_soundlatch(*this, "soundlatch"),
- m_spritetile_ram(*this, "spritetile_ram"),
- m_spritexy_ram(*this, "spritexy_ram"),
- m_spriteattrib_ram(*this, "spriteattram"),
- m_videoram(*this, "videoram"),
- m_cpu2_ram(*this, "cpu2_ram") { }
+ gsword_state_base(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_audiocpu(*this, "audiocpu")
+ , m_subcpu(*this, "sub")
+ , m_ay0(*this, "ay1")
+ , m_ay1(*this, "ay2")
+ , m_gfxdecode(*this, "gfxdecode")
+ , m_palette(*this, "palette")
+ , m_spritetile_ram(*this, "spritetile_ram")
+ , m_spritexy_ram(*this, "spritexy_ram")
+ , m_spriteattrib_ram(*this, "spriteattram")
+ , m_videoram(*this, "videoram")
+ , m_cpu2_ram(*this, "cpu2_ram")
+ {
+ }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
optional_device<cpu_device> m_subcpu;
required_device<ay8910_device> m_ay0;
required_device<ay8910_device> m_ay1;
- optional_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
- optional_device<generic_latch_8_device> m_soundlatch; // not josvolly
required_shared_ptr<uint8_t> m_spritetile_ram;
required_shared_ptr<uint8_t> m_spritexy_ram;
@@ -41,11 +39,8 @@ public:
required_shared_ptr<uint8_t> m_videoram;
required_shared_ptr<uint8_t> m_cpu2_ram;
- int m_coins; //currently initialized but not used
int m_fake8910_0;
int m_fake8910_1;
- int m_nmi_enable;
- int m_protect_hack;
int m_charbank;
int m_charpalbank;
int m_flipscreen;
@@ -56,30 +51,93 @@ public:
DECLARE_WRITE8_MEMBER(charbank_w);
DECLARE_WRITE8_MEMBER(videoctrl_w);
DECLARE_WRITE8_MEMBER(scroll_w);
- DECLARE_WRITE8_MEMBER(adpcm_soundcommand_w);
- DECLARE_WRITE8_MEMBER(nmi_set_w);
DECLARE_WRITE8_MEMBER(ay8910_control_port_0_w);
DECLARE_WRITE8_MEMBER(ay8910_control_port_1_w);
DECLARE_READ8_MEMBER(fake_0_r);
DECLARE_READ8_MEMBER(fake_1_r);
- // gsword specific
- DECLARE_READ8_MEMBER(gsword_hack_r);
- DECLARE_WRITE8_MEMBER(gsword_adpcm_data_w);
- DECLARE_READ8_MEMBER(gsword_8741_2_r);
- DECLARE_READ8_MEMBER(gsword_8741_3_r);
-
TILE_GET_INFO_MEMBER(get_bg_tile_info);
- DECLARE_DRIVER_INIT(gsword);
- DECLARE_DRIVER_INIT(gsword2);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
- DECLARE_PALETTE_INIT(gsword);
- DECLARE_PALETTE_INIT(josvolly);
uint32_t screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- INTERRUPT_GEN_MEMBER(gsword_snd_interrupt);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
};
+
+
+class gsword_state : public gsword_state_base
+{
+public:
+ gsword_state(const machine_config &mconfig, device_type type, const char *tag)
+ : gsword_state_base(mconfig, type, tag)
+ , m_soundlatch(*this, "soundlatch")
+ , m_msm(*this, "msm")
+ , m_protect_hack(false)
+ , m_nmi_enable(false)
+ {
+ }
+
+ DECLARE_READ8_MEMBER(hack_r);
+ DECLARE_WRITE8_MEMBER(nmi_set_w);
+ DECLARE_WRITE8_MEMBER(sound_command_w);
+ DECLARE_WRITE8_MEMBER(adpcm_data_w);
+ DECLARE_READ8_MEMBER(i8741_2_r);
+ DECLARE_READ8_MEMBER(i8741_3_r);
+
+ INTERRUPT_GEN_MEMBER(sound_interrupt);
+
+ DECLARE_DRIVER_INIT(gsword);
+ DECLARE_DRIVER_INIT(gsword2);
+
+ DECLARE_PALETTE_INIT(gsword);
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ required_device<generic_latch_8_device> m_soundlatch;
+ required_device<msm5205_device> m_msm;
+
+ bool m_protect_hack;
+ bool m_nmi_enable;
+};
+
+
+class josvolly_state : public gsword_state_base
+{
+public:
+ josvolly_state(const machine_config &mconfig, device_type type, const char *tag)
+ : gsword_state_base(mconfig, type, tag)
+ , m_cpu2_nmi_enable(false)
+ , m_mcu1_p1(0xffU)
+ , m_mcu1_p2(0xffU)
+ , m_mcu2_p1(0xffU)
+ {
+ }
+
+ DECLARE_READ8_MEMBER(mcu1_p1_r);
+ DECLARE_READ8_MEMBER(mcu1_p2_r);
+ DECLARE_READ8_MEMBER(mcu2_p1_r);
+ DECLARE_READ8_MEMBER(mcu2_p2_r);
+ DECLARE_READ8_MEMBER(mcu2_test_r);
+
+ DECLARE_WRITE8_MEMBER(cpu2_nmi_enable_w);
+ DECLARE_WRITE8_MEMBER(cpu2_irq_clear_w);
+ DECLARE_WRITE8_MEMBER(mcu1_p1_w);
+ DECLARE_WRITE8_MEMBER(mcu1_p2_w);
+ DECLARE_WRITE8_MEMBER(mcu2_p1_w);
+ DECLARE_WRITE8_MEMBER(mcu2_p2_w);
+
+ DECLARE_PALETTE_INIT(josvolly);
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ bool m_cpu2_nmi_enable;
+ u8 m_mcu1_p1;
+ u8 m_mcu1_p2;
+ u8 m_mcu2_p1;
+};
diff --git a/src/mame/includes/harddriv.h b/src/mame/includes/harddriv.h
index 24797461b21..1ed1894258a 100644
--- a/src/mame/includes/harddriv.h
+++ b/src/mame/includes/harddriv.h
@@ -16,6 +16,7 @@
#include "machine/mc68681.h"
#include "machine/asic65.h"
#include "machine/timekpr.h"
+#include "bus/rs232/rs232.h"
#define HARDDRIV_MASTER_CLOCK XTAL_32MHz
#define HARDDRIV_GSP_CLOCK XTAL_48MHz
@@ -393,6 +394,12 @@ protected:
uint8_t m_st68k_sloop_bank;
offs_t m_st68k_last_alt_sloop_offset;
+ uint8_t m_sel_select;
+ uint8_t m_sel1_data;
+ uint8_t m_sel2_data;
+ uint8_t m_sel3_data;
+ uint8_t m_sel4_data;
+
#define MAX_MSP_SYNC 16
uint32_t * m_dataptr[MAX_MSP_SYNC];
uint32_t m_dataval[MAX_MSP_SYNC];
@@ -447,6 +454,8 @@ protected:
int get_hblank(screen_device &screen) const { return (screen.hpos() > (screen.width() * 9 / 10)); }
optional_device<atari_slapstic_device> m_slapstic_device;
+ optional_device<rs232_port_device> m_rs232;
+
protected:
//virtual machine_config_constructor device_mconfig_additions() const;
virtual void device_start() override;
diff --git a/src/mame/includes/lkage.h b/src/mame/includes/lkage.h
index e524e974885..913570792ab 100644
--- a/src/mame/includes/lkage.h
+++ b/src/mame/includes/lkage.h
@@ -2,6 +2,7 @@
// copyright-holders:Phil Stroffolino
#include "machine/gen_latch.h"
+#include "machine/taito68705interface.h"
class lkage_state : public driver_device
{
@@ -14,7 +15,7 @@ public:
m_videoram(*this, "videoram"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundlatch(*this, "soundlatch") { }
@@ -38,21 +39,6 @@ public:
int m_sound_nmi_enable;
int m_pending_nmi;
- /* mcu */
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
- uint8_t m_port_c_in;
- uint8_t m_port_c_out;
- uint8_t m_ddr_c;
-
/* lkageb fake mcu */
uint8_t m_mcu_val;
int m_mcu_ready; /* cpu data/mcu ready status */
@@ -60,7 +46,7 @@ public:
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_device<generic_latch_8_device> m_soundlatch;
@@ -73,22 +59,10 @@ public:
DECLARE_READ8_MEMBER(fake_mcu_r);
DECLARE_WRITE8_MEMBER(fake_mcu_w);
DECLARE_READ8_MEMBER(fake_status_r);
- DECLARE_READ8_MEMBER(lkage_68705_port_a_r);
- DECLARE_WRITE8_MEMBER(lkage_68705_port_a_w);
- DECLARE_WRITE8_MEMBER(lkage_68705_ddr_a_w);
- DECLARE_READ8_MEMBER(lkage_68705_port_b_r);
- DECLARE_WRITE8_MEMBER(lkage_68705_port_b_w);
- DECLARE_WRITE8_MEMBER(lkage_68705_ddr_b_w);
- DECLARE_READ8_MEMBER(lkage_68705_port_c_r);
- DECLARE_WRITE8_MEMBER(lkage_68705_port_c_w);
- DECLARE_WRITE8_MEMBER(lkage_68705_ddr_c_w);
- DECLARE_WRITE8_MEMBER(lkage_mcu_w);
- DECLARE_READ8_MEMBER(lkage_mcu_r);
- DECLARE_READ8_MEMBER(lkage_mcu_status_r);
+
DECLARE_WRITE8_MEMBER(lkage_videoram_w);
DECLARE_DRIVER_INIT(bygone);
DECLARE_DRIVER_INIT(lkage);
- DECLARE_DRIVER_INIT(lkageb);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
TILE_GET_INFO_MEMBER(get_fg_tile_info);
TILE_GET_INFO_MEMBER(get_tx_tile_info);
diff --git a/src/mame/includes/lsasquad.h b/src/mame/includes/lsasquad.h
index 69246e90a14..b25a4cacedb 100644
--- a/src/mame/includes/lsasquad.h
+++ b/src/mame/includes/lsasquad.h
@@ -1,5 +1,6 @@
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
+#include "machine/taito68705interface.h"
class lsasquad_state : public driver_device
{
@@ -12,7 +13,7 @@ public:
m_priority_prom(*this, "prio_prom"),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
@@ -29,22 +30,11 @@ public:
int m_sound_cmd;
int m_sound_result;
- /* mcu */
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@@ -58,14 +48,7 @@ public:
DECLARE_READ8_MEMBER(lsasquad_sound_status_r);
DECLARE_READ8_MEMBER(daikaiju_sh_sound_command_r);
DECLARE_READ8_MEMBER(daikaiju_sound_status_r);
- DECLARE_READ8_MEMBER(lsasquad_68705_port_a_r);
- DECLARE_WRITE8_MEMBER(lsasquad_68705_port_a_w);
- DECLARE_WRITE8_MEMBER(lsasquad_68705_ddr_a_w);
- DECLARE_READ8_MEMBER(lsasquad_68705_port_b_r);
- DECLARE_WRITE8_MEMBER(lsasquad_68705_port_b_w);
- DECLARE_WRITE8_MEMBER(lsasquad_68705_ddr_b_w);
- DECLARE_WRITE8_MEMBER(lsasquad_mcu_w);
- DECLARE_READ8_MEMBER(lsasquad_mcu_r);
+
DECLARE_READ8_MEMBER(lsasquad_mcu_status_r);
DECLARE_READ8_MEMBER(daikaiju_mcu_status_r);
DECLARE_WRITE8_MEMBER(unk);
diff --git a/src/mame/includes/mario.h b/src/mame/includes/mario.h
index 40161d4f187..6201d67bb36 100644
--- a/src/mame/includes/mario.h
+++ b/src/mame/includes/mario.h
@@ -6,7 +6,7 @@
#include "machine/gen_latch.h"
#include "machine/z80dma.h"
-#define OLD_SOUND (1)
+#define OLD_SOUND (0)
#if !OLD_SOUND
#include "machine/netlist.h"
@@ -61,6 +61,7 @@ public:
m_discrete(*this, "discrete"),
#else
m_audio_snd0(*this, "snd_nl:snd0"),
+ m_audio_snd1(*this, "snd_nl:snd1"),
m_audio_snd7(*this, "snd_nl:snd7"),
m_audio_dac(*this, "snd_nl:dac"),
#endif
@@ -82,6 +83,7 @@ public:
optional_device<discrete_device> m_discrete;
#else
optional_device<netlist_mame_logic_input_t> m_audio_snd0;
+ optional_device<netlist_mame_logic_input_t> m_audio_snd1;
optional_device<netlist_mame_logic_input_t> m_audio_snd7;
optional_device<netlist_mame_int_input_t> m_audio_dac;
#endif
diff --git a/src/mame/includes/msisaac.h b/src/mame/includes/msisaac.h
index 2aff0d207a2..7c58a40259f 100644
--- a/src/mame/includes/msisaac.h
+++ b/src/mame/includes/msisaac.h
@@ -1,7 +1,7 @@
// license:GPL-2.0+
// copyright-holders:Jarek Burczynski
-#include "machine/buggychl.h"
+#include "machine/taito68705interface.h"
#include "machine/gen_latch.h"
#include "sound/msm5232.h"
@@ -58,7 +58,7 @@ public:
/* devices */
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_maincpu;
- optional_device<buggychl_mcu_device> m_bmcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
diff --git a/src/mame/includes/namcofl.h b/src/mame/includes/namcofl.h
index e60366963ce..acf2f54cefc 100644
--- a/src/mame/includes/namcofl.h
+++ b/src/mame/includes/namcofl.h
@@ -1,7 +1,7 @@
// license:BSD-3-Clause
// copyright-holders:R. Belmont, ElSemi
#include "namcos2.h"
-#include "video/c116.h"
+#include "video/namco_c116.h"
#define NAMCOFL_HTOTAL (288) /* wrong */
#define NAMCOFL_HBSTART (288)
diff --git a/src/mame/includes/namconb1.h b/src/mame/includes/namconb1.h
index e348f079a74..e484888e9fe 100644
--- a/src/mame/includes/namconb1.h
+++ b/src/mame/includes/namconb1.h
@@ -8,7 +8,7 @@
#include "namcos2.h"
#include "machine/eeprompar.h"
-#include "video/c116.h"
+#include "video/namco_c116.h"
#define NAMCONB1_HTOTAL (288) /* wrong */
#define NAMCONB1_HBSTART (288)
diff --git a/src/mame/includes/namcos1.h b/src/mame/includes/namcos1.h
index ceb5034f539..5b1ea68346c 100644
--- a/src/mame/includes/namcos1.h
+++ b/src/mame/includes/namcos1.h
@@ -3,7 +3,7 @@
#include "machine/c117.h"
#include "sound/dac.h"
#include "sound/namco.h"
-#include "video/c116.h"
+#include "video/namco_c116.h"
class namcos1_state : public driver_device
{
diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h
index 2221ac52119..5ad57bee517 100644
--- a/src/mame/includes/namcos2.h
+++ b/src/mame/includes/namcos2.h
@@ -11,6 +11,8 @@
#include "namcoic.h"
#include "cpu/m6502/m3745x.h"
#include "video/c45.h"
+#include "machine/namco_c148.h"
+#include "machine/namco_c139.h"
/* CPU reference numbers */
@@ -101,6 +103,9 @@ public:
m_dspmaster(*this, "dspmaster"),
m_dspslave(*this, "dspslave"),
m_c68(*this, "c68"),
+ m_master_intc(*this, "master_intc"),
+ m_slave_intc(*this, "slave_intc"),
+ m_sci(*this, "sci"),
m_gpu(*this, "gpu"),
m_gametype(0),
m_c169_roz_videoram(*this, "rozvideoram", 0),
@@ -119,21 +124,26 @@ public:
optional_device<cpu_device> m_dspmaster;
optional_device<cpu_device> m_dspslave;
optional_device<m37450_device> m_c68;
+ optional_device<namco_c148_device> m_master_intc;
+ optional_device<namco_c148_device> m_slave_intc;
+ optional_device<namco_c139_device> m_sci;
optional_device<cpu_device> m_gpu; //to be moved to namco21_state after disentangling
// game type helpers
bool is_system21();
int m_gametype;
- emu_timer *m_posirq_timer;
int m_mcu_analog_ctrl;
int m_mcu_analog_data;
int m_mcu_analog_complete;
std::unique_ptr<uint8_t[]> m_eeprom;
- uint16_t m_68k_master_C148[0x20];
- uint16_t m_68k_slave_C148[0x20];
- uint16_t m_68k_gpu_C148[0x20];
+ DECLARE_WRITE8_MEMBER(sound_reset_w);
+ DECLARE_WRITE8_MEMBER(system_reset_w);
+ void reset_all_subcpus(int state);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
+
// C123 Tilemap Emulation
// TODO: merge with namcos1.cpp implementation and convert to device
public:
@@ -218,23 +228,9 @@ public:
// general
void zdrawgfxzoom(screen_device &screen, bitmap_ind16 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
void zdrawgfxzoom(screen_device &screen, bitmap_rgb32 &dest_bmp, const rectangle &clip, gfx_element *gfx, uint32_t code, uint32_t color, int flipx, int flipy, int sx, int sy, int scalex, int scaley, int zpos);
- INTERRUPT_GEN_MEMBER(namcos2_68k_master_vblank);
- INTERRUPT_GEN_MEMBER(namcos2_68k_slave_vblank);
- INTERRUPT_GEN_MEMBER(namcos2_68k_gpu_vblank);
- TIMER_CALLBACK_MEMBER(namcos2_posirq_tick);
- void adjust_posirq_timer( int scanline );
- void init_c148();
- void reset_all_subcpus(int state);
- uint16_t readwrite_c148( address_space &space, offs_t offset, uint16_t data, int bWrite );
- int get_posirq_scanline();
DECLARE_WRITE8_MEMBER( namcos2_68k_eeprom_w );
DECLARE_READ8_MEMBER( namcos2_68k_eeprom_r );
- DECLARE_WRITE16_MEMBER( namcos2_68k_master_C148_w );
- DECLARE_READ16_MEMBER( namcos2_68k_master_C148_r );
-
- DECLARE_WRITE16_MEMBER( namcos2_68k_slave_C148_w );
- DECLARE_READ16_MEMBER( namcos2_68k_slave_C148_r );
DECLARE_WRITE8_MEMBER( namcos2_mcu_port_d_w );
DECLARE_READ8_MEMBER( namcos2_mcu_port_d_r );
@@ -244,9 +240,6 @@ public:
DECLARE_READ8_MEMBER( namcos2_mcu_analog_port_r );
DECLARE_WRITE8_MEMBER( namcos2_sound_bankselect_w );
- /* TODO: this should belong to namcos21_state */
- DECLARE_WRITE16_MEMBER( namcos21_68k_gpu_C148_w );
- DECLARE_READ16_MEMBER( namcos21_68k_gpu_C148_r );
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_audiocpu;
optional_device<cpu_device> m_slave;
@@ -264,7 +257,6 @@ public:
m_dpram(*this, "dpram"),
m_paletteram(*this, "paletteram"),
m_spriteram(*this, "spriteram"),
- m_serial_comms_ram(*this, "serialram"),
m_rozram(*this, "rozram"),
m_roz_ctrl(*this, "rozctrl"),
m_c45_road(*this, "c45_road")
@@ -331,10 +323,6 @@ public:
DECLARE_WRITE16_MEMBER( rozram_word_w );
DECLARE_READ16_MEMBER( gfx_ctrl_r );
DECLARE_WRITE16_MEMBER( gfx_ctrl_w );
- DECLARE_READ16_MEMBER( serial_comms_ram_r );
- DECLARE_WRITE16_MEMBER( serial_comms_ram_w );
- DECLARE_READ16_MEMBER( serial_comms_ctrl_r );
- DECLARE_WRITE16_MEMBER( serial_comms_ctrl_w );
void draw_sprite_init();
void update_palette();
@@ -345,11 +333,11 @@ public:
uint16_t get_palette_register( int which );
int get_pos_irq_scanline() { return (get_palette_register(5) - 32) & 0xff; }
-
+ TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
+
required_shared_ptr<uint8_t> m_dpram; /* 2Kx8 */
required_shared_ptr<uint16_t> m_paletteram;
optional_shared_ptr<uint16_t> m_spriteram;
- optional_shared_ptr<uint16_t> m_serial_comms_ram;
optional_shared_ptr<uint16_t> m_rozram;
optional_shared_ptr<uint16_t> m_roz_ctrl;
tilemap_t *m_tilemap_roz;
diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h
index e4e9e4c6adb..0ec60ea94e5 100644
--- a/src/mame/includes/namcos21.h
+++ b/src/mame/includes/namcos21.h
@@ -54,7 +54,8 @@ public:
m_ptrom24(*this,"point24"),
m_ptrom16(*this,"point16"),
m_dsp(*this, "dsp"),
- m_io_gearbox(*this, "gearbox")
+ m_io_gearbox(*this, "gearbox"),
+ m_gpu_intc(*this, "gpu_intc")
{ }
optional_shared_ptr<uint16_t> m_winrun_dspbios;
@@ -68,8 +69,10 @@ public:
optional_device<cpu_device> m_dsp;
optional_device<namcoio_gearbox_device> m_io_gearbox;
+ optional_device<namco_c148_device> m_gpu_intc;
std::unique_ptr<uint8_t[]> m_videoram;
+ std::unique_ptr<uint8_t[]> m_maskram;
std::unique_ptr<uint16_t[]> m_winrun_dspcomram;
uint16_t m_winrun_poly_buf[WINRUN_MAX_POLY_PARAM];
int m_winrun_poly_index;
@@ -134,10 +137,6 @@ public:
DECLARE_WRITE16_MEMBER(namcos2_68k_dualportram_word_w);
DECLARE_READ8_MEMBER(namcos2_dualportram_byte_r);
DECLARE_WRITE8_MEMBER(namcos2_dualportram_byte_w);
- DECLARE_WRITE16_MEMBER(NAMCO_C139_SCI_buffer_w);
- DECLARE_READ16_MEMBER(NAMCO_C139_SCI_buffer_r);
- DECLARE_WRITE16_MEMBER(NAMCO_C139_SCI_register_w);
- DECLARE_READ16_MEMBER(NAMCO_C139_SCI_register_r);
DECLARE_READ16_MEMBER(winrun_dspcomram_r);
DECLARE_WRITE16_MEMBER(winrun_dspcomram_w);
DECLARE_READ16_MEMBER(winrun_cuskey_r);
@@ -159,9 +158,12 @@ public:
DECLARE_WRITE16_MEMBER(winrun_gpu_register_w);
DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w);
DECLARE_READ16_MEMBER(winrun_gpu_videoram_r);
+
+ TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline);
uint8_t m_gearbox_state;
DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r);
+
DECLARE_DRIVER_INIT(driveyes);
DECLARE_DRIVER_INIT(winrun);
DECLARE_DRIVER_INIT(starblad);
@@ -176,6 +178,7 @@ public:
void allocate_poly_framebuffer();
void clear_poly_framebuffer();
void copy_visible_poly_framebuffer(bitmap_ind16 &bitmap, const rectangle &clip, int zlo, int zhi);
+ void winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &cliprect);
void renderscanline_flat(const edge *e1, const edge *e2, int sy, unsigned color, int depthcueenable);
void rendertri(const n21_vertex *v0, const n21_vertex *v1, const n21_vertex *v2, unsigned color, int depthcueenable);
void draw_quad(int sx[4], int sy[4], int zcode[4], int color);
@@ -187,6 +190,5 @@ public:
int init_dsp();
void render_slave_output(uint16_t data);
void winrun_flush_poly();
- void winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &cliprect);
void init(int game_type);
};
diff --git a/src/mame/includes/nycaptor.h b/src/mame/includes/nycaptor.h
index 267d627439a..25a12fdac26 100644
--- a/src/mame/includes/nycaptor.h
+++ b/src/mame/includes/nycaptor.h
@@ -3,6 +3,7 @@
#include "machine/gen_latch.h"
#include "sound/msm5232.h"
+#include "machine/taito68705interface.h"
class nycaptor_state : public driver_device
{
@@ -16,7 +17,7 @@ public:
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_subcpu(*this, "sub"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
@@ -36,21 +37,6 @@ public:
uint8_t m_char_bank;
uint8_t m_palette_bank;
- /* mcu */
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
- uint8_t m_port_c_in;
- uint8_t m_port_c_out;
- uint8_t m_ddr_c;
-
/* misc */
int m_generic_control_reg;
int m_sound_nmi_enable;
@@ -64,7 +50,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_subcpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<msm5232_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
@@ -88,17 +74,7 @@ public:
DECLARE_READ8_MEMBER(cyclshtg_mcu_status_r1);
DECLARE_WRITE8_MEMBER(cyclshtg_generic_control_w);
DECLARE_READ8_MEMBER(unk_r);
- DECLARE_READ8_MEMBER(nycaptor_68705_port_a_r);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_port_a_w);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_ddr_a_w);
- DECLARE_READ8_MEMBER(nycaptor_68705_port_b_r);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_port_b_w);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_ddr_b_w);
- DECLARE_READ8_MEMBER(nycaptor_68705_port_c_r);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_port_c_w);
- DECLARE_WRITE8_MEMBER(nycaptor_68705_ddr_c_w);
- DECLARE_WRITE8_MEMBER(nycaptor_mcu_w);
- DECLARE_READ8_MEMBER(nycaptor_mcu_r);
+
DECLARE_READ8_MEMBER(nycaptor_mcu_status_r1);
DECLARE_READ8_MEMBER(nycaptor_mcu_status_r2);
DECLARE_WRITE8_MEMBER(nycaptor_videoram_w);
diff --git a/src/mame/includes/rm380z.h b/src/mame/includes/rm380z.h
index bc829b4dbe5..763eb043117 100644
--- a/src/mame/includes/rm380z.h
+++ b/src/mame/includes/rm380z.h
@@ -60,12 +60,9 @@ private:
int writenum;
-protected:
virtual void machine_reset() override;
virtual void machine_start() override;
-public:
-
uint8_t m_port0;
uint8_t m_port0_mask;
uint8_t m_port0_kbd;
@@ -96,6 +93,7 @@ public:
required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
+public:
rm380z_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, RM380Z_MAINCPU_TAG),
@@ -136,6 +134,7 @@ public:
void config_memory_map();
void update_screen(bitmap_ind16 &bitmap);
uint32_t screen_update_rm380z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+ uint32_t screen_update_rm480z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
TIMER_CALLBACK_MEMBER(static_vblank_timer);
};
diff --git a/src/mame/includes/rohga.h b/src/mame/includes/rohga.h
index 1b36e212313..ed3345f4121 100644
--- a/src/mame/includes/rohga.h
+++ b/src/mame/includes/rohga.h
@@ -70,6 +70,7 @@ public:
DECLARE_DRIVER_INIT(wizdfire);
DECLARE_DRIVER_INIT(nitrobal);
DECLARE_DRIVER_INIT(schmeisr);
+ DECLARE_DRIVER_INIT(hangzo);
DECLARE_DRIVER_INIT(rohga);
DECLARE_VIDEO_START(wizdfire);
uint32_t screen_update_rohga(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
diff --git a/src/mame/includes/slapfght.h b/src/mame/includes/slapfght.h
index 9b3a66f37cf..a370a5e6186 100644
--- a/src/mame/includes/slapfght.h
+++ b/src/mame/includes/slapfght.h
@@ -8,7 +8,7 @@
#include "cpu/z80/z80.h"
#include "video/bufsprite.h"
-
+#include "machine/taito68705interface.h"
class slapfght_state : public driver_device
{
@@ -17,7 +17,7 @@ public:
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
- m_mcu(*this, "mcu"),
+ m_bmcu(*this, "bmcu"),
m_gfxdecode(*this, "gfxdecode"),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
@@ -31,7 +31,7 @@ public:
// devices, memory pointers
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
- optional_device<cpu_device> m_mcu;
+ optional_device<taito68705_mcu_device> m_bmcu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
@@ -61,15 +61,6 @@ public:
bool m_main_irq_enabled;
bool m_sound_nmi_enabled;
- bool m_mcu_sent;
- bool m_main_sent;
- uint8_t m_from_main;
- uint8_t m_from_mcu;
-
- uint8_t m_from_mcu_latch;
- uint8_t m_to_mcu_latch;
- uint8_t m_old_portB;
-
int m_getstar_status;
int m_getstar_sequence_index;
int m_getstar_status_state;
@@ -79,6 +70,7 @@ public:
uint8_t m_gs_e;
uint8_t m_tigerhb_cmd;
+ DECLARE_READ8_MEMBER(tigerh_mcu_status_r);
DECLARE_WRITE8_MEMBER(sound_reset_w);
DECLARE_WRITE8_MEMBER(irq_enable_w);
DECLARE_WRITE8_MEMBER(prg_bank_w);
@@ -94,19 +86,7 @@ public:
DECLARE_WRITE8_MEMBER(flipscreen_w);
DECLARE_WRITE8_MEMBER(palette_bank_w);
- DECLARE_WRITE8_MEMBER(tigerh_mcu_w);
- DECLARE_READ8_MEMBER(tigerh_mcu_r);
- DECLARE_READ8_MEMBER(tigerh_mcu_status_r);
-
- DECLARE_READ8_MEMBER(tigerh_mcu_porta_r);
- DECLARE_WRITE8_MEMBER(tigerh_mcu_porta_w);
-
- DECLARE_WRITE8_MEMBER(tigerh_mcu_portb_w);
- DECLARE_WRITE8_MEMBER(slapfght_mcu_portb_w);
-
- DECLARE_READ8_MEMBER(tigerh_mcu_portc_r);
- DECLARE_READ8_MEMBER(slapfght_mcu_portc_r);
-
+ DECLARE_WRITE8_MEMBER(scroll_from_mcu_w);
DECLARE_READ8_MEMBER(getstar_mcusim_r);
DECLARE_WRITE8_MEMBER(getstar_mcusim_w);
diff --git a/src/mame/includes/taito_f3.h b/src/mame/includes/taito_f3.h
index 9c09448cfad..77150f6aaeb 100644
--- a/src/mame/includes/taito_f3.h
+++ b/src/mame/includes/taito_f3.h
@@ -315,6 +315,7 @@ public:
protected:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
+ virtual void device_post_load(void) override;
private:
inline void get_tile_info(tile_data &tileinfo, int tile_index, uint16_t *gfx_base);
diff --git a/src/mame/includes/xbox.h b/src/mame/includes/xbox.h
index 6bd4a9cbac0..38748c224bd 100644
--- a/src/mame/includes/xbox.h
+++ b/src/mame/includes/xbox.h
@@ -132,6 +132,7 @@ private:
void threadlist_command(int ref, int params, const char **param);
void generate_irq_command(int ref, int params, const char **param);
void nv2a_combiners_command(int ref, int params, const char **param);
+ void nv2a_wclipping_command(int ref, int params, const char **param);
void waitvblank_command(int ref, int params, const char **param);
void grab_texture_command(int ref, int params, const char **param);
void grab_vprog_command(int ref, int params, const char **param);
diff --git a/src/mame/includes/xbox_nv2a.h b/src/mame/includes/xbox_nv2a.h
index c8f70948202..8f1f83af0c2 100644
--- a/src/mame/includes/xbox_nv2a.h
+++ b/src/mame/includes/xbox_nv2a.h
@@ -102,13 +102,22 @@ public:
// input vertex
vertex_nv *input;
// input parameters
- union constant {
+ struct constant {
float fv[4];
- unsigned int iv[4];
+ void iv(int idx, uint32_t value)
+ {
+ union
+ {
+ uint32_t i;
+ float f;
+ } cnv;
+
+ cnv.i = value;
+ fv[idx] = cnv.f;
+ }
} c_constant[192];
union temp {
float fv[4];
- unsigned int iv[4];
} r_temp[32];
// output vertex
vertex_nv *output;
@@ -224,11 +233,11 @@ public:
TEX3 = 12
};
enum class NV2A_VTXBUF_TYPE {
- UBYTE2 = 0, // what is the difference with UBYTE ?
+ UBYTE_D3D = 0, // what is the difference with opengl UBYTE ?
FLOAT = 2,
- UBYTE = 4,
+ UBYTE_OGL = 4,
USHORT = 5,
- UNKNOWN_6 = 6 // used for vertex color
+ FLOAT_PACKED = 6 // used for vertex color
};
enum class NV2A_TEX_FORMAT {
L8 = 0x0,
@@ -428,7 +437,8 @@ public:
puller_waiting = 0;
debug_grab_texttype = -1;
debug_grab_textfile = nullptr;
- waitvblank_used = 1;
+ enable_waitvblank = true;
+ enable_clipping_w = false;
memset(vertex_attribute_words, 0, sizeof(vertex_attribute_words));
memset(vertex_attribute_offset, 0, sizeof(vertex_attribute_offset));
memset(&persistvertexattr, 0, sizeof(persistvertexattr));
@@ -479,8 +489,9 @@ public:
uint32_t dilate0(uint32_t value, int bits);
uint32_t dilate1(uint32_t value, int bits);
void computedilated(void);
- int toggle_register_combiners_usage();
- int toggle_wait_vblank_support();
+ bool toggle_register_combiners_usage();
+ bool toggle_wait_vblank_support();
+ bool toggle_clipping_w_support();
void debug_grab_texture(int type, const char *filename);
void debug_grab_vertex_program_slot(int slot, uint32_t *instruction);
void start(address_space *cpu_space);
@@ -488,6 +499,7 @@ public:
void compute_supersample_factors(float &horizontal, float &vertical);
void compute_limits_rendertarget(uint32_t chanel, uint32_t subchannel);
void compute_size_rendertarget(uint32_t chanel, uint32_t subchannel);
+ void extract_packed_float(uint32_t data, float &first, float &second, float &third);
void read_vertex(address_space & space, offs_t address, vertex_nv &vertex, int attrib);
int read_vertices_0x1800(address_space & space, vertex_nv *destination, uint32_t address, int limit);
int read_vertices_0x1808(address_space & space, vertex_nv *destination, uint32_t address, int limit);
@@ -743,5 +755,6 @@ public:
nvidia_object_data *objectdata;
int debug_grab_texttype;
char *debug_grab_textfile;
- int waitvblank_used;
+ bool enable_waitvblank;
+ bool enable_clipping_w;
};
diff --git a/src/mame/layout/racedrivpan.lay b/src/mame/layout/racedrivpan.lay
index 3ca77bae895..a3fe28eb987 100644
--- a/src/mame/layout/racedrivpan.lay
+++ b/src/mame/layout/racedrivpan.lay
@@ -13,4 +13,22 @@
</screen>
</view>
+ <view name="Left Screen">
+ <screen index="1">
+ <bounds x="0" y="0" width="4" height="3" />
+ </screen>
+ </view>
+
+ <view name="Center Screen">
+ <screen index="0">
+ <bounds x="0" y="0" width="4" height="3" />
+ </screen>
+ </view>
+
+ <view name="Right Screen">
+ <screen index="2">
+ <bounds x="0" y="0" width="4" height="3" />
+ </screen>
+ </view>
+
</mamelayout>
diff --git a/src/mame/machine/bigevglf.cpp b/src/mame/machine/bigevglf.cpp
index 0b2c801ecbf..458c1edb648 100644
--- a/src/mame/machine/bigevglf.cpp
+++ b/src/mame/machine/bigevglf.cpp
@@ -13,90 +13,14 @@
#include "includes/bigevglf.h"
-READ8_MEMBER(bigevglf_state::bigevglf_68705_port_a_r)
-{
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_port_a_w)
-{
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-READ8_MEMBER(bigevglf_state::bigevglf_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_port_b_w)
-{
- if ((m_ddr_b & 0x02) && (~m_port_b_out & 0x02) && (data & 0x02)) /* positive going transition of the clock */
- {
- m_mcu->set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
-
- }
- if ((m_ddr_b & 0x04) && (~m_port_b_out & 0x04) && (data & 0x04) ) /* positive going transition of the clock */
- {
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 0;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-READ8_MEMBER(bigevglf_state::bigevglf_68705_port_c_r)
-{
- m_port_c_in = 0;
- if (m_main_sent)
- m_port_c_in |= 0x01;
- if (m_mcu_sent)
- m_port_c_in |= 0x02;
-
- return (m_port_c_out & m_ddr_c) | (m_port_c_in & ~m_ddr_c);
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_port_c_w)
-{
- m_port_c_out = data;
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_68705_ddr_c_w)
-{
- m_ddr_c = data;
-}
-
-WRITE8_MEMBER(bigevglf_state::bigevglf_mcu_w)
-{
- m_port_a_in = data;
- m_main_sent = 1;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-
-READ8_MEMBER(bigevglf_state::bigevglf_mcu_r)
-{
- m_mcu_sent = 1;
- return m_from_mcu;
-}
READ8_MEMBER(bigevglf_state::bigevglf_mcu_status_r)
{
int res = 0;
- if (!m_main_sent)
+ if (!m_bmcu->get_main_sent())
res |= 0x08;
- if (!m_mcu_sent)
+ if (m_bmcu->get_mcu_sent())
res |= 0x10;
return res;
diff --git a/src/mame/machine/bublbobl.cpp b/src/mame/machine/bublbobl.cpp
index 76a76af1f4d..1bfa9e97bdc 100644
--- a/src/mame/machine/bublbobl.cpp
+++ b/src/mame/machine/bublbobl.cpp
@@ -58,99 +58,6 @@ WRITE8_MEMBER(bublbobl_state::bublbobl_nmitrigger_w)
-CUSTOM_INPUT_MEMBER(bublbobl_state::tokio_mcu_sent_r)
-{
- if (m_mcu_sent) return 0;
- else return 1;
-}
-
-CUSTOM_INPUT_MEMBER(bublbobl_state::tokio_main_sent_r)
-{
- if (m_main_sent) return 0;
- else return 1;
-}
-
-
-READ8_MEMBER(bublbobl_state::tokio_mcu_r)
-{
- if (!m_mcu)
- return 0x00;
-
- m_mcu_sent = false;
-
-// printf("%s: tokio_mcu_r %02x\n", space.machine().describe_context(), m_from_mcu);
-
- return m_from_mcu;
-}
-
-WRITE8_MEMBER(bublbobl_state::tokio_mcu_w)
-{
- if (!m_mcu)
- return;
-
-// printf("%s: tokio_mcu_w %02x\n", space.machine().describe_context(), data);
-
- m_from_main = data;
- m_main_sent = true;
- m_mcu->set_input_line(0, ASSERT_LINE);
-
-}
-
-
-READ8_MEMBER(bublbobl_state::tokio_mcu_porta_r)
-{
-// printf("tokio_mcu_porta_r\n");
- return m_to_mcu_latch;
-}
-
-WRITE8_MEMBER(bublbobl_state::tokio_mcu_porta_w)
-{
-// printf("tokio_mcu_porta_w %02x\n", data);
- m_from_mcu_latch = data;
-}
-
-
-READ8_MEMBER(bublbobl_state::tokio_mcu_portc_r)
-{
- uint8_t ret = 0;
-
- if (!m_main_sent)
- ret |= 0x01;
- if (m_mcu_sent)
- ret |= 0x02;
-
- ret ^= 0x3; // inverted logic compared to tigerh
-
-// printf("%s: tokio_mcu_portc_r %02x\n", space.machine().describe_context(), ret);
-
- return ret;
-}
-
-
-WRITE8_MEMBER(bublbobl_state::tokio_mcu_portb_w)
-{
-// printf("tokio_mcu_portb_w %02x\n", data);
-
- if ((mem_mask & 0x02) && (~data & 0x02) && (m_old_portB & 0x02))
- {
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
-
- m_to_mcu_latch = m_from_main;
- m_main_sent = false;
- }
- if ((mem_mask & 0x04) && (data & 0x04) && (~m_old_portB & 0x04))
- {
- m_from_mcu = m_from_mcu_latch;
- m_mcu_sent = true;
- // printf("sent %02x\n", m_from_mcu);
- }
-
- m_old_portB = data;
-
-}
-
-
diff --git a/src/mame/machine/buggychl.cpp b/src/mame/machine/buggychl.cpp
deleted file mode 100644
index 843113992b5..00000000000
--- a/src/mame/machine/buggychl.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Ernesto Corvi, Nicola Salmoria
-#include "emu.h"
-#include "cpu/z80/z80.h"
-#include "machine/buggychl.h"
-
-
-const device_type BUGGYCHL_MCU = &device_creator<buggychl_mcu_device>;
-
-buggychl_mcu_device::buggychl_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, BUGGYCHL_MCU, "M68705 MCU Simulation (Buggy Challenge)", tag, owner, clock, "buggychl_mcu", __FILE__),
- m_port_a_in(0),
- m_port_a_out(0),
- m_ddr_a(0),
- m_port_b_in(0),
- m_port_b_out(0),
- m_ddr_b(0),
- m_port_c_in(0),
- m_port_c_out(0),
- m_ddr_c(0),
- m_from_main(0),
- m_from_mcu(0),
- m_mcu_sent(0),
- m_main_sent(0)
-{
-}
-
-//-------------------------------------------------
-// device_config_complete - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-
-void buggychl_mcu_device::device_config_complete()
-{
-}
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void buggychl_mcu_device::device_start()
-{
- m_mcu = machine().device("mcu");
-
- save_item(NAME(m_from_main));
- save_item(NAME(m_from_mcu));
- save_item(NAME(m_mcu_sent));
- save_item(NAME(m_main_sent));
- save_item(NAME(m_port_a_in));
- save_item(NAME(m_port_a_out));
- save_item(NAME(m_ddr_a));
- save_item(NAME(m_port_b_in));
- save_item(NAME(m_port_b_out));
- save_item(NAME(m_ddr_b));
- save_item(NAME(m_port_c_in));
- save_item(NAME(m_port_c_out));
- save_item(NAME(m_ddr_c));
-}
-
-//-------------------------------------------------
-// device_reset - device-specific reset
-//-------------------------------------------------
-
-void buggychl_mcu_device::device_reset()
-{
- m_mcu_sent = 0;
- m_main_sent = 0;
- m_from_main = 0;
- m_from_mcu = 0;
- m_port_a_in = 0;
- m_port_a_out = 0;
- m_ddr_a = 0;
- m_port_b_in = 0;
- m_port_b_out = 0;
- m_ddr_b = 0;
- m_port_c_in = 0;
- m_port_c_out = 0;
- m_ddr_c = 0;
-}
-
-
-/***************************************************************************
-
- Buggy Challenge 68705 protection interface
-
- This is accurate. FairyLand Story seems to be identical.
-
-***************************************************************************/
-
-READ8_MEMBER( buggychl_mcu_device::buggychl_68705_port_a_r )
-{
- //logerror("%04x: 68705 port A read %02x\n", m_mcu->safe_pc(), m_port_a_in);
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_port_a_w )
-{
- //logerror("%04x: 68705 port A write %02x\n", m_mcu->safe_pc(), data);
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_ddr_a_w )
-{
- m_ddr_a = data;
-}
-
-
-
-/*
- * Port B connections:
- * parts in [ ] are optional (not used by buggychl)
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 0 n.c.
- * 1 W IRQ ack and enable latch which holds data from main Z80 memory
- * 2 W loads latch to Z80
- * 3 W to Z80 BUSRQ (put it on hold?)
- * 4 W n.c.
- * 5 W [selects Z80 memory access direction (0 = write 1 = read)]
- * 6 W [loads the latch which holds the low 8 bits of the address of
- * the main Z80 memory location to access]
- * 7 W [loads the latch which holds the high 8 bits of the address of
- * the main Z80 memory location to access]
- */
-
-
-READ8_MEMBER( buggychl_mcu_device::buggychl_68705_port_b_r )
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_port_b_w )
-{
- logerror("%04x: 68705 port B write %02x\n", m_mcu->safe_pc(), data);
-
- if ((m_ddr_b & 0x02) && (~data & 0x02) && (m_port_b_out & 0x02))
- {
- m_port_a_in = m_from_main;
- if (m_main_sent)
- m_mcu->execute().set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
- logerror("read command %02x from main cpu\n", m_port_a_in);
- }
- if ((m_ddr_b & 0x04) && (data & 0x04) && (~m_port_b_out & 0x04))
- {
- logerror("send command %02x to main cpu\n", m_port_a_out);
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 1;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_ddr_b_w )
-{
- m_ddr_b = data;
-}
-
-
-/*
- * Port C connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 0 R 1 when pending command Z80->68705
- * 1 R 0 when pending command 68705->Z80
- */
-
-READ8_MEMBER( buggychl_mcu_device::buggychl_68705_port_c_r )
-{
- m_port_c_in = 0;
- if (m_main_sent)
- m_port_c_in |= 0x01;
- if (!m_mcu_sent)
- m_port_c_in |= 0x02;
- logerror("%04x: 68705 port C read %02x\n", m_mcu->safe_pc(), m_port_c_in);
- return (m_port_c_out & m_ddr_c) | (m_port_c_in & ~m_ddr_c);
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_port_c_w )
-{
- logerror("%04x: 68705 port C write %02x\n", m_mcu->safe_pc(), data);
- m_port_c_out = data;
-}
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_68705_ddr_c_w )
-{
- m_ddr_c = data;
-}
-
-
-WRITE8_MEMBER( buggychl_mcu_device::buggychl_mcu_w )
-{
- logerror("%04x: mcu_w %02x\n", m_mcu->safe_pc(), data);
- m_from_main = data;
- m_main_sent = 1;
- m_mcu->execute().set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER( buggychl_mcu_device::buggychl_mcu_r )
-{
- logerror("%04x: mcu_r %02x\n", m_mcu->safe_pc(), m_from_mcu);
- m_mcu_sent = 0;
- return m_from_mcu;
-}
-
-READ8_MEMBER( buggychl_mcu_device::buggychl_mcu_status_r )
-{
- int res = 0;
-
- /* bit 0 = when 1, mcu is ready to receive data from main cpu */
- /* bit 1 = when 1, mcu has sent data to the main cpu */
- //logerror("%04x: mcu_status_r\n",m_mcu->safe_pc());
- if (!m_main_sent)
- res |= 0x01;
- if (m_mcu_sent)
- res |= 0x02;
-
- return res;
-}
-
-ADDRESS_MAP_START( buggychl_mcu_map, AS_PROGRAM, 8, buggychl_mcu_device )
- ADDRESS_MAP_GLOBAL_MASK(0x7ff)
- AM_RANGE(0x0000, 0x0000) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_68705_port_a_r, buggychl_68705_port_a_w)
- AM_RANGE(0x0001, 0x0001) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_68705_port_b_r, buggychl_68705_port_b_w)
- AM_RANGE(0x0002, 0x0002) AM_DEVREADWRITE("bmcu", buggychl_mcu_device, buggychl_68705_port_c_r, buggychl_68705_port_c_w)
- AM_RANGE(0x0004, 0x0004) AM_DEVWRITE("bmcu", buggychl_mcu_device, buggychl_68705_ddr_a_w)
- AM_RANGE(0x0005, 0x0005) AM_DEVWRITE("bmcu", buggychl_mcu_device, buggychl_68705_ddr_b_w)
- AM_RANGE(0x0006, 0x0006) AM_DEVWRITE("bmcu", buggychl_mcu_device, buggychl_68705_ddr_c_w)
- AM_RANGE(0x0010, 0x007f) AM_RAM
- AM_RANGE(0x0080, 0x07ff) AM_ROM
-ADDRESS_MAP_END
diff --git a/src/mame/machine/buggychl.h b/src/mame/machine/buggychl.h
deleted file mode 100644
index ec76e77e467..00000000000
--- a/src/mame/machine/buggychl.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Ernesto Corvi, Nicola Salmoria
-class buggychl_mcu_device : public device_t
-{
-public:
- buggychl_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~buggychl_mcu_device() {}
-
- DECLARE_WRITE8_MEMBER( buggychl_mcu_w );
- DECLARE_READ8_MEMBER( buggychl_mcu_r );
- DECLARE_READ8_MEMBER( buggychl_mcu_status_r );
- DECLARE_READ8_MEMBER( buggychl_68705_port_a_r );
- DECLARE_WRITE8_MEMBER( buggychl_68705_port_a_w );
- DECLARE_WRITE8_MEMBER( buggychl_68705_ddr_a_w );
- DECLARE_READ8_MEMBER( buggychl_68705_port_b_r );
- DECLARE_WRITE8_MEMBER( buggychl_68705_port_b_w );
- DECLARE_WRITE8_MEMBER( buggychl_68705_ddr_b_w );
- DECLARE_READ8_MEMBER( buggychl_68705_port_c_r );
- DECLARE_WRITE8_MEMBER( buggychl_68705_port_c_w );
- DECLARE_WRITE8_MEMBER( buggychl_68705_ddr_c_w );
-
-protected:
- // device-level overrides
- virtual void device_config_complete() override;
- virtual void device_start() override;
- virtual void device_reset() override;
-
-private:
- // internal state
- uint8_t m_port_a_in;
- uint8_t m_port_a_out;
- uint8_t m_ddr_a;
- uint8_t m_port_b_in;
- uint8_t m_port_b_out;
- uint8_t m_ddr_b;
- uint8_t m_port_c_in;
- uint8_t m_port_c_out;
- uint8_t m_ddr_c;
- uint8_t m_from_main;
- uint8_t m_from_mcu;
- int m_mcu_sent;
- int m_main_sent;
- device_t *m_mcu;
-};
-
-ADDRESS_MAP_EXTERN( buggychl_mcu_map, 8 );
-
-extern const device_type BUGGYCHL_MCU;
diff --git a/src/mame/machine/flstory.cpp b/src/mame/machine/flstory.cpp
index 79f65e86e11..4d71137380e 100644
--- a/src/mame/machine/flstory.cpp
+++ b/src/mame/machine/flstory.cpp
@@ -12,131 +12,6 @@
#include "emu.h"
#include "includes/flstory.h"
-/***************************************************************************
-
- Fairy Land Story 68705 protection interface
-
- The following is ENTIRELY GUESSWORK!!!
-
- It seems, however, to be identical to Buggy Challenge.
-
-***************************************************************************/
-
-READ8_MEMBER(flstory_state::flstory_68705_port_a_r)
-{
- //logerror("%04x: 68705 port A read %02x\n", space.device().safe_pc(), m_port_a_in);
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_port_a_w)
-{
- //logerror("%04x: 68705 port A write %02x\n", space.device().safe_pc(), data);
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-
-
-/*
- * Port B connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 1 W when 1->0, enables latch which brings the command from main CPU (read from port A)
- * 2 W when 0->1, copies port A to the latch for the main CPU
- */
-
-READ8_MEMBER(flstory_state::flstory_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_port_b_w)
-{
- //logerror("%04x: 68705 port B write %02x\n",space.device().safe_pc(),data);
-
- if ((m_ddr_b & 0x02) && (~data & 0x02) && (m_port_b_out & 0x02))
- {
- m_port_a_in = m_from_main;
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
- logerror("read command %02x from main cpu\n", m_port_a_in);
- }
- if ((m_ddr_b & 0x04) && (data & 0x04) && (~m_port_b_out & 0x04))
- {
- logerror("send command %02x to main cpu\n", m_port_a_out);
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 1;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-
-READ8_MEMBER(flstory_state::flstory_68705_port_c_r)
-{
- m_port_c_in = 0;
- if (m_main_sent)
- m_port_c_in |= 0x01;
-
- if (!m_mcu_sent)
- m_port_c_in |= 0x02;
-
- //logerror("%04x: 68705 port C read %02x\n", space.device().safe_pc(), port_c_in);
- return (m_port_c_out & m_ddr_c) | (m_port_c_in & ~m_ddr_c);
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_port_c_w)
-{
- logerror("%04x: 68705 port C write %02x\n", space.device().safe_pc(), data);
- m_port_c_out = data;
-}
-
-WRITE8_MEMBER(flstory_state::flstory_68705_ddr_c_w)
-{
- m_ddr_c = data;
-}
-
-WRITE8_MEMBER(flstory_state::flstory_mcu_w)
-{
- logerror("%04x: mcu_w %02x\n", space.device().safe_pc(), data);
- m_from_main = data;
- m_main_sent = 1;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER(flstory_state::flstory_mcu_r)
-{
- logerror("%04x: mcu_r %02x\n",space.device().safe_pc(), m_from_mcu);
- m_mcu_sent = 0;
- return m_from_mcu;
-}
-
-READ8_MEMBER(flstory_state::flstory_mcu_status_r)
-{
- int res = 0;
-
- /* bit 0 = when 1, mcu is ready to receive data from main cpu */
- /* bit 1 = when 1, mcu has sent data to the main cpu */
- //logerror("%04x: mcu_status_r\n", space.device().safe_pc());
- if (!m_main_sent)
- res |= 0x01;
- if (m_mcu_sent)
- res |= 0x02;
-
- return res;
-}
-
WRITE8_MEMBER(flstory_state::onna34ro_mcu_w)
{
uint16_t score_adr = m_workram[0x29e] * 0x100 + m_workram[0x29d];
diff --git a/src/mame/machine/harddriv.cpp b/src/mame/machine/harddriv.cpp
index 22a50214cf7..9d41af07fe8 100644
--- a/src/mame/machine/harddriv.cpp
+++ b/src/mame/machine/harddriv.cpp
@@ -342,36 +342,70 @@ WRITE16_MEMBER( harddriv_state::hd68k_wr0_write )
/* low 3 bits select the function */
offset &= 7;
+
+ m_sel_select = 0;
+
switch (offset)
{
case 1: /* SEL1 */
case 2: /* SEL2 */
case 3: /* SEL3 */
case 4: /* SEL4 */
- default:
- /* just ignore */
+ m_sel_select = offset;
break;
case 6: /* CC1 */
case 7: /* CC2 */
space.machine().bookkeeping().coin_counter_w(offset - 6, data);
break;
+
+ default:
+ /* just ignore */
+ break;
}
}
WRITE16_MEMBER( harddriv_state::hd68k_wr1_write )
{
- if (offset == 0) { // logerror("Shifter Interface Latch = %02X\n", data);
- } else { logerror("/WR1(%04X)=%02X\n", offset, data);
+ if (offset == 0) {
+ // logerror("Shifter Interface Latch = %02X\n", data);
+ data = data >> 8;
+ switch (m_sel_select)
+ {
+ case 1: /* SEL1 */
+ m_sel1_data = data;
+ machine().output().set_value("SEL1", m_sel1_data);
+ break;
+
+ case 2: /* SEL2 */
+ m_sel2_data = data;
+ machine().output().set_value("SEL2", m_sel2_data);
+ break;
+
+ case 3: /* SEL3 */
+ m_sel3_data = data;
+ machine().output().set_value("SEL3", m_sel3_data);
+ break;
+
+ case 4: /* SEL4 */
+ m_sel4_data = data;
+ machine().output().set_value("SEL4", m_sel4_data);
+ break;
+ }
+ } else {
+ logerror("/WR1(%04X)=%02X\n", offset, data);
}
}
WRITE16_MEMBER( harddriv_state::hd68k_wr2_write )
{
- if (offset == 0) { // logerror("Steering Wheel Latch = %02X\n", data);
- } else { logerror("/WR2(%04X)=%02X\n", offset, data);
+ if (offset == 0) {
+ // logerror("Steering Wheel Latch = %02X\n", data);
+ machine().output().set_value("wheel", data >> 8);
+ } else {
+ logerror("/WR2(%04X)=%02X\n", offset, data);
}
}
@@ -387,11 +421,14 @@ WRITE16_MEMBER( harddriv_state::hd68k_nwr_w )
{
case 0: /* CR2 */
case 1: /* CR1 */
- machine().output().set_led_value(offset, data);
break;
case 2: /* LC1 */
+ // used for seat locking on harddriv
+ machine().output().set_led_value(1, data);
break;
case 3: /* LC2 */
+ // used for "abort" button lamp
+ machine().output().set_led_value(2, data);
break;
case 4: /* ZP1 */
m_m68k_zp1 = data;
diff --git a/src/mame/machine/lkage.cpp b/src/mame/machine/lkage.cpp
deleted file mode 100644
index 3235f08e72c..00000000000
--- a/src/mame/machine/lkage.cpp
+++ /dev/null
@@ -1,141 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Phil Stroffolino
-/***************************************************************************
-
- machine.c
-
- Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
- I/O ports)
-
-***************************************************************************/
-
-#include "emu.h"
-#include "includes/lkage.h"
-
-
-/***************************************************************************
-
- Legend of Kage 68705 protection interface
-
- The following is ENTIRELY GUESSWORK!!!
- And moreover, the game seems to work anyway regardless of what the mcu returns.
-
-***************************************************************************/
-
-READ8_MEMBER(lkage_state::lkage_68705_port_a_r)
-{
- //logerror("%04x: 68705 port A read %02x\n", space.device().safe_pc(), m_port_a_in);
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_port_a_w)
-{
- //logerror("%04x: 68705 port A write %02x\n", space.device().safe_pc(), data);
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-
-
-/*
- * Port B connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 1 W when 1->0, enables latch which brings the command from main CPU (read from port A)
- * 2 W when 0->1, copies port A to the latch for the main CPU
- */
-
-READ8_MEMBER(lkage_state::lkage_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_port_b_w)
-{
- //logerror("%04x: 68705 port B write %02x\n", space.device().safe_pc(), data);
-
- if ((m_ddr_b & 0x02) && (~data & 0x02) && (m_port_b_out & 0x02))
- {
- m_port_a_in = m_from_main;
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
-
- m_main_sent = 0;
- logerror("read command %02x from main cpu\n", m_port_a_in);
- }
-
- if ((m_ddr_b & 0x04) && (data & 0x04) && (~m_port_b_out & 0x04))
- {
- logerror("send command %02x to main cpu\n", m_port_a_out);
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 1;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-
-
-READ8_MEMBER(lkage_state::lkage_68705_port_c_r)
-{
- m_port_c_in = 0;
- if (m_main_sent)
- m_port_c_in |= 0x01;
- if (!m_mcu_sent)
- m_port_c_in |= 0x02;
-
- //logerror("%04x: 68705 port C read %02x\n", space.device().safe_pc(), m_port_c_in);
- return (m_port_c_out & m_ddr_c) | (m_port_c_in & ~m_ddr_c);
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_port_c_w)
-{
- logerror("%04x: 68705 port C write %02x\n", space.device().safe_pc(), data);
- m_port_c_out = data;
-}
-
-WRITE8_MEMBER(lkage_state::lkage_68705_ddr_c_w)
-{
- m_ddr_c = data;
-}
-
-
-WRITE8_MEMBER(lkage_state::lkage_mcu_w)
-{
- logerror("%04x: mcu_w %02x\n", space.device().safe_pc(), data);
- m_from_main = data;
- m_main_sent = 1;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER(lkage_state::lkage_mcu_r)
-{
- logerror("%04x: mcu_r %02x\n", space.device().safe_pc(), m_from_mcu);
- m_mcu_sent = 0;
- return m_from_mcu;
-}
-
-READ8_MEMBER(lkage_state::lkage_mcu_status_r)
-{
- int res = 0;
-
- /* bit 0 = when 1, mcu is ready to receive data from main cpu */
- /* bit 1 = when 1, mcu has sent data to the main cpu */
- //logerror("%04x: mcu_status_r\n", space.device().safe_pc());
- if (!m_main_sent)
- res |= 0x01;
- if (m_mcu_sent)
- res |= 0x02;
-
- return res;
-}
diff --git a/src/mame/machine/lsasquad.cpp b/src/mame/machine/lsasquad.cpp
index ebaecf016ad..b721f71c891 100644
--- a/src/mame/machine/lsasquad.cpp
+++ b/src/mame/machine/lsasquad.cpp
@@ -86,91 +86,6 @@ READ8_MEMBER(lsasquad_state::daikaiju_sound_status_r)
return m_sound_pending ^ 3;
}
-
-/***************************************************************************
-
- LSA Squad 68705 protection interface
-
- The following is ENTIRELY GUESSWORK!!!
-
-***************************************************************************/
-
-READ8_MEMBER(lsasquad_state::lsasquad_68705_port_a_r)
-{
- //logerror("%04x: 68705 port A read %02x\n", space.device().safe_pc(), m_port_a_in);
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(lsasquad_state::lsasquad_68705_port_a_w)
-{
- //logerror("%04x: 68705 port A write %02x\n", space.device().safe_pc(), data);
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER(lsasquad_state::lsasquad_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-
-
-/*
- * Port B connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 1 W when 1->0, enables latch which brings the command from main CPU (read from port A)
- * 2 W when 0->1, copies port A to the latch for the main CPU
- */
-
-READ8_MEMBER(lsasquad_state::lsasquad_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(lsasquad_state::lsasquad_68705_port_b_w)
-{
- //logerror("%04x: 68705 port B write %02x\n", space.device().safe_pc(), data);
-
- if ((m_ddr_b & 0x02) && (~data & 0x02) && (m_port_b_out & 0x02))
- {
- m_port_a_in = m_from_main;
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
- //logerror("read command %02x from main cpu\n", m_port_a_in);
- }
-
- if ((m_ddr_b & 0x04) && (data & 0x04) && (~m_port_b_out & 0x04))
- {
- //logerror("send command %02x to main cpu\n", m_port_a_out);
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 1;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(lsasquad_state::lsasquad_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-WRITE8_MEMBER(lsasquad_state::lsasquad_mcu_w)
-{
- //logerror("%04x: mcu_w %02x\n", space.device().safe_pc(), data);
- m_from_main = data;
- m_main_sent = 1;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER(lsasquad_state::lsasquad_mcu_r)
-{
- //logerror("%04x: mcu_r %02x\n", space.device().safe_pc(), m_from_mcu);
- m_mcu_sent = 0;
- return m_from_mcu;
-}
-
READ8_MEMBER(lsasquad_state::lsasquad_mcu_status_r)
{
int res = ioport("MCU")->read();
@@ -178,10 +93,13 @@ READ8_MEMBER(lsasquad_state::lsasquad_mcu_status_r)
/* bit 0 = when 1, mcu is ready to receive data from main cpu */
/* bit 1 = when 0, mcu has sent data to the main cpu */
//logerror("%04x: mcu_status_r\n",space.device().safe_pc());
- if (!m_main_sent)
- res |= 0x01;
- if (!m_mcu_sent)
- res |= 0x02;
+ if (m_bmcu)
+ {
+ if (!m_bmcu->get_main_sent())
+ res |= 0x01;
+ if (!m_bmcu->get_mcu_sent())
+ res |= 0x02;
+ }
return res;
}
@@ -193,10 +111,13 @@ READ8_MEMBER(lsasquad_state::daikaiju_mcu_status_r)
/* bit 0 = when 1, mcu is ready to receive data from main cpu */
/* bit 1 = when 0, mcu has sent data to the main cpu */
//logerror("%04x: mcu_status_r\n",space.device().safe_pc());
- if (!m_main_sent)
- res |= 0x01;
- if (!m_mcu_sent)
- res |= 0x02;
+ if (m_bmcu)
+ {
+ if (!m_bmcu->get_main_sent())
+ res |= 0x01;
+ if (!m_bmcu->get_mcu_sent())
+ res |= 0x02;
+ }
res |= ((m_sound_pending & 0x02) ^ 2) << 3; //inverted flag
m_sound_pending &= ~0x02;
diff --git a/src/mame/machine/namco_c139.cpp b/src/mame/machine/namco_c139.cpp
new file mode 100644
index 00000000000..0e081a7836e
--- /dev/null
+++ b/src/mame/machine/namco_c139.cpp
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Namco C139 - Serial I/F Controller
+
+
+ TODO:
+ - Make this to actually work!
+ - Is RAM shared with a specific CPU other than master/slave?
+
+***************************************************************************/
+
+#include "emu.h"
+#include "namco_c139.h"
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+const device_type NAMCO_C139 = &device_creator<namco_c139_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+static ADDRESS_MAP_START( data_map, AS_DATA, 16, namco_c139_device )
+ AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE("sharedram")
+ADDRESS_MAP_END
+
+DEVICE_ADDRESS_MAP_START( regs_map, 16, namco_c139_device )
+ AM_RANGE(0x00, 0x00) AM_READ(status_r) // WRITE clears flags
+ AM_RANGE(0x02, 0x02) AM_NOP // settings?
+// AM_RANGE(0x0a, 0x0a) // WRITE tx_w
+// AM_RANGE(0x0c, 0x0c) // READ rx_r
+// AM_RANGE(0x0e, 0x0e) //
+ADDRESS_MAP_END
+
+//-------------------------------------------------
+// namco_c139_device - constructor
+//-------------------------------------------------
+
+namco_c139_device::namco_c139_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NAMCO_C139, "namco_c139_longname", tag, owner, clock, "namco_c139", __FILE__),
+ device_memory_interface(mconfig, *this),
+ m_space_config("data", ENDIANNESS_BIG, 16, 14, 0, *ADDRESS_MAP_NAME(data_map))
+{
+}
+
+
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void namco_c139_device::device_start()
+{
+ m_ram = (uint16_t*)memshare("sharedram")->ptr();
+
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void namco_c139_device::device_reset()
+{
+}
+
+//-------------------------------------------------
+// memory_space_config - return a description of
+// any address spaces owned by this device
+//-------------------------------------------------
+
+const address_space_config *namco_c139_device::memory_space_config(address_spacenum spacenum) const
+{
+ return (spacenum == AS_DATA) ? &m_space_config : nullptr;
+}
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+READ16_MEMBER(namco_c139_device::ram_r)
+{
+ return m_ram[offset];
+}
+
+WRITE16_MEMBER(namco_c139_device::ram_w)
+{
+ COMBINE_DATA(&m_ram[offset]);
+}
+
+READ16_MEMBER(namco_c139_device::status_r)
+{
+ /*
+ x-- RX READY or irq pending?
+ -x- IRQ direction: 1 RX cause - 0 TX cause
+ */
+ return 4; // STATUS bit?
+}
diff --git a/src/mame/machine/namco_c139.h b/src/mame/machine/namco_c139.h
new file mode 100644
index 00000000000..08a38e74425
--- /dev/null
+++ b/src/mame/machine/namco_c139.h
@@ -0,0 +1,67 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Namco C139 - Serial I/F Controller
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __NAMCO_C139DEV_H__
+#define __NAMCO_C139DEV_H__
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_NAMCO_C139_ADD(_tag) \
+ MCFG_DEVICE_ADD(_tag, NAMCO_C139, 0)
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> namco_c139_device
+
+class namco_c139_device : public device_t,
+ public device_memory_interface
+{
+public:
+ // construction/destruction
+ namco_c139_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // I/O operations
+ DECLARE_ADDRESS_MAP(regs_map, 16);
+
+ DECLARE_READ16_MEMBER(status_r);
+
+ DECLARE_READ16_MEMBER(ram_r);
+ DECLARE_WRITE16_MEMBER(ram_w);
+
+protected:
+ // device-level overrides
+// virtual void device_validity_check(validity_checker &valid) const;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+ virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_DATA) const override;
+private:
+ const address_space_config m_space_config;
+ uint16_t* m_ram;
+};
+
+
+// device type definition
+extern const device_type NAMCO_C139;
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+
+
+#endif
diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp
new file mode 100644
index 00000000000..d09d82c7ff6
--- /dev/null
+++ b/src/mame/machine/namco_c148.cpp
@@ -0,0 +1,250 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Namco C148 - CPU Bus Manager
+
+ Does some Memory Decode, Interrupt Handling, 3 bit PIO port, Bus Controller
+
+ Based off implementation from K.Wilkins and Phil Stroffolino
+
+ TODO:
+ - hookup C116 device, @see mame/includes/namcoic.h
+
+=============================================================================
+Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02
+ Bus Controller? 1C0XXX
+ ???????? 1C2XXX
+ ???????? 1C4XXX
+ -x- master priority bit?
+ Master/Slave IRQ level 1C6XXX D00-D02
+ EXIRQ level 1C8XXX D00-D02
+ POSIRQ level 1CAXXX D00-D02
+ SCIRQ level 1CCXXX D00-D02
+ VBLANK IRQ level 1CEXXX D00-D02
+ xxx irq level for specific irq.
+ ???????? 1D0XXX
+ ???????? 1D4000 trigger master/slave INT?
+
+ Acknowlegde Master/Slave IRQ 1D6XXX ack master/slave INT
+ Acknowledge EXIRQ 1D8XXX
+ Acknowledge POSIRQ 1DAXXX
+ Acknowledge SCIRQ 1DCXXX
+ Acknowledge VBLANK IRQ 1DEXXX
+
+ EEPROM Ready status 1E0XXX R D01
+ Sound CPU Reset control 1E2XXX W D01
+ Slave 68000 & IO CPU Reset 1E4XXX W D01
+ xxx PIO ports, per-HW / CPU specific
+ Watchdog reset kicker 1E6XXX W
+ xxx Unknown at current stage if internal or external to the C148
+
+***************************************************************************/
+
+#include "emu.h"
+#include "namco_c148.h"
+
+#define VERBOSE 0
+#define LOG(x) do { if (VERBOSE) printf x; } while (0)
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+// device type definition
+const device_type NAMCO_C148 = &device_creator<namco_c148_device>;
+
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// namco_c148_device - constructor
+//-------------------------------------------------
+
+namco_c148_device::namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, NAMCO_C148, "Namco C148 Interrupt Controller", tag, owner, clock, "namco_c148", __FILE__),
+ m_out_ext1_cb(*this),
+ m_out_ext2_cb(*this),
+ m_hostcpu_tag(nullptr),
+ m_linked_c148_tag(nullptr)
+{
+}
+
+// (*) denotes master CPU only
+DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device )
+ AM_RANGE(0x04000, 0x05fff) AM_READWRITE8(bus_ctrl_r, bus_ctrl_w, 0x00ff)
+ AM_RANGE(0x06000, 0x07fff) AM_READWRITE8(cpu_irq_level_r,cpu_irq_level_w,0x00ff) // CPUIRQ lv
+ AM_RANGE(0x08000, 0x09fff) AM_READWRITE8(ex_irq_level_r,ex_irq_level_w,0x00ff) // EXIRQ lv
+ AM_RANGE(0x0a000, 0x0bfff) AM_READWRITE8(pos_irq_level_r,pos_irq_level_w,0x00ff) // POSIRQ lv
+ AM_RANGE(0x0c000, 0x0dfff) AM_READWRITE8(sci_irq_level_r,sci_irq_level_w,0x00ff) // SCIRQ lv
+ AM_RANGE(0x0e000, 0x0ffff) AM_READWRITE8(vblank_irq_level_r,vblank_irq_level_w,0x00ff) // VBlank IRQ lv
+
+ AM_RANGE(0x10000, 0x11fff) AM_WRITE(cpu_irq_assert_w)
+ AM_RANGE(0x16000, 0x17fff) AM_READWRITE(cpu_irq_ack_r, cpu_irq_ack_w) // CPUIRQ ack
+ AM_RANGE(0x18000, 0x19fff) AM_READWRITE(ex_irq_ack_r, ex_irq_ack_w) // EXIRQ ack
+ AM_RANGE(0x1a000, 0x1bfff) AM_READWRITE(pos_irq_ack_r, pos_irq_ack_w) // POSIRQ ack
+ AM_RANGE(0x1c000, 0x1dfff) AM_READWRITE(sci_irq_ack_r, sci_irq_ack_w) // SCIRQ ack
+ AM_RANGE(0x1e000, 0x1ffff) AM_READWRITE(vblank_irq_ack_r, vblank_irq_ack_w) // VBlank IRQ ack
+ AM_RANGE(0x20000, 0x21fff) AM_READ8(ext_r,0x00ff) // EEPROM ready status (*)
+ AM_RANGE(0x22000, 0x23fff) AM_READNOP AM_WRITE8(ext1_w,0x00ff) // sound CPU reset (*)
+ AM_RANGE(0x24000, 0x25fff) AM_WRITE8(ext2_w,0x00ff) // slave & i/o reset (*)
+ AM_RANGE(0x26000, 0x27fff) AM_NOP // watchdog
+ADDRESS_MAP_END
+
+
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void namco_c148_device::device_start()
+{
+ m_hostcpu = machine().device<cpu_device>(m_hostcpu_tag);
+ m_linked_c148 = machine().device<namco_c148_device>(m_linked_c148_tag);
+ assert(m_hostcpu != nullptr);
+
+ m_out_ext1_cb.resolve_safe();
+ m_out_ext2_cb.resolve_safe();
+
+ // TODO: link to SCI, EX and the screen device controller devices
+}
+
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void namco_c148_device::device_reset()
+{
+ m_irqlevel.vblank = 0;
+ m_irqlevel.pos = 0;
+ m_irqlevel.sci = 0;
+ m_irqlevel.ex = 0;
+ m_irqlevel.cpu = 0;
+}
+
+//**************************************************************************
+// IRQ section
+//**************************************************************************
+
+READ8_MEMBER( namco_c148_device::pos_irq_level_r ) { return m_irqlevel.pos & 7; }
+READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) { return m_irqlevel.vblank & 7; }
+READ8_MEMBER( namco_c148_device::cpu_irq_level_r ) { return m_irqlevel.cpu & 7; }
+READ8_MEMBER( namco_c148_device::ex_irq_level_r ) { return m_irqlevel.ex & 7; }
+READ8_MEMBER( namco_c148_device::sci_irq_level_r ) { return m_irqlevel.sci & 7; }
+
+inline void namco_c148_device::flush_irq_acks()
+{
+ // If writing an IRQ priority register, clear any pending IRQs.
+ // Dirt Fox and Winning Run require this behaviour
+ // TODO: literal behaviour, Winning Run GPU doesn't seem to care about irq ack ports at all?
+ for(int i=0;i<8;i++)
+ m_hostcpu->set_input_line(i,CLEAR_LINE);
+}
+
+WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) { m_irqlevel.pos = data & 7; flush_irq_acks(); if(data != 0) { LOG(("%s: pos IRQ level = %02x\n",this->tag(),data)); } }
+WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; flush_irq_acks(); LOG(("%s: vblank IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::cpu_irq_level_w ) { m_irqlevel.cpu = data & 7; flush_irq_acks(); LOG(("%s: cpu IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::ex_irq_level_w ) { m_irqlevel.ex = data & 7; flush_irq_acks(); LOG(("%s: ex IRQ level = %02x\n",this->tag(),data)); }
+WRITE8_MEMBER( namco_c148_device::sci_irq_level_w ) { m_irqlevel.sci = data & 7; flush_irq_acks(); LOG(("%s: sci IRQ level = %02x\n",this->tag(),data)); }
+
+READ16_MEMBER( namco_c148_device::vblank_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::pos_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::cpu_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::ex_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); return 0; }
+READ16_MEMBER( namco_c148_device::sci_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); return 0; }
+
+WRITE16_MEMBER( namco_c148_device::vblank_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::pos_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::cpu_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::ex_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); }
+WRITE16_MEMBER( namco_c148_device::sci_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); }
+
+//**************************************************************************
+// Comm ports
+//**************************************************************************
+
+READ8_MEMBER( namco_c148_device::ext_r )
+{
+ return 0xff; // TODO: bit 0 EEPROM bit ready
+}
+
+WRITE8_MEMBER( namco_c148_device::ext1_w )
+{
+ m_out_ext1_cb(data & 7);
+}
+
+WRITE8_MEMBER( namco_c148_device::ext2_w )
+{
+ m_out_ext2_cb(data & 7);
+ // TODO: bit 1/2 in Winning Run GPU might be irq enable?
+}
+
+READ8_MEMBER( namco_c148_device::bus_ctrl_r )
+{
+ return m_bus_reg;
+}
+
+WRITE8_MEMBER( namco_c148_device::bus_ctrl_w )
+{
+ m_bus_reg = data & 7;
+}
+
+
+WRITE16_MEMBER( namco_c148_device::cpu_irq_assert_w)
+{
+ // TODO: Starblade relies on this for showing large polygons, is it the right place?
+ m_linked_c148->cpu_irq_trigger();
+}
+
+//**************************************************************************
+// GETTERS/SETTERS
+//**************************************************************************
+
+void namco_c148_device::vblank_irq_trigger()
+{
+ // TODO: Phelios doesn't ack the vblank irq at all!
+ m_hostcpu->set_input_line(m_irqlevel.vblank, HOLD_LINE);
+}
+
+void namco_c148_device::pos_irq_trigger()
+{
+ m_hostcpu->set_input_line(m_irqlevel.pos, ASSERT_LINE);
+}
+
+void namco_c148_device::cpu_irq_trigger()
+{
+ m_hostcpu->set_input_line(m_irqlevel.cpu, ASSERT_LINE);
+}
+
+void namco_c148_device::ex_irq_trigger()
+{
+ m_hostcpu->set_input_line(m_irqlevel.ex, ASSERT_LINE);
+}
+
+void namco_c148_device::sci_irq_trigger()
+{
+ m_hostcpu->set_input_line(m_irqlevel.sci, ASSERT_LINE);
+}
+
+// TODO: these doesn't belong here, needs C116 device
+READ8_MEMBER( namco_c148_device::ext_posirq_line_r )
+{
+ // TODO: same as regular register? winrun91 reads here and subs with integer 0x39 for a new posirq that never gets triggered.
+ return (m_posirq_line) & 0xff;
+}
+
+WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w )
+{
+ m_posirq_line = data;
+}
+
+uint8_t namco_c148_device::get_posirq_line()
+{
+ return m_posirq_line;
+}
+
diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h
new file mode 100644
index 00000000000..3f53228ebcc
--- /dev/null
+++ b/src/mame/machine/namco_c148.h
@@ -0,0 +1,143 @@
+// license:BSD-3-Clause
+// copyright-holders:Angelo Salese
+/***************************************************************************
+
+ Namco C148 - CPU Bus Manager
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __NAMCO_C148DEV_H__
+#define __NAMCO_C148DEV_H__
+
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_NAMCO_C148_ADD(_tag, _cputag, _cpumaster) \
+ MCFG_DEVICE_ADD(_tag, NAMCO_C148, 0) \
+ namco_c148_device::configure_device(*device, _cputag, _cpumaster);
+
+#define MCFG_NAMCO_C148_EXT1_CB(_cb) \
+ devcb = &namco_c148_device::set_out_ext1_callback(*device, DEVCB_##_cb);
+
+#define MCFG_NAMCO_C148_EXT2_CB(_cb) \
+ devcb = &namco_c148_device::set_out_ext2_callback(*device, DEVCB_##_cb);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> namco_c148_device
+
+class namco_c148_device : public device_t
+{
+public:
+ // construction/destruction
+ namco_c148_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ DECLARE_ADDRESS_MAP(map, 16);
+
+ static void configure_device(device_t &device, const char *tag, bool is_master)
+ {
+ namco_c148_device &dev = downcast<namco_c148_device &>(device);
+ dev.m_hostcpu_tag = tag;
+ dev.m_hostcpu_master = is_master;
+ }
+
+ static void link_c148_device(device_t &device, const char *tag)
+ {
+ namco_c148_device &dev = downcast<namco_c148_device &>(device);
+
+ dev.m_linked_c148_tag = tag;
+ }
+
+ template<class _Object> static devcb_base &set_out_ext1_callback(device_t &device, _Object object) { return downcast<namco_c148_device &>(device).m_out_ext1_cb.set_callback(object); }
+ template<class _Object> static devcb_base &set_out_ext2_callback(device_t &device, _Object object) { return downcast<namco_c148_device &>(device).m_out_ext2_cb.set_callback(object); }
+
+ devcb_write8 m_out_ext1_cb;
+ devcb_write8 m_out_ext2_cb;
+
+ DECLARE_READ8_MEMBER( vblank_irq_level_r );
+ DECLARE_WRITE8_MEMBER( vblank_irq_level_w );
+ DECLARE_READ16_MEMBER( vblank_irq_ack_r );
+ DECLARE_WRITE16_MEMBER( vblank_irq_ack_w );
+
+ DECLARE_READ8_MEMBER( pos_irq_level_r );
+ DECLARE_WRITE8_MEMBER( pos_irq_level_w );
+ DECLARE_READ16_MEMBER( pos_irq_ack_r );
+ DECLARE_WRITE16_MEMBER( pos_irq_ack_w );
+
+ DECLARE_READ8_MEMBER( cpu_irq_level_r );
+ DECLARE_WRITE8_MEMBER( cpu_irq_level_w );
+ DECLARE_READ16_MEMBER( cpu_irq_ack_r );
+ DECLARE_WRITE16_MEMBER( cpu_irq_ack_w );
+
+ DECLARE_READ8_MEMBER( ex_irq_level_r );
+ DECLARE_WRITE8_MEMBER( ex_irq_level_w );
+ DECLARE_READ16_MEMBER( ex_irq_ack_r );
+ DECLARE_WRITE16_MEMBER( ex_irq_ack_w );
+
+ DECLARE_READ8_MEMBER( sci_irq_level_r );
+ DECLARE_WRITE8_MEMBER( sci_irq_level_w );
+ DECLARE_READ16_MEMBER( sci_irq_ack_r );
+ DECLARE_WRITE16_MEMBER( sci_irq_ack_w );
+
+ DECLARE_READ8_MEMBER( ext_posirq_line_r );
+ DECLARE_WRITE8_MEMBER( ext_posirq_line_w );
+ DECLARE_WRITE16_MEMBER( cpu_irq_assert_w );
+
+ DECLARE_READ8_MEMBER( bus_ctrl_r );
+ DECLARE_WRITE8_MEMBER( bus_ctrl_w );
+
+ DECLARE_READ8_MEMBER( ext_r );
+ DECLARE_WRITE8_MEMBER( ext1_w );
+ DECLARE_WRITE8_MEMBER( ext2_w );
+ void vblank_irq_trigger();
+ void pos_irq_trigger();
+ void ex_irq_trigger();
+ void sci_irq_trigger();
+ uint8_t get_posirq_line();
+
+protected:
+ void cpu_irq_trigger();
+ // device-level overrides
+// virtual void device_validity_check(validity_checker &valid) const;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+private:
+ cpu_device *m_hostcpu; /**< reference to the host cpu */
+ namco_c148_device *m_linked_c148; /**< reference to linked master/slave c148 */
+ const char *m_hostcpu_tag; /**< host cpu tag name */
+ const char *m_linked_c148_tag; /**< other c148 tag name */
+ bool m_hostcpu_master; /**< define if host cpu is master */
+ struct{
+ uint8_t cpu;
+ uint8_t ex;
+ uint8_t sci;
+ uint8_t pos;
+ uint8_t vblank;
+ }m_irqlevel;
+
+ uint8_t m_posirq_line;
+ uint8_t m_bus_reg;
+ void flush_irq_acks();
+};
+
+
+// device type definition
+extern const device_type NAMCO_C148;
+
+
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+
+
+#endif
diff --git a/src/mame/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp
index 993157854aa..d2c23f350ed 100644
--- a/src/mame/machine/namcos2.cpp
+++ b/src/mame/machine/namcos2.cpp
@@ -71,6 +71,44 @@ READ16_MEMBER( namcos2_state::namcos2_finallap_prot_r )
#define m_eeprom_size 0x2000
+WRITE8_MEMBER(namcos2_shared_state::sound_reset_w)
+{
+ address_space &masterspace = m_maincpu->space(AS_PROGRAM);
+
+ if (data & 0x01)
+ {
+ /* Resume execution */
+ m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
+ masterspace.device().execute().yield();
+ }
+ else
+ {
+ /* Suspend execution */
+ m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
+ }
+
+ if (namcos2_kickstart != nullptr)
+ {
+ //printf( "dspkick=0x%x\n", data );
+ if (data & 0x04)
+ {
+ (*namcos2_kickstart)(space.machine(), 1);
+ }
+ }
+}
+
+// TODO:
+WRITE8_MEMBER(namcos2_shared_state::system_reset_w)
+{
+ reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE);
+
+ if (data & 0x01)
+ {
+ address_space &masterspace = m_maincpu->space(AS_PROGRAM);
+ masterspace.device().execute().yield();
+ }
+}
+
void namcos2_shared_state::reset_all_subcpus(int state)
{
m_slave->set_input_line(INPUT_LINE_RESET, state);
@@ -104,7 +142,6 @@ MACHINE_START_MEMBER(namcos2_shared_state,namcos2)
namcos2_kickstart = nullptr;
m_eeprom = std::make_unique<uint8_t[]>(m_eeprom_size);
machine().device<nvram_device>("nvram")->set_base(m_eeprom.get(), m_eeprom_size);
- m_posirq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos2_shared_state::namcos2_posirq_tick),this));
}
MACHINE_RESET_MEMBER(namcos2_shared_state, namcos2)
@@ -124,12 +161,6 @@ MACHINE_RESET_MEMBER(namcos2_shared_state, namcos2)
/* Place CPU2 & CPU3 into the reset condition */
reset_all_subcpus(ASSERT_LINE);
- /* Initialise interrupt handlers */
- init_c148();
-
- /* reset POSIRQ timer */
- m_posirq_timer->adjust(attotime::never);
-
m_player_mux = 0;
}
@@ -147,40 +178,6 @@ READ8_MEMBER( namcos2_shared_state::namcos2_68k_eeprom_r )
return m_eeprom[offset];
}
-
-
-/**************************************************************/
-/* 68000 Shared serial communications processor (CPU5?) */
-/**************************************************************/
-
-READ16_MEMBER( namcos2_state::serial_comms_ram_r ){
- return m_serial_comms_ram[offset];
-}
-
-WRITE16_MEMBER( namcos2_state::serial_comms_ram_w ){
- COMBINE_DATA( &m_serial_comms_ram[offset] );
-}
-
-READ16_MEMBER( namcos2_state::serial_comms_ctrl_r )
-{
- uint16_t retval = m_serial_comms_ctrl[offset];
-
- switch(offset){
- case 0x00:
- retval |= 0x0004; /* Set READY? status bit */
- break;
-
- default:
- break;
- }
- return retval;
-}
-
-WRITE16_MEMBER( namcos2_state::serial_comms_ctrl_w )
-{
- COMBINE_DATA( &m_serial_comms_ctrl[offset] );
-}
-
/*************************************************************/
/* 68000 Shared protection/random key generator */
/*************************************************************
@@ -435,252 +432,6 @@ bool namcos2_shared_state::is_system21()
}
}
-void namcos2_shared_state::init_c148()
-{
- for(int loop = 0; loop < 0x20; loop++)
- {
- m_68k_master_C148[loop] = 0;
- m_68k_slave_C148[loop] = 0;
- m_68k_gpu_C148[loop] = 0;
- }
-}
-
-uint16_t namcos2_shared_state::readwrite_c148( address_space &space, offs_t offset, uint16_t data, int bWrite )
-{
- offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000;
- device_t *altcpu = nullptr;
- uint16_t *pC148Reg = nullptr;
- uint16_t *pC148RegAlt = nullptr;
- uint16_t result = 0;
-
- if (&space.device() == m_maincpu)
- {
- pC148Reg = m_68k_master_C148;
- altcpu = m_slave;
- pC148RegAlt = m_68k_slave_C148;
- }
- else if (&space.device() == m_slave)
- {
- pC148Reg = m_68k_slave_C148;
- altcpu = m_maincpu;
- pC148RegAlt = m_68k_master_C148;
- }
- else if (&space.device() == m_gpu)
- {
- pC148Reg = m_68k_gpu_C148;
- altcpu = m_maincpu;
- pC148RegAlt = m_68k_master_C148;
- }
-
- if( bWrite )
- {
- int reg = (addr >> 13) & 0x1f;
-
- // If writing an IRQ priority register, clear any pending IRQs.
- // Dirt Fox and Winning Run require this behaviour
- if (reg < 8)
- space.device().execute().set_input_line(pC148Reg[reg], CLEAR_LINE);
-
- pC148Reg[reg] = data & 0x0007;
- }
-
- switch(addr)
- {
- case 0x1c0000: break; /* ? NAMCOS2_C148_0 */
- case 0x1c2000: break; /* ? NAMCOS2_C148_1 */
- case 0x1c4000: break; /* ? NAMCOS2_C148_2 */
-
- /* IRQ level */
- case 0x1c6000: break; /* NAMCOS2_C148_CPUIRQ */
- case 0x1c8000: break; /* NAMCOS2_C148_EXIRQ */
- case 0x1ca000: break; /* NAMCOS2_C148_POSIRQ */
- case 0x1cc000: break; /* NAMCOS2_C148_SERIRQ */
- case 0x1ce000: break; /* NAMCOS2_C148_VBLANKIRQ */
-
- case 0x1d0000: /* ? NAMCOS2_C148_0 */
- if( bWrite )
- {
- // osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- /* Dubious to assert IRQ for other CPU here, but Starblade seems to rely on it.
- It fails to show large polygons otherwise. */
- altcpu->execute().set_input_line(pC148RegAlt[NAMCOS2_C148_CPUIRQ], ASSERT_LINE);
- }
- break;
-
- case 0x1d2000: break; /* ? NAMCOS2_C148_1 */
-
- case 0x1d4000: /* ? NAMCOS2_C148_2 */
- if( bWrite )
- {
- // osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- /* Dubious to assert IRQ for other CPU here: Rolling Thunder 2 and Fine Hour break. */
- // altcpu->execute().set_input_line(pC148RegAlt[NAMCOS2_C148_CPUIRQ], ASSERT_LINE);
- }
- break;
-
-
- /* IRQ ack */
- case 0x1d6000: /* NAMCOS2_C148_CPUIRQ */
- // if( bWrite ) osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_CPUIRQ], CLEAR_LINE);
- break;
-
- case 0x1d8000: /* NAMCOS2_C148_EXIRQ */
- // if( bWrite ) osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_EXIRQ], CLEAR_LINE);
- break;
-
- case 0x1da000: /* NAMCOS2_C148_POSIRQ */
- // if( bWrite ) osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_POSIRQ], CLEAR_LINE);
- break;
-
- case 0x1dc000: /* NAMCOS2_C148_SERIRQ */
- // if( bWrite ) osd_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data );
- space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_SERIRQ], CLEAR_LINE);
- break;
-
- case 0x1de000: /* NAMCOS2_C148_VBLANKIRQ */
- space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_VBLANKIRQ], CLEAR_LINE);
- break;
-
-
- case 0x1e0000: /* EEPROM Status Register */
- result = ~0; /* Only BIT0 used: 1=EEPROM READY 0=EEPROM BUSY */
- break;
-
- case 0x1e2000: /* Sound CPU Reset control */
- if (&space.device() == m_maincpu) /* ? */
- {
- if (data & 0x01)
- {
- /* Resume execution */
- m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
- space.device().execute().yield();
- }
- else
- {
- /* Suspend execution */
- m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- }
- if (namcos2_kickstart != nullptr)
- {
- //printf( "dspkick=0x%x\n", data );
- if (data & 0x04)
- {
- (*namcos2_kickstart)(space.machine(), 1);
- }
- }
- }
- break;
-
- case 0x1e4000: /* Alt 68000 & IO CPU Reset */
- if (&space.device() == m_maincpu) /* ? */
- {
- if (data & 0x01)
- { /* Resume execution */
- reset_all_subcpus(CLEAR_LINE);
- /* Give the new CPU an immediate slice of the action */
- space.device().execute().yield();
- }
- else
- { /* Suspend execution */
- reset_all_subcpus(ASSERT_LINE);
- }
- }
- break;
-
- case 0x1e6000: /* Watchdog reset kicker */
- /* watchdog_reset_w(0,0); */
- break;
-
- default:
- break;
- }
- return result;
-}
-
-WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_w )
-{
- (void)readwrite_c148(space, offset, data, 1);
-}
-
-READ16_MEMBER( namcos2_shared_state::namcos2_68k_master_C148_r )
-{
- return readwrite_c148(space, offset, 0, 0);
-}
-
-WRITE16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_w )
-{
- (void)readwrite_c148(space, offset, data, 1);
-}
-
-READ16_MEMBER( namcos2_shared_state::namcos2_68k_slave_C148_r )
-{
- return readwrite_c148(space, offset, 0, 0);
-}
-
-WRITE16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_w )
-{
- (void)readwrite_c148(space, offset, data, 1);
-}
-
-READ16_MEMBER( namcos2_shared_state::namcos21_68k_gpu_C148_r )
-{
- return readwrite_c148(space, offset, 0, 0);
-}
-
-
-int namcos2_shared_state::get_posirq_scanline()
-{
- if (is_system21()) return 0;
- return downcast<namcos2_state *>(this)->get_pos_irq_scanline();
-}
-
-TIMER_CALLBACK_MEMBER(namcos2_shared_state::namcos2_posirq_tick)
-{
- if (is_system21()) {
- if (m_68k_gpu_C148[NAMCOS2_C148_POSIRQ]) {
- m_screen->update_partial(param);
- m_gpu->set_input_line(m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
- }
- return;
- }
-
- if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]|m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) {
- m_screen->update_partial(param);
- if (m_68k_master_C148[NAMCOS2_C148_POSIRQ]) m_maincpu->set_input_line(m_68k_master_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
- if (m_68k_slave_C148[NAMCOS2_C148_POSIRQ]) m_slave->set_input_line(m_68k_slave_C148[NAMCOS2_C148_POSIRQ] , ASSERT_LINE);
- }
-}
-
-void namcos2_shared_state::adjust_posirq_timer( int scanline )
-{
- m_posirq_timer->adjust(m_screen->time_until_pos(scanline, 80), scanline);
-}
-
-INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_master_vblank)
-{
- if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
- device.execute().set_input_line(m_68k_master_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
-}
-
-INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_slave_vblank)
-{
- if (!is_system21()) adjust_posirq_timer(get_posirq_scanline());
- device.execute().set_input_line(m_68k_slave_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
-}
-
-INTERRUPT_GEN_MEMBER(namcos2_shared_state::namcos2_68k_gpu_vblank)
-{
- /* only used by namcos21 */
- //int scanline = get_posirq_scanline();
- int32_t scanline = 0x50+0x89; /* HACK for Winning Run */
-
- //printf( "namcos2_68k_gpu_vblank(%d)\n",m_68k_gpu_C148[NAMCOS2_C148_POSIRQ] );
- adjust_posirq_timer(scanline);
- device.execute().set_input_line(m_68k_gpu_C148[NAMCOS2_C148_VBLANKIRQ], HOLD_LINE);
-}
/**************************************************************/
/* Sound sub-system */
diff --git a/src/mame/machine/nl_stuntcyc.cpp b/src/mame/machine/nl_stuntcyc.cpp
index ee4227932c8..ccbf4b2906e 100644
--- a/src/mame/machine/nl_stuntcyc.cpp
+++ b/src/mame/machine/nl_stuntcyc.cpp
@@ -77,10 +77,10 @@ NETLIST_START(stuntcyc)
ALIAS(VRESET, M3_2.QQ)
ALIAS(VRESET_Q, M3_2.Q)
- TTL_7402_NOR(J5_2, H6_3.Q, J5_1.Q)
- TTL_7402_NOR(J5_1, 32H, J5_2.Q)
- TTL_7402_NOR(J5_3, 8V, J5_4.Q)
- TTL_7402_NOR(J5_4, VRESET, J5_3.Q)
+ TTL_7402_NOR(J5_2, HSYNC, HRESET)
+ TTL_7402_NOR(J5_1, 32H, HSYNC_Q)
+ TTL_7402_NOR(J5_3, 8V, VSYNC_Q)
+ TTL_7402_NOR(J5_4, VSYNC, VRESET)
ALIAS(HSYNC, J5_1.Q)
ALIAS(HSYNC_Q, J5_2.Q)
ALIAS(VSYNC, J5_3.Q)
@@ -93,18 +93,19 @@ NETLIST_START(stuntcyc)
ALIAS(RAMP_WINDOW_HIT_Q, N5_2.Q)
TTL_7474(N4_1, H_WINDOW, HSYNC, RAMP_WINDOW_HIT_Q, N4_1.QQ)
- TTL_7474(M3_1, N4_1.Q, M3_1.QQ, CYCLE_RESET_Q, P)
+ TTL_7474(M3_1, N4_1.Q, DIRECTION_Q, CYCLE_RESET_Q, P)
ALIAS(DIRECTION, M3_1.Q)
ALIAS(DIRECTION_Q, M3_1.QQ)
TTL_7404_INVERT(N3_3, 32V)
- TTL_7474(J2_2, N3_3.Q, J2_1.Q, P, P)
+ ALIAS(32V_Q, N3_3.Q)
+ TTL_7474(J2_2, 32V_Q, J2_1.Q, P, P)
TTL_7474(J2_1, N4_1.Q, P, J2_2.QQ, P)
TTL_7408_AND(H5_2, 256V_Q, VSYNC_Q)
TTL_9316(K1, HSYNC, P, H5_2.Q, V_COUNTER_RESET_Q, L2_3.Q, Av, Bv, Cv, Dv)
TTL_9316(K2, HSYNC, K1.RC, J2_2.QQ, V_COUNTER_RESET_Q, L2_3.Q, GROUND, GROUND, GROUND, GROUND)
- TTL_7400_NAND(L2_3, K1.RC, K2.RC)
+ TTL_7400_NAND(L2_3, K1.RC, V_WINDOW)
ALIAS(V1, K1.QA)
ALIAS(V2, K1.QB)
ALIAS(V3, K1.QC)
@@ -308,9 +309,9 @@ NETLIST_START(stuntcyc)
TTL_7410_NAND(E3_1, SCORE_1_Q, OBJECTS_Q, E4_3.Q)
ALIAS(WHITE_VIDEO, E3_1.Q)
- TTL_7402_NOR(F4_2, PLAYER_CONTROL, CYCLE)
+ TTL_7400_NAND(F4_2, PLAYER_CONTROL, CYCLE)
TTL_7404_INVERT(D3_1, F4_4.Q)
- TTL_7402_NOR(F4_3, C8_3.Q, D3_1.Q)
+ TTL_7400_NAND(F4_3, C8_3.Q, D3_1.Q)
TTL_7410_NAND(E3_2, F4_2.Q, F4_3.Q, F3_1.Q)
TTL_7400_NAND(F4_1, RAMPS_Q, ROAD_Q)
TTL_7427_NOR(E4_2, F4_1.Q, SCORE_2, E3_2.Q)
diff --git a/src/mame/machine/nycaptor.cpp b/src/mame/machine/nycaptor.cpp
index 8a3f61311bf..4bb6e21a394 100644
--- a/src/mame/machine/nycaptor.cpp
+++ b/src/mame/machine/nycaptor.cpp
@@ -12,105 +12,15 @@
#include "emu.h"
#include "includes/nycaptor.h"
-READ8_MEMBER(nycaptor_state::nycaptor_68705_port_a_r)
-{
- return (m_port_a_out & m_ddr_a) | (m_port_a_in & ~m_ddr_a);
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_port_a_w)
-{
- m_port_a_out = data;
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_ddr_a_w)
-{
- m_ddr_a = data;
-}
-
-/*
- * Port B connections:
- *
- * all bits are logical 1 when read (+5V pullup)
- *
- * 1 W when 1->0, enables latch which brings the command from main CPU (read from port A)
- * 2 W when 0->1, copies port A to the latch for the main CPU
- */
-
-READ8_MEMBER(nycaptor_state::nycaptor_68705_port_b_r)
-{
- return (m_port_b_out & m_ddr_b) | (m_port_b_in & ~m_ddr_b);
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_port_b_w)
-{
- if (BIT(m_ddr_b, 1) && BIT(~data, 1) && BIT(m_port_b_out, 1))
- {
- m_port_a_in = m_from_main;
-
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
- m_main_sent = 0;
-
- }
-
- if (BIT(m_ddr_b, 2) && BIT(data, 2) && BIT(~m_port_b_out, 2))
- {
- m_from_mcu = m_port_a_out;
- m_mcu_sent = 1;
- }
-
- m_port_b_out = data;
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_ddr_b_w)
-{
- m_ddr_b = data;
-}
-
-
-READ8_MEMBER(nycaptor_state::nycaptor_68705_port_c_r)
-{
- m_port_c_in = 0;
-
- if (m_main_sent)
- m_port_c_in |= 0x01;
- if (!m_mcu_sent)
- m_port_c_in |= 0x02;
-
- return (m_port_c_out & m_ddr_c) | (m_port_c_in & ~m_ddr_c);
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_port_c_w)
-{
- m_port_c_out = data;
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_68705_ddr_c_w)
-{
- m_ddr_c = data;
-}
-
-WRITE8_MEMBER(nycaptor_state::nycaptor_mcu_w)
-{
- m_from_main = data;
- m_main_sent = 1;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-READ8_MEMBER(nycaptor_state::nycaptor_mcu_r)
-{
- m_mcu_sent = 0;
- return m_from_mcu;
-}
READ8_MEMBER(nycaptor_state::nycaptor_mcu_status_r1)
{
/* bit 1 = when 1, mcu has sent data to the main cpu */
- return m_mcu_sent ? 2 : 0;
+ return m_bmcu->get_mcu_sent() ? 2 : 0;
}
READ8_MEMBER(nycaptor_state::nycaptor_mcu_status_r2)
{
/* bit 0 = when 1, mcu is ready to receive data from main cpu */
- return m_main_sent ? 0 : 1;
+ return m_bmcu->get_main_sent() ? 0 : 1;
}
diff --git a/src/mame/machine/slapfght.cpp b/src/mame/machine/slapfght.cpp
index c8243414810..d362a1a76c6 100644
--- a/src/mame/machine/slapfght.cpp
+++ b/src/mame/machine/slapfght.cpp
@@ -12,26 +12,6 @@
#include "includes/slapfght.h"
-/***************************************************************************
-
- Tiger Heli MCU
-
-***************************************************************************/
-
-READ8_MEMBER(slapfght_state::tigerh_mcu_r)
-{
- m_mcu_sent = false;
- return m_from_mcu;
-}
-
-WRITE8_MEMBER(slapfght_state::tigerh_mcu_w)
-{
- m_from_main = data;
- m_main_sent = true;
- m_mcu->set_input_line(0, ASSERT_LINE);
-}
-
-
/**************************************************************************/
READ8_MEMBER(slapfght_state::tigerh_mcu_status_r)
@@ -39,115 +19,24 @@ READ8_MEMBER(slapfght_state::tigerh_mcu_status_r)
// d0 is vblank
uint8_t res = m_screen->vblank() ? 1 : 0;
- if (!m_main_sent)
- res |= 0x02;
- if (!m_mcu_sent)
- res |= 0x04;
-
- return res;
-}
-
-
-/***************************************************************************
-
- MCU port handlers (general)
-
-***************************************************************************/
-
-
-READ8_MEMBER(slapfght_state::tigerh_mcu_porta_r)
-{
- return m_to_mcu_latch;
-}
-
-WRITE8_MEMBER(slapfght_state::tigerh_mcu_porta_w)
-{
- m_from_mcu_latch = data;
-}
-
-
-/***************************************************************************
-
- MCU port handlers (Tiger Heli)
-
-***************************************************************************/
-
-WRITE8_MEMBER(slapfght_state::tigerh_mcu_portb_w)
-{
- if ((mem_mask & 0x02) && (~data & 0x02) && (m_old_portB & 0x02))
+ if (m_bmcu)
{
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
-
- m_to_mcu_latch = m_from_main;
- m_main_sent = false;
- }
- if ((mem_mask & 0x04) && (data & 0x04) && (~m_old_portB & 0x04))
- {
- m_from_mcu = m_from_mcu_latch;
- m_mcu_sent = true;
+ if (!m_bmcu->get_main_sent())
+ res |= 0x02;
+ if (!m_bmcu->get_mcu_sent())
+ res |= 0x04;
}
- m_old_portB = data;
-}
-
-READ8_MEMBER(slapfght_state::tigerh_mcu_portc_r)
-{
- uint8_t ret = 0;
-
- if (!m_main_sent)
- ret |= 0x01;
- if (m_mcu_sent)
- ret |= 0x02;
-
- return ret;
+ return res;
}
-/***************************************************************************
-
- MCU port handlers (Slap Fight)
-
-***************************************************************************/
-
-WRITE8_MEMBER(slapfght_state::slapfght_mcu_portb_w)
+WRITE8_MEMBER(slapfght_state::scroll_from_mcu_w)
{
- if ((mem_mask & 0x02) && (~data & 0x02) && (m_old_portB & 0x02))
- {
- if (m_main_sent)
- m_mcu->set_input_line(0, CLEAR_LINE);
-
- m_to_mcu_latch = m_from_main;
- m_main_sent = false;
- }
- if ((mem_mask & 0x04) && (data & 0x04) && (~m_old_portB & 0x04))
- {
- m_from_mcu = m_from_mcu_latch;
- m_mcu_sent = true;
- }
- if ((mem_mask & 0x08) && (~data & 0x08) && (m_old_portB & 0x08))
- {
- m_scrollx_lo = m_from_mcu_latch;
- }
- if ((mem_mask & 0x10) && (~data & 0x10) && (m_old_portB & 0x10))
+ switch (offset)
{
- m_scrollx_hi = m_from_mcu_latch;
+ case 0x00: m_scrollx_lo = data; break;
+ case 0x01: m_scrollx_hi = data; break;
}
-
- m_old_portB = data;
-}
-
-READ8_MEMBER(slapfght_state::slapfght_mcu_portc_r)
-{
- uint8_t ret = 0;
-
- if (!m_main_sent)
- ret |= 0x01;
- if (m_mcu_sent)
- ret |= 0x02;
-
- ret ^= 0x3; // inverted logic compared to tigerh
-
- return ret;
}
/***************************************************************************
diff --git a/src/mame/machine/tait8741.cpp b/src/mame/machine/tait8741.cpp
index 612831749f7..3ea6607b1b0 100644
--- a/src/mame/machine/tait8741.cpp
+++ b/src/mame/machine/tait8741.cpp
@@ -332,183 +332,3 @@ uint8_t taito8741_4pack_device::port_read(int num, int offset)
default : return 0;
}
}
-
-/****************************************************************************
-
-joshi Vollyball set.
-
- Only the chip of the communication between MAIN and the SUB.
- For the I/O, there may be I8741 of the addition.
-
- MCU code is not dumped.
- There is some HACK operation because the emulation is imperfect.
-
-****************************************************************************/
-
-const device_type JOSVOLLY8741_4PACK = &device_creator<josvolly8741_4pack_device>;
-
-josvolly8741_4pack_device::josvolly8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, JOSVOLLY8741_4PACK, "I8741 MCU Simulation (Joshi Volleyball)", tag, owner, clock, "josvolly8741_4pack", __FILE__),
- m_port_handler_0_r(*this),
- m_port_handler_1_r(*this),
- m_port_handler_2_r(*this),
- m_port_handler_3_r(*this)
-{
-}
-
-void josvolly8741_4pack_device::device_start()
-{
- m_port_handler_0_r.resolve_safe(0);
- m_port_handler_1_r.resolve_safe(0);
- m_port_handler_2_r.resolve_safe(0);
- m_port_handler_3_r.resolve_safe(0);
-
- for (int i = 0; i < 4; i++)
- {
- save_item(NAME(m_i8741[i].cmd), i);
- save_item(NAME(m_i8741[i].sts), i);
- save_item(NAME(m_i8741[i].txd), i);
- //save_item(NAME(m_i8741[i].outport), i); //currently initialized to 0xff, never changed
- save_item(NAME(m_i8741[i].rxd), i);
- save_item(NAME(m_i8741[i].rst), i);
- };
-
- save_item(NAME(m_nmi_enable));
-}
-
-
-void josvolly8741_4pack_device::device_reset()
-{
- m_nmi_enable = 0;
-
- for(auto & elem : m_i8741)
- {
- elem.cmd = 0;
- elem.sts = 0; // 0xf0; /* init flag */
- elem.txd = 0;
- elem.outport = 0xff;
- elem.rxd = 0;
-
- elem.rst = 1;
- }
-}
-
-/* transmit data finish callback */
-TIMER_CALLBACK_MEMBER( josvolly8741_4pack_device::tx )
-{
- int num = param;
- JV8741 *src = &m_i8741[num];
- JV8741 *dst = &m_i8741[src->connect];
-
- dst->rxd = src->txd;
-
- src->sts &= ~0x02; /* TX full ? */
- dst->sts |= 0x01; /* RX ready ? */
-}
-
-void josvolly8741_4pack_device::update(int num)
-{
- if( (m_i8741[num].sts & 0x02) )
- {
- /* transmit data */
- machine().scheduler().timer_set (attotime::from_usec(1), timer_expired_delegate(FUNC(josvolly8741_4pack_device::tx),this), num);
- }
-}
-
-void josvolly8741_4pack_device::write(int num, int offset, int data)
-{
- JV8741 *mcu = &m_i8741[num];
-
- if(offset==1)
- {
- LOG(("%s:8741[%d] CW %02X\n", machine().describe_context(), num, data));
-
- /* read pointer */
- mcu->cmd = data;
- /* CMD */
- switch(data)
- {
- case 0:
- mcu->txd = data ^ 0x40;
- mcu->sts |= 0x02;
- break;
- case 1:
- mcu->txd = data ^ 0x40;
- mcu->sts |= 0x02;
-#if 1
- /* ?? */
- mcu->rxd = 0; /* SBSTS ( DIAG ) , killed */
- mcu->sts |= 0x01; /* RD ready */
-#endif
- break;
- case 2:
-#if 1
- mcu->rxd = port_read(1);
- mcu->sts |= 0x01; /* RD ready */
-#endif
- break;
- case 3: /* normal mode ? */
- break;
-
- case 0xf0: /* clear main sts ? */
- mcu->txd = data ^ 0x40;
- mcu->sts |= 0x02;
- break;
- }
- }
- else
- {
- /* data */
- LOG(("%s:8741[%d] DW %02X\n", machine().describe_context(), num, data));
-
- mcu->txd = data ^ 0x40; /* parity reverce ? */
- mcu->sts |= 0x02; /* TXD busy */
-#if 1
- /* interrupt ? */
- if(num == 0)
- {
- if(m_nmi_enable)
- {
- machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
- m_nmi_enable = 0;
- }
- }
-#endif
- }
- update(num);
-}
-
-uint8_t josvolly8741_4pack_device::read(int num,int offset)
-{
- JV8741 *mcu = &m_i8741[num];
- int ret;
-
- if(offset==1)
- {
- if(mcu->rst)
- mcu->rxd = port_read(num); /* port in */
- ret = mcu->sts;
- LOG(("%s:8741[%d] SR %02X\n",machine().describe_context(),num,ret));
- }
- else
- {
- /* clear status port */
- mcu->sts &= ~0x01; /* RD ready */
- ret = mcu->rxd;
- LOG(("%s:8741[%d] DR %02X\n",machine().describe_context(),num,ret));
- mcu->rst = 0;
- }
- return ret;
-}
-
-uint8_t josvolly8741_4pack_device::port_read(int num)
-{
- switch(num)
- {
- case 0 : return m_port_handler_0_r(0);
- case 1 : return m_port_handler_1_r(0);
- case 2 : return m_port_handler_2_r(0);
- case 3 : return m_port_handler_3_r(0);
- default : return 0;
- }
-}
diff --git a/src/mame/machine/tait8741.h b/src/mame/machine/tait8741.h
index abf87272503..77e2c6338f7 100644
--- a/src/mame/machine/tait8741.h
+++ b/src/mame/machine/tait8741.h
@@ -109,81 +109,4 @@ private:
extern const device_type TAITO8741_4PACK;
-
-/****************************************************************************
- joshi Volleyball set.
-****************************************************************************/
-
-#define MCFG_JOSVOLLY8741_ADD(_tag) \
- MCFG_DEVICE_ADD(_tag, JOSVOLLY8741_4PACK, 0)
-
-#define MCFG_JOSVOLLY8741_PORT_HANDLERS(_devcb0, _devcb1, _devcb2, _devcb3) \
- devcb = &josvolly8741_4pack_device::set_port_handler_0_callback(*device, DEVCB_##_devcb0); \
- devcb = &josvolly8741_4pack_device::set_port_handler_1_callback(*device, DEVCB_##_devcb1); \
- devcb = &josvolly8741_4pack_device::set_port_handler_2_callback(*device, DEVCB_##_devcb2); \
- devcb = &josvolly8741_4pack_device::set_port_handler_3_callback(*device, DEVCB_##_devcb3);
-
-#define MCFG_JOSVOLLY8741_CONNECT(_con0, _con1, _con2, _con3) \
- josvolly8741_4pack_device::static_set_connect(*device, 0, _con0); \
- josvolly8741_4pack_device::static_set_connect(*device, 1, _con1); \
- josvolly8741_4pack_device::static_set_connect(*device, 2, _con2); \
- josvolly8741_4pack_device::static_set_connect(*device, 3, _con3);
-
-
-class josvolly8741_4pack_device : public device_t
-{
- struct JV8741 {
- uint8_t cmd;
- uint8_t sts;
- uint8_t txd;
- uint8_t outport;
- uint8_t rxd;
- uint8_t connect;
- uint8_t rst;
- };
-
-public:
- josvolly8741_4pack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- ~josvolly8741_4pack_device() {}
-
- template<class _Object> static devcb_base &set_port_handler_0_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_0_r.set_callback(object); }
- template<class _Object> static devcb_base &set_port_handler_1_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_1_r.set_callback(object); }
- template<class _Object> static devcb_base &set_port_handler_2_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_2_r.set_callback(object); }
- template<class _Object> static devcb_base &set_port_handler_3_callback(device_t &device, _Object object) { return downcast<josvolly8741_4pack_device &>(device).m_port_handler_3_r.set_callback(object); }
-
- static void static_set_connect(device_t &device, int num, int conn) { downcast<josvolly8741_4pack_device &>(device).m_i8741[num].connect = conn; }
-
- DECLARE_READ8_MEMBER( read_0 ) { return read(0,offset); }
- DECLARE_WRITE8_MEMBER( write_0 ) { write(0,offset,data); }
- DECLARE_READ8_MEMBER( read_1 ) { return read(1,offset); }
- DECLARE_WRITE8_MEMBER( write_1 ) { write(1,offset,data); }
-
- DECLARE_WRITE8_MEMBER( nmi_enable_w ) { m_nmi_enable = 1; }
-
- TIMER_CALLBACK_MEMBER( tx );
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
-
-private:
- void update(int num);
- void write(int num, int offset, int data);
- uint8_t read(int num,int offset);
- uint8_t port_read(int num);
-
- // internal state
- JV8741 m_i8741[4];
- int m_nmi_enable;
-
- devcb_read8 m_port_handler_0_r;
- devcb_read8 m_port_handler_1_r;
- devcb_read8 m_port_handler_2_r;
- devcb_read8 m_port_handler_3_r;
-};
-
-
-extern const device_type JOSVOLLY8741_4PACK;
-
-
#endif
diff --git a/src/mame/machine/taito68705interface.cpp b/src/mame/machine/taito68705interface.cpp
new file mode 100644
index 00000000000..3e2f5701bb8
--- /dev/null
+++ b/src/mame/machine/taito68705interface.cpp
@@ -0,0 +1,354 @@
+// license:BSD-3-Clause
+// copyright-holders:Ernesto Corvi, Nicola Salmoria, David Haywood
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "machine/taito68705interface.h"
+
+/*
+ Most Taito 68705s share a similar (often identical) hookup.
+ This file encapsulates that.
+
+ used by:
+ buggychl.cpp - buggychl
+ bking.cpp - bking3
+ 40love.cpp - 40love
+ bublbobl.cpp - tokio
+ flstory.cpp - flstory
+ nycaptor.cpp - nycaptor
+ lsasquad.cpp - lsasquad
+ - daikaiju
+ lkage.cpp - lkage
+
+ and the following with slight changes:
+ slapfght.cpp - tigerh (inverted status bits read on portC)
+ - slapfght (extended outputs for scrolling)
+ bigevglf.cpp - writes to mcu aren't latched(?)f
+
+
+ not hooked up here, but possible (needs investigating)
+ pitnrun.cpp - have more functionality on portB, currently using 'instant timers' for latches
+ taitosj.cpp - ^^
+ changela.cpp - ^^
+ arkanoid.cpp - uses 68705 timers (they need to be moved to the 68705 core) and also some portB differences?
+ xain.cpp - not a Taito game (licensed to Taito?) but MCU hookup looks almost the same
+ renegade.cpp - ^^
+ matmania.cpp - ^^
+
+ 68705 sets in Taito drivers that are NOT suitable for hookup here?
+ bublbobl.cpp - bub68705 - this is a bootleg, not an official Taito hookup
+ mexico86.cpp - knightb, mexico86 - bootleg 68705s
+ retofinv.cpp - the current MCU dump is a bootleg at least
+ sqix.cpp - hotsmash - kaneko hookup, different from Taito ones.
+
+ there are other drivers (and games in existing drivers) that could hookup here, but currently lack MCU dumps.
+
+*/
+
+const device_type TAITO68705_MCU = &device_creator<taito68705_mcu_device>;
+const device_type TAITO68705_MCU_SLAP = &device_creator<taito68705_mcu_slap_device>;
+const device_type TAITO68705_MCU_TIGER = &device_creator<taito68705_mcu_tiger_device>;
+const device_type TAITO68705_MCU_BEG = &device_creator<taito68705_mcu_beg_device>;
+
+taito68705_mcu_device::taito68705_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : device_t(mconfig, TAITO68705_MCU, "Taito M68705 MCU Interface", tag, owner, clock, "taito68705", __FILE__),
+ m_mcu_sent(false),
+ m_main_sent(false),
+ m_from_main(0),
+ m_from_mcu(0),
+ m_from_mcu_latch(0),
+ m_to_mcu_latch(0),
+ m_old_portB(0),
+ m_mcu(*this, "mcu")
+{
+}
+
+taito68705_mcu_device::taito68705_mcu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source)
+ : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ m_mcu_sent(false),
+ m_main_sent(false),
+ m_from_main(0),
+ m_from_mcu(0),
+ m_from_mcu_latch(0),
+ m_to_mcu_latch(0),
+ m_old_portB(0),
+ m_mcu(*this, "mcu")
+{
+}
+
+
+
+
+static MACHINE_CONFIG_FRAGMENT( taito68705 )
+ MCFG_CPU_ADD("mcu", M68705_NEW, DERIVED_CLOCK(1,1))
+ MCFG_M68705_PORTA_R_CB(READ8(taito68705_mcu_device, mcu_porta_r))
+ MCFG_M68705_PORTA_W_CB(WRITE8(taito68705_mcu_device, mcu_porta_w))
+ MCFG_M68705_PORTB_W_CB(WRITE8(taito68705_mcu_device, mcu_portb_w))
+ MCFG_M68705_PORTC_R_CB(READ8(taito68705_mcu_device, mcu_portc_r))
+MACHINE_CONFIG_END
+
+machine_config_constructor taito68705_mcu_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( taito68705 );
+}
+
+
+//-------------------------------------------------
+// device_config_complete - perform any
+// operations now that the configuration is
+// complete
+//-------------------------------------------------
+
+void taito68705_mcu_device::device_config_complete()
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void taito68705_mcu_device::device_start()
+{
+ save_item(NAME(m_mcu_sent));
+ save_item(NAME(m_main_sent));
+ save_item(NAME(m_from_main));
+ save_item(NAME(m_from_mcu));
+ save_item(NAME(m_from_mcu_latch));
+ save_item(NAME(m_to_mcu_latch));
+ save_item(NAME(m_old_portB));
+}
+
+//-------------------------------------------------
+// device_reset - device-specific reset
+//-------------------------------------------------
+
+void taito68705_mcu_device::device_reset()
+{
+ m_mcu_sent = false;
+ m_main_sent = false;
+ m_from_main = 0;
+ m_from_mcu = 0;
+ m_from_mcu_latch = 0;
+ m_to_mcu_latch = 0;
+ m_old_portB = 0;
+
+ m_mcu->set_input_line(0, CLEAR_LINE);
+}
+
+
+/***************************************************************************
+
+ Buggy Challenge 68705 protection interface
+
+ This is accurate. FairyLand Story seems to be identical.
+
+***************************************************************************/
+
+
+/*
+ * Port B connections:
+ * parts in [ ] are optional (not used by buggychl)
+ *
+ * all bits are logical 1 when read (+5V pullup)
+ *
+ * 0 n.c.
+ * 1 W IRQ ack and enable latch which holds data from main Z80 memory
+ * 2 W loads latch to Z80
+ * 3 W to Z80 BUSRQ (put it on hold?)
+ * 4 W n.c.
+ * 5 W [selects Z80 memory access direction (0 = write 1 = read)]
+ * 6 W [loads the latch which holds the low 8 bits of the address of
+ * the main Z80 memory location to access]
+ * 7 W [loads the latch which holds the high 8 bits of the address of
+ * the main Z80 memory location to access]
+ */
+
+
+
+
+
+READ8_MEMBER(taito68705_mcu_device::mcu_r)
+{
+ m_mcu_sent = false;
+
+// logerror("%s: mcu_r %02x\n", space.machine().describe_context(), m_from_mcu);
+
+ return m_from_mcu;
+}
+
+WRITE8_MEMBER(taito68705_mcu_device::mcu_w)
+{
+// logerror("%s: mcu_w %02x\n", space.machine().describe_context(), data);
+
+ m_from_main = data;
+ m_main_sent = true;
+ m_mcu->set_input_line(0, ASSERT_LINE);
+
+}
+
+
+READ8_MEMBER(taito68705_mcu_device::mcu_porta_r)
+{
+// logerror("mcu_porta_r\n");
+ return m_to_mcu_latch;
+}
+
+WRITE8_MEMBER(taito68705_mcu_device::mcu_porta_w)
+{
+// logerror("mcu_porta_w %02x\n", data);
+ m_from_mcu_latch = data;
+}
+
+
+READ8_MEMBER(taito68705_mcu_device::mcu_portc_r)
+{
+ uint8_t ret = 0;
+
+ if (m_main_sent)
+ ret |= 0x01;
+ if (!m_mcu_sent)
+ ret |= 0x02;
+
+// logerror("%s: mcu_portc_r %02x\n", space.machine().describe_context(), ret);
+
+ return ret;
+}
+
+
+WRITE8_MEMBER(taito68705_mcu_device::mcu_portb_w)
+{
+// logerror("mcu_portb_w %02x\n", data);
+
+ if ((mem_mask & 0x02) && (~data & 0x02) && (m_old_portB & 0x02))
+ {
+ if (m_main_sent)
+ m_mcu->set_input_line(0, CLEAR_LINE);
+
+ m_to_mcu_latch = m_from_main;
+ m_main_sent = false;
+ }
+ if ((mem_mask & 0x04) && (data & 0x04) && (~m_old_portB & 0x04))
+ {
+ m_from_mcu = m_from_mcu_latch;
+ m_mcu_sent = true;
+ // logerror("sent %02x\n", m_from_mcu);
+ }
+
+ m_old_portB = data;
+
+}
+
+/* Status readbacks for MAIN cpu - these hook up in various ways depending on the host (provide 2 lines instead?) */
+
+READ8_MEMBER( taito68705_mcu_device::mcu_status_r )
+{
+ int res = 0;
+
+ /* bit 0 = when 1, mcu is ready to receive data from main cpu */
+ /* bit 1 = when 1, mcu has sent data to the main cpu */
+ //logerror("%s: mcu_status_r\n",machine().describe_context());
+ if (!m_main_sent)
+ res |= 0x01;
+ if (m_mcu_sent)
+ res |= 0x02;
+
+ return res;
+}
+
+CUSTOM_INPUT_MEMBER(taito68705_mcu_device::mcu_sent_r)
+{
+ if (!m_mcu_sent) return 0;
+ else return 1;
+}
+
+CUSTOM_INPUT_MEMBER(taito68705_mcu_device::main_sent_r)
+{
+ if (!m_main_sent) return 0;
+ else return 1;
+}
+
+/* The Slap Fight interface has some extensions, handle them here */
+
+taito68705_mcu_slap_device::taito68705_mcu_slap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : taito68705_mcu_device(mconfig, TAITO68705_MCU_SLAP, "Taito M68705 MCU Interface (Slap Fight)", tag, owner, clock, "taito68705slap", __FILE__),
+ m_extension_cb_w(*this)
+{
+}
+
+WRITE8_MEMBER(taito68705_mcu_slap_device::mcu_portb_w)
+{
+ if ((mem_mask & 0x08) && (~data & 0x08) && (m_old_portB & 0x08))
+ {
+ m_extension_cb_w(0,m_from_mcu_latch, 0xff); // m_scrollx_lo
+ }
+ if ((mem_mask & 0x10) && (~data & 0x10) && (m_old_portB & 0x10))
+ {
+ m_extension_cb_w(1,m_from_mcu_latch, 0xff); // m_scrollx_hi
+ }
+
+ taito68705_mcu_device::mcu_portb_w(space,offset,data);
+}
+
+void taito68705_mcu_slap_device::device_start()
+{
+ taito68705_mcu_device::device_start();
+ m_extension_cb_w.resolve_safe();
+}
+
+
+/* The Tiger Heli interface has some extensions, handle them here */
+
+taito68705_mcu_tiger_device::taito68705_mcu_tiger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : taito68705_mcu_device(mconfig, TAITO68705_MCU_TIGER, "Taito M68705 MCU Interface (Tiger Heli)", tag, owner, clock, "taito68705tiger", __FILE__)
+{
+}
+
+READ8_MEMBER(taito68705_mcu_tiger_device::mcu_portc_r)
+{
+ uint8_t ret = taito68705_mcu_device::mcu_portc_r(space,offset);
+
+ // Tiger Heli has these status bits inverted MCU-side
+ ret ^= 0x3;
+
+ return ret;
+}
+
+
+/* Big Event Golf has some things switched around, handle them here */
+
+taito68705_mcu_beg_device::taito68705_mcu_beg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : taito68705_mcu_device(mconfig, TAITO68705_MCU_BEG, "Taito M68705 MCU Interface (Big Event Golf)", tag, owner, clock, "taito68705bigevglf", __FILE__)
+{
+}
+
+WRITE8_MEMBER(taito68705_mcu_beg_device::mcu_portb_w)
+{
+ // transitions are reversed
+ if ((mem_mask & 0x02) && (data & 0x02) && (~m_old_portB & 0x02) ) /* positive going transition of the clock */
+ {
+ //if (m_main_sent)
+ m_mcu->set_input_line(0, CLEAR_LINE);
+
+ //m_to_mcu_latch = m_from_main; // this is weird, no latching?!
+ m_main_sent = false;
+ }
+ if ((mem_mask & 0x04) && (data & 0x04) && (~m_old_portB & 0x04) ) /* positive going transition of the clock */
+ {
+ m_from_mcu = m_from_mcu_latch;
+ m_mcu_sent = true;
+ // logerror("sent %02x\n", m_from_mcu);
+ }
+
+ m_old_portB = data;
+}
+
+WRITE8_MEMBER(taito68705_mcu_beg_device::mcu_w)
+{
+// logerror("%s: mcu_w %02x\n", space.machine().describe_context(), data);
+
+ m_to_mcu_latch = data; // this is weird, no latching?!
+ m_main_sent = true;
+ m_mcu->set_input_line(0, ASSERT_LINE);
+
+}
+
+
diff --git a/src/mame/machine/taito68705interface.h b/src/mame/machine/taito68705interface.h
new file mode 100644
index 00000000000..c0ad508ef69
--- /dev/null
+++ b/src/mame/machine/taito68705interface.h
@@ -0,0 +1,86 @@
+// license:BSD-3-Clause
+// copyright-holders:Ernesto Corvi, Nicola Salmoria, David Haywood
+
+#include "cpu/m6805/m6805.h"
+
+class taito68705_mcu_device : public device_t
+{
+public:
+ taito68705_mcu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ taito68705_mcu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, u32 clock, const char *shortname, const char *source);
+
+ ~taito68705_mcu_device() {}
+
+ virtual DECLARE_WRITE8_MEMBER( mcu_w );
+ DECLARE_READ8_MEMBER( mcu_r );
+ DECLARE_READ8_MEMBER( mcu_porta_r );
+ virtual DECLARE_READ8_MEMBER( mcu_portc_r );
+ DECLARE_WRITE8_MEMBER( mcu_porta_w );
+ virtual DECLARE_WRITE8_MEMBER( mcu_portb_w );
+
+ DECLARE_READ8_MEMBER( mcu_status_r );
+ DECLARE_CUSTOM_INPUT_MEMBER( mcu_sent_r );
+ DECLARE_CUSTOM_INPUT_MEMBER( main_sent_r );
+
+ bool get_main_sent() { return m_main_sent; };
+ bool get_mcu_sent() { return m_mcu_sent; };
+
+
+protected:
+ // device-level overrides
+ virtual machine_config_constructor device_mconfig_additions() const override;
+ virtual void device_config_complete() override;
+ virtual void device_start() override;
+ virtual void device_reset() override;
+
+ // internal state
+ bool m_mcu_sent;
+ bool m_main_sent;
+ uint8_t m_from_main;
+ uint8_t m_from_mcu;
+ uint8_t m_from_mcu_latch;
+ uint8_t m_to_mcu_latch;
+ uint8_t m_old_portB;
+
+ required_device<cpu_device> m_mcu;
+};
+
+extern const device_type TAITO68705_MCU;
+
+#define MCFG_TAITO_M68705_EXTENSION_CB(_devcb) \
+ taito68705_mcu_slap_device::set_extension_cb(*device, DEVCB_##_devcb);
+
+class taito68705_mcu_slap_device : public taito68705_mcu_device
+{
+public:
+ taito68705_mcu_slap_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual DECLARE_WRITE8_MEMBER( mcu_portb_w ) override;
+
+ template<class _Object> static devcb_base &set_extension_cb(device_t &device, _Object object) { return downcast<taito68705_mcu_slap_device &>(device).m_extension_cb_w.set_callback(object); }
+
+ devcb_write8 m_extension_cb_w;
+
+protected:
+ virtual void device_start() override;
+};
+
+extern const device_type TAITO68705_MCU_SLAP;
+
+class taito68705_mcu_tiger_device : public taito68705_mcu_device
+{
+public:
+ taito68705_mcu_tiger_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual DECLARE_READ8_MEMBER( mcu_portc_r ) override;
+};
+
+extern const device_type TAITO68705_MCU_TIGER;
+
+class taito68705_mcu_beg_device : public taito68705_mcu_device
+{
+public:
+ taito68705_mcu_beg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ virtual DECLARE_WRITE8_MEMBER(mcu_w) override;
+ virtual DECLARE_WRITE8_MEMBER(mcu_portb_w) override;
+};
+
+extern const device_type TAITO68705_MCU_BEG;
diff --git a/src/mame/machine/xbox.cpp b/src/mame/machine/xbox.cpp
index 4405046c13a..753a1406c77 100644
--- a/src/mame/machine/xbox.cpp
+++ b/src/mame/machine/xbox.cpp
@@ -344,18 +344,28 @@ void xbox_base_state::generate_irq_command(int ref, int params, const char **par
void xbox_base_state::nv2a_combiners_command(int ref, int params, const char **param)
{
debugger_console &con = machine().debugger().console();
- int en = nvidia_nv2a->toggle_register_combiners_usage();
- if (en != 0)
+ bool en = nvidia_nv2a->toggle_register_combiners_usage();
+ if (en == true)
con.printf("Register combiners enabled\n");
else
con.printf("Register combiners disabled\n");
}
+void xbox_base_state::nv2a_wclipping_command(int ref, int params, const char **param)
+{
+ debugger_console &con = machine().debugger().console();
+ bool en = nvidia_nv2a->toggle_clipping_w_support();
+ if (en == true)
+ con.printf("W clipping enabled\n");
+ else
+ con.printf("W clipping disabled\n");
+}
+
void xbox_base_state::waitvblank_command(int ref, int params, const char **param)
{
debugger_console &con = machine().debugger().console();
- int en = nvidia_nv2a->toggle_wait_vblank_support();
- if (en != 0)
+ bool en = nvidia_nv2a->toggle_wait_vblank_support();
+ if (en == true)
con.printf("Vblank method enabled\n");
else
con.printf("Vblank method disabled\n");
@@ -458,6 +468,7 @@ void xbox_base_state::help_command(int ref, int params, const char **param)
con.printf(" xbox threadlist -- list of currently active threads\n");
con.printf(" xbox irq,<number> -- Generate interrupt with irq number 0-15\n");
con.printf(" xbox nv2a_combiners -- Toggle use of register combiners\n");
+ con.printf(" xbox nv2a_wclipping -- Toggle use of negative w vertex clipping\n");
con.printf(" xbox waitvblank -- Toggle support for wait vblank method\n");
con.printf(" xbox grab_texture,<type>,<filename> -- Save to <filename> the next used texture of type <type>\n");
con.printf(" xbox grab_vprog,<filename> -- save current vertex program instruction slots to <filename>\n");
@@ -487,6 +498,8 @@ void xbox_base_state::xbox_debug_commands(int ref, int params, const char **para
generate_irq_command(ref, params - 1, param + 1);
else if (strcmp("nv2a_combiners", param[0]) == 0)
nv2a_combiners_command(ref, params - 1, param + 1);
+ else if (strcmp("nv2a_wclipping", param[0]) == 0)
+ nv2a_wclipping_command(ref, params - 1, param + 1);
else if (strcmp("waitvblank", param[0]) == 0)
waitvblank_command(ref, params - 1, param + 1);
else if (strcmp("grab_texture", param[0]) == 0)
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 4b747ff76bc..7c7db655643 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -29597,7 +29597,8 @@ pbaction4 // (c) 1985 Tehkan
pbaction5 // (c) 1985 Tehkan
@source:pc.cpp
-ataripc3 //
+ataripc1 // Atari PC1
+ataripc3 // Atari PC3
bw230 // 1985 Bondwell (CGA)
compc1 // 1984 Commodore PC-1
dgone // 1984 Data General/One
@@ -30389,6 +30390,7 @@ pet8032 //
superpet //
@source:peyper.cpp
+ator //
gamatros //
hangonp //
lancelot //
@@ -31701,6 +31703,9 @@ rltennis // (c) 1993 TCH
@source:rm380z.cpp
rm380z //
+rm380z34d //
+rm380z34e //
+rm480z //
@source:rmhaihai.cpp
rmhaihai // (c) 1985 Alba
@@ -31740,6 +31745,7 @@ schmeisr // (c) 1993 Hot B
wizdfire // MAS (c) 1992 Data East Corporation (Over Sea)
wizdfireu // MAS (c) 1992 Data East Corporation (US)
wolffang // MAM (c) 1991 Data East Corporation (Japan)
+hangzo
@source:rollerg.cpp
rollerg // GX999 (c) 1991 (US)
diff --git a/src/mame/mess.flt b/src/mame/mess.flt
index e701eea7b43..ee9d760fba5 100644
--- a/src/mame/mess.flt
+++ b/src/mame/mess.flt
@@ -187,6 +187,7 @@ fanucs15.cpp
fanucspmg.cpp
fb01.cpp
fc100.cpp
+fccpu20.cpp
fccpu30.cpp
fcisio.cpp
fcscsi.cpp
diff --git a/src/mame/video/aerofgt.cpp b/src/mame/video/aerofgt.cpp
index 2495eb13481..20da54b7f9b 100644
--- a/src/mame/video/aerofgt.cpp
+++ b/src/mame/video/aerofgt.cpp
@@ -194,32 +194,22 @@ void aerofgt_state::setbank( tilemap_t *tmap, int num, int bank )
}
}
-WRITE16_MEMBER(aerofgt_state::pspikes_gfxbank_w)
+WRITE8_MEMBER(aerofgt_state::pspikes_gfxbank_w)
{
- if (ACCESSING_BITS_0_7)
- {
- setbank(m_bg1_tilemap, 0, (data & 0xf0) >> 4);
- setbank(m_bg1_tilemap, 1, data & 0x0f);
- }
+ setbank(m_bg1_tilemap, 0, (data & 0xf0) >> 4);
+ setbank(m_bg1_tilemap, 1, data & 0x0f);
}
-
-WRITE16_MEMBER(aerofgt_state::karatblz_gfxbank_w)
+WRITE8_MEMBER(aerofgt_state::karatblz_gfxbank_w)
{
- if (ACCESSING_BITS_8_15)
- {
- setbank(m_bg1_tilemap, 0, (data & 0x0100) >> 8);
- setbank(m_bg2_tilemap, 1, (data & 0x0800) >> 11);
- }
+ setbank(m_bg1_tilemap, 0, (data & 0x01));
+ setbank(m_bg2_tilemap, 1, (data & 0x08) >> 3);
}
-WRITE16_MEMBER(aerofgt_state::spinlbrk_gfxbank_w)
+WRITE8_MEMBER(aerofgt_state::spinlbrk_gfxbank_w)
{
- if (ACCESSING_BITS_0_7)
- {
- setbank(m_bg1_tilemap, 0, (data & 0x07));
- setbank(m_bg2_tilemap, 1, (data & 0x38) >> 3);
- }
+ setbank(m_bg1_tilemap, 0, (data & 0x07));
+ setbank(m_bg2_tilemap, 1, (data & 0x38) >> 3);
}
WRITE16_MEMBER(aerofgt_state::turbofrc_gfxbank_w)
@@ -264,16 +254,13 @@ WRITE16_MEMBER(aerofgt_state::aerofgt_bg2scrolly_w)
COMBINE_DATA(&m_bg2scrolly);
}
-WRITE16_MEMBER(aerofgt_state::pspikes_palette_bank_w)
+WRITE8_MEMBER(aerofgt_state::pspikes_palette_bank_w)
{
- if (ACCESSING_BITS_0_7)
+ m_spritepalettebank = data & 0x03;
+ if (m_charpalettebank != (data & 0x1c) >> 2)
{
- m_spritepalettebank = data & 0x03;
- if (m_charpalettebank != (data & 0x1c) >> 2)
- {
- m_charpalettebank = (data & 0x1c) >> 2;
- m_bg1_tilemap->mark_all_dirty();
- }
+ m_charpalettebank = (data & 0x1c) >> 2;
+ m_bg1_tilemap->mark_all_dirty();
}
}
diff --git a/src/mame/video/gsword.cpp b/src/mame/video/gsword.cpp
index cd31addb506..46e851c5f4b 100644
--- a/src/mame/video/gsword.cpp
+++ b/src/mame/video/gsword.cpp
@@ -11,91 +11,13 @@
#include "includes/gsword.h"
-PALETTE_INIT_MEMBER(gsword_state,josvolly)
-{
- const uint8_t *color_prom = memregion("proms")->base();
- int i;
-
- /* create a lookup table for the palette */
- for (i = 0; i < 0x100; i++)
- {
- int r = pal4bit(color_prom[i + 0x000]);
- int g = pal4bit(color_prom[i + 0x100]);
- int b = pal4bit(color_prom[i + 0x200]);
-
- palette.set_indirect_color(i, rgb_t(r, g, b));
- }
-
- /* color_prom now points to the beginning of the lookup table */
- color_prom += 0x300;
-
- /* characters */
- for (i = 0; i < 0x100; i++)
- palette.set_pen_indirect(i, i);
-
- /* sprites */
- for (i = 0x100; i < 0x200; i++)
- {
- uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
- palette.set_pen_indirect(i, ctabentry);
- }
-}
-
-
-PALETTE_INIT_MEMBER(gsword_state,gsword)
-{
- const uint8_t *color_prom = memregion("proms")->base();
- int i;
-
- /* create a lookup table for the palette */
- for (i = 0; i < 0x100; i++)
- {
- int bit0, bit1, bit2;
- int r, g, b;
-
- /* red component */
- bit0 = (color_prom[i + 0x100] >> 0) & 1;
- bit1 = (color_prom[i + 0x100] >> 1) & 1;
- bit2 = (color_prom[i + 0x100] >> 2) & 1;
- r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- /* green component */
- bit0 = (color_prom[i + 0x100] >> 3) & 1;
- bit1 = (color_prom[i + 0x000] >> 0) & 1;
- bit2 = (color_prom[i + 0x000] >> 1) & 1;
- g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- /* blue component */
- bit0 = 0;
- bit1 = (color_prom[i + 0x000] >> 2) & 1;
- bit2 = (color_prom[i + 0x000] >> 3) & 1;
- b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
-
- palette.set_indirect_color(i, rgb_t(r, g, b));
- }
-
- /* color_prom now points to the beginning of the lookup table */
- color_prom += 0x200;
-
- /* characters */
- for (i = 0; i < 0x100; i++)
- palette.set_pen_indirect(i, i);
-
- /* sprites */
- for (i = 0x100; i < 0x200; i++)
- {
- uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
- palette.set_pen_indirect(i, ctabentry);
- }
-}
-
-WRITE8_MEMBER(gsword_state::videoram_w)
+WRITE8_MEMBER(gsword_state_base::videoram_w)
{
m_videoram[offset] = data;
m_bg_tilemap->mark_tile_dirty(offset);
}
-WRITE8_MEMBER(gsword_state::charbank_w)
+WRITE8_MEMBER(gsword_state_base::charbank_w)
{
if (m_charbank != data)
{
@@ -104,7 +26,7 @@ WRITE8_MEMBER(gsword_state::charbank_w)
}
}
-WRITE8_MEMBER(gsword_state::videoctrl_w)
+WRITE8_MEMBER(gsword_state_base::videoctrl_w)
{
if (data & 0x8f)
{
@@ -132,12 +54,12 @@ WRITE8_MEMBER(gsword_state::videoctrl_w)
/* other bits unused */
}
-WRITE8_MEMBER(gsword_state::scroll_w)
+WRITE8_MEMBER(gsword_state_base::scroll_w)
{
m_bg_tilemap->set_scrolly(0, data);
}
-TILE_GET_INFO_MEMBER(gsword_state::get_bg_tile_info)
+TILE_GET_INFO_MEMBER(gsword_state_base::get_bg_tile_info)
{
int code = m_videoram[tile_index] + ((m_charbank & 0x03) << 8);
int color = ((code & 0x3c0) >> 6) + 16 * m_charpalbank;
@@ -146,9 +68,9 @@ TILE_GET_INFO_MEMBER(gsword_state::get_bg_tile_info)
SET_TILE_INFO_MEMBER(0, code, color, flags);
}
-void gsword_state::video_start()
+void gsword_state_base::video_start()
{
- m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gsword_state::get_bg_tile_info),this), TILEMAP_SCAN_ROWS,
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(gsword_state_base::get_bg_tile_info),this), TILEMAP_SCAN_ROWS,
8, 8, 32, 64);
save_item(NAME(m_charbank));
@@ -156,7 +78,7 @@ void gsword_state::video_start()
save_item(NAME(m_flipscreen));
}
-void gsword_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
+void gsword_state_base::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = 0; offs < m_spritexy_ram.bytes() - 1; offs+=2)
{
@@ -197,9 +119,80 @@ void gsword_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
}
}
-uint32_t gsword_state::screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+uint32_t gsword_state_base::screen_update_gsword(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);
return 0;
}
+
+
+PALETTE_INIT_MEMBER(gsword_state, gsword)
+{
+ const uint8_t *color_prom = memregion("proms")->base();
+
+ /* create a lookup table for the palette */
+ for (unsigned i = 0; i < 0x100; i++)
+ {
+ int bit0, bit1, bit2;
+ int r, g, b;
+
+ /* red component */
+ bit0 = BIT(color_prom[i + 0x100], 0);
+ bit1 = BIT(color_prom[i + 0x100], 1);
+ bit2 = BIT(color_prom[i + 0x100], 2);
+ r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ /* green component */
+ bit0 = BIT(color_prom[i + 0x100], 3);
+ bit1 = BIT(color_prom[i + 0x000], 0);
+ bit2 = BIT(color_prom[i + 0x000], 1);
+ g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ /* blue component */
+ bit0 = 0;
+ bit1 = BIT(color_prom[i + 0x000], 2);
+ bit2 = BIT(color_prom[i + 0x000], 3);
+ b = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
+
+ palette.set_indirect_color(i, rgb_t(r, g, b));
+ }
+
+ /* color_prom now points to the beginning of the lookup table */
+ color_prom += 0x200;
+
+ /* characters */
+ for (unsigned i = 0; i < 0x100; i++)
+ palette.set_pen_indirect(i, i);
+
+ /* sprites */
+ for (unsigned i = 0x100; i < 0x200; i++)
+ {
+ uint8_t ctabentry = (BITSWAP8(color_prom[i - 0x100],7,6,5,4,0,1,2,3) & 0x0f) | 0x80;
+ palette.set_pen_indirect(i, ctabentry);
+ }
+}
+
+
+
+PALETTE_INIT_MEMBER(josvolly_state, josvolly)
+{
+ u8 const *const color_prom = memregion("proms")->base();
+
+ // create a lookup table for the palette
+ for (unsigned i = 0; i < 0x100; i++)
+ {
+ u8 const r = pal4bit(color_prom[i + 0x000]);
+ u8 const g = pal4bit(color_prom[i + 0x100]);
+ u8 const b = pal4bit(color_prom[i + 0x200]);
+
+ palette.set_indirect_color(i, rgb_t(r, g, b));
+
+ // characters
+ palette.set_pen_indirect(i, i);
+
+ // sprites
+ u8 const ctabentry = bitswap(color_prom[i + 0x300], 0, 1, 2, 3) | 0x80;
+ palette.set_pen_indirect(i + 0x100, ctabentry);
+ }
+}
diff --git a/src/mame/video/c116.cpp b/src/mame/video/namco_c116.cpp
index 19d76184c11..b2c74a459d5 100644
--- a/src/mame/video/c116.cpp
+++ b/src/mame/video/namco_c116.cpp
@@ -66,8 +66,9 @@ i960 CPU, needs to write its clip and raster values byteswapped.
*/
#include "emu.h"
-#include "video/c116.h"
+#include "video/namco_c116.h"
+const device_type NAMCO_C116 = &device_creator<namco_c116_device>;
//-------------------------------------------------
// namco_c116_device -- constructor
@@ -158,6 +159,3 @@ WRITE8_MEMBER(namco_c116_device::write)
RAM[color] = data;
palette().set_pen_color(color,m_ram_r[color],m_ram_g[color],m_ram_b[color]);
}
-
-
-const device_type NAMCO_C116 = &device_creator<namco_c116_device>;
diff --git a/src/mame/video/c116.h b/src/mame/video/namco_c116.h
index 48d5c46f932..48d5c46f932 100644
--- a/src/mame/video/c116.h
+++ b/src/mame/video/namco_c116.h
diff --git a/src/mame/video/namcos2.cpp b/src/mame/video/namcos2.cpp
index 5a9ce2bd32e..ea036dd33d8 100644
--- a/src/mame/video/namcos2.cpp
+++ b/src/mame/video/namcos2.cpp
@@ -348,10 +348,9 @@ WRITE16_MEMBER( namcos2_state::paletteram_word_w )
/* register 5: POSIRQ scanline (only 8 bits used) */
/*case 0x180a:*/ case 0x180b:
- if (data^m_paletteram[offset]) {
+ //if (data^m_paletteram[offset]) {
m_paletteram[offset] = data;
- adjust_posirq_timer(get_pos_irq_scanline());
- }
+ //}
break;
/* registers 6,7: nothing? */
diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp
index b3aed4c0d6a..01865fb2f62 100644
--- a/src/mame/video/namcos21.cpp
+++ b/src/mame/video/namcos21.cpp
@@ -48,11 +48,11 @@ READ16_MEMBER(namcos21_state::winrun_gpu_register_r)
WRITE16_MEMBER(namcos21_state::winrun_gpu_register_w)
{
COMBINE_DATA( &m_winrun_gpu_register[offset] );
+ m_screen->update_partial(m_screen->vpos());
}
WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w)
{
- uint8_t *videoram = m_videoram.get();
int color = data>>8;
int mask = data&0xff;
int i;
@@ -60,15 +60,15 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w)
{
if( mask&(0x01<<i) )
{
- videoram[(offset+i)&0x7ffff] = color;
+ m_videoram[(offset+i)&0x7ffff] = color;
+ m_maskram[(offset+i)&0x7ffff] = mask;
}
}
}
READ16_MEMBER(namcos21_state::winrun_gpu_videoram_r)
{
- uint8_t *videoram = m_videoram.get();
- return videoram[offset]<<8;
+ return (m_videoram[offset]<<8) | m_maskram[offset];
}
void namcos21_state::allocate_poly_framebuffer()
@@ -363,6 +363,7 @@ VIDEO_START_MEMBER(namcos21_state,namcos21)
if( m_gametype == NAMCOS21_WINRUN91 )
{
m_videoram = std::make_unique<uint8_t[]>(0x80000);
+ m_maskram = std::make_unique<uint8_t[]>(0x80000);
}
allocate_poly_framebuffer();
c355_obj_init(
@@ -426,7 +427,10 @@ uint32_t namcos21_state::screen_update_driveyes(screen_device &screen, bitmap_in
void namcos21_state::winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *videoram = m_videoram.get();
+ //printf("%d %d (%d %d) - %04x %04x %04x|%04x %04x\n",cliprect.min_y,cliprect.max_y,m_screen->vpos(),m_gpu_intc->get_posirq_line(),m_winrun_gpu_register[0],m_winrun_gpu_register[2/2],m_winrun_gpu_register[4/2],m_winrun_gpu_register[0xa/2],m_winrun_gpu_register[0xc/2]);
+
int yscroll = -cliprect.min_y+(int16_t)m_winrun_gpu_register[0x2/2];
+ int xscroll = 0;//m_winrun_gpu_register[0xc/2] >> 7;
int base = 0x1000+0x100*(m_winrun_color&0xf);
int sx,sy;
for( sy=cliprect.min_y; sy<=cliprect.max_y; sy++ )
@@ -435,11 +439,12 @@ void namcos21_state::winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &c
uint16_t *pDest = &bitmap.pix16(sy);
for( sx=cliprect.min_x; sx<=cliprect.max_x; sx++ )
{
- int pen = pSource[sx];
+ int pen = pSource[(sx+xscroll) & 0x1ff];
switch( pen )
{
case 0xff:
break;
+ // TODO: additive blending? winrun car select uses register [0xc] for a xscroll value
case 0x00:
pDest[sx] = (pDest[sx]&0x1fff)+0x4000;
break;
diff --git a/src/mame/video/rm380z.cpp b/src/mame/video/rm380z.cpp
index 23da34017d7..329dcd97ad5 100644
--- a/src/mame/video/rm380z.cpp
+++ b/src/mame/video/rm380z.cpp
@@ -404,3 +404,40 @@ void rm380z_state::update_screen(bitmap_ind16 &bitmap)
}
}
}
+
+// This needs the attributes etc from above to be added
+uint32_t rm380z_state::screen_update_rm480z(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ uint8_t *chargen = memregion("chargen")->base();
+ uint8_t y,ra,chr,gfx;
+ uint16_t sy=0,ma=0,x;
+
+ for (y = 0; y < RM380Z_SCREENROWS; y++)
+ {
+ for (ra = 0; ra < 11; ra++)
+ {
+ uint16_t *p = &bitmap.pix16(sy++);
+
+ for (x = ma; x < ma + 64; x++)
+ {
+ gfx = 0;
+ if (ra < 10)
+ {
+ chr = m_vramchars[x];
+ gfx = chargen[(chr<<4) | ra ];
+ }
+ /* Display a scanline of a character */
+ *p++ = BIT(gfx, 7);
+ *p++ = BIT(gfx, 6);
+ *p++ = BIT(gfx, 5);
+ *p++ = BIT(gfx, 4);
+ *p++ = BIT(gfx, 3);
+ *p++ = BIT(gfx, 2);
+ *p++ = BIT(gfx, 1);
+ *p++ = BIT(gfx, 0);
+ }
+ }
+ ma+=64;
+ }
+ return 0;
+}
diff --git a/src/mame/video/taito_f3.cpp b/src/mame/video/taito_f3.cpp
index 35886e6c7b4..8a3b6442faf 100644
--- a/src/mame/video/taito_f3.cpp
+++ b/src/mame/video/taito_f3.cpp
@@ -322,6 +322,13 @@ pri_alp_bitmap
1111 1111 opaque pixel
*/
+
+void taito_f3_state::device_post_load()
+{
+ /* force a reread of the dynamic tiles in the pixel layer */
+ m_gfxdecode->gfx(3)->mark_all_dirty();
+}
+
/******************************************************************************/
void taito_f3_state::print_debug_info(bitmap_rgb32 &bitmap)
@@ -648,6 +655,13 @@ VIDEO_START_MEMBER(taito_f3_state,f3)
memset(m_spriteram16_buffered.get(),0,0x10000);
memset(m_spriteram.get(),0,0x10000);
+ save_pointer(NAME(m_videoram.get()), 0x2000/2);
+ save_pointer(NAME(m_spriteram.get()), 0x10000/2);
+ save_pointer(NAME(m_f3_vram.get()), 0x2000/2);
+ save_pointer(NAME(m_f3_pf_data.get()), 0xc000/2);
+ save_pointer(NAME(m_f3_line_ram.get()), 0x10000/2);
+ save_pointer(NAME(m_f3_pivot_ram.get()), 0x10000/2);
+
save_item(NAME(m_f3_control_0));
save_item(NAME(m_f3_control_1));
diff --git a/src/mame/video/xbox_nv2a.cpp b/src/mame/video/xbox_nv2a.cpp
index 0d0e2a9d6e1..fd3c3888103 100644
--- a/src/mame/video/xbox_nv2a.cpp
+++ b/src/mame/video/xbox_nv2a.cpp
@@ -2216,6 +2216,103 @@ void dumpcombiners(uint32_t *m)
}
#endif
+void nv2a_renderer::extract_packed_float(uint32_t data, float &first, float &second, float &third)
+{
+ int32_t p1, p2, p3;
+ int32_t e1, e2, e3;
+ int32_t m1, m2, m3;
+ float scale, decimal;
+ union
+ {
+ float f;
+ uint32_t i;
+ } i2f;
+
+ // convert r11g11b10f to 3 float values
+ // each 32 bit words contains 2 11 bit float values and one 10 bit float value
+ p1 = data & 0b11111111111;
+ p2 = (data >> 11) & 0b11111111111;
+ p3 = (data >> 22) & 0b1111111111;
+ // 11 bit values have 6 bits of mantissa and 5 of exponent, 10 bit values have 5 bits of mantissa and 5 of exponent
+ m1 = p1 & 0b111111;
+ e1 = (p1 >> 6) & 0b11111;
+ m2 = p2 & 0b111111;
+ e2 = (p2 >> 6) & 0b11111;
+ m3 = p3 & 0b11111;
+ e3 = (p3 >> 5) & 0b11111;
+ // the fopllowing is based on routine UF11toF32 in appendix G of the "OpenGL Programming Guide 8th edition" book
+ if (e1 == 0) {
+ if (m1 != 0) {
+ scale = 1.0 / (1 << 20);
+ first = scale * m1;
+ }
+ else
+ first = 0;
+ }
+ else if (e1 == 31) {
+ i2f.i = 0x7f800000 | m1;
+ first = i2f.f;
+ }
+ else {
+ e1 -= 15;
+ if (e1 < 0) {
+ scale = 1.0 / (1 << -e1);
+ }
+ else {
+ scale = 1 << e1;
+ }
+ decimal = 1.0 + (float)m1 / 64;
+ first = scale * decimal;
+ }
+ if (e2 == 0) {
+ if (m2 != 0) {
+ scale = 1.0 / (1 << 20);
+ second = scale * m2;
+ }
+ else
+ second = 0;
+ }
+ else if (e2 == 31) {
+ i2f.i = 0x7f800000 | m2;
+ second = i2f.f;
+ }
+ else {
+ e2 -= 15;
+ if (e2 < 0) {
+ scale = 1.0 / (1 << -e2);
+ }
+ else {
+ scale = 1 << e2;
+ }
+ decimal = 1.0 + (float)m2 / 64;
+ second = scale * decimal;
+ }
+ if (e3 == 0) {
+ if (m3 != 0) {
+ scale = 1.0 / (1 << 20);
+ third = scale * m3;
+ }
+ else
+ third = 0;
+ }
+ else if (e3 == 31) {
+ i2f.i = 0x7f800000 | m3;
+ third = i2f.f;
+ }
+ else {
+ e3 -= 15;
+ if (e3 < 0) {
+ scale = 1.0 / (1 << -e3);
+ }
+ else {
+ scale = 1 << e3;
+ }
+ decimal = 1.0 + (float)m3 / 32;
+ third = scale * decimal;
+ }
+}
+
+
void nv2a_renderer::read_vertex(address_space & space, offs_t address, vertex_nv &vertex, int attrib)
{
uint32_t u;
@@ -2233,26 +2330,24 @@ void nv2a_renderer::read_vertex(address_space & space, offs_t address, vertex_nv
d = d + 4;
}
break;
- case NV2A_VTXBUF_TYPE::UBYTE:
+ case NV2A_VTXBUF_TYPE::UBYTE_OGL:
u = space.read_dword(address + 0);
for (c = l-1; c >= 0; c--) {
vertex.attribute[attrib].fv[c] = (u & 0xff) / 255.0;
u = u >> 8;
}
break;
- case NV2A_VTXBUF_TYPE::UBYTE2:
+ case NV2A_VTXBUF_TYPE::UBYTE_D3D:
u = space.read_dword(address + 0);
for (c = 0; c < l; c++) {
vertex.attribute[attrib].fv[c] = (u & 0xff) / 255.0;
u = u >> 8;
}
break;
- case NV2A_VTXBUF_TYPE::UNKNOWN_6: // ???
+ case NV2A_VTXBUF_TYPE::FLOAT_PACKED: // 3 floating point numbers packed into 32 bits
u = space.read_dword(address + 0);
- vertex.attribute[attrib].fv[0] = (u & 0xff) / 255.0; // b
- vertex.attribute[attrib].fv[1] = ((u & 0xff00) >> 8) / 255.0; // g
- vertex.attribute[attrib].fv[2] = ((u & 0xff0000) >> 16) / 255.0; // r
- vertex.attribute[attrib].fv[3] = ((u & 0xff000000) >> 24) / 255.0; // a
+ extract_packed_float(u, vertex.attribute[attrib].fv[0], vertex.attribute[attrib].fv[1], vertex.attribute[attrib].fv[2]);
+ vertex.attribute[attrib].fv[3] = 1.0;
break;
default:
vertex.attribute[attrib].fv[0] = 0;
@@ -2266,24 +2361,13 @@ void nv2a_renderer::read_vertex(address_space & space, offs_t address, vertex_nv
/* Read vertices data from system memory. Method 0x1800 */
int nv2a_renderer::read_vertices_0x1800(address_space & space, vertex_nv *destination, uint32_t address, int limit)
{
- uint32_t data;
- uint32_t m, i, c;
+ uint32_t m;
int a, b;
#ifdef MAME_DEBUG
memset(destination, 0, sizeof(vertex_nv)*limit);
#endif
- c = 0;
for (m = 0; m < limit; m++) {
- if (indexesleft_count == 0) {
- data = space.read_dword(address);
- i = indexesleft_first + indexesleft_count;
- indexesleft[i & 1023] = data & 0xffff;
- indexesleft[(i + 1) & 1023] = (data >> 16) & 0xffff;
- indexesleft_count = indexesleft_count + 2;
- address += 4;
- c++;
- }
memcpy(&destination[m], &persistvertexattr, sizeof(persistvertexattr));
b = enabled_vertex_attributes;
for (a = 0; a < 16; a++) {
@@ -2295,29 +2379,19 @@ int nv2a_renderer::read_vertices_0x1800(address_space & space, vertex_nv *destin
indexesleft_first = (indexesleft_first + 1) & 1023;
indexesleft_count--;
}
- return (int)c;
+ return limit;
}
/* Read vertices data from system memory. Method 0x1808 */
int nv2a_renderer::read_vertices_0x1808(address_space & space, vertex_nv *destination, uint32_t address, int limit)
{
- uint32_t data;
- uint32_t m, i, c;
+ uint32_t m;
int a, b;
#ifdef MAME_DEBUG
memset(destination, 0, sizeof(vertex_nv)*limit);
#endif
- c = 0;
for (m = 0; m < limit; m++) {
- if (indexesleft_count == 0) {
- data = space.read_dword(address);
- i = indexesleft_first + indexesleft_count;
- indexesleft[i & 1023] = data;
- indexesleft_count = indexesleft_count + 1;
- address += 4;
- c++;
- }
memcpy(&destination[m], &persistvertexattr, sizeof(persistvertexattr));
b = enabled_vertex_attributes;
for (a = 0; a < 16; a++) {
@@ -2329,7 +2403,7 @@ int nv2a_renderer::read_vertices_0x1808(address_space & space, vertex_nv *destin
indexesleft_first = (indexesleft_first + 1) & 1023;
indexesleft_count--;
}
- return (int)c;
+ return limit;
}
/* Read vertices data from system memory. Method 0x1810 */
@@ -2753,15 +2827,16 @@ int nv2a_renderer::clip_triangle_w(nv2avertex_t *vi[3], nv2avertex_t *vo)
uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, render_delegate callback, int paramcount, nv2avertex_t &_v1, nv2avertex_t &_v2, nv2avertex_t &_v3)
{
-#if 0
nv2avertex_t *vi[3];
- nv2avertex_t vo[16];
+ nv2avertex_t vo[8];
int nv;
-#endif
if ((_v1.w > 0) && (_v2.w > 0) && (_v3.w > 0))
return render_triangle_culling(cliprect, callback, paramcount, _v1, _v2, _v3);
-#if 0
+ if (enable_clipping_w == false)
+ return 0;
+ if ((_v1.w <= 0) && (_v2.w <= 0) && (_v3.w <= 0))
+ return 0;
// assign the elements of the array
vi[0] = &_v1;
vi[1] = &_v2;
@@ -2816,7 +2891,6 @@ uint32_t nv2a_renderer::render_triangle_clipping(const rectangle &cliprect, rend
}
for (int n = 1; n <= (nv - 2); n++)
render_triangle_culling(cliprect, callback, paramcount, vo[0], vo[n], vo[n + 1]);
-#endif
return 0;
}
@@ -2930,6 +3004,7 @@ void nv2a_renderer::assemble_primitive(vertex_nv *source, int count, render_dele
machine().logerror("Unsupported primitive %d\n", int(primitive_type));
vertex_count++;
}
+ source++;
}
primitives_total_count += primitives_count - pc;
}
@@ -3028,20 +3103,6 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
// vertices are selected from the vertex buffer using an array of indexes
// each dword after 1800 contains two 16 bit index values to select the vartices
// each dword after 1808 contains a 32 bit index value to select the vartices
- while (1) {
- int c;
-
- if ((countlen * mult + indexesleft_count) < 4)
- break;
- if (mult == 1)
- c = read_vertices_0x1808(space, vertex_software + vertex_first, address, 1);
- else
- c = read_vertices_0x1800(space, vertex_software + vertex_first, address, 1);
- address = address + c * 4;
- countlen = countlen - c;
- assemble_primitive(vertex_software + vertex_first, 1, render_spans_callback);
- vertex_first = (vertex_first + 4) & 1023;
- }
while (countlen > 0) {
int n;
@@ -3058,6 +3119,12 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
}
address += 4;
countlen--;
+ if (mult == 1)
+ read_vertices_0x1808(space, vertex_software + vertex_first, address, 1);
+ else
+ read_vertices_0x1800(space, vertex_software + vertex_first, address, 2);
+ assemble_primitive(vertex_software + vertex_first, mult, render_spans_callback);
+ vertex_first = (vertex_first + mult) & 1023;
}
}
if (maddress == 0x1818) {
@@ -3078,7 +3145,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
}
address = address + c * 4;
assemble_primitive(vertex_software + vertex_first, 1, render_spans_callback);
- vertex_first = (vertex_first + 4) & 1023;
+ vertex_first = (vertex_first + 1) & 1023;
}
}
if ((maddress >= 0x1880) && (maddress < 0x1900))
@@ -3175,19 +3242,19 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
vertexbuffer_kind[bit] = (NV2A_VTXBUF_TYPE)(data & 15);
vertexbuffer_size[bit] = (data >> 4) & 15;
switch (vertexbuffer_kind[bit]) {
- case NV2A_VTXBUF_TYPE::UBYTE2:
+ case NV2A_VTXBUF_TYPE::UBYTE_D3D:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 1) >> 2;
break;
case NV2A_VTXBUF_TYPE::FLOAT:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 4) >> 2;
break;
- case NV2A_VTXBUF_TYPE::UBYTE:
+ case NV2A_VTXBUF_TYPE::UBYTE_OGL:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 1) >> 2;
break;
case NV2A_VTXBUF_TYPE::USHORT:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 2) >> 2;
break;
- case NV2A_VTXBUF_TYPE::UNKNOWN_6:
+ case NV2A_VTXBUF_TYPE::FLOAT_PACKED:
vertex_attribute_words[bit] = (vertexbuffer_size[bit] * 4) >> 2;
break;
default:
@@ -3345,7 +3412,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
}
if (maddress == 0x0130) {
countlen--;
- if (waitvblank_used == 1)
+ if (enable_waitvblank == true)
return 1; // block until next vblank
else
return 0;
@@ -3617,7 +3684,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
maddress = (maddress - 0x0a20) / 4;
*(uint32_t *)(&matrix.translate[maddress]) = data;
// set corresponding vertex shader constant too
- vertexprogram.exec.c_constant[59].iv[maddress] = data; // constant -37
+ vertexprogram.exec.c_constant[59].iv(maddress, data); // constant -37
#ifdef LOG_NV2A
if (maddress == 3)
machine().logerror("viewport translate = {%f %f %f %f}\n", matrix.translate[0], matrix.translate[1], matrix.translate[2], matrix.translate[3]);
@@ -3629,7 +3696,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
maddress = (maddress - 0x0af0) / 4;
*(uint32_t *)(&matrix.scale[maddress]) = data;
// set corresponding vertex shader constant too
- vertexprogram.exec.c_constant[58].iv[maddress] = data; // constant -38
+ vertexprogram.exec.c_constant[58].iv(maddress, data); // constant -38
#ifdef LOG_NV2A
if (maddress == 3)
machine().logerror("viewport scale = {%f %f %f %f}\n", matrix.scale[0], matrix.scale[1], matrix.scale[2], matrix.scale[3]);
@@ -3688,7 +3755,7 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
if ((maddress >= 0x0b80) && (maddress < 0x0c00)) {
//machine().logerror("VP_UPLOAD_CONST\n");
if (vertexprogram.upload_parameter_index < 192) {
- vertexprogram.exec.c_constant[vertexprogram.upload_parameter_index].iv[vertexprogram.upload_parameter_component] = data;
+ vertexprogram.exec.c_constant[vertexprogram.upload_parameter_index].iv(vertexprogram.upload_parameter_component, data);
}
else
machine().logerror("Need to increase size of vertexprogram.parameter to %d\n\r", vertexprogram.upload_parameter_index);
@@ -3831,16 +3898,22 @@ int nv2a_renderer::geforce_exec_method(address_space & space, uint32_t chanel, u
return 0;
}
-int nv2a_renderer::toggle_register_combiners_usage()
+bool nv2a_renderer::toggle_register_combiners_usage()
{
combiner.used = 1 - combiner.used;
- return combiner.used;
+ return combiner.used != 0;
+}
+
+bool nv2a_renderer::toggle_wait_vblank_support()
+{
+ enable_waitvblank = !enable_waitvblank;
+ return enable_waitvblank;
}
-int nv2a_renderer::toggle_wait_vblank_support()
+bool nv2a_renderer::toggle_clipping_w_support()
{
- waitvblank_used = 1 - waitvblank_used;
- return waitvblank_used;
+ enable_clipping_w = !enable_clipping_w;
+ return enable_clipping_w;
}
void nv2a_renderer::debug_grab_texture(int type, const char *filename)
diff --git a/src/osd/modules/debugger/osx/debugconsole.mm b/src/osd/modules/debugger/osx/debugconsole.mm
index 82d000bbd50..e96d0757ba7 100644
--- a/src/osd/modules/debugger/osx/debugconsole.mm
+++ b/src/osd/modules/debugger/osx/debugconsole.mm
@@ -160,7 +160,7 @@
windowFrame.size.width += adjustment.width;
windowFrame.size.height += adjustment.height; // not used - better to go for fixed height
- windowFrame.size.height = std::min(512.0, available.size.height);
+ windowFrame.size.height = std::min(CGFloat(512.0), available.size.height);
windowFrame.size.width = std::min(windowFrame.size.width, available.size.width);
windowFrame.origin.x = available.origin.x + available.size.width - windowFrame.size.width;
windowFrame.origin.y = available.origin.y;
diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp
index ab18b4029fa..a53ed759940 100644
--- a/src/osd/modules/render/bgfx/chainentry.cpp
+++ b/src/osd/modules/render/bgfx/chainentry.cpp
@@ -270,7 +270,7 @@ bool bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t scre
void bgfx_chain_entry::put_screen_buffer(render_primitive* prim, bgfx::TransientVertexBuffer* buffer) const
{
- if (bgfx::checkAvailTransientVertexBuffer(6, ScreenVertex::ms_decl))
+ if (6 == bgfx::getAvailTransientVertexBuffer(6, ScreenVertex::ms_decl))
{
bgfx::allocTransientVertexBuffer(buffer, 6, ScreenVertex::ms_decl);
}
diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp
index 64e71bd213a..40776bb20ce 100644
--- a/src/osd/modules/render/bgfx/chainmanager.cpp
+++ b/src/osd/modules/render/bgfx/chainmanager.cpp
@@ -9,6 +9,9 @@
//
//============================================================
+#include <bx/readerwriter.h>
+#include <bx/crtimpl.h>
+
#include "emu.h"
#include "../frontend/mame/ui/slider.h"
@@ -18,8 +21,6 @@
#include <rapidjson/document.h>
#include <rapidjson/error/en.h>
-#include <bx/readerwriter.h>
-#include <bx/crtimpl.h>
#include "bgfxutil.h"
#include "chainmanager.h"
diff --git a/src/osd/modules/render/bgfx/effectmanager.cpp b/src/osd/modules/render/bgfx/effectmanager.cpp
index 2b6951e18c8..3affa36f2ec 100644
--- a/src/osd/modules/render/bgfx/effectmanager.cpp
+++ b/src/osd/modules/render/bgfx/effectmanager.cpp
@@ -12,12 +12,12 @@
#include <rapidjson/document.h>
#include <rapidjson/error/en.h>
+#include <bx/readerwriter.h>
+#include <bx/crtimpl.h>
+
#include "emu.h"
-#include <bgfx/bgfxplatform.h>
#include <bgfx/bgfx.h>
-#include <bx/readerwriter.h>
-#include <bx/crtimpl.h>
#include "effectmanager.h"
#include "effectreader.h"
diff --git a/src/osd/modules/render/bgfx/shadermanager.cpp b/src/osd/modules/render/bgfx/shadermanager.cpp
index 6e683b9d14c..e4a665d967c 100644
--- a/src/osd/modules/render/bgfx/shadermanager.cpp
+++ b/src/osd/modules/render/bgfx/shadermanager.cpp
@@ -9,14 +9,14 @@
//
//============================================================
-#include "emu.h"
-
-#include <bgfx/bgfxplatform.h>
-#include <bgfx/bgfx.h>
#include <bx/fpumath.h>
#include <bx/readerwriter.h>
#include <bx/crtimpl.h>
+#include "emu.h"
+
+#include <bgfx/bgfx.h>
+
#include "shadermanager.h"
shader_manager::~shader_manager()
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index f23a5084d9f..2fb0d0b3a1e 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -5,6 +5,9 @@
// drawbgfx.cpp - BGFX renderer
//
//============================================================
+#include <bx/fpumath.h>
+#include <bx/readerwriter.h>
+
#if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) || defined(OSD_UWP)
// standard windows headers
#include <windows.h>
@@ -21,10 +24,8 @@
#include "rendutil.h"
#include "aviwrite.h"
-#include <bgfx/bgfxplatform.h>
#include <bgfx/bgfx.h>
-#include <bx/fpumath.h>
-#include <bx/readerwriter.h>
+#include <bgfx/platform.h>
#include <algorithm>
#include "drawbgfx.h"
@@ -866,7 +867,7 @@ int renderer_bgfx::draw(int update)
void renderer_bgfx::update_recording()
{
- bgfx::blit(s_current_view > 0 ? s_current_view - 1 : 0, m_avi_texture, 0, 0, m_avi_target->target());
+ bgfx::blit(s_current_view > 0 ? s_current_view - 1 : 0, m_avi_texture, 0, 0, bgfx::getTexture(m_avi_target->target()));
bgfx::readTexture(m_avi_texture, m_avi_data);
int i = 0;
@@ -1260,7 +1261,7 @@ void renderer_bgfx::allocate_buffer(render_primitive *prim, uint32_t blend, bgfx
}
}
- if (vertices > 0 && bgfx::checkAvailTransientVertexBuffer(vertices, ScreenVertex::ms_decl))
+ if (vertices > 0 && vertices==bgfx::getAvailTransientVertexBuffer(vertices, ScreenVertex::ms_decl))
{
bgfx::allocTransientVertexBuffer(buffer, vertices, ScreenVertex::ms_decl);
}