summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/thunderj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/thunderj.c')
-rw-r--r--src/mame/drivers/thunderj.c466
1 files changed, 466 insertions, 0 deletions
diff --git a/src/mame/drivers/thunderj.c b/src/mame/drivers/thunderj.c
new file mode 100644
index 00000000000..8dcf4284c6c
--- /dev/null
+++ b/src/mame/drivers/thunderj.c
@@ -0,0 +1,466 @@
+/***************************************************************************
+
+ Atari ThunderJaws hardware
+
+ driver by Aaron Giles
+
+ Games supported:
+ * ThunderJaws (1990)
+
+ Known bugs:
+ * none at this time
+
+****************************************************************************
+
+ Memory map (TBA)
+
+***************************************************************************/
+
+
+#include "driver.h"
+#include "machine/atarigen.h"
+#include "audio/atarijsa.h"
+#include "thunderj.h"
+
+
+
+static UINT16 *shared_ram;
+static UINT16 *rom_base[2];
+
+
+/*************************************
+ *
+ * Initialization & interrupts
+ *
+ *************************************/
+
+static void update_interrupts(void)
+{
+ int newstate = 0;
+ int newstate2 = 0;
+
+ if (atarigen_scanline_int_state)
+ newstate |= 4, newstate2 |= 4;
+ if (atarigen_sound_int_state)
+ newstate |= 6;
+
+ if (newstate)
+ cpunum_set_input_line(0, newstate, ASSERT_LINE);
+ else
+ cpunum_set_input_line(0, 7, CLEAR_LINE);
+
+ if (newstate2)
+ cpunum_set_input_line(1, newstate2, ASSERT_LINE);
+ else
+ cpunum_set_input_line(1, 7, CLEAR_LINE);
+}
+
+
+static MACHINE_RESET( thunderj )
+{
+ atarigen_eeprom_reset();
+ atarivc_reset(0, atarivc_eof_data, 2);
+ atarigen_interrupt_reset(update_interrupts);
+ atarijsa_reset();
+
+ rom_base[0] = (UINT16 *)memory_region(REGION_CPU1);
+ rom_base[1] = (UINT16 *)memory_region(REGION_CPU2);
+ memory_set_bankptr(1, shared_ram);
+}
+
+
+
+/*************************************
+ *
+ * I/O handling
+ *
+ *************************************/
+
+static READ16_HANDLER( special_port2_r )
+{
+ int result = readinputport(2);
+
+ if (atarigen_sound_to_cpu_ready) result ^= 0x0004;
+ if (atarigen_cpu_to_sound_ready) result ^= 0x0008;
+ result ^= 0x0010;
+
+ return result;
+}
+
+
+static WRITE16_HANDLER( latch_w )
+{
+ /* reset extra CPU */
+ if (ACCESSING_LSB)
+ {
+ /* 0 means hold CPU 2's reset low */
+ if (data & 1)
+ cpunum_set_input_line(1, INPUT_LINE_RESET, CLEAR_LINE);
+ else
+ cpunum_set_input_line(1, INPUT_LINE_RESET, ASSERT_LINE);
+
+ /* bits 2-5 are the alpha bank */
+ if (thunderj_alpha_tile_bank != ((data >> 2) & 7))
+ {
+ video_screen_update_partial(0, video_screen_get_vpos(0));
+ tilemap_mark_all_tiles_dirty(atarigen_alpha_tilemap);
+ thunderj_alpha_tile_bank = (data >> 2) & 7;
+ }
+ }
+}
+
+
+
+/*************************************
+ *
+ * Synchronization helper
+ *
+ *************************************/
+
+static TIMER_CALLBACK( shared_sync_callback )
+{
+ if (--param)
+ timer_set(ATTOTIME_IN_USEC(50), param, shared_sync_callback);
+}
+
+
+static READ16_HANDLER( shared_ram_r )
+{
+ UINT16 result = shared_ram[offset];
+
+ /* look for a byte access, and then check for the high bit and a TAS opcode */
+ if (mem_mask != 0 && (result & ~mem_mask & 0x8080))
+ {
+ offs_t ppc = activecpu_get_previouspc();
+ if (ppc < 0xa0000)
+ {
+ int cpunum = cpu_getactivecpu();
+ UINT16 opcode = rom_base[cpunum][ppc / 2];
+
+ /* look for TAS or BTST #$7; both CPUs spin waiting for these in order to */
+ /* coordinate communications. Some spins have timeouts that reset the machine */
+ /* if they fail, so we must make sure they are released in time */
+ if ((opcode & 0xffc0) == 0x4ac0 ||
+ ((opcode & 0xffc0) == 0x0080 && rom_base[cpunum][ppc / 2 + 1] == 7))
+ {
+ timer_call_after_resynch(4, shared_sync_callback);
+ }
+ }
+ }
+
+ return result;
+}
+
+
+
+/*************************************
+ *
+ * Video Controller Hack
+ *
+ *************************************/
+
+static READ16_HANDLER( thunderj_video_control_r )
+{
+ /* Sigh. CPU #1 reads the video controller register twice per frame, once at
+ the beginning of interrupt and once near the end. It stores these values in a
+ table starting at $163484. CPU #2 periodically looks at this table to make
+ sure that it is getting interrupts at the appropriate times, and that the
+ VBLANK bit is set appropriately. Unfortunately, due to all the cpu_yield()
+ calls we make to synchronize the two CPUs, we occasionally get out of time
+ and generate the interrupt outside of the tight tolerances CPU #2 expects.
+
+ So we fake it. Returning scanlines $f5 and $f7 alternately provides the
+ correct answer that causes CPU #2 to be happy and not aggressively trash
+ memory (which is what it does if this interrupt test fails -- see the code
+ at $1E56 to see!) */
+
+ /* Use these lines to detect when things go south:
+
+ if (cpu_readmem24bew_word(0x163482) > 0xfff)
+ mame_printf_debug("You're screwed!");*/
+
+ return atarivc_r(offset,0);
+}
+
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( main_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x09ffff) AM_ROM
+ AM_RANGE(0x0e0000, 0x0e0fff) AM_READWRITE(atarigen_eeprom_r, atarigen_eeprom_w) AM_BASE(&atarigen_eeprom) AM_SIZE(&atarigen_eeprom_size)
+ AM_RANGE(0x160000, 0x16ffff) AM_READWRITE(shared_ram_r, MWA16_BANK1) AM_BASE(&shared_ram)
+ AM_RANGE(0x1f0000, 0x1fffff) AM_WRITE(atarigen_eeprom_enable_w)
+ AM_RANGE(0x260000, 0x26000f) AM_READ(input_port_0_word_r)
+ AM_RANGE(0x260010, 0x260011) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x260012, 0x260013) AM_READ(special_port2_r)
+ AM_RANGE(0x260030, 0x260031) AM_READ(atarigen_sound_r)
+ AM_RANGE(0x2e0000, 0x2e0001) AM_WRITE(watchdog_reset16_w)
+ AM_RANGE(0x360010, 0x360011) AM_WRITE(latch_w)
+ AM_RANGE(0x360020, 0x360021) AM_WRITE(atarigen_sound_reset_w)
+ AM_RANGE(0x360030, 0x360031) AM_WRITE(atarigen_sound_w)
+ AM_RANGE(0x3e0000, 0x3e0fff) AM_READWRITE(MRA16_RAM, atarigen_666_paletteram_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x3effc0, 0x3effff) AM_READWRITE(thunderj_video_control_r, atarivc_w) AM_BASE(&atarivc_data)
+ AM_RANGE(0x3f0000, 0x3f1fff) AM_READWRITE(MRA16_RAM, atarigen_playfield2_latched_msb_w) AM_BASE(&atarigen_playfield2)
+ AM_RANGE(0x3f2000, 0x3f3fff) AM_READWRITE(MRA16_RAM, atarigen_playfield_latched_lsb_w) AM_BASE(&atarigen_playfield)
+ AM_RANGE(0x3f4000, 0x3f5fff) AM_READWRITE(MRA16_RAM, atarigen_playfield_dual_upper_w) AM_BASE(&atarigen_playfield_upper)
+ AM_RANGE(0x3f6000, 0x3f7fff) AM_READWRITE(MRA16_RAM, atarimo_0_spriteram_w) AM_BASE(&atarimo_0_spriteram)
+ AM_RANGE(0x3f8000, 0x3f8eff) AM_READWRITE(MRA16_RAM, atarigen_alpha_w) AM_BASE(&atarigen_alpha)
+ AM_RANGE(0x3f8f00, 0x3f8f7f) AM_RAM AM_BASE(&atarivc_eof_data)
+ AM_RANGE(0x3f8f80, 0x3f8fff) AM_READWRITE(MRA16_RAM, atarimo_0_slipram_w) AM_BASE(&atarimo_0_slipram)
+ AM_RANGE(0x3f9000, 0x3fffff) AM_RAM
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Extra CPU memory handlers
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( extra_map, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x03ffff) AM_ROM
+ AM_RANGE(0x060000, 0x07ffff) AM_ROM
+ AM_RANGE(0x160000, 0x16ffff) AM_READWRITE(shared_ram_r, MWA16_BANK1)
+ AM_RANGE(0x260000, 0x26000f) AM_READ(input_port_0_word_r)
+ AM_RANGE(0x260010, 0x260011) AM_READ(input_port_1_word_r)
+ AM_RANGE(0x260012, 0x260013) AM_READ(special_port2_r)
+ AM_RANGE(0x260030, 0x260031) AM_READ(atarigen_sound_r)
+ AM_RANGE(0x360000, 0x360001) AM_WRITE(atarigen_video_int_ack_w)
+ AM_RANGE(0x360010, 0x360011) AM_WRITE(latch_w)
+ AM_RANGE(0x360020, 0x360021) AM_WRITE(atarigen_sound_reset_w)
+ AM_RANGE(0x360030, 0x360031) AM_WRITE(atarigen_sound_w)
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Port definitions
+ *
+ *************************************/
+
+static INPUT_PORTS_START( thunderj )
+ PORT_START /* 260000 */
+ PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNUSED )
+
+ PORT_START /* 260010 */
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0c00, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+
+ PORT_START /* 260012 */
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_VBLANK )
+ PORT_SERVICE( 0x0002, IP_ACTIVE_LOW )
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNUSED ) /* Input buffer full (@260030) */
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNUSED ) /* Output buffer full (@360030) */
+ PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x00e0, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0c00, IP_ACTIVE_LOW, IPT_UNUSED )
+ PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+
+ JSA_II_PORT /* audio board port */
+INPUT_PORTS_END
+
+
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static const gfx_layout anlayout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 2,
+ { 0, 4 },
+ { 0, 1, 2, 3, 8, 9, 10, 11 },
+ { 0*16, 1*16, 2*16, 3*16, 4*16, 5*16, 6*16, 7*16 },
+ 8*16
+};
+
+
+static const gfx_layout pfmolayout =
+{
+ 8,8,
+ RGN_FRAC(1,4),
+ 4,
+ { RGN_FRAC(3,4), RGN_FRAC(2,4), RGN_FRAC(1,4), RGN_FRAC(0,4) },
+ { 0, 1, 2, 3, 4, 5, 6, 7 },
+ { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
+ 8*8
+};
+
+
+static GFXDECODE_START( thunderj )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, pfmolayout, 512, 96 ) /* sprites & playfield */
+ GFXDECODE_ENTRY( REGION_GFX2, 0, pfmolayout, 256, 112 ) /* sprites & playfield */
+ GFXDECODE_ENTRY( REGION_GFX3, 0, anlayout, 0, 512 ) /* characters 8x8 */
+GFXDECODE_END
+
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static MACHINE_DRIVER_START( thunderj )
+
+ /* basic machine hardware */
+ MDRV_CPU_ADD(M68000, ATARI_CLOCK_14MHz/2)
+ MDRV_CPU_PROGRAM_MAP(main_map,0)
+
+ MDRV_CPU_ADD(M68000, ATARI_CLOCK_14MHz/2)
+ MDRV_CPU_PROGRAM_MAP(extra_map,0)
+
+ MDRV_MACHINE_RESET(thunderj)
+ MDRV_NVRAM_HANDLER(atarigen)
+ MDRV_INTERLEAVE(100)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER | VIDEO_UPDATE_BEFORE_VBLANK)
+ MDRV_GFXDECODE(thunderj)
+ MDRV_PALETTE_LENGTH(2048)
+
+ MDRV_SCREEN_ADD("main", 0)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ /* note: these parameters are from published specs, not derived */
+ /* the board uses a VAD chip to generate video signals */
+ MDRV_SCREEN_RAW_PARAMS(ATARI_CLOCK_14MHz/2, 456, 0, 336, 262, 0, 240)
+
+ MDRV_VIDEO_START(thunderj)
+ MDRV_VIDEO_UPDATE(thunderj)
+
+ /* sound hardware */
+ MDRV_IMPORT_FROM(jsa_ii_mono)
+MACHINE_DRIVER_END
+
+
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+
+ROM_START( thunderj )
+ ROM_REGION( 0xa0000, REGION_CPU1, 0 ) /* 10*64k for 68000 code */
+ ROM_LOAD16_BYTE( "136076-2001.14e", 0x00000, 0x10000, CRC(f6a71532) SHA1(b1c55968d7da9b64bde737d66aa8f0ddcdcfee27) )
+ ROM_LOAD16_BYTE( "136076-2002.14c", 0x00001, 0x10000, CRC(173ec10d) SHA1(e32eca9194336f3d7e289b2a187ed125ed03688c) )
+ ROM_LOAD16_BYTE( "136076-2003.15e", 0x20000, 0x10000, CRC(6e155469) SHA1(ba87d0a510304fd8a0f91c81580c4f09fc4d1886) )
+ ROM_LOAD16_BYTE( "136076-2004.15c", 0x20001, 0x10000, CRC(e9ff1e42) SHA1(416dd68ec2ae174a5b14fa6fb4fb88bc1afdda66) )
+ ROM_LOAD16_BYTE( "136076-2005.16e", 0x40000, 0x10000, CRC(a40242e7) SHA1(ea2311f064885912054ae2e50a60664b216a6253) )
+ ROM_LOAD16_BYTE( "136076-2006.16c", 0x40001, 0x10000, CRC(aa18b94c) SHA1(867fd1d5485eacb705ed4ec736ee8c2e78aa9bf4) )
+ ROM_LOAD16_BYTE( "136076-1005.15h", 0x60000, 0x10000, CRC(05474ebb) SHA1(74a32dba5ffe2953c81ad9639d99ed01b31b0dba) )
+ ROM_LOAD16_BYTE( "136076-1010.16h", 0x60001, 0x10000, CRC(ccff21c8) SHA1(7df8facf563cc1bb8de6cac6f2ddcc58ae0aa8b4) )
+ ROM_LOAD16_BYTE( "136076-1007.17e", 0x80000, 0x10000, CRC(9c2a8aba) SHA1(10e4fc04e64bb6a5083a56f630224b5d1af241b2) )
+ ROM_LOAD16_BYTE( "136076-1008.17c", 0x80001, 0x10000, CRC(22109d16) SHA1(8725696271c4a617f9f050d9d483fe4141bf1e00) )
+
+ ROM_REGION( 0x80000, REGION_CPU2, 0 ) /* 8*64k for 68000 code */
+ ROM_LOAD16_BYTE( "136076-1011.17l", 0x00000, 0x10000, CRC(bbbbca45) SHA1(977e785e0272a84c8d7e28e25f45064d1b37aad1) )
+ ROM_LOAD16_BYTE( "136076-1012.17n", 0x00001, 0x10000, CRC(53e5e638) SHA1(75593e5d328ede105b8db64005dd5d1c5cae11ed) )
+ ROM_COPY( REGION_CPU1, 0x60000, 0x60000, 0x20000 )
+
+ ROM_REGION( 0x14000, REGION_CPU3, 0 ) /* 64k + 16k for 6502 code */
+ ROM_LOAD( "136076-2015.1b", 0x10000, 0x4000, CRC(d8feb7fb) SHA1(684ebf2f0c0df742c98e7f45f74de86a11c8d6e8) )
+ ROM_CONTINUE( 0x04000, 0xc000 )
+
+ ROM_REGION( 0x100000, REGION_GFX1, ROMREGION_DISPOSE | ROMREGION_INVERT )
+ ROM_LOAD( "136076-1021.5s", 0x000000, 0x10000, CRC(d8432766) SHA1(04e7d820974c0890fde1257b4710cf7b520d7d48) ) /* graphics, plane 0 */
+ ROM_LOAD( "136076-1025.5r", 0x010000, 0x10000, CRC(839feed5) SHA1(c683ef5b78f8fd63dd557a630544f1e21aebe665) )
+ ROM_LOAD( "136076-1029.3p", 0x020000, 0x10000, CRC(fa887662) SHA1(5d19022e8d40be86b85d0bcc28c97207ab9ec403) )
+ ROM_LOAD( "136076-1033.6p", 0x030000, 0x10000, CRC(2addda79) SHA1(5a04c718055a5637b7549598ec39ca3cc9883698) )
+ ROM_LOAD( "136076-1022.9s", 0x040000, 0x10000, CRC(dcf50371) SHA1(566e71e1dcb8e0266ca870af04b11f7bbee21b18) ) /* graphics, plane 1 */
+ ROM_LOAD( "136076-1026.9r", 0x050000, 0x10000, CRC(216e72c8) SHA1(b6155584c8760c4dee3cf2a6320c53ea2161464b) )
+ ROM_LOAD( "136076-1030.10s", 0x060000, 0x10000, CRC(dc51f606) SHA1(aa401808d915b2e6cdb17a1d58814a753648c9bb) )
+ ROM_LOAD( "136076-1034.10r", 0x070000, 0x10000, CRC(f8e35516) SHA1(dcb23ed69f5a70ac842c6004039ec403bac68d72) )
+ ROM_LOAD( "136076-1023.13s", 0x080000, 0x10000, CRC(b6dc3f13) SHA1(c3369b58012e02ad2fd85f1c9643ee5792f4b3de) ) /* graphics, plane 2 */
+ ROM_LOAD( "136076-1027.13r", 0x090000, 0x10000, CRC(621cc2ce) SHA1(15db80d61f1c624c09085ed86341f8577bfac168) )
+ ROM_LOAD( "136076-1031.14s", 0x0a0000, 0x10000, CRC(4682ceb5) SHA1(609ccd20f654982e01bcc6aea89801c01afe083e) )
+ ROM_LOAD( "136076-1035.14r", 0x0b0000, 0x10000, CRC(7a0e1b9e) SHA1(b9a2270ee7e3b3dcf05a47085890d87bf5b3e167) )
+ ROM_LOAD( "136076-1024.17s", 0x0c0000, 0x10000, CRC(d84452b5) SHA1(29bc994e37bc08fa40326b811339e7aa3290302c) ) /* graphics, plane 3 */
+ ROM_LOAD( "136076-1028.17r", 0x0d0000, 0x10000, CRC(0cc20245) SHA1(ebdcb47909374508abe9d0252fd88d6274a0f729) )
+ ROM_LOAD( "136076-1032.14p", 0x0e0000, 0x10000, CRC(f639161a) SHA1(cc2549f7fdd251fa44735a6cd5fdb8ffb97948be) )
+ ROM_LOAD( "136076-1036.16p", 0x0f0000, 0x10000, CRC(b342443d) SHA1(fa7865f8a90c0e761e1cc5e155931d0574f2d81c) )
+
+ ROM_REGION( 0x100000, REGION_GFX2, ROMREGION_DISPOSE | ROMREGION_INVERT )
+ ROM_LOAD( "136076-1037.2s", 0x000000, 0x10000, CRC(07addba6) SHA1(4a3286ee570bf4263944854bf959c8ef114cc123) )
+ ROM_LOAD( "136076-1041.2r", 0x010000, 0x10000, CRC(1e9c29e4) SHA1(e4afa2c469bfa22504cba5dfd23704c5c2bb33c4) )
+ ROM_LOAD( "136076-1045.34s", 0x020000, 0x10000, CRC(e7235876) SHA1(0bb03baec1de3e520dc270a3ed44bec953e08c00) )
+ ROM_LOAD( "136076-1049.34r", 0x030000, 0x10000, CRC(a6eb8265) SHA1(f9b5fbe69b973327ebe5ea6e9fa782cb6db010d6) )
+ ROM_LOAD( "136076-1038.6s", 0x040000, 0x10000, CRC(2ea543f9) SHA1(e5dafe023b1dc5068f367293da5774ab98ec617c) )
+ ROM_LOAD( "136076-1042.6r", 0x050000, 0x10000, CRC(efabdc2b) SHA1(449fa8f229d901328aa14c1d093d10ba1c7e7cd9) )
+ ROM_LOAD( "136076-1046.7s", 0x060000, 0x10000, CRC(6692151f) SHA1(294fb66f4a25ce0282b8f3b032df7a7103842540) )
+ ROM_LOAD( "136076-1050.7r", 0x070000, 0x10000, CRC(ad7bb5f3) SHA1(1e7083cafd4c06397991cb873eeeb4b4c8a81d9d) )
+ ROM_LOAD( "136076-1039.11s", 0x080000, 0x10000, CRC(cb563a40) SHA1(086619ae47c1c0b5fb1913b3e657216e021a3713) )
+ ROM_LOAD( "136076-1043.11r", 0x090000, 0x10000, CRC(b7565eee) SHA1(610439f8e08fb88a646e76180bcd72ddfec8c06a) )
+ ROM_LOAD( "136076-1047.12s", 0x0a0000, 0x10000, CRC(60877136) SHA1(ac7154b9324782c5c22e18c1d325f58c88938170) )
+ ROM_LOAD( "136076-1051.12r", 0x0b0000, 0x10000, CRC(d4715ff0) SHA1(f0c2c7057d84b337ab1f44667e6048885922698e) )
+ ROM_LOAD( "136076-1040.15s", 0x0c0000, 0x10000, CRC(6e910fc2) SHA1(29b811e0d8283dd00e2d79c2cbe120faa6834008) )
+ ROM_LOAD( "136076-1044.15r", 0x0d0000, 0x10000, CRC(ff67a17a) SHA1(17f3572b526a14bdf3a6da5711c4d96feefc25aa) )
+ ROM_LOAD( "136076-1048.16s", 0x0e0000, 0x10000, CRC(200d45b3) SHA1(72f1b3deaebc6266140fb79a97154f80f2cadf33) )
+ ROM_LOAD( "136076-1052.16r", 0x0f0000, 0x10000, CRC(74711ef1) SHA1(c1429d6b54dc4352defdd6cf83f1a5734784e703) )
+
+ ROM_REGION( 0x010000, REGION_GFX3, ROMREGION_DISPOSE )
+ ROM_LOAD( "136076-1020.4m", 0x000000, 0x10000, CRC(65470354) SHA1(9895d26fa9e01c254a3d15e657152cac717c68a3) ) /* alphanumerics */
+
+ ROM_REGION( 0x40000, REGION_SOUND1, 0 ) /* 256k for ADPCM */
+ ROM_LOAD( "136076-1016.7k", 0x00000, 0x10000, CRC(c10bdf73) SHA1(a0371c6ddef2a95193c68879044b3338d481fc96) )
+ ROM_LOAD( "136076-1017.7j", 0x10000, 0x10000, CRC(4e5e25e8) SHA1(373c946abd24ce8dd5221f1a0409af4537610d3d) )
+ ROM_LOAD( "136076-1018.7e", 0x20000, 0x10000, CRC(ec81895d) SHA1(56acffb0700d3b70ca705fba9d240a82950fd320) )
+ ROM_LOAD( "136076-1019.7d", 0x30000, 0x10000, CRC(a4009037) SHA1(01cd3f4cf510f4956258f39f3ddbb42628bc2b9a) )
+
+ ROM_REGION( 0x0e00, REGION_PLDS, ROMREGION_DISPOSE )
+ ROM_LOAD( "gal16v8a-136076-1070.12e", 0x0000, 0x0117, CRC(0e96e51e) SHA1(bf23d0089e5e34ad579cb56ff869353545c29792) )
+ ROM_LOAD( "gal16v8a-136076-1071.13j", 0x0200, 0x0117, CRC(ad7beb34) SHA1(d50fa0526fd83b6a9a79adcacef56a64ebafa448) )
+ ROM_LOAD( "gal16v8a-136076-1072.5n", 0x0400, 0x0117, CRC(2827620a) SHA1(25c5dfae3d8f4b73936833031b95fafd2ba0ae5d) )
+ ROM_LOAD( "gal16v8a-136076-1073.2h", 0x0600, 0x0117, CRC(a2fe4402) SHA1(ef93eee062d51885504dcc58c34cad656e5b1ec4) )
+ ROM_LOAD( "gal16v8a-136076-2074.3l", 0x0800, 0x0117, CRC(0e8bc5d7) SHA1(815ecd2cbb3469501f29172a4425bee930852c11) )
+ ROM_LOAD( "gal20v8a-136076-1075.2l", 0x0a00, 0x0157, CRC(e75e1e86) SHA1(26d09b614a24bd736fd17a3145f9cc4d61a2d1a9) )
+ ROM_LOAD( "gal20v8a-136076-1076.1l", 0x0c00, 0x0157, CRC(f36f873a) SHA1(63e6cc6e50370e89ebe33aa8d4ff9c6e1faeb9a6) )
+ROM_END
+
+
+
+/*************************************
+ *
+ * Driver initialization
+ *
+ *************************************/
+
+static DRIVER_INIT( thunderj )
+{
+ atarigen_eeprom_default = NULL;
+ atarijsa_init(2, 3, 2, 0x0002);
+}
+
+
+
+/*************************************
+ *
+ * Game driver(s)
+ *
+ *************************************/
+
+GAME( 1990, thunderj, 0, thunderj, thunderj, thunderj, ROT0, "Atari Games", "ThunderJaws", 0 )