-laserbas.cpp: Fixed a bug in sound output, improved trackball handling.

-taito_h.cpp: Moved Syvalion trackball handling to a derived class,
 reduced copy/paste in I/O handler function.

-Various small cleanups to drivers.
This commit is contained in:
Vas Crabb 2021-11-08 11:29:49 +11:00
parent 2b5b1a4b91
commit ac9d1301cb
10 changed files with 217 additions and 245 deletions

View File

@ -5,6 +5,8 @@
#pragma once
#include "netlist/nl_setup.h"
NETLIST_EXTERNAL(segaspeech)
#endif // MAME_AUDIO_NL_SEGASPEECH_H

View File

@ -7,12 +7,14 @@
*************************************************************************/
#include "emu.h"
#include "audio/segag80.h"
#include "includes/segag80v.h" // FIXME: eliminate the need for this dependency
#include "audio/nl_astrob.h"
#include "audio/nl_elim.h"
#include "audio/nl_spacfury.h"
#include "includes/segag80v.h"
#include "sound/samples.h"

View File

@ -12,8 +12,7 @@
#include "segaspeech.h"
#include "sound/sp0250.h"
#include "includes/segag80r.h"
#include "includes/segag80v.h"
#include "audio/nl_segaspeech.h"
#define VERBOSE 0

View File

