diff options
Diffstat (limited to 'src/mame/machine/asteroid.c')
-rw-r--r-- | src/mame/machine/asteroid.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/src/mame/machine/asteroid.c b/src/mame/machine/asteroid.c new file mode 100644 index 00000000000..72912641965 --- /dev/null +++ b/src/mame/machine/asteroid.c @@ -0,0 +1,193 @@ +/*************************************************************************** + + machine.c + + Functions to emulate general aspects of the machine (RAM, ROM, interrupts, + I/O ports) + +***************************************************************************/ + +#include "driver.h" +#include "machine/atari_vg.h" +#include "video/avgdvg.h" +#include "asteroid.h" + +UINT8 *asteroid_ram1, *asteroid_ram2; + +INTERRUPT_GEN( asteroid_interrupt ) +{ + /* Turn off interrupts if self-test is enabled */ + if (!(readinputport(0) & 0x80)) + cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE); +} + +INTERRUPT_GEN( asterock_interrupt ) +{ + /* Turn off interrupts if self-test is enabled */ + if ((readinputport(0) & 0x80)) + cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE); +} + +INTERRUPT_GEN( llander_interrupt ) +{ + /* Turn off interrupts if self-test is enabled */ + if (readinputport(0) & 0x02) + cpunum_set_input_line(0, INPUT_LINE_NMI, PULSE_LINE); +} + + +READ8_HANDLER( asteroid_IN0_r ) +{ + + int res; + int bitmask; + + res=readinputport(0); + + bitmask = (1 << offset); + + if (activecpu_gettotalcycles() & 0x100) + res |= 0x02; + if (!avgdvg_done()) + res |= 0x04; + + if (res & bitmask) + res = 0x80; + else + res = ~0x80; + + return res; +} + + +READ8_HANDLER( asteroib_IN0_r ) +{ + int res; + + res=readinputport(0); + +// if (activecpu_gettotalcycles() & 0x100) +// res |= 0x02; + if (!avgdvg_done()) + res |= 0x80; + + return res; +} + +READ8_HANDLER( asterock_IN0_r ) +{ + int res; + int bitmask; + + res=readinputport(0); + + bitmask = (1 << offset); + + if (activecpu_gettotalcycles() & 0x100) + res |= 0x04; + if (!avgdvg_done()) + res |= 0x01; + + 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_HANDLER( asteroid_IN1_r ) +{ + int res; + int bitmask; + + res=readinputport(1); + bitmask = (1 << offset); + + if (res & bitmask) + res = 0x80; + else + res = ~0x80; + return (res); +} + + +READ8_HANDLER( asteroid_DSW1_r ) +{ + int res; + int res1; + + res1 = readinputport(2); + + res = 0xfc | ((res1 >> (2 * (3 - (offset & 0x3)))) & 0x3); + return res; +} + + +WRITE8_HANDLER( asteroid_bank_switch_w ) +{ + if (data & 4) + { + memory_set_bankptr(1, asteroid_ram2); + memory_set_bankptr(2, asteroid_ram1); + } + else + { + memory_set_bankptr(1, asteroid_ram1); + memory_set_bankptr(2, asteroid_ram2); + } + + set_led_status (0, ~data & 0x02); + set_led_status (1, ~data & 0x01); +} + + +WRITE8_HANDLER( astdelux_bank_switch_w ) +{ + if (data & 0x80) + { + memory_set_bankptr(1, asteroid_ram2); + memory_set_bankptr(2, asteroid_ram1); + } + else + { + memory_set_bankptr(1, asteroid_ram1); + memory_set_bankptr(2, asteroid_ram2); + } +} + + +WRITE8_HANDLER( astdelux_led_w ) +{ + set_led_status(offset,(data&0x80)?0:1); +} + + +MACHINE_RESET( asteroid ) +{ + asteroid_bank_switch_w (0,0); + avgdvg_reset_w (0,0); +} + + +/* + * This is Lunar Lander's Inputport 0. + */ +READ8_HANDLER( llander_IN0_r ) +{ + int res; + + res = readinputport(0); + + if (avgdvg_done()) + res |= 0x01; + if (activecpu_gettotalcycles() & 0x100) + res |= 0x40; + + return res; +} |