diff options
Diffstat (limited to 'trunk/src/mame/drivers/cloud9.c')
-rw-r--r-- | trunk/src/mame/drivers/cloud9.c | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/cloud9.c b/trunk/src/mame/drivers/cloud9.c new file mode 100644 index 00000000000..d2c02b98d09 --- /dev/null +++ b/trunk/src/mame/drivers/cloud9.c @@ -0,0 +1,519 @@ +/*************************************************************************** + + Atari Cloud 9 (prototype) hardware + + driver by Mike Balfour + + Games supported: + * Cloud 9 + * Firebeast + + Known issues: + * none at this time + +**************************************************************************** + + Horizontal sync chain: + + Appears to be the same as Crystal Castles. See ccastles.c for + details. + + Pixel clock = 5MHz + HBLANK ends at H = 0 + HBLANK begins at H = 256 + HSYNC begins at H = 260 (? unconfirmed) + HSYNC ends at H = 288 (? unconfirmed) + HTOTAL = 320 + + Vertical sync chain: + + Appears to be similar to Crystal Castles. The PROM at 10E seems + to have a similar layout to the SYNC PROM used by Crystal + Castles. The standard PROM maps as follows: + + VBLANK ends at V = 23 + VBLANK begins at V = 255 + VSYNC begins at V = 3 + VSYNC ends at V = 6 + VTOTAL = 256 + + Interrupts: + + IRQ is clocked by /32V, so IRQs are generated a V = 0,64,128,192. + +**************************************************************************** + + This hardware is very similar to Crystal Castles. The primary + difference is the lack of banked ROM and the mapping of the bitmap + layer into the lower 20k instead of the lower 32k. In order to do + this, they split the bitmap into two banks. Bank 0 holds pixels + 0,1,4,5,... while bank 1 holds pixels 2,3,6,7,... This is all handled + transparently by bitmode. + + The lower 24 lines of video RAM are used for working RAM. This amounts + to $600 bytes at $0000. In order to provide more work RAM, the write + protect logic selects bank 1 for accesses to VRAM at $4000, so the + other $600 bytes can be accessed there. Only Firebeast seems to use + this RAM. + + 0000 R/W Write to bit mode X latch (and through to RAM) + 0001 R/W Write to bit mode Y latch (and through to RAM) + 0002 R/W Access the bitmap via bit mode + 0000-3FFF R/W Video RAM bank 0 (or 1 or both, depending on video control) + 4000-4FFF R/W Video RAM bank 1 + 5000-53FF R/W Motion Object RAM + 5400 W Watchdog + 5480 W IRQ Acknowledge + 5500-557F W Color RAM (9 bits, 4 banks, LSB of Blue is addr&$40) + 5580 W Auto-increment X bitmap index (~D7) + 5581 W Auto-increment Y bitmap index (~D7) + 5584 W VRAM Both Banks - (D7) seems to allow writing to both banks + 5585 W Invert screen? + 5586 W VRAM Bank select? + 5587 W Color bank select + 5600 W Coin Counter 1 (D7) + 5601 W Coin Counter 2 (D7) + 5602 W Start1 LED (~D7) + 5603 W Start2 LED (~D7) + 5700 W EAROM recall + 5800 R IN0 (D7=Vblank, D6=Right Coin, D5=Left Coin, D4=Aux, D3=Self Test) + 5801 R IN1 (D7=Start1, D6=Start2, D5=Fire, D4=Zap) + 5900 R Trackball Vert + 5901 R Trackball Horiz + 5A00-5A0F R/W Pokey 1 + 5B00-5B0F R/W Pokey 2 + 5C00-5CFF W EAROM + 6000-FFFF R Program ROM + + If you have any questions about how this driver works, don't hesitate to + ask. - Mike Balfour (mab22@po.cwru.edu) + +***************************************************************************/ + +#include "emu.h" +#include "cpu/m6502/m6502.h" +#include "sound/pokey.h" +#include "includes/cloud9.h" + + +#define MASTER_CLOCK (10000000) + +#define PIXEL_CLOCK (MASTER_CLOCK/2) +#define HTOTAL (320) +#define VTOTAL (256) + + + +/************************************* + * + * VBLANK and IRQ generation + * + *************************************/ + +INLINE void schedule_next_irq(running_machine &machine, int curscanline) +{ + cloud9_state *state = machine.driver_data<cloud9_state>(); + + /* IRQ is clocked by /32V, so every 64 scanlines */ + curscanline = (curscanline + 64) & 255; + + /* next one at the start of this scanline */ + state->m_irq_timer->adjust(machine.primary_screen->time_until_pos(curscanline), curscanline); +} + + +static TIMER_CALLBACK( clock_irq ) +{ + cloud9_state *state = machine.driver_data<cloud9_state>(); + /* assert the IRQ if not already asserted */ + if (!state->m_irq_state) + { + device_set_input_line(state->m_maincpu, 0, ASSERT_LINE); + state->m_irq_state = 1; + } + + /* force an update now */ + machine.primary_screen->update_partial(machine.primary_screen->vpos()); + + /* find the next edge */ + schedule_next_irq(machine, param); +} + + +CUSTOM_INPUT_MEMBER(cloud9_state::get_vblank) +{ + int scanline = machine().primary_screen->vpos(); + return (~m_syncprom[scanline & 0xff] >> 1) & 1; +} + + + +/************************************* + * + * Machine setup + * + *************************************/ + +static MACHINE_START( cloud9 ) +{ + cloud9_state *state = machine.driver_data<cloud9_state>(); + rectangle visarea; + + /* initialize globals */ + state->m_syncprom = state->memregion("proms")->base() + 0x000; + + /* find the start of VBLANK in the SYNC PROM */ + for (state->m_vblank_start = 0; state->m_vblank_start < 256; state->m_vblank_start++) + if ((state->m_syncprom[(state->m_vblank_start - 1) & 0xff] & 2) != 0 && (state->m_syncprom[state->m_vblank_start] & 2) == 0) + break; + if (state->m_vblank_start == 0) + state->m_vblank_start = 256; + + /* find the end of VBLANK in the SYNC PROM */ + for (state->m_vblank_end = 0; state->m_vblank_end < 256; state->m_vblank_end++) + if ((state->m_syncprom[(state->m_vblank_end - 1) & 0xff] & 2) == 0 && (state->m_syncprom[state->m_vblank_end] & 2) != 0) + break; + + /* can't handle the wrapping case */ + assert(state->m_vblank_end < state->m_vblank_start); + + /* reconfigure the visible area to match */ + visarea.set(0, 255, state->m_vblank_end + 1, state->m_vblank_start); + machine.primary_screen->configure(320, 256, visarea, HZ_TO_ATTOSECONDS(PIXEL_CLOCK) * VTOTAL * HTOTAL); + + /* create a timer for IRQs and set up the first callback */ + state->m_irq_timer = machine.scheduler().timer_alloc(FUNC(clock_irq)); + state->m_irq_state = 0; + schedule_next_irq(machine, 0-64); + + /* setup for save states */ + state->save_item(NAME(state->m_irq_state)); +} + + +static MACHINE_RESET( cloud9 ) +{ + cloud9_state *state = machine.driver_data<cloud9_state>(); + cputag_set_input_line(machine, "maincpu", 0, CLEAR_LINE); + state->m_irq_state = 0; +} + + + +/************************************* + * + * Output ports + * + *************************************/ + +WRITE8_MEMBER(cloud9_state::irq_ack_w) +{ + if (m_irq_state) + { + device_set_input_line(m_maincpu, 0, CLEAR_LINE); + m_irq_state = 0; + } +} + + +WRITE8_MEMBER(cloud9_state::cloud9_led_w) +{ + set_led_status(machine(), offset, ~data & 0x80); +} + + +WRITE8_MEMBER(cloud9_state::cloud9_coin_counter_w) +{ + coin_counter_w(machine(), offset, data & 0x80); +} + + +READ8_MEMBER(cloud9_state::leta_r) +{ + return ioport(offset ? "TRACKX" : "TRACKY")->read(); +} + + + +/************************************* + * + * NVRAM handling + * + *************************************/ + +WRITE8_MEMBER(cloud9_state::nvram_recall_w) +{ + m_nvram->recall(0); + m_nvram->recall(1); + m_nvram->recall(0); +} + + +WRITE8_MEMBER(cloud9_state::nvram_store_w) +{ + m_nvram->store(0); + m_nvram->store(1); + m_nvram->store(0); +} + + + +/************************************* + * + * Main CPU memory handlers + * + *************************************/ + +static ADDRESS_MAP_START( cloud9_map, AS_PROGRAM, 8, cloud9_state ) + AM_RANGE(0x0000, 0x0001) AM_WRITE(cloud9_bitmode_addr_w) + AM_RANGE(0x0002, 0x0002) AM_READWRITE(cloud9_bitmode_r, cloud9_bitmode_w) + AM_RANGE(0x0000, 0x4fff) AM_ROMBANK("bank1") AM_WRITE(cloud9_videoram_w) + AM_RANGE(0x5000, 0x53ff) AM_RAM AM_SHARE("spriteram") + AM_RANGE(0x5400, 0x547f) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x5480, 0x54ff) AM_WRITE(irq_ack_w) + AM_RANGE(0x5500, 0x557f) AM_RAM_WRITE(cloud9_paletteram_w) AM_SHARE("paletteram") + AM_RANGE(0x5580, 0x5587) AM_MIRROR(0x0078) AM_WRITE(cloud9_video_control_w) + AM_RANGE(0x5600, 0x5601) AM_MIRROR(0x0078) AM_WRITE(cloud9_coin_counter_w) + AM_RANGE(0x5602, 0x5603) AM_MIRROR(0x0078) AM_WRITE(cloud9_led_w) + AM_RANGE(0x5680, 0x56ff) AM_WRITE(nvram_store_w) + AM_RANGE(0x5700, 0x577f) AM_WRITE(nvram_recall_w) + AM_RANGE(0x5800, 0x5800) AM_MIRROR(0x007e) AM_READ_PORT("IN0") + AM_RANGE(0x5801, 0x5801) AM_MIRROR(0x007e) AM_READ_PORT("IN1") + AM_RANGE(0x5900, 0x5903) AM_MIRROR(0x007c) AM_READ(leta_r) + AM_RANGE(0x5a00, 0x5a0f) AM_MIRROR(0x00f0) AM_DEVREADWRITE("pokey1", pokeyn_device, read, write) + AM_RANGE(0x5b00, 0x5b0f) AM_MIRROR(0x00f0) AM_DEVREADWRITE("pokey2", pokeyn_device, read, write) + AM_RANGE(0x5c00, 0x5cff) AM_MIRROR(0x0300) AM_DEVREADWRITE("nvram", x2212_device, read, write) + AM_RANGE(0x6000, 0xffff) AM_ROM +ADDRESS_MAP_END + + + +/************************************* + * + * Port definitions + * + *************************************/ + +static INPUT_PORTS_START( cloud9 ) + PORT_START("IN0") + PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cloud9_state,get_vblank, NULL) + + PORT_START("IN1") + PORT_BIT( 0x0f, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xfe, 0x04, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x22, DEF_STR( 9C_1C ) ) + PORT_DIPSETTING( 0x1e, DEF_STR( 8C_1C ) ) + PORT_DIPSETTING( 0x1a, DEF_STR( 7C_1C ) ) + PORT_DIPSETTING( 0x16, DEF_STR( 6C_1C ) ) + PORT_DIPSETTING( 0x12, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0e, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0a, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x06, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x04, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Free_Play ) ) + + PORT_START("TRACKY") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_REVERSE + + PORT_START("TRACKX") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) +INPUT_PORTS_END + + +static INPUT_PORTS_START( firebeas ) + PORT_START("IN0") + PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_SERVICE( 0x08, IP_ACTIVE_LOW ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE1 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, cloud9_state,get_vblank, NULL) + + PORT_START("IN1") + PORT_BIT( 0x07, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON2 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START1 ) + + PORT_START("DSW") + PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + + PORT_START("TRACKY") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_REVERSE + + PORT_START("TRACKX") + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_REVERSE +INPUT_PORTS_END + + + +/************************************* + * + * Graphics definitions + * + *************************************/ + +static GFXDECODE_START( cloud9 ) + GFXDECODE_ENTRY( "gfx1", 0x0000, gfx_16x16x4_planar, 0, 4 ) +GFXDECODE_END + + + +/************************************* + * + * Sound interfaces + * + *************************************/ + +static const pokey_interface pokey_config = +{ + { DEVCB_NULL }, + DEVCB_INPUT_PORT("DSW"), +}; + + + +/************************************* + * + * Machine driver + * + *************************************/ + +static MACHINE_CONFIG_START( cloud9, cloud9_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", M6502, MASTER_CLOCK/8) + MCFG_CPU_PROGRAM_MAP(cloud9_map) + + MCFG_MACHINE_START(cloud9) + MCFG_MACHINE_RESET(cloud9) + MCFG_WATCHDOG_VBLANK_INIT(8) + + MCFG_X2212_ADD_AUTOSAVE("nvram") + + /* video hardware */ + MCFG_GFXDECODE(cloud9) + MCFG_PALETTE_LENGTH(64) + + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE((float)PIXEL_CLOCK / (float)VTOTAL / (float)HTOTAL) + MCFG_SCREEN_SIZE(HTOTAL, VTOTAL) + MCFG_SCREEN_VBLANK_TIME(0) /* VBLANK is handled manually */ + MCFG_SCREEN_VISIBLE_AREA(0, 255, 0, 231) + MCFG_SCREEN_UPDATE_STATIC(cloud9) + + MCFG_VIDEO_START(cloud9) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + + MCFG_SOUND_ADD("pokey1", POKEYN, MASTER_CLOCK/8) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + MCFG_SOUND_ADD("pokey2", POKEYN, MASTER_CLOCK/8) + MCFG_SOUND_CONFIG(pokey_config) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) +MACHINE_CONFIG_END + + + +/************************************* + * + * ROM definitions + * + *************************************/ + +ROM_START( cloud9 ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "c9_6000.bin", 0x6000, 0x2000, CRC(b5d95d98) SHA1(9a347e5fc6e9e753e5c6972341725b5f4412e451) ) + ROM_LOAD( "c9_8000.bin", 0x8000, 0x2000, CRC(49af8f22) SHA1(c118372bec0c428c2b60d29df95f358b302d5e66) ) + ROM_LOAD( "c9_a000.bin", 0xa000, 0x2000, CRC(7cf404a6) SHA1(d20b662102f8426af51b1ca4ed8e18b00d711365) ) + ROM_LOAD( "c9_c000.bin", 0xc000, 0x2000, CRC(26a4d7df) SHA1(8eef0a5f5d1ff13eec75d0c50f5a5dea28486ae5) ) + ROM_LOAD( "c9_e000.bin", 0xe000, 0x2000, CRC(6e663bce) SHA1(4f4a5dc57ba6bc38a17973a6644849f6f5a2dfd1) ) + + ROM_REGION( 0x4000, "gfx1", 0 ) + ROM_LOAD( "c9_gfx0.bin", 0x0000, 0x1000, CRC(d01a8019) SHA1(a77d6125b116ab4bf9446e3b99469dad2719f7e5) ) + ROM_LOAD( "c9_gfx1.bin", 0x1000, 0x1000, CRC(514ac009) SHA1(f05081d8da47e650b0bd12cd00460c98a4f745b1) ) + ROM_LOAD( "c9_gfx2.bin", 0x2000, 0x1000, CRC(930c1ade) SHA1(ba22cb7b105da2ab8c40574e70f18d594d833452) ) + ROM_LOAD( "c9_gfx3.bin", 0x3000, 0x1000, CRC(27e9b88d) SHA1(a1d27e62eea9cdff662a3c160f650bbdb32b7f47) ) + + ROM_REGION( 0x400, "proms", 0 ) + ROM_LOAD( "63s141.e10", 0x0000, 0x0100, BAD_DUMP CRC(8e98083f) SHA1(ed29c7ed2226613ed5d09ecef4e645e3b53f7f8d) ) /* Sync PROM */ + ROM_LOAD( "63s141.m10", 0x0100, 0x0100, BAD_DUMP CRC(b0b039c0) SHA1(724fa88f3f3c62b3c9345cdb13e114a10b7bbdb0) ) /* ??? PROM */ + ROM_LOAD( "82s129.p3", 0x0200, 0x0100, BAD_DUMP CRC(615d784d) SHA1(e7e6397ae45d6ae8b3670b457ede79c42d18d71f) ) /* VRAM Write Protect PROM */ + ROM_LOAD( "63s141.m8", 0x0300, 0x0100, BAD_DUMP CRC(6d7479ec) SHA1(7a7c30f5846b98afaaca2af9aab82416ebafe4cc) ) /* ??? PROM */ +ROM_END + + +ROM_START( firebeas ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "6000.j2", 0x6000, 0x2000, CRC(dbd04782) SHA1(1237511b00a4121fae01a07bca05a76202d74058) ) + ROM_LOAD( "8000.kl2", 0x8000, 0x2000, CRC(96231ca4) SHA1(e865d4396968f94a284fe9993f066d55f9c225a4) ) + ROM_LOAD( "a000.lm2", 0xa000, 0x2000, CRC(f7e0bf25) SHA1(d116cbc7643a3328f7a1fe4ff03d8a087b8c7648) ) + ROM_LOAD( "c000.n2", 0xc000, 0x2000, CRC(43a91b74) SHA1(6b38703e793ebcbee7b060053485072d9dac6b8b) ) + ROM_LOAD( "e000.p2", 0xe000, 0x1000, CRC(8e5045ab) SHA1(8e5e8dd7710dc5ec68602f069dfc30e1bcaf7411) ) + ROM_RELOAD( 0xf000, 0x1000 ) + + ROM_REGION( 0x8000, "gfx1", 0 ) + ROM_LOAD( "mo0000.r12", 0x0000, 0x2000, CRC(5246c979) SHA1(a975ede0a6c2c91f4373ecba1e2f61f1aedcee62) ) + ROM_LOAD( "mo2000.p12", 0x2000, 0x2000, CRC(1a3b6d57) SHA1(d9015140e69fdc3f73113f0afc3be2579197017a) ) + ROM_LOAD( "mo4000.n12", 0x4000, 0x2000, CRC(69e18319) SHA1(3bf3cbe4ea06ea71928eff8a57c2ef7dc6e6716a) ) + ROM_LOAD( "mo6000.m12", 0x6000, 0x2000, CRC(b722997f) SHA1(65a2618ecd8b4923f30f59c1fb95124cf0391964) ) + + ROM_REGION( 0x400, "proms", 0 ) + ROM_LOAD( "63s141.e10", 0x0000, 0x0100, CRC(8e98083f) SHA1(ed29c7ed2226613ed5d09ecef4e645e3b53f7f8d) ) /* Sync PROM */ + ROM_LOAD( "63s141.m10", 0x0100, 0x0100, CRC(b0b039c0) SHA1(724fa88f3f3c62b3c9345cdb13e114a10b7bbdb0) ) /* ??? PROM */ + ROM_LOAD( "82s129.p3", 0x0200, 0x0100, CRC(615d784d) SHA1(e7e6397ae45d6ae8b3670b457ede79c42d18d71f) ) /* VRAM Write Protect PROM */ + ROM_LOAD( "63s141.m8", 0x0300, 0x0100, CRC(6d7479ec) SHA1(7a7c30f5846b98afaaca2af9aab82416ebafe4cc) ) /* ??? PROM */ +ROM_END + + + +/************************************* + * + * Game drivers + * + *************************************/ + +GAME( 1983, cloud9, 0, cloud9, cloud9, 0, ROT0, "Atari", "Cloud 9 (prototype)", GAME_SUPPORTS_SAVE ) +GAME( 1983, firebeas, 0, cloud9, firebeas, 0, ROT0, "Atari", "Firebeast (prototype)", GAME_SUPPORTS_SAVE ) |