summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/maxaflex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/maxaflex.cpp')
-rw-r--r--src/mame/drivers/maxaflex.cpp542
1 files changed, 542 insertions, 0 deletions
diff --git a/src/mame/drivers/maxaflex.cpp b/src/mame/drivers/maxaflex.cpp
new file mode 100644
index 00000000000..8b5dfa5151f
--- /dev/null
+++ b/src/mame/drivers/maxaflex.cpp
@@ -0,0 +1,542 @@
+// license:BSD-3-Clause
+// copyright-holders:Mariusz Wojcieszek, Aaron Giles
+/******************************************************************************
+ Exidy Max-A-Flex driver
+
+ by Mariusz Wojcieszek
+
+ Based on Atari 400/800 MESS Driver by Juergen Buchmueller
+
+ TODO:
+ - fix LCD digits display controlling
+
+******************************************************************************/
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+#include "cpu/m6805/m6805.h"
+#include "includes/atari.h"
+#include "sound/speaker.h"
+#include "sound/pokey.h"
+#include "machine/6821pia.h"
+#include "video/gtia.h"
+
+#include "maxaflex.lh"
+
+
+class maxaflex_state : public atari_common_state
+{
+public:
+ maxaflex_state(const machine_config &mconfig, device_type type, const char *tag)
+ : atari_common_state(mconfig, type, tag),
+ m_mcu(*this, "mcu"),
+ m_speaker(*this, "speaker"),
+ m_region_maincpu(*this, "maincpu"),
+ m_dsw(*this, "dsw"),
+ m_coin(*this, "coin"),
+ m_console(*this, "console"),
+ m_joy01(*this, "djoy_0_1"),
+ m_joy23(*this, "djoy_2_3")
+ { }
+
+ UINT8 m_portA_in;
+ UINT8 m_portA_out;
+ UINT8 m_ddrA;
+ UINT8 m_portB_in;
+ UINT8 m_portB_out;
+ UINT8 m_ddrB;
+ UINT8 m_portC_in;
+ UINT8 m_portC_out;
+ UINT8 m_ddrC;
+ UINT8 m_tdr;
+ UINT8 m_tcr;
+ timer_device *m_mcu_timer;
+ void mmu(UINT8 new_mmu);
+ DECLARE_READ8_MEMBER(mcu_portA_r);
+ DECLARE_WRITE8_MEMBER(mcu_portA_w);
+ DECLARE_READ8_MEMBER(mcu_portB_r);
+ DECLARE_WRITE8_MEMBER(mcu_portB_w);
+ DECLARE_READ8_MEMBER(mcu_portC_r);
+ DECLARE_WRITE8_MEMBER(mcu_portC_w);
+ DECLARE_READ8_MEMBER(mcu_ddr_r);
+ DECLARE_WRITE8_MEMBER(mcu_portA_ddr_w);
+ DECLARE_WRITE8_MEMBER(mcu_portB_ddr_w);
+ DECLARE_WRITE8_MEMBER(mcu_portC_ddr_w);
+ DECLARE_READ8_MEMBER(mcu_tdr_r);
+ DECLARE_WRITE8_MEMBER(mcu_tdr_w);
+ DECLARE_READ8_MEMBER(mcu_tcr_r);
+ DECLARE_WRITE8_MEMBER(mcu_tcr_w);
+ DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
+ DECLARE_READ8_MEMBER(pia_pa_r);
+ DECLARE_READ8_MEMBER(pia_pb_r);
+ WRITE8_MEMBER(pia_pb_w) { mmu(data); }
+ WRITE_LINE_MEMBER(pia_cb2_w) { } // This is used by Floppy drive on Atari 8bits Home Computers
+ TIMER_DEVICE_CALLBACK_MEMBER(mf_interrupt);
+ TIMER_DEVICE_CALLBACK_MEMBER(mcu_timer_proc);
+ int atari_input_disabled();
+ virtual void machine_reset();
+ //required_device<cpu_device> m_maincpu; // maincpu is already contained in atari_common_state
+ required_device<cpu_device> m_mcu;
+ required_device<speaker_sound_device> m_speaker;
+ required_region_ptr<UINT8> m_region_maincpu;
+ required_ioport m_dsw;
+ required_ioport m_coin;
+ required_ioport m_console;
+ required_ioport m_joy01;
+ required_ioport m_joy23;
+};
+
+
+void maxaflex_state::mmu(UINT8 new_mmu)
+{
+ /* check if self-test ROM changed */
+ if (new_mmu & 0x80)
+ {
+ logerror("%s MMU SELFTEST RAM\n", machine().system().name);
+ m_maincpu->space(AS_PROGRAM).nop_readwrite(0x5000, 0x57ff);
+ }
+ else
+ {
+ logerror("%s MMU SELFTEST ROM\n", machine().system().name);
+ m_maincpu->space(AS_PROGRAM).install_rom(0x5000, 0x57ff, &m_region_maincpu[0xd000]);
+ m_maincpu->space(AS_PROGRAM).unmap_write(0x5000, 0x57ff);
+ }
+}
+
+
+/* Supervisor board emulation */
+
+
+/* Port A:
+ 0 (in) DSW
+ 1 (in) DSW
+ 2 (in) DSW
+ 3 (in) DSW
+ 4 (in) coin
+ 5 (in) START button
+ 6 -
+ 7 (out) AUDIO
+*/
+
+READ8_MEMBER(maxaflex_state::mcu_portA_r)
+{
+ m_portA_in = m_dsw->read() | (m_coin->read() << 4) | (m_console->read() << 5);
+ return (m_portA_in & ~m_ddrA) | (m_portA_out & m_ddrA);
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portA_w)
+{
+ m_portA_out = data;
+ m_speaker->level_w(data >> 7);
+}
+
+/* Port B:
+ 0 (out) Select 7-segment display to control by writing port C
+ 1 (out)
+ 2 (out) clear coin interrupt
+ 3 (out) STRKEY - line connected to keyboard input in 600XL, seems to be not used
+ 4 (out) RES600 - reset 600
+ 5 (out) AUDMUTE - mutes audio
+ 6 (out) latch for lamps
+ 7 (out) TOFF - enables/disables user controls
+*/
+
+READ8_MEMBER(maxaflex_state::mcu_portB_r)
+{
+ return (m_portB_in & ~m_ddrB) | (m_portB_out & m_ddrB);
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portB_w)
+{
+ UINT8 diff = data ^ m_portB_out;
+ m_portB_out = data;
+
+ /* clear coin interrupt */
+ if (data & 0x04)
+ m_mcu->set_input_line(M6805_IRQ_LINE, CLEAR_LINE );
+
+ /* AUDMUTE */
+ machine().sound().system_enable((data >> 5) & 1);
+
+ /* RES600 */
+ if (diff & 0x10)
+ m_maincpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE);
+
+ /* latch for lamps */
+ if ((diff & 0x40) && !(data & 0x40))
+ {
+ output_set_lamp_value(0, (m_portC_out >> 0) & 1);
+ output_set_lamp_value(1, (m_portC_out >> 1) & 1);
+ output_set_lamp_value(2, (m_portC_out >> 2) & 1);
+ output_set_lamp_value(3, (m_portC_out >> 3) & 1);
+ }
+}
+
+/* Port C:
+ 0 (out) lamp COIN
+ 1 (out) lamp PLAY
+ 2 (out) lamp START
+ 3 (out) lamp OVER */
+
+READ8_MEMBER(maxaflex_state::mcu_portC_r)
+{
+ return (m_portC_in & ~m_ddrC) | (m_portC_out & m_ddrC);
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portC_w)
+{
+ /* uses a 7447A, which is equivalent to an LS47/48 */
+ static const UINT8 ls48_map[16] =
+ { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x58,0x4c,0x62,0x69,0x78,0x00 };
+
+ m_portC_out = data & 0x0f;
+
+ /* displays */
+ switch( m_portB_out & 0x3 )
+ {
+ case 0x0: output_set_digit_value(0, ls48_map[m_portC_out]); break;
+ case 0x1: output_set_digit_value(1, ls48_map[m_portC_out]); break;
+ case 0x2: output_set_digit_value(2, ls48_map[m_portC_out]); break;
+ case 0x3: break;
+ }
+}
+
+READ8_MEMBER(maxaflex_state::mcu_ddr_r)
+{
+ return 0xff;
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portA_ddr_w)
+{
+ m_ddrA = data;
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portB_ddr_w)
+{
+ m_ddrB = data;
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_portC_ddr_w)
+{
+ m_ddrC = data;
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(maxaflex_state::mcu_timer_proc)
+{
+ if ( --m_tdr == 0x00 )
+ {
+ if ( (m_tcr & 0x40) == 0 )
+ {
+ //timer interrupt!
+ generic_pulse_irq_line(m_mcu, M68705_INT_TIMER, 1);
+ }
+ }
+}
+
+/* Timer Data Reg */
+READ8_MEMBER(maxaflex_state::mcu_tdr_r)
+{
+ return m_tdr;
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_tdr_w)
+{
+ m_tdr = data;
+}
+
+/* Timer control reg */
+READ8_MEMBER(maxaflex_state::mcu_tcr_r)
+{
+ return m_tcr & ~0x08;
+}
+
+WRITE8_MEMBER(maxaflex_state::mcu_tcr_w)
+{
+ m_tcr = data;
+ if ( (m_tcr & 0x40) == 0 )
+ {
+ int divider;
+ attotime period;
+
+ if ( !(m_tcr & 0x20) )
+ {
+ /* internal clock / 4*/
+ divider = 4;
+ }
+ else
+ {
+ /* external clock */
+ divider = 1;
+ }
+
+ if ( m_tcr & 0x07 )
+ {
+ /* use prescaler */
+ divider = divider * (1 << (m_tcr & 0x7));
+ }
+
+ period = attotime::from_hz(3579545) * divider;
+ m_mcu_timer->adjust(period, 0, period);
+ }
+}
+
+INPUT_CHANGED_MEMBER(maxaflex_state::coin_inserted)
+{
+ if (!newval)
+ m_mcu->set_input_line(M6805_IRQ_LINE, HOLD_LINE );
+}
+
+int maxaflex_state::atari_input_disabled()
+{
+ return (m_portB_out & 0x80) == 0x00;
+}
+
+
+
+static ADDRESS_MAP_START(a600xl_mem, AS_PROGRAM, 8, maxaflex_state )
+ AM_RANGE(0x0000, 0x3fff) AM_RAM
+ AM_RANGE(0x5000, 0x57ff) AM_ROM AM_REGION("maincpu", 0xd000) /* self test */
+ AM_RANGE(0x8000, 0xbfff) AM_ROM /* game cartridge */
+ AM_RANGE(0xc000, 0xcfff) AM_ROM /* OS */
+ AM_RANGE(0xd000, 0xd0ff) AM_DEVREADWRITE("gtia", gtia_device, read, write)
+ AM_RANGE(0xd100, 0xd1ff) AM_NOP
+ AM_RANGE(0xd200, 0xd2ff) AM_DEVREADWRITE("pokey", pokey_device, read, write)
+ AM_RANGE(0xd300, 0xd3ff) AM_DEVREADWRITE("pia", pia6821_device, read_alt, write_alt)
+ AM_RANGE(0xd400, 0xd4ff) AM_DEVREADWRITE("antic", antic_device, read, write)
+ AM_RANGE(0xd500, 0xd7ff) AM_NOP
+ AM_RANGE(0xd800, 0xffff) AM_ROM /* OS */
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( mcu_mem, AS_PROGRAM, 8, maxaflex_state )
+ ADDRESS_MAP_GLOBAL_MASK(0x7ff)
+ AM_RANGE(0x0000, 0x0000) AM_READ(mcu_portA_r) AM_WRITE(mcu_portA_w)
+ AM_RANGE(0x0001, 0x0001) AM_READ(mcu_portB_r) AM_WRITE(mcu_portB_w)
+ AM_RANGE(0x0002, 0x0002) AM_READ(mcu_portC_r) AM_WRITE(mcu_portC_w)
+ AM_RANGE(0x0004, 0x0004) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portA_ddr_w)
+ AM_RANGE(0x0005, 0x0005) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portB_ddr_w)
+ AM_RANGE(0x0006, 0x0006) AM_READ(mcu_ddr_r) AM_WRITE(mcu_portC_ddr_w)
+ AM_RANGE(0x0008, 0x0008) AM_READ(mcu_tdr_r) AM_WRITE(mcu_tdr_w)
+ AM_RANGE(0x0009, 0x0009) AM_READ(mcu_tcr_r) AM_WRITE(mcu_tcr_w)
+ AM_RANGE(0x0010, 0x007f) AM_RAM
+ AM_RANGE(0x0080, 0x07ff) AM_ROM
+ADDRESS_MAP_END
+
+
+static INPUT_PORTS_START( a600xl )
+
+ PORT_START("console")
+ PORT_BIT(0x04, 0x04, IPT_KEYPAD) PORT_NAME("Option") PORT_CODE(KEYCODE_F2)
+ PORT_BIT(0x02, 0x02, IPT_KEYPAD) PORT_NAME("Select") PORT_CODE(KEYCODE_F1)
+ PORT_BIT(0x01, 0x01, IPT_START1 )
+
+ PORT_START("djoy_0_1")
+ PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(1)
+ PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(1)
+ PORT_BIT(0x04, 0x04, IPT_JOYSTICK_LEFT) PORT_PLAYER(1)
+ PORT_BIT(0x08, 0x08, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
+ /* player #2 input is not connected */
+ PORT_BIT(0x10, 0x10, IPT_JOYSTICK_UP) PORT_PLAYER(2)
+ PORT_BIT(0x20, 0x20, IPT_JOYSTICK_DOWN) PORT_PLAYER(2)
+ PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(2)
+ PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
+
+ PORT_START("djoy_2_3")
+ /* not connected */
+ PORT_BIT(0x01, 0x01, IPT_JOYSTICK_UP) PORT_PLAYER(3)
+ PORT_BIT(0x02, 0x02, IPT_JOYSTICK_DOWN) PORT_PLAYER(3)
+ PORT_BIT(0x04, 0x04, IPT_JOYSTICK_LEFT) PORT_PLAYER(3)
+ PORT_BIT(0x08, 0x08, IPT_JOYSTICK_RIGHT) PORT_PLAYER(3)
+ PORT_BIT(0x10, 0x10, IPT_JOYSTICK_UP) PORT_PLAYER(4)
+ PORT_BIT(0x20, 0x20, IPT_JOYSTICK_DOWN) PORT_PLAYER(4)
+ PORT_BIT(0x40, 0x40, IPT_JOYSTICK_LEFT) PORT_PLAYER(4)
+ PORT_BIT(0x80, 0x80, IPT_JOYSTICK_RIGHT) PORT_PLAYER(4)
+
+ PORT_START("djoy_b")
+ PORT_BIT(0x01, 0x01, IPT_BUTTON1) PORT_PLAYER(1)
+ PORT_BIT(0x02, 0x02, IPT_BUTTON1) PORT_PLAYER(2)
+ PORT_BIT(0x04, 0x04, IPT_BUTTON1) PORT_PLAYER(3)
+ PORT_BIT(0x08, 0x08, IPT_BUTTON1) PORT_PLAYER(4)
+ PORT_BIT(0x10, 0x10, IPT_BUTTON2) PORT_PLAYER(1)
+ PORT_BIT(0x20, 0x20, IPT_BUTTON2) PORT_PLAYER(2)
+ PORT_BIT(0x40, 0x40, IPT_BUTTON2) PORT_PLAYER(3)
+ PORT_BIT(0x80, 0x80, IPT_BUTTON2) PORT_PLAYER(4)
+
+ /* Max-A-Flex specific ports */
+ PORT_START("coin")
+ PORT_BIT(0x1, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, maxaflex_state,coin_inserted, 0)
+
+ PORT_START("dsw")
+ PORT_DIPNAME(0xf, 0x9, "Coin/Time" )
+ PORT_DIPSETTING( 0x0, "30 sec" )
+ PORT_DIPSETTING( 0x1, "60 sec" )
+ PORT_DIPSETTING( 0x2, "90 sec" )
+ PORT_DIPSETTING( 0x3, "120 sec" )
+ PORT_DIPSETTING( 0x4, "150 sec" )
+ PORT_DIPSETTING( 0x5, "180 sec" )
+ PORT_DIPSETTING( 0x6, "210 sec" )
+ PORT_DIPSETTING( 0x7, "240 sec" )
+ PORT_DIPSETTING( 0x8, "270 sec" )
+ PORT_DIPSETTING( 0x9, "300 sec" )
+ PORT_DIPSETTING( 0xa, "330 sec" )
+ PORT_DIPSETTING( 0xb, "360 sec" )
+ PORT_DIPSETTING( 0xc, "390 sec" )
+ PORT_DIPSETTING( 0xd, "420 sec" )
+ PORT_DIPSETTING( 0xe, "450 sec" )
+ PORT_DIPSETTING( 0xf, "480 sec" )
+
+INPUT_PORTS_END
+
+
+READ8_MEMBER(maxaflex_state::pia_pa_r)
+{
+ return atari_input_disabled() ? 0xff : read_safe(m_joy01, 0);
+}
+
+READ8_MEMBER(maxaflex_state::pia_pb_r)
+{
+ return atari_input_disabled() ? 0xff : read_safe(m_joy23, 0);
+}
+
+
+void maxaflex_state::machine_reset()
+{
+ pokey_device *pokey = machine().device<pokey_device>("pokey");
+ pokey->write(15,0);
+
+ // Supervisor board reset
+ m_portA_in = m_portA_out = m_ddrA = 0;
+ m_portB_in = m_portB_out = m_ddrB = 0;
+ m_portC_in = m_portC_out = m_ddrC = 0;
+ m_tdr = m_tcr = 0;
+ m_mcu_timer = machine().device<timer_device>("mcu_timer");
+
+ output_set_lamp_value(0, 0);
+ output_set_lamp_value(1, 0);
+ output_set_lamp_value(2, 0);
+ output_set_lamp_value(3, 0);
+ output_set_digit_value(0, 0x00);
+ output_set_digit_value(1, 0x00);
+ output_set_digit_value(2, 0x00);
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER( maxaflex_state::mf_interrupt )
+{
+ m_antic->generic_interrupt(2);
+}
+
+static MACHINE_CONFIG_START( maxaflex, maxaflex_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M6502, FREQ_17_EXACT)
+ MCFG_CPU_PROGRAM_MAP(a600xl_mem)
+ MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", maxaflex_state, mf_interrupt, "screen", 0, 1)
+
+ MCFG_CPU_ADD("mcu", M68705, 3579545)
+ MCFG_CPU_PROGRAM_MAP(mcu_mem)
+
+ MCFG_DEVICE_ADD("gtia", ATARI_GTIA, 0)
+ MCFG_GTIA_READ_CB(IOPORT("console"))
+
+ MCFG_DEVICE_ADD("antic", ATARI_ANTIC, 0)
+ MCFG_ANTIC_GTIA("gtia")
+
+ MCFG_DEVICE_ADD("pia", PIA6821, 0)
+ MCFG_PIA_READPA_HANDLER(READ8(maxaflex_state, pia_pa_r))
+ MCFG_PIA_READPB_HANDLER(READ8(maxaflex_state, pia_pb_r))
+ MCFG_PIA_WRITEPB_HANDLER(WRITE8(maxaflex_state, pia_pb_w))
+ MCFG_PIA_CB2_HANDLER(WRITELINE(maxaflex_state, pia_cb2_w))
+
+ MCFG_TIMER_DRIVER_ADD("mcu_timer", maxaflex_state, mcu_timer_proc)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
+ MCFG_SCREEN_VISIBLE_AREA(MIN_X, MAX_X, MIN_Y, MAX_Y)
+ MCFG_SCREEN_REFRESH_RATE(FRAME_RATE_60HZ)
+ MCFG_SCREEN_SIZE(HWIDTH*8, TOTAL_LINES_60HZ)
+ MCFG_SCREEN_UPDATE_DEVICE("antic", antic_device, screen_update)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_PALETTE_ADD("palette", 256)
+ MCFG_PALETTE_INIT_OWNER(atari_common_state, atari)
+ MCFG_DEFAULT_LAYOUT(layout_maxaflex)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("pokey", POKEY, FREQ_17_EXACT)
+ MCFG_POKEY_INTERRUPT_CB(atari_common_state, interrupt_cb)
+ MCFG_POKEY_OUTPUT_RC(RES_K(1), CAP_U(0.0), 5.0)
+
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+ MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+
+ROM_START(maxaflex)
+ ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
+ ROM_LOAD("atarixl.rom", 0xc000, 0x4000, CRC(1f9cd270) SHA1(ae4f523ba08b6fd59f3cae515a2b2410bbd98f55))
+
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD("maxaflex.uc", 0x0000, 0x0800, CRC(fe9cf53c) SHA1(4b02bc2f0c8a1eab799814fac82d5812c0160206))
+
+ ROM_REGION( 0x200, "proms", 0 )
+ ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/
+ROM_END
+
+ROM_START(mf_bdash)
+ ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
+ ROM_LOAD("bd-acs-1.rom", 0x8000, 0x2000, CRC(2b11750e) SHA1(43e9ae44eb1767621920bb94a4370ed602d81056))
+ ROM_LOAD("bd-acs-2.rom", 0xa000, 0x2000, CRC(e9ea2658) SHA1(189ede7201ef122cf2b72fc847a896b9dbe007e5))
+ ROM_LOAD("atarixl.rom", 0xc000, 0x4000, CRC(1f9cd270) SHA1(ae4f523ba08b6fd59f3cae515a2b2410bbd98f55))
+
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD("maxaflex.uc", 0x0000, 0x0800, CRC(fe9cf53c) SHA1(4b02bc2f0c8a1eab799814fac82d5812c0160206))
+
+ ROM_REGION( 0x200, "proms", 0 )
+ ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/
+ROM_END
+
+ROM_START(mf_achas)
+ ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
+ ROM_LOAD("ac.rom", 0x8000, 0x4000, CRC(18752991) SHA1(f508b89d2251c53d017cff6cb23b8e9880a0cc0b))
+ ROM_LOAD("atarixl.rom", 0xc000, 0x4000, CRC(1f9cd270) SHA1(ae4f523ba08b6fd59f3cae515a2b2410bbd98f55))
+
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD("maxaflex.uc", 0x0000, 0x0800, CRC(fe9cf53c) SHA1(4b02bc2f0c8a1eab799814fac82d5812c0160206))
+
+ ROM_REGION( 0x200, "proms", 0 )
+ ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/
+ROM_END
+
+ROM_START(mf_brist)
+ ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
+ ROM_LOAD("brist.rom", 0x8000, 0x4000, CRC(4263d64d) SHA1(80a041bceb499e1466516488013aa4439b3db6f2))
+ ROM_LOAD("atarixl.rom", 0xc000, 0x4000, CRC(1f9cd270) SHA1(ae4f523ba08b6fd59f3cae515a2b2410bbd98f55))
+
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD("maxaflex.uc", 0x0000, 0x0800, CRC(fe9cf53c) SHA1(4b02bc2f0c8a1eab799814fac82d5812c0160206))
+
+ ROM_REGION( 0x200, "proms", 0 )
+ ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/
+ROM_END
+
+ROM_START(mf_flip)
+ ROM_REGION(0x10000,"maincpu",0) /* 64K for the CPU */
+ ROM_LOAD("flipflop.rom", 0x8000, 0x4000, CRC(8ae057be) SHA1(ba26d6a3790ebdb754c1192b2c28f0fe93aca377))
+ ROM_LOAD("atarixl.rom", 0xc000, 0x4000, CRC(1f9cd270) SHA1(ae4f523ba08b6fd59f3cae515a2b2410bbd98f55))
+
+ ROM_REGION( 0x0800, "mcu", 0 ) /* 2k for the microcontroller */
+ ROM_LOAD("maxaflex.uc", 0x0000, 0x0800, CRC(fe9cf53c) SHA1(4b02bc2f0c8a1eab799814fac82d5812c0160206))
+
+ ROM_REGION( 0x200, "proms", 0 )
+ ROM_LOAD("maxprom.prm", 0x0000, 0x0200, CRC(edf5c950) SHA1(9ad046ea41a61585dd8d2f2d4167a3cc39d2928f)) /* for simulating keystrokes ?*/
+ROM_END
+
+
+GAME( 1984, maxaflex, 0, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy", "Max-A-Flex", MACHINE_IS_BIOS_ROOT )
+GAME( 1982, mf_achas, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Astro Chase (Max-A-Flex)", 0 )
+GAME( 1983, mf_brist, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Bristles (Max-A-Flex)", 0 )
+GAME( 1983, mf_flip, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Flip & Flop (Max-A-Flex)", 0 )
+GAME( 1984, mf_bdash, maxaflex, maxaflex, a600xl, driver_device, 0, ROT0, "Exidy / First Star Software", "Boulder Dash (Max-A-Flex)", 0 )