galaxian.cpp: Implement konami filters using netlist. [Couriersud]

This change improves accuracy and scalability.
This commit is contained in:
couriersud 2020-01-19 20:59:31 +01:00
parent 0f69abe4dc
commit ee0e0c972c
7 changed files with 494 additions and 79 deletions

View file

@ -2821,6 +2821,8 @@ files {
MAME_DIR .. "src/mame/audio/galaxian.cpp",
MAME_DIR .. "src/mame/audio/galaxian.h",
MAME_DIR .. "src/mame/video/galaxian.cpp",
MAME_DIR .. "src/mame/audio/nl_konami.h",
MAME_DIR .. "src/mame/audio/nl_konami.cpp",
MAME_DIR .. "src/mame/drivers/galaxold.cpp",
MAME_DIR .. "src/mame/includes/galaxold.h",
MAME_DIR .. "src/mame/machine/galaxold.cpp",

View file

@ -51,6 +51,7 @@ SOUNDS["TMS5220"] = true
SOUNDS["BEEP"] = true
SOUNDS["VOLT_REG"] = true
SOUNDS["SPEAKER"] = true
SOUNDS["DIGITALKER"] = true
--------------------------------------------------
-- specify available video cores
@ -184,6 +185,17 @@ files{
MAME_DIR .. "src/mame/includes/cheekyms.h",
MAME_DIR .. "src/mame/video/cheekyms.cpp",
MAME_DIR .. "src/mame/drivers/galaxian.cpp",
MAME_DIR .. "src/mame/includes/galaxian.h",
MAME_DIR .. "src/mame/audio/galaxian.cpp",
MAME_DIR .. "src/mame/audio/galaxian.h",
MAME_DIR .. "src/mame/video/galaxian.cpp",
MAME_DIR .. "src/mame/audio/nl_konami.h",
MAME_DIR .. "src/mame/audio/nl_konami.cpp",
MAME_DIR .. "src/mame/audio/cclimber.cpp",
MAME_DIR .. "src/mame/audio/cclimber.h",
MAME_DIR .. "src/mame/audio/nl_zac1b11142.cpp",
MAME_DIR .. "src/mame/audio/nl_zacc1b11142.h",
MAME_DIR .. "src/mame/audio/zaccaria.cpp",

View file

@ -0,0 +1,183 @@
// license:CC0
// copyright-holders:Couriersud
#include "netlist/devices/net_lib.h"
#ifdef NLBASE_H_
#error Somehow nl_base.h made it into the include chain.
#endif
static NETLIST_START(filter)
CD4066_GATE(G1)
PARAM(G1.BASER, 270.0)
CD4066_GATE(G2)
PARAM(G2.BASER, 270.0)
RES(RI, RES_K(1))
RES(RO, RES_K(5))
CAP(C1, CAP_U(0.22))
CAP(C2, CAP_U(0.047))
NET_C(RI.2, RO.1, G1.R.1, G2.R.1)
NET_C(G1.R.2, C1.1)
NET_C(G2.R.2, C2.1)
NET_C(C1.2, C2.2, G1.VSS, G2.VSS)
NET_C(G1.VDD, G2.VDD)
ALIAS(I, RI.1)
ALIAS(O, RO.2)
ALIAS(CTL1, G1.CTL)
ALIAS(CTL2, G2.CTL)
ALIAS(VDD, G1.VDD)
ALIAS(VSS, G1.VSS)
NETLIST_END()
static NETLIST_START(amp)
UA741_DIP8(X3A)
RES(R1, RES_K(2.2))
RES(R2, RES_K(4.7))
RES(VR, 200) // Actually a potentiometer
CAP(C1, CAP_U(0.15))
RES(RI, RES_K(100))
NET_C(X3A.2, R1.1)
NET_C(X3A.6, R1.2, R2.1)
NET_C(R2.2, VR.1)
NET_C(VR.1, C1.1) // 100% pot position
NET_C(C1.2, RI.1)
NET_C(GND, VR.2, RI.2)
// Amplifier M51516L, assume input RI 100k
ALIAS(OPAMP, X3A.2)
ALIAS(OUT, RI.1)
ALIAS(VP, X3A.7)
ALIAS(VM, X3A.4)
ALIAS(GND, X3A.3)
NETLIST_END()
static NETLIST_START(AY1)
TTL_INPUT(CTL0, 0)
TTL_INPUT(CTL1, 0)
TTL_INPUT(CTL2, 0)
TTL_INPUT(CTL3, 0)
TTL_INPUT(CTL4, 0)
TTL_INPUT(CTL5, 0)
/* AY 8910 internal resistors */
RES(R_AY3D_A, 1000)
RES(R_AY3D_B, 1000)
RES(R_AY3D_C, 1000)
NET_C(VP5, R_AY3D_A.1, R_AY3D_B.1, R_AY3D_C.1)
SUBMODEL(filter, FCHA1)
NET_C(FCHA1.I, R_AY3D_A.2)
SUBMODEL(filter, FCHB1)
NET_C(FCHB1.I, R_AY3D_B.2)
SUBMODEL(filter, FCHC1)
NET_C(FCHC1.I, R_AY3D_C.2)
NET_C(FCHA1.CTL1, CTL0)
NET_C(FCHA1.CTL2, CTL1)
NET_C(FCHB1.CTL1, CTL2)
NET_C(FCHB1.CTL2, CTL3)
NET_C(FCHC1.CTL1, CTL4)
NET_C(FCHC1.CTL2, CTL5)
NET_C(VP5, FCHA1.VDD, FCHB1.VDD, FCHC1.VDD)
NET_C(GND, FCHA1.VSS, FCHB1.VSS, FCHC1.VSS)
NET_C(VP5, CTL0.VCC, CTL1.VCC, CTL2.VCC, CTL3.VCC, CTL4.VCC, CTL5.VCC)
NET_C(GND, CTL0.GND, CTL1.GND, CTL2.GND, CTL3.GND, CTL4.GND, CTL5.GND)
NETLIST_END()
static NETLIST_START(AY2)
TTL_INPUT(CTL6, 0)
TTL_INPUT(CTL7, 0)
TTL_INPUT(CTL8, 0)
TTL_INPUT(CTL9, 0)
TTL_INPUT(CTL10, 0)
TTL_INPUT(CTL11, 0)
/* AY 8910 internal resistors */
RES(R_AY3C_A, 1000)
RES(R_AY3C_B, 1000)
RES(R_AY3C_C, 1000)
NET_C(VP5, R_AY3C_A.1, R_AY3C_B.1, R_AY3C_C.1)
SUBMODEL(filter, FCHA2)
NET_C(FCHA2.I, R_AY3C_A.2)
SUBMODEL(filter, FCHB2)
NET_C(FCHB2.I, R_AY3C_B.2)
SUBMODEL(filter, FCHC2)
NET_C(FCHC2.I, R_AY3C_C.2)
NET_C(FCHA2.CTL1, CTL6)
NET_C(FCHA2.CTL2, CTL7)
NET_C(FCHB2.CTL1, CTL8)
NET_C(FCHB2.CTL2, CTL9)
NET_C(FCHC2.CTL1, CTL10)
NET_C(FCHC2.CTL2, CTL11)
NET_C(VP5, FCHA2.VDD, FCHB2.VDD, FCHC2.VDD)
NET_C(GND, FCHA2.VSS, FCHB2.VSS, FCHC2.VSS)
NET_C(VP5, CTL6.VCC, CTL7.VCC, CTL8.VCC, CTL9.VCC, CTL10.VCC, CTL11.VCC)
NET_C(GND, CTL6.GND, CTL7.GND, CTL8.GND, CTL9.GND, CTL10.GND, CTL11.GND)
NETLIST_END()
NETLIST_START(konami2x)
SOLVER(Solver, 48000)
ANALOG_INPUT(VP5, 5)
ANALOG_INPUT(VM5, -5)
LOCAL_SOURCE(filter)
LOCAL_SOURCE(amp)
LOCAL_SOURCE(AY1)
LOCAL_SOURCE(AY2)
INCLUDE(AY1)
INCLUDE(AY2)
NET_C(FCHA1.O, FCHB1.O, FCHC1.O, FCHA2.O, FCHB2.O, FCHC2.O)
SUBMODEL(amp, AMP)
NET_C(VP5, AMP.VP)
NET_C(GND, AMP.GND)
NET_C(VM5, AMP.VM)
NET_C(FCHA1.O, AMP.OPAMP)
ALIAS(OUT, AMP.OUT)
NETLIST_END()
NETLIST_START(konami1x)
SOLVER(Solver, 48000)
ANALOG_INPUT(VP5, 5)
ANALOG_INPUT(VM5, -5)
LOCAL_SOURCE(filter)
LOCAL_SOURCE(amp)
LOCAL_SOURCE(AY1)
LOCAL_SOURCE(AY2)
INCLUDE(AY1)
NET_C(FCHA1.O, FCHB1.O, FCHC1.O)
SUBMODEL(amp, AMP)
NET_C(VP5, AMP.VP)
NET_C(GND, AMP.GND)
NET_C(VM5, AMP.VM)
NET_C(FCHA1.O, AMP.OPAMP)
ALIAS(OUT, AMP.OUT)
NETLIST_END()

View file

@ -0,0 +1,7 @@
// license:CC0
// copyright-holders:Couriersud
#include "netlist/nl_setup.h"
NETLIST_EXTERNAL(konami1x)
NETLIST_EXTERNAL(konami2x)

View file

@ -667,6 +667,8 @@ TODO:
#include "screen.h"
#include "speaker.h"
#include "audio/nl_konami.h"
/*************************************
*
* Interrupts
@ -817,28 +819,34 @@ READ8_MEMBER(galaxian_state::konami_sound_timer_r)
0x0e; /* assume remaining bits are high, except B0 which is grounded */
}
WRITE8_MEMBER(galaxian_state::konami_sound_filter_w)
{
if (m_discrete != nullptr)
if (m_netlist != nullptr)
{
/* the offset is used as data, 6 channels * 2 bits each */
/* AV0 .. AV5 ==> AY8910 #2 */
/* AV6 .. AV11 ==> AY8910 #1 */
/* AV0 .. AV5 ==> AY8910 #2 - 3C */
/* AV6 .. AV11 ==> AY8910 #1 - 3D */
static int last = 0;
if (offset != last)
printf("filter %04x\n", offset);
for (int which = 0; which < 2; which++)
{
if (m_ay8910[which] != nullptr)
{
for (int chan = 0; chan < 3; chan++)
if (offset != last)
printf("filter%d %04x\n", which, (offset >> (6*(1-which))) & 0x3f);
for (int flt = 0; flt < 6; flt++)
{
uint8_t bits = (offset >> (2 * chan + 6 * (1 - which))) & 3;
const int fltnum = (flt + 6 * which);
const uint8_t bit = (offset >> (flt + 6 * (1 - which))) & 1;
/* low bit goes to 0.22uF capacitor = 220000pF */
/* high bit goes to 0.047uF capacitor = 47000pF */
m_discrete->write(NODE(3 * which + chan + 11), bits);
m_filter_ctl[fltnum]->write(bit);
}
}
}
last = offset;
}
}
@ -5924,62 +5932,6 @@ static GFXDECODE_START(gfx_videight)
GFXDECODE_END
/*************************************
*
* Sound configuration
*
*************************************/
static const discrete_mixer_desc konami_sound_mixer_desc =
{DISC_MIXER_IS_OP_AMP,
{RES_K(5.1), RES_K(5.1), RES_K(5.1), RES_K(5.1), RES_K(5.1), RES_K(5.1)},
{0,0,0,0,0,0}, /* no variable resistors */
{0,0,0,0,0,0}, /* no node capacitors */
0, RES_K(2.2),
0,
0, /* modelled separately */
0, 1};
static DISCRETE_SOUND_START( konami_sound_discrete )
DISCRETE_INPUTX_STREAM(NODE_01, 0, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_02, 1, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_03, 2, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_04, 3, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_05, 4, 1.0, 0)
DISCRETE_INPUTX_STREAM(NODE_06, 5, 1.0, 0)
DISCRETE_INPUT_DATA(NODE_11)
DISCRETE_INPUT_DATA(NODE_12)
DISCRETE_INPUT_DATA(NODE_13)
DISCRETE_INPUT_DATA(NODE_14)
DISCRETE_INPUT_DATA(NODE_15)
DISCRETE_INPUT_DATA(NODE_16)
DISCRETE_RCFILTER_SW(NODE_21, 1, NODE_01, NODE_11, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_RCFILTER_SW(NODE_22, 1, NODE_02, NODE_12, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_RCFILTER_SW(NODE_23, 1, NODE_03, NODE_13, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_RCFILTER_SW(NODE_24, 1, NODE_04, NODE_14, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_RCFILTER_SW(NODE_25, 1, NODE_05, NODE_15, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_RCFILTER_SW(NODE_26, 1, NODE_06, NODE_16, AY8910_INTERNAL_RESISTANCE+1000, CAP_U(0.22), CAP_U(0.047), 0, 0)
DISCRETE_MIXER6(NODE_30, 1, NODE_21, NODE_22, NODE_23, NODE_24, NODE_25, NODE_26, &konami_sound_mixer_desc)
/* FIXME the amplifier M51516L has a decay circuit */
/* This is handled with sound_global_enable but */
/* belongs here. */
/* Input impedance of a M51516L is typically 30k (datasheet) */
DISCRETE_CRFILTER(NODE_40,NODE_30,RES_K(30),CAP_U(0.15))
DISCRETE_OUTPUT(NODE_40, 10.0 )
DISCRETE_SOUND_END
/*************************************
*
@ -6052,15 +6004,32 @@ void galaxian_state::konami_sound_1x_ay8910(machine_config &config)
/* sound hardware */
AY8910(config, m_ay8910[0], KONAMI_SOUND_CLOCK/8);
m_ay8910[0]->set_flags(AY8910_DISCRETE_OUTPUT);
m_ay8910[0]->set_resistors_load(RES_K(5.1), RES_K(5.1), RES_K(5.1));
m_ay8910[0]->set_flags(AY8910_RESISTOR_OUTPUT);
m_ay8910[0]->set_resistors_load(1000.0, 1000.0, 1000.0);
m_ay8910[0]->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
m_ay8910[0]->port_b_read_callback().set(FUNC(galaxian_state::frogger_sound_timer_r));
m_ay8910[0]->add_route(0, "konami", 1.0, 0);
m_ay8910[0]->add_route(1, "konami", 1.0, 1);
m_ay8910[0]->add_route(2, "konami", 1.0, 2);
DISCRETE(config, m_discrete, konami_sound_discrete).add_route(ALL_OUTPUTS, "speaker", 0.75);
NETLIST_SOUND(config, "konami", 48000)
.set_source(netlist_konami1x)
.add_route(ALL_OUTPUTS, "speaker", 1.0);
// Filter
NETLIST_LOGIC_INPUT(config, "konami:ctl0", "CTL0.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl1", "CTL1.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl2", "CTL2.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl3", "CTL3.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl4", "CTL4.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl5", "CTL5.IN", 0);
// CHA1 - 3D
NETLIST_STREAM_INPUT(config, "konami:cin0", 0, "R_AY3D_A.R");
NETLIST_STREAM_INPUT(config, "konami:cin1", 1, "R_AY3D_B.R");
NETLIST_STREAM_INPUT(config, "konami:cin2", 2, "R_AY3D_C.R");
NETLIST_STREAM_OUTPUT(config, "konami:cout0", 0, "OUT").set_mult_offset(30000.0 / 0.05, 0.0);
}
@ -6075,8 +6044,8 @@ void galaxian_state::konami_sound_2x_ay8910(machine_config &config)
/* sound hardware */
AY8910(config, m_ay8910[0], KONAMI_SOUND_CLOCK/8);
m_ay8910[0]->set_flags(AY8910_DISCRETE_OUTPUT);
m_ay8910[0]->set_resistors_load(RES_K(5.1), RES_K(5.1), RES_K(5.1));
m_ay8910[0]->set_flags(AY8910_RESISTOR_OUTPUT);
m_ay8910[0]->set_resistors_load(1000.0, 1000.0, 1000.0);
m_ay8910[0]->port_a_read_callback().set(m_soundlatch, FUNC(generic_latch_8_device::read));
m_ay8910[0]->port_b_read_callback().set(FUNC(galaxian_state::konami_sound_timer_r));
m_ay8910[0]->add_route(0, "konami", 1.0, 0);
@ -6084,13 +6053,40 @@ void galaxian_state::konami_sound_2x_ay8910(machine_config &config)
m_ay8910[0]->add_route(2, "konami", 1.0, 2);
AY8910(config, m_ay8910[1], KONAMI_SOUND_CLOCK/8);
m_ay8910[1]->set_flags(AY8910_DISCRETE_OUTPUT);
m_ay8910[1]->set_resistors_load(RES_K(5.1), RES_K(5.1), RES_K(5.1));
m_ay8910[1]->set_flags(AY8910_RESISTOR_OUTPUT);
m_ay8910[1]->set_resistors_load(1000.0, 1000.0, 1000.0);
m_ay8910[1]->add_route(0, "konami", 1.0, 3);
m_ay8910[1]->add_route(1, "konami", 1.0, 4);
m_ay8910[1]->add_route(2, "konami", 1.0, 5);
DISCRETE(config, m_discrete, konami_sound_discrete).add_route(ALL_OUTPUTS, "speaker", 0.5);
NETLIST_SOUND(config, "konami", 48000)
.set_source(netlist_konami2x)
.add_route(ALL_OUTPUTS, "speaker", 1.0);
// Filter
NETLIST_LOGIC_INPUT(config, "konami:ctl0", "CTL0.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl1", "CTL1.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl2", "CTL2.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl3", "CTL3.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl4", "CTL4.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl5", "CTL5.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl6", "CTL6.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl7", "CTL7.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl8", "CTL8.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl9", "CTL9.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl10", "CTL10.IN", 0);
NETLIST_LOGIC_INPUT(config, "konami:ctl11", "CTL11.IN", 0);
// CHA1 - 3D
NETLIST_STREAM_INPUT(config, "konami:cin0", 0, "R_AY3D_A.R");
NETLIST_STREAM_INPUT(config, "konami:cin1", 1, "R_AY3D_B.R");
NETLIST_STREAM_INPUT(config, "konami:cin2", 2, "R_AY3D_C.R");
// CHA2 - 3C
NETLIST_STREAM_INPUT(config, "konami:cin3", 3, "R_AY3C_A.R");
NETLIST_STREAM_INPUT(config, "konami:cin4", 4, "R_AY3C_B.R");
NETLIST_STREAM_INPUT(config, "konami:cin5", 5, "R_AY3C_C.R");
NETLIST_STREAM_OUTPUT(config, "konami:cout0", 0, "OUT").set_mult_offset(30000.0 / 0.05, 0.0);
}
@ -6701,10 +6697,6 @@ void galaxian_state::turpins(machine_config &config) // the ROMs came from a bli
void galaxian_state::anteater(machine_config &config)
{
scobra(config);
/* quiet down the sounds */
m_discrete->reset_routes();
m_discrete->add_route(ALL_OUTPUTS, "speaker", 0.25);
}

View file

@ -16,7 +16,7 @@
#include "sound/ay8910.h"
#include "sound/dac.h"
#include "sound/digitalk.h"
#include "sound/discrete.h"
#include "machine/netlist.h"
#include "emupal.h"
#include "screen.h"
#include "tilemap.h"
@ -74,7 +74,8 @@ public:
, m_screen(*this, "screen")
, m_palette(*this, "palette")
, m_soundlatch(*this, "soundlatch")
, m_discrete(*this, "konami")
, m_netlist(*this, "konami")
, m_filter_ctl(*this, "konami:ctl%u", 0)
, m_fake_select(*this, "FAKE_SELECT")
, m_tenspot_game_dsw(*this, {"IN2_GAME0", "IN2_GAME1", "IN2_GAME2", "IN2_GAME3", "IN2_GAME4", "IN2_GAME5", "IN2_GAME6", "IN2_GAME7", "IN2_GAME8", "IN2_GAME9"})
, m_spriteram(*this, "spriteram")
@ -424,8 +425,8 @@ protected:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
optional_device<generic_latch_8_device> m_soundlatch;
optional_device<discrete_sound_device> m_discrete;
optional_device<netlist_mame_sound_device> m_netlist;
optional_device_array<netlist_mame_logic_input_device, 12> m_filter_ctl;
optional_ioport m_fake_select;
optional_ioport_array<10> m_tenspot_game_dsw;

View file

@ -20,6 +20,224 @@
1942p // prototype
1942h // hack (Two Bit Score?)
/* FIXME: games commented out complain about being a clone of a game not in the driver */
@source:galaxian.cpp
600 // GX353 (c) 1981 Konami
amidar // GX337 (c) 1982 Konami
amidar1 // GX337 (c) 1981 Konami
amidarb // bootleg
amidaro // GX337 (c) 1982 Konami + Olympia license
amidars // GX337 (c) 1982 Konami
amidaru // GX337 (c) 1982 Konami + Stern license
amigo // bootleg
amigo2 // bootleg
anteater // (c) 1982 Tago
anteaterg // (c) 1983 TV-Tuning (F.E.G. license)
anteatergg // bootleg
anteateruk // (c) 1983 Free Enterprise Games
aracnis // bootleg
armorcar // (c) 1981 Stern
armorcar2 // (c) 1981 Stern
asideral // bootleg
astrians //
atlantis // (c) 1981 Comsoft
atlantis2 // (c) 1981 Comsoft
atlantisb // bootleg
azurian // (c) 1982 Rait Electronics Ltd
//batman2 // bootleg
blkhole // TDS (Tokyo Denshi Sekkei) & MINTS
bomber //
calipso // (c) 1982 Tago
catacomb // 1982 MTM Games
checkman // (c) 1982 Zilec-Zenitone
checkmanj // (c) 1982 Jaleco (Zenitone/Zilec in ROM CM4, and the programmer names)
chewing // ?? unknown
//devilfsg // (c) 1984 Vision / Artic (bootleg?)
dingo // (c) 1983 Ashby Computers and Graphics LTD. + Jaleco license
dingoe // (c) 1983 Ashby Computers and Graphics LTD. + Jaleco license
eagle // [1980] Centuri
eagle2 // [1980] Centuri
eagle3 // [1980] Centuri
exodus // Subelectro - bootleg?
explorer // bootleg
fantastc // (c) Taito (Brazil) - rewrite of Galaga
fantazia // bootleg
frogf // bootleg
frogg // bootleg
frogger // GX392 (c) 1981 Konami
froggeram // bootleg
froggermc // 800-3110 (c) 1981 Sega
froggers // bootleg
froggers1 // (c) 1981 Sega
froggers2 // 834-0068 (c) 1981 Sega
froggers3 //
froggrs //
froggervd // Video Dens
fourplay // multigame
galap1 // hack
galap4 // hack
galapx // hack
galaxbsf // hack
galaxbsf2 // bootleg
galaxian // (c) Namco
galaxiana // (c) Namco
galaxianbl // bootleg
galaxianbl2 // bootleg
galaxiani // (c) Irem
galaxianm // (c) Midway
galaxianmo // (c) Midway
galaxiant // (c) Taito
galaxrcgg // bootleg (Recreativos Covadonga)
galaxrf // bootleg (Recreativos Franco)
galaxrfgg // bootleg (Recreativos Franco)
galemp // (c) Taito do Brasil
galturbo // hack
//ghostmun //
gmgalax // bootleg
gteikoku // (c) Irem
gteikokub // bootleg
gteikokub2 // bootleg
gteikokub3 // bootleg (Honly Enterprises)
jumpbug // (c) 1981 Rock-ola
jumpbugb // (c) 1981 Sega
//jungsub // bootleg
kamakazi3 // Video Games (UK) Ltd., hack or bootleg?
kamikazp // bootleg (Potomac Games)
kingball // (c) 1980 Namco
kingballj // (c) 1980 Namco
kong // (c) Taito (Brazil) - rewrite of Donkey Kong
//ladybugg // bootleg
levers // (c) 1983 Rock-ola
losttomb // (c) 1982 Stern
losttombh // (c) 1982 Stern
luctoday // 1980 Sigma
mandinga // bootleg (Artemi)
mandingaeg // bootleg (Electrogame)
mandingarf // bootleg (Recreativos Franco S.A.)
mandingac // bootleg (Centromatic)
mltiwars // bootleg (Gayton Games)
monsterz // (c) 1982 Nihon (Arcade TV Game List - P.102, Left, 20 from top)
moonal2 // [1980] Nichibutsu
moonal2b // [1980] Nichibutsu
moonaln // [Nichibutsu] (Karateco license) or hack
mooncmw // bootleg
mooncptc // bootleg (Petaco S.A.)
mooncreg // bootleg
mooncrgx // bootleg
mooncrs2 // bootleg
mooncrs3 // bootleg
mooncrs4 // bootleg
mooncrs5 // bootleg
mooncrsb // bootleg
mooncrsl // bootleg (Laguna S.A.)
mooncrst // (c) 1980 Nichibutsu
mooncrstg // (c) 1980 Gremlin
mooncrstso // (c) 1980 SegaSA / Sonic
mooncrsto // (c) 1980 Nichibutsu
mooncrstu // (c) 1980 Nichibutsu USA
mooncrstuk // (c) 1980 Nichibutsu UK
mooncrstuku // (c) 1980 Nichibutsu UK
moonqsr // (c) 1980 Nichibutsu
moonwar // (c) 1981 Stern
moonwara // (c) 1981 Stern
mshuttle // (c) 1981 Nichibutsu
mshuttle2 // (c) 1981 Nichibutsu
mshuttlea // (c) 1981 Nichibutsu
mshuttlej // (c) 1981 Nichibutsu
mshuttlej2 // (c) 1981 Nichibutsu
ncentury // bootleg (Petaco S.A.)
offensiv // bootleg (Video Dens)
omegab // bootleg
omni // bootleg
orbitron // (c) 1982 Signatron USA (Arcade Tv Game List - P.160, Left, 22 from top)
//pacmanbl // bootleg
//pacmanbla // bootleg
//pacmanblb // bootleg
//pacmanblv // bootleg (Video Dens)
pajaroes // bootleg
//phoenxp2 // bootleg
pisces // Subelectro
piscesb // bootleg
quaak // bootleg
redufo // (c) Artic
redufob // bootleg
redufob2 // bootleg
scobra // GX316 (c) 1981 Konami
scobrab // GX316 (c) 1981 Karateco (bootleg?)
scobrae // GX316 (c) 1981 Stern
scobrae2 //
scobrag // AVG by Zaccaria (bootleg?)
scobraggi // bootleg (Cocamatic)
scobras // GX316 (c) 1981 Stern
scobrase // GX316 (c) 1981 Sega
scorpion // (c) 1982 Zaccaria
scorpiona // (c) 1982 Zaccaria
scorpionb // (c) 1982 Zaccaria
scorpionmc // bootleg
scramble // GX387 (c) 1981 Konami
scramblebb // bootleg?
kamikazesp // bootleg (Euromatic S.A.)
scramblebf // bootleg
scrambles // GX387 (c) 1981 Stern
scrambles2 // GX387 (c) 1981 Stern
scrambp // bootleg (Billport S.A.)
scramce // bootleg (Centromatic S.A.)
scrammr // bootleg (Model Racing)
scrampt // bootleg (Petaco S.A.)
scramrf // bootleg (Recreativos Franco)
sfx // (c) 1983 Nichibutsu
skelagon // (c) 1983 Nichibutsu USA
skybase // (c) 1982 Omori Electric Co., Ltd.
skyraidr // bootleg
smooncrs // Gremlin
spacbat2 // bootleg
spacbatt // bootleg
spacempr // bootleg
spactrai //
spcdrag // bootleg
spcdraga // bootleg
spctbird // (c) Fortrek
spdcoin // (c) 1984 Stern
sstarcrs // Taito (Brazil)
starfght // hack
starfgmc // bootleg
stera // bootleg
streakng // [1980] Shoei
streaknga // [1980] Shoei
strfbomb // bootleg
superbon // bootleg
superg // hack
supergs // Silver Systems hack
supergx // [1980] Nichibutsu
suprheli // bootleg
swarm // hack
tazmania // (c) 1982 Stern
tdpgal // 1983 Design Labs / Thomas Automatics
tenspot // (c) 1982 Thomas Automatics
theend // (c) 1980 Konami
takeoff // (c) 1980 Sidam (bootleg)
theends // (c) 1980 Stern
//thepitm // bootleg
timefgtr // (c) Taito (Brazil) - rewrite of Time Pilot
tst_galx // Galaxian Test ROM
turpin // (c) 1981 Sega
turpins // (c) 1981 bootleg
turtles // (c) 1981 Stern
uniwars // (c) Irem
uniwarsa // (c) Karateco
victoryc // (c) Comsoft
victorycb // (c) Comsoft (bootleg)
videight // multigame
warofbug // (c) 1981 Armenia
warofbugg // German Version
warofbugu // (c) 1981 Armenia
zerotime // hack (Petaco S.A.)
zerotimed // hack (Datamat)
zerotimemc // hack (Marti Colls)
zigzagb // (c) 1982 LAX (bootleg)
zigzagb2 // (c) 1982 LAX (bootleg)
@source:gamemachine.cpp
2001tgm //