diff options
author | stephh <stephh@users.noreply.github.com> | 2012-04-03 23:28:51 +0000 |
---|---|---|
committer | stephh <stephh@users.noreply.github.com> | 2012-04-03 23:28:51 +0000 |
commit | 7acfdb031a7b2bcb1e43a2477e2de986c8428b43 (patch) | |
tree | c274cc3353c946f23f885f34a02201c26a6705cb | |
parent | 2b6903b3434cd36a7cf93d8d479c20cae42125ca (diff) |
mirax, miraxa (mirax.c) [stephh] :
- Fixed Dip Switches and Inputs (after verification of the Z80 code)
-rw-r--r-- | src/mame/drivers/mirax.c | 300 |
1 files changed, 182 insertions, 118 deletions
diff --git a/src/mame/drivers/mirax.c b/src/mame/drivers/mirax.c index dc33325e558..c05c9bcfc0c 100644 --- a/src/mame/drivers/mirax.c +++ b/src/mame/drivers/mirax.c @@ -8,6 +8,7 @@ Angelo Salese Olivier Galibert TODO: +- support screen flipping - sound ports are a mystery (PC=0x02e0) - sprite offsets? - score / credits display should stay above the sprites? @@ -64,6 +65,40 @@ Parts Solder 22 +12 +12 +Stephh's notes (based on the games Z80 code and some tests) : + +1) 'mirax' + + - Screen flipping settings (DSW1 bit 3) are only tested AFTER the ROM/RAM checks; + so the first texts may be upside down related to screen orientation (ingame bug). + - Coin A and Coin B use the same coinage based on DSW1 bits 0 and 1. + Furthermore, they share the same coin counter at 0xf500. + - When reaching 10th "boss" (level 100), the game will consider that you're on level 1 : + it will display "STAGE 1 - MIRAX CITY: 90000 MILES" on "presentation" screen and + "STAGE 1" at the bottom right when fighting the "boss". + Once you have defeated it, you'll go back to normal stage 2 : it will display + "STAGE 2 - MIRAX CITY: 80000 MILES" on "presentation" screen and "STAGE 2" + at the bottom right (ingame bug). + +2) 'miraxa' + + - Screen flipping settings (DSW1 bit 3) are only BEFORE the ROM/RAM checks + due to additional code at 0x0200, so the first texts always fit screen orientation. + - Coin A and Coin B use different coinages even if both are based on DSW1 bits 0 and 1. + There are 2 coin counters : Coin A at 0xf500 and Coin B at 0xf502. + - Other noticeable differences with 'mirax' : + * different lives settings (DSW1 bits 4 and 5) + * different bonus lives settings (DSW2 bits 0 and 1) + * different stages names : + . stages 1 to 10 : "LUXORI" instead of "MIRAX" + . stages 71 to 80 : "DESCOM" instead of "DESBOM" + futhermore, for all stages, it's written "UNIT" instead of "CITY" + - Same ingame bug as in 'mirax' when you reach level 100 (of course, it will display + "LUXORI UNIT" instead of "MIRAX CITY" on "presentation" screen). + +MIRAX / RUTHIN / GORGAN / PEMBAY / URMIA / VENLO / OHRE / DESBOM / XELUN / MURBO +LUXORI / " / " / " / " / " / " / DESCOM / " / " + ************************************************ */ @@ -83,14 +118,44 @@ public: UINT8 m_nmi_mask; UINT8 *m_videoram; UINT8 *m_colorram; + UINT8 m_flipscreen_x; + UINT8 m_flipscreen_y; DECLARE_WRITE8_MEMBER(audio_w); - DECLARE_READ8_MEMBER(unk_r); DECLARE_WRITE8_MEMBER(nmi_mask_w); DECLARE_WRITE8_MEMBER(mirax_sound_cmd_w); - DECLARE_WRITE8_MEMBER(coin_lockout_w); + DECLARE_WRITE8_MEMBER(mirax_coin_counter0_w); + DECLARE_WRITE8_MEMBER(mirax_coin_counter1_w); + DECLARE_WRITE8_MEMBER(mirax_flip_screen_w); }; +static PALETTE_INIT( mirax ) +{ + int i; + + for (i = 0;i < machine.total_colors();i++) + { + int bit0,bit1,bit2,r,g,b; + + /* red component */ + bit0 = (color_prom[i] >> 0) & 0x01; + bit1 = (color_prom[i] >> 1) & 0x01; + bit2 = (color_prom[i] >> 2) & 0x01; + r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* green component */ + bit0 = (color_prom[i] >> 3) & 0x01; + bit1 = (color_prom[i] >> 4) & 0x01; + bit2 = (color_prom[i] >> 5) & 0x01; + g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; + /* blue component */ + bit0 = (color_prom[i] >> 6) & 0x01; + bit1 = (color_prom[i] >> 7) & 0x01; + b = 0x4f * bit0 + 0xa8 * bit1; + + palette_set_color(machine,i,MAKE_RGB(r,g,b)); + } +} + static VIDEO_START(mirax) { } @@ -127,14 +192,13 @@ static SCREEN_UPDATE_IND16(mirax) { mirax_state *state = screen.machine().driver_data<mirax_state>(); const gfx_element *gfx = screen.machine().gfx[0]; - int count = 0x00000; int y,x; for (y=0;y<32;y++) { for (x=0;x<32;x++) { - int tile = state->m_videoram[count]; + int tile = state->m_videoram[32*y+x]; int color = (state->m_colorram[x*2]<<8) | (state->m_colorram[(x*2)+1]); int x_scroll = (color & 0xff00)>>8; tile |= ((color & 0xe0)<<3); @@ -142,21 +206,17 @@ static SCREEN_UPDATE_IND16(mirax) drawgfx_opaque(bitmap,cliprect,gfx,tile,color & 7,0,0,(x*8),(y*8)-x_scroll); /* wrap-around */ drawgfx_opaque(bitmap,cliprect,gfx,tile,color & 7,0,0,(x*8),(y*8)-x_scroll+256); - - count++; } } draw_sprites(screen.machine(),bitmap,cliprect); - count = 0x00000; - /* draw score and credit displays above the sprites */ for (y=0;y<32;y++) { for (x=0;x<32;x++) { - int tile = state->m_videoram[count]; + int tile = state->m_videoram[32*y+x]; int color = (state->m_colorram[x*2]<<8) | (state->m_colorram[(x*2)+1]); int x_scroll = (color & 0xff00)>>8; tile |= ((color & 0xe0)<<3); @@ -167,8 +227,6 @@ static SCREEN_UPDATE_IND16(mirax) /* wrap-around */ drawgfx_opaque(bitmap,cliprect,gfx,tile,color & 7,0,0,(x*8),(y*8)-x_scroll+256); } - - count++; } } @@ -198,11 +256,6 @@ static WRITE8_DEVICE_HANDLER(ay_sel) } } -READ8_MEMBER(mirax_state::unk_r) -{ - return 0xff; -} - WRITE8_MEMBER(mirax_state::nmi_mask_w) { m_nmi_mask = data & 1; @@ -216,11 +269,28 @@ WRITE8_MEMBER(mirax_state::mirax_sound_cmd_w) cputag_set_input_line(machine(), "audiocpu", INPUT_LINE_NMI, PULSE_LINE); } -/* might be coin counter instead */ -WRITE8_MEMBER(mirax_state::coin_lockout_w) + +WRITE8_MEMBER(mirax_state::mirax_coin_counter0_w) +{ + coin_counter_w(machine(), 0, data & 1); +} + +WRITE8_MEMBER(mirax_state::mirax_coin_counter1_w) { - coin_lockout_w(space, 0,data & 1); - coin_lockout_w(space, 1,data & 1); + coin_counter_w(machine(), 1, data & 1); +} + +/* One address flips X, the other flips Y, but I can't tell which is which - Since the value is the same for the 2 addresses, it doesn't really matter */ +WRITE8_MEMBER(mirax_state::mirax_flip_screen_w) +{ + if (offset == 0) + { + m_flipscreen_x = data & 0x01; + } + if (offset == 1) + { + m_flipscreen_y = data & 0x01; + } } static ADDRESS_MAP_START( mirax_main_map, AS_PROGRAM, 8, mirax_state ) @@ -232,12 +302,12 @@ static ADDRESS_MAP_START( mirax_main_map, AS_PROGRAM, 8, mirax_state ) AM_RANGE(0xf000, 0xf000) AM_READ_PORT("P1") AM_RANGE(0xf100, 0xf100) AM_READ_PORT("P2") AM_RANGE(0xf200, 0xf200) AM_READ_PORT("DSW1") - AM_RANGE(0xf300, 0xf300) AM_READ(unk_r) //watchdog? value is always read then discarded + AM_RANGE(0xf300, 0xf300) AM_READNOP //watchdog? value is always read then discarded AM_RANGE(0xf400, 0xf400) AM_READ_PORT("DSW2") - AM_RANGE(0xf500, 0xf500) AM_WRITE(coin_lockout_w) + AM_RANGE(0xf500, 0xf500) AM_WRITE(mirax_coin_counter0_w) AM_RANGE(0xf501, 0xf501) AM_WRITE(nmi_mask_w) -// AM_RANGE(0xf506, 0xf506) -// AM_RANGE(0xf507, 0xf507) + AM_RANGE(0xf502, 0xf502) AM_WRITE(mirax_coin_counter1_w) // only used in 'miraxa' - see notes + AM_RANGE(0xf506, 0xf507) AM_WRITE(mirax_flip_screen_w) AM_RANGE(0xf800, 0xf800) AM_WRITE(mirax_sound_cmd_w) // AM_RANGE(0xf900, 0xf900) //sound cmd mirror? ack? ADDRESS_MAP_END @@ -258,88 +328,57 @@ static ADDRESS_MAP_START( mirax_sound_map, AS_PROGRAM, 8, mirax_state ) AM_RANGE(0xf900, 0xf9ff) AM_WRITE(audio_w) ADDRESS_MAP_END -static const gfx_layout layout16 = -{ - 16,16, - RGN_FRAC(1,3), - 3, - { RGN_FRAC(2,3),RGN_FRAC(1,3),RGN_FRAC(0,3)}, - { 0, 1, 2, 3, 4, 5, 6, 7 , - 0+8*8,1+8*8,2+8*8,3+8*8,4+8*8,5+8*8,6+8*8,7+8*8}, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, - 0*8+8*8*2, 1*8+8*8*2, 2*8+8*8*2, 3*8+8*8*2, 4*8+8*8*2, 5*8+8*8*2, 6*8+8*8*2, 7*8+8*8*2}, - 16*16 -}; - -static const gfx_layout layout8 = -{ - 8,8, - RGN_FRAC(1,3), - 3, - { RGN_FRAC(2,3),RGN_FRAC(1,3),RGN_FRAC(0,3)}, - { 0, 1, 2, 3, 4, 5, 6, 7}, - { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8}, - 8*8 -}; - -static GFXDECODE_START( mirax ) - GFXDECODE_ENTRY( "gfx1", 0, layout8, 0, 8 ) - GFXDECODE_ENTRY( "gfx2", 0, layout16, 0, 8 ) -GFXDECODE_END +/* verified from Z80 code */ 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_DOWN ) PORT_PLAYER(1) + PORT_START("P1") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) 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_UP ) PORT_PLAYER(1) + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN2 ) - PORT_START("P2") //player-2 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) + PORT_START("P2") + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_START2 ) - 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( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL + PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_COCKTAIL PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("DSW1") //dip-sw bank 1 + PORT_START("DSW1") PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x03, 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_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( 0x04, 0x00, DEF_STR( Cabinet ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Upright ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Cocktail ) ) + PORT_DIPNAME( 0x08, 0x00, DEF_STR( Flip_Screen ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x08, 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 ) ) - PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) - - PORT_START("DSW2") //dip-sw bank 2 - 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 ) ) - PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPUNUSED( 0x40, IP_ACTIVE_HIGH ) + PORT_DIPUNUSED( 0x80, IP_ACTIVE_HIGH ) + + PORT_START("DSW2") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Bonus_Life ) ) /* table at 0x11b5 (2 * 3 * 2 bytes) */ + PORT_DIPSETTING( 0x00, "30k 80k 150k" ) + PORT_DIPSETTING( 0x01, "900k 950k 990k" ) + PORT_DIPNAME( 0x02, 0x00, "Flags for Extra Life" ) + PORT_DIPSETTING( 0x00, "5" ) + PORT_DIPSETTING( 0x02, "8" ) PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x04, DEF_STR( On ) ) @@ -350,44 +389,65 @@ static INPUT_PORTS_START( mirax ) 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 ) ) - 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_DIPNAME( 0x20, 0x00, DEF_STR( Difficulty ) ) + PORT_DIPSETTING( 0x00, DEF_STR( Easy ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Hard ) ) + PORT_DIPUNUSED( 0x40, IP_ACTIVE_HIGH ) + PORT_DIPUNUSED( 0x80, IP_ACTIVE_HIGH ) INPUT_PORTS_END +/* verified from Z80 code */ +static INPUT_PORTS_START( miraxa ) + PORT_INCLUDE( mirax ) -static PALETTE_INIT( mirax ) + PORT_MODIFY("DSW1") + PORT_DIPNAME( 0x03, 0x00, DEF_STR( Coinage ) ) + PORT_DIPSETTING( 0x03, "A: 2C/1C - B: 12C/1C" ) + PORT_DIPSETTING( 0x00, "A: 1C/1C - B: 6C/1C" ) + PORT_DIPSETTING( 0x01, "A: 1C/2C - B: 3C/1C" ) + PORT_DIPSETTING( 0x02, "A: 1C/3C - B: 2C/1C" ) + PORT_DIPNAME( 0x30, 0x00, DEF_STR( Lives ) ) + PORT_DIPSETTING( 0x00, "3" ) + PORT_DIPSETTING( 0x10, "4" ) + PORT_DIPSETTING( 0x20, "5" ) + PORT_DIPSETTING( 0x30, "6" ) + + PORT_MODIFY("DSW2") + PORT_DIPNAME( 0x01, 0x00, DEF_STR( Bonus_Life ) ) /* table at 0x1276 (2 * 3 * 2 bytes) */ + PORT_DIPSETTING( 0x00, "30k 80k 150k" ) + PORT_DIPSETTING( 0x01, "50k 100k 900k" ) +INPUT_PORTS_END + + +static const gfx_layout layout16 = { - int i; + 16,16, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(2,3),RGN_FRAC(1,3),RGN_FRAC(0,3)}, + { 0, 1, 2, 3, 4, 5, 6, 7 , + 0+8*8,1+8*8,2+8*8,3+8*8,4+8*8,5+8*8,6+8*8,7+8*8}, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, + 0*8+8*8*2, 1*8+8*8*2, 2*8+8*8*2, 3*8+8*8*2, 4*8+8*8*2, 5*8+8*8*2, 6*8+8*8*2, 7*8+8*8*2}, + 16*16 +}; - for (i = 0;i < machine.total_colors();i++) - { - int bit0,bit1,bit2,r,g,b; +static const gfx_layout layout8 = +{ + 8,8, + RGN_FRAC(1,3), + 3, + { RGN_FRAC(2,3),RGN_FRAC(1,3),RGN_FRAC(0,3)}, + { 0, 1, 2, 3, 4, 5, 6, 7}, + { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8}, + 8*8 +}; - /* red component */ - bit0 = (color_prom[i] >> 0) & 0x01; - bit1 = (color_prom[i] >> 1) & 0x01; - bit2 = (color_prom[i] >> 2) & 0x01; - r = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - /* green component */ - bit0 = (color_prom[i] >> 3) & 0x01; - bit1 = (color_prom[i] >> 4) & 0x01; - bit2 = (color_prom[i] >> 5) & 0x01; - g = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2; - /* blue component */ - bit0 = (color_prom[i] >> 6) & 0x01; - bit1 = (color_prom[i] >> 7) & 0x01; - b = 0x4f * bit0 + 0xa8 * bit1; +static GFXDECODE_START( mirax ) + GFXDECODE_ENTRY( "gfx1", 0, layout8, 0, 8 ) + GFXDECODE_ENTRY( "gfx2", 0, layout16, 0, 8 ) +GFXDECODE_END - palette_set_color(machine,i,MAKE_RGB(r,g,b)); - } -} static INTERRUPT_GEN( mirax_vblank_irq ) { @@ -490,6 +550,7 @@ ROM_END static DRIVER_INIT( mirax ) { + mirax_state *state = machine.driver_data<mirax_state>(); UINT8 *DATA = machine.region("data_code")->base(); UINT8 *ROM = machine.region("maincpu")->base(); int i; @@ -503,7 +564,10 @@ static DRIVER_INIT( mirax ) for(i=0x8000;i<0xc000;i++) ROM[BITSWAP16(i, 15,14,13,12,11,10,9, 5,7,6,8, 4,3,2,1,0)] = (BITSWAP8(DATA[i], 1, 3, 7, 0, 5, 6, 4, 2) ^ 0xff); + /* These values need to be initialised only once, not on every soft reset */ + state->m_flipscreen_x = 0; + state->m_flipscreen_y = 0; } -GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax (set 1)", 0 ) -GAME( 1985, miraxa, mirax, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax (set 2)", 0 ) +GAME( 1985, mirax, 0, mirax, mirax, mirax, ROT90, "Current Technologies", "Mirax (set 1)", GAME_NO_COCKTAIL ) +GAME( 1985, miraxa, mirax, mirax, miraxa, mirax, ROT90, "Current Technologies", "Mirax (set 2)", GAME_NO_COCKTAIL ) |