summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/asteroid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/asteroid.cpp')
-rw-r--r--src/mame/machine/asteroid.cpp147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/mame/machine/asteroid.cpp b/src/mame/machine/asteroid.cpp
new file mode 100644
index 00000000000..37e252e6bd0
--- /dev/null
+++ b/src/mame/machine/asteroid.cpp
@@ -0,0 +1,147 @@
+// license:BSD-3-Clause
+// copyright-holders:Brad Oliver, Bernd Wiebelt, Allard van der Bas
+/***************************************************************************
+
+ machine.c
+
+ Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
+ I/O ports)
+
+***************************************************************************/
+
+#include "emu.h"
+#include "machine/atari_vg.h"
+#include "video/avgdvg.h"
+#include "includes/asteroid.h"
+
+
+INTERRUPT_GEN_MEMBER(asteroid_state::asteroid_interrupt)
+{
+ /* Turn off interrupts if self-test is enabled */
+ if (!(ioport("IN0")->read() & 0x80))
+ device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
+INTERRUPT_GEN_MEMBER(asteroid_state::asterock_interrupt)
+{
+ /* Turn off interrupts if self-test is enabled */
+ if ((ioport("IN0")->read() & 0x80))
+ device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
+INTERRUPT_GEN_MEMBER(asteroid_state::llander_interrupt)
+{
+ /* Turn off interrupts if self-test is enabled */
+ if (ioport("IN0")->read() & 0x02)
+ device.execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
+}
+
+READ8_MEMBER(asteroid_state::asteroid_IN0_r)
+{
+ int res = ioport("IN0")->read();
+ int bitmask = (1 << offset);
+
+ if (res & bitmask)
+ res = 0x80;
+ else
+ res = ~0x80;
+
+ return res;
+}
+
+
+READ8_MEMBER(asteroid_state::asterock_IN0_r)
+{
+ int res = ioport("IN0")->read();
+ int bitmask = (1 << offset);
+
+ if (res & bitmask)
+ res = ~0x80;
+ else
+ res = 0x80;
+
+ return res;
+}
+
+/*
+ * These 7 memory locations are used to read the player's controls.
+ * Typically, only the high bit is used. This is handled by one input port.
+ */
+
+READ8_MEMBER(asteroid_state::asteroid_IN1_r)
+{
+ int res = ioport("IN1")->read();
+ int bitmask = (1 << (offset & 0x7));
+
+ if (res & bitmask)
+ res = 0x80;
+ else
+ res = ~0x80;
+
+ return res;
+}
+
+
+READ8_MEMBER(asteroid_state::asteroid_DSW1_r)
+{
+ int res;
+ int res1;
+
+ res1 = ioport("DSW1")->read();
+
+ res = 0xfc | ((res1 >> (2 * (3 - (offset & 0x3)))) & 0x3);
+ return res;
+}
+
+
+WRITE8_MEMBER(asteroid_state::asteroid_bank_switch_w)
+{
+ int bank = BIT(data, 2);
+ m_ram1->set_entry(bank);
+ m_ram2->set_entry(bank);
+
+ set_led_status (machine(), 0, ~data & 0x02);
+ set_led_status (machine(), 1, ~data & 0x01);
+}
+
+
+WRITE8_MEMBER(asteroid_state::astdelux_bank_switch_w)
+{
+ int bank = BIT(data, 7);
+ m_ram1->set_entry(bank);
+ m_ram2->set_entry(bank);
+}
+
+WRITE8_MEMBER(asteroid_state::astdelux_led_w)
+{
+ set_led_status(machine(), offset, (data & 0x80) ? 0 : 1);
+}
+
+void asteroid_state::machine_start()
+{
+ /* configure RAM banks if present (not on llander) */
+ if (m_ram1.target() != NULL)
+ {
+ UINT8 *ram1 = reinterpret_cast<UINT8 *>(memshare("ram1")->ptr());
+ UINT8 *ram2 = reinterpret_cast<UINT8 *>(memshare("ram2")->ptr());
+
+ /* swapped */
+ m_ram1->configure_entry(1, ram2);
+ m_ram2->configure_entry(1, ram1);
+ /* normal */
+ m_ram1->configure_entry(0, ram1);
+ m_ram2->configure_entry(0, ram2);
+ }
+}
+
+void asteroid_state::machine_reset()
+{
+ m_dvg->reset_w(m_maincpu->space(AS_PROGRAM), 0, 0);
+
+ /* reset RAM banks if present */
+ if (m_ram1.target() != NULL)
+ {
+ m_ram1->set_entry(0);
+ m_ram2->set_entry(0);
+ }
+}