From 52549ddd50fbf742cf294ee9e1d612de0371b325 Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 29 Dec 2016 04:17:38 +0100 Subject: First pass, hooked it up to Winning Run GPU because it's a good test case --- src/mame/drivers/namcos21.cpp | 6 ++- src/mame/includes/namcos21.h | 5 +- src/mame/machine/namco_c148.cpp | 100 ++++++++++++++++++++++++++++++++++++++++ src/mame/machine/namco_c148.h | 58 +++++++++++++++++++++++ 4 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 src/mame/machine/namco_c148.cpp create mode 100644 src/mame/machine/namco_c148.h diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index f04b1cd8ba1..c9c134d4faf 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 @@ -1501,7 +1501,7 @@ 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") @@ -2007,6 +2007,8 @@ static MACHINE_CONFIG_START( winrun, namcos21_state ) MCFG_CPU_PROGRAM_MAP(winrun_gpu_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", namcos21_state, namcos2_68k_gpu_vblank) + MCFG_NAMCO_C148_ADD("gpu_intc") + MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ MCFG_MACHINE_START_OVERRIDE(namcos21_state,namcos21) diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index e4e9e4c6adb..bf38b81dac4 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -6,6 +6,7 @@ #include "namcos2.h" #include "machine/namcoio_gearbox.h" +#include "machine/namco_c148.h" #define NAMCOS21_POLY_FRAME_WIDTH 496 #define NAMCOS21_POLY_FRAME_HEIGHT 480 @@ -54,7 +55,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 m_winrun_dspbios; @@ -68,6 +70,7 @@ public: optional_device m_dsp; optional_device m_io_gearbox; + optional_device m_gpu_intc; std::unique_ptr m_videoram; std::unique_ptr m_winrun_dspcomram; diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp new file mode 100644 index 00000000000..0c7dceb71c1 --- /dev/null +++ b/src/mame/machine/namco_c148.cpp @@ -0,0 +1,100 @@ +// license:BSD-3-Clause +// copyright-holders: +/*************************************************************************** + + Namco C148 Interrupt Controller + +***************************************************************************/ +/* +Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02 + ???????? 1C0XXX + ???????? 1C2XXX + ???????? 1C4XXX + 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 + ???????? 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 + Watchdog reset kicker 1E6XXX W + */ + +#include "emu.h" +#include "namco_c148.h" + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// device type definition +const device_type NAMCO_C148 = &device_creator; + + +//************************************************************************** +// 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__) +{ +} + +// (*) denotes master CPU only +DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) +// AM_RANGE(0x06000, 0x07fff) // CPUIRQ lv +// AM_RANGE(0x08000, 0x09fff) // EXIRQ lv +// AM_RANGE(0x0a000, 0x0bfff) // POSIRQ lv +// AM_RANGE(0x0c000, 0x0dfff) // SCIRQ lv +// AM_RANGE(0x0e000, 0x0ffff) // VBlank IRQ lv + +// AM_RANGE(0x16000, 0x17fff) // CPUIRQ ack +// AM_RANGE(0x18000, 0x19fff) // EXIRQ ack +// AM_RANGE(0x1a000, 0x1bfff) // POSIRQ ack +// AM_RANGE(0x1c000, 0x1dfff) // SCIRQ ack +// AM_RANGE(0x1e000, 0x1ffff) // VBlank IRQ ack +// AM_RANGE(0x20000, 0x21fff) // EEPROM ready status +// AM_RANGE(0x22000, 0x23fff) // sound CPU reset (*) +// AM_RANGE(0x24000, 0x25fff) // 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() +{ +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void namco_c148_device::device_reset() +{ +} + +//************************************************************************** +// READ/WRITE HANDLERS +//************************************************************************** + diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h new file mode 100644 index 00000000000..75e1aab3099 --- /dev/null +++ b/src/mame/machine/namco_c148.h @@ -0,0 +1,58 @@ +// license:BSD-3-Clause +// copyright-holders: +/*************************************************************************** + +Template for skeleton device + +***************************************************************************/ + +#pragma once + +#ifndef __NAMCO_C148DEV_H__ +#define __NAMCO_C148DEV_H__ + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_NAMCO_C148_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, NAMCO_C148, 0) + +//************************************************************************** +// 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); + +protected: + // device-level overrides +// virtual void device_validity_check(validity_checker &valid) const; + virtual void device_start() override; + virtual void device_reset() override; +private: + // ... +}; + + +// device type definition +extern const device_type NAMCO_C148; + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + + + +#endif -- cgit v1.2.3 From 304f3f4519b854df638f742d64c8cc762899d6ce Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 29 Dec 2016 06:07:08 +0100 Subject: V-Blank irq tied (nw) --- src/mame/drivers/namcos21.cpp | 14 +++++++++-- src/mame/includes/namcos21.h | 1 + src/mame/machine/namco_c148.cpp | 53 +++++++++++++++++++++++++++++++++++------ src/mame/machine/namco_c148.h | 33 +++++++++++++++++++++---- 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index c9c134d4faf..88dd54f7697 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1502,6 +1502,7 @@ static ADDRESS_MAP_START( winrun_gpu_map, AS_PROGRAM, 16, namcos21_state ) 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_DEVICE("gpu_intc", namco_c148_device, map) + 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") @@ -1975,6 +1976,14 @@ static MACHINE_CONFIG_START( driveyes, namcos21_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.30) MACHINE_CONFIG_END +TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::winrun_gpu_scanline) +{ + int scanline = param; + + if(scanline == 240*2) + m_gpu_intc->vblank_irq_trigger(); + +} static MACHINE_CONFIG_START( winrun, namcos21_state ) MCFG_CPU_ADD("maincpu", M68000,12288000) /* Master */ @@ -2005,9 +2014,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) + // TODO: Needs a single namco_crtc_device + MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, winrun_gpu_scanline, "screen", 0, 1) - MCFG_NAMCO_C148_ADD("gpu_intc") + MCFG_NAMCO_C148_ADD("gpu_intc","gpu",false) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index bf38b81dac4..aff6bd6902a 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -162,6 +162,7 @@ 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(winrun_gpu_scanline); uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 0c7dceb71c1..3910bca83da 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -1,15 +1,18 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders:Angelo Salese /*************************************************************************** Namco C148 Interrupt Controller + TODO: + - vblank is likely to be sent by mast + ***************************************************************************/ /* Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02 ???????? 1C0XXX ???????? 1C2XXX - ???????? 1C4XXX + ???????? 1C4XXX * bit 1: operation mode? Master/Slave IRQ level 1C6XXX D00-D02 EXIRQ level 1C8XXX D00-D02 POSIRQ level 1CAXXX D00-D02 @@ -52,7 +55,8 @@ const device_type NAMCO_C148 = &device_creator; //------------------------------------------------- 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__) + : device_t(mconfig, NAMCO_C148, "Namco C148 Interrupt Controller", tag, owner, clock, "namco_c148", __FILE__), + m_hostcpu_tag(nullptr) { } @@ -62,15 +66,15 @@ DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) // AM_RANGE(0x08000, 0x09fff) // EXIRQ lv // AM_RANGE(0x0a000, 0x0bfff) // POSIRQ lv // AM_RANGE(0x0c000, 0x0dfff) // SCIRQ lv -// AM_RANGE(0x0e000, 0x0ffff) // VBlank IRQ lv + AM_RANGE(0x0e000, 0x0ffff) AM_READWRITE8(vblank_irq_level_r,vblank_irq_level_w,0x00ff) // VBlank IRQ lv // AM_RANGE(0x16000, 0x17fff) // CPUIRQ ack // AM_RANGE(0x18000, 0x19fff) // EXIRQ ack // AM_RANGE(0x1a000, 0x1bfff) // POSIRQ ack // AM_RANGE(0x1c000, 0x1dfff) // SCIRQ ack -// AM_RANGE(0x1e000, 0x1ffff) // VBlank IRQ ack -// AM_RANGE(0x20000, 0x21fff) // EEPROM ready status -// AM_RANGE(0x22000, 0x23fff) // sound CPU reset (*) + AM_RANGE(0x1e000, 0x1ffff) AM_READWRITE8(vblank_irq_ack_r, vblank_irq_ack_w, 0x00ff) // VBlank IRQ ack +// AM_RANGE(0x20000, 0x21fff) // EEPROM ready status (*) + AM_RANGE(0x22000, 0x23fff) AM_WRITE8(ext2_w,0x00ff) // sound CPU reset (*) // AM_RANGE(0x24000, 0x25fff) // slave & i/o reset (*) AM_RANGE(0x26000, 0x27fff) AM_NOP // watchdog ADDRESS_MAP_END @@ -83,6 +87,7 @@ ADDRESS_MAP_END void namco_c148_device::device_start() { + m_hostcpu = machine().device(m_hostcpu_tag); } @@ -92,9 +97,43 @@ void namco_c148_device::device_start() void namco_c148_device::device_reset() { + m_irqlevel.vblank = 0; } //************************************************************************** // READ/WRITE HANDLERS //************************************************************************** +READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) +{ + return m_irqlevel.vblank & 0x7; +} + +WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) +{ + m_irqlevel.vblank = data & 7; +} + +READ8_MEMBER( namco_c148_device::vblank_irq_ack_r ) +{ + m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); + return 0; +} + +WRITE8_MEMBER( namco_c148_device::vblank_irq_ack_w ) +{ + m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); +} + +WRITE8_MEMBER( namco_c148_device::ext2_w ) +{ + // TODO: sync flag for GPU in winrun? + if(data & 2) + m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); +} + +void namco_c148_device::vblank_irq_trigger() +{ + m_hostcpu->set_input_line(m_irqlevel.vblank, ASSERT_LINE); +} + diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h index 75e1aab3099..1671a90aff5 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders:Angelo Salese /*************************************************************************** Template for skeleton device @@ -17,8 +17,9 @@ Template for skeleton device // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_NAMCO_C148_ADD(_tag) \ - MCFG_DEVICE_ADD(_tag, NAMCO_C148, 0) +#define MCFG_NAMCO_C148_ADD(_tag, _cputag, _cpumaster) \ + MCFG_DEVICE_ADD(_tag, NAMCO_C148, 0) \ + namco_c148_device::configure_device(*device, _cputag, _cpumaster); //************************************************************************** // TYPE DEFINITIONS @@ -34,13 +35,37 @@ public: DECLARE_ADDRESS_MAP(map, 16); + static void configure_device(device_t &device, const char *tag, bool is_master) + { + namco_c148_device &dev = downcast(device); + dev.m_hostcpu_tag = tag; + dev.m_hostcpu_master = is_master; + } + + DECLARE_READ8_MEMBER( vblank_irq_level_r ); + DECLARE_WRITE8_MEMBER( vblank_irq_level_w ); + DECLARE_READ8_MEMBER( vblank_irq_ack_r ); + DECLARE_WRITE8_MEMBER( vblank_irq_ack_w ); + DECLARE_WRITE8_MEMBER( ext2_w ); + void vblank_irq_trigger(); + //uint8_t posirq_line(); + protected: // 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 */ + const char *m_hostcpu_tag; /**< host cpu tag name */ + bool m_hostcpu_master; /**< define if host cpu is master */ + struct{ + uint8_t cpuirq; + uint8_t exirq; + uint8_t sciirq; + uint8_t posirq; + uint8_t vblank; + }m_irqlevel; }; -- cgit v1.2.3 From 429ef6ecf9af5c36e4bbbe93c53b697ee8753d10 Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 29 Dec 2016 07:07:09 +0100 Subject: Added posirq --- src/mame/drivers/namcos21.cpp | 12 ++++--- src/mame/includes/namcos21.h | 3 +- src/mame/machine/namco_c148.cpp | 71 ++++++++++++++++++++++++++++++++++++----- src/mame/machine/namco_c148.h | 28 +++++++++++----- 4 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index 88dd54f7697..b4ef97fafa3 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1497,19 +1497,19 @@ static ADDRESS_MAP_START( winrun_slave_map, AS_PROGRAM, 16, namcos21_state ) AM_RANGE(0xb80000, 0xb8000f) AM_READWRITE(NAMCO_C139_SCI_register_r,NAMCO_C139_SCI_register_w) 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_DEVICE("gpu_intc", namco_c148_device, map) - 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 @@ -1979,10 +1979,14 @@ MACHINE_CONFIG_END TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::winrun_gpu_scanline) { int scanline = param; - - if(scanline == 240*2) + + if(scanline == 240*2) m_gpu_intc->vblank_irq_trigger(); + if(scanline == m_gpu_intc->get_posirq_line()*2) + { + m_gpu_intc->pos_irq_trigger(); + } } static MACHINE_CONFIG_START( winrun, namcos21_state ) diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index aff6bd6902a..f9d73989f9f 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -162,8 +162,9 @@ 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(winrun_gpu_scanline); - + uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); DECLARE_DRIVER_INIT(driveyes); diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 3910bca83da..c3aedab61cc 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -64,15 +64,15 @@ namco_c148_device::namco_c148_device(const machine_config &mconfig, const char * DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) // AM_RANGE(0x06000, 0x07fff) // CPUIRQ lv // AM_RANGE(0x08000, 0x09fff) // EXIRQ lv -// AM_RANGE(0x0a000, 0x0bfff) // POSIRQ lv + AM_RANGE(0x0a000, 0x0bfff) AM_READWRITE8(pos_irq_level_r,pos_irq_level_w,0x00ff) // POSIRQ lv // AM_RANGE(0x0c000, 0x0dfff) // SCIRQ lv AM_RANGE(0x0e000, 0x0ffff) AM_READWRITE8(vblank_irq_level_r,vblank_irq_level_w,0x00ff) // VBlank IRQ lv // AM_RANGE(0x16000, 0x17fff) // CPUIRQ ack // AM_RANGE(0x18000, 0x19fff) // EXIRQ ack -// AM_RANGE(0x1a000, 0x1bfff) // POSIRQ ack + AM_RANGE(0x1a000, 0x1bfff) AM_READWRITE(pos_irq_ack_r, pos_irq_ack_w) // POSIRQ ack // AM_RANGE(0x1c000, 0x1dfff) // SCIRQ ack - AM_RANGE(0x1e000, 0x1ffff) AM_READWRITE8(vblank_irq_ack_r, vblank_irq_ack_w, 0x00ff) // VBlank IRQ ack + AM_RANGE(0x1e000, 0x1ffff) AM_READWRITE(vblank_irq_ack_r, vblank_irq_ack_w) // VBlank IRQ ack // AM_RANGE(0x20000, 0x21fff) // EEPROM ready status (*) AM_RANGE(0x22000, 0x23fff) AM_WRITE8(ext2_w,0x00ff) // sound CPU reset (*) // AM_RANGE(0x24000, 0x25fff) // slave & i/o reset (*) @@ -98,12 +98,24 @@ void namco_c148_device::device_start() void namco_c148_device::device_reset() { m_irqlevel.vblank = 0; + m_irqlevel.pos = 0; } //************************************************************************** // READ/WRITE HANDLERS //************************************************************************** +READ8_MEMBER( namco_c148_device::pos_irq_level_r ) +{ + return m_irqlevel.pos & 0x7; +} + +WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) +{ + m_irqlevel.pos = data & 7; + flush_irq_acks(); +} + READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) { return m_irqlevel.vblank & 0x7; @@ -112,28 +124,71 @@ READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; + flush_irq_acks(); } -READ8_MEMBER( namco_c148_device::vblank_irq_ack_r ) +READ16_MEMBER( namco_c148_device::vblank_irq_ack_r ) { m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); return 0; } -WRITE8_MEMBER( namco_c148_device::vblank_irq_ack_w ) +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); +} + +READ16_MEMBER( namco_c148_device::pos_irq_ack_r ) +{ + m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); + return 0; +} + + + WRITE8_MEMBER( namco_c148_device::ext2_w ) { - // TODO: sync flag for GPU in winrun? - if(data & 2) - m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); + // TODO: bit 1 might be irq enable? } +READ8_MEMBER( namco_c148_device::ext_posirq_line_r ) +{ + return m_posirq_line; +} + +WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) +{ + m_posirq_line = data; +} + +//************************************************************************** +// GETTERS/SETTERS +//************************************************************************** + void namco_c148_device::vblank_irq_trigger() { m_hostcpu->set_input_line(m_irqlevel.vblank, ASSERT_LINE); } +void namco_c148_device::pos_irq_trigger() +{ + m_hostcpu->set_input_line(m_irqlevel.pos, ASSERT_LINE); +} + +void namco_c148_device::flush_irq_acks() +{ + // If writing an IRQ priority register, clear any pending IRQs. + + for(int i=0;i<8;i++) + m_hostcpu->set_input_line(i, CLEAR_LINE); +} + +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 index 1671a90aff5..8c3fbccaaa2 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -44,12 +44,22 @@ public: DECLARE_READ8_MEMBER( vblank_irq_level_r ); DECLARE_WRITE8_MEMBER( vblank_irq_level_w ); - DECLARE_READ8_MEMBER( vblank_irq_ack_r ); - DECLARE_WRITE8_MEMBER( vblank_irq_ack_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( ext_posirq_line_r ); + DECLARE_WRITE8_MEMBER( ext_posirq_line_w ); + DECLARE_WRITE8_MEMBER( ext2_w ); void vblank_irq_trigger(); - //uint8_t posirq_line(); - + void pos_irq_trigger(); + uint8_t get_posirq_line(); + protected: // device-level overrides // virtual void device_validity_check(validity_checker &valid) const; @@ -60,12 +70,14 @@ private: const char *m_hostcpu_tag; /**< host cpu tag name */ bool m_hostcpu_master; /**< define if host cpu is master */ struct{ - uint8_t cpuirq; - uint8_t exirq; - uint8_t sciirq; - uint8_t posirq; + uint8_t cpu; + uint8_t ex; + uint8_t sci; + uint8_t pos; uint8_t vblank; }m_irqlevel; + uint8_t m_posirq_line; + void flush_irq_acks(); }; -- cgit v1.2.3 From a7169371067a16e687ec8db1ffb3f2d723fe7831 Mon Sep 17 00:00:00 2001 From: angelosa Date: Thu, 29 Dec 2016 07:55:02 +0100 Subject: Forgot one line. --- src/mame/drivers/namcos21.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index b4ef97fafa3..d8edaba0f83 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1986,6 +1986,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::winrun_gpu_scanline) if(scanline == m_gpu_intc->get_posirq_line()*2) { m_gpu_intc->pos_irq_trigger(); + m_screen->update_partial(param); } } -- cgit v1.2.3 From a1d23cef22d7a8b01d506e02401edf6be9777c8f Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 01:53:01 +0100 Subject: Add the remaining irq levels / acks --- src/mame/machine/namco_c148.cpp | 90 +++++++++++++++++------------------------ src/mame/machine/namco_c148.h | 17 ++++++++ 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index c3aedab61cc..2086aab544f 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -62,16 +62,16 @@ namco_c148_device::namco_c148_device(const machine_config &mconfig, const char * // (*) denotes master CPU only DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) -// AM_RANGE(0x06000, 0x07fff) // CPUIRQ lv -// AM_RANGE(0x08000, 0x09fff) // EXIRQ lv + 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) // SCIRQ 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(0x16000, 0x17fff) // CPUIRQ ack -// AM_RANGE(0x18000, 0x19fff) // EXIRQ ack + 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) // SCIRQ 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) // EEPROM ready status (*) AM_RANGE(0x22000, 0x23fff) AM_WRITE8(ext2_w,0x00ff) // sound CPU reset (*) @@ -102,54 +102,48 @@ void namco_c148_device::device_reset() } //************************************************************************** -// READ/WRITE HANDLERS +// IRQ section //************************************************************************** -READ8_MEMBER( namco_c148_device::pos_irq_level_r ) -{ - return m_irqlevel.pos & 0x7; -} - -WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) -{ - m_irqlevel.pos = data & 7; - flush_irq_acks(); -} - -READ8_MEMBER( namco_c148_device::vblank_irq_level_r ) -{ - return m_irqlevel.vblank & 0x7; -} - -WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) -{ - m_irqlevel.vblank = data & 7; - flush_irq_acks(); -} - -READ16_MEMBER( namco_c148_device::vblank_irq_ack_r ) -{ - m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); - return 0; -} +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; } -WRITE16_MEMBER( namco_c148_device::vblank_irq_ack_w ) +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? + m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); + m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); + m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); + m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); } -WRITE16_MEMBER( namco_c148_device::pos_irq_ack_w ) -{ - m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); -} +WRITE8_MEMBER( namco_c148_device::pos_irq_level_w ) { m_irqlevel.pos = data & 7; flush_irq_acks(); } +WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; flush_irq_acks(); } +WRITE8_MEMBER( namco_c148_device::cpu_irq_level_w ) { m_irqlevel.cpu = data & 7; flush_irq_acks(); } +WRITE8_MEMBER( namco_c148_device::ex_irq_level_w ) { m_irqlevel.ex = data & 7; flush_irq_acks(); } +WRITE8_MEMBER( namco_c148_device::sci_irq_level_w ) { m_irqlevel.sci = data & 7; flush_irq_acks(); } -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::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); } +//************************************************************************** +// IRQ section +//************************************************************************** WRITE8_MEMBER( namco_c148_device::ext2_w ) { @@ -180,14 +174,6 @@ void namco_c148_device::pos_irq_trigger() m_hostcpu->set_input_line(m_irqlevel.pos, ASSERT_LINE); } -void namco_c148_device::flush_irq_acks() -{ - // If writing an IRQ priority register, clear any pending IRQs. - - for(int i=0;i<8;i++) - m_hostcpu->set_input_line(i, CLEAR_LINE); -} - 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 index 8c3fbccaaa2..8b1340a9499 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -52,6 +52,22 @@ public: 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 ); @@ -76,6 +92,7 @@ private: uint8_t pos; uint8_t vblank; }m_irqlevel; + uint8_t m_posirq_line; void flush_irq_acks(); }; -- cgit v1.2.3 From bafb19a2c52424958e266574040c16b42ded366d Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 01:55:54 +0100 Subject: IRQ triggers --- src/mame/machine/namco_c148.cpp | 15 +++++++++++++++ src/mame/machine/namco_c148.h | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 2086aab544f..e66d54721f7 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -174,6 +174,21 @@ 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); +} + 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 index 8b1340a9499..6e636e1fd4c 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -66,14 +66,16 @@ public: 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_WRITE8_MEMBER( ext2_w ); void vblank_irq_trigger(); void pos_irq_trigger(); + void cpu_irq_trigger(); + void ex_irq_trigger(); + void sci_irq_trigger(); uint8_t get_posirq_line(); protected: -- cgit v1.2.3 From cb1023eb008a8515ffa17856f48f8a07f42a7871 Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 02:46:44 +0100 Subject: CPU IRQ trigger & fix regression --- src/mame/machine/namco_c148.cpp | 37 +++++++++++++++++++++++++++---------- src/mame/machine/namco_c148.h | 16 ++++++++++++++-- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index e66d54721f7..7fd013333f1 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -68,14 +68,15 @@ DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) 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) // EEPROM ready status (*) - AM_RANGE(0x22000, 0x23fff) AM_WRITE8(ext2_w,0x00ff) // sound CPU reset (*) -// AM_RANGE(0x24000, 0x25fff) // slave & i/o reset (*) + AM_RANGE(0x20000, 0x21fff) AM_READ8(ext_r,0x00ff) // EEPROM ready status (*) + AM_RANGE(0x22000, 0x23fff) 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 @@ -88,6 +89,8 @@ ADDRESS_MAP_END void namco_c148_device::device_start() { m_hostcpu = machine().device(m_hostcpu_tag); + m_linked_c148 = machine().device(m_linked_c148_tag); + // TODO: link to SCI, EX and the screen device controller devices } @@ -116,11 +119,8 @@ 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? - m_hostcpu->set_input_line(m_irqlevel.pos, CLEAR_LINE); - m_hostcpu->set_input_line(m_irqlevel.vblank, CLEAR_LINE); - m_hostcpu->set_input_line(m_irqlevel.cpu, CLEAR_LINE); - m_hostcpu->set_input_line(m_irqlevel.ex, CLEAR_LINE); - m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); + 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(); } @@ -142,12 +142,28 @@ WRITE16_MEMBER( namco_c148_device::ex_irq_ack_w ) { m_hostcpu->set_input_line( WRITE16_MEMBER( namco_c148_device::sci_irq_ack_w ) { m_hostcpu->set_input_line(m_irqlevel.sci, CLEAR_LINE); } //************************************************************************** -// IRQ section +// Comm ports //************************************************************************** +READ8_MEMBER( namco_c148_device::ext_r ) +{ + return 0xff; // TODO: bit 0 EEPROM bit +} + +WRITE8_MEMBER( namco_c148_device::ext1_w ) +{ + +} + WRITE8_MEMBER( namco_c148_device::ext2_w ) { - // TODO: bit 1 might be irq enable? + // TODO: bit 1/2 in Winning Run GPU might be irq enable? +} + +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(); } READ8_MEMBER( namco_c148_device::ext_posirq_line_r ) @@ -160,6 +176,7 @@ WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) m_posirq_line = data; } + //************************************************************************** // GETTERS/SETTERS //************************************************************************** diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h index 6e636e1fd4c..9256136d69f 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -42,6 +42,13 @@ public: dev.m_hostcpu_master = is_master; } + static void link_c148_device(device_t &device, const char *tag) + { + namco_c148_device &dev = downcast(device); + + dev.m_linked_c148_tag = tag; + } + DECLARE_READ8_MEMBER( vblank_irq_level_r ); DECLARE_WRITE8_MEMBER( vblank_irq_level_w ); DECLARE_READ16_MEMBER( vblank_irq_ack_r ); @@ -69,23 +76,28 @@ public: DECLARE_READ8_MEMBER( ext_posirq_line_r ); DECLARE_WRITE8_MEMBER( ext_posirq_line_w ); + DECLARE_WRITE16_MEMBER( cpu_irq_assert_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 cpu_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 */ + 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; -- cgit v1.2.3 From 5508c8532f513427a418effef615844b8b118806 Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 04:09:35 +0100 Subject: Completed device up to current knowledge, added to Namco System 21 as test bed. --- src/mame/drivers/namcos21.cpp | 151 ++++++++++++++++++++++++++++++++-------- src/mame/includes/namcos21.h | 10 ++- src/mame/machine/namco_c148.cpp | 14 +++- src/mame/machine/namco_c148.h | 13 ++++ 4 files changed, 157 insertions(+), 31 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index d8edaba0f83..32a4094fba1 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1261,14 +1261,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 +1469,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") @@ -1488,7 +1488,7 @@ 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") @@ -1581,7 +1581,7 @@ 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) @@ -1594,7 +1594,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 @@ -1852,15 +1852,123 @@ MACHINE_START_MEMBER(namcos21_state,namcos21) namcos2_kickstart = namcos21_kickstart; } +// TODO: temp +TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) +{ + int scanline = param; + + 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(scanline == m_master_intc->get_posirq_line()*2) + { + m_master_intc->pos_irq_trigger(); + // TODO: wrong place! + m_screen->update_partial(param); + } + + if(scanline == m_slave_intc->get_posirq_line()*2) + { + m_slave_intc->pos_irq_trigger(); + // TODO: wrong place! + m_screen->update_partial(param); + } + + + if(m_gpu_intc != nullptr) + { + if(scanline == m_gpu_intc->get_posirq_line()*2) + { + m_gpu_intc->pos_irq_trigger(); + // TODO: wrong place! + m_screen->update_partial(param); + } + } +} + +WRITE8_MEMBER(namcos21_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); + } + } +} + +WRITE8_MEMBER(namcos21_state::system_reset_w) +{ + address_space &masterspace = m_maincpu->space(AS_PROGRAM); + + m_slave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + m_mcu->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + + switch( m_gametype ) + { + case NAMCOS21_SOLVALOU: + case NAMCOS21_STARBLADE: + case NAMCOS21_AIRCOMBAT: + case NAMCOS21_CYBERSLED: + m_dspmaster->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + m_dspslave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + break; + } + + if (data & 0x01) + masterspace.device().execute().yield(); + + #if 0 + if (data & 0x01) + { /* Resume execution */ + //reset_all_subcpus(CLEAR_LINE); + /* Give the new CPU an immediate slice of the action */ + } + else + { /* Suspend execution */ + //reset_all_subcpus(ASSERT_LINE); + } + #endif +} + +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) @@ -1899,6 +2007,8 @@ 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_GFXDECODE_ADD("gfxdecode", "palette", namcos21) MCFG_PALETTE_ADD("palette", NAMCOS21_NUM_COLORS) MCFG_PALETTE_FORMAT(XBRG) @@ -1921,11 +2031,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) @@ -1953,6 +2062,8 @@ static MACHINE_CONFIG_START( driveyes, namcos21_state ) MCFG_DEVICE_ADD("gearbox", NAMCOIO_GEARBOX, 0) + MCFG_FRAGMENT_ADD(configure_c148_standard) + MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS_NAMCO480I MCFG_SCREEN_UPDATE_DRIVER(namcos21_state, screen_update_driveyes) @@ -1976,28 +2087,13 @@ static MACHINE_CONFIG_START( driveyes, namcos21_state ) MCFG_SOUND_ROUTE(1, "rspeaker", 0.30) MACHINE_CONFIG_END -TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::winrun_gpu_scanline) -{ - int scanline = param; - - if(scanline == 240*2) - m_gpu_intc->vblank_irq_trigger(); - - if(scanline == m_gpu_intc->get_posirq_line()*2) - { - m_gpu_intc->pos_irq_trigger(); - m_screen->update_partial(param); - } -} - 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) @@ -2019,9 +2115,8 @@ static MACHINE_CONFIG_START( winrun, namcos21_state ) MCFG_CPU_ADD("gpu", M68000,12288000) /* graphics coprocessor */ MCFG_CPU_PROGRAM_MAP(winrun_gpu_map) - // TODO: Needs a single namco_crtc_device - MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", namcos21_state, winrun_gpu_scanline, "screen", 0, 1) + MCFG_FRAGMENT_ADD(configure_c148_standard) MCFG_NAMCO_C148_ADD("gpu_intc","gpu",false) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */ diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index f9d73989f9f..11272ffe72d 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -56,6 +56,8 @@ public: m_ptrom16(*this,"point16"), m_dsp(*this, "dsp"), m_io_gearbox(*this, "gearbox"), + m_master_intc(*this, "master_intc"), + m_slave_intc(*this, "slave_intc"), m_gpu_intc(*this, "gpu_intc") { } @@ -70,6 +72,8 @@ public: optional_device m_dsp; optional_device m_io_gearbox; + required_device m_master_intc; + required_device m_slave_intc; optional_device m_gpu_intc; std::unique_ptr m_videoram; @@ -163,8 +167,12 @@ public: DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w); DECLARE_READ16_MEMBER(winrun_gpu_videoram_r); - TIMER_DEVICE_CALLBACK_MEMBER(winrun_gpu_scanline); + DECLARE_WRITE8_MEMBER(sound_reset_w); + DECLARE_WRITE8_MEMBER(system_reset_w); + TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); + TIMER_DEVICE_CALLBACK_MEMBER(winrun_gpu_scanline); + uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); DECLARE_DRIVER_INIT(driveyes); diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 7fd013333f1..47b85715c01 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -56,7 +56,10 @@ const device_type NAMCO_C148 = &device_creator; 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_hostcpu_tag(nullptr) + m_out_ext1_cb(*this), + m_out_ext2_cb(*this), + m_hostcpu_tag(nullptr), + m_linked_c148_tag(nullptr) { } @@ -90,6 +93,9 @@ void namco_c148_device::device_start() { m_hostcpu = machine().device(m_hostcpu_tag); m_linked_c148 = machine().device(m_linked_c148_tag); + m_out_ext1_cb.resolve_safe(); + m_out_ext2_cb.resolve_safe(); + // TODO: link to SCI, EX and the screen device controller devices } @@ -102,6 +108,9 @@ 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; } //************************************************************************** @@ -152,11 +161,12 @@ READ8_MEMBER( namco_c148_device::ext_r ) 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? } diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h index 9256136d69f..b40f9d708b9 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -21,6 +21,13 @@ Template for skeleton device 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 //************************************************************************** @@ -49,6 +56,12 @@ public: dev.m_linked_c148_tag = tag; } + template static devcb_base &set_out_ext1_callback(device_t &device, _Object object) { return downcast(device).m_out_ext1_cb.set_callback(object); } + template static devcb_base &set_out_ext2_callback(device_t &device, _Object object) { return downcast(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 ); -- cgit v1.2.3 From 6f2c9cb5c820fc328db1980dba980655fd511670 Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 04:44:00 +0100 Subject: Bind C148 to Namco System 2 as well --- src/mame/drivers/namcos2.cpp | 92 ++++++++++++++++++++++++++++++----------- src/mame/drivers/namcos21.cpp | 60 --------------------------- src/mame/includes/namcos2.h | 13 +++++- src/mame/includes/namcos21.h | 10 +---- src/mame/machine/namco_c148.cpp | 7 ++-- src/mame/machine/namco_c148.h | 2 +- src/mame/machine/namcos2.cpp | 60 +++++++++++++++++++++++++++ 7 files changed, 146 insertions(+), 98 deletions(-) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index b64cbe946d6..fcf919c0077 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -618,14 +618,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 +645,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 +669,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 +694,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 +724,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 +1680,50 @@ 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; + + if(scanline == 240) + { + m_master_intc->vblank_irq_trigger(); + m_slave_intc->vblank_irq_trigger(); + } + + if(scanline == m_master_intc->get_posirq_line()) + { + m_master_intc->pos_irq_trigger(); + // TODO: wrong place! + m_screen->update_partial(param); + } + + if(scanline == m_slave_intc->get_posirq_line()) + { + 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 +1740,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -1758,11 +1796,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 +1816,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -1806,11 +1845,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 +1865,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -1859,11 +1899,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 +1919,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -1909,11 +1950,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 +1975,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -1964,11 +2006,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 +2026,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) @@ -2017,11 +2060,10 @@ 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) @@ -2038,6 +2080,8 @@ 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_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_REFRESH_RATE( (49152000.0 / 8) / (384 * 264) ) MCFG_SCREEN_SIZE(384, 264) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index 32a4094fba1..991aac829b7 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1891,66 +1891,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) } } -WRITE8_MEMBER(namcos21_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); - } - } -} - -WRITE8_MEMBER(namcos21_state::system_reset_w) -{ - address_space &masterspace = m_maincpu->space(AS_PROGRAM); - - m_slave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - m_mcu->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - - switch( m_gametype ) - { - case NAMCOS21_SOLVALOU: - case NAMCOS21_STARBLADE: - case NAMCOS21_AIRCOMBAT: - case NAMCOS21_CYBERSLED: - m_dspmaster->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - m_dspslave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - break; - } - - if (data & 0x01) - masterspace.device().execute().yield(); - - #if 0 - if (data & 0x01) - { /* Resume execution */ - //reset_all_subcpus(CLEAR_LINE); - /* Give the new CPU an immediate slice of the action */ - } - else - { /* Suspend execution */ - //reset_all_subcpus(ASSERT_LINE); - } - #endif -} - 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"); diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index 2221ac52119..85419acfdad 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -11,6 +11,7 @@ #include "namcoic.h" #include "cpu/m6502/m3745x.h" #include "video/c45.h" +#include "machine/namco_c148.h" /* CPU reference numbers */ @@ -101,6 +102,8 @@ 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_gpu(*this, "gpu"), m_gametype(0), m_c169_roz_videoram(*this, "rozvideoram", 0), @@ -119,6 +122,8 @@ public: optional_device m_dspmaster; optional_device m_dspslave; optional_device m_c68; + required_device m_master_intc; + required_device m_slave_intc; optional_device m_gpu; //to be moved to namco21_state after disentangling // game type helpers @@ -134,6 +139,11 @@ public: 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); + + TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); + // C123 Tilemap Emulation // TODO: merge with namcos1.cpp implementation and convert to device public: @@ -345,7 +355,8 @@ 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 m_dpram; /* 2Kx8 */ required_shared_ptr m_paletteram; optional_shared_ptr m_spriteram; diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index 11272ffe72d..87720852ed1 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -56,8 +56,6 @@ public: m_ptrom16(*this,"point16"), m_dsp(*this, "dsp"), m_io_gearbox(*this, "gearbox"), - m_master_intc(*this, "master_intc"), - m_slave_intc(*this, "slave_intc"), m_gpu_intc(*this, "gpu_intc") { } @@ -72,8 +70,6 @@ public: optional_device m_dsp; optional_device m_io_gearbox; - required_device m_master_intc; - required_device m_slave_intc; optional_device m_gpu_intc; std::unique_ptr m_videoram; @@ -166,12 +162,8 @@ public: DECLARE_WRITE16_MEMBER(winrun_gpu_register_w); DECLARE_WRITE16_MEMBER(winrun_gpu_videoram_w); DECLARE_READ16_MEMBER(winrun_gpu_videoram_r); - - DECLARE_WRITE8_MEMBER(sound_reset_w); - DECLARE_WRITE8_MEMBER(system_reset_w); - + TIMER_DEVICE_CALLBACK_MEMBER(screen_scanline); - TIMER_DEVICE_CALLBACK_MEMBER(winrun_gpu_scanline); uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 47b85715c01..8713f013dab 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -5,7 +5,7 @@ Namco C148 Interrupt Controller TODO: - - vblank is likely to be sent by mast + - hookup screen CRTC device ***************************************************************************/ /* @@ -156,7 +156,7 @@ WRITE16_MEMBER( namco_c148_device::sci_irq_ack_w ) { m_hostcpu->set_input_line READ8_MEMBER( namco_c148_device::ext_r ) { - return 0xff; // TODO: bit 0 EEPROM bit + return 0xff; // TODO: bit 0 EEPROM bit ready } WRITE8_MEMBER( namco_c148_device::ext1_w ) @@ -178,7 +178,8 @@ WRITE16_MEMBER( namco_c148_device::cpu_irq_assert_w) READ8_MEMBER( namco_c148_device::ext_posirq_line_r ) { - return m_posirq_line; + // TODO: same as regular register? winrun91 + return (m_posirq_line - 32) & 0xff; } WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h index b40f9d708b9..b19aaef4c1a 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -2,7 +2,7 @@ // copyright-holders:Angelo Salese /*************************************************************************** -Template for skeleton device + Namco C148 Interrupt Controller ***************************************************************************/ diff --git a/src/mame/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp index 993157854aa..9f136abb56d 100644 --- a/src/mame/machine/namcos2.cpp +++ b/src/mame/machine/namcos2.cpp @@ -71,6 +71,66 @@ 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); + } + } +} + +WRITE8_MEMBER(namcos2_shared_state::system_reset_w) +{ + address_space &masterspace = m_maincpu->space(AS_PROGRAM); + + m_slave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + m_mcu->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + + switch( m_gametype ) + { + case NAMCOS21_SOLVALOU: + case NAMCOS21_STARBLADE: + case NAMCOS21_AIRCOMBAT: + case NAMCOS21_CYBERSLED: + m_dspmaster->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + m_dspslave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); + break; + } + + if (data & 0x01) + masterspace.device().execute().yield(); + + #if 0 + if (data & 0x01) + { /* Resume execution */ + //reset_all_subcpus(CLEAR_LINE); + /* Give the new CPU an immediate slice of the action */ + } + else + { /* Suspend execution */ + //reset_all_subcpus(ASSERT_LINE); + } + #endif +} + void namcos2_shared_state::reset_all_subcpus(int state) { m_slave->set_input_line(INPUT_LINE_RESET, state); -- cgit v1.2.3 From 8e8f20df82a8f8b2808776a76ab836b73400e79a Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 05:19:16 +0100 Subject: Namco System 21 doesn't seem to use pos irq for master/slave. Phelios doesn't like ASSERT_LINE for vblank, fun --- src/mame/drivers/namcos2.cpp | 11 +++-------- src/mame/drivers/namcos21.cpp | 12 ++++-------- src/mame/machine/namco_c148.cpp | 3 ++- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index fcf919c0077..35297a43810 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -1695,22 +1695,17 @@ MACHINE_CONFIG_END TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) { int scanline = param; - + int cur_posirq = get_posirq_scanline(); + if(scanline == 240) { m_master_intc->vblank_irq_trigger(); m_slave_intc->vblank_irq_trigger(); } - if(scanline == m_master_intc->get_posirq_line()) + if(scanline == cur_posirq) { m_master_intc->pos_irq_trigger(); - // TODO: wrong place! - m_screen->update_partial(param); - } - - if(scanline == m_slave_intc->get_posirq_line()) - { m_slave_intc->pos_irq_trigger(); // TODO: wrong place! m_screen->update_partial(param); diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index 991aac829b7..bf1ade64ac0 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1856,6 +1856,7 @@ MACHINE_START_MEMBER(namcos21_state,namcos21) TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) { int scanline = param; +// int cur_posirq = get_posirq_scanline()*2; if(scanline == 240*2) { @@ -1865,20 +1866,15 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) m_gpu_intc->vblank_irq_trigger(); } - if(scanline == m_master_intc->get_posirq_line()*2) + #if 0 + if(scanline == cur_posirq) { m_master_intc->pos_irq_trigger(); - // TODO: wrong place! - m_screen->update_partial(param); - } - - if(scanline == m_slave_intc->get_posirq_line()*2) - { m_slave_intc->pos_irq_trigger(); // TODO: wrong place! m_screen->update_partial(param); } - + #endif if(m_gpu_intc != nullptr) { diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 8713f013dab..5faab77aa17 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -194,7 +194,8 @@ WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) void namco_c148_device::vblank_irq_trigger() { - m_hostcpu->set_input_line(m_irqlevel.vblank, ASSERT_LINE); + // 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() -- cgit v1.2.3 From a6b5427eaf2b548181a4cb2860c8c245e9161390 Mon Sep 17 00:00:00 2001 From: angelosa Date: Fri, 30 Dec 2016 08:05:20 +0100 Subject: Winning Run: Mask is actually saved in videoram write, fixes tachometer. --- src/mame/includes/namcos21.h | 1 + src/mame/video/namcos21.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index 87720852ed1..50dcf887014 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -73,6 +73,7 @@ public: optional_device m_gpu_intc; std::unique_ptr m_videoram; + std::unique_ptr m_colorram; std::unique_ptr m_winrun_dspcomram; uint16_t m_winrun_poly_buf[WINRUN_MAX_POLY_PARAM]; int m_winrun_poly_index; diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp index b3aed4c0d6a..af0c08d3de9 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -52,7 +52,6 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_register_w) 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 +59,15 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w) { if( mask&(0x01<(0x80000); + m_colorram = std::make_unique(0x80000); } allocate_poly_framebuffer(); c355_obj_init( -- cgit v1.2.3 From 3e9a6118eb8efa1339059a1e199c8512ffa8b2b1 Mon Sep 17 00:00:00 2001 From: Brad Hughes Date: Wed, 14 Dec 2016 12:37:37 -0500 Subject: Move special windows.h include directives to build defines (nw) --- scripts/src/osd/sdl_cfg.lua | 2 + scripts/src/osd/uwp_cfg.lua | 2 + scripts/src/osd/windows_cfg.lua | 2 + src/osd/modules/debugger/win/debugwin.h | 1 - src/osd/modules/diagnostics/diagnostics_win32.cpp | 3 -- src/osd/modules/file/windir.cpp | 1 - src/osd/modules/file/winfile.cpp | 1 - src/osd/modules/file/winptty.cpp | 1 - src/osd/modules/file/winrtdir.cpp | 1 - src/osd/modules/file/winrtfile.cpp | 1 - src/osd/modules/file/winrtptty.cpp | 1 - src/osd/modules/file/winrtsocket.cpp | 1 - src/osd/modules/file/winsocket.cpp | 1 - src/osd/modules/font/font_dwrite.cpp | 1 - src/osd/modules/font/font_windows.cpp | 1 - src/osd/modules/input/input_common.h | 2 - src/osd/modules/input/input_dinput.cpp | 3 -- src/osd/modules/input/input_rawinput.cpp | 3 -- src/osd/modules/input/input_uwp.cpp | 2 - src/osd/modules/input/input_win32.cpp | 3 -- src/osd/modules/input/input_windows.h | 1 - src/osd/modules/input/input_winhybrid.cpp | 5 +-- src/osd/modules/input/input_xinput.cpp | 3 -- src/osd/modules/lib/osdlib_uwp.cpp | 1 - src/osd/modules/lib/osdlib_win32.cpp | 1 - src/osd/modules/monitor/monitor_dxgi.cpp | 3 -- src/osd/modules/monitor/monitor_win32.cpp | 3 -- src/osd/modules/netdev/pcap.cpp | 1 - src/osd/modules/osdwindow.h | 3 -- src/osd/modules/output/win32_output.cpp | 1 - src/osd/modules/render/bgfx/chainmanager.cpp | 2 - src/osd/modules/render/drawbgfx.cpp | 1 - src/osd/modules/render/drawd3d.h | 1 - src/osd/modules/render/drawgdi.h | 1 - src/osd/modules/render/drawnone.cpp | 1 - src/osd/modules/sound/direct_sound.cpp | 3 -- src/osd/modules/sound/xaudio2_sound.cpp | 3 -- src/osd/osdsync.cpp | 3 -- src/osd/sdl/sdlmain.cpp | 1 - src/osd/sdl/window.cpp | 1 - src/osd/strconv.cpp | 3 -- src/osd/strconv.h | 4 -- src/osd/uwp/uwpcompat.cpp | 4 +- src/osd/uwp/uwpcompat.h | 48 +++++++++++++++++++---- src/osd/uwp/video.cpp | 4 +- src/osd/uwp/window.cpp | 3 -- src/osd/uwp/window.h | 3 -- src/osd/windows/ledutil.cpp | 1 - src/osd/windows/main.cpp | 1 - src/osd/windows/video.cpp | 1 - src/osd/windows/window.h | 1 - src/osd/windows/winmain.cpp | 1 - src/osd/windows/winmenu.cpp | 1 - src/osd/windows/winutf8.cpp | 1 - src/osd/windows/winutil.cpp | 1 - 55 files changed, 52 insertions(+), 97 deletions(-) diff --git a/scripts/src/osd/sdl_cfg.lua b/scripts/src/osd/sdl_cfg.lua index b8f24d27d3b..3f8e3e10bbc 100644 --- a/scripts/src/osd/sdl_cfg.lua +++ b/scripts/src/osd/sdl_cfg.lua @@ -109,6 +109,8 @@ if _OPTIONS["targetos"]=="windows" then "_UNICODE", "main=utf8_main", "_WIN32_WINNT=0x0501", + "WIN32_LEAN_AND_MEAN", + "NOMINMAX", } configuration { } diff --git a/scripts/src/osd/uwp_cfg.lua b/scripts/src/osd/uwp_cfg.lua index 234327aada0..28892656728 100644 --- a/scripts/src/osd/uwp_cfg.lua +++ b/scripts/src/osd/uwp_cfg.lua @@ -11,6 +11,8 @@ defines { "_WIN32_WINNT=0x0603", "NTDDI_VERSION=0x06030000", "MODERN_WIN_API", + "WIN32_LEAN_AND_MEAN", + "NOMINMAX", } flags { diff --git a/scripts/src/osd/windows_cfg.lua b/scripts/src/osd/windows_cfg.lua index 1ba0efe6151..1baa45f4255 100644 --- a/scripts/src/osd/windows_cfg.lua +++ b/scripts/src/osd/windows_cfg.lua @@ -3,6 +3,8 @@ defines { "OSD_WINDOWS", + "WIN32_LEAN_AND_MEAN", + "NOMINMAX", } configuration { "mingw* or vs*" } diff --git a/src/osd/modules/debugger/win/debugwin.h b/src/osd/modules/debugger/win/debugwin.h index 0e3bcd25131..8f4a1c3f6c0 100644 --- a/src/osd/modules/debugger/win/debugwin.h +++ b/src/osd/modules/debugger/win/debugwin.h @@ -10,7 +10,6 @@ #define __DEBUG_WIN_DEBUG_WIN_H__ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/modules/diagnostics/diagnostics_win32.cpp b/src/osd/modules/diagnostics/diagnostics_win32.cpp index ac3b3b43b00..d833247274d 100644 --- a/src/osd/modules/diagnostics/diagnostics_win32.cpp +++ b/src/osd/modules/diagnostics/diagnostics_win32.cpp @@ -11,7 +11,6 @@ #if defined(OSD_WINDOWS) || defined(SDLMAME_WIN32) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) @@ -22,8 +21,6 @@ #include #include -#undef min -#undef max #include #include "modules/lib/osdlib.h" diff --git a/src/osd/modules/file/windir.cpp b/src/osd/modules/file/windir.cpp index 84cdf367928..f9575b27e74 100644 --- a/src/osd/modules/file/windir.cpp +++ b/src/osd/modules/file/windir.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/modules/file/winfile.cpp b/src/osd/modules/file/winfile.cpp index 44f5b5c13ce..745b9112b7b 100644 --- a/src/osd/modules/file/winfile.cpp +++ b/src/osd/modules/file/winfile.cpp @@ -6,7 +6,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include "winfile.h" diff --git a/src/osd/modules/file/winptty.cpp b/src/osd/modules/file/winptty.cpp index b3eef069d22..ab0efae37ff 100644 --- a/src/osd/modules/file/winptty.cpp +++ b/src/osd/modules/file/winptty.cpp @@ -1,7 +1,6 @@ // license:BSD-3-Clause // copyright-holders:Aaron Giles, Vas Crabb -#define WIN32_LEAN_AND_MEAN #include "winfile.h" diff --git a/src/osd/modules/file/winrtdir.cpp b/src/osd/modules/file/winrtdir.cpp index dc0a9ae7408..be42b6fd874 100644 --- a/src/osd/modules/file/winrtdir.cpp +++ b/src/osd/modules/file/winrtdir.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/modules/file/winrtfile.cpp b/src/osd/modules/file/winrtfile.cpp index a33c61cd657..2e561aa32a9 100644 --- a/src/osd/modules/file/winrtfile.cpp +++ b/src/osd/modules/file/winrtfile.cpp @@ -6,7 +6,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include "winfile.h" diff --git a/src/osd/modules/file/winrtptty.cpp b/src/osd/modules/file/winrtptty.cpp index e32f035582d..ec1e6e73b38 100644 --- a/src/osd/modules/file/winrtptty.cpp +++ b/src/osd/modules/file/winrtptty.cpp @@ -1,7 +1,6 @@ // license:BSD-3-Clause // copyright-holders:Aaron Giles, Vas Crabb -#define WIN32_LEAN_AND_MEAN #include "winrtfile.h" diff --git a/src/osd/modules/file/winrtsocket.cpp b/src/osd/modules/file/winrtsocket.cpp index 94a8c3c3dc0..3f2241c25b5 100644 --- a/src/osd/modules/file/winrtsocket.cpp +++ b/src/osd/modules/file/winrtsocket.cpp @@ -6,7 +6,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include "winfile.h" diff --git a/src/osd/modules/file/winsocket.cpp b/src/osd/modules/file/winsocket.cpp index d1c3f4508e8..a383a876f9d 100644 --- a/src/osd/modules/file/winsocket.cpp +++ b/src/osd/modules/file/winsocket.cpp @@ -6,7 +6,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include "winfile.h" diff --git a/src/osd/modules/font/font_dwrite.cpp b/src/osd/modules/font/font_dwrite.cpp index 732316738e7..74e15af9265 100644 --- a/src/osd/modules/font/font_dwrite.cpp +++ b/src/osd/modules/font/font_dwrite.cpp @@ -11,7 +11,6 @@ #if defined(OSD_WINDOWS) || defined(OSD_UWP) -#define WIN32_LEAN_AND_MEAN #include #include diff --git a/src/osd/modules/font/font_windows.cpp b/src/osd/modules/font/font_windows.cpp index e1440e95af5..95f10c0a051 100644 --- a/src/osd/modules/font/font_windows.cpp +++ b/src/osd/modules/font/font_windows.cpp @@ -5,7 +5,6 @@ * */ -#define WIN32_LEAN_AND_MEAN #include "font_module.h" #include "modules/osdmodule.h" diff --git a/src/osd/modules/input/input_common.h b/src/osd/modules/input/input_common.h index c98845eb885..96a197f2543 100644 --- a/src/osd/modules/input/input_common.h +++ b/src/osd/modules/input/input_common.h @@ -21,8 +21,6 @@ #include #include #include -#undef min -#undef max //============================================================ diff --git a/src/osd/modules/input/input_dinput.cpp b/src/osd/modules/input/input_dinput.cpp index b47a7f86e7d..4d434ce3b4c 100644 --- a/src/osd/modules/input/input_dinput.cpp +++ b/src/osd/modules/input/input_dinput.cpp @@ -12,7 +12,6 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include @@ -22,8 +21,6 @@ #undef WINNT #include #undef interface -#undef min -#undef max #include diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp index 3f5274c6eba..9243ec4a0f4 100644 --- a/src/osd/modules/input/input_rawinput.cpp +++ b/src/osd/modules/input/input_rawinput.cpp @@ -12,12 +12,9 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #undef interface -#undef min -#undef max #include #include diff --git a/src/osd/modules/input/input_uwp.cpp b/src/osd/modules/input/input_uwp.cpp index 86e9ecfe671..ece01a41662 100644 --- a/src/osd/modules/input/input_uwp.cpp +++ b/src/osd/modules/input/input_uwp.cpp @@ -14,8 +14,6 @@ #include #include #include -#undef min -#undef max #undef interface // MAME headers diff --git a/src/osd/modules/input/input_win32.cpp b/src/osd/modules/input/input_win32.cpp index a4e00eec17f..c07a1c681d8 100644 --- a/src/osd/modules/input/input_win32.cpp +++ b/src/osd/modules/input/input_win32.cpp @@ -12,12 +12,9 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #undef interface -#undef min -#undef max // MAME headers #include "emu.h" diff --git a/src/osd/modules/input/input_windows.h b/src/osd/modules/input/input_windows.h index fb269df07cf..7afc487fb62 100644 --- a/src/osd/modules/input/input_windows.h +++ b/src/osd/modules/input/input_windows.h @@ -10,7 +10,6 @@ #define INPUT_WIN_H_ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #undef interface diff --git a/src/osd/modules/input/input_winhybrid.cpp b/src/osd/modules/input/input_winhybrid.cpp index dae3c4bc3bf..6b945710e3b 100644 --- a/src/osd/modules/input/input_winhybrid.cpp +++ b/src/osd/modules/input/input_winhybrid.cpp @@ -11,22 +11,19 @@ #if defined(OSD_WINDOWS) -#include #include #include // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include +#include // XInput/DirectInput #include #include #undef interface -#undef min -#undef max // MAME headers #include "emu.h" diff --git a/src/osd/modules/input/input_xinput.cpp b/src/osd/modules/input/input_xinput.cpp index 8baf1fd6cdd..e6ecdd4d177 100644 --- a/src/osd/modules/input/input_xinput.cpp +++ b/src/osd/modules/input/input_xinput.cpp @@ -12,15 +12,12 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include // XInput header #include #undef interface -#undef min -#undef max // MAME headers #include "emu.h" diff --git a/src/osd/modules/lib/osdlib_uwp.cpp b/src/osd/modules/lib/osdlib_uwp.cpp index 170f964f74e..864177d9544 100644 --- a/src/osd/modules/lib/osdlib_uwp.cpp +++ b/src/osd/modules/lib/osdlib_uwp.cpp @@ -8,7 +8,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include #include diff --git a/src/osd/modules/lib/osdlib_win32.cpp b/src/osd/modules/lib/osdlib_win32.cpp index 907889f37ba..d4dc3327f17 100644 --- a/src/osd/modules/lib/osdlib_win32.cpp +++ b/src/osd/modules/lib/osdlib_win32.cpp @@ -8,7 +8,6 @@ // //============================================================ -#define WIN32_LEAN_AND_MEAN #include #include diff --git a/src/osd/modules/monitor/monitor_dxgi.cpp b/src/osd/modules/monitor/monitor_dxgi.cpp index 27380ed6e6e..5cac0217e6d 100644 --- a/src/osd/modules/monitor/monitor_dxgi.cpp +++ b/src/osd/modules/monitor/monitor_dxgi.cpp @@ -11,13 +11,10 @@ #if defined(OSD_WINDOWS) || defined(OSD_UWP) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include #undef interface -#undef min -#undef max #include "strconv.h" #include "modules/lib/osdlib.h" diff --git a/src/osd/modules/monitor/monitor_win32.cpp b/src/osd/modules/monitor/monitor_win32.cpp index f5e273a8bb6..47012615656 100644 --- a/src/osd/modules/monitor/monitor_win32.cpp +++ b/src/osd/modules/monitor/monitor_win32.cpp @@ -11,11 +11,8 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #undef interface -#undef min -#undef max #include "strconv.h" #include "windows/video.h" diff --git a/src/osd/modules/netdev/pcap.cpp b/src/osd/modules/netdev/pcap.cpp index ad49a399304..ad69c49339c 100644 --- a/src/osd/modules/netdev/pcap.cpp +++ b/src/osd/modules/netdev/pcap.cpp @@ -10,7 +10,6 @@ #include "modules/lib/osdlib.h" #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) -#define WIN32_LEAN_AND_MEAN #include #undef interface #define LIB_NAME "wpcap.dll" diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index a77371668c8..6e80c8c2a6b 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -16,7 +16,6 @@ // standard windows headers #ifdef OSD_WINDOWS -#define WIN32_LEAN_AND_MEAN #include #include #include @@ -26,8 +25,6 @@ // forward declaration struct SDL_Window; #endif -#undef min -#undef max //============================================================ // TYPE DEFINITIONS diff --git a/src/osd/modules/output/win32_output.cpp b/src/osd/modules/output/win32_output.cpp index 6ae431de099..34465659ce3 100644 --- a/src/osd/modules/output/win32_output.cpp +++ b/src/osd/modules/output/win32_output.cpp @@ -13,7 +13,6 @@ #if defined(OSD_WINDOWS) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include // MAME headers diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index a4306b9dfe2..64e71bd213a 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -20,8 +20,6 @@ #include #include -#undef min -#undef max #include "bgfxutil.h" #include "chainmanager.h" diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index f94e3bfa631..f23a5084d9f 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -7,7 +7,6 @@ //============================================================ #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) || defined(OSD_UWP) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #if defined(SDLMAME_WIN32) #include diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index f73f6704823..049b2c25ae3 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -13,7 +13,6 @@ #ifdef OSD_WINDOWS -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/modules/render/drawgdi.h b/src/osd/modules/render/drawgdi.h index 6f41148dc70..7d0c2201079 100644 --- a/src/osd/modules/render/drawgdi.h +++ b/src/osd/modules/render/drawgdi.h @@ -12,7 +12,6 @@ #define __DRAWGDI__ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include // MAME headers diff --git a/src/osd/modules/render/drawnone.cpp b/src/osd/modules/render/drawnone.cpp index c5213afcec3..f56660a7d05 100644 --- a/src/osd/modules/render/drawnone.cpp +++ b/src/osd/modules/render/drawnone.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include // MAME headers diff --git a/src/osd/modules/sound/direct_sound.cpp b/src/osd/modules/sound/direct_sound.cpp index 3117b354c84..4d6c8c26c50 100644 --- a/src/osd/modules/sound/direct_sound.cpp +++ b/src/osd/modules/sound/direct_sound.cpp @@ -12,7 +12,6 @@ #if defined(OSD_WINDOWS) || defined(SDLMAME_WIN32) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include @@ -20,8 +19,6 @@ #undef WINNT #include #undef interface -#undef min -#undef max // MAME headers #include "emu.h" diff --git a/src/osd/modules/sound/xaudio2_sound.cpp b/src/osd/modules/sound/xaudio2_sound.cpp index 6667fe7fccf..73573096f5a 100644 --- a/src/osd/modules/sound/xaudio2_sound.cpp +++ b/src/osd/modules/sound/xaudio2_sound.cpp @@ -12,7 +12,6 @@ #if defined(OSD_WINDOWS) || defined(OSD_UWP) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include @@ -21,8 +20,6 @@ #include #undef interface -#undef min -#undef max // stdlib includes #include diff --git a/src/osd/osdsync.cpp b/src/osd/osdsync.cpp index 2a0e996b465..12253f2acbd 100644 --- a/src/osd/osdsync.cpp +++ b/src/osd/osdsync.cpp @@ -7,7 +7,6 @@ //============================================================ #if defined(OSD_WINDOWS) || defined(SDLMAME_WIN32) // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include @@ -21,8 +20,6 @@ #include #include #include -#undef min -#undef max #include // MAME headers #include "osdcore.h" diff --git a/src/osd/sdl/sdlmain.cpp b/src/osd/sdl/sdlmain.cpp index c518191d1a7..f8bcb231796 100644 --- a/src/osd/sdl/sdlmain.cpp +++ b/src/osd/sdl/sdlmain.cpp @@ -29,7 +29,6 @@ // only for strconv.h #if defined(SDLMAME_WIN32) -#define WIN32_LEAN_AND_MEAN #include #endif diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 17e25bbd875..fa9fe2989e9 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -9,7 +9,6 @@ //============================================================ #ifdef SDLMAME_WIN32 -#define WIN32_LEAN_AND_MEAN #include #endif diff --git a/src/osd/strconv.cpp b/src/osd/strconv.cpp index d8fed98d687..9ea2e00bd1a 100644 --- a/src/osd/strconv.cpp +++ b/src/osd/strconv.cpp @@ -6,11 +6,8 @@ // //============================================================ #if defined(SDLMAME_WIN32) || defined(OSD_WINDOWS) || defined(OSD_UWP) -#define WIN32_LEAN_AND_MEAN #include #endif -#undef min -#undef max #include #include // MAMEOS headers diff --git a/src/osd/strconv.h b/src/osd/strconv.h index 65f9ad35fd1..f1eed54a49a 100644 --- a/src/osd/strconv.h +++ b/src/osd/strconv.h @@ -19,10 +19,6 @@ #if defined(WIN32) -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - #include namespace osd diff --git a/src/osd/uwp/uwpcompat.cpp b/src/osd/uwp/uwpcompat.cpp index 156ab408219..bd7103b8e31 100644 --- a/src/osd/uwp/uwpcompat.cpp +++ b/src/osd/uwp/uwpcompat.cpp @@ -8,9 +8,9 @@ #include "uwpcompat.h" -#include -#define WIN32_LEAN_AND_MEAN #include +#include + #undef interface #include "emu.h" diff --git a/src/osd/uwp/uwpcompat.h b/src/osd/uwp/uwpcompat.h index 697d5f9527f..2d495238a99 100644 --- a/src/osd/uwp/uwpcompat.h +++ b/src/osd/uwp/uwpcompat.h @@ -13,7 +13,9 @@ extern "C" { #endif -#define WIN32_LEAN_AND_MEAN +#ifndef NOGDI +#define NOGDI +#endif #include #include @@ -65,6 +67,38 @@ FILE *_popen( int _pclose( FILE *stream); +_Ret_maybenull_ +HMODULE WINAPI LoadLibraryA( + _In_ LPCSTR lpFileName +); + +_Ret_maybenull_ +HMODULE WINAPI LoadLibraryW( + _In_ LPCWSTR lpFileName +); + +#ifdef UNICODE +#define LoadLibrary LoadLibraryW +#else +#define LoadLibrary LoadLibraryA +#endif // !UNICODE + +_Ret_maybenull_ +HMODULE WINAPI GetModuleHandleA( + _In_ LPCSTR lpModuleName +); + +_Ret_maybenull_ +HMODULE WINAPI GetModuleHandleW( + _In_ LPCWSTR lpModuleName +); + +#ifdef UNICODE +#define GetModuleHandle GetModuleHandleW +#else +#define GetModuleHandle GetModuleHandleA +#endif // !UNICODE + _Ret_maybenull_ HMODULE WINAPI @@ -83,6 +117,12 @@ LoadLibraryExW( _In_ DWORD dwFlags ); +#ifdef UNICODE +#define LoadLibraryEx LoadLibraryExW +#else +#define LoadLibraryEx LoadLibraryExA +#endif // !UNICODE + DWORD WINAPI GetFileSize( @@ -90,12 +130,6 @@ GetFileSize( _Out_opt_ LPDWORD lpFileSizeHigh ); -#ifdef UNICODE -#define LoadLibraryEx LoadLibraryExW -#else -#define LoadLibraryEx LoadLibraryExA -#endif // !UNICODE - #ifdef __cplusplus } #endif diff --git a/src/osd/uwp/video.cpp b/src/osd/uwp/video.cpp index 8a3de3a8ef1..f59b59c171b 100644 --- a/src/osd/uwp/video.cpp +++ b/src/osd/uwp/video.cpp @@ -6,9 +6,9 @@ // //============================================================ -// standard windows headers #include -#define WIN32_LEAN_AND_MEAN + +// standard windows headers #include #include #include diff --git a/src/osd/uwp/window.cpp b/src/osd/uwp/window.cpp index bfee83acbed..0cb74263f34 100644 --- a/src/osd/uwp/window.cpp +++ b/src/osd/uwp/window.cpp @@ -46,9 +46,6 @@ using namespace Windows::UI::Core; #define MAKE_DI_SCAN(scan, isextended) (scan & 0x7f) | (isextended ? 0x80 : 0x00) #define WINOSD(machine) downcast(&machine.osd()) -#undef min -#undef max - //============================================================ // PARAMETERS //============================================================ diff --git a/src/osd/uwp/window.h b/src/osd/uwp/window.h index f4907bb97ee..b36ca4ca694 100644 --- a/src/osd/uwp/window.h +++ b/src/osd/uwp/window.h @@ -10,14 +10,11 @@ #define __UWP_WINDOW__ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include #include #include -#undef min -#undef max #include #include diff --git a/src/osd/windows/ledutil.cpp b/src/osd/windows/ledutil.cpp index 2db8fed4377..1d2d72d11a5 100644 --- a/src/osd/windows/ledutil.cpp +++ b/src/osd/windows/ledutil.cpp @@ -29,7 +29,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include diff --git a/src/osd/windows/main.cpp b/src/osd/windows/main.cpp index cd0d37bc942..7c33434c005 100644 --- a/src/osd/windows/main.cpp +++ b/src/osd/windows/main.cpp @@ -10,7 +10,6 @@ #ifdef OSD_SDL #define _WIN32_WINNT 0x0501 #endif -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp index 88c0f318122..b6625ea62e9 100644 --- a/src/osd/windows/video.cpp +++ b/src/osd/windows/video.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include // MAME headers diff --git a/src/osd/windows/window.h b/src/osd/windows/window.h index 688739565fb..3db5177cf6d 100644 --- a/src/osd/windows/window.h +++ b/src/osd/windows/window.h @@ -10,7 +10,6 @@ #define __WIN_WINDOW__ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp index bc7d51769dd..b146e8b6357 100644 --- a/src/osd/windows/winmain.cpp +++ b/src/osd/windows/winmain.cpp @@ -10,7 +10,6 @@ #include // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/windows/winmenu.cpp b/src/osd/windows/winmenu.cpp index a1f6aab2427..2fb0a548dbe 100644 --- a/src/osd/windows/winmenu.cpp +++ b/src/osd/windows/winmenu.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include "emu.h" diff --git a/src/osd/windows/winutf8.cpp b/src/osd/windows/winutf8.cpp index be23d963f5b..1c076158ebe 100644 --- a/src/osd/windows/winutf8.cpp +++ b/src/osd/windows/winutf8.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include #include diff --git a/src/osd/windows/winutil.cpp b/src/osd/windows/winutil.cpp index 951ce803a7a..3bd27a8eff8 100644 --- a/src/osd/windows/winutil.cpp +++ b/src/osd/windows/winutil.cpp @@ -7,7 +7,6 @@ //============================================================ // standard windows headers -#define WIN32_LEAN_AND_MEAN #include #include -- cgit v1.2.3 From 565a8845d5f9f35449823794a3b9133a9bf0dfcf Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Wed, 28 Dec 2016 21:24:51 -0500 Subject: pacman.cpp: eeekk port_name clarifications as well as further details for 'Difficulty' dip switch settings. Fixes MT#06461 [Tafoid] --- src/mame/drivers/pacman.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/pacman.cpp b/src/mame/drivers/pacman.cpp index 8ee0ad655ec..e2a6cc74c12 100644 --- a/src/mame/drivers/pacman.cpp +++ b/src/mame/drivers/pacman.cpp @@ -2374,11 +2374,11 @@ static INPUT_PORTS_START( eeekk ) PORT_MODIFY("IN0") PORT_SERVICE_NO_TOGGLE( 0x10, 0x10 ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_NAME( "P2 Attack" ) PORT_MODIFY("IN1") PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) PORT_NAME( "P1 Attack/2 Player Start" ) PORT_MODIFY("DSW1") PORT_DIPNAME( 0x03, 0x03, DEF_STR(Lives) ) PORT_DIPLOCATION("SW:1,2") @@ -2387,14 +2387,14 @@ static INPUT_PORTS_START( eeekk ) PORT_DIPSETTING( 0x01, "5" ) PORT_DIPSETTING( 0x00, "6" ) PORT_DIPNAME( 0x1c, 0x10, DEF_STR( Difficulty ) ) PORT_DIPLOCATION("SW:3,4,5") - PORT_DIPSETTING( 0x00, "8" ) + PORT_DIPSETTING( 0x00, "8 (Hard)" ) PORT_DIPSETTING( 0x04, "7" ) PORT_DIPSETTING( 0x08, "6" ) PORT_DIPSETTING( 0x0c, "5" ) PORT_DIPSETTING( 0x10, "4" ) PORT_DIPSETTING( 0x14, "3" ) PORT_DIPSETTING( 0x18, "2" ) - PORT_DIPSETTING( 0x1c, "1" ) + PORT_DIPSETTING( 0x1c, "1 (Easy)" ) PORT_DIPNAME( 0x20, 0x00, DEF_STR(Demo_Sounds) ) PORT_DIPLOCATION("SW:6") PORT_DIPSETTING( 0x00, DEF_STR(On) ) PORT_DIPSETTING( 0x20, DEF_STR(Off) ) -- cgit v1.2.3 From 65156b2a00b0f44013dfdfb7b368d6dbca0314e1 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 29 Dec 2016 17:19:28 +0100 Subject: fidel68k: added 6114-2/3/4 configurable ramsize (nw) --- src/mame/drivers/fidel68k.cpp | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index 79e42b595fd..a9d2c6c083b 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -11,7 +11,6 @@ such as Arena(in editmode). TODO: - - configurable RAM size - how does dual-CPU work? - USART is not emulated - V9(68030 @ 32MHz) is faster than V10(68040 @ 25MHz) but it should be the other @@ -158,6 +157,7 @@ B0000x-xxxxxx: see V7, -800000 #include "emu.h" #include "includes/fidelz80.h" #include "cpu/m68000/m68000.h" +#include "machine/ram.h" #include "machine/nvram.h" #include "sound/volt_reg.h" @@ -170,9 +170,12 @@ class fidel68k_state : public fidelz80base_state { public: fidel68k_state(const machine_config &mconfig, device_type type, const char *tag) - : fidelz80base_state(mconfig, type, tag) + : fidelz80base_state(mconfig, type, tag), + m_ram(*this, "ram") { } + optional_device m_ram; + TIMER_DEVICE_CALLBACK_MEMBER(irq_on) { m_maincpu->set_input_line(M68K_IRQ_2, ASSERT_LINE); } TIMER_DEVICE_CALLBACK_MEMBER(irq_off) { m_maincpu->set_input_line(M68K_IRQ_2, CLEAR_LINE); } @@ -180,6 +183,7 @@ public: DECLARE_WRITE8_MEMBER(fexcel68k_mux_w); // EAG(6114/6117) + DECLARE_DRIVER_INIT(eag); void eag_prepare_display(); DECLARE_READ8_MEMBER(eag_input1_r); DECLARE_WRITE8_MEMBER(eag_leds_w); @@ -289,10 +293,15 @@ ADDRESS_MAP_END // EAG +DRIVER_INIT_MEMBER(fidel68k_state, eag) +{ + // eag_map: DRAM slots at $200000-$2fffff - V1/V2: 128K, V3: 512K, V4: 1M + m_maincpu->space(AS_PROGRAM).install_ram(0x200000, 0x200000 + m_ram->size() - 1, m_ram->pointer()); +} + static ADDRESS_MAP_START( eag_map, AS_PROGRAM, 16, fidel68k_state ) AM_RANGE(0x000000, 0x01ffff) AM_ROM AM_RANGE(0x104000, 0x107fff) AM_RAM - AM_RANGE(0x200000, 0x2fffff) AM_RAM // DRAM slots AM_RANGE(0x300000, 0x30000f) AM_MIRROR(0x000010) AM_READWRITE8(eag_input1_r, eag_leds_w, 0x00ff) AM_RANGE(0x300000, 0x30000f) AM_MIRROR(0x000010) AM_WRITE8(eag_7seg_w, 0xff00) AM_READNOP AM_RANGE(0x400000, 0x407fff) AM_READ8(eag_cart_r, 0xff00) @@ -575,6 +584,10 @@ static MACHINE_CONFIG_START( eag, fidel68k_state ) MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) MCFG_DEFAULT_LAYOUT(layout_fidel_eag_68k) + MCFG_RAM_ADD("ram") + MCFG_RAM_DEFAULT_SIZE("1M") + MCFG_RAM_EXTRA_OPTIONS("128K, 512K, 1M") + /* sound hardware */ MCFG_SPEAKER_STANDARD_MONO("speaker") MCFG_SOUND_ADD("dac", DAC_1BIT, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) @@ -594,9 +607,11 @@ static MACHINE_CONFIG_DERIVED( eagv7, eag ) MCFG_CPU_REPLACE("maincpu", M68020, XTAL_20MHz) MCFG_CPU_PROGRAM_MAP(eagv7_map) MCFG_CPU_PERIODIC_INT_DRIVER(fidel68k_state, irq2_line_hold, XTAL_4_9152MHz/0x2000) // 600hz + + MCFG_RAM_REMOVE("ram") MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( eagv9, eag ) +static MACHINE_CONFIG_DERIVED( eagv9, eagv7 ) /* basic machine hardware */ MCFG_CPU_REPLACE("maincpu", M68030, XTAL_32MHz) @@ -604,7 +619,7 @@ static MACHINE_CONFIG_DERIVED( eagv9, eag ) MCFG_CPU_PERIODIC_INT_DRIVER(fidel68k_state, irq2_line_hold, XTAL_4_9152MHz/0x2000) // 600hz MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( eagv10, eag ) +static MACHINE_CONFIG_DERIVED( eagv10, eagv7 ) /* basic machine hardware */ MCFG_CPU_REPLACE("maincpu", M68040, XTAL_25MHz) @@ -612,7 +627,7 @@ static MACHINE_CONFIG_DERIVED( eagv10, eag ) MCFG_CPU_PERIODIC_INT_DRIVER(fidel68k_state, irq2_line_hold, XTAL_4_9152MHz/0x2000) // 600hz MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( eagv11, eag ) +static MACHINE_CONFIG_DERIVED( eagv11, eagv7 ) /* basic machine hardware */ MCFG_CPU_REPLACE("maincpu", M68EC040, XTAL_36MHz*2*2) // wrong! should be M68EC060 @ 72MHz @@ -673,12 +688,12 @@ ROM_END Drivers ******************************************************************************/ -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ -CONS( 1987, fexcel68k, 0, 0, fexcel68k, fexcel68k, driver_device, 0, "Fidelity Electronics", "Excel 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ +CONS( 1987, fexcel68k, 0, 0, fexcel68k, fexcel68k, driver_device, 0, "Fidelity Electronics", "Excel 68000", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1989, feagv2, 0, 0, eag, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // emulated as V4(1MB RAM) -CONS( 1989, feagv2a, feagv2, 0, eag, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) // " -CONS( 1990, feagv7, feagv2, 0, eagv7, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1990, feagv9, feagv2, 0, eagv9, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 1990, feagv10, feagv2, 0, eagv10, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -CONS( 2002, feagv11, feagv2, 0, eagv11, eag, driver_device, 0, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1989, feagv2, 0, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 1)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1989, feagv2a, feagv2, 0, eag, eag, fidel68k_state, eag, "Fidelity Electronics", "Elite Avant Garde (model 6114-2/3/4, set 2)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, feagv7, feagv2, 0, eagv7, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-7)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, feagv9, feagv2, 0, eagv9, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-9)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 1990, feagv10, feagv2, 0, eagv10, eag, driver_device, 0, "Fidelity Electronics", "Elite Avant Garde (model 6117-10)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) +CONS( 2002, feagv11, feagv2, 0, eagv11, eag, driver_device, 0, "hack (Wilfried Bucke)", "Elite Avant Garde (model 6117-11)", MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) -- cgit v1.2.3 From ca7f922e8b2396593b0e103b3002339be7198ccc Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 29 Dec 2016 17:22:38 +0100 Subject: zwackery: revert UTF-8 BOM (nw) --- src/mame/drivers/zwackery.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/drivers/zwackery.cpp b/src/mame/drivers/zwackery.cpp index 4a3d127582d..efb42e78cd7 100644 --- a/src/mame/drivers/zwackery.cpp +++ b/src/mame/drivers/zwackery.cpp @@ -1,4 +1,4 @@ -// license: BSD-3-Clause +// license: BSD-3-Clause // copyright-holders: Aaron Giles, Bryan McPhail /*************************************************************************** -- cgit v1.2.3 From accce00c40133bc6f9fe698cceb09421b222b71b Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 29 Dec 2016 17:49:35 +0100 Subject: fidel68: forgot to copypaste irq note from berger (nw) --- src/mame/drivers/fidel68k.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/fidel68k.cpp b/src/mame/drivers/fidel68k.cpp index a9d2c6c083b..46f28ec73e8 100644 --- a/src/mame/drivers/fidel68k.cpp +++ b/src/mame/drivers/fidel68k.cpp @@ -56,10 +56,9 @@ Hardware info: - OKI M82C51A-2 USART, 4.9152MHz XTAL - other special: magnet sensors, external module slot, serial port -IRQ source is unknown. Several possibilities: -- NE555 timer IC -- MM/SN74HC4060 binary counter IC (near the M82C51A) -- one of the XTALs, plus divider of course +IRQ source is a 4,9152MHz quartz crystal (Y3) connected to a 74HC4060 (U8, +ripple counter/divider). From Q12 output (counter=8192) we obtain the IRQ signal +applied to IPL1 of 68000 (pin 24) 4,9152 MHz / 8192 = 600 Hz. The module slot pinout is different from SCC series. The data on those appears to be compatible with EAG though and will load fine with an adapter. -- cgit v1.2.3 From 771229bedd016159d1115fd0fdababdbef5bd012 Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Sun, 25 Dec 2016 17:58:27 +0100 Subject: ppcdrc.cpp: clear two LSBs of the branch target address. This is what a real CPU does in order to prevent branching to an invalid address. --- src/devices/cpu/powerpc/ppcdrc.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/devices/cpu/powerpc/ppcdrc.cpp b/src/devices/cpu/powerpc/ppcdrc.cpp index 4ebf89a61f8..0b5ab034be7 100644 --- a/src/devices/cpu/powerpc/ppcdrc.cpp +++ b/src/devices/cpu/powerpc/ppcdrc.cpp @@ -1942,8 +1942,11 @@ void ppc_device::generate_branch(drcuml_block *block, compiler_state *compiler, } else { - generate_update_cycles(block, &compiler_temp, mem(srcptr), true); // - UML_HASHJMP(block, m_core->mode, mem(srcptr), *m_nocode); // hashjmp ,,nocode + generate_update_cycles(block, &compiler_temp, mem(srcptr), true); // + + /* clear two LSBs of the target address to prevent branching to an invalid address */ + UML_AND(block, I0, mem(srcptr), 0xFFFFFFFC); // and i0, 0xFFFFFFFC + UML_HASHJMP(block, m_core->mode, I0, *m_nocode); // hashjmp ,i0,nocode } /* update the label */ -- cgit v1.2.3 From 2be714ea8c275c1797483459739512a6a06b97bf Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Thu, 29 Dec 2016 16:42:45 +0100 Subject: ppcdrc.cpp: Clean up indentation of the previous commit. --- src/devices/cpu/powerpc/ppcdrc.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/devices/cpu/powerpc/ppcdrc.cpp b/src/devices/cpu/powerpc/ppcdrc.cpp index 0b5ab034be7..741e75f9cc2 100644 --- a/src/devices/cpu/powerpc/ppcdrc.cpp +++ b/src/devices/cpu/powerpc/ppcdrc.cpp @@ -1944,9 +1944,9 @@ void ppc_device::generate_branch(drcuml_block *block, compiler_state *compiler, { generate_update_cycles(block, &compiler_temp, mem(srcptr), true); // - /* clear two LSBs of the target address to prevent branching to an invalid address */ - UML_AND(block, I0, mem(srcptr), 0xFFFFFFFC); // and i0, 0xFFFFFFFC - UML_HASHJMP(block, m_core->mode, I0, *m_nocode); // hashjmp ,i0,nocode + /* clear two LSBs of the target address to prevent branching to an invalid address */ + UML_AND(block, I0, mem(srcptr), 0xFFFFFFFC); // and i0, 0xFFFFFFFC + UML_HASHJMP(block, m_core->mode, I0, *m_nocode); // hashjmp ,i0,nocode } /* update the label */ -- cgit v1.2.3 From b32c5200e3184ad28c96a62b67550f62c8668828 Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 28 Dec 2016 18:13:08 -0500 Subject: Z80 daisy chain stuff - Reconfigure Z80 daisy chain behavior to use the standard vector for an external IRQ, rather than a bogus one from the last device in the chain - Enable Z80 daisy chain on Cedar Magnet sound board (fake IRQ still necessary, though vectors are correct now) - Source note regarding IM 2 behavior contrary to Zilog datasheet (nw; was fixed way back in 0.35b11) --- src/devices/cpu/z180/z180.cpp | 2 ++ src/devices/cpu/z180/z180op.hxx | 9 ++------- src/devices/cpu/z80/z80.cpp | 23 +++++++++-------------- src/devices/cpu/z80/z80.h | 1 - src/devices/cpu/z80/z80daisy.cpp | 16 +++++++++------- src/devices/cpu/z80/z80daisy.h | 2 ++ src/mame/machine/cedar_magnet_sound.cpp | 27 ++++++++++++++------------- 7 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/devices/cpu/z180/z180.cpp b/src/devices/cpu/z180/z180.cpp index a9ba848ebdd..0c208a1f467 100644 --- a/src/devices/cpu/z180/z180.cpp +++ b/src/devices/cpu/z180/z180.cpp @@ -1969,6 +1969,8 @@ void z180_device::device_start() m_odirect = &m_oprogram->direct(); m_iospace = &space(AS_IO); + daisy_set_irq_callback(device_irq_acknowledge_delegate(FUNC(z180_device::standard_irq_callback_member), this)); + /* set up the state table */ { state_add(Z180_PC, "PC", m_PC.w.l); diff --git a/src/devices/cpu/z180/z180op.hxx b/src/devices/cpu/z180/z180op.hxx index 2479479344a..cad25aa4d1f 100644 --- a/src/devices/cpu/z180/z180op.hxx +++ b/src/devices/cpu/z180/z180op.hxx @@ -306,13 +306,8 @@ int z180_device::take_interrupt(int irq) if( irq == Z180_INT_IRQ0 ) { - /* Daisy chain mode? If so, call the requesting device */ - if (daisy_chain_present()) - irq_vector = daisy_call_ack_device(); - - /* else call back the cpu interface to retrieve the vector */ - else - irq_vector = standard_irq_callback(0); + // retrieve the IRQ vector from the daisy chain or CPU interface + irq_vector = daisy_call_ack_device(); LOG(("Z180 '%s' single int. irq_vector $%02x\n", tag(), irq_vector)); diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp index 7799dff84d5..93b697b5edf 100644 --- a/src/devices/cpu/z80/z80.cpp +++ b/src/devices/cpu/z80/z80.cpp @@ -3146,32 +3146,27 @@ void z80_device::take_nmi() void z80_device::take_interrupt() { - int irq_vector; - PRVPC = 0xffff; // HACK: segag80r protection kludge - /* Check if processor was halted */ + // check if processor was halted leave_halt(); - /* Clear both interrupt flip flops */ + // clear both interrupt flip flops m_iff1 = m_iff2 = 0; - /* Daisy chain mode? If so, call the requesting device */ - if (daisy_chain_present()) - irq_vector = daisy_call_ack_device(); - - /* else call back the cpu interface to retrieve the vector */ - else - irq_vector = m_irq_callback(*this, 0); - - /* Say hi */ + // say hi m_irqack_cb(true); + // fetch the IRQ vector + int irq_vector = daisy_call_ack_device(); LOG(("Z80 '%s' single int. irq_vector $%02x\n", tag(), irq_vector)); /* Interrupt mode 2. Call [i:databyte] */ if( m_im == 2 ) { + // Zilog's datasheet claims that "the least-significant bit must be a zero." + // However, experiments have confirmed that IM 2 vectors do not have to be + // even, and all 8 bits will be used; even $FF is handled normally. irq_vector = (irq_vector & 0xff) | (m_i << 8); push(m_pc); rm16(irq_vector, m_pc); @@ -3415,7 +3410,7 @@ void z80_device::device_start() m_decrypted_opcodes_direct = &m_decrypted_opcodes->direct(); m_io = &space(AS_IO); - m_irq_callback = device_irq_acknowledge_delegate(FUNC(z80_device::standard_irq_callback_member), this); + daisy_set_irq_callback(device_irq_acknowledge_delegate(FUNC(z80_device::standard_irq_callback_member), this)); IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */ F = ZF; /* Zero flag is set */ diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h index ecfd106e1c1..664e484c565 100644 --- a/src/devices/cpu/z80/z80.h +++ b/src/devices/cpu/z80/z80.h @@ -276,7 +276,6 @@ protected: uint8_t m_after_ei; /* are we in the EI shadow? */ uint8_t m_after_ldair; /* same, but for LD A,I or LD A,R */ uint32_t m_ea; - device_irq_acknowledge_delegate m_irq_callback; int m_icount; uint8_t m_rtemp; diff --git a/src/devices/cpu/z80/z80daisy.cpp b/src/devices/cpu/z80/z80daisy.cpp index 82e41c42e1a..a46f7956179 100644 --- a/src/devices/cpu/z80/z80daisy.cpp +++ b/src/devices/cpu/z80/z80daisy.cpp @@ -11,6 +11,8 @@ #include "emu.h" #include "z80daisy.h" +#define VERBOSE 0 + //************************************************************************** // DEVICE Z80 DAISY INTERFACE @@ -170,19 +172,20 @@ int z80_daisy_chain_interface::daisy_update_irq_state() int z80_daisy_chain_interface::daisy_call_ack_device() { - int vector = 0; - // loop over all devices; dev[0] is the highest priority for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next) { // if this device is asserting the INT line, that's the one we want int state = intf->z80daisy_irq_state(); - vector = intf->z80daisy_irq_ack(); if (state & Z80_DAISY_INT) - return vector; + return intf->z80daisy_irq_ack(); // call the requesting device } - //logerror("z80daisy_call_ack_device: failed to find an device to ack!\n"); - return vector; + + if (VERBOSE && daisy_chain_present()) + device().logerror("Interrupt from outside Z80 daisy chain\n"); + + // call back the CPU interface to retrieve the vector + return m_irq_callback(device(), 0); } @@ -204,7 +207,6 @@ void z80_daisy_chain_interface::daisy_call_reti_device() return; } } - //logerror("z80daisy_call_reti_device: failed to find an device to reti!\n"); } diff --git a/src/devices/cpu/z80/z80daisy.h b/src/devices/cpu/z80/z80daisy.h index 57d852261bc..7a11cb829c7 100644 --- a/src/devices/cpu/z80/z80daisy.h +++ b/src/devices/cpu/z80/z80daisy.h @@ -94,6 +94,7 @@ protected: // initialization void daisy_init(const z80_daisy_config *daisy); + void daisy_set_irq_callback(const device_irq_acknowledge_delegate &callback) { m_irq_callback = callback; } // callbacks int daisy_update_irq_state(); @@ -103,6 +104,7 @@ protected: private: const z80_daisy_config *m_daisy_config; device_z80daisy_interface *m_chain; // head of the daisy chain + device_irq_acknowledge_delegate m_irq_callback; }; diff --git a/src/mame/machine/cedar_magnet_sound.cpp b/src/mame/machine/cedar_magnet_sound.cpp index d289c1ad200..446751f8a16 100644 --- a/src/mame/machine/cedar_magnet_sound.cpp +++ b/src/mame/machine/cedar_magnet_sound.cpp @@ -10,20 +10,16 @@ 0xe6 - from ctc0 channel 3 (vector = E0) used to drive MSM5205 through FIFO 0xee - from ctc0 channel 3 (vector = E8) ^^ - 0xf6 - drive AY (once per frame?) triggered by ctc1 channel 3? (sets vector to f0, f6 = channel3?) - 0xff - read sound latch (triggered by write from master board) - - any attempts made to hook up the ctcs end up resulting in it taking an interrupt - with vector 0xf0, which points to 0x0000 and resets the cpu?! - - does the device here also need to add daisychain functions in order for the 0xff vector to be used - with the soundlatch writes? + 0xf6 - drive AY (once per frame?) triggered by ctc1 channel 3 (vector = F0) + 0xff - read sound latch (triggered by write from master board; default vector set by 5K/+5 pullups on D0-D7) */ #include "emu.h" #include "cedar_magnet_sound.h" +#include "machine/clock.h" + extern const device_type CEDAR_MAGNET_SOUND = &device_creator; @@ -47,7 +43,7 @@ void cedar_magnet_sound_device::write_command(uint8_t data) { m_command = data; // this interrupt causes it to read the soundlatch at 0x14 - m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xff); + m_cpu->set_input_line_and_vector(0, HOLD_LINE, 0xff); } @@ -58,6 +54,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START( cedar_magnet_sound_io, AS_IO, 8, cedar_magnet_sound_device ) ADDRESS_MAP_GLOBAL_MASK(0xff) + ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("ctc0", z80ctc_device, read, write) AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("ctc1", z80ctc_device, read, write) @@ -133,15 +130,12 @@ WRITE_LINE_MEMBER(cedar_magnet_sound_device::fifo_dor_w) // combined with a clock signal and used to drive ctc0 channel 3 } -#if 0 static const z80_daisy_config daisy_chain[] = { { "ctc1" }, { "ctc0" }, -// soundlatch from main CPU needs to be able to generate a vector too? { nullptr } }; -#endif TIMER_CALLBACK_MEMBER(cedar_magnet_sound_device::reset_assert_callback) { @@ -169,7 +163,7 @@ static MACHINE_CONFIG_FRAGMENT( cedar_magnet_sound ) MCFG_CPU_ADD("topcpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(cedar_magnet_sound_map) MCFG_CPU_IO_MAP(cedar_magnet_sound_io) -// MCFG_Z80_DAISY_CHAIN(daisy_chain) + MCFG_Z80_DAISY_CHAIN(daisy_chain) MCFG_CPU_PERIODIC_INT_DRIVER(cedar_magnet_sound_device, fake_irq, 4*60) MCFG_DEVICE_ADD("ctc0", Z80CTC, 4000000) @@ -184,6 +178,13 @@ static MACHINE_CONFIG_FRAGMENT( cedar_magnet_sound ) MCFG_Z80CTC_ZC1_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z2_w)) +#if 0 // does nothing useful now + MCFG_DEVICE_ADD("ck1mhz", CLOCK, 4000000/4) + MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("ctc1", z80ctc_device, trg0)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc1", z80ctc_device, trg1)) + MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc1", z80ctc_device, trg2)) +#endif + MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("aysnd0", AY8910, 4000000/2) -- cgit v1.2.3 From a82d0c6070129c2cc5c08e181ccfc5712b2f7872 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 29 Dec 2016 00:07:44 -0500 Subject: Get rid of fake IRQ in Cedar Magnet sound system --- src/mame/machine/cedar_magnet_sound.cpp | 18 ++---------------- src/mame/machine/cedar_magnet_sound.h | 3 --- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/src/mame/machine/cedar_magnet_sound.cpp b/src/mame/machine/cedar_magnet_sound.cpp index 446751f8a16..2ff907658ed 100644 --- a/src/mame/machine/cedar_magnet_sound.cpp +++ b/src/mame/machine/cedar_magnet_sound.cpp @@ -147,33 +147,20 @@ TIMER_CALLBACK_MEMBER(cedar_magnet_sound_device::reset_assert_callback) -INTERRUPT_GEN_MEMBER(cedar_magnet_sound_device::fake_irq) -{ - // these should be coming from the CTC... -// if (m_fake_counter==0) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xe6); -// if (m_fake_counter==1) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xee); - if (m_fake_counter==2) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xf6); // drives the AY, should be from ctc1 4th counter? - - m_fake_counter++; - - if (m_fake_counter == 4) m_fake_counter = 0; -} - static MACHINE_CONFIG_FRAGMENT( cedar_magnet_sound ) MCFG_CPU_ADD("topcpu", Z80, 4000000) MCFG_CPU_PROGRAM_MAP(cedar_magnet_sound_map) MCFG_CPU_IO_MAP(cedar_magnet_sound_io) MCFG_Z80_DAISY_CHAIN(daisy_chain) - MCFG_CPU_PERIODIC_INT_DRIVER(cedar_magnet_sound_device, fake_irq, 4*60) MCFG_DEVICE_ADD("ctc0", Z80CTC, 4000000) -// MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0)) + MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0)) MCFG_Z80CTC_ZC0_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z0_w)) MCFG_Z80CTC_ZC1_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z2_w)) MCFG_DEVICE_ADD("ctc1", Z80CTC, 4000000) -// MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0)) + MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0)) MCFG_Z80CTC_ZC0_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z0_w)) MCFG_Z80CTC_ZC1_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z1_w)) MCFG_Z80CTC_ZC2_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z2_w)) @@ -217,6 +204,5 @@ void cedar_magnet_sound_device::device_start() void cedar_magnet_sound_device::device_reset() { m_command = 0; - m_fake_counter = 0; cedar_magnet_board_device::device_reset(); } diff --git a/src/mame/machine/cedar_magnet_sound.h b/src/mame/machine/cedar_magnet_sound.h index ddc2f65f65a..0d1a5d0226b 100644 --- a/src/mame/machine/cedar_magnet_sound.h +++ b/src/mame/machine/cedar_magnet_sound.h @@ -49,9 +49,6 @@ public: TIMER_CALLBACK_MEMBER(reset_assert_callback) override; - int m_fake_counter; - INTERRUPT_GEN_MEMBER(fake_irq); - protected: virtual machine_config_constructor device_mconfig_additions() const override; virtual void device_start() override; -- cgit v1.2.3 From 54ae9d208b2aae33d6c3544a558c898b871e6817 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 29 Dec 2016 14:29:38 -0500 Subject: Simplify daisy-chain IRQ ack routine (get rid of delegate member) (nw) --- src/devices/cpu/z180/z180.cpp | 2 -- src/devices/cpu/z180/z180op.hxx | 3 ++- src/devices/cpu/z80/z80.cpp | 5 ++--- src/devices/cpu/z80/z80daisy.cpp | 12 +++++------- src/devices/cpu/z80/z80daisy.h | 4 +--- 5 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/devices/cpu/z180/z180.cpp b/src/devices/cpu/z180/z180.cpp index 0c208a1f467..a9ba848ebdd 100644 --- a/src/devices/cpu/z180/z180.cpp +++ b/src/devices/cpu/z180/z180.cpp @@ -1969,8 +1969,6 @@ void z180_device::device_start() m_odirect = &m_oprogram->direct(); m_iospace = &space(AS_IO); - daisy_set_irq_callback(device_irq_acknowledge_delegate(FUNC(z180_device::standard_irq_callback_member), this)); - /* set up the state table */ { state_add(Z180_PC, "PC", m_PC.w.l); diff --git a/src/devices/cpu/z180/z180op.hxx b/src/devices/cpu/z180/z180op.hxx index cad25aa4d1f..fce6718f40d 100644 --- a/src/devices/cpu/z180/z180op.hxx +++ b/src/devices/cpu/z180/z180op.hxx @@ -307,7 +307,8 @@ int z180_device::take_interrupt(int irq) if( irq == Z180_INT_IRQ0 ) { // retrieve the IRQ vector from the daisy chain or CPU interface - irq_vector = daisy_call_ack_device(); + device_z80daisy_interface *intf = daisy_get_irq_device(); + irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback_member(*this, 0); LOG(("Z180 '%s' single int. irq_vector $%02x\n", tag(), irq_vector)); diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp index 93b697b5edf..cb8c0ecc8ed 100644 --- a/src/devices/cpu/z80/z80.cpp +++ b/src/devices/cpu/z80/z80.cpp @@ -3158,7 +3158,8 @@ void z80_device::take_interrupt() m_irqack_cb(true); // fetch the IRQ vector - int irq_vector = daisy_call_ack_device(); + device_z80daisy_interface *intf = daisy_get_irq_device(); + int irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback_member(*this, 0); LOG(("Z80 '%s' single int. irq_vector $%02x\n", tag(), irq_vector)); /* Interrupt mode 2. Call [i:databyte] */ @@ -3410,8 +3411,6 @@ void z80_device::device_start() m_decrypted_opcodes_direct = &m_decrypted_opcodes->direct(); m_io = &space(AS_IO); - daisy_set_irq_callback(device_irq_acknowledge_delegate(FUNC(z80_device::standard_irq_callback_member), this)); - IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */ F = ZF; /* Zero flag is set */ diff --git a/src/devices/cpu/z80/z80daisy.cpp b/src/devices/cpu/z80/z80daisy.cpp index a46f7956179..23169dd3600 100644 --- a/src/devices/cpu/z80/z80daisy.cpp +++ b/src/devices/cpu/z80/z80daisy.cpp @@ -166,11 +166,11 @@ int z80_daisy_chain_interface::daisy_update_irq_state() //------------------------------------------------- -// call_ack_device - acknowledge an interrupt -// from a chained device and return the vector +// daisy_get_irq_device - return the device +// in the chain that requested the interrupt //------------------------------------------------- -int z80_daisy_chain_interface::daisy_call_ack_device() +device_z80daisy_interface *z80_daisy_chain_interface::daisy_get_irq_device() { // loop over all devices; dev[0] is the highest priority for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next) @@ -178,14 +178,12 @@ int z80_daisy_chain_interface::daisy_call_ack_device() // if this device is asserting the INT line, that's the one we want int state = intf->z80daisy_irq_state(); if (state & Z80_DAISY_INT) - return intf->z80daisy_irq_ack(); // call the requesting device + return intf; } if (VERBOSE && daisy_chain_present()) device().logerror("Interrupt from outside Z80 daisy chain\n"); - - // call back the CPU interface to retrieve the vector - return m_irq_callback(device(), 0); + return nullptr; } diff --git a/src/devices/cpu/z80/z80daisy.h b/src/devices/cpu/z80/z80daisy.h index 7a11cb829c7..896285516ee 100644 --- a/src/devices/cpu/z80/z80daisy.h +++ b/src/devices/cpu/z80/z80daisy.h @@ -94,17 +94,15 @@ protected: // initialization void daisy_init(const z80_daisy_config *daisy); - void daisy_set_irq_callback(const device_irq_acknowledge_delegate &callback) { m_irq_callback = callback; } // callbacks int daisy_update_irq_state(); - int daisy_call_ack_device(); + device_z80daisy_interface *daisy_get_irq_device(); void daisy_call_reti_device(); private: const z80_daisy_config *m_daisy_config; device_z80daisy_interface *m_chain; // head of the daisy chain - device_irq_acknowledge_delegate m_irq_callback; }; -- cgit v1.2.3 From a8ef9c252199227ff2fc4d6f53318f404a681eae Mon Sep 17 00:00:00 2001 From: Justin Kerk Date: Thu, 29 Dec 2016 14:44:50 -0800 Subject: pc_dsk: Support 360K images with 512-byte header, found in some softlist entries. [Justin Kerk] --- hash/ibm5150.xml | 6 ++---- src/lib/formats/pc_dsk.cpp | 12 ++++++++++++ src/lib/formats/pc_dsk.h | 2 ++ src/lib/formats/upd765_dsk.cpp | 6 +++--- src/lib/formats/upd765_dsk.h | 2 ++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/hash/ibm5150.xml b/hash/ibm5150.xml index b63298b93b8..940a86b2212 100644 --- a/hash/ibm5150.xml +++ b/hash/ibm5150.xml @@ -3202,8 +3202,7 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went - - + MS-DOS (Version 3.30) 1987 Microsoft @@ -3296,8 +3295,7 @@ Known PC Booter Games Not Dumped, Or Dumped and Lost when Demonlord's Site went - - + MS-DOS (Version 4.01, 5.25") 1988 Microsoft diff --git a/src/lib/formats/pc_dsk.cpp b/src/lib/formats/pc_dsk.cpp index 73ef727cdaf..32b6f079bbb 100644 --- a/src/lib/formats/pc_dsk.cpp +++ b/src/lib/formats/pc_dsk.cpp @@ -159,6 +159,18 @@ const char *pc_format::extensions() const return "dsk,ima,img,ufi,360"; } +int pc_format::identify(io_generic *io, uint32_t form_factor) +{ + uint64_t size = io_generic_size(io); + + /* some 360K images have a 512-byte header */ + if (size == 368640 + 0x200) { + file_header_skip_bytes = 0x200; + } + + return upd765_format::identify(io, form_factor); +} + const pc_format::format pc_format::formats[] = { { /* 160K 5 1/4 inch double density single sided */ floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM, diff --git a/src/lib/formats/pc_dsk.h b/src/lib/formats/pc_dsk.h index 381ad49e99a..02b3aa2468b 100644 --- a/src/lib/formats/pc_dsk.h +++ b/src/lib/formats/pc_dsk.h @@ -24,6 +24,8 @@ class pc_format : public upd765_format public: pc_format(); + virtual int identify(io_generic *io, uint32_t form_factor) override; + virtual const char *name() const override; virtual const char *description() const override; virtual const char *extensions() const override; diff --git a/src/lib/formats/upd765_dsk.cpp b/src/lib/formats/upd765_dsk.cpp index a7e5febc3d7..72e11257b89 100644 --- a/src/lib/formats/upd765_dsk.cpp +++ b/src/lib/formats/upd765_dsk.cpp @@ -11,7 +11,7 @@ #include "emu.h" // emu_fatalerror #include "formats/upd765_dsk.h" -upd765_format::upd765_format(const format *_formats) +upd765_format::upd765_format(const format *_formats) : file_header_skip_bytes(0) { formats = _formats; } @@ -24,7 +24,7 @@ int upd765_format::find_size(io_generic *io, uint32_t form_factor) const if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor) continue; - if(size == (uint64_t) compute_track_size(f) * f.track_count * f.head_count) + if(size == file_header_skip_bytes + (uint64_t) compute_track_size(f) * f.track_count * f.head_count) return i; } return -1; @@ -220,7 +220,7 @@ bool upd765_format::load(io_generic *io, uint32_t form_factor, floppy_image *ima for(int track=0; track < f.track_count; track++) for(int head=0; head < f.head_count; head++) { build_sector_description(f, sectdata, sectors, track, head); - io_generic_read(io, sectdata, (track*f.head_count + head)*track_size, track_size); + io_generic_read(io, sectdata, file_header_skip_bytes + (track*f.head_count + head)*track_size, track_size); generate_track(desc, track, head, sectors, f.sector_count, total_size, image); } diff --git a/src/lib/formats/upd765_dsk.h b/src/lib/formats/upd765_dsk.h index 5bd675de9e8..980d21a396e 100644 --- a/src/lib/formats/upd765_dsk.h +++ b/src/lib/formats/upd765_dsk.h @@ -44,6 +44,8 @@ public: virtual bool supports_save() const override; protected: + uint64_t file_header_skip_bytes; + floppy_image_format_t::desc_e* get_desc_fm(const format &f, int ¤t_size, int &end_gap_index); floppy_image_format_t::desc_e* get_desc_mfm(const format &f, int ¤t_size, int &end_gap_index); int find_size(io_generic *io, uint32_t form_factor) const; -- cgit v1.2.3 From d6261d705a64731fecf6da9c9ebf9d69df2defb8 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Thu, 29 Dec 2016 18:26:38 -0500 Subject: New clones added ---------------- Robo Army (NGM-032 ~ NGH-032) [JacKc] Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 2) [JacKc] --- hash/neogeo.xml | 69 ++++++++++++++++++++++++++++++++++++++++++++ src/mame/drivers/neodriv.hxx | 54 ++++++++++++++++++++++++++++++++-- src/mame/mame.lst | 2 ++ 3 files changed, 123 insertions(+), 2 deletions(-) diff --git a/hash/neogeo.xml b/hash/neogeo.xml index c120e19a027..bf5ed43e34f 100644 --- a/hash/neogeo.xml +++ b/hash/neogeo.xml @@ -1760,6 +1760,37 @@ + + Robo Army + 1991 + SNK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3428,7 +3428,7 @@ - Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II) + Saulabi Spirits / Jin Saulabi Tu Hon (Korean release of Samurai Shodown II, set 2) 1994 SNK @@ -3439,7 +3439,7 @@ - + -- cgit v1.2.3 From 713735526b2a7e3fbe0d4e47836aef90f32533df Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 30 Dec 2016 23:46:58 +1100 Subject: josvolly: "AA 007" chip is really NEC D8255A for reading input ports [CAPS0ff, Vas Crabb] --- src/mame/drivers/gsword.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mame/drivers/gsword.cpp b/src/mame/drivers/gsword.cpp index 3e12a6a93e8..7e7c2234c43 100644 --- a/src/mame/drivers/gsword.cpp +++ b/src/mame/drivers/gsword.cpp @@ -144,9 +144,12 @@ reg: 0->1 (main->2nd) / : (1->0) 2nd->main : ******************************************/ #include "emu.h" +#include "includes/gsword.h" + #include "cpu/z80/z80.h" +#include "machine/i8255.h" #include "machine/tait8741.h" -#include "includes/gsword.h" + #if 0 @@ -371,10 +374,8 @@ static ADDRESS_MAP_START( josvolly_cpu2_map, AS_PROGRAM, 8, gsword_state ) AM_RANGE(0x0000, 0x3fff) AM_ROM AM_RANGE(0x4000, 0x43ff) AM_RAM AM_SHARE("cpu2_ram") - /* 8000 to 8003 looks MCU */ - AM_RANGE(0x8000, 0x8000) AM_READ_PORT("IN1") // 1PL - AM_RANGE(0x8001, 0x8001) AM_READ_PORT("IN2") // 2PL / ACK - AM_RANGE(0x8002, 0x8002) AM_READ_PORT("IN0") // START + /* 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(0x6000, 0x6000) AM_WRITE(adpcm_soundcommand_w) AM_RANGE(0xA000, 0xA001) AM_DEVREADWRITE("josvolly_8741", josvolly8741_4pack_device, read_1, write_1) @@ -695,6 +696,11 @@ static MACHINE_CONFIG_START( josvolly, gsword_state ) MCFG_CPU_IO_MAP(josvolly_cpu2_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", gsword_state, irq0_line_hold) + MCFG_DEVICE_ADD("josvolly_aa_007", I8255, 0) + MCFG_I8255_IN_PORTA_CB(IOPORT("IN1")) // 1PL + 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")) -- cgit v1.2.3 From 1ca8f8c71eb61af90926e083c174433efaffd89d Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 29 Dec 2016 19:23:04 -0500 Subject: New callback for generic_latch_8/16_device (nw) - Add MCFG_GENERIC_LATCH_DATA_PENDING_CB to raise and lower a line automatically as the latch is written and read. This should make sound IRQs easier to deliver and reduce the incidence of HOLD_LINE in drivers. - Update a few drivers to use this new callback. --- src/devices/machine/gen_latch.cpp | 101 +++++++++++++++++++++++++------------- src/devices/machine/gen_latch.h | 55 ++++++++++++++++----- src/mame/drivers/dec0.cpp | 26 ++-------- src/mame/drivers/discoboy.cpp | 12 +---- src/mame/includes/dec0.h | 2 - 5 files changed, 118 insertions(+), 78 deletions(-) diff --git a/src/devices/machine/gen_latch.cpp b/src/devices/machine/gen_latch.cpp index f7848abfaee..7be65c67943 100644 --- a/src/devices/machine/gen_latch.cpp +++ b/src/devices/machine/gen_latch.cpp @@ -5,6 +5,7 @@ Generic 8bit and 16 bit latch devices ***************************************************************************/ + #include "emu.h" #include "gen_latch.h" @@ -13,26 +14,70 @@ //************************************************************************** const device_type GENERIC_LATCH_8 = &device_creator; - +const device_type GENERIC_LATCH_16 = &device_creator; //************************************************************************** // LIVE DEVICE //************************************************************************** +//------------------------------------------------- +// generic_latch_base_device - constructor +//------------------------------------------------- + +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_data_pending_cb(*this) +{ +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void generic_latch_base_device::device_start() +{ + m_data_pending_cb.resolve_safe(); + save_item(NAME(m_latch_read)); +} + +//------------------------------------------------- +// pending_r - tell whether the latch is waiting +// to be read +//------------------------------------------------- + +READ_LINE_MEMBER(generic_latch_base_device::pending_r) +{ + return !m_latch_read; +} + +//------------------------------------------------- +// set_latch_read - helper to signal that latch +// has been read or is waiting to be read +//------------------------------------------------- + +void generic_latch_base_device::set_latch_read(bool latch_read) +{ + if (m_latch_read != latch_read) + { + m_latch_read = latch_read; + m_data_pending_cb(!latch_read); + } +} + //------------------------------------------------- // generic_latch_8_device - constructor //------------------------------------------------- -generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, GENERIC_LATCH_8, "Generic 8-bit latch", tag, owner, clock, "generic_latch_8", __FILE__), - m_latched_value(0), - m_latch_read(0) +generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + generic_latch_base_device(mconfig, GENERIC_LATCH_8, "Generic 8-bit latch", tag, owner, clock, "generic_latch_8", __FILE__), + m_latched_value(0) { } READ8_MEMBER( generic_latch_8_device::read ) { - m_latch_read = 1; + set_latch_read(true); return m_latched_value; } @@ -66,17 +111,17 @@ WRITE_LINE_MEMBER( generic_latch_8_device::clear_w ) // callback to set a latch value //------------------------------------------------- -void generic_latch_8_device::sync_callback(void *ptr, int32_t param) +void generic_latch_8_device::sync_callback(void *ptr, s32 param) { - uint8_t value = param; + u8 value = param; // if the latch hasn't been read and the value is changed, log a warning - if (!m_latch_read && m_latched_value != value) - logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value); + if (!is_latch_read() && 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; - m_latch_read = 0; + set_latch_read(false); } //------------------------------------------------- @@ -86,35 +131,23 @@ void generic_latch_8_device::sync_callback(void *ptr, int32_t param) void generic_latch_8_device::device_start() { // register for state saving + generic_latch_base_device::device_start(); save_item(NAME(m_latched_value)); - save_item(NAME(m_latch_read)); } -//************************************************************************** -// DEVICE DEFINITIONS -//************************************************************************** - -const device_type GENERIC_LATCH_16 = &device_creator; - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - //------------------------------------------------- // generic_latch_16_device - constructor //------------------------------------------------- -generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : - device_t(mconfig, GENERIC_LATCH_16, "Generic 16-bit latch", tag, owner, clock, "generic_latch_16", __FILE__), - m_latched_value(0), - m_latch_read(0) +generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : + generic_latch_base_device(mconfig, GENERIC_LATCH_16, "Generic 16-bit latch", tag, owner, clock, "generic_latch_16", __FILE__), + m_latched_value(0) { } READ16_MEMBER( generic_latch_16_device::read ) { - m_latch_read = 1; + set_latch_read(true); return m_latched_value; } @@ -148,17 +181,17 @@ WRITE_LINE_MEMBER( generic_latch_16_device::clear_w ) // callback to set a latch value //------------------------------------------------- -void generic_latch_16_device::sync_callback(void *ptr, int32_t param) +void generic_latch_16_device::sync_callback(void *ptr, s32 param) { - uint16_t value = param; + u16 value = param; // if the latch hasn't been read and the value is changed, log a warning - if (!m_latch_read && m_latched_value != value) - logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value); + if (!is_latch_read() && 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; - m_latch_read = 0; + set_latch_read(false); } //------------------------------------------------- @@ -168,6 +201,6 @@ void generic_latch_16_device::sync_callback(void *ptr, int32_t param) void generic_latch_16_device::device_start() { // register for state saving + generic_latch_base_device::device_start(); save_item(NAME(m_latched_value)); - save_item(NAME(m_latch_read)); } diff --git a/src/devices/machine/gen_latch.h b/src/devices/machine/gen_latch.h index 8076f8c7b14..4cfa73a1c4c 100644 --- a/src/devices/machine/gen_latch.h +++ b/src/devices/machine/gen_latch.h @@ -11,6 +11,8 @@ #ifndef __GEN_LATCH_H__ #define __GEN_LATCH_H__ +#include "emu.h" + //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** @@ -21,17 +23,46 @@ #define MCFG_GENERIC_LATCH_16_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, GENERIC_LATCH_16, 0) +#define MCFG_GENERIC_LATCH_DATA_PENDING_CB(_devcb) \ + devcb = &generic_latch_base_device::set_data_pending_callback(*device, DEVCB_##_devcb); + //************************************************************************** // TYPE DEFINITIONS //************************************************************************** +// ======================> generic_latch_base_device + +class generic_latch_base_device : public device_t +{ +protected: + // construction/destruction + 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); + +public: + // static configuration + template static devcb_base &set_data_pending_callback(device_t &device, _Object object) { return downcast(device).m_data_pending_cb.set_callback(object); } + + DECLARE_READ_LINE_MEMBER(pending_r); + +protected: + virtual void device_start() override; + + bool is_latch_read() const { return m_latch_read; } + void set_latch_read(bool latch_read); + +private: + bool m_latch_read; + devcb_write_line m_data_pending_cb; +}; + + // ======================> generic_latch_8_device -class generic_latch_8_device : public device_t +class generic_latch_8_device : public generic_latch_base_device { public: // construction/destruction - generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); @@ -41,15 +72,15 @@ public: DECLARE_WRITE_LINE_MEMBER( preset_w ); DECLARE_WRITE_LINE_MEMBER( clear_w ); - void preset_w(uint16_t value) { m_latched_value = value; } + void preset_w(u8 value) { m_latched_value = value; } protected: virtual void device_start() override; - void sync_callback(void *ptr, int32_t param); + void sync_callback(void *ptr, s32 param); + private: - uint16_t m_latched_value; - uint8_t m_latch_read; + u8 m_latched_value; }; // device type definition @@ -58,11 +89,11 @@ extern const device_type GENERIC_LATCH_8; // ======================> generic_latch_16_device -class generic_latch_16_device : public device_t +class generic_latch_16_device : public generic_latch_base_device { public: // construction/destruction - generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); DECLARE_READ16_MEMBER( read ); DECLARE_WRITE16_MEMBER( write ); @@ -72,13 +103,15 @@ public: DECLARE_WRITE_LINE_MEMBER( preset_w ); DECLARE_WRITE_LINE_MEMBER( clear_w ); + void preset_w(u16 value) { m_latched_value = value; } + protected: virtual void device_start() override; - void sync_callback(void *ptr, int32_t param); + void sync_callback(void *ptr, s32 param); + private: - uint16_t m_latched_value; - uint8_t m_latch_read; + u16 m_latched_value; }; // device type definition diff --git a/src/mame/drivers/dec0.cpp b/src/mame/drivers/dec0.cpp index cc797e27313..11b387ccca6 100644 --- a/src/mame/drivers/dec0.cpp +++ b/src/mame/drivers/dec0.cpp @@ -229,10 +229,7 @@ WRITE16_MEMBER(dec0_automat_state::automat_control_w) { case 0xe: /* z80 sound cpu */ if (ACCESSING_BITS_0_7) - { m_soundlatch->write(space, 0, data & 0xff); - m_audiocpu->set_input_line(0, HOLD_LINE); - } break; case 12: /* DMA flag */ @@ -282,15 +279,6 @@ WRITE16_MEMBER(dec0_state::midres_sound_w) } } -WRITE16_MEMBER(dec0_automat_state::secretab_sound_w) -{ - if (ACCESSING_BITS_0_7) - { - m_soundlatch->write(space, 0, data & 0xff); - m_audiocpu->set_input_line(0, HOLD_LINE); - } -} - /******************************************************************************/ static ADDRESS_MAP_START( dec0_map, AS_PROGRAM, 16, dec0_state ) @@ -621,7 +609,7 @@ static ADDRESS_MAP_START( secretab_map, AS_PROGRAM, 16, dec0_automat_state ) // AM_RANGE(0x340400, 0x3407ff) AM_DEVREADWRITE("tilegen1", deco_bac06_device, pf_rowscroll_r, pf_rowscroll_w) AM_RANGE(0x314008, 0x31400f) AM_READ(slyspy_controls_r) - AM_RANGE(0x314000, 0x314001) AM_WRITE(secretab_sound_w) + AM_RANGE(0x314000, 0x314001) AM_DEVWRITE8("soundlatch", generic_latch_8_device, write, 0x00ff) AM_RANGE(0x300000, 0x300007) AM_RAM AM_RANGE(0x300010, 0x300017) AM_RAM @@ -640,7 +628,7 @@ static ADDRESS_MAP_START( automat_s_map, AS_PROGRAM, 8, dec0_automat_state ) AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc800, 0xc801) AM_DEVREADWRITE("2203a", ym2203_device, read, write) AM_RANGE(0xd000, 0xd001) AM_DEVREADWRITE("2203b", ym2203_device, read, write) - AM_RANGE(0xd800, 0xd800) AM_READ(sound_command_r) + AM_RANGE(0xd800, 0xd800) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_RANGE(0xe000, 0xe000) AM_DEVWRITE("adpcm_select2", ls157_device, ba_w) AM_RANGE(0xe800, 0xe800) AM_WRITE(sound_bankswitch_w) AM_RANGE(0xf000, 0xf000) AM_DEVWRITE("adpcm_select1", ls157_device, ba_w) @@ -652,7 +640,7 @@ static ADDRESS_MAP_START( secretab_s_map, AS_PROGRAM, 8, dec0_automat_state ) AM_RANGE(0xc000, 0xc7ff) AM_RAM AM_RANGE(0xc800, 0xc801) AM_DEVREADWRITE("2203a", ym2203_device, read, write) AM_RANGE(0xd000, 0xd001) AM_DEVREADWRITE("ym3812", ym3812_device, read, write) - AM_RANGE(0xd800, 0xd800) AM_READ(sound_command_r) + AM_RANGE(0xd800, 0xd800) AM_DEVREAD("soundlatch", generic_latch_8_device, read) AM_RANGE(0xe000, 0xe000) AM_DEVWRITE("adpcm_select2", ls157_device, ba_w) AM_RANGE(0xe800, 0xe800) AM_WRITE(sound_bankswitch_w) AM_RANGE(0xf000, 0xf000) AM_DEVWRITE("adpcm_select1", ls157_device, ba_w) @@ -1385,12 +1373,6 @@ static MACHINE_CONFIG_DERIVED( dec1, dec0_base ) MACHINE_CONFIG_END -READ8_MEMBER(dec0_automat_state::sound_command_r) -{ - m_audiocpu->set_input_line(0, CLEAR_LINE); - return m_soundlatch->read(space, 0); -} - WRITE8_MEMBER(dec0_automat_state::sound_bankswitch_w) { m_msm1->reset_w(BIT(data, 3)); @@ -1462,6 +1444,7 @@ static MACHINE_CONFIG_START( automat, dec0_automat_state ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) MCFG_SOUND_ADD("2203a", YM2203, 1250000) MCFG_SOUND_ROUTE(0, "mono", 0.90) @@ -1536,6 +1519,7 @@ static MACHINE_CONFIG_START( secretab, dec0_automat_state ) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) MCFG_SOUND_ADD("2203a", YM2203, 1250000) MCFG_SOUND_ROUTE(0, "mono", 0.90) diff --git a/src/mame/drivers/discoboy.cpp b/src/mame/drivers/discoboy.cpp index 094f359a805..afbf0c69d10 100644 --- a/src/mame/drivers/discoboy.cpp +++ b/src/mame/drivers/discoboy.cpp @@ -88,7 +88,6 @@ public: DECLARE_WRITE8_MEMBER(rambank_select_w); DECLARE_WRITE8_MEMBER(discoboy_port_00_w); DECLARE_WRITE8_MEMBER(discoboy_port_01_w); - DECLARE_WRITE8_MEMBER(discoboy_port_03_w); DECLARE_WRITE8_MEMBER(discoboy_port_06_w); DECLARE_WRITE8_MEMBER(rambank_w); DECLARE_READ8_MEMBER(rambank_r); @@ -249,14 +248,6 @@ WRITE8_MEMBER(discoboy_state::discoboy_port_01_w) membank("bank1")->set_entry(data & 0x07); } -WRITE8_MEMBER(discoboy_state::discoboy_port_03_w)// sfx? (to sound cpu) -{ - // printf("unk discoboy_port_03_w %02x\n", data); - // m_audiocpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); - m_soundlatch->write(space, 0, data); - m_audiocpu->set_input_line(0, HOLD_LINE); -} - WRITE8_MEMBER(discoboy_state::discoboy_port_06_w) { //printf("unk discoboy_port_06_w %02x\n",data); @@ -333,7 +324,7 @@ static ADDRESS_MAP_START( io_map, AS_IO, 8, discoboy_state ) AM_RANGE(0x00, 0x00) AM_READ_PORT("DSWA") AM_WRITE(discoboy_port_00_w) AM_RANGE(0x01, 0x01) AM_READ_PORT("SYSTEM") AM_WRITE(discoboy_port_01_w) AM_RANGE(0x02, 0x02) AM_READ_PORT("P1") - AM_RANGE(0x03, 0x03) AM_READ_PORT("P2") AM_WRITE(discoboy_port_03_w) + AM_RANGE(0x03, 0x03) AM_READ_PORT("P2") AM_DEVWRITE("soundlatch", generic_latch_8_device, write) AM_RANGE(0x04, 0x04) AM_READ_PORT("DSWB") AM_RANGE(0x06, 0x06) AM_READWRITE(discoboy_port_06_r, discoboy_port_06_w) // ??? AM_RANGE(0x07, 0x07) AM_WRITE(rambank_select_w) // 0x20 is palette bank bit.. others? @@ -512,6 +503,7 @@ static MACHINE_CONFIG_START( discoboy, discoboy_state ) MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", 0)) MCFG_SOUND_ADD("ymsnd", YM3812, XTAL_10MHz/4) /* 2.5 MHz? */ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.6) diff --git a/src/mame/includes/dec0.h b/src/mame/includes/dec0.h index fd03153d4db..af3899ff356 100644 --- a/src/mame/includes/dec0.h +++ b/src/mame/includes/dec0.h @@ -134,14 +134,12 @@ public: uint16_t m_automat_scroll_regs[4]; DECLARE_WRITE16_MEMBER(automat_control_w); - DECLARE_WRITE16_MEMBER(secretab_sound_w); DECLARE_READ16_MEMBER( automat_palette_r ); DECLARE_WRITE16_MEMBER( automat_palette_w ); DECLARE_WRITE16_MEMBER( automat_scroll_w ) { COMBINE_DATA(&m_automat_scroll_regs[offset]); } - DECLARE_READ8_MEMBER(sound_command_r); DECLARE_WRITE8_MEMBER(sound_bankswitch_w); DECLARE_WRITE_LINE_MEMBER(msm1_vclk_cb); DECLARE_WRITE_LINE_MEMBER(msm2_vclk_cb); -- cgit v1.2.3 From 2e9e772938161dc40011e692f89731f77e0d08b5 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 27 Dec 2016 20:06:53 +0000 Subject: added decapped dump of the d8751 on quzard4 sets [Team Europe] (also added NO_DUMP listings to the other - MCU might control region tho, so possibly needs further thought) have NOT hooked this up properly so not 100% sure it's good - timer interrupt code ends up jumping to unused area 000B: ljmp $016A 016A: clr tr0 016C: mov th0,#$FD 016F: mov tl0,#$12 0172: setb tr0 0174: push acc 0176: push psw 0178: mov a,r0 0179: push acc 017B: mov a,r1 017C: push acc 017E: anl c,/it1 0180: djnz r1,$013A 013A: rr a 013B: add a,r1 013C: mov r0,#$83 013E: mov p0.7,c 0140: acall $0012 0012: mov r7,a 0013: reti 0142: ljmp $E430 E430: nop E431: nop E432: nop E433: nop --- src/mame/drivers/cdi.cpp | 159 ++++++++++++++++++++--------------------------- src/mame/includes/cdi.h | 17 +++-- 2 files changed, 73 insertions(+), 103 deletions(-) diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index 0b2e23a1031..6b583ec591b 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -317,7 +317,7 @@ MACHINE_RESET_MEMBER( cdi_state, cdimono2 ) m_dmadac[1] = machine().device("dac2"); } -MACHINE_RESET_MEMBER( cdi_state, quizard12 ) +MACHINE_RESET_MEMBER( cdi_state, quizard1 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); @@ -325,37 +325,7 @@ MACHINE_RESET_MEMBER( cdi_state, quizard12 ) m_scc->set_quizard_mcu_ack(0x5a); } -MACHINE_RESET_MEMBER( cdi_state, quizard17 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - - m_scc->set_quizard_mcu_value(0x021f); - m_scc->set_quizard_mcu_ack(0x5a); -} - -/* Untested - copied from quizard17 */ -MACHINE_RESET_MEMBER( cdi_state, quizard18 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - - m_scc->set_quizard_mcu_value(0x021f); - m_scc->set_quizard_mcu_ack(0x5a); -} - -MACHINE_RESET_MEMBER( cdi_state, quizard22 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - - // 0x2b1: Italian - // 0x001: French - // 0x188: German - - m_scc->set_quizard_mcu_value(0x188); - m_scc->set_quizard_mcu_ack(0x59); -} - -/* Untested - copied from quizard22 */ -MACHINE_RESET_MEMBER( cdi_state, quizard23 ) +MACHINE_RESET_MEMBER( cdi_state, quizard2 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); @@ -367,16 +337,9 @@ MACHINE_RESET_MEMBER( cdi_state, quizard23 ) m_scc->set_quizard_mcu_ack(0x59); } -MACHINE_RESET_MEMBER( cdi_state, quizard32 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - m_scc->set_quizard_mcu_value(0x00ae); - m_scc->set_quizard_mcu_ack(0x58); -} -/* Untested - copied from quizard32 */ -MACHINE_RESET_MEMBER( cdi_state, quizard34 ) +MACHINE_RESET_MEMBER( cdi_state, quizard3 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); @@ -384,17 +347,7 @@ MACHINE_RESET_MEMBER( cdi_state, quizard34 ) m_scc->set_quizard_mcu_ack(0x58); } -/* Untested - copied from quizard4r41 */ -MACHINE_RESET_MEMBER( cdi_state, quizard4r40 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - - //m_scc->set_quizard_mcu_value(0x0139); - m_scc->set_quizard_mcu_value(0x011f); - m_scc->set_quizard_mcu_ack(0x57); -} - -MACHINE_RESET_MEMBER( cdi_state, quizard4r41 ) +MACHINE_RESET_MEMBER( cdi_state, quizard4 ) { MACHINE_RESET_CALL_MEMBER( cdimono1 ); @@ -403,13 +356,7 @@ MACHINE_RESET_MEMBER( cdi_state, quizard4r41 ) m_scc->set_quizard_mcu_ack(0x57); } -MACHINE_RESET_MEMBER( cdi_state, quizard4r42 ) -{ - MACHINE_RESET_CALL_MEMBER( cdimono1 ); - m_scc->set_quizard_mcu_value(0x01ae); - m_scc->set_quizard_mcu_ack(0x57); -} /************************** * 68HC05 Handlers * @@ -987,45 +934,38 @@ static MACHINE_CONFIG_DERIVED( quizard, cdimono1_base ) MCFG_CPU_VBLANK_INT_DRIVER("screen", cdi_state, mcu_frame) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard12, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard12 ) +static MACHINE_CONFIG_DERIVED( quizard1, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard1 ) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard17, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard17 ) +static MACHINE_CONFIG_DERIVED( quizard2, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard2 ) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard18, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard18 ) +static MACHINE_CONFIG_DERIVED( quizard3, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard3 ) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard22, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard22 ) -MACHINE_CONFIG_END +READ8_MEMBER( cdi_state::quizard_mcu_p1_r ) +{ + return rand(); +} -static MACHINE_CONFIG_DERIVED( quizard23, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard23 ) -MACHINE_CONFIG_END +static ADDRESS_MAP_START( mcu_io_map, AS_IO, 8, cdi_state ) + ADDRESS_MAP_UNMAP_HIGH + AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ(quizard_mcu_p1_r) +ADDRESS_MAP_END -static MACHINE_CONFIG_DERIVED( quizard32, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard32 ) -MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard3, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard34 ) -MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( quizard4, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4 ) -static MACHINE_CONFIG_DERIVED( quizard4r40, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4r40 ) -MACHINE_CONFIG_END + MCFG_CPU_ADD("mcu", I8751, 8000000) + MCFG_CPU_IO_MAP(mcu_io_map) +// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse) -static MACHINE_CONFIG_DERIVED( quizard4r41, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4r41 ) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard4r42, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4r42 ) -MACHINE_CONFIG_END @@ -1125,6 +1065,9 @@ ROM_START( quizard ) /* CD-ROM printed ??/?? */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard18", 0, BAD_DUMP SHA1(ede873b22957f2a707bbd3039e962ef2ca5aedbd) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END ROM_START( quizard_17 ) @@ -1139,6 +1082,9 @@ ROM_START( quizard_17 ) DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard17", 0, BAD_DUMP SHA1(4bd698f076505b4e17be978481bce027eb47123b) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */ @@ -1153,6 +1099,9 @@ ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard12", 0, BAD_DUMP SHA1(6e41683b96b74e903040842aeb18437ad7813c82) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END ROM_START( quizard_10 ) @@ -1170,6 +1119,9 @@ ROM_START( quizard_10 ) // Drive: TS-L633R DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard10", 0, SHA1(5715db50f0d5ffe06f47c0943f4bf0481ab6048e) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END @@ -1187,6 +1139,9 @@ ROM_START( quizard2 ) /* CD-ROM printed ??/?? */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard23", 0, BAD_DUMP SHA1(cd909d9a54275d6f2d36e03e83eea996e781b4d3) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard2_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END ROM_START( quizard2_22 ) @@ -1201,6 +1156,9 @@ ROM_START( quizard2_22 ) DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard22", 0, BAD_DUMP SHA1(03c8fdcf27ead6e221691111e8c679b551099543) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard2_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END // Quizard 3 @@ -1217,6 +1175,9 @@ ROM_START( quizard3 ) /* CD-ROM printed ??/?? */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard34", 0, BAD_DUMP SHA1(37ad49b72b5175afbb87141d57bc8604347fe032) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard3_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END ROM_START( quizard3_32 ) @@ -1231,6 +1192,9 @@ ROM_START( quizard3_32 ) DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard32", 0, BAD_DUMP SHA1(31e9fa2169aa44d799c37170b238134ab738e1a1) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard3_d8751.bin", 0x0000, 0x1000, NO_DUMP ) ROM_END @@ -1246,6 +1210,9 @@ ROM_START( quizard4 ) /* CD-ROM printed 09/98 */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard4r42", 0, BAD_DUMP SHA1(a5d5c8950b4650b8753f9119dc7f1ccaa2aa5442) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) ROM_END ROM_START( quizard4_41 ) @@ -1260,6 +1227,9 @@ ROM_START( quizard4_41 ) DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard4r41", 0, BAD_DUMP SHA1(2c0484c6545aac8e00b318328c6edce6f5dde43d) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) ROM_END ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ @@ -1274,6 +1244,9 @@ ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ DISK_REGION( "cdrom" ) DISK_IMAGE_READONLY( "quizard4r40", 0, BAD_DUMP SHA1(288cc37a994e4f1cbd47aa8c92342879c6fc0b87) ) + + ROM_REGION(0x1000, "mcu", 0) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) ROM_END @@ -1293,17 +1266,17 @@ CONS( 1991, cdi490a, 0, 0, cdimono1, cdi, driver_device, 0, GAME( 1995, cdibios, 0, cdimono1_base, quizard, driver_device, 0, ROT0, "Philips", "CD-i (Mono-I) (PAL) BIOS", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS | MACHINE_IS_BIOS_ROOT ) -GAME( 1995, quizard, cdibios, quizard18, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard_17, quizard, quizard17, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.7)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard_12, quizard, quizard12, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard_10, quizard, quizard12, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.0)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard, cdibios, quizard1, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.8)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard_17, quizard, quizard1, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.7)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard_12, quizard, quizard1, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard_10, quizard, quizard1, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard (v1.0)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard2, cdibios, quizard23, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard2_22, quizard2, quizard22, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard2, cdibios, quizard2, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1995, quizard2_22, quizard2, quizard2, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) GAME( 1995, quizard3, cdibios, quizard3, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.4)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1996, quizard3_32, quizard3, quizard32, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1996, quizard3_32, quizard3, quizard3, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1998, quizard4, cdibios, quizard4r42, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) // doesn't boot -GAME( 1998, quizard4_41, quizard4, quizard4r41, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1997, quizard4_40, quizard4, quizard4r40, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1998, quizard4, cdibios, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) // doesn't boot +GAME( 1998, quizard4_41, quizard4, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +GAME( 1997, quizard4_40, quizard4, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h index 869f3c59355..4b9cfbee10a 100644 --- a/src/mame/includes/cdi.h +++ b/src/mame/includes/cdi.h @@ -8,6 +8,7 @@ #include "machine/cdicdic.h" #include "sound/dmadac.h" #include "video/mcd212.h" +#include "cpu/mcs51/mcs51.h" /*----------- driver state -----------*/ @@ -106,21 +107,17 @@ public: DECLARE_MACHINE_RESET(cdimono1); DECLARE_MACHINE_RESET(cdimono2); - DECLARE_MACHINE_RESET(quizard12); - DECLARE_MACHINE_RESET(quizard17); - DECLARE_MACHINE_RESET(quizard18); - DECLARE_MACHINE_RESET(quizard22); - DECLARE_MACHINE_RESET(quizard23); - DECLARE_MACHINE_RESET(quizard32); - DECLARE_MACHINE_RESET(quizard34); - DECLARE_MACHINE_RESET(quizard4r40); - DECLARE_MACHINE_RESET(quizard4r41); - DECLARE_MACHINE_RESET(quizard4r42); + DECLARE_MACHINE_RESET(quizard1); + DECLARE_MACHINE_RESET(quizard2); + DECLARE_MACHINE_RESET(quizard3); + DECLARE_MACHINE_RESET(quizard4); DECLARE_READ8_MEMBER(servo_io_r); DECLARE_WRITE8_MEMBER(servo_io_w); DECLARE_READ8_MEMBER(slave_io_r); DECLARE_WRITE8_MEMBER(slave_io_w); + READ8_MEMBER(quizard_mcu_p1_r); + uint32_t screen_update_cdimono1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); }; -- cgit v1.2.3 From 2b1ab32002eb07122f48b742b5bd5ded7386e544 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 27 Dec 2016 20:50:00 +0000 Subject: replace with better dump (nw) --- src/mame/drivers/cdi.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index 6b583ec591b..4d4a2ee6475 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -1212,7 +1212,7 @@ ROM_START( quizard4 ) /* CD-ROM printed 09/98 */ DISK_IMAGE_READONLY( "quizard4r42", 0, BAD_DUMP SHA1(a5d5c8950b4650b8753f9119dc7f1ccaa2aa5442) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END ROM_START( quizard4_41 ) @@ -1229,7 +1229,7 @@ ROM_START( quizard4_41 ) DISK_IMAGE_READONLY( "quizard4r41", 0, BAD_DUMP SHA1(2c0484c6545aac8e00b318328c6edce6f5dde43d) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ @@ -1246,7 +1246,7 @@ ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ DISK_IMAGE_READONLY( "quizard4r40", 0, BAD_DUMP SHA1(288cc37a994e4f1cbd47aa8c92342879c6fc0b87) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(7b409c91) SHA1(b02251d7279c66f6da7b79bf35ded033320b70ee) ) + ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END -- cgit v1.2.3 From d945178ae7dc266aa14289ba261b3bf17b1161f1 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Tue, 27 Dec 2016 21:30:57 +0000 Subject: fix flags on these, the quizard3 and 4 game versions has never worked past coin-up to my knowledge. quizard4 does boot now tho, it was using the wrong sim before. --- src/mame/drivers/cdi.cpp | 6 ++++-- src/mame/includes/cdi.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index 4d4a2ee6475..d36c4bf5700 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -1274,9 +1274,11 @@ GAME( 1995, quizard_10, quizard, quizard1, quizard, driver_device, GAME( 1995, quizard2, cdibios, quizard2, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.3)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) GAME( 1995, quizard2_22, quizard2, quizard2, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 2 (v2.2)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1995, quizard3, cdibios, quizard3, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.4)", MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) +// Quizard 3 and 4 will hang after inserting a coin (incomplete protection sims?) + +GAME( 1995, quizard3, cdibios, quizard3, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.4)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) GAME( 1996, quizard3_32, quizard3, quizard3, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 3 (v3.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) -GAME( 1998, quizard4, cdibios, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) // doesn't boot +GAME( 1998, quizard4, cdibios, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.2)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) GAME( 1998, quizard4_41, quizard4, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.1)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) GAME( 1997, quizard4_40, quizard4, quizard4, quizard, driver_device, 0, ROT0, "TAB Austria", "Quizard 4 Rainbow (v4.0)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_UNEMULATED_PROTECTION ) diff --git a/src/mame/includes/cdi.h b/src/mame/includes/cdi.h index 4b9cfbee10a..6b73b21c475 100644 --- a/src/mame/includes/cdi.h +++ b/src/mame/includes/cdi.h @@ -116,7 +116,7 @@ public: DECLARE_READ8_MEMBER(slave_io_r); DECLARE_WRITE8_MEMBER(slave_io_w); - READ8_MEMBER(quizard_mcu_p1_r); + DECLARE_READ8_MEMBER(quizard_mcu_p1_r); uint32_t screen_update_cdimono1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_cdimono1_lcd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); -- cgit v1.2.3 From 780cd40da84cb346b488b47f67f56194449f2f73 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Wed, 28 Dec 2016 11:06:26 +0000 Subject: note that the dumped Quizard 4 MCU is German region. --- src/mame/drivers/cdi.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index d36c4bf5700..858b24a6141 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -1051,7 +1051,19 @@ ROM_START( cdibios ) // for the quizard sets ROM_LOAD( "slave.bin", 0x0000, 0x2000, NO_DUMP ) // Undumped 68HC05 microcontroller, might need decapping ROM_END -// Quizard +/* Quizard notes + + The MCU controls the protection sequence, which in turn controls the game display language. + Each Quizard game (1,2,3,4) requires it's own MCU, you can upgrade between revisions by changing + just the CD, but not between games as a new MCU is required. + + The only dumped MCU is a Quizard 4 German MCU. A Quizard 4 Czech MCU has been located but is a + 89c51 not a 87c51 + +*/ + + +// Quizard (1) ROM_START( quizard ) /* CD-ROM printed ??/?? */ ROM_REGION(0x80000, "maincpu", 0) @@ -1212,7 +1224,7 @@ ROM_START( quizard4 ) /* CD-ROM printed 09/98 */ DISK_IMAGE_READONLY( "quizard4r42", 0, BAD_DUMP SHA1(a5d5c8950b4650b8753f9119dc7f1ccaa2aa5442) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) + ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END ROM_START( quizard4_41 ) @@ -1229,7 +1241,7 @@ ROM_START( quizard4_41 ) DISK_IMAGE_READONLY( "quizard4r41", 0, BAD_DUMP SHA1(2c0484c6545aac8e00b318328c6edce6f5dde43d) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) + ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ @@ -1246,7 +1258,7 @@ ROM_START( quizard4_40 ) /* CD-ROM printed 07/97 */ DISK_IMAGE_READONLY( "quizard4r40", 0, BAD_DUMP SHA1(288cc37a994e4f1cbd47aa8c92342879c6fc0b87) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard4_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) + ROM_LOAD( "quizard4_german_d8751.bin", 0x0000, 0x1000, CRC(77be0b40) SHA1(113b5c239480a2259f55e411ba8fb3972e6d4301) ) ROM_END -- cgit v1.2.3 From 8663304100c58a06d434f724435f64cb1e45bf1f Mon Sep 17 00:00:00 2001 From: David Haywood Date: Wed, 28 Dec 2016 19:31:38 +0000 Subject: also decapped / dumped an MCU for the original quizard (1) [TeamEurope] --- src/mame/drivers/cdi.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/mame/drivers/cdi.cpp b/src/mame/drivers/cdi.cpp index 858b24a6141..a2c70c94c23 100644 --- a/src/mame/drivers/cdi.cpp +++ b/src/mame/drivers/cdi.cpp @@ -934,17 +934,6 @@ static MACHINE_CONFIG_DERIVED( quizard, cdimono1_base ) MCFG_CPU_VBLANK_INT_DRIVER("screen", cdi_state, mcu_frame) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( quizard1, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard1 ) -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( quizard2, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard2 ) -MACHINE_CONFIG_END - -static MACHINE_CONFIG_DERIVED( quizard3, quizard ) - MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard3 ) -MACHINE_CONFIG_END READ8_MEMBER( cdi_state::quizard_mcu_p1_r ) { @@ -956,6 +945,22 @@ static ADDRESS_MAP_START( mcu_io_map, AS_IO, 8, cdi_state ) AM_RANGE(MCS51_PORT_P1, MCS51_PORT_P1) AM_READ(quizard_mcu_p1_r) ADDRESS_MAP_END +static MACHINE_CONFIG_DERIVED( quizard1, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard1 ) + + MCFG_CPU_ADD("mcu", I8751, 8000000) + MCFG_CPU_IO_MAP(mcu_io_map) +// MCFG_DEVICE_VBLANK_INT_DRIVER("screen", cdi_state, irq0_line_pulse) + +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( quizard2, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard2 ) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( quizard3, quizard ) + MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard3 ) +MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( quizard4, quizard ) MCFG_MACHINE_RESET_OVERRIDE(cdi_state, quizard4 ) @@ -1057,8 +1062,8 @@ ROM_END Each Quizard game (1,2,3,4) requires it's own MCU, you can upgrade between revisions by changing just the CD, but not between games as a new MCU is required. - The only dumped MCU is a Quizard 4 German MCU. A Quizard 4 Czech MCU has been located but is a - 89c51 not a 87c51 + The only dumped MCUs are German region ones for Quizard 1 and 4. + A Czech Quizard 4 MCU was located but it was an 89c51 type instead */ @@ -1079,9 +1084,10 @@ ROM_START( quizard ) /* CD-ROM printed ??/?? */ DISK_IMAGE_READONLY( "quizard18", 0, BAD_DUMP SHA1(ede873b22957f2a707bbd3039e962ef2ca5aedbd) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) + ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) ROM_END + ROM_START( quizard_17 ) ROM_REGION(0x80000, "maincpu", 0) ROM_LOAD( "cdi220b.rom", 0x000000, 0x80000, CRC(279683ca) SHA1(53360a1f21ddac952e95306ced64186a3fc0b93e) ) @@ -1096,7 +1102,7 @@ ROM_START( quizard_17 ) DISK_IMAGE_READONLY( "quizard17", 0, BAD_DUMP SHA1(4bd698f076505b4e17be978481bce027eb47123b) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) + ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) ROM_END ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */ @@ -1113,7 +1119,7 @@ ROM_START( quizard_12 ) /* CD-ROM printed 01/95 */ DISK_IMAGE_READONLY( "quizard12", 0, BAD_DUMP SHA1(6e41683b96b74e903040842aeb18437ad7813c82) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) + ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) ROM_END ROM_START( quizard_10 ) @@ -1133,7 +1139,7 @@ ROM_START( quizard_10 ) DISK_IMAGE_READONLY( "quizard10", 0, SHA1(5715db50f0d5ffe06f47c0943f4bf0481ab6048e) ) ROM_REGION(0x1000, "mcu", 0) - ROM_LOAD( "quizard_d8751.bin", 0x0000, 0x1000, NO_DUMP ) + ROM_LOAD( "quizard1_german_d8751.bin", 0x0000, 0x1000, CRC(95f45b6b) SHA1(51b34956539b1e2cf0306f243a970750f1e18d01) ) ROM_END -- cgit v1.2.3 From 4f7ff8f84666a4c458bf102d796728ef3c852222 Mon Sep 17 00:00:00 2001 From: system11b Date: Mon, 26 Dec 2016 23:05:15 +0000 Subject: cvs.cpp: popmessage in some games only appears with VERBOSE=1 now --- src/mame/drivers/cvs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/drivers/cvs.cpp b/src/mame/drivers/cvs.cpp index 6427f13f64f..d331ed50507 100644 --- a/src/mame/drivers/cvs.cpp +++ b/src/mame/drivers/cvs.cpp @@ -347,7 +347,7 @@ WRITE8_MEMBER(cvs_state::cvs_unknown_w) if (data != m_dac3_state[offset]) { - if (offset != 2) + if (VERBOSE && offset != 2) popmessage("Unknown: %02x %02x\n", offset, data); m_dac3_state[offset] = data; } -- cgit v1.2.3 From 54766981c284590bbc253c24d41b0f27eb3d9b89 Mon Sep 17 00:00:00 2001 From: Nathan Woods Date: Sat, 24 Dec 2016 13:43:52 -0500 Subject: [Imgtool CoCo/RS-DOS] Miscellaneous cleanups and C++ modernization --- src/tools/imgtool/imgtool.cpp | 37 +++++++ src/tools/imgtool/imgtool.h | 1 + src/tools/imgtool/modules/rsdos.cpp | 215 +++++++++++++++++++++--------------- 3 files changed, 165 insertions(+), 88 deletions(-) diff --git a/src/tools/imgtool/imgtool.cpp b/src/tools/imgtool/imgtool.cpp index bb7e6c860db..3eb836b6ce3 100644 --- a/src/tools/imgtool/imgtool.cpp +++ b/src/tools/imgtool/imgtool.cpp @@ -41,6 +41,11 @@ void CLIB_DECL ATTR_PRINTF(1,2) logerror(const char *format, ...) Imgtool initialization and basics ***************************************************************************/ + +//------------------------------------------------- +// rtrim +//------------------------------------------------- + void rtrim(char *buf) { size_t buflen; @@ -54,6 +59,11 @@ void rtrim(char *buf) } } + +//------------------------------------------------- +// strncpyz +//------------------------------------------------- + char *strncpyz(char *dest, const char *source, size_t len) { char *s; @@ -67,6 +77,33 @@ char *strncpyz(char *dest, const char *source, size_t len) return s; } + +//------------------------------------------------- +// extract_padded_string +//------------------------------------------------- + +static std::string extract_padded_string(const char *source, size_t len) +{ + while ((len > 0) && (source[len - 1] == ' ')) + len--; + return std::string(source, len); +} + + +//------------------------------------------------- +// extract_padded_filename - this is a common +// enough scenario that it is justified to have +// this in common code +//------------------------------------------------- + +std::string extract_padded_filename(const char *source, size_t filename_length, size_t extension_length) +{ + std::string filename = extract_padded_string(source, filename_length); + std::string extension = extract_padded_string(source + filename_length, extension_length); + return extension.empty() ? filename : filename + "." + extension; +} + + //------------------------------------------------- // markerrorsource - marks where an error source //------------------------------------------------- diff --git a/src/tools/imgtool/imgtool.h b/src/tools/imgtool/imgtool.h index eb614a9dabb..5640b3cab12 100644 --- a/src/tools/imgtool/imgtool.h +++ b/src/tools/imgtool/imgtool.h @@ -266,5 +266,6 @@ void unknown_partition_get_info(const imgtool_class *imgclass, uint32_t state, u char *strncpyz(char *dest, const char *source, size_t len); void rtrim(char *buf); +std::string extract_padded_filename(const char *source, size_t filename_length, size_t extension_length); #endif /* IMGTOOL_H */ diff --git a/src/tools/imgtool/modules/rsdos.cpp b/src/tools/imgtool/modules/rsdos.cpp index 8be6458e45c..9ee8de3cf8c 100644 --- a/src/tools/imgtool/modules/rsdos.cpp +++ b/src/tools/imgtool/modules/rsdos.cpp @@ -2,7 +2,7 @@ // copyright-holders:Nathan Woods /**************************************************************************** - rsdos.c + rsdos.cpp CoCo RS-DOS disk images @@ -18,8 +18,7 @@ /* this structure mirrors the structure of an RS-DOS directory entry on disk */ struct rsdos_dirent { - char fname[8]; - char fext[3]; + char filename[11]; char ftype; char asciiflag; unsigned char first_granule; @@ -31,7 +30,7 @@ struct rsdos_dirent struct rsdos_direnum { int index; - int eof; + bool eof; }; #define RSDOS_OPTIONS_FTYPE 'T' @@ -44,50 +43,51 @@ struct rsdos_direnum *********************************************************************/ #define MAX_DIRENTS ((18-2)*(256/32)) -static floperr_t get_rsdos_dirent(imgtool::image &f, int index_loc, struct rsdos_dirent *ent) +#define MAX_GRANULEMAP_SIZE 256 + +//------------------------------------------------- +// get_rsdos_dirent +//------------------------------------------------- + +static floperr_t get_rsdos_dirent(imgtool::image &f, int index_loc, rsdos_dirent &ent) { - return floppy_read_sector(imgtool_floppy(f), 0, 17, 3, index_loc * 32, (void *) ent, sizeof(*ent)); + return floppy_read_sector(imgtool_floppy(f), 0, 17, 3, index_loc * 32, (void *) &ent, sizeof(ent)); } +//------------------------------------------------- +// put_rsdos_dirent +//------------------------------------------------- -static floperr_t put_rsdos_dirent(imgtool::image &f, int index_loc, const struct rsdos_dirent *ent) +static floperr_t put_rsdos_dirent(imgtool::image &f, int index_loc, const rsdos_dirent &ent) { if (index_loc >= MAX_DIRENTS) return (floperr_t)IMGTOOLERR_FILENOTFOUND; - return floppy_write_sector(imgtool_floppy(f), 0, 17, 3, index_loc * 32, (void *) ent, sizeof(*ent), 0); /* TODO: pass ddam argument from imgtool */ + return floppy_write_sector(imgtool_floppy(f), 0, 17, 3, index_loc * 32, (void *) &ent, sizeof(ent), 0); /* TODO: pass ddam argument from imgtool */ } +//------------------------------------------------- +// get_dirent_fname +//------------------------------------------------- -/* fnamebuf must have at least 13 bytes */ -static void get_dirent_fname(char *fnamebuf, const struct rsdos_dirent *ent) +static std::string get_dirent_fname(const rsdos_dirent &ent) { - char *s; - - memset(fnamebuf, 0, 13); - memcpy(fnamebuf, ent->fname, sizeof(ent->fname)); - rtrim(fnamebuf); - s = fnamebuf + strlen(fnamebuf); - *(s++) = '.'; - memcpy(s, ent->fext, sizeof(ent->fext)); - rtrim(s); - - /* If no extension, remove period */ - if (*s == '\0') - s[-1] = '\0'; + return extract_padded_filename(ent.filename, 8, 3); } +//------------------------------------------------- +// lookup_rsdos_file +//------------------------------------------------- -static imgtoolerr_t lookup_rsdos_file(imgtool::image &f, const char *fname, struct rsdos_dirent *ent, int *position) +static imgtoolerr_t lookup_rsdos_file(imgtool::image &f, const char *fname, rsdos_dirent &ent, int *position = nullptr) { int i; floperr_t ferr; - char fnamebuf[13]; + std::string fnamebuf; i = 0; - fnamebuf[0] = '\0'; do { @@ -97,15 +97,15 @@ static imgtoolerr_t lookup_rsdos_file(imgtool::image &f, const char *fname, stru if (ferr) return imgtool_floppy_error(ferr); } - while(ent->fname[0] == '\0'); + while(ent.filename[0] == '\0'); - if (ent->fname[0] != -1) - get_dirent_fname(fnamebuf, ent); + if (ent.filename[0] != -1) + fnamebuf = get_dirent_fname(ent); } - while((ent->fname[0] != -1) && core_stricmp(fnamebuf, fname)); + while((ent.filename[0] != -1) && core_stricmp(fnamebuf.c_str(), fname)); - if (ent->fname[0] == -1) + if (ent.filename[0] == -1) return IMGTOOLERR_FILENOTFOUND; if (position) @@ -114,6 +114,9 @@ static imgtoolerr_t lookup_rsdos_file(imgtool::image &f, const char *fname, stru } +//------------------------------------------------- +// get_granule_count +//------------------------------------------------- static uint8_t get_granule_count(imgtool::image &img) { @@ -125,10 +128,12 @@ static uint8_t get_granule_count(imgtool::image &img) return (granules > 255) ? 255 : (uint8_t) granules; } -#define MAX_GRANULEMAP_SIZE 256 -/* granule_map must be an array of MAX_GRANULEMAP_SIZE bytes */ -static floperr_t get_granule_map(imgtool::image &img, uint8_t *granule_map, uint8_t *granule_count) +//------------------------------------------------- +// get_granule_map +//------------------------------------------------- + +static floperr_t get_granule_map(imgtool::image &img, uint8_t *granule_map, uint8_t granule_count[MAX_GRANULEMAP_SIZE]) { uint8_t count; @@ -140,6 +145,9 @@ static floperr_t get_granule_map(imgtool::image &img, uint8_t *granule_map, uint } +//------------------------------------------------- +// put_granule_map +//------------------------------------------------- static floperr_t put_granule_map(imgtool::image &img, const uint8_t *granule_map, uint8_t granule_count) { @@ -147,7 +155,9 @@ static floperr_t put_granule_map(imgtool::image &img, const uint8_t *granule_map } - +//------------------------------------------------- +// transfer_granule +//------------------------------------------------- static imgtoolerr_t transfer_granule(imgtool::image &img, uint8_t granule, int length, imgtool::stream &f, imgtoolerr_t (*proc)(imgtool::image &, int, int, int, int, size_t, imgtool::stream &)) { @@ -166,6 +176,9 @@ static imgtoolerr_t transfer_granule(imgtool::image &img, uint8_t granule, int l } +//------------------------------------------------- +// transfer_from_granule +//------------------------------------------------- static imgtoolerr_t transfer_from_granule(imgtool::image &img, uint8_t granule, int length, imgtool::stream &destf) { @@ -173,6 +186,9 @@ static imgtoolerr_t transfer_from_granule(imgtool::image &img, uint8_t granule, } +//------------------------------------------------- +// transfer_to_granule +//------------------------------------------------- static imgtoolerr_t transfer_to_granule(imgtool::image &img, uint8_t granule, int length, imgtool::stream &sourcef) { @@ -180,14 +196,17 @@ static imgtoolerr_t transfer_to_granule(imgtool::image &img, uint8_t granule, in } +//------------------------------------------------- +// process_rsdos_file +//------------------------------------------------- -static imgtoolerr_t process_rsdos_file(struct rsdos_dirent *ent, imgtool::image &img, imgtool::stream *destf, size_t *size) +static imgtoolerr_t process_rsdos_file(struct rsdos_dirent *ent, imgtool::image &img, imgtool::stream *destf, size_t &size) { floperr_t ferr; size_t s, lastgransize; uint8_t granule_count; unsigned char i = 0, granule; - uint8_t usedmap[MAX_GRANULEMAP_SIZE]; /* Used to detect infinite loops */ + uint8_t usedmap[MAX_GRANULEMAP_SIZE]; // used to detect infinite loops uint8_t granule_map[MAX_GRANULEMAP_SIZE]; ferr = get_granule_map(img, granule_map, &granule_count); @@ -221,23 +240,24 @@ static imgtoolerr_t process_rsdos_file(struct rsdos_dirent *ent, imgtool::image if (destf) transfer_from_granule(img, granule, lastgransize, *destf); - if (size) - *size = s + lastgransize; + size = s + lastgransize; return IMGTOOLERR_SUCCESS; } +//------------------------------------------------- +// prepare_dirent - create a new directory entry +// with a specified name +//------------------------------------------------- -/* create a new directory entry with a specified name */ -static imgtoolerr_t prepare_dirent(struct rsdos_dirent *ent, const char *fname) +static imgtoolerr_t prepare_dirent(rsdos_dirent &ent, const char *fname) { const char *fname_end; const char *fname_ext; int fname_ext_len; - memset(ent, '\0', sizeof(*ent)); - memset(ent->fname, ' ', sizeof(ent->fname)); - memset(ent->fext, ' ', sizeof(ent->fext)); + memset(&ent, '\0', sizeof(ent)); + memset(ent.filename, ' ', sizeof(ent.filename)); fname_end = strchr(fname, '.'); if (fname_end) @@ -247,32 +267,34 @@ static imgtoolerr_t prepare_dirent(struct rsdos_dirent *ent, const char *fname) fname_ext_len = strlen(fname_ext); - /* We had better be an 8.3 filename */ + // we had better be an 8.3 filename if (((fname_end - fname) > 8) || (fname_ext_len > 3)) return IMGTOOLERR_BADFILENAME; - memcpy(ent->fname, fname, fname_end - fname); - memcpy(ent->fext, fname_ext, fname_ext_len); + memcpy(&ent.filename[0], fname, fname_end - fname); + memcpy(&ent.filename[8], fname_ext, fname_ext_len); - /* For now, all files are type 2 binary files */ - ent->ftype = 2; - ent->asciiflag = 0; + // for now, all files are type 2 binary files + ent.ftype = 2; + ent.asciiflag = 0; return IMGTOOLERR_SUCCESS; } +//------------------------------------------------- +// rsdos_diskimage_nextenum +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_nextenum(imgtool::directory &enumeration, imgtool_dirent &ent) { floperr_t ferr; imgtoolerr_t err; size_t filesize; - struct rsdos_direnum *rsenum; - struct rsdos_dirent rsent; - char fname[13]; + rsdos_direnum *rsenum; + rsdos_dirent rsent; imgtool::image &image(enumeration.image()); - rsenum = (struct rsdos_direnum *) enumeration.extra_bytes(); + rsenum = (rsdos_direnum *) enumeration.extra_bytes(); /* Did we hit the end of file before? */ if (rsenum->eof) @@ -283,14 +305,14 @@ static imgtoolerr_t rsdos_diskimage_nextenum(imgtool::directory &enumeration, im if (rsenum->index >= MAX_DIRENTS) goto eof; - ferr = get_rsdos_dirent(image, rsenum->index++, &rsent); + ferr = get_rsdos_dirent(image, rsenum->index++, rsent); if (ferr) return imgtool_floppy_error(ferr); } - while(rsent.fname[0] == '\0'); + while(rsent.filename[0] == '\0'); - /* Now are we at the eof point? */ - if (rsent.fname[0] == -1) + // now are we at the eof point? + if (rsent.filename[0] == -1) { rsenum->eof = 1; eof: @@ -299,7 +321,7 @@ eof: else { /* Not the end of file */ - err = process_rsdos_file(&rsent, image, nullptr, &filesize); + err = process_rsdos_file(&rsent, image, nullptr, filesize); if (err) return err; @@ -316,15 +338,18 @@ eof: } ent.eof = 0; - get_dirent_fname(fname, &rsent); + std::string fname = get_dirent_fname(rsent); - snprintf(ent.filename, ARRAY_LENGTH(ent.filename), "%s", fname); + snprintf(ent.filename, ARRAY_LENGTH(ent.filename), "%s", fname.c_str()); snprintf(ent.attr, ARRAY_LENGTH(ent.attr), "%d %c", (int) rsent.ftype, (char) (rsent.asciiflag + 'B')); } return IMGTOOLERR_SUCCESS; } +//------------------------------------------------- +// rsdos_diskimage_freespace +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_freespace(imgtool::partition &partition, uint64_t *size) { @@ -349,16 +374,19 @@ static imgtoolerr_t rsdos_diskimage_freespace(imgtool::partition &partition, uin } +//------------------------------------------------- +// delete_entry +//------------------------------------------------- -static imgtoolerr_t delete_entry(imgtool::image &img, struct rsdos_dirent *ent, int pos) +static imgtoolerr_t delete_entry(imgtool::image &img, rsdos_dirent &ent, int pos) { floperr_t ferr; unsigned char g, i; uint8_t granule_count; uint8_t granule_map[MAX_GRANULEMAP_SIZE]; - /* Write a NUL in the filename, marking it deleted */ - ent->fname[0] = 0; + // write a NUL in the filename, marking it deleted + ent.filename[0] = 0; ferr = put_rsdos_dirent(img, pos, ent); if (ferr) return imgtool_floppy_error(ferr); @@ -367,8 +395,8 @@ static imgtoolerr_t delete_entry(imgtool::image &img, struct rsdos_dirent *ent, if (ferr) return imgtool_floppy_error(ferr); - /* Now free up the granules */ - g = ent->first_granule; + // now free up the granules + g = ent.first_granule; while (g < granule_count) { i = granule_map[g]; @@ -384,6 +412,9 @@ static imgtoolerr_t delete_entry(imgtool::image &img, struct rsdos_dirent *ent, } +//------------------------------------------------- +// rsdos_diskimage_readfile +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_readfile(imgtool::partition &partition, const char *fname, const char *fork, imgtool::stream &destf) { @@ -392,11 +423,11 @@ static imgtoolerr_t rsdos_diskimage_readfile(imgtool::partition &partition, cons size_t size; imgtool::image &img(partition.image()); - err = lookup_rsdos_file(img, fname, &ent, NULL); + err = lookup_rsdos_file(img, fname, ent); if (err) return err; - err = process_rsdos_file(&ent, img, &destf, &size); + err = process_rsdos_file(&ent, img, &destf, size); if (err) return err; @@ -407,6 +438,9 @@ static imgtoolerr_t rsdos_diskimage_readfile(imgtool::partition &partition, cons } +//------------------------------------------------- +// rsdos_diskimage_writefile +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, const char *fname, const char *fork, imgtool::stream &sourcef, util::option_resolution *writeoptions) { @@ -422,7 +456,7 @@ static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, con uint8_t granule_count; uint8_t granule_map[MAX_GRANULEMAP_SIZE]; - /* can we write to this image? */ + // can we write to this image? if (floppy_is_read_only(imgtool_floppy(img))) return IMGTOOLERR_READONLY; @@ -430,13 +464,13 @@ static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, con if (err) return err; - /* is there enough space? */ + // is there enough space? sz = sourcef.size(); if (sz > freespace) return IMGTOOLERR_NOSPACE; - /* setup our directory entry */ - err = prepare_dirent(&ent, fname); + // setup our directory entry + err = prepare_dirent(ent, fname); if (err) return err; @@ -458,7 +492,7 @@ static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, con { g++; if ((g >= granule_count) || (g == 0)) - return IMGTOOLERR_UNEXPECTED; /* We should have already verified that there is enough space */ + return IMGTOOLERR_UNEXPECTED; // we should have already verified that there is enough space } *gptr = g; gptr = &granule_map[g]; @@ -471,39 +505,38 @@ static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, con sz -= i; - /* Go to next granule */ + // go to next granule g++; } while(sz > 0); - /* Now that we are done with the file, we need to specify the final entry - * in the file allocation table - */ + // now that we are done with the file, we need to specify the final entry + // in the file allocation table *gptr = 0xc0 + ((i + 255) / 256); - /* Now we need to find an empty directory entry */ + // now we need to find an empty directory entry i = -1; do { - ferr = get_rsdos_dirent(img, ++i, &ent2); + ferr = get_rsdos_dirent(img, ++i, ent2); if (ferr) return imgtool_floppy_error(ferr); } - while((ent2.fname[0] != '\0') && strcmp(ent.fname, ent2.fname) && (ent2.fname[0] != -1)); + while((ent2.filename[0] != '\0') && strcmp(ent.filename, ent2.filename) && (ent2.filename[0] != -1)); - /* delete file if it already exists */ - if (ent2.fname[0] && (ent2.fname[0] != -1)) + // delete file if it already exists + if (ent2.filename[0] && (ent2.filename[0] != -1)) { - err = delete_entry(img, &ent2, i); + err = delete_entry(img, ent2, i); if (err) return err; } - ferr = put_rsdos_dirent(img, i, &ent); + ferr = put_rsdos_dirent(img, i, ent); if (ferr) return imgtool_floppy_error(ferr); - /* write the granule map back out */ + // write the granule map back out ferr = put_granule_map(img, granule_map, granule_count); if (ferr) return imgtool_floppy_error(ferr); @@ -512,6 +545,9 @@ static imgtoolerr_t rsdos_diskimage_writefile(imgtool::partition &partition, con } +//------------------------------------------------- +// rsdos_diskimage_deletefile +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_deletefile(imgtool::partition &partition, const char *fname) { @@ -520,14 +556,17 @@ static imgtoolerr_t rsdos_diskimage_deletefile(imgtool::partition &partition, co int pos; struct rsdos_dirent ent; - err = lookup_rsdos_file(image, fname, &ent, &pos); + err = lookup_rsdos_file(image, fname, ent, &pos); if (err) return err; - return delete_entry(image, &ent, pos); + return delete_entry(image, ent, pos); } +//------------------------------------------------- +// rsdos_diskimage_suggesttransfer +//------------------------------------------------- static imgtoolerr_t rsdos_diskimage_suggesttransfer(imgtool::partition &partition, const char *fname, imgtool_transfer_suggestion *suggestions, size_t suggestions_length) { @@ -538,7 +577,7 @@ static imgtoolerr_t rsdos_diskimage_suggesttransfer(imgtool::partition &partitio if (fname) { - err = lookup_rsdos_file(image, fname, &ent, &pos); + err = lookup_rsdos_file(image, fname, ent, &pos); if (err) return err; -- cgit v1.2.3 From 2a1f72c9457dac93933bf93e86986015d7dcba43 Mon Sep 17 00:00:00 2001 From: sparrowred Date: Fri, 23 Dec 2016 14:49:39 +0100 Subject: reverted last change (nw) --- hash/gameboy.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hash/gameboy.xml b/hash/gameboy.xml index e46daef051a..796fdc95465 100644 --- a/hash/gameboy.xml +++ b/hash/gameboy.xml @@ -24918,7 +24918,7 @@ - + -- cgit v1.2.3 From 87f62419c65fcf45acdf7eb6a077138880b9adb2 Mon Sep 17 00:00:00 2001 From: sparrowred Date: Fri, 23 Dec 2016 14:57:21 +0100 Subject: correct clone relationship for zoopj (nw) --- hash/gameboy.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/hash/gameboy.xml b/hash/gameboy.xml index 796fdc95465..e093160a411 100644 --- a/hash/gameboy.xml +++ b/hash/gameboy.xml @@ -24894,7 +24894,20 @@ - + + Zoop (Euro, USA) + 1995 + Viacom NewMedia + + + + + + + + + + Zoop (Jpn) 1997 @@ -24910,19 +24923,6 @@ - - Zoop (Euro, USA) - 1995 - Viacom NewMedia - - - - - - - - - -- cgit v1.2.3 From f9b0a31dc92ab9e98c2701e2fb1cd44bc149ca52 Mon Sep 17 00:00:00 2001 From: Stefano Date: Tue, 6 Dec 2016 09:31:59 +0100 Subject: Making the RTC chip react on the Aussie Byte --- src/mame/includes/aussiebyte.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mame/includes/aussiebyte.h b/src/mame/includes/aussiebyte.h index 0ec8c3c1115..5cac9c322cd 100644 --- a/src/mame/includes/aussiebyte.h +++ b/src/mame/includes/aussiebyte.h @@ -47,6 +47,7 @@ public: , m_floppy0(*this, "fdc:0") , m_floppy1(*this, "fdc:1") , m_crtc(*this, "crtc") + , m_rtc(*this, "rtc") , m_speaker(*this, "speaker") , m_votrax(*this, "votrax") , m_rtc(*this, "rtc") @@ -83,6 +84,9 @@ public: DECLARE_WRITE_LINE_MEMBER(sio2_rdya_w); DECLARE_WRITE_LINE_MEMBER(sio2_rdyb_w); DECLARE_WRITE_LINE_MEMBER(clock_w); + DECLARE_READ_LINE_MEMBER(clock_r); + DECLARE_READ8_MEMBER(rtc_data_r); + DECLARE_WRITE8_MEMBER(rtc_data_w); DECLARE_MACHINE_RESET(aussiebyte); DECLARE_DRIVER_INIT(aussiebyte); DECLARE_WRITE_LINE_MEMBER(ctc_z0_w); @@ -125,6 +129,7 @@ private: required_device m_floppy0; optional_device m_floppy1; required_device m_crtc; + required_device m_rtc; required_device m_speaker; required_device m_votrax; required_device m_rtc; -- cgit v1.2.3 From 0d34b116578db60c55ce93dfed6d1d277be721fd Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 9 Dec 2016 11:48:42 +0100 Subject: Update rm380z.cpp --- src/mame/machine/rm380z.cpp | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/mame/machine/rm380z.cpp b/src/mame/machine/rm380z.cpp index 47209eeee98..131bf775be5 100644 --- a/src/mame/machine/rm380z.cpp +++ b/src/mame/machine/rm380z.cpp @@ -33,6 +33,9 @@ WRITE8_MEMBER( rm380z_state::port_write ) case 0xFC: // PORT0 //printf("FBFCw[%2.2x] FBFD [%2.2x] FBFE [%2.2x] PC [%4.4x] writenum [%4.4x]\n",data,m_fbfd,m_fbfe,m_maincpu->safe_pc(),writenum); m_port0 = data; + + m_cassette->output((m_port0 & 0xEF) ? +1.0 : -1.0); // set 2400hz, bit 4 + if (data&0x01) { //printf("WARNING: bit0 of port0 reset\n"); @@ -57,9 +60,11 @@ WRITE8_MEMBER( rm380z_state::port_write ) break; + // port 1 case 0xFE: // line on screen to write to divided by 2 //printf("FBFC [%2.2x] FBFD [%2.2x] FBFEw[%2.2x] PC [%4.4x] writenum [%4.4x]\n",m_port0,m_fbfd,data,m_maincpu->safe_pc(),writenum); m_fbfe=data; + break; case 0xFF: // user I/O port @@ -92,6 +97,11 @@ READ8_MEMBER( rm380z_state::port_read ) break; case 0xFE: // PORT1 + if ((m_cassette)->input() < +0.0) + m_port1 &= 0xDF; // bit 5 off + else + m_port1 |= 0x20; // bit 5 on + data = m_port1; //printf("read of port1 from PC [%x]\n",m_maincpu->safe_pc()); break; @@ -230,6 +240,28 @@ void rm380z_state::machine_start() machine().scheduler().timer_pulse(attotime::from_hz(TIMER_SPEED), timer_expired_delegate(FUNC(rm380z_state::static_vblank_timer),this)); } +DRIVER_INIT_MEMBER( rm380z_state, rm380z ) +{ + m_videomode=RM380Z_VIDEOMODE_80COL; + m_old_videomode=m_videomode; + m_port0_mask=0xff; +} + +DRIVER_INIT_MEMBER( rm380z_state, rm380z34d ) +{ + m_videomode=RM380Z_VIDEOMODE_40COL; + m_old_videomode=m_videomode; + m_port0_mask=0xdf; // disable 80 column mode +} + +DRIVER_INIT_MEMBER( rm380z_state, rm380z34e ) +{ + m_videomode=RM380Z_VIDEOMODE_40COL; + m_old_videomode=m_videomode; + m_port0_mask=0xdf; // disable 80 column mode +} + + void rm380z_state::machine_reset() { m_port0=0x00; @@ -241,8 +273,8 @@ void rm380z_state::machine_reset() m_old_old_fbfd=0x00; writenum=0; - m_videomode=RM380Z_VIDEOMODE_80COL; - m_old_videomode=m_videomode; +// m_videomode=RM380Z_VIDEOMODE_80COL; +// m_old_videomode=m_videomode; m_rasterlineCtr=0; // note: from COS 4.0 videos, screen seems to show garbage at the beginning -- cgit v1.2.3 From 9edd3346b8c74c8636cc83007264f9d79d51cfe9 Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 9 Dec 2016 11:51:20 +0100 Subject: Update rm380z.cpp --- src/mame/drivers/rm380z.cpp | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/rm380z.cpp b/src/mame/drivers/rm380z.cpp index 0604b07cde0..1d2d93d6bb7 100644 --- a/src/mame/drivers/rm380z.cpp +++ b/src/mame/drivers/rm380z.cpp @@ -8,6 +8,9 @@ Microcomputer produced by Research Machines Limited, Oxford, UK MESS driver by Wilbert Pol and friol (dantonag (at) gmail.com) Driver started on 22/12/2011 +Stefano Bodrato, 09/12/2016 - skeleton for cassette support +True tape samples are needed to continue ! + === Memory map from sevice manual: @@ -146,6 +149,12 @@ static MACHINE_CONFIG_START( rm380z, rm380z_state ) MCFG_PALETTE_ADD_MONOCHROME("palette") + /* cassette */ + MCFG_CASSETTE_ADD( "cassette" ) +// MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED) + MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY | CASSETTE_MOTOR_ENABLED) + //m_cassette->change_state((BIT(data,x)) ? CASSETTE_MOTOR_DISABLED : CASSETTE_MOTOR_ENABLED, CASSETTE_MASK_MOTOR); + /* RAM configurations */ MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("56K") @@ -161,10 +170,28 @@ static MACHINE_CONFIG_START( rm380z, rm380z_state ) MCFG_GENERIC_KEYBOARD_CB(WRITE8(rm380z_state, keyboard_put)) MACHINE_CONFIG_END -/* ROM definition */ + + +/* ROM definitions */ + +ROM_START( rm380z34d ) + 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 ) + ROM_LOAD( "ch3.raw", 0x0000, 0x1680, BAD_DUMP CRC(c223622b) SHA1(185ef24896419d7ff46f71a760ac217de3811684)) +ROM_END + +ROM_START( rm380z34e ) + ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) + ROM_LOAD( "cos34e-m.bin", 0x0000, 0x1000, CRC(20e2ddf4) SHA1(3177b28793d5a348c94fd0ae6393d74e2e9a8662)) + // chargen ROM is undumped, afaik + ROM_REGION( 0x1680, "chargen", 0 ) + ROM_LOAD( "ch3.raw", 0x0000, 0x1680, BAD_DUMP CRC(c223622b) SHA1(185ef24896419d7ff46f71a760ac217de3811684)) +ROM_END + ROM_START( rm380z ) ROM_REGION( 0x10000, RM380Z_MAINCPU_TAG, 0 ) -// ROM_LOAD( "cos34e-m.bin", 0x0000, 0x1000, CRC(20e2ddf4) SHA1(3177b28793d5a348c94fd0ae6393d74e2e9a8662)) // I'm not sure of how those roms have been dumped. I don't know if those are good dumps or not. ROM_LOAD( "cos40b-m.bin", 0x0000, 0x1000, BAD_DUMP CRC(1f0b3a5c) SHA1(0b29cb2a3b7eaa3770b34f08c4fd42844f42700f)) ROM_LOAD( "cos40b-m_f600-f9ff.bin", 0x1000, 0x400, BAD_DUMP CRC(e3397d9d) SHA1(490a0c834b0da392daf782edc7d51ca8f0668b1a)) @@ -172,8 +199,15 @@ 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 + /* 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, 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(1978, rm380z, 0, 0, rm380z, rm380z, driver_device, 0, "Research Machines", "RM-380Z", MACHINE_NO_SOUND_HW) -- cgit v1.2.3 From 73a5edbebc72f46f24194f46c339db98aeb28f1a Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 9 Dec 2016 11:53:17 +0100 Subject: Update rm380z.cpp --- src/mame/video/rm380z.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/video/rm380z.cpp b/src/mame/video/rm380z.cpp index d5f8b111997..23da34017d7 100644 --- a/src/mame/video/rm380z.cpp +++ b/src/mame/video/rm380z.cpp @@ -51,7 +51,7 @@ void rm380z_state::init_graphic_chars() void rm380z_state::config_videomode() { - if (m_port0&0x20) + if (m_port0&0x20&m_port0_mask) { // 80 cols m_videomode=RM380Z_VIDEOMODE_80COL; -- cgit v1.2.3 From b87497cbc8fad2d92d80e491c9629b86cca9bc0c Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 9 Dec 2016 11:55:41 +0100 Subject: Update rm380z.h --- src/mame/includes/rm380z.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mame/includes/rm380z.h b/src/mame/includes/rm380z.h index 4923fefb018..bc829b4dbe5 100644 --- a/src/mame/includes/rm380z.h +++ b/src/mame/includes/rm380z.h @@ -12,6 +12,7 @@ Research Machines RM 380Z #include "emu.h" #include "cpu/z80/z80.h" +#include "imagedev/cassette.h" #include "machine/ram.h" #include "imagedev/flopdrv.h" #include "machine/wd_fdc.h" @@ -66,6 +67,7 @@ protected: public: uint8_t m_port0; + uint8_t m_port0_mask; uint8_t m_port0_kbd; uint8_t m_port1; uint8_t m_fbfd; @@ -88,6 +90,7 @@ public: int m_old_videomode; required_device m_maincpu; + required_device m_cassette; required_device m_messram; required_device m_fdc; required_device m_floppy0; @@ -96,6 +99,7 @@ public: rm380z_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, RM380Z_MAINCPU_TAG), + m_cassette(*this, "cassette"), m_messram(*this, RAM_TAG), m_fdc(*this, "wd1771"), m_floppy0(*this, "wd1771:0"), @@ -123,6 +127,11 @@ public: DECLARE_WRITE8_MEMBER(disk_0_control); DECLARE_WRITE8_MEMBER( keyboard_put ); + + DECLARE_DRIVER_INIT(rm380z); + DECLARE_DRIVER_INIT(rm380z34d); + DECLARE_DRIVER_INIT(rm380z34e); + DECLARE_DRIVER_INIT(rm480z); void config_memory_map(); void update_screen(bitmap_ind16 &bitmap); -- cgit v1.2.3 From ff84d172141f5bde3771dfdd8ff208d82785b143 Mon Sep 17 00:00:00 2001 From: Stefano Date: Fri, 9 Dec 2016 12:13:33 +0100 Subject: Update aussiebyte.h --- src/mame/includes/aussiebyte.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/mame/includes/aussiebyte.h b/src/mame/includes/aussiebyte.h index 5cac9c322cd..0ec8c3c1115 100644 --- a/src/mame/includes/aussiebyte.h +++ b/src/mame/includes/aussiebyte.h @@ -47,7 +47,6 @@ public: , m_floppy0(*this, "fdc:0") , m_floppy1(*this, "fdc:1") , m_crtc(*this, "crtc") - , m_rtc(*this, "rtc") , m_speaker(*this, "speaker") , m_votrax(*this, "votrax") , m_rtc(*this, "rtc") @@ -84,9 +83,6 @@ public: DECLARE_WRITE_LINE_MEMBER(sio2_rdya_w); DECLARE_WRITE_LINE_MEMBER(sio2_rdyb_w); DECLARE_WRITE_LINE_MEMBER(clock_w); - DECLARE_READ_LINE_MEMBER(clock_r); - DECLARE_READ8_MEMBER(rtc_data_r); - DECLARE_WRITE8_MEMBER(rtc_data_w); DECLARE_MACHINE_RESET(aussiebyte); DECLARE_DRIVER_INIT(aussiebyte); DECLARE_WRITE_LINE_MEMBER(ctc_z0_w); @@ -129,7 +125,6 @@ private: required_device m_floppy0; optional_device m_floppy1; required_device m_crtc; - required_device m_rtc; required_device m_speaker; required_device m_votrax; required_device m_rtc; -- cgit v1.2.3 From fc4bbb46603e0cd27c95826e738bcda16ccff058 Mon Sep 17 00:00:00 2001 From: Stefano Date: Thu, 15 Dec 2016 15:34:08 +0100 Subject: Scrollup fix for the TMS9927 family This fix will avoid to reconfigure all the CRTC parameters on any cursor shape change. This invasive "reset" procedure was resetting the scroll counter ! --- src/devices/video/tms9927.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/devices/video/tms9927.cpp b/src/devices/video/tms9927.cpp index 4c5d038be70..2f77efb875a 100644 --- a/src/devices/video/tms9927.cpp +++ b/src/devices/video/tms9927.cpp @@ -21,7 +21,7 @@ static const uint8_t skew_bits_value[4] = { 0, 1, 2, 2 }; #define SCANS_PER_DATA_ROW (((m_reg[2] >> 3) & 0x0f) + 1) #define CHARS_PER_DATA_ROW (chars_per_row_value[(m_reg[2] >> 0) & 0x07]) #define SKEW_BITS (skew_bits_value[(m_reg[3] >> 6) & 0x03]) -#define DATA_ROWS_PER_FRAME (((m_reg[3] >> 0) & 0x3f) + 1) +#define DATA_ROWS_PER_FRAME ((m_reg[3] & 0x3f) + 1) #define SCAN_LINES_PER_FRAME ((m_reg[4] * 2) + 256 + (((m_reg[1] >> 7) & 0x01) * 257)) #define VERTICAL_DATA_START (m_reg[5]) #define LAST_DISP_DATA_ROW (m_reg[6] & 0x3f) @@ -179,7 +179,6 @@ void tms9927_device::generic_access(address_space &space, offs_t offset) break; case 0x0b: /* Up scroll */ -osd_printf_debug("Up scroll\n"); m_screen->update_now(); m_start_datarow = (m_start_datarow + 1) % DATA_ROWS_PER_FRAME; break; @@ -215,7 +214,9 @@ WRITE8_MEMBER( tms9927_device::write ) case 0x0d: /* LOAD CURSOR ROW ADDRESS */ osd_printf_debug("Cursor address changed\n"); m_reg[offset - 0x0c + 7] = data; - recompute_parameters(false); + /* Recomputing parameters here will break the scrollup on the Attachè + and probably other machines due to m_start_datarow being reset ! */ + //recompute_parameters(false); break; default: -- cgit v1.2.3 From a27e96c63c82504d8396c427a69fd3ba8119c557 Mon Sep 17 00:00:00 2001 From: Stefano Date: Thu, 15 Dec 2016 15:46:32 +0100 Subject: =?UTF-8?q?ScrollUP=20fix=20for=20the=20Otrona=20Attach=C3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The implementation of the scroll register is partially delegated to the specific machine video driver. This same approach was used on the ITT3030 emulation and is probably ok for this peculiar controller. --- src/mame/drivers/attache.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/mame/drivers/attache.cpp b/src/mame/drivers/attache.cpp index deb7495b6af..8172815e861 100644 --- a/src/mame/drivers/attache.cpp +++ b/src/mame/drivers/attache.cpp @@ -222,7 +222,7 @@ private: // bit 7 = subscript (superscript and subscript combined produces strikethrough) uint32_t attache_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - uint8_t x,y,bit,scan,data; + uint8_t x,y,vy,start,bit,scan,data; uint8_t dbl_mode = 0; // detemines which half of character to display when using double size attribute, // as it can start on either odd or even character cells. @@ -261,16 +261,20 @@ uint32_t attache_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma } else bitmap.fill(0); - + // Text output for(y=0;y<(bitmap.height()-1)/10;y++) // lines { + start = m_crtc->upscroll_offset(); + vy = (start + y) % 24; + for(x=0;x<(bitmap.width()-1)/8;x++) // columns { assert(((y*128)+x) >= 0 && ((y*128)+x) < ARRAY_LENGTH(m_char_ram)); - uint8_t ch = m_char_ram[(y*128)+x]; - pen_t fg = m_palette->pen(m_attr_ram[(y*128)+x] & 0x08 ? 2 : 1); // brightness - if(m_attr_ram[(y*128)+x] & 0x10) // double-size + assert(((vy*128)+x) >= 0 && ((vy*128)+x) < ARRAY_LENGTH(m_char_ram)); + uint8_t ch = m_char_ram[(vy*128)+x]; + pen_t fg = m_palette->pen(m_attr_ram[(vy*128)+x] & 0x08 ? 2 : 1); // brightness + if(m_attr_ram[(vy*128)+x] & 0x10) // double-size dbl_mode++; else dbl_mode = 0; @@ -278,16 +282,16 @@ uint32_t attache_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma for(scan=0;scan<10;scan++) // 10 scanlines per line { data = m_char_rom->base()[ch*16+scan]; - if((m_attr_ram[(y*128)+x] & 0xc0) != 0xc0) // if not strikethrough + if((m_attr_ram[(vy*128)+x] & 0xc0) != 0xc0) // if not strikethrough { - if(m_attr_ram[(y*128)+x] & 0x40) // superscript + if(m_attr_ram[(vy*128)+x] & 0x40) // superscript { if(scan >= 5) data = 0; else data = m_char_rom->base()[ch*16+(scan*2)+1]; } - if(m_attr_ram[(y*128)+x] & 0x80) // subscript + if(m_attr_ram[(vy*128)+x] & 0x80) // subscript { if(scan < 5) data = 0; @@ -295,13 +299,13 @@ uint32_t attache_state::screen_update(screen_device &screen, bitmap_rgb32 &bitma data = m_char_rom->base()[ch*16+((scan-5)*2)+1]; } } - if((m_attr_ram[(y*128)+x] & 0x20) && scan == 9) // underline + if((m_attr_ram[(vy*128)+x] & 0x20) && scan == 9) // underline data = 0xff; - if((m_attr_ram[(y*128)+x] & 0xc0) == 0xc0 && scan == 3) // strikethrough + if((m_attr_ram[(vy*128)+x] & 0xc0) == 0xc0 && scan == 3) // strikethrough data = 0xff; - if(m_attr_ram[(y*128)+x] & 0x04) // reverse + if(m_attr_ram[(vy*128)+x] & 0x04) // reverse data = ~data; - if(m_attr_ram[(y*128)+x] & 0x10) // double-size + if(m_attr_ram[(vy*128)+x] & 0x10) // double-size { uint8_t newdata = 0; if(dbl_mode & 1) @@ -630,6 +634,7 @@ WRITE8_MEMBER(attache_state::display_data_w) break; case DISP_CRTC: m_crtc->write(space, m_crtc_reg_select, data); + //logerror("CRTC: write reg %02x, data %02x\n",m_crtc_reg_select,data); break; case DISP_ATTR: m_attr_ram[(m_attr_line*128)+(param & 0x7f)] = data; @@ -754,7 +759,7 @@ static ADDRESS_MAP_START( attache_io , AS_IO, 8, attache_state) AM_RANGE(0xe0, 0xed) AM_DEVREADWRITE("dma",am9517a_device,read,write) AM_MIRROR(0xff00) AM_RANGE(0xee, 0xee) AM_WRITE(display_command_w) AM_MIRROR(0xff00) AM_RANGE(0xef, 0xef) AM_READWRITE(dma_mask_r, dma_mask_w) AM_MIRROR(0xff00) - AM_RANGE(0xf0, 0xf3) AM_DEVREADWRITE("sio",z80sio0_device,ba_cd_r, ba_cd_w) AM_MIRROR(0xff00) + AM_RANGE(0xe6, 0xe7) AM_DEVREADWRITE("sio",z80sio0_device,ba_cd_r, ba_cd_w) AM_MIRROR(0xff00) AM_RANGE(0xf4, 0xf7) AM_DEVREADWRITE("ctc",z80ctc_device,read,write) AM_MIRROR(0xff00) AM_RANGE(0xf8, 0xfb) AM_DEVREADWRITE("pio",z80pio_device,read_alt,write_alt) AM_MIRROR(0xff00) AM_RANGE(0xfc, 0xfd) AM_DEVICE("fdc",upd765a_device,map) AM_MIRROR(0xff00) @@ -993,4 +998,4 @@ ROM_START( attache ) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT DEVICE INIT COMPANY FULLNAME FLAGS */ -COMP( 1982, attache, 0, 0, attache, attache, driver_device, 0, "Otrona", "Attach\xC3\xA9", MACHINE_IMPERFECT_GRAPHICS|MACHINE_NOT_WORKING) +COMP( 1982, attache, 0, 0, attache, attache, driver_device, 0, "Otrona", "Attach\xC3\xA9", MACHINE_IMPERFECT_GRAPHICS) -- cgit v1.2.3 From 4552e5c3e3e0e3f62aceffd992ad270bdf68a10f Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 30 Dec 2016 15:48:23 +0100 Subject: Analog to digital proxy rework. (nw) Properly handle connected inputs when creating a-d proxy. Aligned a-d proxy to d-a proxy class structure. --- src/lib/netlist/devices/nlid_proxy.h | 70 ++++++++++++++--------------------- src/lib/netlist/devices/nlid_system.h | 39 +++++++++++++++++++ src/lib/netlist/nl_base.cpp | 12 ++++++ src/lib/netlist/nl_base.h | 5 +++ src/lib/netlist/nl_setup.cpp | 70 ++++++++++++++++++++++++++++------- src/lib/netlist/nl_setup.h | 1 + 6 files changed, 141 insertions(+), 56 deletions(-) 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 Create(netlist_t &anetlist, const pstring &name) override - { - return plib::owned_ptr::Create(this->name(), anetlist, name); - } - - private: - setup_t &m_setup; - }; - - } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 89251264fa7..ff08177cfdb 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -413,6 +413,45 @@ namespace netlist state_var m_last_state; }; + // ----------------------------------------------------------------------------- + // factory class to wrap macro based chips/elements + // ----------------------------------------------------------------------------- + + 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 Create(netlist_t &anetlist, const pstring &name) override + { + return plib::owned_ptr::Create(this->name(), anetlist, name); + } + + private: + setup_t &m_setup; + }; + } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 76ce59db5ac..44f63a4a403 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -71,6 +71,10 @@ public: { return plib::owned_ptr::Create(anetlist, name, proxied); } + virtual plib::owned_ptr create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override + { + return plib::owned_ptr::Create(anetlist, name, proxied); + } }; class logic_family_cd4xxx_t : public logic_family_desc_t @@ -91,6 +95,10 @@ public: { return plib::owned_ptr::Create(anetlist, name, proxied); } + virtual plib::owned_ptr create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override + { + return plib::owned_ptr::Create(anetlist, name, proxied); + } }; const logic_family_desc_t *family_TTL() @@ -724,6 +732,10 @@ void detail::net_t::reset() void detail::net_t::register_con(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); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index f72665c62bc..def52d3ff69 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 create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const = 0; + virtual plib::owned_ptr 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; } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 06cef2a0947..62c06176a2d 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -455,6 +455,50 @@ 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(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::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().register_con(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().register_con(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 +528,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(in); pstring x = plib::pfmt("proxy_ad_{1}_{2}")(in.name())( m_proxy_cnt); auto proxy = plib::owned_ptr::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().register_con(proxy->proxy_term()); } else if (out.is_logic() && in.is_analog()) { @@ -522,22 +565,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(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::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 { @@ -836,6 +876,10 @@ public: { return plib::owned_ptr::Create(anetlist, name, proxied); } + virtual plib::owned_ptr create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override + { + return plib::owned_ptr::Create(anetlist, name, proxied); + } }; const logic_family_desc_t *setup_t::family_from_model(const pstring &model) diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index e560a3b9f79..399c44e3dbe 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -300,6 +300,7 @@ 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 m_params; -- cgit v1.2.3 From 58f5c626d6c4e7021364f9df25488de524982286 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 30 Dec 2016 20:29:07 +0100 Subject: Align noexcept usage. Rename register_con to add_terminal for clearity. Fix bug introduced with last commit. (nw) --- src/lib/netlist/devices/nld_truthtable.h | 4 +- src/lib/netlist/nl_base.cpp | 4 +- src/lib/netlist/nl_base.h | 84 ++++++++++++++++---------------- src/lib/netlist/nl_setup.cpp | 32 ++++++------ src/lib/netlist/solver/nld_solver.cpp | 2 +- 5 files changed, 64 insertions(+), 62 deletions(-) diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index 6fcd746578f..d1dd6da76a9 100644 --- a/src/lib/netlist/devices/nld_truthtable.h +++ b/src/lib/netlist/devices/nld_truthtable.h @@ -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 diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 44f63a4a403..7d8f1b4cb4f 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -730,7 +730,7 @@ 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) @@ -747,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 def52d3ff69..6b515a20c1c 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -302,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. @@ -332,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]; } @@ -496,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; } @@ -524,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; }; // ----------------------------------------------------------------------------- @@ -609,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: @@ -627,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 { @@ -667,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; }; @@ -687,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; @@ -707,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; @@ -747,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) { @@ -756,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) { @@ -811,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 } @@ -826,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; }; @@ -1019,7 +1019,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) { @@ -1028,7 +1028,7 @@ namespace netlist } } - void do_dec_active() noexcept + void do_dec_active() NL_NOEXCEPT { if (m_hint_deactivate) dec_active(); @@ -1044,8 +1044,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() { } @@ -1182,7 +1182,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); @@ -1302,22 +1302,22 @@ namespace netlist // 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(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(this) != nullptr; } - inline bool detail::net_t::is_logic() const noexcept + inline bool detail::net_t::is_logic() const NL_NOEXCEPT { return dynamic_cast(this) != nullptr; } - inline bool detail::net_t::is_analog() const noexcept + inline bool detail::net_t::is_analog() const NL_NOEXCEPT { return dynamic_cast(this) != nullptr; } @@ -1358,7 +1358,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)) { @@ -1371,7 +1371,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); @@ -1384,39 +1384,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(core_terminal_t::net()); } - inline analog_net_t & analog_t::net() noexcept + inline analog_net_t & analog_t::net() NL_NOEXCEPT { return static_cast(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(&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(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()) { @@ -1426,7 +1426,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_setup.cpp b/src/lib/netlist/nl_setup.cpp index 62c06176a2d..6e9d57ec567 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -445,7 +445,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(); @@ -479,20 +479,22 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) /* 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()); + 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 } - inp.net().m_core_terms.clear(); // clear the list - ret->out().net().register_con(inp); + 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().register_con(inp); + ret->out().net().add_terminal(inp); #endif netlist().register_dev(std::move(new_proxy)); return ret; @@ -537,7 +539,7 @@ void setup_t::connect_input_output(detail::core_terminal_t &in, detail::core_ter #endif auto proxy = get_a_d_proxy(in); - out.net().register_con(proxy->proxy_term()); + out.net().add_terminal(proxy->proxy_term()); } else if (out.is_logic() && in.is_analog()) { @@ -551,7 +553,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); } } @@ -594,7 +596,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()) { @@ -619,12 +621,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 { @@ -632,8 +634,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(netlist(),"net." + t1.name()); t1.set_net(anet); - anet->register_con(t2); - anet->register_con(t1); + anet->add_terminal(t2); + anet->add_terminal(t1); } } 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(&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"); -- cgit v1.2.3 From 19f3a94d2ebfc514949db700b0ba42b11ac1b6e5 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 30 Dec 2016 23:38:13 +0100 Subject: cstr() ==> c_str() (nw) --- src/devices/machine/netlist.cpp | 48 ++++++++++++++++---------------- src/devices/machine/netlist.h | 2 +- src/lib/netlist/devices/nld_truthtable.h | 2 +- src/lib/netlist/devices/nlid_proxy.cpp | 4 +-- src/lib/netlist/nl_base.cpp | 2 +- src/lib/netlist/nl_setup.cpp | 8 +++--- src/lib/netlist/plib/pdynlib.cpp | 28 +++++++++---------- src/lib/netlist/plib/pfmtlog.cpp | 2 +- src/lib/netlist/plib/pfmtlog.h | 2 +- src/lib/netlist/plib/pstream.cpp | 4 +-- src/lib/netlist/plib/pstream.h | 4 +-- src/lib/netlist/plib/pstring.cpp | 22 +++++++-------- src/lib/netlist/plib/pstring.h | 6 ++-- src/lib/netlist/plib/ptypes.h | 2 +- src/lib/netlist/plib/putil.cpp | 8 +++--- src/lib/netlist/prg/nltool.cpp | 14 +++++----- src/lib/netlist/prg/nlwav.cpp | 4 +-- src/lib/netlist/solver/nld_ms_w.h | 4 +-- src/lib/netlist/tools/nl_convert.cpp | 38 ++++++++++++------------- src/lib/netlist/tools/nl_convert.h | 4 +-- 20 files changed, 104 insertions(+), 104 deletions(-) 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(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(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(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(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(); - 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(); - 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(n)->Q_state_ptr()); + state_add(i*2, n->name().c_str(), downcast(n)->Q_state_ptr()); } else { - state_add(i*2+1, n->name().cstr(), downcast(n)->Q_Analog_state_ptr()).formatstr("%20s"); + state_add(i*2+1, n->name().c_str(), downcast(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 netlist_source_memregion_t::stream(const pstring &name) { - memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(m_name.cstr()); + memory_region *mem = downcast(setup().netlist()).machine().root_device().memregion(m_name.c_str()); return plib::make_unique_base(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/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h index d1dd6da76a9..2be1e978367 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]); 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/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 7d8f1b4cb4f..aa6cfc5b340 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -146,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; } } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 6e9d57ec567..8ece4c616ec 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -207,7 +207,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 +221,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(vald); } @@ -1076,12 +1076,12 @@ bool source_t::parse(const pstring &name) std::unique_ptr source_string_t::stream(const pstring &name) { - return plib::make_unique_base(m_str.cstr(), m_str.len()); + return plib::make_unique_base(m_str.c_str(), m_str.len()); } std::unique_ptr source_mem_t::stream(const pstring &name) { - return plib::make_unique_base(m_str.cstr(), m_str.len()); + return plib::make_unique_base(m_str.c_str(), m_str.len()); } std::unique_ptr source_file_t::stream(const pstring &name) 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(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

