diff options
Diffstat (limited to 'src/mame/drivers/marinedt.c')
-rw-r--r-- | src/mame/drivers/marinedt.c | 646 |
1 files changed, 646 insertions, 0 deletions
diff --git a/src/mame/drivers/marinedt.c b/src/mame/drivers/marinedt.c new file mode 100644 index 00000000000..a704f0a840c --- /dev/null +++ b/src/mame/drivers/marinedt.c @@ -0,0 +1,646 @@ +/* +--------------------------- +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 "driver.h" + +static mame_bitmap *tile, *obj1, *obj2; +static tilemap *tx_tilemap; + +static UINT8 *tx_tileram; + +static UINT8 marinedt_obj1_a, marinedt_obj1_x, marinedt_obj1_y; +static UINT8 marinedt_obj2_a, marinedt_obj2_x, marinedt_obj2_y; +static UINT8 marinedt_pd, marinedt_pf; +static UINT8 marinedt_music, marinedt_sound; +static UINT8 coll, cx, cyr, cyq; +static UINT8 collh, cxh, cyrh, cyqh; + +static WRITE8_HANDLER( tx_tileram_w ) +{ + tx_tileram[offset] = data; + tilemap_mark_tile_dirty(tx_tilemap, offset); +} + +static ADDRESS_MAP_START( marinedt_readmem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x37ff) AM_READ(MRA8_ROM) + AM_RANGE(0x4000, 0x43ff) AM_READ(MRA8_RAM) + AM_RANGE(0x4400, 0x47ff) AM_READ(MRA8_RAM) //unused, vram mirror? + AM_RANGE(0x4000, 0x4bff) AM_READ(MRA8_RAM) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( marinedt_writemem, ADDRESS_SPACE_PROGRAM, 8 ) + AM_RANGE(0x0000, 0x37ff) AM_WRITE(MWA8_ROM) + AM_RANGE(0x4000, 0x47ff) AM_WRITE(MWA8_RAM) + AM_RANGE(0x4800, 0x4bff) AM_WRITE(tx_tileram_w) AM_BASE(&tx_tileram) + AM_RANGE(0x4c00, 0x4c00) AM_WRITE(MWA8_NOP) //?? maybe off by one error +ADDRESS_MAP_END + +static READ8_HANDLER( marinedt_port1_r ) +{ +//might need to be reversed for cocktail stuff + + /* x/y multiplexed */ + return readinputport(3 + ((marinedt_pf&0x08)>>3)); +} + +static READ8_HANDLER( marinedt_coll_r ) +{ + //76543210 + //x------- obj1 to obj2 collision + //-xxx---- unused + //----x--- obj1 to playfield collision + //-----xxx unused + + return coll | 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 + + UINT8 *RAM = memory_region(REGION_CPU1); +if(RAM[0x430e]) --cx; else ++cx; +//figure out why inc/dec based on 430e? + return cx | (cxh<<4); +} + +static READ8_HANDLER( marinedt_obj1_yr_r ) +{ + //76543210 + //xxxx---- unknown + //----xxxx row in current screen quarter +//has to be +1 if cx went over? +if (cx==0x10) cyr++; + + return cyr | (cyrh<<4); +} + +static READ8_HANDLER( marinedt_obj1_yq_r ) +{ + //76543210 + //xx------ unknown + //--xx---- screen quarter when flipped? + //----xx-- unknown + //------xx screen quarter + + return cyq | (cyqh<<4); +} + + +static ADDRESS_MAP_START( marinedt_readport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x00, 0x00) AM_READ(input_port_0_r) //dips coinage + AM_RANGE(0x01, 0x01) AM_READ(marinedt_port1_r) //trackball xy muxed + AM_RANGE(0x02, 0x02) AM_READ(marinedt_obj1_x_r) + AM_RANGE(0x03, 0x03) AM_READ(input_port_1_r) //buttons + AM_RANGE(0x04, 0x04) AM_READ(input_port_2_r) //dips + AM_RANGE(0x06, 0x06) AM_READ(marinedt_obj1_yr_r) + AM_RANGE(0x0a, 0x0a) AM_READ(marinedt_obj1_yq_r) + AM_RANGE(0x0e, 0x0e) AM_READ(marinedt_coll_r) +ADDRESS_MAP_END + +static WRITE8_HANDLER( marinedt_obj1_a_w ) { marinedt_obj1_a = data; } +static WRITE8_HANDLER( marinedt_obj1_x_w ) { marinedt_obj1_x = data; } +static WRITE8_HANDLER( marinedt_obj1_y_w ) { marinedt_obj1_y = data; } +static WRITE8_HANDLER( marinedt_obj2_a_w ) { marinedt_obj2_a = data; } +static WRITE8_HANDLER( marinedt_obj2_x_w ) { marinedt_obj2_x = data; } +static WRITE8_HANDLER( marinedt_obj2_y_w ) { marinedt_obj2_y = data; } + +static WRITE8_HANDLER( marinedt_music_w ){ marinedt_music = data; } + +static WRITE8_HANDLER( marinedt_sound_w ) +{ + //76543210 + //xx------ ?? + //--x----- jet sound + //---x---- foam + //----x--- ink + //-----x-- collision + //------x- dots hit + //-------x ?? + + marinedt_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_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??) + + //if ((marinedt_pf & 0x07) != (data & 0x07)) + // mame_printf_debug("marinedt_pf_w: %02x\n", data & 0x07); + + if ((marinedt_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(tx_tilemap, TILEMAP_FLIPX | TILEMAP_FLIPY); + else + tilemap_set_flip(tx_tilemap, 0); + } + + marinedt_pf = data; + +//if(data&0xf0) +// logerror("pf:%02x %d\n",marinedt_pf); +//logerror("pd:%02x %d\n",marinedt_pd, cpu_getcurrentframe()); + +} + +static ADDRESS_MAP_START( marinedt_writeport, ADDRESS_SPACE_IO, 8 ) + ADDRESS_MAP_FLAGS( AMEF_ABITS(8) ) + AM_RANGE(0x02, 0x02) AM_WRITE(marinedt_obj1_a_w) + AM_RANGE(0x03, 0x03) AM_WRITE(marinedt_obj1_x_w) + AM_RANGE(0x04, 0x04) AM_WRITE(marinedt_obj1_y_w) + AM_RANGE(0x05, 0x05) AM_WRITE(marinedt_music_w) + AM_RANGE(0x06, 0x06) AM_WRITE(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_WRITE(marinedt_obj2_y_w) + AM_RANGE(0x0d, 0x0d) AM_WRITE(marinedt_pd_w) + AM_RANGE(0x0e, 0x0e) AM_WRITE(watchdog_reset_w) + AM_RANGE(0x0f, 0x0f) AM_WRITE(marinedt_pf_w) +ADDRESS_MAP_END + +static INPUT_PORTS_START( marinedt ) + PORT_START /* IN0 */ + 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 /* IN1 */ + 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 /* IN2 */ + 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_BIT(0x04, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME( DEF_STR( Service_Mode )) PORT_TOGGLE PORT_CODE(KEYCODE_F2) + 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 /* IN3 - FAKE MUXED */ +//check all bits are used + PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(25) PORT_KEYDELTA(10) PORT_REVERSE + + PORT_START /* IN4 - 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( REGION_GFX1, 0, marinedt_charlayout, 0, 4 ) //really only 1 colour set? + GFXDECODE_ENTRY( REGION_GFX2, 0, marinedt_objlayout, 48, 4 ) + GFXDECODE_ENTRY( REGION_GFX3, 0, marinedt_objlayout, 32, 4 ) +GFXDECODE_END + +static PALETTE_INIT( marinedt ) +{ + int i,r,b,g; + + for (i = 0;i < machine->drv->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 ) +{ + int code = tx_tileram[tile_index]; + int color = 0; + int flags = TILE_FLIPX; + + SET_TILE_INFO(0, code, color, flags); +} + +static VIDEO_START( marinedt ) +{ + tx_tilemap = tilemap_create(get_tile_info, tilemap_scan_rows, TILEMAP_TYPE_PEN, 8, 8,32,32); + + tilemap_set_transparent_pen(tx_tilemap, 0); + tilemap_set_scrolldx(tx_tilemap, 0, 4*8); + tilemap_set_scrolldy(tx_tilemap, 0, -4*8); + + tile = auto_bitmap_alloc(32 * 8, 32 * 8, machine->screen[0].format); + obj1 = auto_bitmap_alloc(32,32,machine->screen[0].format); + obj2 = auto_bitmap_alloc(32,32,machine->screen[0].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) ((marinedt_pf & 0x02) == 0) +#define OBJ_FLIPY(a) ((a) & 0x80) + +static VIDEO_UPDATE( marinedt ) +{ + int sx, sy; + + fillbitmap(tile, machine->pens[0], NULL); + tilemap_draw(tile, cliprect, tx_tilemap, 0, 0); + + fillbitmap(obj1, machine->pens[0], NULL); + drawgfx(obj1, machine->gfx[1], + OBJ_CODE(marinedt_obj1_a), + OBJ_COLOR(marinedt_obj1_a), + OBJ_FLIPX(marinedt_obj1_a), OBJ_FLIPY(marinedt_obj1_a), + 0, 0, + NULL, TRANSPARENCY_PEN, 0); + + fillbitmap(obj2, machine->pens[0], NULL); + drawgfx(obj2, machine->gfx[2], + OBJ_CODE(marinedt_obj2_a), + OBJ_COLOR(marinedt_obj2_a), + OBJ_FLIPX(marinedt_obj2_a), OBJ_FLIPY(marinedt_obj2_a), + 0, 0, + NULL, TRANSPARENCY_PEN, 0); + + fillbitmap(bitmap, machine->pens[0], NULL); + + if (marinedt_pd & 0x02) + copybitmap(bitmap, obj2, 0, 0, OBJ_X(marinedt_obj2_x), OBJ_Y(marinedt_obj2_y), cliprect, TRANSPARENCY_COLOR, machine->pens[0]); + + if (marinedt_pd & 0x01) + copybitmap(bitmap, obj1, 0, 0, OBJ_X(marinedt_obj1_x), OBJ_Y(marinedt_obj1_y), cliprect, TRANSPARENCY_COLOR, machine->pens[0]); + + copybitmap(bitmap, tile, 0, 0, 0, 0, cliprect, TRANSPARENCY_COLOR, machine->pens[0]); + + coll = cx = cyr = cyq = 0; + if (marinedt_pd & 0x01) + { + for (sx = 0; sx < 32; sx++) + for (sy = 0; sy < 32; sy++) + { + int x = OBJ_X(marinedt_obj1_x) + sx; + int y = OBJ_Y(marinedt_obj1_y) + sy; + + if (x < cliprect->min_x || x > cliprect->max_x + || y < cliprect->min_y || y > cliprect->max_y) + continue; + + if (*BITMAP_ADDR16(obj1, sy, sx) == machine->pens[0]) + continue; + + if (*BITMAP_ADDR16(tile, y, x) != machine->pens[0]) + { + coll = 0x08; + + cx = (x % 128) / 8; + cx &= 0x0f; + + cyr = ((y % 64) / 8) * 2 + (x > 127 ? 1 : 0); + cyr &= 0x0f; + + cyq = y / 64; + cyq &= 0x0f; + + break; + } + } + } + + collh = cxh = cyrh = cyqh = 0; + if ((marinedt_pd & 0x03) == 0x03) + { + for (sx = 0; sx < 32; sx++) + for (sy = 0; sy < 32; sy++) + { + int x = OBJ_X(marinedt_obj1_x + sx); + int y = OBJ_Y(marinedt_obj1_y + sy); + + int xx = OBJ_X(marinedt_obj2_x) - x; + int yy = OBJ_Y(marinedt_obj2_y) - y; + + if (xx < 0 || xx >= 32 + || yy < 0 || yy >= 32) + continue; + + if (*BITMAP_ADDR16(obj1, sy, sx) == machine->pens[0]) + continue; + + if (*BITMAP_ADDR16(obj2, yy, xx) != machine->pens[0]) + { + collh = 0x80; + + cxh = (x % 128) / 8; + cxh &= 0x0f; + + cyrh = ((y % 64) / 8) * 2 + (x > 127 ? 1 : 0); + cyrh &= 0x0f; + + cyqh= y / 64; + cyqh &= 0x0f; + + break; + } + } + } + return 0; +} + +static MACHINE_DRIVER_START( marinedt ) + + /* basic machine hardware */ + MDRV_CPU_ADD(Z80,10000000/4) + MDRV_CPU_PROGRAM_MAP(marinedt_readmem,marinedt_writemem) + MDRV_CPU_IO_MAP(marinedt_readport,marinedt_writeport) + MDRV_CPU_VBLANK_INT(irq0_line_hold,1) + + 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(4*8+32*8, 32*8) + MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 4*8, 32*8-1) + MDRV_GFXDECODE(marinedt) + MDRV_PALETTE_LENGTH(64) + + MDRV_PALETTE_INIT(marinedt) + MDRV_VIDEO_START(marinedt) + MDRV_VIDEO_UPDATE(marinedt) + + /* sound hardware */ + //discrete sound +MACHINE_DRIVER_END + + +/*************************************************************************** + + Game driver(s) + +***************************************************************************/ + +ROM_START( marinedt ) + ROM_REGION( 0x10000, REGION_CPU1, 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, REGION_GFX1, ROMREGION_DISPOSE ) + 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, REGION_GFX2, ROMREGION_DISPOSE ) + ROM_LOAD( "mg12", 0x0000, 0x1000, CRC(7c6486d5) SHA1(a7f17a803937937f05fc90621883a0fd44b297a0) ) + + ROM_REGION( 0x1000, REGION_GFX3, ROMREGION_DISPOSE ) + ROM_LOAD( "mg13", 0x0000, 0x1000, CRC(17817044) SHA1(8c9b96620e3c414952e6d85c6e81b0df85c88e7a) ) + + ROM_REGION( 0x0080, REGION_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 ) |