// license:BSD-3-Clause // copyright-holders:Angelo Salese /***************************************************************************************************************** Marine Date (c) 1981 Taito driver by Angelo Salese, original "wiped off due of not anymore licenseable" driver by insideoutboy. TODO: - discrete sound - imperfect colors: unused bit 2 of color prom, guessworked sea gradient, mg16 entirely unused. also unused colors 0x10-0x1f (might be a flashing bank) - collision detection isn't perfect, sometimes octopus gets stuck and dies even if moves are still available. HW collision detection isn't perfect even from the reference, presumably needs a trojan run on the real HW. - ROM writes (irq mask?) - Merge devices with crbaloon/bking/grchamp drivers (PC3259). - Currently defaults to cocktail instead of upright. When upright chosen, screen is upside down. (MT 07311) ***************************************************************************************************************** Marine Date Taito 1981 PCB Layout ---------- Top board MGO70001 MGN00001 |---------------------------------------------| | VOL VR1 VR2 VR3 VR4 VR5 VR6 VR7 | | LM3900 LM3900 LM3900 LM3900 LM3900 LM3900 |-| |MB3712 |P| | 4006 LM3900 LM3900 LM3900 | | |2 4030 |-| |2 | |W DSW(8) | |A |-| |Y HD14584 NE555 MG17 DSW(8) |Q| | | | | HD14584 |-| | HD14584 | |---------------------------------------------| Notes: (PCB contains lots of resistors/caps/transistors etc) MG17 - 82S123 bipolar PROM (no location on PCB) MB3712 - Hitachi MB3712 Audio Power Amplifier LM3900 - Texas Instruments LM3900 Quad Operational Amplifier HD14584 - Hitachi HD14584 Hex schmitt Trigger NE555 - NE555 Timer 4006 - RCA CD4006 18-Stage Static Register 4030 - RCA CD4030 Quad Exclusive-Or Gate VR* - Volume pots for each sound VOL - Master Volume pot Middle board MGO70002 MGN00002 |---------------------------------------------| | MG15.1A | |-| MG14.2A |-| |S| |Q| | | | | |-| MG16.4E |-| | | | | |-| MG13.6H MG12.6C |-| |R| |P| | | PC3259 | | |-| PC3259 |-| | | |---------------------------------------------| Notes: MG12/13 - Hitachi HN462532 4kx8 EPROM MG14/15/16 - 82S123 bipolar PROM PC3259 - PC3259 8025 H08 unknown DIP24 IC. Package design indicates it was manufactured by Fujitsu Lower board AA017779 sticker: MGN00003 sticker: CLN00002 |---------------------------------------------| | 9.987MHz 2114 | |-| 2114 | |R| MG07.10D 2114 | | | MG06.9D 2114 | |-| 2114 1| | MG05.7D 8|Edge | MG04.6D W|Connector 'T' |-| MG03.5D A| |S| MG02.4D Y| | | MG01.3D MG09.4F | |-| MG10.3F | | Z80 MG11.1F | |---------------------------------------------| Notes: Z80 - Clock 2.49675MHz [9.987/4] 2114 - 1kx4 SRAM All EPROMs are 2716 Wire jumpers for ROM configuration - J1 open J2 1-2, 3-9, 4-8, 5-7 J4 1-2, 4-5, 7-8, 10-11 Top and Middle PCBs are plugged in with the solder-sides together. Lower PCB is plugged in with components facing up. *****************************************************************************************************************/ #include "emu.h" #include "cpu/z80/z80.h" #include "emupal.h" #include "screen.h" #include "speaker.h" #include "tilemap.h" #define MAIN_CLOCK XTAL(9'987'000) class marinedt_state : public driver_device { public: marinedt_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_screen(*this, "screen") , m_vram(*this, "vram") , m_gfxdecode(*this, "gfxdecode") , m_in_track(*this, {"P1_TRACKX", "P2_TRACKX", "P1_TRACKY", "P2_TRACKY"}) { } void marinedt(machine_config &config); protected: // driver_device overrides virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; private: // screen updates uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void marinedt_palette(palette_device &palette) const; DECLARE_READ8_MEMBER(trackball_r); DECLARE_READ8_MEMBER(pc3259_r); DECLARE_WRITE8_MEMBER(vram_w); DECLARE_WRITE8_MEMBER(obj_0_w); DECLARE_WRITE8_MEMBER(obj_1_w); DECLARE_WRITE8_MEMBER(bgm_w); DECLARE_WRITE8_MEMBER(sfx_w); DECLARE_WRITE8_MEMBER(layer_enable_w); DECLARE_WRITE8_MEMBER(output_w); TILE_GET_INFO_MEMBER(get_tile_info); void marinedt_io(address_map &map); void marinedt_map(address_map &map); // devices required_device m_maincpu; required_device m_screen; required_shared_ptr m_vram; required_device m_gfxdecode; required_ioport_array<4> m_in_track; tilemap_t *m_tilemap; std::unique_ptr m_seabitmap[2]; struct { uint8_t offs; uint8_t x; uint8_t y; bitmap_ind16 bitmap; }m_obj[2]; uint8_t m_layer_en; uint8_t m_in_select; bool m_screen_flip; uint8_t m_sea_bank; void init_seabitmap(); void obj_reg_w(uint8_t which,uint8_t reg, uint8_t data); uint32_t obj_to_obj_collision(); uint32_t obj_to_layer_collision(); }; TILE_GET_INFO_MEMBER(marinedt_state::get_tile_info) { int code = m_vram[tile_index]; SET_TILE_INFO_MEMBER(0, code, 0, 0); } // initialize sea bitmap gradient void marinedt_state::init_seabitmap() { const rectangle clip(32, 256, 32, 256); m_seabitmap[0] = std::make_unique(512, 512); m_seabitmap[1] = std::make_unique(512, 512); m_seabitmap[0]->fill(64, clip); m_seabitmap[1]->fill(64+32, clip); for (int y = clip.min_y; y <= clip.max_y; y++) { for (int x = clip.min_x; x <= clip.max_x; x++) { // TODO: exact formula (related to total h size?) uint8_t blue_pen = 0x48 + ((x-32) / 8); // clamp if(blue_pen > 0x5f) blue_pen = 0x5f; m_seabitmap[0]->pix16(y, x) = blue_pen; m_seabitmap[1]->pix16(y, x) = blue_pen+0x20; } } } void marinedt_state::video_start() { m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(marinedt_state::get_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32); m_tilemap->set_transparent_pen(0); init_seabitmap(); // m_obj[0].bitmap = std::make_unique(512, 512); // m_obj[1].bitmap = std::make_unique(512, 512); // m_screen->register_screen_bitmap(m_seabitmap); m_screen->register_screen_bitmap(m_obj[0].bitmap); m_screen->register_screen_bitmap(m_obj[1].bitmap); save_item(NAME(m_obj[0].x)); save_item(NAME(m_obj[0].y)); save_item(NAME(m_obj[0].offs)); save_item(NAME(m_obj[1].x)); save_item(NAME(m_obj[1].y)); save_item(NAME(m_obj[1].offs)); save_item(NAME(m_obj[0].bitmap)); save_item(NAME(m_obj[1].bitmap)); save_item(NAME(m_layer_en)); save_item(NAME(m_sea_bank)); } uint32_t marinedt_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) { if(m_layer_en & 8) copybitmap(bitmap, *m_seabitmap[m_sea_bank], m_screen_flip == false, m_screen_flip == false, m_screen_flip ? 0 : -256, m_screen_flip ? 0 : -224, cliprect); else bitmap.fill(0,cliprect); m_tilemap->draw(screen, bitmap, cliprect, 0, 0); if(m_layer_en & 2) copybitmap_trans(bitmap, m_obj[1].bitmap, 0, 0, 0, 0, cliprect, 0); if(m_layer_en & 1) copybitmap_trans(bitmap, m_obj[0].bitmap, 0, 0, 0, 0, cliprect, 0); return 0; } WRITE8_MEMBER(marinedt_state::vram_w) { m_vram[offset] = data; m_tilemap->mark_tile_dirty(offset); } inline void marinedt_state::obj_reg_w(uint8_t which, uint8_t reg,uint8_t data) { rectangle visarea = m_screen->visible_area(); //const uint8_t base_pen;// = which == 0 ? 0x30 : 0x20; gfx_element *gfx = m_gfxdecode->gfx(which+1); switch(reg) { case 0: m_obj[which].offs = data; break; // TODO: are offsets good? case 1: m_obj[which].x = (data + 4) & 0xff; break; case 2: m_obj[which].y = (data + 1) & 0xff; break; } const uint8_t tilenum = ((m_obj[which].offs & 4) << 1) | ( (m_obj[which].offs & 0x38) >> 3); const uint8_t color = (m_obj[which].offs & 3); const bool fx = BIT(m_obj[which].offs,6); const bool fy = BIT(m_obj[which].offs,7); //base_pen = (which == 0 ? 0x30 : 0x20) + color*4; m_obj[which].bitmap.fill(0,visarea); // redraw sprite in framebuffer using above // bitmap,cliprect,tilenum,color,flipx,flipy,xpos,ypos,transpen gfx->transpen(m_obj[which].bitmap,visarea,tilenum,color,fx,!fy,m_obj[which].x,m_obj[which].y,0); } WRITE8_MEMBER(marinedt_state::obj_0_w) { obj_reg_w(0,offset,data); } WRITE8_MEMBER(marinedt_state::obj_1_w) { obj_reg_w(1,offset,data); } READ8_MEMBER(marinedt_state::trackball_r) { return (m_in_track[m_in_select & 3])->read(); } // discrete sound WRITE8_MEMBER(marinedt_state::bgm_w) { // ... } WRITE8_MEMBER(marinedt_state::sfx_w) { /* x--- ---- unknown, probably ties to PC3259 pin 16 like crbaloon --x- ---- jet sound SFX ---x ---- foam SFX ---- x--- ink SFX ---- -x-- collision SFX ---- --x- dots hit SFX ---- ---x irq mask in crbaloon, doesn't seem to apply here? */ // if(data & 0x7e) // popmessage("%02x",data); } WRITE8_MEMBER(marinedt_state::layer_enable_w) { /* ---x ---- enabled when shark appears (enables red gradient on sea bitmap apparently) ---- x--- sea layer draw enable (disabled in test mode) ---- --x- obj 2 draw enable ---- ---x obj 1 draw enable */ m_layer_en = data & 0xf; m_sea_bank = (data & 0x10) >> 4; } WRITE8_MEMBER(marinedt_state::output_w) { /* ---- x--- trackball input select (x/y) ---- -x-- trackball player select ---- --x- flipscreen ---- ---x global coin lockout (disabled in service mode) */ m_in_select = (data & 0xc) >> 2; m_screen_flip = BIT(data,1); flip_screen_set(!m_screen_flip); machine().bookkeeping().coin_lockout_global_w(!(data & 1)); } // collision detection // we return a value in the form of y<<5|x in case collision occurred inline uint32_t marinedt_state::obj_to_obj_collision() { // bail out if any obj is disabled if((m_layer_en & 3) != 3) return 0; for(int y=0;y<32;y++) { for(int x=0;x<32;x++) { int resx,resy; resx = m_obj[0].x + x; resy = m_obj[0].y + y; if((m_obj[0].bitmap.pix16(resy,resx) & 3) == 0) continue; // return value is never read most likely if(m_obj[1].bitmap.pix16(resy,resx) != 0) return ((resy / 8) * 32) | (((resx / 8) - 1) & 0x1f); } } return 0; } inline uint32_t marinedt_state::obj_to_layer_collision() { // bail out if obj target is disabled if((m_layer_en & 1) == 0) return 0; for(int y=0;y<32;y++) { for(int x=0;x<32;x++) { uint16_t resx,resy; resx = m_obj[0].x + x; resy = m_obj[0].y + y; if((m_obj[0].bitmap.pix16(resy,resx) & 3) == 0) continue; if(!m_screen_flip) resy -= 32; // TODO: non screen flip path doesn't work properly if(m_tilemap->pixmap().pix16(resy,resx) != 0) { if(m_screen_flip) return ((resy / 8) * 32) | (((resx / 8) - 1) & 0x1f); else return (((resy / 8) * 32) | (((resx / 8) - 1) & 0x1f)) ^ 0x3ff; } } } return 0; } READ8_MEMBER(marinedt_state::pc3259_r) { uint32_t rest,reso; uint8_t reg = offset >> 2; uint8_t xt,xo; rest = obj_to_layer_collision(); reso = obj_to_obj_collision(); switch(reg) { case 0: xt = rest & 0xf; xo = reso & 0xf; return xt|(xo<<4); case 1: xt = (rest & 0xf0) >> 4; xo = (reso & 0xf0) >> 4; return xt|(xo<<4); case 2: xt = (rest & 0x300) >> 8; xo = (reso & 0x300) >> 8; return xt|(xo<<4); case 3: { uint8_t res = 0; res |= ((reso != 0)<<7); res |= ((rest != 0)<<3); return res; } } return 0; } void marinedt_state::marinedt_map(address_map &map) { map.global_mask(0x7fff); /* A15 is not decoded */ map(0x0000, 0x3fff).rom().region("ipl", 0); map(0x4000, 0x43ff).mirror(0x0400).ram(); map(0x4800, 0x4bff).mirror(0x0400).ram().w(FUNC(marinedt_state::vram_w)).share("vram"); } void marinedt_state::marinedt_io(address_map &map) { map.global_mask(0x0f); map(0x00, 0x00).portr("DSW1"); map(0x01, 0x01).r(FUNC(marinedt_state::trackball_r)); map(0x02, 0x02).select(0xc).r(FUNC(marinedt_state::pc3259_r)); map(0x02, 0x04).w(FUNC(marinedt_state::obj_0_w)); map(0x03, 0x03).portr("SYSTEM"); map(0x04, 0x04).portr("DSW2"); map(0x05, 0x05).w(FUNC(marinedt_state::bgm_w)); map(0x06, 0x06).w(FUNC(marinedt_state::sfx_w)); map(0x08, 0x0b).w(FUNC(marinedt_state::obj_1_w)); map(0x0d, 0x0d).w(FUNC(marinedt_state::layer_enable_w)); map(0x0e, 0x0e).nopw(); // watchdog map(0x0f, 0x0f).w(FUNC(marinedt_state::output_w)); } static INPUT_PORTS_START( marinedt ) PORT_START("SYSTEM") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_COIN2 ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_TILT ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Ink Button") PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P2 Ink Button") PORT_COCKTAIL PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) // TODO: diplocations needs to be verified PORT_START("DSW1") PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) PORT_DIPLOCATION("SWA:4,3,2,1") PORT_DIPSETTING( 0x0f, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0x0e, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0x0d, DEF_STR( 7C_1C ) ) PORT_DIPSETTING( 0x0c, DEF_STR( 6C_1C ) ) PORT_DIPSETTING( 0x0b, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x0a, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x09, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x08, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x01, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x02, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x03, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x04, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x05, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x06, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x07, DEF_STR( 1C_8C ) ) PORT_DIPNAME( 0xf0, 0x00, DEF_STR( Coin_B ) ) PORT_DIPLOCATION("SWA:8,7,6,5") PORT_DIPSETTING( 0xf0, DEF_STR( 9C_1C ) ) PORT_DIPSETTING( 0xe0, DEF_STR( 8C_1C ) ) PORT_DIPSETTING( 0xd0, DEF_STR( 7C_1C ) ) PORT_DIPSETTING( 0xc0, DEF_STR( 6C_1C ) ) PORT_DIPSETTING( 0xb0, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0xa0, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x90, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x80, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 1C_4C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_5C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 1C_6C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_7C ) ) PORT_DIPSETTING( 0x70, DEF_STR( 1C_8C ) ) PORT_START("DSW2") PORT_DIPNAME( 0x01, 0x00, "DSWB" ) PORT_DIPLOCATION("SWB:1") PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) PORT_DIPNAME( 0x02, 0x00, "Disable sprite-tile collision (Cheat)" ) PORT_DIPLOCATION("SWB:2") PORT_DIPSETTING( 0x02, DEF_STR( Yes ) ) PORT_DIPSETTING( 0x00, DEF_STR( No ) ) PORT_SERVICE_DIPLOC( 0x04, IP_ACTIVE_HIGH, "SWB:3") PORT_DIPNAME( 0x08, 0x00, DEF_STR( Cabinet ) ) PORT_DIPLOCATION("SWB:4") PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) PORT_DIPNAME( 0x10, 0x10, "Number of Coin Chutes") PORT_DIPLOCATION("SWB:5") PORT_DIPSETTING( 0x10, "2" ) PORT_DIPSETTING( 0x00, "1" ) PORT_DIPNAME( 0x20, 0x00, "Year Display" ) PORT_DIPLOCATION("SWB:6") PORT_DIPSETTING( 0x00, DEF_STR( Yes ) ) PORT_DIPSETTING( 0x20, DEF_STR( No ) ) PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Lives ) ) PORT_DIPLOCATION("SWB:8,7") PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x40, "4" ) PORT_DIPSETTING( 0x80, "5" ) PORT_DIPSETTING( 0xc0, "6" ) PORT_START("P1_TRACKX") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE PORT_START("P1_TRACKY") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_START("P2_TRACKX") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE PORT_COCKTAIL PORT_START("P2_TRACKY") PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_COCKTAIL INPUT_PORTS_END static const gfx_layout charlayout = { 8,8, RGN_FRAC(1,3), 3, { RGN_FRAC(0,3), RGN_FRAC(1,3), RGN_FRAC(2,3) }, { STEP8(7,-1) }, { STEP8(0,8) }, 8*8 }; static const gfx_layout objlayout = { 32,32, RGN_FRAC(1,1), 2, { 0, 4 }, { STEP4(32*8*7,1), STEP4(32*8*6,1), STEP4(32*8*5,1), STEP4(32*8*4,1), STEP4(32*8*3,1), STEP4(32*8*2,1), STEP4(32*8*1,1), STEP4(32*8*0,1) }, { STEP16(0,8), STEP16(16*8,8) }, 32*32*2 }; static GFXDECODE_START( gfx_marinedt ) GFXDECODE_ENTRY( "gfx1", 0, charlayout, 0, 4 ) GFXDECODE_ENTRY( "gfx2", 0, objlayout, 48, 4 ) GFXDECODE_ENTRY( "gfx3", 0, objlayout, 32, 4 ) GFXDECODE_END void marinedt_state::machine_start() { } void marinedt_state::machine_reset() { m_layer_en = 0; } void marinedt_state::marinedt_palette(palette_device &palette) const { uint8_t const *const color_prom = memregion("proms")->base(); for (int i = 0; i < 64; i++) { int bit0, bit1, bit2; // red component bit0 = BIT(color_prom[i], 0); bit1 = BIT(color_prom[i], 1); //bit2 = BIT(color_prom[i], 2); int const r = (0x55 * bit0) + (0xaa * bit1); // green component bit0 = BIT(color_prom[i], 3); bit1 = BIT(color_prom[i], 4); int const g = (0x55 * bit0) + (0xaa * bit1); // blue component bit0 = BIT(color_prom[i], 5); bit1 = BIT(color_prom[i], 6); bit2 = BIT(color_prom[i], 7); int b = (0x55 * bit0) + (0xaa * bit1); // matches yellow haired siren if (bit2 == 0) b /= 2; palette.set_pen_color(i, rgb_t(r, g, b)); } for (int i = 0; i < 32; i++) { int const b = color_prom[i + 0x60]; palette.set_pen_color(64 + 31 - i, rgb_t(0, 0, b)); palette.set_pen_color(64 + 63 - i, rgb_t(0xff, 0, b)); } } void marinedt_state::marinedt(machine_config &config) { /* basic machine hardware */ Z80(config, m_maincpu, MAIN_CLOCK/4); m_maincpu->set_addrmap(AS_PROGRAM, &marinedt_state::marinedt_map); m_maincpu->set_addrmap(AS_IO, &marinedt_state::marinedt_io); m_maincpu->set_vblank_int("screen", FUNC(marinedt_state::irq0_line_hold)); /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_screen_update(FUNC(marinedt_state::screen_update)); m_screen->set_raw(MAIN_CLOCK/2, 328, 0, 256, 263, 32, 256); // template to get ~60 fps m_screen->set_palette("palette"); GFXDECODE(config, m_gfxdecode, "palette", gfx_marinedt); PALETTE(config, "palette", FUNC(marinedt_state::marinedt_palette), 64 + 64); /* sound hardware */ SPEAKER(config, "mono").front_center(); //AY8910(config, "aysnd", MAIN_CLOCK/4).add_route(ALL_OUTPUTS, "mono", 0.30); } /*************************************************************************** Machine driver(s) ***************************************************************************/ ROM_START( marinedt ) ROM_REGION( 0x4000, "ipl", ROMREGION_ERASEFF ) ROM_LOAD( "mg01.3d", 0x0000, 0x0800, CRC(ad09f04d) SHA1(932fc973b4a2fbbebd7e6437ed30c8444e3d4afb)) ROM_LOAD( "mg02.4d", 0x0800, 0x0800, CRC(555a2b0f) SHA1(143a8953ce5070c31dc4c1f623833b2a5a2cf657)) ROM_LOAD( "mg03.5d", 0x1000, 0x0800, CRC(2abc79b3) SHA1(1afb331a2c0e320b6d026bc5cb47a53ac3356c2a)) ROM_LOAD( "mg04.6d", 0x1800, 0x0800, CRC(be928364) SHA1(8d9ae71e2751c009187e41d84fbad9519ab551e1) ) ROM_LOAD( "mg05.7d", 0x2000, 0x0800, CRC(44cd114a) SHA1(833165c5c00c6e505acf29fef4a3ae3f9647b443) ) ROM_LOAD( "mg06.9d", 0x2800, 0x0800, CRC(a7e2c69b) SHA1(614fc479d13c1726382fe7b4b0379c1dd4915af0) ) ROM_LOAD( "mg07.10d", 0x3000, 0x0800, CRC(b85d1f9a) SHA1(4fd3e76b1816912df84477dba4655d395f5e7072) ) ROM_REGION( 0x1800, "gfx1", 0 ) ROM_LOAD( "mg11.1f", 0x0000, 0x0800, CRC(50d66dd7) SHA1(858d1d2a75e091b0e382d964c5e4ddcd8e6f07dd)) ROM_LOAD( "mg10.3f", 0x0800, 0x0800, CRC(b41251e3) SHA1(e125a971b401c78efeb4b03d0fab43e392d3fc14) ) ROM_LOAD( "mg09.4f", 0x1000, 0x0800, CRC(f4c349ca) SHA1(077f65eeac616a778d6c42bb95677fa2892ab697) ) ROM_REGION( 0x1000, "gfx2", 0 ) ROM_LOAD( "mg12.6c", 0x0000, 0x1000, CRC(7c6486d5) SHA1(a7f17a803937937f05fc90621883a0fd44b297a0) ) ROM_REGION( 0x1000, "gfx3", 0 ) ROM_LOAD( "mg13.6h", 0x0000, 0x1000, CRC(17817044) SHA1(8c9b96620e3c414952e6d85c6e81b0df85c88e7a) ) ROM_REGION( 0x0080, "proms", ROMREGION_INVERT ) ROM_LOAD( "mg14.2a", 0x0000, 0x0020, CRC(f75f4e3a) SHA1(36e665987f475c57435fa8c224a2a3ce0c5e672b) ) // tilemap colors ROM_LOAD( "mg15.1a", 0x0020, 0x0020, CRC(cd3ab489) SHA1(a77478fb94d0cf8f4317f89cc9579def7c294b4f) ) // sprite colors ROM_LOAD( "mg16.4e", 0x0040, 0x0020, CRC(92c868bc) SHA1(483ae6f47845ddacb701528e82bd388d7d66a0fb) ) // (related to sprites) ROM_LOAD( "mg17.bpr", 0x0060, 0x0020, CRC(13261a02) SHA1(050edd18e4f79d19d5206f55f329340432fd4099) ) // sea bitmap colors ROM_END GAME( 1981, marinedt, 0, marinedt, marinedt, marinedt_state, empty_init, ROT270, "Taito", "Marine Date", MACHINE_NOT_WORKING | MACHINE_UNEMULATED_PROTECTION | MACHINE_IMPERFECT_COLORS | MACHINE_NO_SOUND )