royalmah.cpp: removed aysnd tagmap lookups, partial move to configured banking, save state preparation (nw)

This commit is contained in:
Ivan Vangelista 2017-05-17 18:09:41 +02:00
parent 1934329b7e
commit 843dcdf32f

View File

@ -50,6 +50,7 @@ TODO:
- mjtensin: random crashes, interrupts related
- convert the remaining set_base calls to configured banking and enable save state support
Stephh's notes (based on the games Z80 code and some tests) :
@ -111,51 +112,43 @@ public:
royalmah_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this,"maincpu"),
m_ay(*this, "aysnd"),
m_videoram(*this, "videoram"),
m_audiocpu(*this, "audiocpu"),
m_rtc(*this, "rtc"),
m_soundlatch(*this, "soundlatch") { }
required_device<cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_videoram;
optional_device<cpu_device> m_audiocpu;
optional_device<msm6242_device> m_rtc;
optional_device<generic_latch_8_device> m_soundlatch;
uint8_t m_input_port_select;
uint8_t m_dsw_select;
uint8_t m_rombank;
int m_palette_base;
std::unique_ptr<uint8_t[]> m_janptr96_nvram;
uint8_t m_suzume_bank;
uint8_t m_gfx_adr_l;
uint8_t m_gfx_adr_m;
uint8_t m_gfx_adr_h;
uint32_t m_gfx_adr;
uint8_t m_gfxdata0;
uint8_t m_gfxdata1;
uint8_t m_jansou_colortable[16];
uint8_t m_mjifb_rom_enable;
uint8_t m_flip_screen;
DECLARE_READ8_MEMBER(player_1_port_r);
DECLARE_READ8_MEMBER(player_2_port_r);
DECLARE_WRITE8_MEMBER(input_port_select_w);
DECLARE_WRITE8_MEMBER(royalmah_palbank_w);
DECLARE_WRITE8_MEMBER(royalmah_rom_w);
DECLARE_WRITE8_MEMBER(tahjong_bank_w);
DECLARE_WRITE8_MEMBER(mjderngr_coin_w);
DECLARE_WRITE8_MEMBER(mjderngr_palbank_w);
DECLARE_WRITE8_MEMBER(input_port_select_w);
DECLARE_READ8_MEMBER(majs101b_dsw_r);
DECLARE_READ8_MEMBER(suzume_dsw_r);
DECLARE_WRITE8_MEMBER(suzume_bank_w);
DECLARE_WRITE8_MEMBER(mjapinky_bank_w);
DECLARE_WRITE8_MEMBER(mjapinky_palbank_w);
DECLARE_READ8_MEMBER(mjapinky_dsw_r);
DECLARE_WRITE8_MEMBER(tontonb_bank_w);
DECLARE_WRITE8_MEMBER(dynax_bank_w);
DECLARE_READ8_MEMBER(daisyari_dsw_r);
DECLARE_WRITE8_MEMBER(daisyari_bank_w);
DECLARE_READ8_MEMBER(mjclub_dsw_r);
DECLARE_WRITE8_MEMBER(mjclub_bank_w);
DECLARE_WRITE8_MEMBER(jansou_dsw_sel_w);
DECLARE_READ8_MEMBER(jansou_dsw_r);
DECLARE_WRITE8_MEMBER(jansou_colortable_w);
@ -166,6 +159,7 @@ public:
DECLARE_READ8_MEMBER(jansou_6404_r);
DECLARE_READ8_MEMBER(jansou_6405_r);
DECLARE_WRITE8_MEMBER(jansou_sound_w);
DECLARE_WRITE8_MEMBER(janptr96_dswsel_w);
DECLARE_READ8_MEMBER(janptr96_dswsel_r);
DECLARE_READ8_MEMBER(janptr96_dsw_r);
@ -173,6 +167,8 @@ public:
DECLARE_WRITE8_MEMBER(janptr96_rambank_w);
DECLARE_READ8_MEMBER(janptr96_unknown_r);
DECLARE_WRITE8_MEMBER(janptr96_coin_counter_w);
DECLARE_WRITE_LINE_MEMBER(janptr96_rtc_irq);
DECLARE_WRITE8_MEMBER(mjifb_coin_counter_w);
DECLARE_READ8_MEMBER(mjifb_rom_io_r);
DECLARE_WRITE8_MEMBER(mjifb_rom_io_w);
@ -185,17 +181,21 @@ public:
DECLARE_WRITE8_MEMBER(mjifb_p3_w);
DECLARE_WRITE8_MEMBER(mjifb_p4_w);
DECLARE_WRITE8_MEMBER(mjifb_p8_w);
DECLARE_READ8_MEMBER(mjdejavu_rom_io_r);
DECLARE_WRITE8_MEMBER(mjdejavu_rom_io_w);
DECLARE_READ8_MEMBER(mjtensin_p3_r);
DECLARE_WRITE8_MEMBER(mjtensin_p4_w);
DECLARE_WRITE8_MEMBER(mjtensin_6ff3_w);
DECLARE_WRITE8_MEMBER(cafetime_p4_w);
DECLARE_WRITE8_MEMBER(cafetime_p3_w);
DECLARE_WRITE8_MEMBER(cafetime_dsw_w);
DECLARE_READ8_MEMBER(cafetime_dsw_r);
DECLARE_READ8_MEMBER(cafetime_7fe4_r);
DECLARE_WRITE8_MEMBER(cafetime_7fe3_w);
DECLARE_WRITE8_MEMBER(mjvegasa_p4_w);
DECLARE_WRITE8_MEMBER(mjvegasa_p3_w);
DECLARE_WRITE8_MEMBER(mjvegasa_rombank_w);
@ -204,24 +204,72 @@ public:
DECLARE_WRITE8_MEMBER(mjvegasa_coin_counter_w);
DECLARE_WRITE8_MEMBER(mjvegasa_12400_w);
DECLARE_READ8_MEMBER(mjvegasa_12500_r);
DECLARE_READ8_MEMBER(royalmah_player_1_port_r);
DECLARE_READ8_MEMBER(royalmah_player_2_port_r);
DECLARE_WRITE_LINE_MEMBER(janptr96_rtc_irq);
DECLARE_WRITE_LINE_MEMBER(mjtensin_rtc_irq);
DECLARE_DRIVER_INIT(janptr96);
DECLARE_DRIVER_INIT(tahjong);
DECLARE_DRIVER_INIT(dynax);
DECLARE_DRIVER_INIT(jansou);
DECLARE_DRIVER_INIT(suzume);
DECLARE_DRIVER_INIT(ippatsu);
DECLARE_DRIVER_INIT(mjifb);
DECLARE_DRIVER_INIT(tontonb);
DECLARE_DRIVER_INIT(janptr96);
DECLARE_PALETTE_INIT(royalmah);
DECLARE_PALETTE_INIT(mjderngr);
uint32_t screen_update_royalmah(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(suzume_irq);
INTERRUPT_GEN_MEMBER(mjtensin_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(janptr96_interrupt);
protected:
virtual void machine_start() override;
private:
required_device<cpu_device> m_maincpu;
required_device<ay8910_device> m_ay;
required_shared_ptr<uint8_t> m_videoram;
optional_device<cpu_device> m_audiocpu;
optional_device<msm6242_device> m_rtc;
optional_device<generic_latch_8_device> m_soundlatch;
// used by most games
uint8_t m_input_port_select;
uint8_t m_dsw_select;
uint8_t m_rombank;
uint8_t m_palette_base;
uint8_t m_flip_screen;
// game specific
std::unique_ptr<uint8_t[]> m_janptr96_nvram;
uint8_t m_suzume_bank;
uint8_t m_gfx_adr_l;
uint8_t m_gfx_adr_m;
uint8_t m_gfx_adr_h;
uint32_t m_gfx_adr;
uint8_t m_gfxdata0;
uint8_t m_gfxdata1;
uint8_t m_jansou_colortable[16];
uint8_t m_mjifb_rom_enable;
void mjtensin_update_rombank();
void cafetime_update_rombank();
};
void royalmah_state::machine_start()
{
save_item(NAME(m_input_port_select));
save_item(NAME(m_dsw_select));
save_item(NAME(m_rombank));
save_item(NAME(m_palette_base));
save_item(NAME(m_flip_screen));
}
PALETTE_INIT_MEMBER(royalmah_state, royalmah)
{
@ -308,21 +356,15 @@ WRITE8_MEMBER(royalmah_state::mjderngr_palbank_w)
uint32_t royalmah_state::screen_update_royalmah(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint8_t *videoram = m_videoram;
offs_t offs;
for (offs = 0; offs < 0x4000; offs++)
for (offs_t offs = 0; offs < 0x4000; offs++)
{
int i;
uint8_t data1 = videoram[offs + 0x0000];
uint8_t data2 = videoram[offs + 0x4000];
uint8_t data1 = m_videoram[offs + 0x0000];
uint8_t data2 = m_videoram[offs + 0x4000];
uint8_t y = (m_flip_screen) ? 255 - (offs >> 6) : (offs >> 6);
uint8_t x = (m_flip_screen) ? 255 - (offs << 2) : (offs << 2);
for (i = 0; i < 4; i++)
for (int i = 0; i < 4; i++)
{
uint8_t pen = ((data2 >> 1) & 0x08) | ((data2 << 2) & 0x04) | ((data1 >> 3) & 0x02) | ((data1 >> 0) & 0x01);
@ -337,23 +379,12 @@ uint32_t royalmah_state::screen_update_royalmah(screen_device &screen, bitmap_in
return 0;
}
WRITE8_MEMBER(royalmah_state::royalmah_rom_w)
{
/* using this handler will avoid all the entries in the error log that are the result of
the RLD and RRD instructions this games uses to print text on the screen */
}
WRITE8_MEMBER(royalmah_state::input_port_select_w)
{
m_input_port_select = data;
}
READ8_MEMBER(royalmah_state::royalmah_player_1_port_r)
READ8_MEMBER(royalmah_state::player_1_port_r)
{
int ret = (ioport("KEY0")->read() & 0xc0) | 0x3f;
@ -366,7 +397,7 @@ READ8_MEMBER(royalmah_state::royalmah_player_1_port_r)
return ret;
}
READ8_MEMBER(royalmah_state::royalmah_player_2_port_r)
READ8_MEMBER(royalmah_state::player_2_port_r)
{
int ret = (ioport("KEY5")->read() & 0xc0) | 0x3f;
@ -414,40 +445,27 @@ READ8_MEMBER(royalmah_state::suzume_dsw_r)
WRITE8_MEMBER(royalmah_state::tahjong_bank_w)
{
uint8_t *rom = memregion("maincpu")->base();
int address;
logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
data &= 0x01;
address = 0x10000 + data * 0x4000;
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_entry(data & 0x01);
}
WRITE8_MEMBER(royalmah_state::suzume_bank_w)
{
uint8_t *rom = memregion("maincpu")->base();
int address;
m_suzume_bank = data;
logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
/* bits 6, 4 and 3 used for something input related? */
address = 0x10000 + (data & 0x07) * 0x8000;
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_entry(data & 0x07);
}
WRITE8_MEMBER(royalmah_state::mjapinky_bank_w)
{
uint8_t *ROM = memregion("maincpu")->base();
m_rombank = data;
membank("bank1")->set_base(ROM + 0x10000 + 0x8000 * data);
membank("mainbank")->set_entry(data & 0x0f);
}
WRITE8_MEMBER(royalmah_state::mjapinky_palbank_w)
@ -466,36 +484,22 @@ READ8_MEMBER(royalmah_state::mjapinky_dsw_r)
WRITE8_MEMBER(royalmah_state::tontonb_bank_w)
{
uint8_t *rom = memregion("maincpu")->base();
int address;
logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
if (data == 0) return; // tontonb fix?
data &= 0x0f;
address = 0x10000 + data * 0x8000;
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_entry(data & 0x0f);
}
/* bits 5 and 6 seem to affect which Dip Switch to read in 'majs101b' */
WRITE8_MEMBER(royalmah_state::dynax_bank_w)
{
uint8_t *rom = memregion("maincpu")->base();
int address;
//logerror("%04x: bank %02x\n",space.device().safe_pc(),data);
m_dsw_select = data & 0x60;
data &= 0x1f;
address = 0x10000 + data * 0x8000;
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_entry(data & 0x1f);
}
READ8_MEMBER(royalmah_state::daisyari_dsw_r)
@ -521,7 +525,7 @@ WRITE8_MEMBER(royalmah_state::daisyari_bank_w)
address = 0x10000 + ((data & 0x30)>>4) * 0x10000 + (data & 0x1) * 0x8000;
// printf("%08x %02x\n",address,data);
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_base(&rom[address]);
/* bit 1 used too but unknown purpose. */
}
@ -541,41 +545,33 @@ READ8_MEMBER(royalmah_state::mjclub_dsw_r)
WRITE8_MEMBER(royalmah_state::mjclub_bank_w)
{
uint8_t *rom = memregion("maincpu")->base();
int address;
m_dsw_select = data & 0xc0;
data &= 0x0f;
address = 0x10000 + data * 0x8000;
// printf("%08x\n",address);
membank("bank1")->set_base(&rom[address]);
membank("mainbank")->set_entry(data & 0x0f);
/* bit 5 used too but unknown purpose. */
}
static ADDRESS_MAP_START( royalmah_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_WRITE(royalmah_rom_w )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM
AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram")
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "bank1" ) // banked ROMs not present in royalmah
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "mainbank" ) // banked ROMs not present in royalmah
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( mjapinky_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_WRITE(royalmah_rom_w )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM
AM_RANGE( 0x7000, 0x77ff ) AM_RAM AM_SHARE("nvram")
AM_RANGE( 0x7800, 0x7fff ) AM_RAM
AM_RANGE( 0x8000, 0x8000 ) AM_READ(mjapinky_dsw_r )
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "bank1" )
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "mainbank" )
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
static ADDRESS_MAP_START( tahjong_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x0000, 0x3fff ) AM_ROM AM_WRITE(royalmah_rom_w )
AM_RANGE( 0x4000, 0x6fff ) AM_ROMBANK( "bank1" ) AM_WRITE(royalmah_rom_w )
AM_RANGE( 0x0000, 0x3fff ) AM_ROM
AM_RANGE( 0x4000, 0x6fff ) AM_ROMBANK("mainbank")
AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram")
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
@ -725,7 +721,7 @@ static ADDRESS_MAP_START( mjapinky_iomap, AS_IO, 8, royalmah_state )
ADDRESS_MAP_END
static ADDRESS_MAP_START( janoh_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM AM_WRITE(royalmah_rom_w )
AM_RANGE( 0x0000, 0x6fff ) AM_ROM
AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram")
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
@ -864,8 +860,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( janptr96_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x0000, 0x5fff ) AM_ROM
AM_RANGE( 0x6000, 0x6fff ) AM_RAMBANK("bank3") AM_SHARE("nvram") // nvram
AM_RANGE( 0x7000, 0x7fff ) AM_RAMBANK("bank2") // banked nvram
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK("bank1")
AM_RANGE( 0x7000, 0x7fff ) AM_RAMBANK("rambank") // banked nvram
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK("mainbank")
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
@ -893,13 +889,12 @@ READ8_MEMBER(royalmah_state::janptr96_dsw_r)
WRITE8_MEMBER(royalmah_state::janptr96_rombank_w)
{
uint8_t *ROM = memregion("maincpu")->base();
membank("bank1")->set_base(ROM + 0x10000 + 0x8000 * data);
membank("mainbank")->set_entry(data & 0x3f);
}
WRITE8_MEMBER(royalmah_state::janptr96_rambank_w)
{
membank("bank2")->set_base(m_janptr96_nvram.get() + 0x1000 + 0x1000 * data);
membank("rambank")->set_entry(data & 0x07);
}
READ8_MEMBER(royalmah_state::janptr96_unknown_r)
@ -953,7 +948,7 @@ READ8_MEMBER(royalmah_state::mjifb_rom_io_r)
{
case 0x8000: return ioport("DSW4")->read(); // dsw 4
case 0x8200: return ioport("DSW3")->read(); // dsw 3
case 0x9001: return machine().device<ay8910_device>("aysnd")->data_r(space, 0); // inputs
case 0x9001: return m_ay->data_r(space, 0); // inputs
case 0x9011: return ioport("SYSTEM")->read();
}
@ -963,10 +958,9 @@ READ8_MEMBER(royalmah_state::mjifb_rom_io_r)
WRITE8_MEMBER(royalmah_state::mjifb_rom_io_w)
{
uint8_t *videoram = m_videoram;
if (m_mjifb_rom_enable)
{
videoram[offset] = data;
m_videoram[offset] = data;
return;
}
@ -975,8 +969,8 @@ WRITE8_MEMBER(royalmah_state::mjifb_rom_io_w)
switch(offset)
{
case 0x8e00: m_palette_base = data & 0x1f; return;
case 0x9002: machine().device<ay8910_device>("aysnd")->data_w(space,0,data); return;
case 0x9003: machine().device<ay8910_device>("aysnd")->address_w(space,0,data); return;
case 0x9002: m_ay->data_w(space,0,data); return;
case 0x9003: m_ay->address_w(space,0,data); return;
case 0x9010:
mjifb_coin_counter_w(space,0,data);
return;
@ -991,8 +985,7 @@ WRITE8_MEMBER(royalmah_state::mjifb_rom_io_w)
WRITE8_MEMBER(royalmah_state::mjifb_videoram_w)
{
uint8_t *videoram = m_videoram;
videoram[offset + 0x4000] = data;
m_videoram[offset + 0x4000] = data;
}
static ADDRESS_MAP_START( mjifb_map, AS_PROGRAM, 8, royalmah_state )
@ -1062,7 +1055,7 @@ READ8_MEMBER(royalmah_state::mjdejavu_rom_io_r)
{
case 0x8000: return ioport("DSW2")->read(); // dsw 2
case 0x8001: return ioport("DSW1")->read(); // dsw 1
case 0x9001: return machine().device<ay8910_device>("aysnd")->data_r(space, 0); // inputs
case 0x9001: return m_ay->data_r(space, 0); // inputs
case 0x9011: return ioport("SYSTEM")->read();
}
@ -1072,10 +1065,9 @@ READ8_MEMBER(royalmah_state::mjdejavu_rom_io_r)
WRITE8_MEMBER(royalmah_state::mjdejavu_rom_io_w)
{
uint8_t *videoram = m_videoram;
if (m_mjifb_rom_enable)
{
videoram[offset] = data;
m_videoram[offset] = data;
return;
}
@ -1083,8 +1075,8 @@ WRITE8_MEMBER(royalmah_state::mjdejavu_rom_io_w)
switch(offset)
{
case 0x8802: m_palette_base = data & 0x1f; return;
case 0x9002: machine().device<ay8910_device>("aysnd")->data_w(space,0,data); return;
case 0x9003: machine().device<ay8910_device>("aysnd")->address_w(space,0,data); return;
case 0x9002: m_ay->data_w(space,0,data); return;
case 0x9003: m_ay->address_w(space,0,data); return;
case 0x9010: janptr96_coin_counter_w(space,0,data); return;
case 0x9011: input_port_select_w(space,0,data); return;
case 0x9013:
@ -1114,7 +1106,7 @@ READ8_MEMBER(royalmah_state::mjtensin_p3_r)
void royalmah_state::mjtensin_update_rombank()
{
membank("bank1")->set_base(memregion("maincpu")->base() + 0x10000 + m_rombank * 0x8000 );
membank("mainbank")->set_base(memregion("maincpu")->base() + 0x10000 + m_rombank * 0x8000 );
}
WRITE8_MEMBER(royalmah_state::mjtensin_p4_w)
{
@ -1139,7 +1131,7 @@ static ADDRESS_MAP_START( mjtensin_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x6ff1, 0x6ff1 ) AM_WRITE(mjderngr_palbank_w )
AM_RANGE( 0x6ff3, 0x6ff3 ) AM_WRITE(mjtensin_6ff3_w )
AM_RANGE( 0x7000, 0x7fff ) AM_RAM AM_SHARE("nvram")
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "bank1" )
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "mainbank" )
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
@ -1155,7 +1147,7 @@ ADDRESS_MAP_END
void royalmah_state::cafetime_update_rombank()
{
membank("bank1")->set_base(memregion("maincpu")->base() + 0x10000 + m_rombank * 0x8000 );
membank("mainbank")->set_base(memregion("maincpu")->base() + 0x10000 + m_rombank * 0x8000 );
}
WRITE8_MEMBER(royalmah_state::cafetime_p4_w)
{
@ -1209,7 +1201,7 @@ static ADDRESS_MAP_START( cafetime_map, AS_PROGRAM, 8, royalmah_state )
AM_RANGE( 0x7fe3, 0x7fe3 ) AM_WRITE(cafetime_7fe3_w )
AM_RANGE( 0x7fe4, 0x7fe4 ) AM_READ(cafetime_7fe4_r )
AM_RANGE( 0x7ff0, 0x7fff ) AM_DEVREADWRITE("rtc", msm6242_device, read, write)
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "bank1" )
AM_RANGE( 0x8000, 0xffff ) AM_ROMBANK( "mainbank" )
AM_RANGE( 0x8000, 0xffff ) AM_WRITEONLY AM_SHARE("videoram")
ADDRESS_MAP_END
@ -1255,10 +1247,9 @@ READ8_MEMBER(royalmah_state::mjvegasa_rom_io_r)
WRITE8_MEMBER(royalmah_state::mjvegasa_rom_io_w)
{
uint8_t *videoram = m_videoram;
if ((m_rombank & 0x70) != 0x70)
{
videoram[offset] = data;
m_videoram[offset] = data;
return;
}
@ -3368,8 +3359,8 @@ static MACHINE_CONFIG_START( royalmah )
MCFG_SPEAKER_STANDARD_MONO("speaker")
MCFG_SOUND_ADD("aysnd", AY8910, 18432000/12)
MCFG_AY8910_PORT_A_READ_CB(READ8(royalmah_state, royalmah_player_1_port_r))
MCFG_AY8910_PORT_B_READ_CB(READ8(royalmah_state, royalmah_player_2_port_r))
MCFG_AY8910_PORT_A_READ_CB(READ8(royalmah_state, player_1_port_r))
MCFG_AY8910_PORT_B_READ_CB(READ8(royalmah_state, player_2_port_r))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.33)
MACHINE_CONFIG_END
@ -4978,6 +4969,7 @@ ROM_START( jangtaku )
/*this is just a z80 Voice Player (and latches port I/O $00 with the main CPU)*/
ROM_REGION( 0x10000, "audiocpu", 0 )
ROM_LOAD( "1.a3", 0x00000, 0x8000, CRC(745162d3) SHA1(145269c60c87e772e6cbca40213d286ec05c9134) )
// THE Jantaku Voice Ver 1.0 (C) Copy Right 1986 DYNA Computer Service CO.,LTD. By Satoshi Kato
ROM_REGION( 0x0020, "proms", 0 )
ROM_LOAD( "82s123a.6k", 0x0000, 0x0020, CRC(e9598146) SHA1(619e7eb76cc3e882b5b3e55cdd23fe00b0a1fe45) )
@ -5002,16 +4994,57 @@ ROM_START( rkjanoh2 )
ROM_LOAD( "82s123", 0x000, 0x020, CRC(74a53e94) SHA1(ca9114bd9b2b07f5abe82616b41ae9fdb9537a4f) )
ROM_END
DRIVER_INIT_MEMBER(royalmah_state,ippatsu)
DRIVER_INIT_MEMBER(royalmah_state, tahjong)
{
membank("bank1")->set_base(memregion("maincpu")->base() + 0x8000 );
membank("mainbank")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000);
}
DRIVER_INIT_MEMBER(royalmah_state,janptr96)
DRIVER_INIT_MEMBER(royalmah_state, jansou)
{
save_item(NAME(m_gfx_adr_l));
save_item(NAME(m_gfx_adr_m));
save_item(NAME(m_gfx_adr_h));
save_item(NAME(m_gfx_adr));
save_item(NAME(m_gfxdata0));
save_item(NAME(m_gfxdata1));
save_item(NAME(m_jansou_colortable));
}
DRIVER_INIT_MEMBER(royalmah_state, dynax)
{
membank("mainbank")->configure_entries(0, 32, memregion("maincpu")->base() + 0x10000, 0x8000);
}
DRIVER_INIT_MEMBER(royalmah_state, ippatsu)
{
membank("mainbank")->set_base(memregion("maincpu")->base() + 0x8000 );
}
DRIVER_INIT_MEMBER(royalmah_state, suzume)
{
membank("mainbank")->configure_entries(0, 8, memregion("maincpu")->base() + 0x10000, 0x8000);
save_item(NAME(m_suzume_bank));
}
DRIVER_INIT_MEMBER(royalmah_state, mjifb)
{
save_item(NAME(m_mjifb_rom_enable));
}
DRIVER_INIT_MEMBER(royalmah_state, tontonb)
{
membank("mainbank")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x8000);
}
DRIVER_INIT_MEMBER(royalmah_state, janptr96)
{
membank("mainbank")->configure_entries(0, 64, memregion("maincpu")->base() + 0x10000, 0x8000);
m_janptr96_nvram = std::make_unique<uint8_t[]>(0x1000 * 9);
membank("bank3")->set_base(m_janptr96_nvram.get());
machine().device<nvram_device>("nvram")->set_base(m_janptr96_nvram.get(), 0x1000 * 9);
membank("rambank")->configure_entries(0, 8, m_janptr96_nvram.get() + 0x1000, 0x1000);
}
@ -5021,40 +5054,40 @@ GAME( 1981, royalmj, 0, royalmah, royalmah, royalmah_state, 0, R
GAME( 1981?, openmj, royalmj, royalmah, royalmah, royalmah_state, 0, ROT0, "Sapporo Mechanic", "Open Mahjong [BET] (Japan)", 0 )
GAME( 1982, royalmah, royalmj, royalmah, royalmah, royalmah_state, 0, ROT0, "bootleg", "Royal Mahjong (Falcon bootleg, v1.01)", 0 )
GAME( 1983, janyoup2, royalmj, ippatsu, janyoup2, royalmah_state, 0, ROT0, "Cosmo Denshi", "Janyou Part II (ver 7.03, July 1 1983)",0 )
GAME( 1985, tahjong, royalmj, tahjong, tahjong, royalmah_state, 0, ROT0, "Bally Pond / Nasco", "Tahjong Yakitori (ver. 2-1)", 0 ) // 1985 Jun. 17
GAME( 1985, tahjong, royalmj, tahjong, tahjong, royalmah_state, tahjong, ROT0, "Bally Pond / Nasco", "Tahjong Yakitori (ver. 2-1)", 0 ) // 1985 Jun. 17
GAME( 1981, janputer, 0, royalmah, royalmah, royalmah_state, 0, ROT0, "bootleg (Paradise Denshi Ltd. / Mes)", "New Double Bet Mahjong (bootleg of Royal Mahjong) [BET]", 0 ) // MT #05392
GAME( 1984, rkjanoh2, 0, royalmah, royalmah, royalmah_state, 0, ROT0, "SNK / Dyna", "Royal King Jang Oh 2 (v4.00 1984 Jun 10th)", MACHINE_NOT_WORKING )
GAME( 1984, janoh, 0, royalmah, royalmah, royalmah_state, 0, ROT0, "Toaplan", "Jan Oh (set 1)", MACHINE_NOT_WORKING )
GAME( 1984, janoha, janoh, janoh, royalmah, royalmah_state, 0, ROT0, "Toaplan", "Jan Oh (set 2)", MACHINE_NOT_WORKING ) // this one is complete?
GAME( 1985, jansou, 0, jansou, jansou, royalmah_state, 0, ROT0, "Dyna Computer", "Jansou (set 1)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND )
GAME( 1985, jansoua, jansou, jansou, jansou, royalmah_state, 0, ROT0, "Dyna Computer", "Jansou (V 1.1)", 0 )
GAME( 1986, jangtaku, 0, jansou, jansou, royalmah_state, 0, ROT0, "Dyna Computer", "Jang Taku (V 1.3)", 0 )
GAME( 1986, dondenmj, 0, dondenmj, majs101b, royalmah_state, 0, ROT0, "Dyna Electronics", "Don Den Mahjong [BET] (Japan)", 0 )
GAME( 1985, jansou, 0, jansou, jansou, royalmah_state, jansou, ROT0, "Dyna Computer", "Jansou (set 1)", MACHINE_NOT_WORKING|MACHINE_NO_SOUND )
GAME( 1985, jansoua, jansou, jansou, jansou, royalmah_state, jansou, ROT0, "Dyna Computer", "Jansou (V 1.1)", 0 )
GAME( 1986, jangtaku, 0, jansou, jansou, royalmah_state, jansou, ROT0, "Dyna Computer", "Jang Taku (V 1.3)", 0 )
GAME( 1986, dondenmj, 0, dondenmj, majs101b, royalmah_state, dynax, ROT0, "Dyna Electronics", "Don Den Mahjong [BET] (Japan)", 0 )
GAME( 1986, ippatsu, 0, ippatsu, ippatsu, royalmah_state, ippatsu, ROT0, "Public Software / Paradais", "Ippatsu Gyakuten [BET] (Japan)", 0 )
GAME( 1986, suzume, 0, suzume, suzume, royalmah_state, 0, ROT0, "Dyna Electronics", "Watashiha Suzumechan (Japan)", 0 )
GAME( 1986, suzume, 0, suzume, suzume, royalmah_state, suzume, ROT0, "Dyna Electronics", "Watashiha Suzumechan (Japan)", 0 )
GAME( 1986, mjsiyoub, 0, royalmah, royalmah, royalmah_state, 0, ROT0, "Visco", "Mahjong Shiyou (Japan)", MACHINE_NOT_WORKING )
GAME( 1986, mjsenka, 0, royalmah, royalmah, royalmah_state, 0, ROT0, "Visco", "Mahjong Senka (Japan)", MACHINE_NOT_WORKING )
GAME( 1986, mjyarou, 0, mjyarou, mjyarou, royalmah_state, 0, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 1)", MACHINE_IMPERFECT_GRAPHICS ) // girls aren't shown
GAME( 1986, mjyarou2, mjyarou, mjyarou, mjyarou, royalmah_state, 0, ROT0, "Visco / Video System", "Mahjong Yarou [BET] (Japan, set 2)", MACHINE_IMPERFECT_GRAPHICS ) // girls aren't shown
GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_state, 0, ROT0, "Xex", "Mahjong Club [BET] (Japan)", 0 )
GAME( 1987, mjdiplob, 0, mjdiplob, mjdiplob, royalmah_state, 0, ROT0, "Dynax", "Mahjong Diplomat [BET] (Japan)", 0 )
GAME( 1987, tontonb, 0, tontonb, tontonb, royalmah_state, 0, ROT0, "Dynax", "Tonton [BET] (Japan, set 1)", 0 )
GAME( 1987, makaijan, 0, makaijan, makaijan, royalmah_state, 0, ROT0, "Dynax", "Makaijan [BET] (Japan)", 0 )
GAME( 1988, majs101b, 0, majs101b, majs101b, royalmah_state, 0, ROT0, "Dynax", "Mahjong Studio 101 [BET] (Japan)", 0 )
GAME( 1988, mjapinky, 0, mjapinky, mjapinky, royalmah_state, 0, ROT0, "Dynax", "Almond Pinky [BET] (Japan)", 0 )
GAME( 1989, mjdejavu, 0, mjdejavu, mjdejavu, royalmah_state, 0, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu (Japan)", MACHINE_NOT_WORKING ) // MT #00964
GAME( 1989, mjdejav2, mjdejavu, mjdejavu, mjdejavu, royalmah_state, 0, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu 2 (Japan)", MACHINE_NOT_WORKING )
GAME( 1989, mjderngr, 0, mjderngr, mjderngr, royalmah_state, 0, ROT0, "Dynax", "Mahjong Derringer (Japan)", 0 )
GAME( 1986?, mjclub, 0, mjclub, mjclub, royalmah_state, tontonb, ROT0, "Xex", "Mahjong Club [BET] (Japan)", 0 )
GAME( 1987, mjdiplob, 0, mjdiplob, mjdiplob, royalmah_state, tontonb, ROT0, "Dynax", "Mahjong Diplomat [BET] (Japan)", 0 )
GAME( 1987, tontonb, 0, tontonb, tontonb, royalmah_state, tontonb, ROT0, "Dynax", "Tonton [BET] (Japan, set 1)", 0 )
GAME( 1987, makaijan, 0, makaijan, makaijan, royalmah_state, dynax, ROT0, "Dynax", "Makaijan [BET] (Japan)", 0 )
GAME( 1988, majs101b, 0, majs101b, majs101b, royalmah_state, dynax, ROT0, "Dynax", "Mahjong Studio 101 [BET] (Japan)", 0 )
GAME( 1988, mjapinky, 0, mjapinky, mjapinky, royalmah_state, tontonb, ROT0, "Dynax", "Almond Pinky [BET] (Japan)", 0 )
GAME( 1989, mjdejavu, 0, mjdejavu, mjdejavu, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu (Japan)", MACHINE_NOT_WORKING ) // MT #00964
GAME( 1989, mjdejav2, mjdejavu, mjdejavu, mjdejavu, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong Shinkirou Deja Vu 2 (Japan)", MACHINE_NOT_WORKING )
GAME( 1989, mjderngr, 0, mjderngr, mjderngr, royalmah_state, dynax, ROT0, "Dynax", "Mahjong Derringer (Japan)", 0 )
GAME( 1989, daisyari, 0, daisyari, daisyari, royalmah_state, 0, ROT0, "Best System", "Daisyarin [BET] (Japan)", 0 )
GAME( 1990, mjifb, 0, mjifb, mjifb, royalmah_state, 0, ROT0, "Dynax", "Mahjong If...? [BET]", 0 )
GAME( 1990, mjifb2, mjifb, mjifb, mjifb, royalmah_state, 0, ROT0, "Dynax", "Mahjong If...? [BET](2921)", 0 )
GAME( 1990, mjifb3, mjifb, mjifb, mjifb, royalmah_state, 0, ROT0, "Dynax", "Mahjong If...? [BET](2931)", 0 )
GAME( 1990, mjifb, 0, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong If...? [BET]", 0 )
GAME( 1990, mjifb2, mjifb, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong If...? [BET](2921)", 0 )
GAME( 1990, mjifb3, mjifb, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong If...? [BET](2931)", 0 )
GAME( 1991, mjvegasa, 0, mjvegasa, mjvegasa, royalmah_state, 0, ROT0, "Dynax", "Mahjong Vegas (Japan, unprotected)", 0 )
GAME( 1991, mjvegas, mjvegasa, mjvegasa, mjvegasa, royalmah_state, 0, ROT0, "Dynax", "Mahjong Vegas (Japan)", MACHINE_NOT_WORKING )
GAME( 1992, cafetime, 0, cafetime, cafetime, royalmah_state, 0, ROT0, "Dynax", "Mahjong Cafe Time", 0 )
GAME( 1993, cafedoll, 0, mjifb, mjifb, royalmah_state, 0, ROT0, "Dynax", "Mahjong Cafe Doll (Japan)", MACHINE_NOT_WORKING )
GAME( 1993, cafedoll, 0, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Dynax", "Mahjong Cafe Doll (Japan)", MACHINE_NOT_WORKING )
GAME( 1995, mjtensin, 0, mjtensin, mjtensin, royalmah_state, 0, ROT0, "Dynax", "Mahjong Tensinhai (Japan)", MACHINE_NOT_WORKING )
GAME( 1996, janptr96, 0, janptr96, janptr96, royalmah_state, janptr96, ROT0, "Dynax", "Janputer '96 (Japan)", 0 )
GAME( 1997, janptrsp, 0, janptr96, janptr96, royalmah_state, janptr96, ROT0, "Dynax", "Janputer Special (Japan)", 0 )
GAME( 1999, cafebrk, 0, mjifb, mjifb, royalmah_state, 0, ROT0, "Nakanihon / Dynax", "Mahjong Cafe Break", MACHINE_NOT_WORKING )
GAME( 1999, cafepara, 0, mjifb, mjifb, royalmah_state, 0, ROT0, "Techno-Top", "Mahjong Cafe Paradise", MACHINE_NOT_WORKING )
GAME( 1999, cafebrk, 0, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Nakanihon / Dynax", "Mahjong Cafe Break", MACHINE_NOT_WORKING )
GAME( 1999, cafepara, 0, mjifb, mjifb, royalmah_state, mjifb, ROT0, "Techno-Top", "Mahjong Cafe Paradise", MACHINE_NOT_WORKING )