summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/turbosub.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/turbosub.c')
-rw-r--r--src/mame/drivers/turbosub.c464
1 files changed, 464 insertions, 0 deletions
diff --git a/src/mame/drivers/turbosub.c b/src/mame/drivers/turbosub.c
new file mode 100644
index 00000000000..90a4d7e82b7
--- /dev/null
+++ b/src/mame/drivers/turbosub.c
@@ -0,0 +1,464 @@
+/***********************************************************************
+
+ Entertainment Sciences Real-Time Image Processor System
+
+Turbo Sub 1986
+Bouncer 1983 (No ROMs available)
+
+Hardware
+========
+* 6809 (Game Processor)
+ - i8251A (USART)
+* 6809 (Frame Processor)
+* 6809 (Sound Processor)
+ - TMS5220NL
+ - DAC
+* AM29116DC (Video Processor)
+
+Useful References
+=================
+http://www.turbosub.com/schematics.htm
+http://www.turbosub.com/ripdoc1.jpg (1 to 4)
+http://www.ionpool.net/arcade/es/turbo_sub.html
+http://www.bitsavers.org/pdf/amd/_dataSheets/29116_dataSheet_Mar86.pdf
+
+Note: The schematics do not represent exactly the final hardware.
+
+Information
+===========
+
+The game processor is responsible for gameplay and reading inputs
+(keypad, ADC and digital). It shares 16kB of RAM with the frame processor.
+According to the schematics, it also has access to collision detection RAM
+and palette RAM used by the video system.
+
+The frame processor organises data supplied by the game processor into a
+suitable format for the video processor and video hardware. It shares 8kB of
+banked RAM (Frame Drive Table) with the video processor.
+
+The video processor instructions are stored in 6 PROMS (which are ARE
+NOT DUMPED).
+
+Each CPU has a R/W status port used to communicate with the other CPUs
+and hardware.
+
+***********************************************************************/
+
+#include "driver.h"
+#include "cpu/m6809/m6809.h"
+
+/* Set to 1 to display test results and skip on errors */
+#define ROM_PATCHES 1
+
+/* Frame Drive Table bank indicators */
+static int _FASEL = 0;
+static int _FBSEL = 1;
+
+static UINT8 *FDT_A;
+static UINT8 *FDT_B;
+static UINT8 INTER_CPU_REG;
+
+static VIDEO_START( turbosub )
+{
+}
+
+static VIDEO_UPDATE( turbosub )
+{
+ return 0;
+}
+
+
+static MACHINE_RESET( turbosub )
+{
+#if ROM_PATCHES
+ UINT8 *rom = (UINT8 *)memory_region(REGION_CPU1);
+
+ rom[0xf564]=0; /* Display test status */
+ rom[0xf60a]=0x20; /* Skip on error */
+#endif
+}
+
+static DRIVER_INIT( turbosub )
+{
+ FDT_A = auto_malloc(0x1000);
+ FDT_B = auto_malloc(0x1000);
+}
+
+/* i8251A UART */
+static WRITE8_HANDLER( UART_W )
+{
+ if (offset==0)
+ mame_printf_debug("%c",data);
+}
+
+static READ8_HANDLER( UART_R )
+{
+ return 0;
+}
+
+/*
+ Game Processor
+ ==============
+
+Status Write Status Read
+============ ===========
+0: 6809 #0 ROM bank bit 0 0: Frame CPU status out D0
+1: 6809 #0 ROM bank bit 1 1: Frame CPU status out D0
+2: 2: Frame CPU status out D0
+3: 3: Frame CPU status out D0
+4: ? (usually 1) 4:
+5: ? (usually 1) 5:
+6: V0? (AM29116)(active high?) 6:
+7: Game/Frame CPU NMI 7: /RIPERR ?
+
+*/
+
+static READ8_HANDLER( G_STATUS_R )
+{
+ return 0x80 | INTER_CPU_REG;
+}
+
+static WRITE8_HANDLER( G_STATUS_W )
+{
+ int bankaddress;
+ UINT8 *ROM = memory_region(REGION_CPU1);
+ bankaddress = 0x10000 + (data & 0x03) * 0x10000;
+ memory_set_bankptr(1,&ROM[bankaddress]);
+
+ cpunum_set_input_line(0, INPUT_LINE_NMI, (data&0x80) ? ASSERT_LINE : CLEAR_LINE);
+ cpunum_set_input_line(1, INPUT_LINE_NMI, (data&0x80) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+/*
+ Frame Processor
+ ===============
+
+Status Write Status Read
+============ ===========
+0: Game CPU status in D0 0: /VBLANK ?
+1: Game CPU status in D1 1:
+2: Game CPU status in D2 2:
+3: Game CPU status in D3 3:
+4: 4:
+5: 5:
+6: 6: /FBSEL
+7: 7:
+
+*/
+
+static READ8_HANDLER( F_STATUS_R )
+{
+ return (_FBSEL << 6);
+}
+
+static WRITE8_HANDLER( F_STATUS_W )
+{
+ INTER_CPU_REG = data;
+}
+
+static WRITE8_HANDLER( FRAME )
+{
+ _FASEL = !_FASEL;
+ _FBSEL = !_FBSEL;
+}
+
+static READ8_HANDLER( FDT_R )
+{
+ if(!_FASEL)
+ return FDT_A[offset];
+ else
+ return FDT_B[offset];
+}
+
+static WRITE8_HANDLER( FDT_W )
+{
+ if(!_FASEL)
+ FDT_A[offset] = data;
+ else
+ FDT_B[offset] = data;
+}
+
+static INPUT_PORTS_START( turbosub )
+PORT_START
+INPUT_PORTS_END
+
+/*
+TURBOSUB.U85
+============
+
+Vectors
+=======
+
+Reset = E002
+/NMI = E3D0 (Not used = RTI)
+SWI = E8D0
+IRQ = E133
+FIRQ = E319
+Others = E3D0 (Not used = RTI)
+
+
+Self-tests (initiated by CPU 0)
+===============================
+
+ f561: LDY, #$0001 Change to 0 to print out test results.
+ f737: JMP [A,X] A = test number/2
+
+ Test Loc. Desc. Status
+ ==== ==== ===== ======
+ 0-16 CPU 0 ROM checksums OK
+ 17 CPU 0 RAM 0000-07ff OK
+ 18 CPU 0 RAM 0800-0fff OK
+ 19 CPU 0 RAM 1000-17ff OK
+ 20 CPU 0 RAM 1800-1fff OK
+ 21 CPU 0 RAM 2000-27ff OK
+ 22 CPU 0 RAM 2800-2fff OK
+ 23 CPU 0 RAM 3000-37ff OK
+ 24 0xf90d ? FAIL
+ [4800]<-b10010000
+ [4800]<-b11010000
+ Expect bit 7 of [4800] == 1 on SECOND access or thereafter.
+
+ 25 0xf966 CPU 0<->1 communication test OK
+ 26 0xf98b CPU 1 ROM e000-ffff checksum OK
+ 27 0xf990 CPU 1 RAM 3000-37ff OK
+ 28 0xf995 CPU 1 RAM 0000-0fff OK
+ 29 0xf99a CPU 1 RAM 1000-17ff OK
+ 30 0xf99f CPU 1 RAM 1800-1fff OK
+ 31 0xf9a4 CPU 1 RAM 2000-27ff OK
+ 32 0xf9a9 CPU 1 RAM 2800-2fff OK
+ 33 0xf9ae CPU 1 RAM 3000-37ff OK
+ 34 0xf9b3 CPU 1 RAM 3800-3fff OK
+
+ 35 0xf9dd/0xf115 FAIL
+
+ 36 0xf9e3/f151 TEST banked FDT? OK
+ 37 0xf9e3 TEST banked FDT? OK
+ 38 0xf9e3 CPU 1 FDT (even bytes) OK
+ 39 0xf9e3 CPU 1 FDT (odd bytes) OK
+
+ 40 0xfa06 FAIL
+ 41 0xfafd OK
+ 42 0xfb0e FAIL
+ 43 0xfb2a FAIL
+ 44 0xfbc9 FAIL
+ 45 0xfd61 FAIL
+ 46 0xfd70 FAIL
+ 47 0xfd97 FAIL
+ 48 0xfdc9 FAIL
+ 49 0xfdee FAIL
+ 50 0xfe05 FAIL
+ 51 0xfe3d FAIL
+ 52 0xfe54 FAIL
+ 53 0xfe6b FAIL
+ 54 0xfe82 FAIL
+ 55 0xfe99 FAIL
+*/
+
+static ADDRESS_MAP_START( game_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE(1)
+ AM_RANGE(0x40ff, 0x40ff) AM_RAM /* W */
+ AM_RANGE(0x41ff, 0x41ff) AM_RAM /* W */
+ AM_RANGE(0x42ff, 0x4300) AM_RAM /* W */
+ AM_RANGE(0x4800, 0x4800) AM_READWRITE(G_STATUS_R, G_STATUS_W) /* Status port */
+ AM_RANGE(0x4C00, 0x4C00) AM_RAM /* R/W - An input device? (doesn't enter auto mode depending on read) */
+ AM_RANGE(0x5000, 0x5000) AM_RAM /* Write - related to 4C00. Bit 8 = ? bits0..3 =???? */
+ AM_RANGE(0x5400, 0x54ff) AM_RAM /* UART buffer? */
+ AM_RANGE(0x5c00, 0x5c01) AM_READWRITE(UART_R, UART_W) /* i8251A USART */
+ AM_RANGE(0x6000, 0xdfff) AM_READWRITE(MRA8_BANK1, MWA8_ROM) /* Bank switched ROMs */
+ AM_RANGE(0xe000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+/*
+TURBOSUB.U63
+============
+
+Vectors
+=======
+
+Reset: EF2A
+/NMI: EF30
+Others: E064
+
+*/
+
+static ADDRESS_MAP_START( frame_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x3fff) AM_RAM AM_SHARE(1) /* 16kB RAM: Shared with game CPU */
+ AM_RANGE(0x4000, 0x4fff) AM_READWRITE(FDT_R, FDT_W) /* 8kB RAM: Frame Drive Table (banked) */
+ AM_RANGE(0x6000, 0x6000) AM_READWRITE(F_STATUS_R, F_STATUS_W) /* Status port */
+ AM_RANGE(0x8000, 0x8000) AM_WRITE(FRAME)
+ AM_RANGE(0xc000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+/*
+TURBOSUB.U66
+============
+
+Vectors
+=======
+
+Reset: ecb5 `
+/NMI: ecb5
+FIRQ: e114
+IRQ: e0d3
+
+SWI: e13d
+SWI2: e13d
+SWI3: e13d
+
+*/
+
+
+/* Sound CPU */
+
+static ADDRESS_MAP_START( sound_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x07ff) AM_RAM
+ AM_RANGE(0x2008, 0x2008) AM_RAM /* R=status line? D7 0=Ready? 1=Not ready? */
+ AM_RANGE(0x2009, 0x2009) AM_RAM /* W (only written once - with value read from 2008) */
+ AM_RANGE(0x200a, 0x200b) AM_RAM /* W 16-bit value during FIRQ */
+ AM_RANGE(0x200c, 0x200c) AM_RAM /* W */
+ AM_RANGE(0x200d, 0x200d) AM_RAM /* W - 03 */
+ AM_RANGE(0x200e, 0x200e) AM_RAM /* R/W - communication with game processor */
+ AM_RANGE(0x200f, 0x200f) AM_RAM /* R/W - communication with game processor */
+ AM_RANGE(0x2020, 0x2020) AM_RAM /* W - 42 */
+ AM_RANGE(0x2021, 0x2021) AM_RAM /* W - 42,1 and R during FIRQ? */
+ AM_RANGE(0x2022, 0x2023) AM_RAM /* R/W rarely */
+ AM_RANGE(0x2024, 0x2025) AM_RAM /* R/W rarely */
+ AM_RANGE(0x8000, 0x8006) AM_RAM /* R */
+ AM_RANGE(0xc000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+
+static MACHINE_DRIVER_START( turbosub )
+
+ MDRV_CPU_ADD(M6809E,4000000)
+ MDRV_CPU_PROGRAM_MAP(game_cpu_map,0)
+ MDRV_CPU_VBLANK_INT(irq0_line_assert,1) /* Unverified */
+
+ MDRV_CPU_ADD(M6809E,4000000)
+ MDRV_CPU_PROGRAM_MAP(frame_cpu_map,0)
+
+ MDRV_CPU_ADD(M6809E,4000000)
+ MDRV_CPU_PROGRAM_MAP(sound_cpu_map,0)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ /* video hardware */
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(34*8, 34*8)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 34*8-1, 0, 34*8-1)
+ MDRV_PALETTE_LENGTH(512)
+ MDRV_MACHINE_RESET( turbosub )
+ MDRV_INTERLEAVE(100)
+
+ MDRV_VIDEO_START(turbosub)
+ MDRV_VIDEO_UPDATE(turbosub)
+MACHINE_DRIVER_END
+
+ROM_START( turbosub )
+ ROM_REGION( 0xc0000, REGION_USER1, 0) /* Non-bankswitched, 6809 #0 code */
+ ROM_LOAD( "turbosub.u85", 0x18000, 0x4000, CRC(eabb9509) SHA1(cbfb6c5becb3fe1b4ed729e92a0f4029a5df7d67) )
+
+ ROM_REGION( 0x48000, REGION_CPU1, 0 ) /* Bankswitched 6809 code */
+ ROM_LOAD( "turbosub.u82", 0x10000, 0x2000, CRC(de32eb6f) SHA1(90bf31a5adf261d47b4f52e93b5e97f343b7ebf0) )
+ ROM_CONTINUE( 0x20000, 0x2000 )
+ ROM_LOAD( "turbosub.u81", 0x12000, 0x2000, CRC(9ae09613) SHA1(9b5ada4a21473b30be98bcc461129b6ed4e0bb11) )
+ ROM_CONTINUE( 0x22000, 0x2000 )
+ ROM_LOAD( "turbosub.u87", 0x14000, 0x2000, CRC(ad2284f7) SHA1(8e11b8ad0a98dd1fe6ec8f7ea9e6e4f4a45d8a1b) )
+ ROM_CONTINUE( 0x24000, 0x2000 )
+ ROM_LOAD( "turbosub.u86", 0x16000, 0x2000, CRC(4f51e6fd) SHA1(8f51ac6412aace29279ce7b02cad45ed681c2065) )
+ ROM_CONTINUE( 0x26000, 0x2000 )
+
+ ROM_LOAD( "turbosub.u80", 0x30000, 0x2000, CRC(ff2e2870) SHA1(45f91d63ad91585482c9dd05290b204b007e3f44) )
+ ROM_CONTINUE( 0x40000, 0x2000 )
+ ROM_LOAD( "turbosub.u79", 0x32000, 0x2000, CRC(13680923) SHA1(14e3daa2178853cef1fd96a68305420c11fceb96) )
+ ROM_CONTINUE( 0x42000, 0x2000 )
+ ROM_LOAD( "turbosub.u84", 0x34000, 0x2000, CRC(7059842d) SHA1(c20a8accd3fc23bc4476e1d08798d7a80915d37c) )
+ ROM_CONTINUE( 0x44000, 0x2000 )
+ ROM_LOAD( "turbosub.u83", 0x36000, 0x2000, CRC(31b86fc6) SHA1(8e56e8a75f653c3c4da2c9f31f739894beb194db) )
+ ROM_CONTINUE( 0x46000, 0x2000 )
+
+ /* e000 - ffff = Upper half of U85 (lower half is blank) */
+ ROM_COPY( REGION_USER1, 0x18000+0x2000, 0xe000, 0x2000 )
+
+ ROM_REGION( 0x10000, REGION_CPU2, 0 )
+ ROM_LOAD( "turbosub.u63", 0xc000, 0x4000, CRC(35701532) SHA1(77d957682aab10ee902c1e47c468b9ab8fe6a512) )
+
+ ROM_REGION( 0x10000, REGION_CPU3, 0 )
+ ROM_LOAD( "turbosub.u66", 0xc000, 0x4000, CRC(5091bf3d) SHA1(7ab872cef1562a45f7533c16bbbae8772673465b) )
+
+ ROM_REGION( 0xc0000, REGION_USER2, 0) /* Unknown */
+ ROM_LOAD( "turbosub.u67", 0x00000, 0x4000, CRC(f8ae82e9) SHA1(fd27b9fe7872c3c680a1f71a4a5d5eeaa12e4a19) )
+ ROM_LOAD( "turbosub.u68", 0x04000, 0x4000, CRC(72e3d09b) SHA1(eefdfcd0c4c32e465f18d40f46cb5bc022c22bfd) )
+ ROM_LOAD( "turbosub.u69", 0x00000, 0x4000, CRC(ad04193b) SHA1(2f660302e60a7e68e079a8dd13266a77c077f939) )
+
+ ROM_REGION( 0x80000, REGION_GFX1, 0 ) /* Incorrect */
+ ROMX_LOAD( "turbosub.u4", 0x00000, 0x4000, CRC(08303604) SHA1(f075b645d89a2d91bd9b621748906a9f9890ee60), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u14", 0x00001, 0x4000, CRC(83b26c8d) SHA1(2dfa3b45c44652d255c402511bb3810fffb0731d), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u24", 0x00002, 0x4000, CRC(6bbb6cb3) SHA1(d513e547a05b34076bb8261abd51301ac5f3f5d4), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u34", 0x00003, 0x4000, CRC(7b844f4a) SHA1(82467eb7e116f9f225711a1698c151945e1de6e4), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u9", 0x10000, 0x4000, CRC(9a03eadf) SHA1(25ee1ebe52f030b2fa09d76161e46540c91cbc4c), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u19", 0x10001, 0x4000, CRC(498253b8) SHA1(dd74d4f9f19d8a746415baea604116faedb4fb31), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u29", 0x10002, 0x4000, CRC(809c374f) SHA1(d3849eed8441e4641ffcbca7c83ee3bb16681a0b), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u39", 0x10003, 0x4000, CRC(3e4e0681) SHA1(ac834f6823ffe835d6f149e79c1d31ae2b89e85d), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u3", 0x20000, 0x4000, CRC(825ef29c) SHA1(affadd0976f793b8bdbcbc4768b7de27121e7b11), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u13", 0x20001, 0x4000, CRC(350cc17a) SHA1(b98d16be997fc0576d3206f51f29ce3e257492d3), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u23", 0x20002, 0x4000, CRC(b1531916) SHA1(805a23f40aa875f431e835fdaceba87261c14155), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u33", 0x20003, 0x4000, CRC(0d5130cb) SHA1(7e4e4e5ea50c581a60d15964571464029515c720), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u8", 0x30000, 0x4000, CRC(01118737) SHA1(3a8e998b80dffe82296170273dcbbe9870c5b695), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u18", 0x30001, 0x4000, CRC(39fd8e57) SHA1(392f8a8cf58fc4813de840775d9c53561488152d), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u28", 0x30002, 0x4000, CRC(0628586d) SHA1(e37508c2812e1c98659aaba9c495e7396842614e), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u38", 0x30003, 0x4000, CRC(7d597a7e) SHA1(2f48faf75406ab3ff0b954040b74e68b7ca6f7a5), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u2", 0x40000, 0x4000, CRC(a8b8c032) SHA1(20512a3a1f8b9c0361e6f5a7e9a50605be3ae650), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u12", 0x40001, 0x4000, CRC(a2c4badf) SHA1(267af1be6261833211270af25045e306efffee80), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u22", 0x40002, 0x4000, CRC(97b7cf0e) SHA1(888fb2f384a5cba8a6f7569886eb6dc27e2b024f), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u32", 0x40003, 0x4000, CRC(b286710e) SHA1(5082db13630ba0967006619027c39ee3607b838d), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u7", 0x50000, 0x4000, CRC(50eea315) SHA1(567dbb3cb3a75a7507f4cb4748c7dd878e69d6b7), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u17", 0x50001, 0x4000, CRC(8a9e19e6) SHA1(19067e153c0002edfd4a756f92ad75d9a0cbc3dd), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u27", 0x50002, 0x4000, CRC(1c81a8d9) SHA1(3d13d1ccd7ec3dddf2a27600eb64b5be386e868c), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u37", 0x50003, 0x4000, CRC(59f978cb) SHA1(e99d6378de941cad92e9702fcb18aea87acd371f), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u1", 0x60000, 0x4000, CRC(88b0a7a9) SHA1(9012c8059cf60131efa6a0432accd87813187206), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u11", 0x60001, 0x4000, CRC(9f0ff723) SHA1(54b52b4ebc32f10aa32c799ac819928290e70455), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u21", 0x60002, 0x4000, CRC(b4122fe2) SHA1(50e8b488a7b7f739336b60a3fd8a5b14f5010b75), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u31", 0x60003, 0x4000, CRC(3fa15c78) SHA1(bf5cb85fc26b5045ad5acc944c917b068ace2c49), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u6", 0x70000, 0x4000, CRC(841e00bd) SHA1(f777cc8dd8dd7c8baa2007355a76db782a218efc), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u16", 0x70001, 0x4000, CRC(d3b63d81) SHA1(e86dd64825f6d9e7bebc26413f524a8962f68f2d), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u26", 0x70002, 0x4000, CRC(867cfe32) SHA1(549e4e557d63dfab8e8c463916512a1b422ce425), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u36", 0x70003, 0x4000, CRC(0d8ebc21) SHA1(7ae65edae05869376caa975ff2c778a08e8ad8a2), ROM_SKIP(3) )
+
+ ROM_REGION( 0x40000, REGION_GFX2, 0) /* Incorrect */
+ ROMX_LOAD( "turbosub.u44", 0x00000, 0x4000, CRC(eaa05860) SHA1(f649891dae9354b7f2e46e6a380b52a569229d64), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u54", 0x00001, 0x4000, CRC(bebf98d8) SHA1(170502bb44fc6d6bf14d8dac4778b37888c14a7b), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u49", 0x00002, 0x4000, CRC(b4170ac2) SHA1(bdbfc43c891c8d525dcc46fb9d05602263ab69cd), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u59", 0x00003, 0x4000, CRC(9c1f4397) SHA1(94335f2db2650f8b7e24fc3f92a04b73325ab164), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u43", 0x10000, 0x4000, CRC(5d76237c) SHA1(3d50347856039e43290497348447b1c4581f3a33), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u53", 0x10001, 0x4000, CRC(1352d58a) SHA1(76ae86c365dd4c9e1a6c5af91c01d31e7ee35f0f), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u48", 0x10002, 0x4000, CRC(cea4e036) SHA1(4afce4f2a09adf9c83ab7188c05cd7236dea16a3), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u58", 0x10003, 0x4000, CRC(5024d83f) SHA1(a293d92a0ae01901b5618b0250d48e3ba631dfcb), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u42", 0x20000, 0x4000, CRC(057a1c72) SHA1(5af89b128b7818550572d02e5ff724c415fa8b8b), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u52", 0x20001, 0x4000, CRC(070d07d6) SHA1(4c81310cd646641a380817fedffab66e76529c97), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u47", 0x20002, 0x4000, CRC(10def494) SHA1(a3ba691eb2b0d782162ffc6c081761965844a3a9), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u57", 0x20003, 0x4000, CRC(5ddb0458) SHA1(d1169882397f364ca38fbd563250b33d13b1a7c6), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u41", 0x30000, 0x4000, CRC(014bb06b) SHA1(97276ba26b60c2907e59b92cc9de5251298579cf), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u51", 0x30001, 0x4000, CRC(43cdcb5c) SHA1(3dd966daa904d3be7be63c584ba033c0e7904d5c), ROM_SKIP(3) )
+
+ ROMX_LOAD( "turbosub.u46", 0x30002, 0x4000, CRC(3b866e2c) SHA1(c0dd4827a18eb9f4b1055d92544beed10f01fd86), ROM_SKIP(3) )
+ ROMX_LOAD( "turbosub.u56", 0x30003, 0x4000, CRC(6d116adf) SHA1(f808e28cef41dc86e43d8c12966037213da87c87), ROM_SKIP(3) )
+ROM_END
+
+GAME( 1986, turbosub, 0, turbosub, turbosub, turbosub, ROT0, "Entertainment Sciences", "Turbo Sub",GAME_NO_SOUND|GAME_IMPERFECT_GRAPHICS|GAME_NOT_WORKING )
+/* One day, perhaps Bouncer will be added here... */