@ -44,10 +44,7 @@ public:
, m_dac(*this, "dac")
, m_screen(*this, "screen")
, m_io_inputs(*this, "GAMEPAD")
, m_blinken1(*this, "blinken1")
, m_blinken2(*this, "blinken2")
, m_blinken3(*this, "blinken3")
, m_blinken4(*this, "blinken4")
, m_blinken(*this, "blinken%u", 1U)
{
}
@ -85,10 +82,7 @@ private:
required_device<screen_device> m_screen;
required_ioport m_io_inputs;
output_finder<> m_blinken1;
output_finder<> m_blinken2;
output_finder<> m_blinken3;
output_finder<> m_blinken4;
output_finder<4> m_blinken;
};
//**************************************************************************
@ -150,10 +144,11 @@ uint32_t gigatron_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
copybitmap(bitmap, *m_bitmap_render, 0, 0, 0, 0, cliprect);
video_reset();
m_blinken1 = (m_lights >> 3) & 1;
m_blinken2 = (m_lights >> 2) & 1;
m_blinken3 = (m_lights >> 1) & 1;
m_blinken4 = (m_lights >> 0) & 1;
m_blinken[0] = BIT(m_lights, 3);
m_blinken[1] = BIT(m_lights, 2);
m_blinken[2] = BIT(m_lights, 1);
m_blinken[3] = BIT(m_lights, 0);
return 0;
}
@ -190,10 +185,7 @@ INPUT_PORTS_END
void gigatron_state::machine_start()
{
//blinkenlights
m_blinken1.resolve();
m_blinken2.resolve();
m_blinken3.resolve();
m_blinken4.resolve();
m_blinken.resolve();
//Savestate stuff
save_item(NAME(m_lights));
@ -231,7 +223,7 @@ void gigatron_state::gigatron(machine_config &config)
/* sound hardware */
SPEAKER(config, "speaker").front_center();
DAC_4BIT_R2R(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
DAC_4BIT_R2R(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.5);
GTRON(config, m_maincpu, MAIN_CLOCK);
m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map);

View File

@ -60,15 +60,20 @@ expected: 43 FB CC 9A D4 23 6C 01 3E <- From ROM 4
********************************************/
#include "emu.h"
#include "cpu/z80/z80.h"
#include "machine/pit8253.h"
#include "machine/timer.h"
#include "sound/dac.h"
#include "video/mc6845.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
namespace {
class laserbas_state : public driver_device
{
public:
@ -76,7 +81,9 @@ public:
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_palette(*this, "palette"),
m_dac(*this, "dac%u", 1U)
m_dac(*this, "dac%u", 1U),
m_vrambank(*this, "vram"),
m_track(*this, { "TRACK_X", "TRACK_Y" })
{ }
void laserbas(machine_config &config);
@ -86,31 +93,34 @@ protected:
virtual void machine_reset() override;
private:
/* misc */
int m_dac_data;
int m_counter[6];
int m_cnt_out[6];
int m_nmi;
/* video-related */
int m_vrambank;
uint8_t m_vram[0x10000];
int m_hset, m_vset;
int m_bset;
int m_scl;
bool m_flipscreen;
uint64_t m_z1data;
required_device<cpu_device> m_maincpu;
required_device<palette_device> m_palette;
required_device_array<dac_byte_interface, 6> m_dac;
required_memory_bank m_vrambank;
required_ioport_array<2> m_track;
// misc
uint8_t m_counter[6];
uint8_t m_cnt_out[6];
int m_nmi;
// input-related
uint8_t m_track_prv[2];
int8_t m_track_cnt[2];
// video-related
uint8_t m_vram[0x10000];
uint8_t m_hset, m_vset;
uint8_t m_bset;
uint8_t m_scl;
bool m_flipscreen;
uint64_t m_z1data;
uint8_t vram_r(offs_t offset);
void vram_w(offs_t offset, uint8_t data);
void videoctrl1_w(offs_t offset, uint8_t data);
void videoctrl2_w(offs_t offset, uint8_t data);
uint8_t z1_r(offs_t offset);
uint8_t track_lo_r();
uint8_t track_hi_r();
uint8_t track_dir_r();
uint8_t track_val_r();
void out_w(uint8_t data);
template<uint8_t Which> DECLARE_WRITE_LINE_MEMBER(pit_out_w);
TIMER_DEVICE_CALLBACK_MEMBER(laserbas_scanline);
@ -166,16 +176,6 @@ MC6845_UPDATE_ROW( laserbas_state::crtc_update_row )
}
}
uint8_t laserbas_state::vram_r(offs_t offset)
{
return m_vram[offset+(m_vrambank?0x8000:0)];
}
void laserbas_state::vram_w(offs_t offset, uint8_t data)
{
m_vram[offset+(m_vrambank?0x8000:0)] = data;
}
void laserbas_state::videoctrl1_w(offs_t offset, uint8_t data)
{
data ^= 0xff;
@ -183,10 +183,10 @@ void laserbas_state::videoctrl1_w(offs_t offset, uint8_t data)
// 7------- flip screen
// -6------ layer select
// --543--- vset (vertical scroll, inc'ed on interrupts - 8 ints/frame?)
// -----210 hset (presumely horizontal scroll)
// -----210 hset (presumably horizontal scroll)
m_flipscreen = bool(BIT(data, 7));
m_vrambank = BIT(data, 6) ? 0 : 1;
m_flipscreen = BIT(data, 7);
m_vrambank->set_entry(BIT(~data, 6));
m_vset = (data >> 3) & 0x07;
m_hset = (data >> 0) & 0x07;
}
@ -225,75 +225,96 @@ uint8_t laserbas_state::z1_r(offs_t offset)
return (bit7 << 7) | (bit6 << 6) | (bit5 << 5) | (bit4 << 4) | (bit3 << 3) | (bit2 << 2) | (bit1 << 1) | (bit0 << 0);
}
uint8_t laserbas_state::track_lo_r()
// trackball read twice per frame, direction first then value
uint8_t laserbas_state::track_dir_r()
{
uint8_t dx = ioport("TRACK_X")->read();
uint8_t dy = ioport("TRACK_Y")->read();
if (dx & 0x10)
dx ^= 0xf;
if (dy & 0x10)
dy ^= 0x0f;
int data = (dx & 0x0f) | ((dy & 0x0f) << 4);
return data;
for (unsigned i = 0; m_track.size() > i; ++i)
{
uint8_t const track = uint8_t(m_track[i]->read());
int diff = track - m_track_prv[i];
m_track_prv[i] = track;
if (diff > 0x20)
diff -= 0x40;
else if (diff < -0x20)
diff += 0x40;
m_track_cnt[i] += diff;
}
return ((m_track_cnt[0] < 0) ? 0x01 : 0x00) | ((m_track_cnt[1] > 0) ? 0x02 : 0x00);
}
uint8_t laserbas_state::track_hi_r()
uint8_t laserbas_state::track_val_r()
{
int data = ((ioport("TRACK_X")->read() & 0x10) >> 4) | ((ioport("TRACK_Y")->read() & 0x10) >> 3);
return data;
int8_t const x = std::clamp<int8_t>(m_track_cnt[0], -15, 15);
int8_t const y = std::clamp<int8_t>(m_track_cnt[1], -15, 15);
m_track_cnt[0] -= x;
m_track_cnt[1] -= y;
return std::abs(x) | (std::abs(y) << 4);
}
void laserbas_state::out_w(uint8_t data)
{
/* sound related , maybe also lamps */
// sound related , maybe also lamps
}
void laserbas_state::machine_start()
{
m_vrambank->configure_entries(0, 2, m_vram, 0x8000);
std::fill(std::begin(m_counter), std::end(m_counter), 0);
std::fill(std::begin(m_cnt_out), std::end(m_cnt_out), 0);
m_nmi = 0;
std::fill(std::begin(m_track_prv), std::end(m_track_prv), 0);
std::fill(std::begin(m_track_cnt), std::end(m_track_cnt), 0);
save_item(NAME(m_counter));
save_item(NAME(m_cnt_out));
save_item(NAME(m_nmi));
save_item(NAME(m_track_prv));
save_item(NAME(m_track_cnt));
save_item(NAME(m_vram));
save_item(NAME(m_flipscreen));
save_item(NAME(m_vrambank));
save_item(NAME(m_hset));
save_item(NAME(m_vset));
save_item(NAME(m_bset));
save_item(NAME(m_scl));
save_item(NAME(m_nmi));
save_item(NAME(m_dac_data));
save_item(NAME(m_counter));
save_item(NAME(m_cnt_out));
save_item(NAME(m_flipscreen));
save_item(NAME(m_z1data));
}
void laserbas_state::machine_reset()
{
m_vrambank = 0;
m_flipscreen = false;
m_nmi=0;
m_bset = 0;
m_vrambank->set_entry(1);
m_hset = 0;
m_vset = 0;
m_bset = 0;
m_scl = 0;
m_flipscreen = 0;
}
template<uint8_t Which>
WRITE_LINE_MEMBER(laserbas_state::pit_out_w)
{
state^=1; // 7404 (6G)
if((!state)& m_cnt_out[Which]){ // 0->1 rising edge CLK
m_counter[Which] = (m_counter[Which]+1)&0x0f; // 4 bit counters 74393
}
int data =(state) | ((m_counter[Which]&7)<<1); // combine output from 8253 with counter bits 0-3
data<<=4;
if(m_counter[Which]&8) data^=0x0f; // counter bit 4 xors the data ( 7486 x 6)
m_dac[Which]->write(data); // 4 resistor packs : 47k, 100k, 220k, 470k
state ^= 1; // 7404 (6G)
if (!state && m_cnt_out[Which]) // 0->1 rising edge CLK
m_counter[Which] = (m_counter[Which] + 1) & 0x0f; // 4 bit counters 74393
m_cnt_out[Which]=state;
int data = state | ((m_counter[Which] & 7) << 1); // combine output from 8253 with counter bits 0-3
if (m_counter[Which] & 8) // counter bit 4 XORs the data (7486 x 6)
data ^= 0x0f;
m_dac[Which]->write(data); // 4 resistor packs: 47k, 100k, 220k, 470k
m_cnt_out[Which] = state;
}
void laserbas_state::laserbas_memory(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0xbfff).rw(FUNC(laserbas_state::vram_r), FUNC(laserbas_state::vram_w));
map(0x4000, 0xbfff).bankrw(m_vrambank);
map(0xc000, 0xf7ff).rom().nopw();
map(0xf800, 0xfbff).r(FUNC(laserbas_state::z1_r)).nopw(); /* protection device */
map(0xfc00, 0xffff).ram();
@ -308,8 +329,8 @@ void laserbas_state::laserbas_io(address_map &map)
map(0x11, 0x11).w(FUNC(laserbas_state::videoctrl2_w));
map(0x20, 0x20).portr("DSW");
map(0x21, 0x21).portr("INPUTS");
map(0x22, 0x22).r(FUNC(laserbas_state::track_hi_r));
map(0x23, 0x23).r(FUNC(laserbas_state::track_lo_r));
map(0x22, 0x22).r(FUNC(laserbas_state::track_dir_r));
map(0x23, 0x23).r(FUNC(laserbas_state::track_val_r));
map(0x20, 0x23).w(FUNC(laserbas_state::out_w));
map(0x40, 0x43).rw("pit0", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
map(0x44, 0x47).rw("pit1", FUNC(pit8253_device::read), FUNC(pit8253_device::write));
@ -362,10 +383,10 @@ static INPUT_PORTS_START( laserbas )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 ) // service coin
PORT_START("TRACK_X")
PORT_BIT( 0x01f, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_RESET
PORT_BIT( 0x03f, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20)
PORT_START("TRACK_Y")
PORT_BIT( 0x01f, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20) PORT_RESET PORT_REVERSE
PORT_BIT( 0x03f, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(20)
INPUT_PORTS_END
#define CLOCK 16680000
@ -486,11 +507,9 @@ ROM_START( laserbasa )
ROM_END
/*
It was unclear what type of device FF.9 was. The silkscreen on the PCB said
2716,
It was unclear what type of device FF.9 was. The silkscreen on the PCB said 2716,
but the device is a masked ROM with its identifying marks rubbed off.
I dumped it
as a 2716 (FF.9), a 2532 like the others (FF.9A) and a 2732 (FF.9B).
I dumped it as a 2716 (FF.9), a 2532 like the others (FF.9A) and a 2732 (FF.9B).
*/
ROM_START( futflash )
@ -505,6 +524,8 @@ ROM_START( futflash )
ROM_LOAD( "ff.8", 0xf000, 0x0800, CRC(623f558f) SHA1(be6c6565df658555f21c43a8c2459cf399794a84) )
ROM_END
} // anonymous namespace
GAME( 1980, futflash, 0, laserbas, laserbas, laserbas_state, empty_init, ROT270, "Hoei", "Future Flash", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1981, laserbas, futflash, laserbas, laserbas, laserbas_state, empty_init, ROT270, "Hoei (Amstar license)", "Laser Base (set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
GAME( 1981, laserbasa, futflash, laserbas, laserbas, laserbas_state, empty_init, ROT270, "Hoei (Amstar license)", "Laser Base (set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_COLORS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -161,49 +161,25 @@ some kind of zoom table?
***************************************************************************/
u8 taitoh_state::syvalion_input_bypass_r()
u8 syvalion_state::syvalion_input_bypass_r()
{
/* Bypass TC0040IOC controller for analog input */
// Bypass TC0040IOC controller for trackball input
u8 port = m_tc0040ioc->port_r(); /* read port number */
u8 port = m_tc0040ioc->port_r(); // read port number
switch (port)
{
case 0x08: /* trackball y coords bottom 8 bits for 2nd player */
return m_io_p2y->read();
case 0x08: // trackball y coords bottom 8 bits for 2nd player
case 0x0a: // trackball x coords bottom 8 bits for 2nd player
case 0x0c: // trackball y coords bottom 8 bits for 1st player
case 0x0e: // trackball x coords bottom 8 bits for 1st player
return m_io_track[(port - 8) >> 1]->read();
case 0x09: /* trackball y coords top 8 bits for 2nd player */
if (m_io_p2y->read() & 0x80) /* y- direction (negative value) */
return 0xff;
else /* y+ direction (positive value) */
return 0x00;
case 0x0a: /* trackball x coords bottom 8 bits for 2nd player */
return m_io_p2x->read();
case 0x0b: /* trackball x coords top 8 bits for 2nd player */
if (m_io_p2x->read() & 0x80) /* x- direction (negative value) */
return 0xff;
else /* x+ direction (positive value) */
return 0x00;
case 0x0c: /* trackball y coords bottom 8 bits for 1st player */
return m_io_p1y->read();
case 0x0d: /* trackball y coords top 8 bits for 1st player */
if (m_io_p1y->read() & 0x80) /* y- direction (negative value) */
return 0xff;
else /* y+ direction (positive value) */
return 0x00;
case 0x0e: /* trackball x coords bottom 8 bits for 1st player */
return m_io_p1x->read();
case 0x0f: /* trackball x coords top 8 bits for 1st player */
if (m_io_p1x->read() & 0x80) /* x- direction (negative value) */
return 0xff;
else /* x+ direction (positive value) */
return 0x00;
case 0x09: // trackball y coords top 8 bits for 2nd player
case 0x0b: // trackball x coords top 8 bits for 2nd player
case 0x0d: // trackball y coords top 8 bits for 1st player
case 0x0f: // trackball x coords top 8 bits for 1st player
return (m_io_track[(port - 8) >> 1]->read() & 0x80) ? 0xff : 0x00;
default:
return m_tc0040ioc->portreg_r();
@ -230,11 +206,11 @@ void taitoh_state::coin_control_w(u8 data)
***************************************************************************/
void taitoh_state::syvalion_map(address_map &map)
void syvalion_state::syvalion_map(address_map &map)
{
map(0x000000, 0x07ffff).rom();
map(0x100000, 0x10ffff).mirror(0x010000).ram();
map(0x200001, 0x200001).r(FUNC(taitoh_state::syvalion_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
map(0x200001, 0x200001).r(FUNC(syvalion_state::syvalion_input_bypass_r)).w(m_tc0040ioc, FUNC(tc0040ioc_device::portreg_w)).umask16(0x00ff);
map(0x200003, 0x200003).rw(m_tc0040ioc, FUNC(tc0040ioc_device::port_r), FUNC(tc0040ioc_device::port_w));
map(0x300000, 0x300001).nopr();
map(0x300001, 0x300001).w("tc0140syt", FUNC(tc0140syt_device::master_port_w));
@ -277,7 +253,7 @@ void taitoh_state::dleague_map(address_map &map)
map(0x300003, 0x300003).rw("tc0140syt", FUNC(tc0140syt_device::master_comm_r), FUNC(tc0140syt_device::master_comm_w));
map(0x400000, 0x420fff).rw(m_tc0080vco, FUNC(tc0080vco_device::word_r), FUNC(tc0080vco_device::word_w));
map(0x500800, 0x500fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette");
map(0x600000, 0x600001).nopw(); /* ?? writes zero once per frame */
map(0x600000, 0x600001).nopw(); // ?? writes zero once per frame
}
@ -599,35 +575,18 @@ void taitoh_state::machine_start()
}
void taitoh_state::syvalion(machine_config &config)
void taitoh_state::taitoh_base(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(24'000'000) / 2); /* 12 MHz */
m_maincpu->set_addrmap(AS_PROGRAM, &taitoh_state::syvalion_map);
// basic machine hardware
M68000(config, m_maincpu, XTAL(24'000'000) / 2); // 12 MHz
m_maincpu->set_vblank_int("screen", FUNC(taitoh_state::irq2_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000) / 2); /* 4 MHz ??? */
Z80(config, m_audiocpu, XTAL(8'000'000) / 2); // 4 MHz ???
m_audiocpu->set_addrmap(AS_PROGRAM, &taitoh_state::sound_map);
config.set_maximum_quantum(attotime::from_hz(600));
TC0040IOC(config, m_tc0040ioc, 0);
m_tc0040ioc->read_0_callback().set_ioport("DSWA");
m_tc0040ioc->read_1_callback().set_ioport("DSWB");
m_tc0040ioc->read_2_callback().set_ioport("IN0");
m_tc0040ioc->read_3_callback().set_ioport("IN1");
m_tc0040ioc->write_4_callback().set(FUNC(taitoh_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*16, 64*16);
screen.set_visarea(0*16, 32*16-1, 3*16, 28*16-1);
screen.set_screen_update(FUNC(taitoh_state::screen_update_syvalion));
screen.set_palette(m_palette);
// video hardware
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 33*16);
TC0080VCO(config, m_tc0080vco, 0);
@ -635,7 +594,7 @@ void taitoh_state::syvalion(machine_config &config)
m_tc0080vco->set_bgflip_yoffs(-2);
m_tc0080vco->set_palette(m_palette);
/* sound hardware */
// sound hardware
SPEAKER(config, "mono").front_center();
ym2610_device &ymsnd(YM2610(config, "ymsnd", XTAL(8'000'000)));
@ -649,17 +608,37 @@ void taitoh_state::syvalion(machine_config &config)
tc0140syt.set_slave_tag(m_audiocpu);
}
void syvalion_state::syvalion(machine_config &config)
{
taitoh_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &syvalion_state::syvalion_map);
TC0040IOC(config, m_tc0040ioc, 0);
m_tc0040ioc->read_0_callback().set_ioport("DSWA");
m_tc0040ioc->read_1_callback().set_ioport("DSWB");
m_tc0040ioc->read_2_callback().set_ioport("IN0");
m_tc0040ioc->read_3_callback().set_ioport("IN1");
m_tc0040ioc->write_4_callback().set(FUNC(syvalion_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
screen.set_size(64*16, 64*16);
screen.set_visarea(0*16, 32*16-1, 3*16, 28*16-1);
screen.set_screen_update(FUNC(syvalion_state::screen_update_syvalion));
screen.set_palette(m_palette);
}
void taitoh_state::recordbr(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(24'000'000) / 2); /* 12 MHz */
taitoh_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &taitoh_state::recordbr_map);
m_maincpu->set_vblank_int("screen", FUNC(taitoh_state::irq2_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000) / 2); /* 4 MHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &taitoh_state::sound_map);
config.set_maximum_quantum(attotime::from_hz(600));
TC0040IOC(config, m_tc0040ioc, 0);
m_tc0040ioc->read_0_callback().set_ioport("DSWA");
@ -669,7 +648,7 @@ void taitoh_state::recordbr(machine_config &config)
m_tc0040ioc->write_4_callback().set(FUNC(taitoh_state::coin_control_w));
m_tc0040ioc->read_7_callback().set_ioport("IN2");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -678,32 +657,14 @@ void taitoh_state::recordbr(machine_config &config)
screen.set_screen_update(FUNC(taitoh_state::screen_update_recordbr));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 32*16);
TC0080VCO(config, m_tc0080vco, 0);
m_tc0080vco->set_offsets(1, 1);
m_tc0080vco->set_bgflip_yoffs(-2);
m_tc0080vco->set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "mono").front_center();
ym2610_device &ymsnd(YM2610(config, "ymsnd", XTAL(8'000'000)));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(0, "mono", 0.25);
ymsnd.add_route(1, "mono", 1.0);
ymsnd.add_route(2, "mono", 1.0);
tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag(m_maincpu);
tc0140syt.set_slave_tag(m_audiocpu);
m_palette->set_entries(32*16);
}
void taitoh_state::tetristh(machine_config &config)
{
recordbr(config);
/* basic machine hardware */
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &taitoh_state::tetristh_map);
m_palette->set_entries(0x800/2);
@ -711,15 +672,10 @@ void taitoh_state::tetristh(machine_config &config)
void taitoh_state::dleague(machine_config &config)
{
/* basic machine hardware */
M68000(config, m_maincpu, XTAL(24'000'000) / 2); /* 12 MHz */
taitoh_base(config);
// basic machine hardware
m_maincpu->set_addrmap(AS_PROGRAM, &taitoh_state::dleague_map);
m_maincpu->set_vblank_int("screen", FUNC(taitoh_state::irq1_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000) / 2); /* 4 MHz ??? */
m_audiocpu->set_addrmap(AS_PROGRAM, &taitoh_state::sound_map);
config.set_maximum_quantum(attotime::from_hz(600));
tc0220ioc_device &tc0220ioc(TC0220IOC(config, "tc0220ioc", 0));
tc0220ioc.read_0_callback().set_ioport("DSWA");
@ -729,7 +685,7 @@ void taitoh_state::dleague(machine_config &config)
tc0220ioc.write_4_callback().set(FUNC(taitoh_state::coin_control_w));
tc0220ioc.read_7_callback().set_ioport("IN2");
/* video hardware */
// video hardware
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_refresh_hz(60);
screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
@ -737,26 +693,6 @@ void taitoh_state::dleague(machine_config &config)
screen.set_visarea(1*16, 21*16-1, 2*16, 17*16-1);
screen.set_screen_update(FUNC(taitoh_state::screen_update_dleague));
screen.set_palette(m_palette);
PALETTE(config, m_palette).set_format(palette_device::xBGR_555, 33*16);
TC0080VCO(config, m_tc0080vco, 0);
m_tc0080vco->set_offsets(1, 1);
m_tc0080vco->set_bgflip_yoffs(-2);
m_tc0080vco->set_palette(m_palette);
/* sound hardware */
SPEAKER(config, "mono").front_center();
ym2610_device &ymsnd(YM2610(config, "ymsnd", XTAL(8'000'000)));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
ymsnd.add_route(0, "mono", 0.25);
ymsnd.add_route(1, "mono", 1.0);
ymsnd.add_route(2, "mono", 1.0);
tc0140syt_device &tc0140syt(TC0140SYT(config, "tc0140syt", 0));
tc0140syt.set_master_tag(m_maincpu);
tc0140syt.set_slave_tag(m_audiocpu);
}
@ -1073,13 +1009,13 @@ ROM_START( dleaguej )
ROM_END
// YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME FLAGS
GAME( 1988, syvalion, 0, syvalion, syvalion, taitoh_state, empty_init, ROT0, "Taito Corporation", "Syvalion (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionp, syvalion, syvalion, syvalionp, taitoh_state, empty_init, ROT0, "Taito Corporation", "Syvalion (World, prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionu, syvalion, syvalion, syvalion, taitoh_state, empty_init, ROT0, "Taito America Corporation", "Syvalion (US, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionw, syvalion, syvalion, syvalion, taitoh_state, empty_init, ROT0, "Taito Corporation Japan", "Syvalion (World, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, recordbr, 0, recordbr, recordbr, taitoh_state, empty_init, ROT0, "Taito Corporation Japan", "Recordbreaker (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, gogold, recordbr, recordbr, gogold, taitoh_state, empty_init, ROT0, "Taito Corporation", "Go For The Gold (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, tetristh, tetris, tetristh, tetristh, taitoh_state, empty_init, ROT0, "Sega", "Tetris (Japan, Taito H-System)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, dleague, 0, dleague, dleague, taitoh_state, empty_init, ROT0, "Taito America Corporation", "Dynamite League (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, dleaguej, dleague, dleague, dleaguej, taitoh_state, empty_init, ROT0, "Taito Corporation", "Dynamite League (Japan)", MACHINE_SUPPORTS_SAVE )
// YEAR NAME PARENT MACHINE INPUT STATE INIT MONITOR COMPANY FULLNAME FLAGS
GAME( 1988, syvalion, 0, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionp, syvalion, syvalion, syvalionp, syvalion_state, empty_init, ROT0, "Taito Corporation", "Syvalion (World, prototype)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionu, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito America Corporation", "Syvalion (US, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, syvalionw, syvalion, syvalion, syvalion, syvalion_state, empty_init, ROT0, "Taito Corporation Japan", "Syvalion (World, PS2 Taito Legends 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, recordbr, 0, recordbr, recordbr, taitoh_state, empty_init, ROT0, "Taito Corporation Japan", "Recordbreaker (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, gogold, recordbr, recordbr, gogold, taitoh_state, empty_init, ROT0, "Taito Corporation", "Go For The Gold (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, tetristh, tetris, tetristh, tetristh, taitoh_state, empty_init, ROT0, "Sega", "Tetris (Japan, Taito H-System)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, dleague, 0, dleague, dleague, taitoh_state, empty_init, ROT0, "Taito America Corporation", "Dynamite League (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1990, dleaguej, dleague, dleague, dleaguej, taitoh_state, empty_init, ROT0, "Taito Corporation", "Dynamite League (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -14,10 +14,12 @@
#include "audio/segag80r.h"
#include "audio/segaspeech.h"
#include "audio/segausb.h"
#include "machine/i8255.h"
#include "machine/segag80.h"
#include "sound/samples.h"
#include "sound/sn76496.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"

View File

@ -5,10 +5,15 @@
Sega vector hardware
*************************************************************************/
#ifndef MAME_INCLUDES_SEGAG80V_H
#define MAME_INCLUDES_SEGAG80V_H
#pragma once
#include "audio/segag80.h"
#include "audio/segaspeech.h"
#include "audio/segausb.h"
#include "audio/segag80.h"
#include "cpu/z80/z80.h"
#include "machine/segag80.h"
#include "sound/ay8910.h"
@ -166,3 +171,5 @@ private:
void spacfurybl_speech_prg_map(address_map &map);
void spacfurybl_speech_io_map(address_map &map);
};
#endif // MAME_INCLUDES_SEGAG80V_H

View File

@ -25,15 +25,10 @@ public:
m_tc0080vco(*this, "tc0080vco"),
m_tc0040ioc(*this, "tc0040ioc"),
m_palette(*this, "palette"),
m_z80bank(*this, "z80bank"),
m_io_p1x(*this, "P1X"),
m_io_p1y(*this, "P1Y"),
m_io_p2x(*this, "P2X"),
m_io_p2y(*this, "P2Y")
m_z80bank(*this, "z80bank")
{ }
void recordbr(machine_config &config);
void syvalion(machine_config &config);
void dleague(machine_config &config);
void tetristh(machine_config &config);
@ -41,8 +36,7 @@ protected:
virtual void machine_start() override;
virtual void machine_reset() override;
private:
/* devices */
// devices
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<tc0080vco_device> m_tc0080vco;
@ -51,26 +45,43 @@ private:
required_memory_bank m_z80bank;
optional_ioport m_io_p1x;
optional_ioport m_io_p1y;
optional_ioport m_io_p2x;
optional_ioport m_io_p2y;
void taitoh_base(machine_config &config);
void coin_control_w(u8 data);
u8 syvalion_input_bypass_r();
void taitoh_log_vram();
private:
void sound_bankswitch_w(u8 data);
u32 screen_update_syvalion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_recordbr(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_dleague(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void syvalion_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void recordbr_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
void dleague_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
void taitoh_log_vram();
void dleague_map(address_map &map);
void recordbr_map(address_map &map);
void sound_map(address_map &map);
void syvalion_map(address_map &map);
void tetristh_map(address_map &map);
};
class syvalion_state : public taitoh_state
{
public:
syvalion_state(const machine_config &mconfig, device_type type, const char *tag) :
taitoh_state(mconfig, type, tag),
m_io_track(*this, { "P2Y", "P2X", "P1Y", "P1X" })
{ }
void syvalion(machine_config &config);
private:
required_ioport_array<4> m_io_track;
u8 syvalion_input_bypass_r();
u32 screen_update_syvalion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void syvalion_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
void syvalion_map(address_map &map);
};
#endif // MAME_INCLUDES_TAITO_H_H

View File

@ -55,7 +55,7 @@ sprite RAM
Screen refresh
***************************************************************************/
void taitoh_state::syvalion_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
void syvalion_state::syvalion_draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect)
{
for (int offs = 0x03f8 / 2; offs >= 0; offs -= 0x008 / 2)
{
@ -120,7 +120,7 @@ void taitoh_state::taitoh_log_vram()
/**************************************************************************/
u32 taitoh_state::screen_update_syvalion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 syvalion_state::screen_update_syvalion(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tc0080vco->tilemap_update();