mirror of
https://github.com/holub/mame
synced 2025-04-26 10:13:37 +03:00
exterm.cpp: device_finder and other cleanups (nw)
This commit is contained in:
parent
0e965193cf
commit
be2004af83
@ -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) )
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user