exterm.cpp: device_finder and other cleanups (nw)

This commit is contained in:
Ivan Vangelista 2018-05-22 19:40:01 +02:00
parent 0e965193cf
commit be2004af83
3 changed files with 66 additions and 73 deletions

View File

@ -70,7 +70,6 @@
#include "machine/watchdog.h"
#include "sound/dac.h"
#include "sound/volt_reg.h"
#include "sound/ym2151.h"
#include "screen.h"
#include "speaker.h"
@ -91,13 +90,13 @@ void exterm_state::machine_start()
*
*************************************/
WRITE16_MEMBER(exterm_state::exterm_host_data_w)
WRITE16_MEMBER(exterm_state::host_data_w)
{
m_slave->host_w(space,offset / 0x0010000, data, 0xffff);
}
READ16_MEMBER(exterm_state::exterm_host_data_r)
READ16_MEMBER(exterm_state::host_data_r)
{
return m_slave->host_r(space,offset / 0x0010000, 0xffff);
}
@ -110,53 +109,41 @@ READ16_MEMBER(exterm_state::exterm_host_data_r)
*
*************************************/
uint16_t exterm_state::exterm_trackball_port_r(int which, uint16_t mem_mask)
template<uint8_t Which>
READ16_MEMBER(exterm_state::trackball_port_r)
{
uint16_t port;
/* Read the fake input port */
uint8_t trackball_pos = ioport(which ? "DIAL1" : "DIAL0")->read();
uint8_t trackball_pos = m_dial[Which]->read();
/* Calculate the change from the last position. */
uint8_t trackball_diff = m_trackball_old[which] - trackball_pos;
uint8_t trackball_diff = m_trackball_old[Which] - trackball_pos;
/* Store the new position for the next comparision. */
m_trackball_old[which] = trackball_pos;
/* Store the new position for the next comparison. */
m_trackball_old[Which] = trackball_pos;
/* Move the sign bit to the high bit of the 6-bit trackball count. */
if (trackball_diff & 0x80)
trackball_diff |= 0x20;
/* Keep adding the changes. The counters will be reset later by a hardware write. */
m_aimpos[which] = (m_aimpos[which] + trackball_diff) & 0x3f;
m_aimpos[Which] = (m_aimpos[Which] + trackball_diff) & 0x3f;
/* Combine it with the standard input bits */
port = ioport(which ? "P2" : "P1")->read();
port = m_input[Which]->read();
return (port & 0xc0ff) | (m_aimpos[which] << 8);
return (port & 0xc0ff) | (m_aimpos[Which] << 8);
}
READ16_MEMBER(exterm_state::exterm_input_port_0_r)
{
return exterm_trackball_port_r(0, mem_mask);
}
READ16_MEMBER(exterm_state::exterm_input_port_1_r)
{
return exterm_trackball_port_r(1, mem_mask);
}
/*************************************
*
* Output port handlers
*
*************************************/
WRITE16_MEMBER(exterm_state::exterm_output_port_0_w)
WRITE16_MEMBER(exterm_state::output_port_0_w)
{
/* All the outputs are activated on the rising edge */
@ -209,9 +196,8 @@ TIMER_DEVICE_CALLBACK_MEMBER(exterm_state::master_sound_nmi_callback)
WRITE8_MEMBER(exterm_state::ym2151_data_latch_w)
{
ym2151_device *device = machine().device<ym2151_device>("ymsnd");
/* bit 7 of the sound control selects which port */
device->write(space, m_sound_control >> 7, data);
m_ym2151->write(space, m_sound_control >> 7, data);
}
@ -221,8 +207,7 @@ WRITE8_MEMBER(exterm_state::sound_nmi_rate_w)
/* this value is latched into up-counters, which are clocked at the */
/* input clock / 256 */
attotime nmi_rate = attotime::from_hz(4000000) * (4096 * (256 - data));
timer_device *nmi_timer = machine().device<timer_device>("snd_nmi_timer");
nmi_timer->adjust(nmi_rate, 0, nmi_rate);
m_nmi_timer->adjust(nmi_rate, 0, nmi_rate);
}
@ -258,16 +243,16 @@ void exterm_state::master_map(address_map &map)
{
map(0x00000000, 0x000fffff).mirror(0xfc700000).ram().share("master_videoram");
map(0x00800000, 0x00bfffff).mirror(0xfc400000).ram();
map(0x01000000, 0x013fffff).mirror(0xfc000000).rw(this, FUNC(exterm_state::exterm_host_data_r), FUNC(exterm_state::exterm_host_data_w));
map(0x01400000, 0x0143ffff).mirror(0xfc000000).r(this, FUNC(exterm_state::exterm_input_port_0_r));
map(0x01440000, 0x0147ffff).mirror(0xfc000000).r(this, FUNC(exterm_state::exterm_input_port_1_r));
map(0x01000000, 0x013fffff).mirror(0xfc000000).rw(this, FUNC(exterm_state::host_data_r), FUNC(exterm_state::host_data_w));
map(0x01400000, 0x0143ffff).mirror(0xfc000000).r(this, FUNC(exterm_state::trackball_port_r<0>));
map(0x01440000, 0x0147ffff).mirror(0xfc000000).r(this, FUNC(exterm_state::trackball_port_r<1>));
map(0x01480000, 0x014bffff).mirror(0xfc000000).portr("DSW");
map(0x01500000, 0x0153ffff).mirror(0xfc000000).w(this, FUNC(exterm_state::exterm_output_port_0_w));
map(0x01500000, 0x0153ffff).mirror(0xfc000000).w(this, FUNC(exterm_state::output_port_0_w));
map(0x01580000, 0x015bffff).mirror(0xfc000000).w(this, FUNC(exterm_state::sound_latch_w)).umask16(0x00ff);
map(0x015c0000, 0x015fffff).mirror(0xfc000000).w("watchdog", FUNC(watchdog_timer_device::reset16_w));
map(0x01800000, 0x01807fff).mirror(0xfc7f8000).ram().w("palette", FUNC(palette_device::write16)).share("palette");
map(0x02800000, 0x02807fff).mirror(0xfc7f8000).ram().share("nvram");
map(0x03000000, 0x03ffffff).mirror(0xfc000000).rom().region("user1", 0);
map(0x03000000, 0x03ffffff).mirror(0xfc000000).rom().region("maincpu", 0);
map(0xc0000000, 0xc00001ff).rw(m_maincpu, FUNC(tms34010_device::io_register_r), FUNC(tms34010_device::io_register_w));
}
@ -292,7 +277,7 @@ void exterm_state::sound_master_map(address_map &map)
map(0x0000, 0x07ff).mirror(0x1800).ram();
map(0x4000, 0x5fff).w(this, FUNC(exterm_state::ym2151_data_latch_w));
map(0x6000, 0x67ff).w(this, FUNC(exterm_state::sound_nmi_rate_w));
map(0x6800, 0x6fff).r("soundlatch1", FUNC(generic_latch_8_device::read));
map(0x6800, 0x6fff).r(m_soundlatch[0], FUNC(generic_latch_8_device::read));
map(0x7000, 0x77ff).r(this, FUNC(exterm_state::sound_nmi_to_slave_r));
/* AM_RANGE(0x7800, 0x7fff) unknown - to S4-13 */
map(0x8000, 0xffff).rom();
@ -303,7 +288,7 @@ void exterm_state::sound_master_map(address_map &map)
void exterm_state::sound_slave_map(address_map &map)
{
map(0x0000, 0x07ff).mirror(0x3800).ram();
map(0x4000, 0x5fff).r("soundlatch2", FUNC(generic_latch_8_device::read));
map(0x4000, 0x5fff).r(m_soundlatch[1], FUNC(generic_latch_8_device::read));
map(0x8000, 0xffff).rom();
map(0x8000, 0x8000).mirror(0x3ffe).w("dacvol", FUNC(dac_byte_interface::write));
map(0x8001, 0x8001).mirror(0x3ffe).w("dac", FUNC(dac_byte_interface::write));
@ -389,40 +374,40 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(exterm_state::exterm)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", TMS34010, 40000000)
MCFG_DEVICE_ADD(m_maincpu, TMS34010, 40000000)
MCFG_DEVICE_PROGRAM_MAP(master_map)
MCFG_TMS340X0_HALT_ON_RESET(false) /* halt on reset */
MCFG_TMS340X0_PIXEL_CLOCK(40000000/8) /* pixel clock */
MCFG_TMS340X0_PIXELS_PER_CLOCK(1) /* pixels per clock */
MCFG_TMS340X0_SCANLINE_IND16_CB(exterm_state, scanline_update) /* scanline updater (indexed16) */
MCFG_TMS340X0_TO_SHIFTREG_CB(exterm_state, to_shiftreg_master) /* write to shiftreg function */
MCFG_TMS340X0_FROM_SHIFTREG_CB(exterm_state, from_shiftreg_master) /* read from shiftreg function */
MCFG_TMS340X0_HALT_ON_RESET(false)
MCFG_TMS340X0_PIXEL_CLOCK(40000000/8)
MCFG_TMS340X0_PIXELS_PER_CLOCK(1)
MCFG_TMS340X0_SCANLINE_IND16_CB(exterm_state, scanline_update)
MCFG_TMS340X0_TO_SHIFTREG_CB(exterm_state, to_shiftreg_master)
MCFG_TMS340X0_FROM_SHIFTREG_CB(exterm_state, from_shiftreg_master)
MCFG_DEVICE_ADD("slave", TMS34010, 40000000)
MCFG_DEVICE_ADD(m_slave, TMS34010, 40000000)
MCFG_DEVICE_PROGRAM_MAP(slave_map)
MCFG_TMS340X0_HALT_ON_RESET(true) /* halt on reset */
MCFG_TMS340X0_PIXEL_CLOCK(40000000/8) /* pixel clock */
MCFG_TMS340X0_PIXELS_PER_CLOCK(1) /* pixels per clock */
MCFG_TMS340X0_TO_SHIFTREG_CB(exterm_state, to_shiftreg_slave) /* write to shiftreg function */
MCFG_TMS340X0_FROM_SHIFTREG_CB(exterm_state, from_shiftreg_slave) /* read from shiftreg function */
MCFG_TMS340X0_HALT_ON_RESET(true)
MCFG_TMS340X0_PIXEL_CLOCK(40000000/8)
MCFG_TMS340X0_PIXELS_PER_CLOCK(1)
MCFG_TMS340X0_TO_SHIFTREG_CB(exterm_state, to_shiftreg_slave)
MCFG_TMS340X0_FROM_SHIFTREG_CB(exterm_state, from_shiftreg_slave)
MCFG_DEVICE_ADD("audiocpu", M6502, 2000000)
MCFG_DEVICE_ADD(m_audiocpu, M6502, 2000000)
MCFG_DEVICE_PROGRAM_MAP(sound_master_map)
MCFG_DEVICE_ADD("audioslave", M6502, 2000000)
MCFG_DEVICE_ADD(m_audioslave, M6502, 2000000)
MCFG_DEVICE_PROGRAM_MAP(sound_slave_map)
MCFG_GENERIC_LATCH_8_ADD("soundlatch1")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audiocpu", M6502_IRQ_LINE))
MCFG_GENERIC_LATCH_8_ADD(m_soundlatch[0])
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE(m_audiocpu, M6502_IRQ_LINE))
MCFG_GENERIC_LATCH_8_ADD("soundlatch2")
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE("audioslave", M6502_IRQ_LINE))
MCFG_GENERIC_LATCH_8_ADD(m_soundlatch[1])
MCFG_GENERIC_LATCH_DATA_PENDING_CB(INPUTLINE(m_audioslave, M6502_IRQ_LINE))
MCFG_QUANTUM_TIME(attotime::from_hz(6000))
MCFG_NVRAM_ADD_0FILL("nvram")
MCFG_TIMER_DRIVER_ADD("snd_nmi_timer", exterm_state, master_sound_nmi_callback)
MCFG_TIMER_DRIVER_ADD(m_nmi_timer, exterm_state, master_sound_nmi_callback)
MCFG_WATCHDOG_ADD("watchdog")
@ -446,7 +431,7 @@ MACHINE_CONFIG_START(exterm_state::exterm)
MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0)
MCFG_SOUND_ROUTE(0, "dacvol", 1.0, DAC_VREF_POS_INPUT)
MCFG_DEVICE_ADD("ymsnd", YM2151, 4000000)
MCFG_DEVICE_ADD(m_ym2151, YM2151, 4000000)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 1.0)
MACHINE_CONFIG_END
@ -465,7 +450,7 @@ ROM_START( exterm )
ROM_REGION( 0x10000, "audioslave", 0 ) /* 64k for DAC code */
ROM_LOAD( "v101d1", 0x8000, 0x8000, CRC(83268b7d) SHA1(a9139e80e2382122e9919c0555937e120d4414cf) )
ROM_REGION16_LE( 0x200000, "user1", 0 ) /* 2MB for 34010 code */
ROM_REGION16_LE( 0x200000, "maincpu", 0 ) /* 2MB for 34010 code */
ROM_LOAD16_BYTE( "v101bg0", 0x000000, 0x10000, CRC(8c8e72cf) SHA1(5e0fa805334f54f7e0293ea400bacb0e3e79ed56) )
ROM_LOAD16_BYTE( "v101bg1", 0x000001, 0x10000, CRC(cc2da0d8) SHA1(4ac23048d3ca771e315388603ad3b1b25030d6ff) )
ROM_LOAD16_BYTE( "v101bg2", 0x020000, 0x10000, CRC(2dcb3653) SHA1(2d74b58b02ae0587e3789d69feece268f582f226) )

