mirror of
https://github.com/holub/mame
synced 2025-04-19 15:11:37 +03:00
alvg: added inputs, nvram.
This commit is contained in:
parent
3be25a2d81
commit
98b88900c6
@ -28,14 +28,14 @@ Status:
|
||||
- Skeletons
|
||||
|
||||
ToDo:
|
||||
- CPU sound command to sound card
|
||||
- Add bsmt-based sound card
|
||||
- Display
|
||||
- Inputs not working
|
||||
- Mechanical sounds
|
||||
- Everything
|
||||
|
||||
****************************************************************************************************/
|
||||
#include "emu.h"
|
||||
#include "machine/genpin.h"
|
||||
#include "cpu/m6502/m65c02.h"
|
||||
#include "cpu/m6809/m6809.h"
|
||||
#include "machine/6522via.h"
|
||||
@ -47,11 +47,11 @@ ToDo:
|
||||
|
||||
namespace {
|
||||
|
||||
class alvg_state : public driver_device
|
||||
class alvg_state : public genpin_class
|
||||
{
|
||||
public:
|
||||
alvg_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
: genpin_class(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_audiocpu(*this, "audiocpu")
|
||||
, m_oki(*this, "oki")
|
||||
@ -61,6 +61,7 @@ public:
|
||||
, m_via(*this, "via")
|
||||
, m_via0(*this, "via0")
|
||||
, m_via1(*this, "via1")
|
||||
, m_io_keyboard(*this, "X%d", 0U)
|
||||
, m_io_outputs(*this, "out%d", 0U)
|
||||
{ }
|
||||
|
||||
@ -81,6 +82,10 @@ private:
|
||||
void ppi2_pa_w(u8 data) { m_lamp_data = (m_lamp_data & 0xff00) | data; }
|
||||
void ppi2_pb_w(u8 data) { m_lamp_data = (m_lamp_data & 0xff) | (data << 8); }
|
||||
void ppi2_pc_w(u8 data);
|
||||
void via_pb_w(u8 data);
|
||||
u8 via0_pa_r();
|
||||
u8 via0_pb_r() { return m_io_keyboard[12]->read(); }
|
||||
void via1_pb_w(u8 data);
|
||||
|
||||
u16 m_row = 0U;
|
||||
u16 m_lamp_data = 0U;
|
||||
@ -93,6 +98,7 @@ private:
|
||||
required_device<via6522_device> m_via;
|
||||
required_device<via6522_device> m_via0;
|
||||
required_device<via6522_device> m_via1;
|
||||
required_ioport_array<13> m_io_keyboard;
|
||||
output_finder<128> m_io_outputs; // 32 solenoids + 96 lamps
|
||||
};
|
||||
|
||||
@ -100,7 +106,7 @@ private:
|
||||
void alvg_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0xffff).rom();
|
||||
map(0x0000, 0x1fff).ram();
|
||||
map(0x0000, 0x1fff).ram().share("nvram");
|
||||
map(0x2000, 0x2003).mirror(0x3f0).rw(m_ppi0, FUNC(i8255_device::read), FUNC(i8255_device::write)); // U12
|
||||
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
|
||||
@ -120,6 +126,116 @@ void alvg_state::audio_map(address_map &map)
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( alvg )
|
||||
PORT_START("X0")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN3 )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN4 )
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_NAME("Slam Tilt")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_9) PORT_NAME("Tilt")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LSHIFT) PORT_NAME("Left Flipper")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RSHIFT) PORT_NAME("Right Flipper")
|
||||
|
||||
PORT_START("X1")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START )
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_X) PORT_NAME("INP10") // Tilt on Mystery Castle, Punchy, Pistol Pete
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_A) PORT_NAME("INP11")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_B) PORT_NAME("INP12")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_C) PORT_NAME("INP13")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_D) PORT_NAME("INP14")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PLUS_PAD) PORT_NAME("Test+")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS_PAD) PORT_NAME("Test-")
|
||||
|
||||
PORT_START("X2")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_E) PORT_NAME("INP17")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_NAME("INP18")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_G) PORT_NAME("INP19")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_H) PORT_NAME("INP20")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_I) PORT_NAME("INP21")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_J) PORT_NAME("INP22")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_K) PORT_NAME("INP23")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_L) PORT_NAME("INP24")
|
||||
|
||||
PORT_START("X3")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_M) PORT_NAME("INP25")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_N) PORT_NAME("INP26")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_O) PORT_NAME("INP27")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_P) PORT_NAME("INP28")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Q) PORT_NAME("INP29")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_R) PORT_NAME("INP30")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_S) PORT_NAME("INP31")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_T) PORT_NAME("INP32")
|
||||
|
||||
PORT_START("X4")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_U) PORT_NAME("INP33")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_V) PORT_NAME("INP34")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_W) PORT_NAME("INP35")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Y) PORT_NAME("INP36")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_Z) PORT_NAME("INP37")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COMMA) PORT_NAME("INP38")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_STOP) PORT_NAME("INP39")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH) PORT_NAME("INP40")
|
||||
|
||||
PORT_START("X5")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_COLON) PORT_NAME("INP41")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_QUOTE) PORT_NAME("INP42")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ENTER) PORT_NAME("INP43")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_NAME("INP44")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_NAME("INP45")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_NAME("INP46")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_MINUS) PORT_NAME("INP47")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_EQUALS) PORT_NAME("INP48")
|
||||
|
||||
PORT_START("X6")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_BACKSPACE) PORT_NAME("INP49")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_UP) PORT_NAME("INP50")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_LEFT) PORT_NAME("INP51")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_RIGHT) PORT_NAME("INP52")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DOWN) PORT_NAME("INP53")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SPACE) PORT_NAME("INP54")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL) PORT_NAME("INP55")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_HOME) PORT_NAME("INP56")
|
||||
|
||||
PORT_START("X7")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_END) PORT_NAME("INP57")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGUP) PORT_NAME("INP58")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_PGDN) PORT_NAME("INP59")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_SLASH_PAD) PORT_NAME("INP60")
|
||||
// From here, these inputs only used by Pistol Pete
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_ASTERISK) PORT_NAME("INP61")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1_PAD) PORT_NAME("INP62")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_2_PAD) PORT_NAME("INP63")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
|
||||
PORT_START("X8")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_3_PAD) PORT_NAME("INP65")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4_PAD) PORT_NAME("INP66")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_5_PAD) PORT_NAME("INP68")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_6_PAD) PORT_NAME("INP69")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_7_PAD) PORT_NAME("INP70")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_8_PAD) PORT_NAME("INP71")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_CODE(KEYCODE_9_PAD) PORT_NAME("INP72")
|
||||
|
||||
PORT_START("X9")
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_DEL_PAD) PORT_NAME("INP73")
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP74")
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP75")
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP76")
|
||||
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP77")
|
||||
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP78")
|
||||
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP79")
|
||||
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("INP80")
|
||||
|
||||
PORT_START("X10")
|
||||
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
|
||||
PORT_START("X11")
|
||||
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
|
||||
|
||||
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")
|
||||
INPUT_PORTS_END
|
||||
|
||||
void alvg_state::display_w(offs_t offset, u8 data)
|
||||
@ -135,9 +251,29 @@ void alvg_state::ppi2_pc_w(u8 data)
|
||||
m_io_outputs[24U+8*i+j] = BIT(data, j);
|
||||
}
|
||||
|
||||
void alvg_state::via_pb_w(u8 data)
|
||||
{
|
||||
m_via1->write_ca1(BIT(data, 1));
|
||||
}
|
||||
|
||||
void alvg_state::via1_pb_w(u8 data)
|
||||
{
|
||||
m_via->write_ca2(BIT(data, 1));
|
||||
}
|
||||
|
||||
u8 alvg_state::via0_pa_r()
|
||||
{
|
||||
u8 data = 0xff;
|
||||
for (u8 i = 0; i < 12; i++)
|
||||
if (!BIT(m_row, i))
|
||||
data &= m_io_keyboard[i]->read();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
void alvg_state::machine_start()
|
||||
{
|
||||
//genpin_class::machine_start();
|
||||
genpin_class::machine_start();
|
||||
|
||||
//m_digits.resolve();
|
||||
m_io_outputs.resolve();
|
||||
@ -148,7 +284,7 @@ void alvg_state::machine_start()
|
||||
|
||||
void alvg_state::machine_reset()
|
||||
{
|
||||
//genpin_class::machine_reset();
|
||||
genpin_class::machine_reset();
|
||||
for (u8 i = 0; i < m_io_outputs.size(); i++)
|
||||
m_io_outputs[i] = 0;
|
||||
}
|
||||
@ -159,9 +295,11 @@ void alvg_state::alvg(machine_config &config)
|
||||
M65C02(config, m_maincpu, XTAL(4'000'000) / 2);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &alvg_state::main_map);
|
||||
|
||||
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
|
||||
|
||||
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));
|
||||
m_via0->readpa_handler().set(FUNC(alvg_state::via0_pa_r));
|
||||
m_via0->readpb_handler().set(FUNC(alvg_state::via0_pb_r));
|
||||
//m_via0->writepa_handler().set(FUNC(alvg_state::via0_pa_w));
|
||||
//m_via0->writepb_handler().set(FUNC(alvg_state::via0_pb_w));
|
||||
//m_via0->ca2_handler().set_nop();
|
||||
@ -169,10 +307,9 @@ void alvg_state::alvg(machine_config &config)
|
||||
m_via0->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE);
|
||||
|
||||
MOS6522(config, m_via1, XTAL(4'000'000) / 2); // U8, uses clock2 from maincpu; port A = to sound; port B = serial to display
|
||||
//m_via1->readpa_handler().set(FUNC(alvg_state::via1_pa_r));
|
||||
//m_via1->readpb_handler().set(FUNC(alvg_state::via1_pb_r));
|
||||
//m_via1->writepa_handler().set(FUNC(alvg_state::via1_pa_w));
|
||||
//m_via1->writepb_handler().set(FUNC(alvg_state::via1_pb_w));
|
||||
m_via1->writepa_handler().set("via", FUNC(via6522_device::write_pa));
|
||||
m_via1->writepb_handler().set(FUNC(alvg_state::via1_pb_w));
|
||||
//m_via1->ca2_handler().set_nop();
|
||||
//m_via1->cb2_handler().set_nop();
|
||||
m_via1->irq_handler().set_inputline(m_maincpu, M65C02_IRQ_LINE);
|
||||
@ -199,12 +336,12 @@ void alvg_state::alvg(machine_config &config)
|
||||
//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->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);
|
||||
genpin_audio(config);
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user