(*this); } P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast

(*this); } P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast

(*this); } - P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.cstr() ); return static_cast

(*this); } + P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.c_str() ); return static_cast

(*this); } template 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::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::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 const pstring_t pstring_t::ucase() const { pstring_t ret = *this; - ret.pcopy(cstr(), blen()); + ret.pcopy(c_str(), blen()); for (std::size_t i=0; istr()[i] = static_cast(toupper(static_cast(ret.m_ptr->str()[i]))); return ret; @@ -230,7 +230,7 @@ double pstring_t::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::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::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 @@ -288,7 +288,7 @@ bool pstring_t::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::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 @@ -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(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(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(-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/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index fbfa3a50c5c..0f3d29d00d8 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); @@ -409,13 +409,13 @@ static void listdevices(tool_options_t &opts) out += "," + f->param_desc(); } 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("Terminals: %s\n", t.substr(1).c_str()); } devs.push_back(std::move(d)); } @@ -514,11 +514,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::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::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/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; jterminals().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 Date: Fri, 30 Dec 2016 16:47:31 -0500 Subject: osbexec: Fix IRQ-related regression; simplify handling using input_merger_device (nw) --- src/mame/drivers/osbexec.cpp | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) 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) -- cgit v1.2.3 From 208531b7bc19d19bba86fec50e878fede4cb8f86 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Sat, 31 Dec 2016 13:49:49 +1100 Subject: Fix OSX build - no idea why it wasn't breaking before (nw) --- src/osd/modules/debugger/osx/debugconsole.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; -- cgit v1.2.3 From 03203df914885154ccee1243f1b595e8445ed8e3 Mon Sep 17 00:00:00 2001 From: arbee Date: Fri, 30 Dec 2016 23:43:53 -0500 Subject: gkigt: hook up nvram and add initialized defaults for ms3 & ms72c. (nw) --- src/mame/drivers/gkigt.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3 From decfb1f7ea6b571393c8c03f84ce4132ce83cffd Mon Sep 17 00:00:00 2001 From: Stiletto Date: Sat, 31 Dec 2016 00:07:12 -0500 Subject: (nw) (nw) --- src/mame/drivers/aleisttl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) -- cgit v1.2.3 From 9aa8f9d714b183c193995ac8a7fd56279e3cdb2a Mon Sep 17 00:00:00 2001 From: MooglyGuy Date: Tue, 27 Dec 2016 14:11:48 +0100 Subject: -stuntcyc: Fixed some NOR gates that should have been NANDs, fixes the playfield. [Ryan Holtz] --- src/mame/machine/nl_stuntcyc.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) 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) -- cgit v1.2.3 From 47f788ed2d805d078b15c45bb0bac714810c00a8 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 31 Dec 2016 03:18:04 +0100 Subject: Hook up luigi walking sound in netlist mario sound implementation. Mario driver now uses netlist audio implementation instead of discrete implementation. The previous discrete sound emulation has not been removed yet because it still contains a lot of documentation. [Couriersud] --- scripts/target/mame/arcade.lua | 2 + scripts/target/mame/nl.lua | 2 + src/lib/netlist/analog/nld_opamps.cpp | 29 ---- src/lib/netlist/analog/nld_opamps.h | 5 - src/lib/netlist/devices/net_lib.cpp | 2 +- src/lib/netlist/macro/nlm_opamp.cpp | 32 ++++ src/lib/netlist/macro/nlm_opamp.h | 3 + src/mame/audio/mario.cpp | 244 +-------------------------- src/mame/audio/nl_mario.cpp | 306 ++++++++++++++++++++++++++++++++++ src/mame/audio/nl_mario.h | 4 + src/mame/includes/mario.h | 4 +- 11 files changed, 358 insertions(+), 275 deletions(-) create mode 100644 src/mame/audio/nl_mario.cpp create mode 100644 src/mame/audio/nl_mario.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 7ab6bc16515..c2607815f6a 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2809,6 +2809,8 @@ files { MAME_DIR .. "src/mame/video/dkong.cpp", MAME_DIR .. "src/mame/drivers/mario.cpp", MAME_DIR .. "src/mame/includes/mario.h", + MAME_DIR .. "src/mame/audio/nl_mario.cpp", + MAME_DIR .. "src/mame/audio/nl_mario.h", MAME_DIR .. "src/mame/audio/mario.cpp", MAME_DIR .. "src/mame/video/mario.cpp", MAME_DIR .. "src/mame/drivers/mmagic.cpp", diff --git a/scripts/target/mame/nl.lua b/scripts/target/mame/nl.lua index 0ad6c16419c..9ea0dfb1966 100644 --- a/scripts/target/mame/nl.lua +++ b/scripts/target/mame/nl.lua @@ -136,6 +136,8 @@ files{ MAME_DIR .. "src/mame/drivers/mario.cpp", MAME_DIR .. "src/mame/includes/mario.h", + MAME_DIR .. "src/mame/audio/nl_mario.cpp", + MAME_DIR .. "src/mame/audio/nl_mario.h", MAME_DIR .. "src/mame/video/mario.cpp", MAME_DIR .. "src/mame/audio/mario.cpp", 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..bc391e98728 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -152,7 +152,7 @@ static void initialize_factory(factory_list_t &factory) 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(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, "-") diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp index 08dc5f60b27..5c68cfc86a3 100644 --- a/src/lib/netlist/macro/nlm_opamp.cpp +++ b/src/lib/netlist/macro/nlm_opamp.cpp @@ -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/mame/audio/mario.cpp b/src/mame/audio/mario.cpp index 7ef691acc68..28f0ca4f1fe 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" /**************************************************************** * @@ -43,243 +43,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 /**************************************************************** @@ -797,6 +560,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 +660,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/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 m_discrete; #else optional_device m_audio_snd0; + optional_device m_audio_snd1; optional_device m_audio_snd7; optional_device m_audio_dac; #endif -- cgit v1.2.3 From 7b61c496561aff7fa297197943e566bd59f13fad Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 31 Dec 2016 03:27:26 +0100 Subject: Fix compile for I8039 test code in mario sound. (nw) --- src/mame/audio/mario.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/mame/audio/mario.cpp b/src/mame/audio/mario.cpp index 28f0ca4f1fe..c7fd9b96292 100644 --- a/src/mame/audio/mario.cpp +++ b/src/mame/audio/mario.cpp @@ -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 */ @@ -450,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 */ -- cgit v1.2.3 From 6cee8d7f3f08b2901b181cc36cbf4c5b4dab72d8 Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sat, 31 Dec 2016 16:18:44 +0000 Subject: new WORKING game - Hangzo (Japan, prototype) [ShouTime (+others)] --- src/mame/drivers/rohga.cpp | 189 ++++++++++++++++++++++++++++++++++++++++++++- src/mame/includes/rohga.h | 1 + src/mame/mame.lst | 1 + 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/src/mame/drivers/rohga.cpp b/src/mame/drivers/rohga.cpp index 8b3d103078b..04941c35199 100644 --- a/src/mame/drivers/rohga.cpp +++ b/src/mame/drivers/rohga.cpp @@ -265,7 +265,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 +284,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 ) @@ -667,6 +677,113 @@ static INPUT_PORTS_START( schmeisr ) 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( 0x0001, 0x0001, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x0000, DEF_STR( Demo_Sounds ) ) + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + + PORT_START("DSW3") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + + + /**********************************************************************************/ static const gfx_layout charlayout = @@ -1090,7 +1207,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 +1263,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 */ @@ -1721,6 +1848,52 @@ ROM_START( schmeisr ) ROM_LOAD( "hb-00.11p", 0x00000, 0x200, CRC(b7a7baad) SHA1(39781c3412493b985d3616ac31142fc00bbcddf4) ) ROM_END + + + + +ROM_START( hangzo ) + 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 +1928,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 +1953,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/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/mame.lst b/src/mame/mame.lst index 4b747ff76bc..1a8f428dc9d 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -31740,6 +31740,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) -- cgit v1.2.3 From 885c35dae4d8f62c39b1533dc856851f6a0adb46 Mon Sep 17 00:00:00 2001 From: yz70s Date: Sat, 31 Dec 2016 18:44:25 +0100 Subject: xbox: graphic improvements: (nw) add support for packed float vertex color r11g11b10f corrected drawing of indexed vertices primitives add "xbox nv2a_wclipping" debug command --- src/mame/includes/xbox.h | 1 + src/mame/includes/xbox_nv2a.h | 33 ++++--- src/mame/machine/xbox.cpp | 21 ++++- src/mame/video/xbox_nv2a.cpp | 201 ++++++++++++++++++++++++++++-------------- 4 files changed, 178 insertions(+), 78 deletions(-) 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/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, -- 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,, -- Save to the next used texture of type \n"); con.printf(" xbox grab_vprog, -- save current vertex program instruction slots to \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/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) -- cgit v1.2.3 From 1c533823ba62000f6e2036a05cc9f3df18e6ae5a Mon Sep 17 00:00:00 2001 From: angelosa Date: Sat, 31 Dec 2016 22:07:45 +0100 Subject: Notes --- src/mame/machine/namco_c148.cpp | 82 +++++++++++++++++++++++------------------ src/mame/machine/namco_c148.h | 2 +- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 5faab77aa17..053e3368738 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -2,22 +2,27 @@ // copyright-holders:Angelo Salese /*************************************************************************** - Namco C148 Interrupt Controller + 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 screen CRTC device + - hookup C116 device, @see mame/includes/namcoic.h -***************************************************************************/ -/* +============================================================================= Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02 - ???????? 1C0XXX + Bus Controller? 1C0XXX ???????? 1C2XXX - ???????? 1C4XXX * bit 1: operation mode? + ???????? 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? @@ -30,8 +35,11 @@ Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02 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" @@ -65,22 +73,23 @@ namco_c148_device::namco_c148_device(const machine_config &mconfig, const char * // (*) denotes master CPU only DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) - 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_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_GLOBAL_MASK(0x3e000) + AM_RANGE(0x06000, 0x06000) AM_READWRITE8(cpu_irq_level_r,cpu_irq_level_w,0x00ff) // CPUIRQ lv + AM_RANGE(0x08000, 0x08000) AM_READWRITE8(ex_irq_level_r,ex_irq_level_w,0x00ff) // EXIRQ lv + AM_RANGE(0x0a000, 0x0a000) AM_READWRITE8(pos_irq_level_r,pos_irq_level_w,0x00ff) // POSIRQ lv + AM_RANGE(0x0c000, 0x0c000) AM_READWRITE8(sci_irq_level_r,sci_irq_level_w,0x00ff) // SCIRQ lv + AM_RANGE(0x0e000, 0x0e000) AM_READWRITE8(vblank_irq_level_r,vblank_irq_level_w,0x00ff) // VBlank IRQ lv + + AM_RANGE(0x10000, 0x10000) AM_WRITE(cpu_irq_assert_w) + AM_RANGE(0x16000, 0x16000) AM_READWRITE(cpu_irq_ack_r, cpu_irq_ack_w) // CPUIRQ ack + AM_RANGE(0x18000, 0x18000) AM_READWRITE(ex_irq_ack_r, ex_irq_ack_w) // EXIRQ ack + AM_RANGE(0x1a000, 0x1a000) AM_READWRITE(pos_irq_ack_r, pos_irq_ack_w) // POSIRQ ack + AM_RANGE(0x1c000, 0x1c000) AM_READWRITE(sci_irq_ack_r, sci_irq_ack_w) // SCIRQ ack + AM_RANGE(0x1e000, 0x1e000) AM_READWRITE(vblank_irq_ack_r, vblank_irq_ack_w) // VBlank IRQ ack + AM_RANGE(0x20000, 0x20000) AM_READ8(ext_r,0x00ff) // EEPROM ready status (*) + AM_RANGE(0x22000, 0x22000) AM_WRITE8(ext1_w,0x00ff) // sound CPU reset (*) + AM_RANGE(0x24000, 0x24000) AM_WRITE8(ext2_w,0x00ff) // slave & i/o reset (*) + AM_RANGE(0x26000, 0x26000) AM_NOP // watchdog ADDRESS_MAP_END @@ -127,7 +136,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? + // 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); } @@ -176,18 +185,6 @@ WRITE16_MEMBER( namco_c148_device::cpu_irq_assert_w) m_linked_c148->cpu_irq_trigger(); } -READ8_MEMBER( namco_c148_device::ext_posirq_line_r ) -{ - // TODO: same as regular register? winrun91 - return (m_posirq_line - 32) & 0xff; -} - -WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) -{ - m_posirq_line = data; -} - - //************************************************************************** // GETTERS/SETTERS //************************************************************************** @@ -218,7 +215,20 @@ 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 - 32) & 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 index b19aaef4c1a..f909911c0b6 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -2,7 +2,7 @@ // copyright-holders:Angelo Salese /*************************************************************************** - Namco C148 Interrupt Controller + Namco C148 - CPU Bus Manager ***************************************************************************/ -- cgit v1.2.3 From 8e00c03a0ed6513fa292eea60dc9732d22bbc11d Mon Sep 17 00:00:00 2001 From: angelosa Date: Sat, 31 Dec 2016 22:45:30 +0100 Subject: Clean-ups, 279 lines removed from machine/namcos2.cpp (nw) --- src/mame/drivers/namcos2.cpp | 2 +- src/mame/includes/namcos2.h | 24 +--- src/mame/includes/namcos21.h | 5 +- src/mame/machine/namcos2.cpp | 283 +------------------------------------------ src/mame/video/namcos2.cpp | 5 +- src/mame/video/namcos21.cpp | 6 +- 6 files changed, 15 insertions(+), 310 deletions(-) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index 35297a43810..59a68ae7384 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -1695,7 +1695,7 @@ MACHINE_CONFIG_END TIMER_DEVICE_CALLBACK_MEMBER(namcos2_state::screen_scanline) { int scanline = param; - int cur_posirq = get_posirq_scanline(); + int cur_posirq = get_pos_irq_scanline(); if(scanline == 240) { diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index 85419acfdad..f856570dfd9 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -130,18 +130,15 @@ public: 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 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 @@ -228,23 +225,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 ); @@ -254,9 +237,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 m_maincpu; optional_device m_audiocpu; optional_device m_slave; diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index 50dcf887014..c7c11a78431 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -73,7 +73,7 @@ public: optional_device m_gpu_intc; std::unique_ptr m_videoram; - std::unique_ptr m_colorram; + std::unique_ptr m_maskram; std::unique_ptr m_winrun_dspcomram; uint16_t m_winrun_poly_buf[WINRUN_MAX_POLY_PARAM]; int m_winrun_poly_index; @@ -168,6 +168,7 @@ public: uint8_t m_gearbox_state; DECLARE_CUSTOM_INPUT_MEMBER(driveyes_gearbox_r); + DECLARE_DRIVER_INIT(driveyes); DECLARE_DRIVER_INIT(winrun); DECLARE_DRIVER_INIT(starblad); @@ -182,6 +183,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); @@ -193,6 +195,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/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp index 9f136abb56d..6a396385e64 100644 --- a/src/mame/machine/namcos2.cpp +++ b/src/mame/machine/namcos2.cpp @@ -97,38 +97,16 @@ WRITE8_MEMBER(namcos2_shared_state::sound_reset_w) } } +// TODO: WRITE8_MEMBER(namcos2_shared_state::system_reset_w) { - address_space &masterspace = m_maincpu->space(AS_PROGRAM); - - m_slave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - m_mcu->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - - switch( m_gametype ) - { - case NAMCOS21_SOLVALOU: - case NAMCOS21_STARBLADE: - case NAMCOS21_AIRCOMBAT: - case NAMCOS21_CYBERSLED: - m_dspmaster->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - m_dspslave->set_input_line(INPUT_LINE_RESET, data & 1 ? CLEAR_LINE : ASSERT_LINE); - break; - } + reset_all_subcpus(data & 1 ? CLEAR_LINE : ASSERT_LINE); if (data & 0x01) + { + address_space &masterspace = m_maincpu->space(AS_PROGRAM); masterspace.device().execute().yield(); - - #if 0 - if (data & 0x01) - { /* Resume execution */ - //reset_all_subcpus(CLEAR_LINE); - /* Give the new CPU an immediate slice of the action */ - } - else - { /* Suspend execution */ - //reset_all_subcpus(ASSERT_LINE); } - #endif } void namcos2_shared_state::reset_all_subcpus(int state) @@ -164,7 +142,6 @@ MACHINE_START_MEMBER(namcos2_shared_state,namcos2) namcos2_kickstart = nullptr; m_eeprom = std::make_unique(m_eeprom_size); machine().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) @@ -184,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; } @@ -495,252 +466,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(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/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 af0c08d3de9..b467a370237 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -60,14 +60,14 @@ WRITE16_MEMBER(namcos21_state::winrun_gpu_videoram_w) if( mask&(0x01<(0x80000); - m_colorram = std::make_unique(0x80000); + m_maskram = std::make_unique(0x80000); } allocate_poly_framebuffer(); c355_obj_init( -- cgit v1.2.3 From 0387005c1ec8f4fe1b5cc10097c32df0172bf5ab Mon Sep 17 00:00:00 2001 From: angelosa Date: Sat, 31 Dec 2016 23:54:15 +0100 Subject: Added dummy C139 device for debug, fixed target compile. --- scripts/target/mame/arcade.lua | 4 ++++ src/mame/drivers/namcos2.cpp | 13 ++++++++++--- src/mame/drivers/namcos21.cpp | 25 ++++++++++++++----------- src/mame/includes/namcos2.h | 3 +++ src/mame/includes/namcos21.h | 1 - src/mame/video/namcos21.cpp | 1 + 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index c2607815f6a..d06cebe0392 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2694,6 +2694,10 @@ files { MAME_DIR .. "src/mame/machine/namcomcu.h", MAME_DIR .. "src/mame/machine/namcoio_gearbox.cpp", MAME_DIR .. "src/mame/machine/namcoio_gearbox.h", + MAME_DIR .. "src/mame/machine/namco_c148.cpp", + MAME_DIR .. "src/mame/machine/namco_c148.h", + MAME_DIR .. "src/mame/machine/namco_c139.cpp", + MAME_DIR .. "src/mame/machine/namco_c139.h", MAME_DIR .. "src/mame/audio/namco52.cpp", MAME_DIR .. "src/mame/audio/namco52.h", MAME_DIR .. "src/mame/audio/namco54.cpp", diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index 59a68ae7384..db02651d7d9 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -599,8 +599,8 @@ static ADDRESS_MAP_START( namcos2_68k_default_cpu_board_am, AS_PROGRAM, 16, namc 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(0x480000, 0x483fff) AM_DEVICE("sci", namco_c139_device, ram_map) + AM_RANGE(0x4a0000, 0x4a000f) AM_DEVICE("sci", namco_c139_device, regs_map) ADDRESS_MAP_END /*************************************************************/ @@ -1736,7 +1736,8 @@ static MACHINE_CONFIG_START( default, namcos2_state ) 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) @@ -1812,6 +1813,7 @@ static MACHINE_CONFIG_START( gollygho, namcos2_state ) 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) ) @@ -1861,6 +1863,7 @@ static MACHINE_CONFIG_START( finallap, namcos2_state ) 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) ) @@ -1915,6 +1918,7 @@ static MACHINE_CONFIG_START( sgunner, namcos2_state ) 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) ) @@ -1971,6 +1975,7 @@ static MACHINE_CONFIG_START( sgunner2, namcos2_state ) 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) ) @@ -2022,6 +2027,7 @@ static MACHINE_CONFIG_START( luckywld, namcos2_state ) 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) ) @@ -2076,6 +2082,7 @@ static MACHINE_CONFIG_START( metlhawk, namcos2_state ) 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) ) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index bf1ade64ac0..75ee0368bfd 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1252,8 +1252,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_DEVICE("sci", namco_c139_device, ram_map) + 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 @@ -1481,8 +1481,8 @@ 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_DEVICE("sci", namco_c139_device, ram_map) + 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 ) @@ -1493,8 +1493,8 @@ static ADDRESS_MAP_START( winrun_slave_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_DEVICE("sci", namco_c139_device, ram_map) + AM_RANGE(0xb80000, 0xb8000f) AM_DEVICE("sci", namco_c139_device, regs_map) ADDRESS_MAP_END @@ -1573,8 +1573,8 @@ 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_DEVICE("sci", namco_c139_device, ram_map) + 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 ) @@ -1852,7 +1852,7 @@ MACHINE_START_MEMBER(namcos21_state,namcos21) namcos2_kickstart = namcos21_kickstart; } -// TODO: temp +// TODO: temp, C116 device TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) { int scanline = param; @@ -1944,7 +1944,8 @@ static MACHINE_CONFIG_START( namcos21, namcos21_state ) 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) @@ -1999,6 +2000,7 @@ 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 @@ -2054,7 +2056,8 @@ static MACHINE_CONFIG_START( winrun, namcos21_state ) 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 */ MCFG_MACHINE_START_OVERRIDE(namcos21_state,namcos21) diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index f856570dfd9..108c9209095 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -12,6 +12,7 @@ #include "cpu/m6502/m3745x.h" #include "video/c45.h" #include "machine/namco_c148.h" +#include "machine/namco_c139.h" /* CPU reference numbers */ @@ -104,6 +105,7 @@ public: 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), @@ -124,6 +126,7 @@ public: optional_device m_c68; required_device m_master_intc; required_device m_slave_intc; + required_device m_sci; optional_device m_gpu; //to be moved to namco21_state after disentangling // game type helpers diff --git a/src/mame/includes/namcos21.h b/src/mame/includes/namcos21.h index c7c11a78431..91606009e13 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -6,7 +6,6 @@ #include "namcos2.h" #include "machine/namcoio_gearbox.h" -#include "machine/namco_c148.h" #define NAMCOS21_POLY_FRAME_WIDTH 496 #define NAMCOS21_POLY_FRAME_HEIGHT 480 diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp index b467a370237..30a33c25e1f 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -440,6 +440,7 @@ void namcos21_state::winrun_bitmap_draw(bitmap_ind16 &bitmap, const rectangle &c { 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; -- cgit v1.2.3 From 57406d3ba50e0e34495541d10994448cfffdde13 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 01:59:40 +0100 Subject: Added actual device files, fixed space data map as well --- src/mame/drivers/namcos2.cpp | 2 +- src/mame/drivers/namcos21.cpp | 8 ++-- src/mame/machine/namco_c139.cpp | 98 +++++++++++++++++++++++++++++++++++++++++ src/mame/machine/namco_c139.h | 67 ++++++++++++++++++++++++++++ src/mame/machine/namco_c148.cpp | 2 + 5 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 src/mame/machine/namco_c139.cpp create mode 100644 src/mame/machine/namco_c139.h diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index db02651d7d9..076b65be3e1 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -599,7 +599,7 @@ static ADDRESS_MAP_START( namcos2_68k_default_cpu_board_am, AS_PROGRAM, 16, namc 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_DEVICE("sci", namco_c139_device, ram_map) + 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 diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index 75ee0368bfd..2a51f03a11f 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1252,7 +1252,7 @@ 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_DEVICE("sci", namco_c139_device, ram_map) + 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 @@ -1481,7 +1481,7 @@ 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_DEVICE("sci", namco_c139_device, ram_map) + 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 @@ -1493,7 +1493,7 @@ static ADDRESS_MAP_START( winrun_slave_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_DEVICE("sci", namco_c139_device, ram_map) + 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 @@ -1573,7 +1573,7 @@ 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_DEVICE("sci", namco_c139_device, ram_map) + 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 diff --git a/src/mame/machine/namco_c139.cpp b/src/mame/machine/namco_c139.cpp new file mode 100644 index 00000000000..8946c632457 --- /dev/null +++ b/src/mame/machine/namco_c139.cpp @@ -0,0 +1,98 @@ +// license:BSD-3-Clause +// copyright-holders: +/*************************************************************************** + + Namco C139 - Serial I/F Controller + + + TODO: + - 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; + + +//************************************************************************** +// 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) +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) +{ + 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..05acdfbdd83 --- /dev/null +++ b/src/mame/machine/namco_c139.h @@ -0,0 +1,67 @@ +// license:BSD-3-Clause +// copyright-holders: +/*************************************************************************** + +Template for skeleton device + +***************************************************************************/ + +#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 index 053e3368738..3fa615de5bf 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -102,6 +102,8 @@ void namco_c148_device::device_start() { m_hostcpu = machine().device(m_hostcpu_tag); m_linked_c148 = machine().device(m_linked_c148_tag); + assert(m_hostcpu != nullptr); + m_out_ext1_cb.resolve_safe(); m_out_ext2_cb.resolve_safe(); -- cgit v1.2.3 From 282ce35863e9142ac3680449f30bbd3ce1f060a2 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 03:02:55 +0100 Subject: MACHINE_NODEVICE_LAN for anything that actively wants it --- src/mame/drivers/namcos2.cpp | 36 ++++++++++++++++++------------------ src/mame/drivers/namcos21.cpp | 12 ++++++------ src/mame/includes/namcos21.h | 4 ---- src/mame/machine/namco_c139.cpp | 10 +++++++++- src/mame/machine/namco_c148.cpp | 13 ++++++++----- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index 076b65be3e1..4c4f6eb5496 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -5733,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 ) @@ -5754,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 ) @@ -5775,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 ) @@ -5795,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 2a51f03a11f..b9418f71e7b 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -2777,13 +2777,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/includes/namcos21.h b/src/mame/includes/namcos21.h index 91606009e13..0ec60ea94e5 100644 --- a/src/mame/includes/namcos21.h +++ b/src/mame/includes/namcos21.h @@ -137,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); diff --git a/src/mame/machine/namco_c139.cpp b/src/mame/machine/namco_c139.cpp index 8946c632457..b8c7fa96588 100644 --- a/src/mame/machine/namco_c139.cpp +++ b/src/mame/machine/namco_c139.cpp @@ -32,7 +32,11 @@ static ADDRESS_MAP_START( data_map, AS_DATA, 16, namco_c139_device ) ADDRESS_MAP_END DEVICE_ADDRESS_MAP_START( regs_map, 16, namco_c139_device ) - AM_RANGE(0x00, 0x00) AM_READ(status_r) + AM_RANGE(0x00, 0x00) AM_READ(status_r) // WRITE clears flags +// AM_RANGE(0x02, 0x02) // settings? +// AM_RANGE(0x0a, 0x0a) // WRITE tx_w +// AM_RANGE(0x0c, 0x0c) // READ rx_r +// AM_RANGE(0x0e, 0x0e) // ADDRESS_MAP_END //------------------------------------------------- @@ -94,5 +98,9 @@ WRITE16_MEMBER(namco_c139_device::ram_w) 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_c148.cpp b/src/mame/machine/namco_c148.cpp index 3fa615de5bf..0bf3d914987 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -44,6 +44,9 @@ Interrupt Controller C148 1C0000-1FFFFF R/W D00-D02 #include "emu.h" #include "namco_c148.h" +#define VERBOSE 0 +#define LOG(x) do { if (VERBOSE) printf x; } while (0) + //************************************************************************** @@ -143,11 +146,11 @@ inline void namco_c148_device::flush_irq_acks() 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(); } -WRITE8_MEMBER( namco_c148_device::vblank_irq_level_w ) { m_irqlevel.vblank = data & 7; flush_irq_acks(); } -WRITE8_MEMBER( namco_c148_device::cpu_irq_level_w ) { m_irqlevel.cpu = data & 7; flush_irq_acks(); } -WRITE8_MEMBER( namco_c148_device::ex_irq_level_w ) { m_irqlevel.ex = data & 7; flush_irq_acks(); } -WRITE8_MEMBER( namco_c148_device::sci_irq_level_w ) { m_irqlevel.sci = data & 7; flush_irq_acks(); } +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; } -- cgit v1.2.3 From 678f27066c12fbf4e9816e68385a48a00646b574 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 03:39:22 +0100 Subject: Fix compile --- src/mame/drivers/namcos21.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index b9418f71e7b..dc826e2e23c 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1225,12 +1225,6 @@ WRITE8_MEMBER(namcos21_state::namcos2_dualportram_byte_w) m_mpDualPortRAM[offset] = data; } -/******************************************************************************/ -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; } /******************************************************************************/ /*************************************************************/ -- cgit v1.2.3 From 179883f35ee104169e31fcc20d79281d029a396b Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 05:14:35 +0100 Subject: Finest Hour accesses 0x461xxx in service mode, make the whole area to be mirrored --- src/mame/drivers/namcos2.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mame/drivers/namcos2.cpp b/src/mame/drivers/namcos2.cpp index 4c4f6eb5496..5184630ca12 100644 --- a/src/mame/drivers/namcos2.cpp +++ b/src/mame/drivers/namcos2.cpp @@ -597,8 +597,7 @@ 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(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 @@ -2068,8 +2067,8 @@ static MACHINE_CONFIG_START( metlhawk, namcos2_state ) 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) @@ -2106,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 -- cgit v1.2.3 From 9fcb8359e6dbb63aaef3c17a1bb0f2af263474d3 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 22:45:31 +0100 Subject: More clean-ups. --- src/mame/includes/namcos2.h | 6 ------ src/mame/machine/namco_c139.cpp | 5 +++-- src/mame/machine/namco_c148.cpp | 45 +++++++++++++++++++++++++---------------- src/mame/machine/namco_c148.h | 4 ++++ src/mame/machine/namcos2.cpp | 34 ------------------------------- 5 files changed, 35 insertions(+), 59 deletions(-) diff --git a/src/mame/includes/namcos2.h b/src/mame/includes/namcos2.h index 108c9209095..ed6dffaeca8 100644 --- a/src/mame/includes/namcos2.h +++ b/src/mame/includes/namcos2.h @@ -257,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") @@ -324,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(); @@ -343,7 +338,6 @@ public: required_shared_ptr m_dpram; /* 2Kx8 */ required_shared_ptr m_paletteram; optional_shared_ptr m_spriteram; - optional_shared_ptr m_serial_comms_ram; optional_shared_ptr m_rozram; optional_shared_ptr m_roz_ctrl; tilemap_t *m_tilemap_roz; diff --git a/src/mame/machine/namco_c139.cpp b/src/mame/machine/namco_c139.cpp index b8c7fa96588..0e081a7836e 100644 --- a/src/mame/machine/namco_c139.cpp +++ b/src/mame/machine/namco_c139.cpp @@ -1,11 +1,12 @@ // license:BSD-3-Clause -// copyright-holders: +// 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? ***************************************************************************/ @@ -33,7 +34,7 @@ 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) // settings? + 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) // diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 0bf3d914987..37353541fd3 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -76,23 +76,23 @@ namco_c148_device::namco_c148_device(const machine_config &mconfig, const char * // (*) denotes master CPU only DEVICE_ADDRESS_MAP_START( map, 16, namco_c148_device ) - ADDRESS_MAP_GLOBAL_MASK(0x3e000) - AM_RANGE(0x06000, 0x06000) AM_READWRITE8(cpu_irq_level_r,cpu_irq_level_w,0x00ff) // CPUIRQ lv - AM_RANGE(0x08000, 0x08000) AM_READWRITE8(ex_irq_level_r,ex_irq_level_w,0x00ff) // EXIRQ lv - AM_RANGE(0x0a000, 0x0a000) AM_READWRITE8(pos_irq_level_r,pos_irq_level_w,0x00ff) // POSIRQ lv - AM_RANGE(0x0c000, 0x0c000) AM_READWRITE8(sci_irq_level_r,sci_irq_level_w,0x00ff) // SCIRQ lv - AM_RANGE(0x0e000, 0x0e000) AM_READWRITE8(vblank_irq_level_r,vblank_irq_level_w,0x00ff) // VBlank IRQ lv - - AM_RANGE(0x10000, 0x10000) AM_WRITE(cpu_irq_assert_w) - AM_RANGE(0x16000, 0x16000) AM_READWRITE(cpu_irq_ack_r, cpu_irq_ack_w) // CPUIRQ ack - AM_RANGE(0x18000, 0x18000) AM_READWRITE(ex_irq_ack_r, ex_irq_ack_w) // EXIRQ ack - AM_RANGE(0x1a000, 0x1a000) AM_READWRITE(pos_irq_ack_r, pos_irq_ack_w) // POSIRQ ack - AM_RANGE(0x1c000, 0x1c000) AM_READWRITE(sci_irq_ack_r, sci_irq_ack_w) // SCIRQ ack - AM_RANGE(0x1e000, 0x1e000) AM_READWRITE(vblank_irq_ack_r, vblank_irq_ack_w) // VBlank IRQ ack - AM_RANGE(0x20000, 0x20000) AM_READ8(ext_r,0x00ff) // EEPROM ready status (*) - AM_RANGE(0x22000, 0x22000) AM_WRITE8(ext1_w,0x00ff) // sound CPU reset (*) - AM_RANGE(0x24000, 0x24000) AM_WRITE8(ext2_w,0x00ff) // slave & i/o reset (*) - AM_RANGE(0x26000, 0x26000) AM_NOP // watchdog + 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 @@ -184,6 +184,17 @@ WRITE8_MEMBER( namco_c148_device::ext2_w ) // 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? diff --git a/src/mame/machine/namco_c148.h b/src/mame/machine/namco_c148.h index f909911c0b6..3f53228ebcc 100644 --- a/src/mame/machine/namco_c148.h +++ b/src/mame/machine/namco_c148.h @@ -91,6 +91,9 @@ public: 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 ); @@ -121,6 +124,7 @@ private: }m_irqlevel; uint8_t m_posirq_line; + uint8_t m_bus_reg; void flush_irq_acks(); }; diff --git a/src/mame/machine/namcos2.cpp b/src/mame/machine/namcos2.cpp index 6a396385e64..d2c23f350ed 100644 --- a/src/mame/machine/namcos2.cpp +++ b/src/mame/machine/namcos2.cpp @@ -178,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 */ /************************************************************* -- cgit v1.2.3 From 294efe0d36549d413597ffb11a228328acae7aa8 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 1 Jan 2017 23:55:05 +0100 Subject: Bulk rename video/c116.cpp into namco_c116.cpp --- scripts/target/mame/arcade.lua | 4 +- src/mame/includes/namcofl.h | 2 +- src/mame/includes/namconb1.h | 2 +- src/mame/includes/namcos1.h | 2 +- src/mame/machine/namco_c139.h | 4 +- src/mame/video/c116.cpp | 163 ----------------------------------------- src/mame/video/c116.h | 44 ----------- src/mame/video/namco_c116.cpp | 163 +++++++++++++++++++++++++++++++++++++++++ src/mame/video/namco_c116.h | 44 +++++++++++ 9 files changed, 214 insertions(+), 214 deletions(-) delete mode 100644 src/mame/video/c116.cpp delete mode 100644 src/mame/video/c116.h create mode 100644 src/mame/video/namco_c116.cpp create mode 100644 src/mame/video/namco_c116.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index d06cebe0392..a319dc7548d 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -2702,8 +2702,8 @@ files { MAME_DIR .. "src/mame/audio/namco52.h", MAME_DIR .. "src/mame/audio/namco54.cpp", MAME_DIR .. "src/mame/audio/namco54.h", - MAME_DIR .. "src/mame/video/c116.cpp", - MAME_DIR .. "src/mame/video/c116.h", + MAME_DIR .. "src/mame/video/namco_c116.cpp", + MAME_DIR .. "src/mame/video/namco_c116.h", MAME_DIR .. "src/mame/video/c45.cpp", MAME_DIR .. "src/mame/video/c45.h", } 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/machine/namco_c139.h b/src/mame/machine/namco_c139.h index 05acdfbdd83..08a38e74425 100644 --- a/src/mame/machine/namco_c139.h +++ b/src/mame/machine/namco_c139.h @@ -1,8 +1,8 @@ // license:BSD-3-Clause -// copyright-holders: +// copyright-holders:Angelo Salese /*************************************************************************** -Template for skeleton device + Namco C139 - Serial I/F Controller ***************************************************************************/ diff --git a/src/mame/video/c116.cpp b/src/mame/video/c116.cpp deleted file mode 100644 index 19d76184c11..00000000000 --- a/src/mame/video/c116.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Alex W. Jackson -/* -Namco Custom 116, used in: -System 1 -System 2 -NB-1/NB-2 -System FL - -C116 controls palette RAM, blanking/clipping, and generates raster IRQs. -It is paired with one of two priority mixer chips, depending on the board. -On System 1, its partner is Custom 120; on System 2, NB-1, NB-2, and System -FL, its partner is Custom 156. Based on schematics, C156 has more color input -pins than C120 in order to support sprites with higher bit depth; other -differences between the two mixer chips are unknown. - -The mixer (C120 or C156) outputs a 13-bit address corresponding to the color -index of the highest-priority input pixel to three 6264 SRAMs, one for each of -red, green and blue. The data from the RAMs is output to C116, which either -sends it to the DAC or clips it to black if the beam position is outside the -visible area programmed via its registers. - -When accessing the palette RAM from the CPU, data lines D0-D7 and address lines -A11 and A12 go to C116; these two address lines select between the three RAMs -and the C116 internal registers. A0-A10, A13 and A14 go to C120 or C156, which -simply pass them through to the RAMs (A13 becoming A11 and A14 becoming A12). -Thus, the palette RAM and the C116 registers are laid out like this from the -perspective of the CPU: - -0000-07FF: Red (first 2048 pens) -0800-0FFF: Green ("") -1000-17FF: Blue ("") -1800-1FFF: C116 registers -2000-27FF: Red (second 2048 pens) -2800-2FFF: Green ("") -3000-37FF: Blue ("") -3800-3FFF: C116 registers (mirror) -4000-47FF: Red (third 2048 pens) -4800-4FFF: Green ("") -5000-57FF: Blue ("") -5800-5FFF: C116 registers (mirror) -6000-67FF: Red (last 2048 pens) -6800-6FFF: Green ("") -7000-77FF: Blue ("") -7800-7FFF: C116 registers (mirror) - -C116 has six (or eight?) 16-bit registers: - -00-01: left clip -02-03: right clip -04-05: top clip -06-07: bottom clip -08-09: raster IRQ horizontal position? -0A-0B: raster IRQ scanline -0C-0D: unknown, some games write 0 here, but probably unused -0E-0F: "" - -The registers are mirrored every 0x10 bytes within the address ranges -indicated above. - -Although the registers are logically 16-bit, the chip's external interface -is 8-bit, so the registers are written a byte at a time and in a big-endian -fashion (even addresses access the MSB and odd addresses access the LSB) -regardless of the endianness of the CPU. Thus System FL, which has an Intel -i960 CPU, needs to write its clip and raster values byteswapped. -*/ - -#include "emu.h" -#include "video/c116.h" - - -//------------------------------------------------- -// namco_c116_device -- constructor -//------------------------------------------------- - -namco_c116_device::namco_c116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : device_t(mconfig, NAMCO_C116, "Namco C116 Video Controller", tag, owner, clock, "namco_c116", __FILE__), - device_gfx_interface(mconfig, *this), - device_video_interface(mconfig, *this) -{ -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void namco_c116_device::device_start() -{ - m_ram_r.resize(0x2000); - m_ram_g.resize(0x2000); - m_ram_b.resize(0x2000); - memset(m_regs, 0, sizeof(m_regs)); - - save_item(NAME(m_ram_r)); - save_item(NAME(m_ram_g)); - save_item(NAME(m_ram_b)); - save_item(NAME(m_regs)); -} - - -READ8_MEMBER(namco_c116_device::read) -{ - uint8_t *RAM; - - switch (offset & 0x1800) - { - case 0x0000: - RAM = &m_ram_r[0]; - break; - case 0x0800: - RAM = &m_ram_g[0]; - break; - case 0x1000: - RAM = &m_ram_b[0]; - break; - default: // case 0x1800 (internal registers) - { - int reg = (offset & 0xf) >> 1; - if (offset & 1) - return m_regs[reg] & 0xff; - else - return m_regs[reg] >> 8; - } - } - - return RAM[((offset & 0x6000) >> 2) | (offset & 0x7ff)]; -} - - -WRITE8_MEMBER(namco_c116_device::write) -{ - uint8_t *RAM; - - switch (offset & 0x1800) - { - case 0x0000: - RAM = &m_ram_r[0]; - break; - case 0x0800: - RAM = &m_ram_g[0]; - break; - case 0x1000: - RAM = &m_ram_b[0]; - break; - default: // case 0x1800 (internal registers) - { - int reg = (offset & 0xf) >> 1; - if (offset & 1) - m_regs[reg] = (m_regs[reg] & 0xff00) | data; - else - m_regs[reg] = (m_regs[reg] & 0x00ff) | (data << 8); - //printf("reg%d = %d\n", reg, m_regs[reg]); - return; - } - } - int color = ((offset & 0x6000) >> 2) | (offset & 0x7ff); - 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; diff --git a/src/mame/video/c116.h b/src/mame/video/c116.h deleted file mode 100644 index 48d5c46f932..00000000000 --- a/src/mame/video/c116.h +++ /dev/null @@ -1,44 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Alex W. Jackson - -#pragma once - -#ifndef __C116_H__ -#define __C116_H__ - - -//*************************************************************************** -// TYPE DEFINITIONS -//*************************************************************************** - -class namco_c116_device : - public device_t, - public device_gfx_interface, - public device_video_interface -{ -public: - //construction/destruction - namco_c116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - - //read/write handlers - DECLARE_READ8_MEMBER( read ); - DECLARE_WRITE8_MEMBER( write ); - - //getters - uint16_t get_reg(int reg) { return m_regs[reg]; } - -protected: - // device-level overrides - virtual void device_start() override; - -private: - // internal state - std::vector m_ram_r; - std::vector m_ram_g; - std::vector m_ram_b; - uint16_t m_regs[8]; -}; - -extern const device_type NAMCO_C116; - -#endif diff --git a/src/mame/video/namco_c116.cpp b/src/mame/video/namco_c116.cpp new file mode 100644 index 00000000000..e03424ad211 --- /dev/null +++ b/src/mame/video/namco_c116.cpp @@ -0,0 +1,163 @@ +// license:BSD-3-Clause +// copyright-holders:Alex W. Jackson +/* +Namco Custom 116, used in: +System 1 +System 2 +NB-1/NB-2 +System FL + +C116 controls palette RAM, blanking/clipping, and generates raster IRQs. +It is paired with one of two priority mixer chips, depending on the board. +On System 1, its partner is Custom 120; on System 2, NB-1, NB-2, and System +FL, its partner is Custom 156. Based on schematics, C156 has more color input +pins than C120 in order to support sprites with higher bit depth; other +differences between the two mixer chips are unknown. + +The mixer (C120 or C156) outputs a 13-bit address corresponding to the color +index of the highest-priority input pixel to three 6264 SRAMs, one for each of +red, green and blue. The data from the RAMs is output to C116, which either +sends it to the DAC or clips it to black if the beam position is outside the +visible area programmed via its registers. + +When accessing the palette RAM from the CPU, data lines D0-D7 and address lines +A11 and A12 go to C116; these two address lines select between the three RAMs +and the C116 internal registers. A0-A10, A13 and A14 go to C120 or C156, which +simply pass them through to the RAMs (A13 becoming A11 and A14 becoming A12). +Thus, the palette RAM and the C116 registers are laid out like this from the +perspective of the CPU: + +0000-07FF: Red (first 2048 pens) +0800-0FFF: Green ("") +1000-17FF: Blue ("") +1800-1FFF: C116 registers +2000-27FF: Red (second 2048 pens) +2800-2FFF: Green ("") +3000-37FF: Blue ("") +3800-3FFF: C116 registers (mirror) +4000-47FF: Red (third 2048 pens) +4800-4FFF: Green ("") +5000-57FF: Blue ("") +5800-5FFF: C116 registers (mirror) +6000-67FF: Red (last 2048 pens) +6800-6FFF: Green ("") +7000-77FF: Blue ("") +7800-7FFF: C116 registers (mirror) + +C116 has six (or eight?) 16-bit registers: + +00-01: left clip +02-03: right clip +04-05: top clip +06-07: bottom clip +08-09: raster IRQ horizontal position? +0A-0B: raster IRQ scanline +0C-0D: unknown, some games write 0 here, but probably unused +0E-0F: "" + +The registers are mirrored every 0x10 bytes within the address ranges +indicated above. + +Although the registers are logically 16-bit, the chip's external interface +is 8-bit, so the registers are written a byte at a time and in a big-endian +fashion (even addresses access the MSB and odd addresses access the LSB) +regardless of the endianness of the CPU. Thus System FL, which has an Intel +i960 CPU, needs to write its clip and raster values byteswapped. +*/ + +#include "emu.h" +#include "video/namco_c116.h" + + +//------------------------------------------------- +// namco_c116_device -- constructor +//------------------------------------------------- + +namco_c116_device::namco_c116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, NAMCO_C116, "Namco C116 Video Controller", tag, owner, clock, "namco_c116", __FILE__), + device_gfx_interface(mconfig, *this), + device_video_interface(mconfig, *this) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void namco_c116_device::device_start() +{ + m_ram_r.resize(0x2000); + m_ram_g.resize(0x2000); + m_ram_b.resize(0x2000); + memset(m_regs, 0, sizeof(m_regs)); + + save_item(NAME(m_ram_r)); + save_item(NAME(m_ram_g)); + save_item(NAME(m_ram_b)); + save_item(NAME(m_regs)); +} + + +READ8_MEMBER(namco_c116_device::read) +{ + uint8_t *RAM; + + switch (offset & 0x1800) + { + case 0x0000: + RAM = &m_ram_r[0]; + break; + case 0x0800: + RAM = &m_ram_g[0]; + break; + case 0x1000: + RAM = &m_ram_b[0]; + break; + default: // case 0x1800 (internal registers) + { + int reg = (offset & 0xf) >> 1; + if (offset & 1) + return m_regs[reg] & 0xff; + else + return m_regs[reg] >> 8; + } + } + + return RAM[((offset & 0x6000) >> 2) | (offset & 0x7ff)]; +} + + +WRITE8_MEMBER(namco_c116_device::write) +{ + uint8_t *RAM; + + switch (offset & 0x1800) + { + case 0x0000: + RAM = &m_ram_r[0]; + break; + case 0x0800: + RAM = &m_ram_g[0]; + break; + case 0x1000: + RAM = &m_ram_b[0]; + break; + default: // case 0x1800 (internal registers) + { + int reg = (offset & 0xf) >> 1; + if (offset & 1) + m_regs[reg] = (m_regs[reg] & 0xff00) | data; + else + m_regs[reg] = (m_regs[reg] & 0x00ff) | (data << 8); + //printf("reg%d = %d\n", reg, m_regs[reg]); + return; + } + } + int color = ((offset & 0x6000) >> 2) | (offset & 0x7ff); + 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; diff --git a/src/mame/video/namco_c116.h b/src/mame/video/namco_c116.h new file mode 100644 index 00000000000..48d5c46f932 --- /dev/null +++ b/src/mame/video/namco_c116.h @@ -0,0 +1,44 @@ +// license:BSD-3-Clause +// copyright-holders:Alex W. Jackson + +#pragma once + +#ifndef __C116_H__ +#define __C116_H__ + + +//*************************************************************************** +// TYPE DEFINITIONS +//*************************************************************************** + +class namco_c116_device : + public device_t, + public device_gfx_interface, + public device_video_interface +{ +public: + //construction/destruction + namco_c116_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + //read/write handlers + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + + //getters + uint16_t get_reg(int reg) { return m_regs[reg]; } + +protected: + // device-level overrides + virtual void device_start() override; + +private: + // internal state + std::vector m_ram_r; + std::vector m_ram_g; + std::vector m_ram_b; + uint16_t m_regs[8]; +}; + +extern const device_type NAMCO_C116; + +#endif -- cgit v1.2.3 From 8f6967671743554ebae38f8850e328e6d6ef884b Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Mon, 2 Jan 2017 01:30:39 +0100 Subject: aerofgt: ACCESSING_BITS cleanup --- src/mame/drivers/aerofgt.cpp | 74 +++++++++++++++++--------------------------- src/mame/includes/aerofgt.h | 15 +++++---- src/mame/video/aerofgt.cpp | 41 +++++++++--------------- 3 files changed, 50 insertions(+), 80 deletions(-) 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/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/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(); } } -- cgit v1.2.3 From f53396972812275192cd275404d0182fea72bef4 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 2 Jan 2017 01:50:30 +0100 Subject: Fixed POSIRQ line for Winning Run, fixes map indicator in winrun91 --- src/mame/drivers/namcos21.cpp | 6 +----- src/mame/video/namco_c116.cpp | 4 +--- src/mame/video/namcos21.cpp | 6 +++++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index dc826e2e23c..aaa893bd575 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -1872,12 +1872,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) if(m_gpu_intc != nullptr) { - if(scanline == m_gpu_intc->get_posirq_line()*2) - { + if(scanline == (0xff-m_gpu_intc->get_posirq_line())*2) m_gpu_intc->pos_irq_trigger(); - // TODO: wrong place! - m_screen->update_partial(param); - } } } diff --git a/src/mame/video/namco_c116.cpp b/src/mame/video/namco_c116.cpp index e03424ad211..b2c74a459d5 100644 --- a/src/mame/video/namco_c116.cpp +++ b/src/mame/video/namco_c116.cpp @@ -68,6 +68,7 @@ i960 CPU, needs to write its clip and raster values byteswapped. #include "emu.h" #include "video/namco_c116.h" +const device_type NAMCO_C116 = &device_creator; //------------------------------------------------- // 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; diff --git a/src/mame/video/namcos21.cpp b/src/mame/video/namcos21.cpp index 30a33c25e1f..01865fb2f62 100644 --- a/src/mame/video/namcos21.cpp +++ b/src/mame/video/namcos21.cpp @@ -48,6 +48,7 @@ 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) @@ -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,7 +439,7 @@ 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: -- cgit v1.2.3 From daf88c60809fbc706fde1cfd5855c8ea52969fa3 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 2 Jan 2017 01:54:50 +0100 Subject: Remove leftover offset, fixes winrungp title even further --- src/mame/machine/namco_c148.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mame/machine/namco_c148.cpp b/src/mame/machine/namco_c148.cpp index 37353541fd3..d09d82c7ff6 100644 --- a/src/mame/machine/namco_c148.cpp +++ b/src/mame/machine/namco_c148.cpp @@ -235,7 +235,7 @@ void namco_c148_device::sci_irq_trigger() 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 - 32) & 0xff; + return (m_posirq_line) & 0xff; } WRITE8_MEMBER( namco_c148_device::ext_posirq_line_w ) -- cgit v1.2.3 From 34012d66d859b2c28e0827139f80dcc5f93b2745 Mon Sep 17 00:00:00 2001 From: angelosa Date: Mon, 2 Jan 2017 04:27:56 +0100 Subject: Rewritten Namco C148 device (interrupt controller) [Angelo Salese] Rewritten Namco C139 device (SCI) [Angelo Salese] Fixed POS interrupt generation for Winning Run/Winning Run '91/Winning Run Suzuka GP [Angelo Salese] Fixed trail tachometer drawing in Winning Run [Angelo Salese] --- src/mame/drivers/namcos21.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp index aaa893bd575..1e99e5b9ee3 100644 --- a/src/mame/drivers/namcos21.cpp +++ b/src/mame/drivers/namcos21.cpp @@ -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 @@ -1846,7 +1847,6 @@ MACHINE_START_MEMBER(namcos21_state,namcos21) namcos2_kickstart = namcos21_kickstart; } -// TODO: temp, C116 device TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) { int scanline = param; @@ -1860,16 +1860,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline) m_gpu_intc->vblank_irq_trigger(); } - #if 0 - if(scanline == cur_posirq) - { - m_master_intc->pos_irq_trigger(); - m_slave_intc->pos_irq_trigger(); - // TODO: wrong place! - m_screen->update_partial(param); - } - #endif - if(m_gpu_intc != nullptr) { if(scanline == (0xff-m_gpu_intc->get_posirq_line())*2) -- cgit v1.2.3