diff options
Diffstat (limited to 'trunk/src/mame/drivers/marinedt.c')
-rw-r--r-- | trunk/src/mame/drivers/marinedt.c | 725 |
1 files changed, 725 insertions, 0 deletions
diff --git a/trunk/src/mame/drivers/marinedt.c b/trunk/src/mame/drivers/marinedt.c new file mode 100644 index 00000000000..98de198df7e --- /dev/null +++ b/trunk/src/mame/drivers/marinedt.c @@ -0,0 +1,725 @@ +/* +--------------------------- +Marine Date by TAITO (1981) +--------------------------- + +Location Device File ID Checksum +--------------------------------------------- +LB 3D 2716 MG01 BB4B +LB 4D 2716 MG02 89B3 +LB 5D 2716 MG03 A5CE +LB 6D 2716 MG04 CE20 +LB 7D 2716 MG05 16B9 +LB 9D 2716 MG06 39A9 +LB 10D 2716 MG07 B7F1 +LB 1F 2716 MG09 9934 +LB 3F 2716 MG10 F185 +LB 4F 2716 MG11 1603 +MB 6C 2532 MG12 66C3 +MB 6H 2532 MG13 23E2 +MB 2A 82S123 MG14.BPR 1CB1 +MB 1A 82S123 MG15.BPR 1471 +MB 4E 82S123 MG16.BPR 0570 +TB 5F 82S123 MG17.BPR 129B + + +Notes: TB - Top PCB MG070001 MGN00001 + MB - Middle PCB MG070002 MGN00002 + LB - Lower PCB AA017779 MGN00002 + + +Brief Hardware Overview +----------------------- + +Main processor - Z80 2.5MHz + +Sound - Discrete audio, like Space Invaders + +------------------------------------------------------------------------- + +a static underwater scence with obstacles in it, like seaweed, +crabs and other stuff. You have a limited number of "strokes" +per screen as well as a timer to work against. Your goal is +to *bounce* yourself around the screen using *Strokes* on the +trackball to try to reach a *female* octopus before your run out +of strokes or time. You sort of bounce yourself around the screen +like a billiard ball would bounce, but once in a while bubbles +and other stuff will come up from underneath you and carry you +away from where you are trying to get. When you reach your goal +you get another more difficult screen, etc. + +I think it was manufactured by Taito, I'm not sure but I seem to +recall that it was a full blown Japanese machine. + + +todo: +in cocktail mopde p1 is flipped +after inking the shark on the far right octi was moved to goal? +for the colours, goal has to be black otherwise it would register + qas a hit, is goal pen 0 or 6? +rom writes when finishing a game + worth looking at before the collision is correct? +playing dot hit when eaten by a shark? +dont use any ints, s/b UINT8? +enemy sprite not disabled at end of game +tilemap +palette may only be around 4 colours + is 14 the palette? +how do you know if you've got an ink left? +prom 14 is the top bits? 4 bpp? or so? +why is level 37 chosen? +should it be 30fps? + check other taito games of the time +look at other taito 1981 games for ideas on the ports + bking + jhunt? +"Marine Deto" or "Marine Date" + look in the roms for all the text +simplify gfx decode +why does the player sprite need 4 colours? + check if more than 1 are used +check service test ram wipes for confirmation of ram spots + anything after trackball test? +obj1 to obj2 draw order +2nd trackball +flip/cocktail issues + +done: +timer? + you get 200 for each shot, don't think it's actually a timer +have i been using x/y consistently, ie non rotated or rotated origin? + yes, seems to be best using xy raw (ie non-rotated) +p2 ink doesn't always light up in test mode + after p1 ink pressed, p2 ink doesn't light up + this is correct behavior if DSW set as Upright mode +*/ + +#include "emu.h" +#include "cpu/z80/z80.h" + +class marinedt_state : public driver_device +{ +public: + marinedt_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) { } + + /* memory pointers */ + UINT8 * m_tx_tileram; + + /* video-related */ + bitmap_t *m_tile; + bitmap_t *m_obj1; + bitmap_t *m_obj2; + tilemap_t *m_tx_tilemap; + + UINT8 m_obj1_a; + UINT8 m_obj1_x; + UINT8 m_obj1_y; + UINT8 m_obj2_a; + UINT8 m_obj2_x; + UINT8 m_obj2_y; + UINT8 m_pd; + UINT8 m_pf; + UINT8 m_music; + UINT8 m_sound; + UINT8 m_coll; + UINT8 m_cx; + UINT8 m_cyr; + UINT8 m_cyq; + UINT8 m_collh; + UINT8 m_cxh; + UINT8 m_cyrh; + UINT8 m_cyqh; +}; + + +static WRITE8_HANDLER( tx_tileram_w ) +{ + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + + state->m_tx_tileram[offset] = data; + tilemap_mark_tile_dirty(state->m_tx_tilemap, offset); +} + +static READ8_HANDLER( marinedt_port1_r ) +{ + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + + //might need to be reversed for cocktail stuff + + /* x/y multiplexed */ + return input_port_read(space->machine(), ((state->m_pf & 0x08) >> 3) ? "TRACKY" : "TRACKX"); +} + +static READ8_HANDLER( marinedt_coll_r ) +{ + //76543210 + //x------- obj1 to obj2 collision + //-xxx---- unused + //----x--- obj1 to playfield collision + //-----xxx unused + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + return state->m_coll | state->m_collh; +} + +//are these returning only during a collision? +//id imagine they are returning the pf char where the collission took place? +//what about where there is lots of colls? +//maybe the first on a scanline basis +static READ8_HANDLER( marinedt_obj1_x_r ) +{ + //76543210 + //xxxx---- unknown + //----xxxx x pos in tile ram + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + UINT8 *RAM = space->machine().region("maincpu")->base(); + + if (RAM[0x430e]) + --state->m_cx; + else + ++state->m_cx; + + //figure out why inc/dec based on 430e? + return state->m_cx | (state->m_cxh << 4); +} + +static READ8_HANDLER( marinedt_obj1_yr_r ) +{ + //76543210 + //xxxx---- unknown + //----xxxx row in current screen quarter + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + + //has to be +1 if cx went over? + if (state->m_cx == 0x10) + state->m_cyr++; + + return state->m_cyr | (state->m_cyrh << 4); +} + +static READ8_HANDLER( marinedt_obj1_yq_r ) +{ + //76543210 + //xx------ unknown + //--xx---- screen quarter when flipped? + //----xx-- unknown + //------xx screen quarter + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + return state->m_cyq | (state->m_cyqh << 4); +} + +static WRITE8_HANDLER( marinedt_obj1_a_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj1_a = data; } +static WRITE8_HANDLER( marinedt_obj1_x_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj1_x = data; } +static WRITE8_HANDLER( marinedt_obj1_y_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj1_y = data; } +static WRITE8_HANDLER( marinedt_obj2_a_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj2_a = data; } +static WRITE8_HANDLER( marinedt_obj2_x_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj2_x = data; } +static WRITE8_HANDLER( marinedt_obj2_y_w ) { marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_obj2_y = data; } + +static WRITE8_HANDLER( marinedt_music_w ){ marinedt_state *state = space->machine().driver_data<marinedt_state>(); state->m_music = data; } + +static WRITE8_HANDLER( marinedt_sound_w ) +{ + //76543210 + //xx------ ?? + //--x----- jet sound + //---x---- foam + //----x--- ink + //-----x-- collision + //------x- dots hit + //-------x ?? + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + state->m_sound = data; +} + +static WRITE8_HANDLER( marinedt_pd_w ) +{ + //76543210 + //xxx----- ?? unused + //---x---- ?? the rest should be used based on the table + //----x--- ?? + //-----x-- ?? + //------x- obj2 enable + //-------x obj1 enable + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + state->m_pd = data; +} + +/* +upright +marinedt_pf_w: 00 // upright +marinedt_pf_w: 01 // ?? + +cocktail +marinedt_pf_w: 02 // cocktail +marinedt_pf_w: 03 // ?? + +marinedt_pf_w: 01 // upright +marinedt_pf_w: 05 // flip sprite? + +marinedt_pf_w: 07 // cocktail +marinedt_pf_w: 03 // non-flip sprite? +*/ +static WRITE8_HANDLER( marinedt_pf_w ) +{ + //76543210 + //xxxx---- ?? unused (will need to understand table of written values) + //----x--- xy trackball select + //-----x-- ?? flip screen/controls + //------x- ?? upright/cocktail + //-------x ?? service mode (coin lockout??) + + marinedt_state *state = space->machine().driver_data<marinedt_state>(); + + //if ((state->m_pf & 0x07) != (data & 0x07)) + // mame_printf_debug("marinedt_pf_w: %02x\n", data & 0x07); + + if ((state->m_pf & 0x02) != (data & 0x02)) + { + if (data & 0x02) + mame_printf_debug("tile flip\n"); + else + mame_printf_debug("tile non-flip\n"); + + if (data & 0x02) + tilemap_set_flip(state->m_tx_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + else + tilemap_set_flip(state->m_tx_tilemap, 0); + } + + state->m_pf = data; + + //if (data & 0xf0) + // logerror("pf:%02x %d\n", state->m_pf); + //logerror("pd:%02x %d\n", state->m_pd, space->machine().primary_screen->frame_number()); + +} + +static ADDRESS_MAP_START( marinedt_map, AS_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x37ff) AM_ROM + AM_RANGE(0x4000, 0x43ff) AM_RAM + AM_RANGE(0x4400, 0x47ff) AM_RAM //unused, vram mirror? + AM_RANGE(0x4800, 0x4bff) AM_RAM_WRITE(tx_tileram_w) AM_BASE_MEMBER(marinedt_state, m_tx_tileram) + AM_RANGE(0x4c00, 0x4c00) AM_WRITENOP //?? maybe off by one error +ADDRESS_MAP_END + +static ADDRESS_MAP_START( marinedt_io_map, AS_IO, 8 ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x00) AM_READ_PORT("DSW0") //dips coinage + AM_RANGE(0x01, 0x01) AM_READ(marinedt_port1_r) //trackball xy muxed + AM_RANGE(0x02, 0x02) AM_READWRITE(marinedt_obj1_x_r, marinedt_obj1_a_w) + AM_RANGE(0x03, 0x03) AM_READ_PORT("IN0") AM_WRITE(marinedt_obj1_x_w) + AM_RANGE(0x04, 0x04) AM_READ_PORT("DSW1") AM_WRITE(marinedt_obj1_y_w) + AM_RANGE(0x05, 0x05) AM_WRITE(marinedt_music_w) + AM_RANGE(0x06, 0x06) AM_READWRITE(marinedt_obj1_yr_r, marinedt_sound_w) + AM_RANGE(0x08, 0x08) AM_WRITE(marinedt_obj2_a_w) + AM_RANGE(0x09, 0x09) AM_WRITE(marinedt_obj2_x_w) + AM_RANGE(0x0a, 0x0a) AM_READWRITE(marinedt_obj1_yq_r, marinedt_obj2_y_w) + AM_RANGE(0x0d, 0x0d) AM_WRITE(marinedt_pd_w) + AM_RANGE(0x0e, 0x0e) AM_READWRITE(marinedt_coll_r, watchdog_reset_w) + AM_RANGE(0x0f, 0x0f) AM_WRITE(marinedt_pf_w) +ADDRESS_MAP_END + + +static INPUT_PORTS_START( marinedt ) + PORT_START("DSW0") + PORT_DIPNAME( 0x0f, 0x00, DEF_STR( Coin_A ) ) + 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_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("IN0") + 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_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_START2 ) + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START1 ) + + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Bonus_Life ) ) + PORT_DIPSETTING( 0x01, "5000" ) + PORT_DIPSETTING( 0x00, "10000" ) +//cheat? + PORT_DIPNAME( 0x02, 0x00, "ignore internal bounce?" ) //maybe die/bounce of rocks/coral? + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x02, DEF_STR( On ) ) +//freezes the game before the reset +//doesn't seem to be done as a dip, but what about mixing with diops like this? + PORT_SERVICE( 0x04, IP_ACTIVE_HIGH ) + PORT_DIPNAME( 0x08, 0x08, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x10, 0x00, "Coin Chutes" ) + PORT_DIPSETTING( 0x00, "Common" ) + PORT_DIPSETTING( 0x10, "Individual" ) + PORT_DIPNAME( 0x20, 0x00, "Year Display" ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPNAME( 0xc0, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x40, "4" ) + PORT_DIPSETTING( 0x80, "5" ) + PORT_DIPSETTING( 0xc0, "6" ) + + PORT_START("TRACKX") /* FAKE MUXED */ +//check all bits are used + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE + + PORT_START("TRACKY") /* FAKE MUXED */ + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) +INPUT_PORTS_END + +static const gfx_layout marinedt_charlayout = +{ + 8,8, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) }, //maybe 120 + { STEP8(0,1) }, + { STEP8(0,8) }, + 8*8 +}; + +static const gfx_layout marinedt_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( marinedt ) + GFXDECODE_ENTRY( "gfx1", 0, marinedt_charlayout, 0, 4 ) //really only 1 colour set? + GFXDECODE_ENTRY( "gfx2", 0, marinedt_objlayout, 48, 4 ) + GFXDECODE_ENTRY( "gfx3", 0, marinedt_objlayout, 32, 4 ) +GFXDECODE_END + +static PALETTE_INIT( marinedt ) +{ + int i,r,b,g; + + for (i = 0; i < machine.total_colors(); i++) + { + int bit0, bit1, bit2; + + /* red component */ + bit0 = (~color_prom[i] >> 0) & 0x01; + bit1 = (~color_prom[i] >> 1) & 0x01; + bit2 = (~color_prom[i] >> 2) & 0x01; +// *(palette++) = 0x92 * bit0 + 0x46 * bit1 + 0x27 * bit2; + r = 0x27 * bit0 + 0x46 * bit1 + 0x92 * bit2; + /* green component */ + bit0 = (~color_prom[i] >> 3) & 0x01; + bit1 = (~color_prom[i] >> 4) & 0x01; + bit2 = (~color_prom[i] >> 5) & 0x01; +// *(palette++) = 0x92 * bit0 + 0x46 * bit1 + 0x27 * bit2; + g = 0x27 * bit0 + 0x46 * bit1 + 0x92 * bit2; + /* blue component */ + bit0 = (~color_prom[i] >> 5) & 0x01; + bit1 = (~color_prom[i] >> 6) & 0x01; + bit2 = (~color_prom[i] >> 7) & 0x01; +bit0 = 0; +// *(palette++) = 0x92 * bit0 + 0x46 * bit1 + 0x27 * bit2; + b = 0x27 * bit0 + 0x46 * bit1 + 0x92 * bit2; + + palette_set_color(machine, i, MAKE_RGB(r, g, b)); + } +} + + +static TILE_GET_INFO( get_tile_info ) +{ + marinedt_state *state = machine.driver_data<marinedt_state>(); + int code = state->m_tx_tileram[tile_index]; + int color = 0; + int flags = TILE_FLIPX; + + SET_TILE_INFO(0, code, color, flags); +} + +static VIDEO_START( marinedt ) +{ + marinedt_state *state = machine.driver_data<marinedt_state>(); + state->m_tx_tilemap = tilemap_create(machine, get_tile_info, tilemap_scan_rows, 8, 8, 32, 32); + + tilemap_set_transparent_pen(state->m_tx_tilemap, 0); + tilemap_set_scrolldx(state->m_tx_tilemap, 0, 4*8); + tilemap_set_scrolldy(state->m_tx_tilemap, 0, -4*8); + + state->m_tile = auto_bitmap_alloc(machine, 32 * 8, 32 * 8, machine.primary_screen->format()); + state->m_obj1 = auto_bitmap_alloc(machine, 32, 32, machine.primary_screen->format()); + state->m_obj2 = auto_bitmap_alloc(machine, 32, 32, machine.primary_screen->format()); +} + + +// x------- flipy +// -x------ unused ?? +// --xxx--- sprite code +// -----x-- bank +// ------xx colour + +#define OBJ_CODE(a) ((((a) & 0x04) << 1) + (((a) & 0x38) >> 3)) +#define OBJ_COLOR(a) ((a) & 0x03) +#define OBJ_X(x) (256 - 32 - (x)) +#define OBJ_Y(y) (256 - 1 - (y)) +#define OBJ_FLIPX(a) ((state->m_pf & 0x02) == 0) +#define OBJ_FLIPY(a) ((a) & 0x80) + +static SCREEN_UPDATE( marinedt ) +{ + marinedt_state *state = screen->machine().driver_data<marinedt_state>(); + int sx, sy; + + bitmap_fill(state->m_tile, NULL, 0); + tilemap_draw(state->m_tile, cliprect, state->m_tx_tilemap, 0, 0); + + bitmap_fill(state->m_obj1, NULL, 0); + drawgfx_transpen(state->m_obj1, NULL, screen->machine().gfx[1], + OBJ_CODE(state->m_obj1_a), + OBJ_COLOR(state->m_obj1_a), + OBJ_FLIPX(state->m_obj1_a), OBJ_FLIPY(state->m_obj1_a), + 0, 0, 0); + + bitmap_fill(state->m_obj2, NULL, 0); + drawgfx_transpen(state->m_obj2, NULL, screen->machine().gfx[2], + OBJ_CODE(state->m_obj2_a), + OBJ_COLOR(state->m_obj2_a), + OBJ_FLIPX(state->m_obj2_a), OBJ_FLIPY(state->m_obj2_a), + 0, 0, 0); + + bitmap_fill(bitmap, NULL, 0); + + if (state->m_pd & 0x02) + copybitmap_trans(bitmap, state->m_obj2, 0, 0, OBJ_X(state->m_obj2_x), OBJ_Y(state->m_obj2_y), cliprect, 0); + + if (state->m_pd & 0x01) + copybitmap_trans(bitmap, state->m_obj1, 0, 0, OBJ_X(state->m_obj1_x), OBJ_Y(state->m_obj1_y), cliprect, 0); + + copybitmap_trans(bitmap, state->m_tile, 0, 0, 0, 0, cliprect, 0); + + state->m_coll = state->m_cx = state->m_cyr = state->m_cyq = 0; + if (state->m_pd & 0x01) + { + for (sx = 0; sx < 32; sx++) + for (sy = 0; sy < 32; sy++) + { + int x = OBJ_X(state->m_obj1_x) + sx; + int y = OBJ_Y(state->m_obj1_y) + sy; + + if (x < cliprect->min_x || x > cliprect->max_x || y < cliprect->min_y || y > cliprect->max_y) + continue; + + if (*BITMAP_ADDR16(state->m_obj1, sy, sx) == 0) + continue; + + if (*BITMAP_ADDR16(state->m_tile, y, x) != 0) + { + state->m_coll = 0x08; + + state->m_cx = (x % 128) / 8; + state->m_cx &= 0x0f; + + state->m_cyr = ((y % 64) / 8) * 2 + (x > 127 ? 1 : 0); + state->m_cyr &= 0x0f; + + state->m_cyq = y / 64; + state->m_cyq &= 0x0f; + + break; + } + } + } + + state->m_collh = state->m_cxh = state->m_cyrh = state->m_cyqh = 0; + if ((state->m_pd & 0x03) == 0x03) + { + for (sx = 0; sx < 32; sx++) + for (sy = 0; sy < 32; sy++) + { + int x = OBJ_X(state->m_obj1_x + sx); + int y = OBJ_Y(state->m_obj1_y + sy); + + int xx = OBJ_X(state->m_obj2_x) - x; + int yy = OBJ_Y(state->m_obj2_y) - y; + + if (xx < 0 || xx >= 32 || yy < 0 || yy >= 32) + continue; + + if (*BITMAP_ADDR16(state->m_obj1, sy, sx) == 0) + continue; + + if (*BITMAP_ADDR16(state->m_obj2, yy, xx) != 0) + { + state->m_collh = 0x80; + + state->m_cxh = (x % 128) / 8; + state->m_cxh &= 0x0f; + + state->m_cyrh = ((y % 64) / 8) * 2 + (x > 127 ? 1 : 0); + state->m_cyrh &= 0x0f; + + state->m_cyqh= y / 64; + state->m_cyqh &= 0x0f; + + break; + } + } + } + return 0; +} + +static MACHINE_START( marinedt ) +{ + marinedt_state *state = machine.driver_data<marinedt_state>(); + + state->save_item(NAME(state->m_obj1_a)); + state->save_item(NAME(state->m_obj1_x)); + state->save_item(NAME(state->m_obj1_y)); + state->save_item(NAME(state->m_obj2_a)); + state->save_item(NAME(state->m_obj2_x)); + state->save_item(NAME(state->m_obj2_y)); + state->save_item(NAME(state->m_pd)); + state->save_item(NAME(state->m_pf)); + state->save_item(NAME(state->m_music)); + state->save_item(NAME(state->m_sound)); + state->save_item(NAME(state->m_coll)); + state->save_item(NAME(state->m_cx)); + state->save_item(NAME(state->m_cyr)); + state->save_item(NAME(state->m_cyq)); + state->save_item(NAME(state->m_collh)); + state->save_item(NAME(state->m_cxh)); + state->save_item(NAME(state->m_cyrh)); + state->save_item(NAME(state->m_cyqh)); +} + +static MACHINE_RESET( marinedt ) +{ + marinedt_state *state = machine.driver_data<marinedt_state>(); + + state->m_obj1_a = 0; + state->m_obj1_x = 0; + state->m_obj1_y = 0; + state->m_obj2_a = 0; + state->m_obj2_x = 0; + state->m_obj2_y = 0; + state->m_pd = 0; + state->m_pf = 0; + state->m_music = 0; + state->m_sound = 0; + state->m_coll = 0; + state->m_cx = 0; + state->m_cyr = 0; + state->m_cyq = 0; + state->m_collh = 0; + state->m_cxh = 0; + state->m_cyrh = 0; + state->m_cyqh = 0; +} + +static MACHINE_CONFIG_START( marinedt, marinedt_state ) + + /* basic machine hardware */ + MCFG_CPU_ADD("maincpu", Z80,10000000/4) + MCFG_CPU_PROGRAM_MAP(marinedt_map) + MCFG_CPU_IO_MAP(marinedt_io_map) + MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) + + MCFG_MACHINE_START(marinedt) + MCFG_MACHINE_RESET(marinedt) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) + MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) + MCFG_SCREEN_SIZE(4*8+32*8, 32*8) + MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) + MCFG_SCREEN_UPDATE(marinedt) + + MCFG_GFXDECODE(marinedt) + MCFG_PALETTE_LENGTH(64) + + MCFG_PALETTE_INIT(marinedt) + MCFG_VIDEO_START(marinedt) + + /* sound hardware */ + //discrete sound +MACHINE_CONFIG_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( marinedt ) + ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_LOAD( "mg01", 0x0000, 0x0800, CRC(ad09f04d) SHA1(932fc973b4a2fbbebd7e6437ed30c8444e3d4afb)) + ROM_LOAD( "mg02", 0x0800, 0x0800, CRC(555a2b0f) SHA1(143a8953ce5070c31dc4c1f623833b2a5a2cf657)) + ROM_LOAD( "mg03", 0x1000, 0x0800, CRC(2abc79b3) SHA1(1afb331a2c0e320b6d026bc5cb47a53ac3356c2a)) + ROM_LOAD( "mg04", 0x1800, 0x0800, CRC(be928364) SHA1(8d9ae71e2751c009187e41d84fbad9519ab551e1) ) + ROM_LOAD( "mg05", 0x2000, 0x0800, CRC(44cd114a) SHA1(833165c5c00c6e505acf29fef4a3ae3f9647b443) ) + ROM_LOAD( "mg06", 0x2800, 0x0800, CRC(a7e2c69b) SHA1(614fc479d13c1726382fe7b4b0379c1dd4915af0) ) + ROM_LOAD( "mg07", 0x3000, 0x0800, CRC(b85d1f9a) SHA1(4fd3e76b1816912df84477dba4655d395f5e7072) ) + + ROM_REGION( 0x1800, "gfx1", 0 ) + ROM_LOAD( "mg09", 0x0000, 0x0800, CRC(f4c349ca) SHA1(077f65eeac616a778d6c42bb95677fa2892ab697) ) + ROM_LOAD( "mg10", 0x0800, 0x0800, CRC(b41251e3) SHA1(e125a971b401c78efeb4b03d0fab43e392d3fc14) ) + ROM_LOAD( "mg11", 0x1000, 0x0800, CRC(50d66dd7) SHA1(858d1d2a75e091b0e382d964c5e4ddcd8e6f07dd)) + + ROM_REGION( 0x1000, "gfx2", 0 ) + ROM_LOAD( "mg12", 0x0000, 0x1000, CRC(7c6486d5) SHA1(a7f17a803937937f05fc90621883a0fd44b297a0) ) + + ROM_REGION( 0x1000, "gfx3", 0 ) + ROM_LOAD( "mg13", 0x0000, 0x1000, CRC(17817044) SHA1(8c9b96620e3c414952e6d85c6e81b0df85c88e7a) ) + + ROM_REGION( 0x0080, "proms", 0 ) + ROM_LOAD( "mg14.bpr", 0x0000, 0x0020, CRC(f75f4e3a) SHA1(36e665987f475c57435fa8c224a2a3ce0c5e672b) ) //char clr + ROM_LOAD( "mg15.bpr", 0x0020, 0x0020, CRC(cd3ab489) SHA1(a77478fb94d0cf8f4317f89cc9579def7c294b4f) ) //obj clr + ROM_LOAD( "mg16.bpr", 0x0040, 0x0020, CRC(92c868bc) SHA1(483ae6f47845ddacb701528e82bd388d7d66a0fb) ) //?? collisions + ROM_LOAD( "mg17.bpr", 0x0060, 0x0020, CRC(13261a02) SHA1(050edd18e4f79d19d5206f55f329340432fd4099) ) //?? table of increasing values +ROM_END + +GAME( 1981, marinedt, 0, marinedt, marinedt, 0, ROT270, "Taito", "Marine Date", GAME_NO_SOUND | GAME_SUPPORTS_SAVE ) |