alvg: agsoccer and usafootb playable.

This commit is contained in:
Robbbert 2022-02-23 09:20:43 +11:00
parent c17b6c5dd9
commit 2927916c60

View File

@ -24,13 +24,29 @@ Other games:
- USA Football (redemption)
- USA Football (head to head)
Here are the key codes to enable play:
Game Start game End ball
---------------------------------------------------------------------------------------------
agsoccer, agsoccera, agsoccer07 Hold N, hit 8 (timed game)
usafoot Hold N, hit 8 (timed game)
usafoota Hold N and Quote, hit 8 (timed game)
Dinosaur Eggs (mnw)
Punchy the Clown (mnw)
Al's Garage Band Goes On A World Tour (mnw)
Mystery Castle (mnw)
Pistol Poker (mnw)
Status:
- Skeletons
- A G Soccer, USA Football: Playable.
- Dinosaur Eggs, Punchy: Show a display then freeze
- Others: Skeletons
ToDo:
- Add bsmt-based sound card
- Display
- Inputs not working
- DMD Display
- Dinosaur Eggs: Soundcard crash at start
- Dinosaur Eggs, Punchy: Freeze at start
- Mechanical sounds
****************************************************************************************************/
@ -69,6 +85,13 @@ public:
{ }
void alvg(machine_config &config);
void group1(machine_config &config);
void group2(machine_config &config);
void group3(machine_config &config);
void pca002(machine_config &config); // Gen 1 sound board
void pca003(machine_config &config); // Alphanumeric display
void pca008(machine_config &config); // Gen 2 sound board
void pca021(machine_config &config); // DMD
private:
void main_map(address_map &map);
@ -97,13 +120,13 @@ private:
u16 m_lamp_data = 0U;
u8 m_strobe = 0U;
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
required_device<okim6295_device> m_oki;
optional_device<cpu_device> m_audiocpu;
optional_device<okim6295_device> m_oki;
required_device<i8255_device> m_ppi0;
required_device<i8255_device> m_ppi1;
required_device<i8255_device> m_ppi2;
required_device<i8255_device> m_ppi3;
required_device<via6522_device> m_via;
optional_device<i8255_device> m_ppi3;
optional_device<via6522_device> m_via;
required_device<via6522_device> m_via0;
required_device<via6522_device> m_via1;
required_ioport_array<13> m_io_keyboard;
@ -120,7 +143,7 @@ void alvg_state::main_map(address_map &map)
map(0x2400, 0x2403).mirror(0x3f0).rw(m_ppi1, FUNC(i8255_device::read), FUNC(i8255_device::write)); // U13
map(0x2800, 0x2803).mirror(0x3f0).rw(m_ppi2, FUNC(i8255_device::read), FUNC(i8255_device::write)); // U14
map(0x2c00, 0x2c00).mirror(0x37f).w(FUNC(alvg_state::display_w));
map(0x2c80, 0x2c83).mirror(0x37c).rw(m_ppi3, FUNC(i8255_device::read), FUNC(i8255_device::write)); // IC1 on display board
map(0x2c80, 0x2c83).mirror(0x37c).lrw8(NAME([this] (offs_t offset) -> u8 { return m_ppi3->read(offset^3); }), NAME([this] (offs_t offset, u8 data) { m_ppi3->write(offset^3, data); })); // IC1 on display board
map(0x3800, 0x380f).mirror(0x3f0).m("via1", FUNC(via6522_device::map)); // U8
map(0x3c00, 0x3c0f).mirror(0x3f0).m("via0", FUNC(via6522_device::map)); // U7
}
@ -245,7 +268,7 @@ static INPUT_PORTS_START( alvg )
PORT_START("X12") // DIAGS
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER_PAD) PORT_NAME("Enter")
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Test")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_CODE(KEYCODE_0_PAD) PORT_NAME("Test") // Manual incorrectly says 0x20
INPUT_PORTS_END
void alvg_state::ppi2_pc_w(u8 data)
@ -265,7 +288,7 @@ void alvg_state::ppi3_pa_w(u8 data)
void alvg_state::ppi3_pb_w(u8 data)
{
u16 t = m_digits[m_strobe] & 0xff;
m_digits[m_strobe] = t | (data << 8);
m_digits[m_strobe] = t | (bitswap<8>(data, 7, 6, 3, 2, 5, 4, 1, 0) << 8);
}
void alvg_state::ppi3_pc_w(u8 data)
@ -277,7 +300,7 @@ void alvg_state::ppi3_pc_w(u8 data)
void alvg_state::display_w(offs_t offset, u8 data)
{
u16 t = m_digits[m_strobe+20] & 0xff;
m_digits[m_strobe+20] = t | (data << 8);
m_digits[m_strobe+20] = t | (bitswap<8>(data, 7, 6, 3, 2, 5, 4, 1, 0) << 8);
}
void alvg_state::via_pb_w(u8 data)
@ -294,6 +317,8 @@ void alvg_state::via1_pb_w(u8 data)
if (m_strobe > 19)
m_strobe = 0;
}
if (BIT(data, 5))
m_strobe = 0;
}
u8 alvg_state::via0_pa_r()
@ -325,6 +350,43 @@ void alvg_state::machine_reset()
m_strobe = 0U;
}
void alvg_state::pca002(machine_config &config)
{
MC6809(config, m_audiocpu, XTAL(8'000'000)); // 68B09, 8 MHz crystal, internal divide by 4 to produce E/Q outputs
m_audiocpu->set_addrmap(AS_PROGRAM, &alvg_state::audio_map);
MOS6522(config, m_via, XTAL(8'000'000) / 4); // uses E clock from audiocpu; port A = read sound code; port B = ticket machine
m_via->writepb_handler().set(FUNC(alvg_state::via_pb_w));
m_via->irq_handler().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
SPEAKER(config, "mono").front_center();
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(8'000'000) / 2));
ymsnd.irq_handler().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
}
void alvg_state::pca003(machine_config &config)
{
/* Video */
config.set_default_layout(layout_alvg);
I8255A(config, m_ppi3); // U14
m_ppi3->out_pa_callback().set(FUNC(alvg_state::ppi3_pa_w));
m_ppi3->out_pb_callback().set(FUNC(alvg_state::ppi3_pb_w));
m_ppi3->out_pc_callback().set(FUNC(alvg_state::ppi3_pc_w));
}
void alvg_state::pca008(machine_config &config)
{
}
void alvg_state::pca021(machine_config &config)
{
}
void alvg_state::alvg(machine_config &config)
{
/* basic machine hardware */
@ -333,9 +395,6 @@ void alvg_state::alvg(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
/* Video */
config.set_default_layout(layout_alvg);
MOS6522(config, m_via0, XTAL(4'000'000) / 2); // U7, uses clock2 from maincpu; switch inputs
m_via0->readpa_handler().set(FUNC(alvg_state::via0_pa_r));
m_via0->readpb_handler().set(FUNC(alvg_state::via0_pb_r));
@ -368,33 +427,29 @@ void alvg_state::alvg(machine_config &config)
m_ppi2->out_pb_callback().set(FUNC(alvg_state::ppi2_pb_w)); // Lamps
m_ppi2->out_pc_callback().set(FUNC(alvg_state::ppi2_pc_w)); // Lamps
I8255A(config, m_ppi3); // U14
m_ppi3->out_pa_callback().set(FUNC(alvg_state::ppi3_pa_w)); // Alpha Display
m_ppi3->out_pb_callback().set(FUNC(alvg_state::ppi3_pb_w)); // Alpha Display
m_ppi3->out_pc_callback().set(FUNC(alvg_state::ppi3_pc_w)); // Alpha Display
// Sound
MC6809(config, m_audiocpu, XTAL(8'000'000)); // 68B09, 8 MHz crystal, internal divide by 4 to produce E/Q outputs
m_audiocpu->set_addrmap(AS_PROGRAM, &alvg_state::audio_map);
MOS6522(config, m_via, XTAL(8'000'000) / 4); // uses E clock from audiocpu; port A = read sound code; port B = ticket machine
//m_via->readpa_handler().set(FUNC(alvg_state::via_pa_r));
//m_via->readpb_handler().set(FUNC(alvg_state::via_pb_r));
//m_via->writepa_handler().set(FUNC(alvg_state::via_pa_w));
m_via->writepb_handler().set(FUNC(alvg_state::via_pb_w));
//m_via->ca2_handler().set_nop();
//m_via->cb2_handler().set_nop();
m_via->irq_handler().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
genpin_audio(config);
}
SPEAKER(config, "mono").front_center();
ym3812_device &ymsnd(YM3812(config, "ymsnd", XTAL(8'000'000) / 2));
ymsnd.irq_handler().set_inputline(m_audiocpu, M6809_FIRQ_LINE);
ymsnd.add_route(ALL_OUTPUTS, "mono", 1.0);
void alvg_state::group1(machine_config &config)
{
alvg(config);
pca003(config); // A-N display
pca002(config); // Gen 1 sound
}
OKIM6295(config, m_oki, XTAL(8'000'000) / 8, okim6295_device::PIN7_HIGH);
m_oki->add_route(ALL_OUTPUTS, "mono", 0.50);
void alvg_state::group2(machine_config &config)
{
alvg(config);
pca003(config); // A-N display
pca008(config); // Gen 2 sound
}
void alvg_state::group3(machine_config &config)
{
alvg(config);
pca021(config); // DMD
pca008(config); // Gen 2 sound
}
/*----------------------------------------------------------------------------
@ -737,18 +792,18 @@ ROM_END
} // Anonymous namespace
GAME( 1991, agsoccer, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R18u, 2.5L sound)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1991, agsoccera, agsoccer, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R18u, 2.1 sound)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1991, agsoccer07, agsoccer, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R07u)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour2, wrldtour, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour (R02b)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour3, wrldtour, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour (R06a)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, usafootb, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "U.S.A. Football", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, usafootba, usafootb, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "U.S.A. Football (R01u)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, mystcast, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Mystery Castle (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, mystcasta, mystcast, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Mystery Castle (R03)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, pstlpkr, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Pistol Poker (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, pstlpkr1, pstlpkr, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Pistol Poker (R01)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, punchy, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Punchy The Clown (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, punchy3, punchy, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Punchy The Clown (R03)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, dinoeggs, 0, alvg, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Dinosaur Eggs", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1991, agsoccer, 0, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R18u, 2.5L sound)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1991, agsoccera, agsoccer, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R18u, 2.1 sound)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1991, agsoccer07, agsoccer, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "A.G. Soccer Ball (R07u)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour, 0, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour2, wrldtour, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour (R02b)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1992, wrldtour3, wrldtour, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Al's Garage Band Goes On A World Tour (R06a)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, usafootb, 0, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "U.S.A. Football", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, usafootba, usafootb, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "U.S.A. Football (R01u)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, mystcast, 0, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Mystery Castle (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, mystcasta, mystcast, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Mystery Castle (R03)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, pstlpkr, 0, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Pistol Poker (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, pstlpkr1, pstlpkr, group3, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Pistol Poker (R01)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, punchy, 0, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Punchy The Clown (R02)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, punchy3, punchy, group1, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Punchy The Clown (R03)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1993, dinoeggs, 0, group2, alvg, alvg_state, empty_init, ROT0, "Alvin G", "Dinosaur Eggs", MACHINE_IS_SKELETON_MECHANICAL)