View File

@ -6,10 +6,10 @@
*************************************************************************/
#include "cpu/tms32010/tms32010.h"
#include "cpu/tms34010/tms34010.h"
#include "machine/gen_latch.h"
#include "machine/timer.h"
#include "sound/ym2151.h"
class exterm_state : public driver_device
{
@ -21,29 +21,42 @@ public:
m_audioslave(*this, "audioslave"),
m_soundlatch(*this, "soundlatch%u", 1),
m_slave(*this, "slave"),
m_ym2151(*this, "ymsnd"),
m_nmi_timer(*this, "snd_nmi_timer"),
m_master_videoram(*this, "master_videoram"),
m_slave_videoram(*this, "slave_videoram") { }
m_slave_videoram(*this, "slave_videoram"),
m_dial(*this, "DIAL%u", 0U),
m_input(*this, "P%u", 1U) { }
void exterm(machine_config &config);
protected:
virtual void machine_start() override;
private:
required_device<tms34010_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<cpu_device> m_audioslave;
required_device_array<generic_latch_8_device, 2> m_soundlatch;
required_device<tms34010_device> m_slave;
required_device<ym2151_device> m_ym2151;
required_device<timer_device> m_nmi_timer;
required_shared_ptr<uint16_t> m_master_videoram;
required_shared_ptr<uint16_t> m_slave_videoram;
required_ioport_array<2> m_dial;
required_ioport_array<2> m_input;
uint8_t m_aimpos[2];
uint8_t m_trackball_old[2];
uint8_t m_sound_control;
uint16_t m_last;
virtual void machine_start() override;
DECLARE_WRITE16_MEMBER(exterm_host_data_w);
DECLARE_READ16_MEMBER(exterm_host_data_r);
DECLARE_READ16_MEMBER(exterm_input_port_0_r);
DECLARE_READ16_MEMBER(exterm_input_port_1_r);
DECLARE_WRITE16_MEMBER(exterm_output_port_0_w);
DECLARE_WRITE16_MEMBER(host_data_w);
DECLARE_READ16_MEMBER(host_data_r);
template<uint8_t Which> DECLARE_READ16_MEMBER(trackball_port_r);
DECLARE_WRITE16_MEMBER(output_port_0_w);
DECLARE_WRITE8_MEMBER(sound_latch_w);
DECLARE_WRITE8_MEMBER(sound_nmi_rate_w);
DECLARE_READ8_MEMBER(sound_nmi_to_slave_r);
@ -56,8 +69,6 @@ public:
TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg_master);
TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg_slave);
TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg_slave);
uint16_t exterm_trackball_port_r(int which, uint16_t mem_mask);
void exterm(machine_config &config);
void master_map(address_map &map);
void slave_map(address_map &map);
void sound_master_map(address_map &map);

View File

@ -18,10 +18,8 @@
PALETTE_INIT_MEMBER(exterm_state, exterm)
{
int i;
/* initialize 555 RGB lookup */
for (i = 0; i < 32768; i++)
for (int i = 0; i < 32768; i++)
palette.set_pen_color(i + 0x800, pal5bit(i >> 10), pal5bit(i >> 5), pal5bit(i >> 0));
}
@ -72,7 +70,6 @@ TMS340X0_SCANLINE_IND16_CB_MEMBER(exterm_state::scanline_update)
tms340x0_device::display_params fgparams;
int coladdr = params->coladdr;
int fgcoladdr = 0;
int x;
/* get parameters for the slave CPU */
m_slave->get_display_params(&fgparams);
@ -85,7 +82,7 @@ TMS340X0_SCANLINE_IND16_CB_MEMBER(exterm_state::scanline_update)
}
/* copy the non-blanked portions of this scanline */
for (x = params->heblnk; x < params->hsblnk; x += 2)
for (int x = params->heblnk; x < params->hsblnk; x += 2)
{
uint16_t bgdata, fgdata = 0;