summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/metro/metro.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/metro/metro.cpp')
-rw-r--r--src/mame/metro/metro.cpp121
1 files changed, 63 insertions, 58 deletions
diff --git a/src/mame/metro/metro.cpp b/src/mame/metro/metro.cpp
index 161a91de70a..eedd8a71028 100644
--- a/src/mame/metro/metro.cpp
+++ b/src/mame/metro/metro.cpp
@@ -75,7 +75,7 @@ To Do:
causes scrolling glitches in some games. Test cases Mouse Go Go
title screen, GunMaster title screen. Changing it can cause
excessive slowdown in said games however.
-- karatour, ladykill, 3kokushi: understand what the irq source 5 is really tied to.
+- karatour, ladykill, 3kokushi: understand what the IRQ source 5 is really tied to.
All these games also have a vblank delay check outside irq routine,
cfr. PC=1322 in karatour;
- vmetal: ES8712 actually controls a M6585 and an unknown logic selector chip.
@@ -84,11 +84,11 @@ To Do:
Notes:
-- To enter service mode in ladykill, 3kokushi: toggle the dip switch and reset
+- To enter service mode in ladykill, 3kokushi: toggle the DIP switch and reset
keeping start 2 pressed.
- Sprite zoom in Mouja at the end of a match looks wrong, but it's been verified
to be the same on the original board
-- vmetal: has Sega and Taito logos in the roms ?!
+- vmetal: has Sega and Taito logos in the ROMs?!
driver modified by Hau
***************************************************************************/
@@ -96,11 +96,11 @@ driver modified by Hau
#include "emu.h"
#include "metro.h"
-#include "cpu/z80/z80.h"
+#include "cpu/h8/h83006.h"
#include "cpu/m68000/m68000.h"
#include "cpu/upd7810/upd7810.h"
-#include "cpu/h8/h83006.h"
#include "cpu/z8/z8.h"
+#include "cpu/z80/z80.h"
#include "machine/watchdog.h"
#include "sound/msm5205.h"
#include "sound/ymopl.h"
@@ -160,12 +160,12 @@ TIMER_DEVICE_CALLBACK_MEMBER(metro_state::bangball_scanline)
int const scanline = param;
// vblank irq
- if(scanline == 224)
+ if (scanline == 224)
{
m_vdp2->set_irq(4); // ???
m_vdp2->screen_eof(ASSERT_LINE);
}
- else if(scanline < 224 && (m_vdp2->irq_enable() & 2) == 0)
+ else if (scanline < 224 && (m_vdp2->irq_enable() & 2) == 0)
{
// pretty likely hblank irq (pressing a button when clearing a stage)
m_vdp2->set_irq(1);
@@ -269,7 +269,7 @@ void metro_upd7810_state::soundstatus_w(u8 data)
m_soundstatus = data & 0x01;
}
-template<int Mask>
+template <int Mask>
void metro_upd7810_state::upd7810_rombank_w(u8 data)
{
m_audiobank->set_entry((data >> 4) & Mask);
@@ -404,7 +404,7 @@ void metro_state::coin_lockout_1word_w(u8 data)
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
- if (data & ~3) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", m_maincpu->pc(), data);
+ if (data & ~3) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", m_maincpu->pc(), data);
}
// value written doesn't matter, also each counted coin gets reported after one full second.
@@ -414,7 +414,7 @@ void metro_state::coin_lockout_4words_w(offs_t offset, u16 data)
machine().bookkeeping().coin_counter_w((offset >> 1) & 1, offset & 1);
// machine().bookkeeping().coin_lockout_w((offset >> 1) & 1, offset & 1);
- if (data & ~1) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", m_maincpu->pc(), data);
+ if (data & ~1) logerror("CPU #0 PC %06X : unknown bits of coin lockout written: %04X\n", m_maincpu->pc(), data);
}
/***************************************************************************
@@ -434,9 +434,9 @@ void metro_state::coin_lockout_4words_w(offs_t offset, u16 data)
void metro_upd7810_state::upd7810_map(address_map &map)
{
- map(0x0000, 0x3fff).rom(); // External ROM
- map(0x4000, 0x7fff).bankr(m_audiobank); // External ROM (Banked)
- map(0x8000, 0x87ff).ram(); // External RAM
+ map(0x0000, 0x3fff).rom(); // External ROM
+ map(0x4000, 0x7fff).bankr(m_audiobank); // External ROM (Banked)
+ map(0x8000, 0x87ff).ram(); // External RAM
}
/*****************/
@@ -547,16 +547,16 @@ void metro_state::batlbubl_map(address_map &map)
void metro_state::msgogo_map(address_map &map)
{
- map(0x000000, 0x07ffff).rom(); // ROM
+ map(0x000000, 0x07ffff).rom(); // ROM
map(0x100000, 0x17ffff).m(m_vdp2, FUNC(imagetek_i4220_device::v2_map));
- map(0x200000, 0x200001).portr("COINS"); // Inputs
- map(0x200002, 0x200003).portr("JOYS"); //
- map(0x200006, 0x200007).nopr(); //
- map(0x200002, 0x200009).w(FUNC(metro_state::coin_lockout_4words_w)); // Coin Lockout
- map(0x300000, 0x31ffff).r(FUNC(metro_state::balcube_dsw_r)); // 3 x DSW
- map(0x400001, 0x400001).r("ymf", FUNC(ymf278b_device::read)); // Sound
+ map(0x200000, 0x200001).portr("COINS"); // Inputs
+ map(0x200002, 0x200003).portr("JOYS"); //
+ map(0x200006, 0x200007).nopr(); //
+ map(0x200002, 0x200009).w(FUNC(metro_state::coin_lockout_4words_w)); // Coin Lockout
+ map(0x300000, 0x31ffff).r(FUNC(metro_state::balcube_dsw_r)); // 3 x DSW
+ map(0x400001, 0x400001).r("ymf", FUNC(ymf278b_device::read)); // Sound
map(0x400000, 0x40000b).w("ymf", FUNC(ymf278b_device::write)).umask16(0x00ff); //
- map(0xf00000, 0xf0ffff).ram().mirror(0x0f0000); // RAM (mirrored)
+ map(0xf00000, 0xf0ffff).ram().mirror(0x0f0000); // RAM (mirrored)
}
/***************************************************************************
@@ -565,16 +565,16 @@ void metro_state::msgogo_map(address_map &map)
void metro_upd7810_state::daitorid_map(address_map &map)
{
- map(0x000000, 0x03ffff).rom(); // ROM
+ map(0x000000, 0x03ffff).rom(); // ROM
map(0x400000, 0x47ffff).m(m_vdp2, FUNC(imagetek_i4220_device::v2_map));
- map(0x4788a9, 0x4788a9).w(FUNC(metro_upd7810_state::sound_data_w)); // To Sound CPU
- map(0x800000, 0x80ffff).ram().mirror(0x0f0000); // RAM (mirrored)
+ map(0x4788a9, 0x4788a9).w(FUNC(metro_upd7810_state::sound_data_w)); // To Sound CPU
+ map(0x800000, 0x80ffff).ram().mirror(0x0f0000); // RAM (mirrored)
map(0xc00000, 0xc00001).portr("IN0");
- map(0xc00001, 0xc00001).w(FUNC(metro_upd7810_state::soundstatus_w)); // To Sound CPU
- map(0xc00002, 0xc00003).portr("IN1"); //
- map(0xc00004, 0xc00005).portr("DSW0"); //
- map(0xc00006, 0xc00007).portr("IN2"); //
- map(0xc00002, 0xc00009).w(FUNC(metro_upd7810_state::coin_lockout_4words_w)); // Coin Lockout
+ map(0xc00001, 0xc00001).w(FUNC(metro_upd7810_state::soundstatus_w)); // To Sound CPU
+ map(0xc00002, 0xc00003).portr("IN1"); //
+ map(0xc00004, 0xc00005).portr("DSW0"); //
+ map(0xc00006, 0xc00007).portr("IN2"); //
+ map(0xc00002, 0xc00009).w(FUNC(metro_upd7810_state::coin_lockout_4words_w)); // Coin Lockout
}
@@ -584,16 +584,16 @@ void metro_upd7810_state::daitorid_map(address_map &map)
void metro_upd7810_state::dharma_map(address_map &map)
{
- map(0x000000, 0x03ffff).rom(); // ROM
- map(0x400000, 0x40ffff).ram().mirror(0x0f0000); // RAM (mirrored)
+ map(0x000000, 0x03ffff).rom(); // ROM
+ map(0x400000, 0x40ffff).ram().mirror(0x0f0000); // RAM (mirrored)
map(0x800000, 0x87ffff).m(m_vdp2, FUNC(imagetek_i4220_device::v2_map));
- map(0x8788a9, 0x8788a9).w(FUNC(metro_upd7810_state::sound_data_w)); // To Sound CPU
+ map(0x8788a9, 0x8788a9).w(FUNC(metro_upd7810_state::sound_data_w)); // To Sound CPU
map(0xc00000, 0xc00001).portr("IN0");
- map(0xc00001, 0xc00001).w(FUNC(metro_upd7810_state::soundstatus_w)); // To Sound CPU
- map(0xc00002, 0xc00003).portr("IN1"); //
- map(0xc00004, 0xc00005).portr("DSW0"); //
- map(0xc00006, 0xc00007).portr("IN2"); //
- map(0xc00002, 0xc00009).w(FUNC(metro_upd7810_state::coin_lockout_4words_w)); // Coin Lockout
+ map(0xc00001, 0xc00001).w(FUNC(metro_upd7810_state::soundstatus_w)); // To Sound CPU
+ map(0xc00002, 0xc00003).portr("IN1"); //
+ map(0xc00004, 0xc00005).portr("DSW0"); //
+ map(0xc00006, 0xc00007).portr("IN2"); //
+ map(0xc00002, 0xc00009).w(FUNC(metro_upd7810_state::coin_lockout_4words_w)); // Coin Lockout
}
@@ -1063,7 +1063,7 @@ void vmetal_state::vmetal_control_w(u8 data)
/* Lower nibble is the coin control bits shown in
service mode, but in game mode they're different */
machine().bookkeeping().coin_counter_w(0, BIT(data, 2));
- machine().bookkeeping().coin_counter_w(1, BIT(data, 3)); // 2nd coin schute activates coin 0 counter in game mode??
+ machine().bookkeeping().coin_counter_w(1, BIT(data, 3)); // 2nd coin chute activates coin 0 counter in game mode??
// machine().bookkeeping().coin_lockout_w(0, BIT(data, 0)); // always on in game mode??
machine().bookkeeping().coin_lockout_w(1, BIT(data, 1)); // never activated in game mode??
@@ -1934,10 +1934,10 @@ static INPUT_PORTS_START( lastfort )
COINS
PORT_START("IN1") /*$c00006*/
- JOY_LSB(1, BUTTON1, UNKNOWN, UNKNOWN, UNKNOWN) // BUTTON2 and BUTTON3 in "test mode" only*/
+ JOY_LSB(1, BUTTON1, UNKNOWN, UNKNOWN, UNKNOWN) // BUTTON2 and BUTTON3 in "test mode" only
PORT_START("IN2") /*$c00008*/
- JOY_LSB(2, BUTTON1, UNKNOWN, UNKNOWN, UNKNOWN) /*BUTTON2 and BUTTON3 in "test mode" only*/
+ JOY_LSB(2, BUTTON1, UNKNOWN, UNKNOWN, UNKNOWN) // BUTTON2 and BUTTON3 in "test mode" only
PORT_START("DSW0") /*$c0000a*/
COINAGE_SERVICE_LOC(SW1)
@@ -4717,7 +4717,7 @@ Video: Imagetek I4220 071 9430WK440
SW3 - Not Populated
-ms_ja-1.1 tms27c240 <-- Is there an undumped MS_WA1 World rom??
+ms_ja-1.1 tms27c240 <-- Is there an undumped MS_WA1 World ROM??
ms_wa-2.2 tms27c240
ms_wa-3.3 tms27c240
ms_wa-4.4 tms27c240
@@ -5487,43 +5487,48 @@ GAME( 1992, pangpomsn, pangpoms, pangpoms, pangpoms, metro_upd7810_state, emp
GAME( 1992, skyalert, 0, skyalert, skyalert, metro_upd7810_state, empty_init, ROT270, "Metro", "Sky Alert", MACHINE_SUPPORTS_SAVE )
GAME( 1993, ladykill, 0, karatour, ladykill, metro_upd7810_state, init_karatour, ROT90, "Yanyaka (Mitchell license)", "Lady Killer", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1993, moegonta, ladykill, karatour, moegonta, metro_upd7810_state, init_karatour, ROT90, "Yanyaka", "Moeyo Gonta!! (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+// Japanese subtitle in Japanese set, English otherwise; Kanji title is the same regardless region
GAME( 1994, lastfort, 0, lastfort, lastfort, metro_upd7810_state, empty_init, ROT0, "Metro", "Last Fortress - Toride (Japan, VG420 PCB)", MACHINE_SUPPORTS_SAVE ) // VG420 PCB
GAME( 1994, lastforte, lastfort, lastfort, lastfero, metro_upd7810_state, empty_init, ROT0, "Metro", "Last Fortress - Toride (China, Rev C)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, lastfortea,lastfort, lastfort, lastfero, metro_upd7810_state, empty_init, ROT0, "Metro", "Last Fortress - Toride (China, Rev A)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, lastfortk, lastfort, lastfort, lastfero, metro_upd7810_state, empty_init, ROT0, "Metro", "Last Fortress - Toride (Korea)", MACHINE_SUPPORTS_SAVE )
+GAME( 1994, lastfortk, lastfort, lastfort, lastfero, metro_upd7810_state, empty_init, ROT0, "Metro (Grand Computer license)", "Last Fortress - Toride (Korea)", MACHINE_SUPPORTS_SAVE ) // distributor name is korean (그랜드컴퓨터)
GAME( 1994, lastfortj, lastfort, lastforg, ladykill, metro_upd7810_state, init_karatour, ROT0, "Metro", "Last Fortress - Toride (Japan, VG460 PCB)", MACHINE_SUPPORTS_SAVE ) // VG460-(A) PCB
-GAME( 1994, lastfortg, lastfort, lastforg, ladykill, metro_upd7810_state, init_karatour, ROT0, "Metro", "Last Fortress - Toride (Germany)", MACHINE_SUPPORTS_SAVE ) // VG460-(A) PCB
+// Germany set has Mah-Jong subtitle
+GAME( 1994, lastfortg, lastfort, lastforg, ladykill, metro_upd7810_state, init_karatour, ROT0, "Metro", "Last Fortress - Toride: Mah-jong (Germany)", MACHINE_SUPPORTS_SAVE ) // VG460-(A) PCB
// MTR5260 / MTR527
-GAME( 1993, poitto, 0, poitto, poitto, metro_upd7810_state, empty_init, ROT0, "Metro / Able Corp.", "Poitto! (revision D)", MACHINE_SUPPORTS_SAVE )
+GAME( 1993, poitto, 0, poitto, poitto, metro_upd7810_state, empty_init, ROT0, "Metro / Able Corp.", "Poitto! (Japan revision D)", MACHINE_SUPPORTS_SAVE )
GAME( 1993, poittoc, poitto, poitto, poitto, metro_upd7810_state, empty_init, ROT0, "Metro / Able Corp.", "Poitto! (revision C)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // missing 1 program ROM
+// All set except Korean region has "DHARMA" subtitle
GAME( 1994, dharma, 0, dharma, dharma, metro_upd7810_state, init_dharmak, ROT0, "Metro", "Dharma Doujou", MACHINE_SUPPORTS_SAVE )
GAME( 1994, dharmag, dharma, dharma, dharma, metro_upd7810_state, init_dharmak, ROT0, "Metro", "Dharma Doujou (Germany)", MACHINE_SUPPORTS_SAVE )
GAME( 1994, dharmaj, dharma, dharma, dharma, metro_upd7810_state, empty_init, ROT0, "Metro", "Dharma Doujou (Japan)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, dharmak, dharma, dharma, dharma, metro_upd7810_state, init_dharmak, ROT0, "Metro", "Dharma Doujou (Korea)", MACHINE_SUPPORTS_SAVE )
-GAME( 1994, toride2g, 0, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II Adauchi Gaiden", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1994, toride2gg, toride2g, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II Adauchi Gaiden (German)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1994, dharmak, dharma, dharma, dharma, metro_upd7810_state, init_dharmak, ROT0, "Metro", "Dharma Dojang - Mangchi Man (Korea)", MACHINE_SUPPORTS_SAVE ) // 다루마 도장: 망치맨
+// Toride II Adauchi Gaiden set: Same title screen regardless region
+GAME( 1994, toride2g, 0, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II Adauchi Gaiden (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1994, toride2gk, toride2g, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II Bok Su Oi Jeon Adauchi Gaiden (Korea)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+// Toride II set (non - Adauchi Gaiden revision)
+GAME( 1994, toride2gg, toride2g, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II (German)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1994, toride2j, toride2g, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II (Japan, revision K)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1994, toride2ji, toride2g, toride2g, toride2g, metro_upd7810_state, empty_init, ROT0, "Metro", "Toride II (Japan, revision I)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1994, gunmast, 0, pururun, gunmast, metro_upd7810_state, empty_init, ROT0, "Metro", "Gun Master", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, daitorid, 0, daitorid, daitorid, metro_upd7810_state, empty_init, ROT0, "Metro", "Daitoride", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, pururun, 0, pururun, pururun, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Pururun (set 1)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, pururuna, pururun, pururun, pururun, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Pururun (set 2)", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, puzzli, 0, puzzli, puzzli, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Puzzli (revision B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1995, puzzlia, puzzli, puzzlia, puzzli, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Puzzli (revision A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, daitorid, 0, daitorid, daitorid, metro_upd7810_state, empty_init, ROT0, "Metro", "Daitoride (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, pururun, 0, pururun, pururun, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Pururun (Japan set 1)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, pururuna, pururun, pururun, pururun, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Pururun (Japan set 2)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, puzzli, 0, puzzli, puzzli, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Puzzli (Japan revision B)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1995, puzzlia, puzzli, puzzlia, puzzli, metro_upd7810_state, empty_init, ROT0, "Metro / Banpresto", "Puzzli (Japan revision A)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1996, 3kokushi, 0, sankokushi,sankokushi, metro_upd7810_state, init_karatour, ROT0, "Mitchell", "Sankokushi (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
// ? with additional gfx data scramble (probably MTR5260 based)
-GAME( 1995, msgogo, 0, msgogo, msgogo, metro_state, init_balcube, ROT0, "Metro", "Mouse Shooter GoGo", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, daitorida, daitorid, daitoa, daitoa, metro_state, init_balcube, ROT0, "Metro", "Daitoride (YMF278B version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
-GAME( 1996, balcube, 0, balcube, balcube, metro_state, init_balcube, ROT0, "Metro", "Bal Cube", MACHINE_SUPPORTS_SAVE )
-GAME( 1996, bangball, 0, bangball, bangball, metro_state, init_balcube, ROT0, "Banpresto / Kunihiko Tashiro+Goodhouse", "Bang Bang Ball (v1.05)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, msgogo, 0, msgogo, msgogo, metro_state, init_balcube, ROT0, "Metro", "Mouse Shooter GoGo", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // Either English or Japanese
+GAME( 1996, daitorida, daitorid, daitoa, daitoa, metro_state, init_balcube, ROT0, "Metro", "Daitoride (Japan, YMF278B version)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
+GAME( 1996, balcube, 0, balcube, balcube, metro_state, init_balcube, ROT0, "Metro", "Bal Cube (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1996, bangball, 0, bangball, bangball, metro_state, init_balcube, ROT0, "Banpresto / Kunihiko Tashiro+Goodhouse", "Bang Bang Ball (v1.05)", MACHINE_SUPPORTS_SAVE ) // Either English or Japanese
GAME( 1999, batlbubl, bangball, batlbubl, batlbubl, metro_state, init_balcube, ROT0, "Banpresto (Limenko license?)", "Battle Bubble (v2.00)", MACHINE_SUPPORTS_SAVE ) // or bootleg?
// VG330 / VG340 / VG410
-GAME( 1995, dokyusei, 0, dokyusei, dokyusei, gakusai_state, empty_init, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei", MACHINE_SUPPORTS_SAVE )
-GAME( 1995, dokyusp, 0, dokyusp, gakusai, gakusai_state, empty_init, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei Special", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, dokyusei, 0, dokyusei, dokyusei, gakusai_state, empty_init, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei (Japan)", MACHINE_SUPPORTS_SAVE )
+GAME( 1995, dokyusp, 0, dokyusp, gakusai, gakusai_state, empty_init, ROT0, "Make Software / Elf / Media Trading", "Mahjong Doukyuusei Special (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1996, mouja, 0, mouja, mouja, mouja_state, empty_init, ROT0, "Etona", "Mouja (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1997, gakusai, 0, gakusai, gakusai, gakusai_state, empty_init, ROT0, "MakeSoft", "Mahjong Gakuensai (Japan, set 1)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1997, gakusaia, gakusai, gakusai, gakusai, gakusai_state, empty_init, ROT0, "MakeSoft", "Mahjong Gakuensai (Japan, set 2)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )