summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2009-06-07 13:23:18 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2009-06-07 13:23:18 +0000
commit4e67a0a58934f0c52a2ef1f7eac3f84cdb0cc34c (patch)
tree96a45c3cfba3f41340fe455d5371f4a4394af34b
parentf8598544b41a406ed43fe780d9868ed844a1345b (diff)
New games added or promoted from NOT_WORKING status
--------------------------------------------------- Mirax [Olivier Galibert, Angelo Salese, Tomasz Slanina]
-rw-r--r--src/mame/drivers/mirax.c112
1 files changed, 44 insertions, 68 deletions
diff --git a/src/mame/drivers/mirax.c b/src/mame/drivers/mirax.c
index 58b5f85de10..3a37b02f8fe 100644
--- a/src/mame/drivers/mirax.c
+++ b/src/mame/drivers/mirax.c
@@ -2,13 +2,14 @@
****************************************************
Mirax (C)1985 Current Technologies
-preliminary WIP driver by
+driver by
Tomasz Slanina analog[AT]op[DOT]pl
Angelo Salese
Olivier Galibert
TODO:
-- sprite banking;
+- sprite offsets?
+- score / credits display should stay above the sprites?
- emulate sound properly;
====================================================
@@ -86,21 +87,23 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
for(count=0;count<0x200;count+=4)
{
- int spr_offs,x,y,color;
+ int spr_offs,x,y,color,fx,fy;
- spr_offs = (spriteram[count+1] & 0xff);
- color = spriteram[count+2] & 0x7;
+ if(spriteram[count] == 0x00 && spriteram[count+3] == 0x00)
+ continue;
- /* TODO: understand this */
- spr_offs += 2*(spriteram[count+2] & 0xe0);
+ spr_offs = (spriteram[count+1] & 0x3f);
+ color = spriteram[count+2] & 0x7;
+ fx = spriteram[count+1] & 0x40; //<- guess
+ fy = spriteram[count+1] & 0x80;
- if(spriteram[count+2] & 0x10)
- spr_offs+=0x200;
+ spr_offs += (spriteram[count+2] & 0xe0)<<1;
+ spr_offs += (spriteram[count+2] & 0x10)<<5;
y = 0x100 - spriteram[count];
x = spriteram[count+3];
- drawgfx(bitmap,machine->gfx[1],spr_offs,color,0,0,x,y,cliprect,TRANSPARENCY_PEN,0);
+ drawgfx(bitmap,machine->gfx[1],spr_offs,color,fx,fy,x,y-16,cliprect,TRANSPARENCY_PEN,0);
}
}
@@ -117,12 +120,10 @@ static VIDEO_UPDATE(mirax)
int tile = videoram[count];
int color = (colorram[x*2]<<8) | (colorram[(x*2)+1]);
int x_scroll = (color & 0xff00)>>8;
- tile|= ((color & 0x80)<<3) | ((color & 0x20)<<3);
-
- if(color & 0x40) { tile+= 0x200; }
+ tile |= ((color & 0xe0)<<3);
- //int colour = tile>>12;
drawgfx(bitmap,gfx,tile,color & 7,0,0,(x*8),(y*8)-x_scroll,cliprect,TRANSPARENCY_NONE,0);
+ /* wrap-around */
drawgfx(bitmap,gfx,tile,color & 7,0,0,(x*8),(y*8)-x_scroll+256,cliprect,TRANSPARENCY_NONE,0);
count++;
@@ -193,11 +194,7 @@ static ADDRESS_MAP_START( mirax_main_map, ADDRESS_SPACE_PROGRAM, 8 )
// AM_RANGE(0xf506, 0xf506)
// AM_RANGE(0xf507, 0xf507)
AM_RANGE(0xf800, 0xf800) AM_WRITE(mirax_sound_cmd_w)
-// AM_RANGE(0xf900, 0xf900) //sound cmd mirror?
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START( mirax_io_map, ADDRESS_SPACE_IO, 8 )
-
+// AM_RANGE(0xf900, 0xf900) //sound cmd mirror? ack?
ADDRESS_MAP_END
static ADDRESS_MAP_START( mirax_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
@@ -214,11 +211,6 @@ static ADDRESS_MAP_START( mirax_sound_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0xe403, 0xe403) AM_WRITENOP
AM_RANGE(0xf900, 0xf9ff) AM_WRITE(audio_w)
-
-ADDRESS_MAP_END
-
-static ADDRESS_MAP_START( mirax_sound_io_map, ADDRESS_SPACE_IO, 8 )
-
ADDRESS_MAP_END
static const gfx_layout layout16 =
@@ -251,41 +243,27 @@ static GFXDECODE_START( mirax )
GFXDECODE_END
static INPUT_PORTS_START( mirax )
+ /* up/down directions are trusted according of the continue screen */
PORT_START("P1") //player-1
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
- PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 )
PORT_START("P2") //player-2
- PORT_DIPNAME( 0x01, 0x01, "IN1" )
- PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 )
- PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
- /* note: one of these dips is for Invincibility, check which one */
PORT_START("DSW1") //dip-sw bank 1
PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coinage ) )
PORT_DIPSETTING( 0x03, DEF_STR( 2C_1C ) )
@@ -298,12 +276,11 @@ static INPUT_PORTS_START( mirax )
PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) )
+ PORT_DIPSETTING( 0x30, "2" )
+ PORT_DIPSETTING( 0x00, "3" )
+ PORT_DIPSETTING( 0x10, "4" )
+ PORT_DIPSETTING( 0x20, "5" )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -312,7 +289,7 @@ static INPUT_PORTS_START( mirax )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_START("DSW2") //dip-sw bank 2
- PORT_DIPNAME( 0x01, 0x01, "IN3" )
+ PORT_DIPNAME( 0x01, 0x01, "DSW_BANK2" )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
@@ -321,12 +298,13 @@ static INPUT_PORTS_START( mirax )
PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
- PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
- PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
- PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Allow_Continue ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Yes ) )
+ /* this dip makes the game to behave like attract mode, even if you insert a coin */
+ PORT_DIPNAME( 0x10, 0x00, "Auto-Play Mode (Debug)" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
@@ -373,14 +351,12 @@ static INTERRUPT_GEN( mirax_vblank_irq )
}
static MACHINE_DRIVER_START( mirax )
- MDRV_CPU_ADD("maincpu", Z80, 12000000) // ceramic potted module, encrypted z80
+ MDRV_CPU_ADD("maincpu", Z80, 12000000/2) // ceramic potted module, encrypted z80
MDRV_CPU_PROGRAM_MAP(mirax_main_map)
- MDRV_CPU_IO_MAP(mirax_io_map)
MDRV_CPU_VBLANK_INT("screen",mirax_vblank_irq)
- MDRV_CPU_ADD("audiocpu", Z80, 12000000) // audio cpu ?
+ MDRV_CPU_ADD("audiocpu", Z80, 12000000/2) // audio cpu ?
MDRV_CPU_PROGRAM_MAP(mirax_sound_map)
- MDRV_CPU_IO_MAP(mirax_sound_io_map)
MDRV_CPU_VBLANK_INT_HACK(irq0_line_hold, 2)
/* video hardware */
@@ -389,7 +365,7 @@ static MACHINE_DRIVER_START( mirax )
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(256, 256)
- MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 32*8-1)
+ MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
MDRV_PALETTE_LENGTH(0x40)
MDRV_PALETTE_INIT(mirax)
@@ -404,9 +380,9 @@ static MACHINE_DRIVER_START( mirax )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MDRV_SOUND_ADD("ay2", AY8910, 12000000/6 /* guess */)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
-
MACHINE_DRIVER_END
+
ROM_START( mirax )
ROM_REGION( 0xc000, "maincpu", ROMREGION_ERASE00 ) // put decrypted code there
@@ -455,4 +431,4 @@ static DRIVER_INIT( mirax )
}
-GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax", GAME_NOT_WORKING)
+GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax", GAME_IMPERFECT_SOUND | GAME_IMPERFECT_GRAPHICS )