// license:BSD-3-Clause
// copyright-holders:Luca Elia, Nicola Salmoria
/*********************************************************************************************************************

Some Dynax games using the second version of their blitter

driver by Luca Elia and Nicola Salmoria

CPU:    Z80 or TLCS90
Sound:  [AY] + [YM] + [YM] + [M5205] / M6295
VDP:    HD46505SP (6845) (CRT controller)
Custom: TC17G032AP-0246 (blitter)

---------------------------------------------------------------------------------------------------------------------
Year + Game                Main Board   Sub Board    CPU   Sound                      Clock Color Notes
---------------------------------------------------------------------------------------------------------------------
88 Jong Yu Ki              D1505178-A   D1505178-B   Z80*2 AY8912 YM2203        M5205       PROM? 2 x TC17G032AP-0246
88 Hana no Mai             D1610088L1                Z80   AY8912 YM2203        M5205       PROM
88 Hana Kochou             D201901L2    D201901L1-0  Z80   AY8912 YM2203        M5205       PROM
89 Hana Oriduru            D2304268L                 Z80   AY8912        YM2413 M5205       RAM
89 Dragon Punch            D24?                      Z80          YM2203                    PROM
89 Mj Friday               D2607198L1                Z80                 YM2413             PROM
89 Mj Gekisha              D2809218L-1  D2809218L-2  TLCS                YM2413             PROM  Battery
89 Sports Match            D31?                      Z80          YM2203                    PROM
90 Mj Gekisha Part 2       D2809218L-1  D2809218L-2  TLCS                YM2413             PROM  Battery
90 Jong Tou Ki             D1505178-A   D2711078L-B  Z80*2 AY8912 YM2203        M5205       PROM  2 x Blitter
90 Mj Campus Hunting       D3312108L1-1 D23SUB1      Z80   AY8912        YM2413 M5205       RAM
90 Hana Jingi              no number    D3312108L1-2 Z80   AY8912        YM2413 M5205       RAM
90 7jigen no Youseitachi   D3707198L1   D23SUB1      Z80   AY8912        YM2413 M5205       RAM
89 Mj Electromagnetic Base D3803248L1                Z80   AY8912        YM2413 M5205       RAM
90 Mj Electron Base                                  Z80   AY8912        YM2413             RAM
90 Mj X-Tal/Diamond 7      D4005208L1-1 D23SUB       Z80   AY8912        YM2413 M5205       RAM
90 Mj Neruton Haikujiradan D4005208L1-1 D4508308L-2  Z80   AY8912        YM2413 M5205       RAM
91 Mj Dial Q2              D5212298L-1               Z80                 YM2413             PROM
91 Mj Yarunara             D5512068L1-1 D4508308L-2  Z80   AY8912        YM2413 M5205 M6242 RAM   NL-001
91 Hana wo Yaraneba!       D5512068L1-1 D4508308L-2  Z80   AY8912        YM2413 M5205 M6242 RAM   NL-001, Battery
91 Warai no Hana Tenshi    D5512068L1-1 D6107068L-1  Z80   AY8912        YM2413 M5205 M6242 RAM   NL-001, Battery
91 Mj Angels               D5512068L1-1 D6107068L-1  Z80   AY8912        YM2413 M5205       RAM
91 Mj Comic Gekijou V.1    D5512068L1-1 D6107068L-1  Z80   AY8912        YM2413 M5205 M6242 RAM   NL-001, Battery
91 Mj Tenkaigen                                      TLCS  AY8910        YM2413       M6242 RAM   Protection, Battery
91 Mj Tokkyu Kaitenban P2  D5902258L-0               TLCS  AY8910        YM2413                   Various scratched off devices
91 Mj Ougon no Pai         D6209038L1-0              TLCS  AY8910        YM2413             RAM   Undumped TMP91P640 Code, Battery
92 Quiz TV Gassyuukoku     D5512068L1-2 D6410288L-1  Z80   AY8912        YM2413 M5205       RAM
92 Hanafuda Hana Tengoku   D6502208L1   D6107068L-1  Z80   AY8910        YM2413       M6242 RAM
94 Castle Of Dracula                                 Z80   M6295                            PROM  Blitter is an FPGA
94 Mj Reach                CS166P002                 TLCS  YM2149F       YM2413       M6242 PROM  Battery
94 Mj Reach (bootleg)      bootleg                   TLCS  AY8910        YM2413       M6242 PROM  Battery
94 Mj Reach Part II        D8810138L1                TLCS  YM2149F       YM2413       M6242 PROM  Battery
94 Maya                                              Z80          YM2203                    PROM  Blitter is an FPGA
9? Inca                                              Z80          YM2203                    PROM
---------------------------------------------------------------------------------------------------------------------

Notes:

- In some games (drgpunch,hanamai,hnoridur etc) there's a more complete service mode.
  To enter it, set the service mode dip switch and reset keeping start1 pressed.
  In hnkochou, keep F2 pressed and reset.

- sprtmtch and drgpunch are "clones", but the gfx are very different; sprtmtch
  is a trimmed down version, without all animations between levels.

- according to the readme, mjfriday should have a M5205. However the program ROMs don't
  seem to make accesses to it or contain ADPCM data for it, and photos of the game's
  PCB don't even show an unpopulated location for one. Note that gekisha and mjdialq2,
  which run on similar hardware, also lack 5205s. Likely it's a mistake in the readme.

TODO:

- Palette banking is not correct, see quiztvqq cross hatch test.

- Scrolling / wrap enable is not correct in hnoridur type hardware. See the dynax
  logo in neruton: it has to do with writes to c3/c4 and there are 2 additional
  scroll registers at 64/66.

- 7jigen: priority 0x30 is ok when used in the "gals check", but is wrong during
  attract mode, where the girl is hidden by the background. Another possible
  priority issue in attract mode is when the balls scroll over the devil.

- neruton / majxtal7: girls are behind the background in demo mode.

*********************************************************************************************************************/

#include "emu.h"
#include "dynax.h"

#include "hanafuda.h"
#include "mjdipsw.h"

#include "shared/mahjong.h"

#include "cpu/tlcs90/tlcs90.h"
#include "cpu/z80/z80.h"
#include "cpu/z80/tmpz84c015.h"
#include "machine/msm6242.h"
#include "machine/nvram.h"
#include "sound/ay8910.h"
#include "sound/ymopn.h"
#include "sound/ymopl.h"

#include "layout/generic.h"
#include "speaker.h"


/***************************************************************************


                                Interrupts


***************************************************************************/

/***************************************************************************
                                Sports Match
***************************************************************************/


/* It runs in IM 0, thus needs an opcode on the data bus */
void dynax_state::sprtmtch_blitter_irq_w(int state)
{
	if (state && m_blitter_irq_mask)
		m_mainirq->rst4_w(1);
}

void dynax_state::dynax_vblank_ack_w(uint8_t data)
{
	m_mainirq->rst2_w(0);
}

void dynax_state::blitter_ack_w(int state)
{
	m_blitter_irq_mask = state;
	if (!m_blitter_irq_mask)
		m_mainirq->rst4_w(0);
}

void dynax_state::sprtmtch_vblank_w(int state)
{
	if (state)
		m_mainirq->rst2_w(1);
}


/***************************************************************************
                            Jantouki - Main CPU
***************************************************************************/

/* It runs in IM 0, thus needs an opcode on the data bus */
void jantouki_state::jantouki_vblank_ack_w(uint8_t data)
{
	m_mainirq->rst4_w(0);
}

void jantouki_state::jantouki_blitter_irq_w(int state)
{
	if (state && m_blitter_irq_mask)
		m_mainirq->rst1_w(1);
}

void jantouki_state::jantouki_blitter_ack_w(int state)
{
	m_blitter_irq_mask = state;
	if (!m_blitter_irq_mask)
		m_mainirq->rst1_w(0);
}

void jantouki_state::jantouki_blitter2_irq_w(int state)
{
	if (state && m_blitter2_irq_mask)
		m_mainirq->rst2_w(1);
}

void jantouki_state::jantouki_blitter2_ack_w(int state)
{
	m_blitter2_irq_mask = state;
	if (!m_blitter2_irq_mask)
		m_mainirq->rst2_w(0);
}

void jantouki_state::jantouki_vblank_w(int state)
{
	if (state)
	{
		m_mainirq->rst4_w(1);
		m_soundirq->rst4_w(1);
	}
}


/***************************************************************************
                            Jantouki - Sound CPU
***************************************************************************/

void jantouki_state::jantouki_sound_vblank_ack_w(uint8_t data)
{
	m_soundirq->rst4_w(0);
}


/***************************************************************************


                                Memory Maps


***************************************************************************/

/***************************************************************************
                                Sports Match
***************************************************************************/

void dynax_state::coincounter_0_w(int state)
{
	machine().bookkeeping().coin_counter_w(0, state);
}

void dynax_state::coincounter_1_w(int state)
{
	machine().bookkeeping().coin_counter_w(1, state);
}

uint8_t dynax_state::ret_ff()
{
	return 0xff;
}


template <unsigned N>
uint8_t dynax_state::hanamai_keyboard_r()
{
	/* the game reads all rows at once (keyb = 0) to check if a key is pressed */
	int res = 0x3f;
	for (unsigned i = 0; 5 > i; ++i)
	{
		if (!BIT(m_keyb, i))
			res &= m_io_key[N][i]->read();
	}

	return res;
}

void dynax_state::hanamai_keyboard_w(uint8_t data)
{
	m_keyb = data;
}


void dynax_state::dynax_rombank_w(uint8_t data)
{
	membank("bank1")->set_entry(data & 0x0f);
}

void jantouki_state::jantouki_sound_rombank_w(uint8_t data)
{
	m_soundbank->set_entry(data);
}


void dynax_state::hnoridur_rombank_w(uint8_t data)
{
	m_bankdev->set_bank(data & 0x1f);
}


void dynax_adpcm_state::hnoridur_palette_lo_w(offs_t offset, uint8_t data)
{
	m_palette_ram[256 * m_palbank + offset + 16 * 256] = data;
	hnoridur_palette_update(offset);
}

void dynax_adpcm_state::hnoridur_palette_hi_w(offs_t offset, uint8_t data)
{
	m_palette_ram[256 * m_palbank + offset] = data;
	hnoridur_palette_update(offset);
}

void dynax_adpcm_state::hnoridur_palette_update(offs_t offset)
{
	int x = (m_palette_ram[256 * m_palbank + offset] << 8) + m_palette_ram[256 * m_palbank + offset + 16 * 256];
	/* The bits are in reverse order! */
	int r = bitswap<5>((x >>  0) & 0x1f, 0, 1, 2, 3, 4);
	int g = bitswap<5>((x >>  5) & 0x1f, 0, 1, 2, 3, 4);
	int b = bitswap<5>((x >> 10) & 0x1f, 0, 1, 2, 3, 4);
	m_palette->set_pen_color(256 * m_palbank + offset, pal5bit(r), pal5bit(g), pal5bit(b));
}

void dynax_state::nanajign_palette_lo_w(offs_t offset, uint8_t data)
{
	m_palette_ram[256 * m_palbank + offset + 16 * 256] = data;
	nanajign_palette_update(offset);
}

void dynax_state::nanajign_palette_hi_w(offs_t offset, uint8_t data)
{
	m_palette_ram[256 * m_palbank + offset] = data;
	nanajign_palette_update(offset);
}

void dynax_state::nanajign_palette_update(offs_t offset)
{
	int bg = m_palette_ram[256 * m_palbank + offset];
	int br = m_palette_ram[256 * m_palbank + offset + 16 * 256];
	int r = br & 0x1f;
	int g = bg & 0x1f;
	int b = ((bg & 0xc0) >> 3) | ((br & 0xe0) >> 5);
	m_palette->set_pen_color(256 * m_palbank + offset, pal5bit(r), pal5bit(g), pal5bit(b));
}


void dynax_adpcm_state::adpcm_int(int state)
{
	m_msm->data_w(m_msm5205next >> 4);
	m_msm5205next <<= 4;

	m_toggle = 1 - m_toggle;

	if (m_toggle)
	{
		if (m_resetkludge)   // don't know what's wrong, but NMIs when the 5205 is reset make the game crash
			m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
	}
}

void jantouki_state::adpcm_int_cpu1(int state)
{
	m_msm->data_w(m_msm5205next >> 4);
	m_msm5205next <<= 4;

	m_toggle_cpu1 = 1 - m_toggle_cpu1;
	if (m_toggle_cpu1)
	{
		if (m_resetkludge)   // don't know what's wrong, but NMIs when the 5205 is reset make the game crash
			m_soundcpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);  // cpu1
	}
}


void dynax_adpcm_state::adpcm_data_w(uint8_t data)
{
	m_msm5205next = data;
}

void dynax_adpcm_state::adpcm_reset_w(uint8_t data)
{
	m_resetkludge = data & 1;
	m_msm->reset_w(~data & 1);
}

void dynax_adpcm_state::adpcm_reset_kludge_w(int state)
{
	m_resetkludge = state;
}

void cdracula_state::cdracula_mem_map(address_map &map)
{
	map(0x0000, 0xbfff).rom();
	map(0xc000, 0xffff).ram();
}

void dynax_state::sprtmtch_mem_map(address_map &map)
{
	map(0x0000, 0x6fff).rom();
	map(0x7000, 0x7fff).ram().share("nvram");
	map(0x8000, 0xffff).bankr("bank1");
}

void dynax_adpcm_state::hnoridur_mem_map(address_map &map)
{
	map(0x0000, 0x6fff).rom();
	map(0x7000, 0x7fff).ram().share("nvram");
	map(0x8000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
}

void dynax_state::nanajign_mem_map(address_map &map)
{
	map(0x0000, 0x5fff).rom();
	map(0x6000, 0x6fff).ram();
	map(0x7000, 0x7fff).ram().share("nvram");
	map(0x8000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
}

void dynax_state::mjdialq2_mem_map(address_map &map)
{
	map(0x0000, 0x7fff).rom();
	map(0x0800, 0x0fff).ram();
	map(0x1000, 0x1fff).ram().share("nvram");
	map(0x8000, 0xffff).bankr("bank1");
}

//identical to yarunara, but nvram is in the 0x6000 - 0x6fff range
void dynax_adpcm_state::quiztvqq_mem_map(address_map &map)
{
	map(0x0000, 0x5fff).rom();
	map(0x6000, 0x6fff).ram().share("nvram");
	map(0x7000, 0x7fff).ram();
	map(0x8000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
}

void jantouki_state::jantouki_mem_map(address_map &map)
{
	map(0x0000, 0x5fff).rom();
	map(0x6000, 0x6fff).ram();
	map(0x7000, 0x7fff).ram().share("nvram");
	map(0x8000, 0xffff).bankr("bank1");
}

void jantouki_state::jantouki_sound_mem_map(address_map &map)
{
	map(0x0000, 0x77ff).rom();
	map(0x7800, 0x7fff).ram();
	map(0x8000, 0xffff).bankr(m_soundbank);
}



void dynax_adpcm_state::hnoridur_banked_map(address_map &map)
{
	map(0x00000, 0x7ffff).rom().region("maincpu", 0x10000);
	map(0x80000, 0x800ff).w(FUNC(dynax_adpcm_state::hnoridur_palette_lo_w));
	map(0xa0000, 0xa00ff).w(FUNC(dynax_adpcm_state::hnoridur_palette_hi_w));
	map(0xc0000, 0xc7fff).ram(); // hnoridur: R/W RAM
}

void dynax_state::mjelctrn_banked_map(address_map &map)
{
	map(0x00000, 0x3ffff).rom().region("maincpu", 0x10000);
	map(0x80000, 0x800ff).w(FUNC(dynax_state::nanajign_palette_lo_w));
	map(0xa0000, 0xa00ff).w(FUNC(dynax_state::nanajign_palette_hi_w));
}

void dynax_adpcm_state::nanajign_banked_map(address_map &map)
{
	map(0x00000, 0x7ffff).rom().region("maincpu", 0x10000);
	map(0x80000, 0x800ff).w(FUNC(dynax_adpcm_state::nanajign_palette_lo_w));
	map(0xa0000, 0xa00ff).w(FUNC(dynax_adpcm_state::nanajign_palette_hi_w));
}

void dynax_adpcm_state::yarunara_banked_map(address_map &map)
{
	map(0x00000, 0x3ffff).rom().region("maincpu", 0x10000);
	map(0x80000, 0x801ff).w(FUNC(dynax_adpcm_state::tenkai_palette_w));
	map(0xe0000, 0xe000f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write));
}

void dynax_adpcm_state::mjangels_banked_map(address_map &map)
{
	map(0x000000, 0x07ffff).rom().region("maincpu", 0x010000);
	map(0x080000, 0x0801ff).w(FUNC(dynax_adpcm_state::tenkai_palette_w));
	map(0x0a0000, 0x0bffff).rom().region("maincpu", 0x0b0000);
	map(0x0e0000, 0x0e000f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write));
	map(0x100000, 0x13ffff).rom().region("maincpu", 0x110000);
}



void dynax_adpcm_state::hanamai_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x00).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x41, 0x47).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0x50, 0x50).w(FUNC(dynax_adpcm_state::dynax_rombank_w));            // BANK ROM Select  hnkochou only
	map(0x60, 0x60).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<0>));      // P1
	map(0x61, 0x61).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<1>));      // P2
	map(0x62, 0x62).portr("COINS");                                         // Coins
	map(0x63, 0x63).r(FUNC(dynax_adpcm_state::ret_ff));                     // ?
	map(0x64, 0x64).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x65, 0x65).w(FUNC(dynax_adpcm_state::dynax_rombank_w));            // BANK ROM Select  hanamai only
	map(0x66, 0x66).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));         // VBlank IRQ Ack
	map(0x67, 0x67).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x68, 0x68).w(FUNC(dynax_adpcm_state::dynax_layer_enable_w));       // Layers Enable
	map(0x69, 0x69).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority
	map(0x6a, 0x6a).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0x6b, 0x6b).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x6c, 0x6c).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes (Low Bits)
	map(0x6d, 0x6d).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0x6e, 0x6e).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0x70, 0x77).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x78, 0x79).rw("ym2203", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); // 2 x DSW
	map(0x7a, 0x7b).w("aysnd", FUNC(ay8912_device::address_data_w));   // AY8912
//  map(0x7c, 0x7c).nopw();                              // CRT Controller
//  map(0x7d, 0x7d).nopw();                              //
	map(0x7e, 0x7e).w(FUNC(dynax_adpcm_state::dynax_blit_romregion_w));   // Blitter ROM bank
}


void dynax_adpcm_state::hnoridur_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x01, 0x07).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w)); // Blitter
//  map(0x10, 0x10).nopw();                                                // CRT Controller
//  map(0x11, 0x11).nopw();                                                // CRT Controller
	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));        // keyboard row select
	map(0x21, 0x21).portr("COINS");                                        // Coins
	map(0x22, 0x22).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<1>));     // P2
	map(0x23, 0x23).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<0>));     // P1
	map(0x24, 0x24).portr("DSW1");                                         // DSW2
	map(0x25, 0x25).portr("DSW3");                                         // DSW4
	map(0x26, 0x26).portr("DSW2");                                         // DSW3
	map(0x30, 0x30).w(FUNC(dynax_adpcm_state::adpcm_reset_w));             // MSM5205 reset
	map(0x32, 0x32).w(FUNC(dynax_adpcm_state::adpcm_data_w));              // MSM5205 data
	map(0x34, 0x35).w("ym2413", FUNC(ym2413_device::write));               //
	map(0x36, 0x36).r("aysnd", FUNC(ay8912_device::data_r));               // AY8912, DSW0
	map(0x38, 0x38).w("aysnd", FUNC(ay8912_device::data_w));               // AY8912
	map(0x3a, 0x3a).w("aysnd", FUNC(ay8912_device::address_w));            //
	map(0x40, 0x40).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));  // Destination Pen
	map(0x41, 0x41).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));         // Destination Layer
	map(0x42, 0x42).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));    // Layers Palettes
	map(0x43, 0x43).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));    //
	map(0x44, 0x44).w(FUNC(dynax_adpcm_state::hanamai_priority_w));        // layer priority and enable
	map(0x45, 0x45).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));      // Background Color
	map(0x46, 0x46).w(FUNC(dynax_adpcm_state::dynax_blit_romregion_w));    // Blitter ROM bank
	map(0x47, 0x47).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));
	map(0x50, 0x50).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));     // screen scroll X
	map(0x51, 0x51).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));     // screen scroll Y
	map(0x54, 0x54).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));        // BANK ROM Select
	map(0x55, 0x55).nopw();                                                // ? VBlank IRQ Ack
	map(0x56, 0x56).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));        // VBlank IRQ Ack
	map(0x57, 0x57).r(FUNC(dynax_adpcm_state::ret_ff));                    // ?
	map(0x60, 0x67).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x70, 0x77).w("outlatch", FUNC(ls259_device::write_d0));
}

/***************************************************************************
                                Hana Jingi
***************************************************************************/

void dynax_adpcm_state::hjingi_lockout_w(int state)
{
	machine().bookkeeping().coin_lockout_w(0, !state);
}

uint8_t dynax_state::hjingi_keyboard_0_r()
{
	return hanamai_keyboard_r<0>() | (m_hopper->line_r() ? 0 : (1 << 6));
}

uint8_t dynax_adpcm_state::hjingi_keyboard_1_r()
{
	return hanamai_keyboard_r<1>() | m_bet->read();
}

void dynax_adpcm_state::hjingi_mem_map(address_map &map)
{
	map(0x0000, 0x01ff).rom();
	map(0x0200, 0x1fff).ram().share("nvram");
	map(0x2000, 0x7fff).rom();
	map(0x8000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
	map(0x8000, 0xffff).bankr("bank1");
}

void dynax_adpcm_state::hjingi_banked_map(address_map &map)
{
	map(0x80000, 0x800ff).w(FUNC(dynax_adpcm_state::hnoridur_palette_lo_w));
	map(0xa0000, 0xa00ff).w(FUNC(dynax_adpcm_state::hnoridur_palette_hi_w));
}

void dynax_adpcm_state::hjingi_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x01, 0x07).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter

//  map(0x10, 0x10).nopw();                                                 // CRT Controller
//  map(0x11, 0x11).nopw();                                                 // CRT Controller

	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x21, 0x21).portr("COINS");                                         // Coins
	map(0x22, 0x22).r(FUNC(dynax_adpcm_state::hjingi_keyboard_1_r));        // P2 + Hopper
	map(0x23, 0x23).r(FUNC(dynax_adpcm_state::hjingi_keyboard_0_r));        // P1 + Hopper
	map(0x24, 0x24).portr("DSW1");                                          // DSW1
	map(0x25, 0x25).portr("DSW3");                                          // DSW3
	map(0x26, 0x26).portr("DSW2");                                          // DSW2

	map(0x30, 0x30).w(FUNC(dynax_adpcm_state::adpcm_reset_w));              // MSM5205 reset
	map(0x32, 0x32).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x34, 0x35).w("ym2413", FUNC(ym2413_device::write));                //

	map(0x36, 0x36).r("aysnd", FUNC(ay8912_device::data_r));                // AY8912, DSW0
	map(0x38, 0x38).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x3a, 0x3a).w("aysnd", FUNC(ay8912_device::address_w));             //

	map(0x40, 0x40).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x41, 0x41).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0x42, 0x42).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0x43, 0x43).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0x44, 0x44).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority and enable
	map(0x45, 0x45).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0x46, 0x46).w(FUNC(dynax_adpcm_state::dynax_blit_romregion_w));     // Blitter ROM bank
	map(0x47, 0x47).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));

	map(0x50, 0x50).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x51, 0x51).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y

	map(0x54, 0x54).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));         // palette bank select

	map(0x56, 0x56).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));         // VBlank IRQ Ack
	map(0x57, 0x57).r(FUNC(dynax_adpcm_state::ret_ff));                     // Blitter Busy

	map(0x60, 0x67).w(m_mainlatch, FUNC(ls259_device::write_d0));           // Flip screen, layer half select, etc.

	map(0x70, 0x77).w("outlatch", FUNC(ls259_device::write_d0));            // Coin Counters, Hopper, Coin Lockout

	map(0x80, 0x80).w(FUNC(dynax_adpcm_state::dynax_rombank_w));            // BANK ROM Select
}


/***************************************************************************
                    Yarunara / Quiz TV Q&Q / Mahjong Angels
***************************************************************************/

void dynax_adpcm_state::yarunara_input_w(offs_t offset, uint8_t data)
{
	switch (offset)
	{
		case 0:
			m_input_sel = data;
			m_keyb = 0;
			break;

		case 1:
			break;
	}

}

uint8_t dynax_adpcm_state::yarunara_input_r(offs_t offset)
{
	uint8_t result = 0xff;
	switch (offset)
	{
	case 0:
		switch (m_input_sel)
		{
		case 0x00:
			result = m_coins->read(); // coins
			break;

		case 0x02:
			result = 0xff;    // bit 7 must be 1. Bit 2?
			break;

		default:
			result = 0xff;
		}
		break;

	case 1:
		switch (m_input_sel)
		{
		// player 2
		case 0x01:  //quiztvqq
		case 0x81:
		// player 1
		case 0x02:  //quiztvqq
		case 0x82:
			if (m_keyb < 5)
			{
				result = m_io_key[BIT(m_input_sel, 0)][m_keyb]->read();
				if (!machine().side_effects_disabled())
					++m_keyb;
			}
			break;

		default:
			result = 0xff;
		}
		break;
	}
	return result;
}

void dynax_adpcm_state::yarunara_rombank_w(uint8_t data)
{
	m_bankdev->set_bank(data & 0x3f);
}

void dynax_state::yarunara_blit_romregion_w(uint8_t data)
{
	logerror("%s: unmapped romregion=%02X\n", machine().describe_context(), data);
	switch(data)
	{
		case 0x00:  dynax_blit_romregion_w(0);    return;
		case 0x01:  dynax_blit_romregion_w(1);    return;
		case 0x80:  dynax_blit_romregion_w(2);    return;
		case 0x81:  dynax_blit_romregion_w(3);    return;
		case 0x82:  dynax_blit_romregion_w(4);    return; // mjcomv1
	}
}

void dynax_adpcm_state::yarunara_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x01).w(FUNC(dynax_adpcm_state::yarunara_input_w));           // Controls
	map(0x02, 0x03).r(FUNC(dynax_adpcm_state::yarunara_input_r));           //
	map(0x11, 0x17).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::adpcm_reset_w));              // MSM5205 reset
	map(0x22, 0x22).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x24, 0x25).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x28, 0x28).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x2a, 0x2a).w("aysnd", FUNC(ay8912_device::address_w));             //
	map(0x48, 0x48).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x49, 0x49).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x4a, 0x4a).w(FUNC(dynax_adpcm_state::yarunara_rombank_w));         // BANK ROM Select
	map(0x4b, 0x4b).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));         // VBlank IRQ Ack
	map(0x4c, 0x4c).portr("DSW0");                                          // DSW 1
	map(0x4f, 0x4f).portr("DSW1");                                          // DSW 2
	map(0x50, 0x57).w(m_mainlatch, FUNC(ls259_device::write_d1));
	map(0x68, 0x68).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x69, 0x69).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0x6a, 0x6a).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0x6b, 0x6b).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0x6c, 0x6c).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority and enable
	map(0x6d, 0x6d).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0x6e, 0x6e).w(FUNC(dynax_adpcm_state::yarunara_blit_romregion_w));  // Blitter ROM bank
}


// Almost identical to hnoridur
void dynax_adpcm_state::mcnpshnt_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x01, 0x07).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
//  map(0x10, 0x10).nopw();                                                 // CRT Controller
//  map(0x11, 0x11).nopw();                                                 // CRT Controller
	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x21, 0x21).portr("COINS");                                         // Coins
	map(0x22, 0x22).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<1>));      // P2
	map(0x23, 0x23).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<0>));      // P1
	map(0x24, 0x24).portr("DSW0");                                          // DSW2
	map(0x26, 0x26).portr("DSW1");                                          // DSW3
	map(0x30, 0x30).w(FUNC(dynax_adpcm_state::adpcm_reset_w));              // MSM5205 reset
	map(0x32, 0x32).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x34, 0x35).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x38, 0x38).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x3a, 0x3a).w("aysnd", FUNC(ay8912_device::address_w));             //
	map(0x40, 0x40).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x41, 0x41).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0x42, 0x42).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0x43, 0x43).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0x44, 0x44).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority and enable
	map(0x45, 0x45).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0x46, 0x46).w(FUNC(dynax_adpcm_state::yarunara_blit_romregion_w));  // Blitter ROM bank
	map(0x47, 0x47).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));
	map(0x50, 0x50).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x51, 0x51).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x54, 0x54).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));         // BANK ROM Select
	map(0x56, 0x56).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));         // VBlank IRQ Ack
	map(0x57, 0x57).r(FUNC(dynax_adpcm_state::ret_ff));                     // ?
	map(0x60, 0x67).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x70, 0x77).w("outlatch", FUNC(ls259_device::write_d0));
}


void dynax_state::sprtmtch_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x01, 0x07).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));       // Blitter
	map(0x10, 0x11).rw("ym2203", FUNC(ym2203_device::read), FUNC(ym2203_device::write));  // 2 x DSW
//  map(0x12, 0x12).nopw();   // CRT Controller
//  map(0x13, 0x13).nopw();   // CRT Controller
	map(0x20, 0x20).portr("P1");               // P1
	map(0x21, 0x21).portr("P2");               // P2
	map(0x22, 0x22).portr("COINS");            // Coins
	map(0x23, 0x23).r(FUNC(dynax_state::ret_ff));              // ?
	map(0x30, 0x30).w(FUNC(dynax_state::dynax_layer_enable_w));       // Layers Enable
	map(0x31, 0x31).w(FUNC(dynax_state::dynax_rombank_w));        // BANK ROM Select
	map(0x32, 0x32).w(FUNC(dynax_state::dynax_blit_dest_w));      // Destination Layer
	map(0x33, 0x33).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));       // Destination Pen
	map(0x34, 0x34).w(FUNC(dynax_state::dynax_blit_palette01_w)); // Layers Palettes (Low Bits)
	map(0x35, 0x35).w(FUNC(dynax_state::dynax_blit_palette23_w)); //
	map(0x36, 0x36).w(FUNC(dynax_state::dynax_blit_backpen_w));       // Background Color
	map(0x37, 0x37).w(FUNC(dynax_state::dynax_vblank_ack_w));     // VBlank IRQ Ack
	map(0x40, 0x47).w(m_mainlatch, FUNC(ls259_device::write_d0));
}



void dynax_state::mjfriday_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x00).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x01, 0x01).w(FUNC(dynax_state::dynax_blit_palette01_w));           // Layers Palettes (Low Bits)
	map(0x02, 0x02).w(FUNC(dynax_state::dynax_rombank_w));                  // BANK ROM Select
	map(0x03, 0x03).w(FUNC(dynax_state::dynax_blit_backpen_w));             // Background Color
	map(0x10, 0x17).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x41, 0x47).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
//  map(0x50, 0x50).nopw();                                                 // CRT Controller
//  map(0x51, 0x51).nopw();                                                 // CRT Controller
	map(0x60, 0x60).w(FUNC(dynax_state::hanamai_keyboard_w));               // keyboard row select
	map(0x61, 0x61).portr("COINS");                                         // Coins
	map(0x62, 0x62).r(FUNC(dynax_state::hanamai_keyboard_r<1>));            // P2
	map(0x63, 0x63).r(FUNC(dynax_state::hanamai_keyboard_r<0>));            // P1
	map(0x64, 0x64).portr("DSW0");                                          // DSW
	map(0x67, 0x67).portr("DSW1");                                          // DSW
	map(0x70, 0x71).w("ym2413", FUNC(ym2413_device::write));                //
//  map(0x80, 0x80).nopw();                                                 // IRQ ack?
}


void dynax_adpcm_state::nanajign_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x00).w(FUNC(dynax_adpcm_state::adpcm_reset_w));              // MSM5205 reset
	map(0x02, 0x02).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x04, 0x05).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x08, 0x08).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x0a, 0x0a).w("aysnd", FUNC(ay8912_device::address_w));             //
	map(0x10, 0x10).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x11, 0x11).portr("COINS");                                         // Coins
	map(0x12, 0x12).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<1>));      // P2
	map(0x13, 0x13).r(FUNC(dynax_adpcm_state::hanamai_keyboard_r<0>));      // P1
	map(0x14, 0x14).portr("DSW0");                                          // DSW1
	map(0x15, 0x15).portr("DSW1");                                          // DSW2
	map(0x16, 0x16).portr("DSW2");                                          // DSW3
//  map(0x20, 0x21).nopw();                                                 // CRT Controller
	map(0x31, 0x37).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0x40, 0x47).w("outlatch", FUNC(ls259_device::write_d0));            // Coin Counter
	map(0x50, 0x57).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x60, 0x60).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x62, 0x62).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x6a, 0x6a).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));         // BANK ROM Select
	map(0x6c, 0x6c).w(FUNC(dynax_adpcm_state::dynax_vblank_ack_w));         // VBlank IRQ Ack
	map(0x70, 0x70).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x71, 0x71).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0x72, 0x72).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0x73, 0x73).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0x74, 0x74).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority and enable
	map(0x75, 0x75).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0x76, 0x76).w(FUNC(dynax_adpcm_state::yarunara_blit_romregion_w));  // Blitter ROM bank
	map(0x77, 0x77).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));
}


/***************************************************************************
                            Jantouki - Main CPU
***************************************************************************/

uint8_t jantouki_state::jantouki_soundlatch_ack_r()
{
	if (!machine().side_effects_disabled())
		machine().scheduler().synchronize();
	return m_soundlatch->pending_r() ? 0x80 : 0;
}

uint8_t jantouki_state::jantouki_blitter_busy_r()
{
	return 0;   // bit 0 & 1
}

void jantouki_state::jantouki_rombank_w(uint8_t data)
{
	membank("bank1")->set_entry(data & 0x0f);
	m_led = BIT(data, 4);  // maybe
}

void jantouki_state::jantouki_io_map(address_map &map)
{
	map.global_mask(0xff);
//  map(0x40, 0x41).nopw();                                                 // CRT Controller
	map(0x48, 0x48).w(FUNC(jantouki_state::jantouki_rombank_w));            // BANK ROM Select
	map(0x49, 0x49).w(m_soundlatch, FUNC(generic_latch_8_device::write));   // To Sound CPU
	map(0x4a, 0x4a).r(FUNC(jantouki_state::jantouki_soundlatch_ack_r));     // Soundlatch status
	map(0x4b, 0x4b).w(FUNC(jantouki_state::dynax_blit2_dest_w));            // Destination Layer 2
	map(0x4d, 0x4d).w(FUNC(jantouki_state::dynax_blit_dest_w));             // Destination Layer
	map(0x4f, 0x4f).w(FUNC(jantouki_state::dynax_blit2_romregion_w));       // Blitter 2 ROM bank
	map(0x50, 0x50).w(FUNC(jantouki_state::jantouki_vblank_ack_w));         // VBlank IRQ Ack
	map(0x51, 0x51).w(FUNC(jantouki_state::hanamai_keyboard_w));            // keyboard row select
	map(0x52, 0x52).r(FUNC(jantouki_state::hanamai_keyboard_r<0>));         // P1
	map(0x54, 0x54).portr("COINS");                                         // Coins
	map(0x55, 0x55).portr("DSW0");                                          // DSW1
	map(0x56, 0x56).portr("DSW1");                                          // DSW2
	map(0x58, 0x5f).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x60, 0x60).w(FUNC(jantouki_state::dynax_blit_palette67_w));        // Layers Palettes (Low Bits)
	map(0x61, 0x61).w(FUNC(jantouki_state::dynax_blit_palette45_w));        //
	map(0x62, 0x62).w(FUNC(jantouki_state::dynax_blit_palette23_w));        //
	map(0x63, 0x63).w(FUNC(jantouki_state::dynax_blit_palette01_w));        //
	map(0x64, 0x64).w(FUNC(jantouki_state::dynax_blit_backpen_w));          // Background Color
	map(0x65, 0x65).w(m_blitter2, FUNC(dynax_blitter_rev2_device::pen_w));  // Destination Pen 2
	map(0x66, 0x66).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0x67, 0x67).r(FUNC(jantouki_state::jantouki_blitter_busy_r));       //
	map(0x69, 0x6f).w(m_blitter2, FUNC(dynax_blitter_rev2_device::regs_w)); // Blitter 2
	map(0x71, 0x77).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0x78, 0x7e).w(FUNC(jantouki_state::jantouki_layer_enable_w));       // Layers Enable
}

/***************************************************************************
                            Jantouki - Sound CPU
***************************************************************************/

uint8_t jantouki_state::jantouki_soundlatch_status_r()
{
	return m_soundlatch->pending_r() ? 0 : 0x80;
}

void jantouki_state::jantouki_sound_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x00).w(FUNC(jantouki_state::jantouki_sound_rombank_w));       // BANK ROM Select
	map(0x10, 0x10).w(FUNC(jantouki_state::jantouki_sound_vblank_ack_w));    // VBlank IRQ Ack
	map(0x21, 0x21).r("aysnd", FUNC(ay8912_device::data_r));         // AY8912
	map(0x22, 0x23).w("aysnd", FUNC(ay8912_device::data_address_w));   //
	map(0x28, 0x29).rw("ym2203", FUNC(ym2203_device::read), FUNC(ym2203_device::write)); //
	map(0x30, 0x30).w(FUNC(jantouki_state::adpcm_reset_w));      // MSM5205 reset
	map(0x40, 0x40).w(FUNC(jantouki_state::adpcm_data_w));               // MSM5205 data
	map(0x50, 0x50).r(FUNC(jantouki_state::jantouki_soundlatch_status_r));    // Soundlatch status
	map(0x60, 0x60).w(m_soundlatch, FUNC(generic_latch_8_device::acknowledge_w));
	map(0x70, 0x70).r(m_soundlatch, FUNC(generic_latch_8_device::read)); // From Main CPU
}



/***************************************************************************
                            Mahjong Electron Base
***************************************************************************/

uint8_t dynax_state::mjelctrn_keyboard_1_r()
{
	return (hanamai_keyboard_r<1>() & 0x3f) | (m_io_fake->read() ? 0x40 : 0);
}

uint8_t dynax_state::mjelctrn_dsw_r()
{
	int const dsw = (m_keyb & 0xc0) >> 6;

	return m_dsw[dsw]->read();
}

void dynax_adpcm_state::mjelctrn_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x00, 0x00).w(FUNC(dynax_adpcm_state::adpcm_reset_w));              // MSM5205 reset
	map(0x02, 0x02).w(FUNC(dynax_adpcm_state::adpcm_data_w));               // MSM5205 data
	map(0x04, 0x05).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x08, 0x08).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x0a, 0x0a).w("aysnd", FUNC(ay8912_device::address_w));             //
//  map(0x20, 0x20).nopw();                                                 // CRT Controller
//  map(0x21, 0x21).nopw();                                                 // CRT Controller
	map(0x40, 0x47).w("outlatch", FUNC(ls259_device::write_d0));
	map(0x60, 0x60).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x62, 0x62).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
//  map(0x64, 0x64).w(FUNC(dynax_adpcm_state::dynax_extra_scrollx_w));      // screen scroll X
//  map(0x66, 0x66).w(FUNC(dynax_adpcm_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x6a, 0x6a).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));         // BANK ROM Select
	map(0x80, 0x80).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x81, 0x81).portr("COINS");                                         // Coins
	map(0x82, 0x82).r(FUNC(dynax_adpcm_state::mjelctrn_keyboard_1_r));      // P2
	map(0x83, 0x83).r(FUNC(dynax_adpcm_state::hjingi_keyboard_0_r));        // P1
	map(0x84, 0x84).r(FUNC(dynax_adpcm_state::mjelctrn_dsw_r));             // DSW8 x 4
	map(0x85, 0x85).portr("SW1");                                           // DSW2
	map(0xa1, 0xa7).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0xc0, 0xc7).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0xe0, 0xe0).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0xe1, 0xe1).w(FUNC(dynax_adpcm_state::dynax_blit_dest_w));          // Destination Layer
	map(0xe2, 0xe2).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0xe3, 0xe3).w(FUNC(dynax_adpcm_state::dynax_blit_palette23_w));     //
	map(0xe4, 0xe4).w(FUNC(dynax_adpcm_state::hanamai_priority_w));         // layer priority and enable
	map(0xe5, 0xe5).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0xe6, 0xe6).w(FUNC(dynax_adpcm_state::yarunara_blit_romregion_w));  // Blitter ROM bank
	map(0xe7, 0xe7).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));
}

void dynax_state::qyjdzjp_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x04, 0x05).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x08, 0x08).w("aysnd", FUNC(ay8912_device::data_w));                // AY8912
	map(0x0a, 0x0a).w("aysnd", FUNC(ay8912_device::address_w));             //
	map(0x0c, 0x0c).w("oki", FUNC(okim6295_device::write));                 //
//  map(0x20, 0x20).nopw();                                                 // CRT Controller
//  map(0x21, 0x21).nopw();                                                 // CRT Controller
	map(0x40, 0x47).w("outlatch", FUNC(ls259_device::write_d0));
	map(0x60, 0x60).w(FUNC(dynax_state::dynax_extra_scrollx_w));      // screen scroll X
	map(0x62, 0x62).w(FUNC(dynax_state::dynax_extra_scrolly_w));      // screen scroll Y
//  map(0x64, 0x64).w(FUNC(dynax_state::dynax_extra_scrollx_w));      // screen scroll X
//  map(0x66, 0x66).w(FUNC(dynax_state::dynax_extra_scrolly_w));      // screen scroll Y
	map(0x6a, 0x6a).w(FUNC(dynax_state::hnoridur_rombank_w));         // BANK ROM Select
	map(0x80, 0x80).w(FUNC(dynax_state::hanamai_keyboard_w));         // keyboard row select
	map(0x81, 0x81).portr("COINS");                                         // Coins
	map(0x82, 0x82).r(FUNC(dynax_state::mjelctrn_keyboard_1_r));      // P2
	map(0x83, 0x83).r(FUNC(dynax_state::hjingi_keyboard_0_r));        // P1
	map(0x84, 0x84).r(FUNC(dynax_state::mjelctrn_dsw_r));             // DSW8 x 4
	map(0x85, 0x85).portr("SW1");                                           // DSW2
	map(0xa1, 0xa7).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0xc0, 0xc7).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0xe0, 0xe0).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0xe1, 0xe1).w(FUNC(dynax_state::dynax_blit_dest_w));          // Destination Layer
	map(0xe2, 0xe2).w(FUNC(dynax_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0xe3, 0xe3).w(FUNC(dynax_state::dynax_blit_palette23_w));     //
	map(0xe4, 0xe4).w(FUNC(dynax_state::hanamai_priority_w));         // layer priority and enable
	map(0xe5, 0xe5).w(FUNC(dynax_state::dynax_blit_backpen_w));       // Background Color
	map(0xe6, 0xe6).w(FUNC(dynax_state::yarunara_blit_romregion_w));  // Blitter ROM bank
	map(0xe7, 0xe7).w(FUNC(dynax_state::hnoridur_palbank_w));
}

void dynax_state::baoqingt_io_map(address_map &map)
{
	qyjdzjp_io_map(map);

	map(0x82, 0x82).lr8(NAME([] () -> uint8_t { return 0x80; })); // blitter busy line?
}

void dynax_adpcm_state::mjembase_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x04, 0x05).w("ym2413", FUNC(ym2413_device::write));                //
	map(0x06, 0x06).r("aysnd", FUNC(ay8912_device::data_r));                // AY8912, dsw0
	map(0x08, 0x08).w("aysnd", FUNC(ay8912_device::data_w));                //
	map(0x0a, 0x0a).w("aysnd", FUNC(ay8912_device::address_w));             //
	map(0x20, 0x20).w(FUNC(dynax_adpcm_state::hanamai_keyboard_w));         // keyboard row select
	map(0x21, 0x21).portr("COINS");                                         // Coins
	map(0x22, 0x22).r(FUNC(dynax_adpcm_state::mjelctrn_keyboard_1_r));      // P2
	map(0x23, 0x23).r(FUNC(dynax_adpcm_state::hjingi_keyboard_0_r));        // P1
	map(0x24, 0x24).portr("DSW3");
//  map(0x40, 0x40).nopw();                                                 // CRT Controller
//  map(0x41, 0x41).nopw();                                                 // CRT Controller
	map(0x61, 0x67).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));  // Blitter
	map(0x80, 0x87).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0xa0, 0xa0).w(FUNC(dynax_adpcm_state::hnoridur_rombank_w));         // BANK ROM Select
	map(0xc0, 0xc0).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));   // Destination Pen
	map(0xc1, 0xc1).w(FUNC(dynax_adpcm_state::mjembase_blit_dest_w));       // Destination Layer
	map(0xc2, 0xc2).w(FUNC(dynax_adpcm_state::dynax_blit_palette01_w));     // Layers Palettes
	map(0xc3, 0xc3).w(FUNC(dynax_adpcm_state::mjembase_blit_palette23_w));  //
	map(0xc4, 0xc4).w(FUNC(dynax_adpcm_state::mjembase_priority_w));        // layer priority and enable
	map(0xc5, 0xc5).w(FUNC(dynax_adpcm_state::dynax_blit_backpen_w));       // Background Color
	map(0xc6, 0xc6).w(FUNC(dynax_adpcm_state::yarunara_blit_romregion_w));  // Blitter ROM bank
	map(0xc7, 0xc7).w(FUNC(dynax_adpcm_state::hnoridur_palbank_w));
}


/***************************************************************************
                               Mahjong Tenkaigen
***************************************************************************/

void dynax_state::tenkai_ipsel_w(offs_t offset, uint8_t data)
{
	switch (offset)
	{
	case 0: m_input_sel = data;
			m_keyb = 0;
			break;

	case 1: break;
	}

}

void dynax_state::tenkai_ip_w(uint8_t data)
{
	m_input_mode = data;
	switch (m_input_sel)
	{
	case 0x0c:
		machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
		machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
		m_hopper->motor_w(BIT(data, 2));
		// bit 3?
//          popmessage("%02x", data);
		return;

	case 0x0d:
		if (data != 0xff)
			break;
		return;
	}
	logerror("%s: unmapped ip_sel=%02x written with %02x\n", machine().describe_context(), m_input_sel, data);
}

uint8_t dynax_state::tenkai_ip_r(offs_t offset)
{
	uint8_t result = 0xff;
	switch (offset)
	{
	case 0:
		switch (m_input_sel)
		{
		case 0x00:
		case 0x80:
			result = m_coins->read(); // coins
			break;

		case 0x02:
		case 0x82:
			// do other bits do anything?
			result = m_hopper->line_r() ? 0xbf : 0xff;
			break;

		default:
			logerror("%s: unmapped ip_sel=%02x read from offs %x\n", machine().describe_context(), m_input_sel, offset);
		}
		break;

	case 1:
		switch (m_input_sel)
		{
		case 0x0d:
			result = 0xff;
			break;

		case 0x81: // player 2
		case 0x82: // player 1
			if (m_input_mode != 0xff)
			{
				result = 0x00;
			}
			else if (m_keyb >= 5)
			{
				logerror("%s: unmapped keyb=%02x read\n", machine().describe_context(), m_keyb);
				result = 0x00;
			}
			else
			{
				result = m_io_key[BIT(m_input_sel, 0)][m_keyb]->read();
				if (!machine().side_effects_disabled())
					++m_keyb;
			}
			break;

		default:
			logerror("%s: unmapped ip_sel=%02x read from offs %x\n", machine().describe_context(), m_input_sel, offset);
		}
		break;
	}
	return result;
}


void dynax_state::tenkai_dswsel_w(uint8_t data)
{
	m_dsw_sel = data;
}

uint8_t dynax_state::tenkai_dsw_r()
{
	uint8_t result = 0xff;
	if (!BIT(m_dsw_sel, 0)) result &= m_dsw[0]->read();
	if (!BIT(m_dsw_sel, 1)) result &= m_dsw[1]->read();
	if (!BIT(m_dsw_sel, 2)) result &= m_dsw[2]->read();
	if (!BIT(m_dsw_sel, 3)) result &= m_dsw[3]->read();
	if (!BIT(m_dsw_sel, 4)) result &= m_dsw[4]->read();

	return result;
}

uint8_t dynax_state::tenkai_palette_r(offs_t offset)
{
	return m_palette_ram[512 * m_palbank + offset];
}

void dynax_state::tenkai_palette_w(offs_t offset, uint8_t data)
{
	int addr = 512 * m_palbank + offset;
	m_palette_ram[addr] = data;

	{
		int br = m_palette_ram[addr & ~0x10];       // bbbrrrrr
		int bg = m_palette_ram[addr | 0x10];        // bb0ggggg
		int r = br & 0x1f;
		int g = bg & 0x1f;
		int b = ((bg & 0xc0) >> 3) | ((br & 0xe0) >> 5);
		m_palette->set_pen_color(256 * m_palbank + ((offset & 0xf) | ((offset & 0x1e0) >> 1)), pal5bit(r), pal5bit(g), pal5bit(b));
	}
}

void dynax_state::tenkai_update_rombank()
{
	m_bankdev->set_bank(m_rombank);
//  logerror("rombank = %02x\n", m_rombank);
}

uint8_t dynax_state::tenkai_p3_r()
{
	return 0x00;
}

void dynax_state::tenkai_p3_w(uint8_t data)
{
	m_rombank = ((data & 0x04) << 1) | (m_rombank & 0x07);
	tenkai_update_rombank();
}

void dynax_state::tenkai_p4_w(uint8_t data)
{
	m_rombank = (m_rombank & 0x08) | ((data & 0x0e) >> 1);
	tenkai_update_rombank();
}

uint8_t dynax_state::tenkai_p5_r()
{
	return m_tenkai_p5_val;
}

void dynax_state::tenkai_p6_w(uint8_t data)
{
	m_tenkai_p5_val &= 0x0f;

	if (data & 0x0f)
		m_tenkai_p5_val |= (1 << 4);
}

void dynax_state::tenkai_p7_w(uint8_t data)
{
	m_tenkai_p5_val &= 0xf0;

	if (data & 0x03)
		m_tenkai_p5_val |= (1 << 3);
}

void dynax_state::tenkai_p8_w(uint8_t data)
{
	m_rombank = ((data & 0x08) << 1) | (m_rombank & 0x0f);
	tenkai_update_rombank();
}

uint8_t dynax_state::tenkai_p8_r()
{
	return 0x00;
}

void dynax_state::tenkai_show_6c()
{
//    popmessage("%02x %02x", m_tenkai_6c, m_tenkai_70);
}

void dynax_state::tenkai_6c_w(int state)
{
	m_tenkai_6c = state;
	tenkai_show_6c();
}

void dynax_state::tenkai_70_w(int state)
{
	m_tenkai_70 = state;
	tenkai_show_6c();
}

void dynax_state::tenkai_blit_romregion_w(uint8_t data)
{
	switch (data)
	{
		case 0x00:  dynax_blit_romregion_w(0);    return;
		case 0x83:  dynax_blit_romregion_w(1);    return;
		case 0x80:  dynax_blit_romregion_w(2);    return;
	}
	logerror("%s: unmapped romregion=%02X\n", machine().describe_context(), data);
}

void dynax_state::tenkai_map(address_map &map)
{
	map(0x00000, 0x05fff).rom();
	map(0x06000, 0x07fff).ram().share("nvram");
	map(0x08000, 0x0ffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
	map(0x10000, 0x10000).r("aysnd", FUNC(ay8910_device::data_r));       // AY8910
	map(0x10008, 0x10008).w("aysnd", FUNC(ay8910_device::data_w)); //
	map(0x10010, 0x10010).w("aysnd", FUNC(ay8910_device::address_w));  //
	map(0x10020, 0x10021).w("ym2413", FUNC(ym2413_device::write));      //
	map(0x10040, 0x10040).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));     // Destination Pen
	map(0x10044, 0x10044).w(FUNC(dynax_state::tenkai_blit_dest_w));       // Destination Layer
	map(0x10048, 0x10048).w(FUNC(dynax_state::tenkai_blit_palette23_w));  // Layers Palettes
	map(0x1004c, 0x1004c).w(FUNC(dynax_state::tenkai_blit_palette01_w));  //
	map(0x10050, 0x10050).w(FUNC(dynax_state::tenkai_priority_w));        // layer priority and enable
	map(0x10054, 0x10054).w(FUNC(dynax_state::dynax_blit_backpen_w));     // Background Color
	map(0x10058, 0x10058).w(FUNC(dynax_state::tenkai_blit_romregion_w));  // Blitter ROM bank
	map(0x10060, 0x1007f).lw8(NAME([this] (offs_t offset, u8 data) { m_mainlatch->write_d1(offset >> 2, data); }));
	map(0x100c0, 0x100c0).w(FUNC(dynax_state::tenkai_ipsel_w));
	map(0x100c1, 0x100c1).w(FUNC(dynax_state::tenkai_ip_w));
	map(0x100c2, 0x100c3).r(FUNC(dynax_state::tenkai_ip_r));
	map(0x100e1, 0x100e7).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));    // Blitter (inverted scroll values)
}

void dynax_state::tenkai_banked_map(address_map &map)
{
	map(0x00000, 0x3ffff).rom().region("maincpu", 0x10000);
	map(0x80000, 0x8000f).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write));
	map(0x90000, 0x97fff).rw(FUNC(dynax_state::tenkai_palette_r), FUNC(dynax_state::tenkai_palette_w));
}

void dynax_state::mjreachp2_map(address_map &map)
{
	tenkai_map(map);

	map(0x10058, 0x10058).w(FUNC(dynax_state::dynax_blit_romregion_w));
}

void dynax_state::ougonhai_map(address_map &map) // TODO: verify once the protection is beaten
{
	map(0x00000, 0x05fff).rom();
	map(0x06000, 0x07eff).ram().share("nvram");
	map(0x07fc0, 0x07fc0).r("aysnd", FUNC(ay8910_device::data_r));       // AY8910
	map(0x07fc1, 0x07fc1).w("aysnd", FUNC(ay8910_device::data_w)); //
	map(0x07fc2, 0x07fc2).w("aysnd", FUNC(ay8910_device::address_w));  //
	map(0x07fd8, 0x07fdf).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x07fe0, 0x07fef).rw("rtc", FUNC(msm6242_device::read), FUNC(msm6242_device::write));
	map(0x07ff0, 0x07ff0).w(FUNC(dynax_state::tenkai_ipsel_w));
	map(0x07ff1, 0x07ff1).w(FUNC(dynax_state::tenkai_ip_w));
	map(0x07ff2, 0x07ff3).r(FUNC(dynax_state::tenkai_ip_r));
	map(0x08000, 0x0ffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
	// map(0x10020, 0x10021).w("ym2413", FUNC(ym2413_device::write));      // TODO
	map(0x10040, 0x10040).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w));     // Destination Pen
	map(0x10044, 0x10044).w(FUNC(dynax_state::tenkai_blit_dest_w));       // Destination Layer
	map(0x10048, 0x10048).w(FUNC(dynax_state::tenkai_blit_palette23_w));  // Layers Palettes
	map(0x1004c, 0x1004c).w(FUNC(dynax_state::tenkai_blit_palette01_w));  //
	map(0x10050, 0x10050).w(FUNC(dynax_state::tenkai_priority_w));        // layer priority and enable
	map(0x10054, 0x10054).w(FUNC(dynax_state::dynax_blit_backpen_w));     // Background Color
	map(0x10058, 0x10058).w(FUNC(dynax_state::tenkai_blit_romregion_w));  // Blitter ROM bank
	map(0x100e1, 0x100e7).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));    // Blitter (inverted scroll values)
}

void dynax_state::ougonhai_banked_map(address_map &map)
{
	map(0x00000, 0x3ffff).rom().region("maincpu", 0x10000);
	map(0x90000, 0x97fff).rw(FUNC(dynax_state::tenkai_palette_r), FUNC(dynax_state::tenkai_palette_w));
}


uint8_t dynax_state::mjtkp2_dsw_r()
{
	if (m_dsw_sel < 5)
		return m_dsw[m_dsw_sel]->read();
	else
		return 0xff;
}

void dynax_state::mjtkp2_map(address_map &map)
{
	map.unmap_value_high();
	map(0x00000, 0x05fff).rom();
	map(0x06000, 0x07fff).ram().share("nvram");
	map(0x08000, 0x0ffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
	map(0x14000, 0x14000).w(FUNC(dynax_state::tenkai_ipsel_w));
	map(0x14001, 0x14001).w(FUNC(dynax_state::tenkai_ip_w));
	map(0x14002, 0x14003).r(FUNC(dynax_state::tenkai_ip_r));
	map(0x14081, 0x14087).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));    // Blitter (inverted scroll values)
	map(0x14100, 0x14100).w(FUNC(dynax_state::tenkai_dswsel_w));
	map(0x14180, 0x14180).r(FUNC(dynax_state::mjtkp2_dsw_r));
	map(0x14200, 0x14200).w(m_blitter, FUNC(dynax_blitter_rev2_device::pen_w)); // maybe
	map(0x14210, 0x14210).w(FUNC(dynax_state::dynax_blit_dest_w)); // maybe
	map(0x14220, 0x14220).w(FUNC(dynax_state::dynax_blit_palette23_w)); // maybe
	map(0x14230, 0x14230).w(FUNC(dynax_state::dynax_blit_palette01_w)); // maybe
	map(0x14240, 0x14240).w(FUNC(dynax_state::hanamai_priority_w));        // layer priority and enable
	map(0x14250, 0x14250).w(FUNC(dynax_state::dynax_blit_backpen_w)); // maybe
	map(0x14260, 0x14260).lw8(NAME([this] (uint8_t data) { if (data) logerror("%s unk $14260 write: %02x\n", machine().describe_context(), data); }));  // writes 0x80 sometimes
	map(0x14280, 0x142ff).lw8(NAME([this] (offs_t offset, u8 data) { m_mainlatch->write_d1(offset >> 4, data); }));
	map(0x14310, 0x14310).w("aysnd", FUNC(ay8910_device::data_w));
	map(0x14320, 0x14320).w("aysnd", FUNC(ay8910_device::address_w));
	map(0x14380, 0x14381).w("ym2413", FUNC(ym2413_device::write));
}

void dynax_state::mjtkp2_banked_map(address_map &map)
{
	map(0x00000, 0x3ffff).rom().region("maincpu", 0x10000);
	map(0x40000, 0x400ff).w(FUNC(dynax_state::nanajign_palette_lo_w));
	map(0x60000, 0x600ff).w(FUNC(dynax_state::nanajign_palette_hi_w));
}

/***************************************************************************
                                Mahjong Gekisha
***************************************************************************/

uint8_t dynax_state::gekisha_keyboard_1_r()
{
	uint8_t res = hanamai_keyboard_r<1>();

	// bit 6
	res |= m_bet->read();

	// bit 7 = blitter busy

	return res;
}

void dynax_state::gekisha_hopper_w(offs_t offset, uint8_t data)
{
	m_gekisha_val[offset] = data;
//  popmessage("%02x %02x", gekisha_val[0], gekisha_val[1]);
}

void dynax_state::gekisha_p4_w(uint8_t data)
{
	m_bankdev->set_bank((data >> 2) & 3);
}


void dynax_state::gekisha_map(address_map &map)
{
	map(0x0000, 0x6fff).rom();
	map(0x7000, 0x7fff).ram().share("nvram");
	map(0x8000, 0xffff).m(m_bankdev, FUNC(address_map_bank_device::amap8));
}

void dynax_state::gekisha_banked_map(address_map &map)
{
	map(0x00000, 0x0ffff).rom().region("maincpu", 0x8000);
	map(0x10000, 0x10000).nopw();   // ? 0
	map(0x10001, 0x10001).w(FUNC(dynax_state::dynax_blit_palette01_w)); // Layers Palettes (Low Bits)
	map(0x10002, 0x10002).nopw();   // ? 1
	map(0x10003, 0x10003).w(FUNC(dynax_state::dynax_blit_backpen_w));       // Background Color
	map(0x10010, 0x10017).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x10020, 0x10021).w(FUNC(dynax_state::gekisha_hopper_w));
	map(0x10041, 0x10047).w(m_blitter, FUNC(dynax_blitter_rev2_device::regs_w));       // Blitter
//  map(0x10050, 0x10050).nopw();   // CRT Controller
//  map(0x10051, 0x10051).nopw();   // CRT Controller
	map(0x10060, 0x10060).w(FUNC(dynax_state::hanamai_keyboard_w));     // keyboard row select
	map(0x10061, 0x10061).portr("COINS");            // Coins
	map(0x10062, 0x10062).r(FUNC(dynax_state::gekisha_keyboard_1_r));        // P2
	map(0x10063, 0x10063).r(FUNC(dynax_state::hanamai_keyboard_r<0>));       // P1
	map(0x10064, 0x10064).portr("DSW1");         // DSW
	map(0x10065, 0x10065).portr("DSW3");         // DSW
	map(0x10066, 0x10066).portr("DSW4");         // DSW
	map(0x10067, 0x10067).portr("DSW2");         // DSW
	map(0x10070, 0x10071).w("ym2413", FUNC(ym2413_device::write));        //
	map(0x10080, 0x10080).nopw();   // ? 0,1,6 (bit 0 = screen disable?)
}

void dynax_state::ougonhai_p7_w(uint8_t data)
{
	m_tenkai_p5_val &= 0xf0;

	if (data & 0x0f)
		m_tenkai_p5_val |= (1 << 3);
}


/***************************************************************************
                                Castle Of Dracula
***************************************************************************/

void cdracula_state::cdracula_sound_rombank_w(uint8_t data)
{
//  logerror("%s: sound bank = %02x\n", machine().describe_context(), data);

	int num_banks = memregion("oki")->bytes() / 0x40000;
	if (data < num_banks)
		m_oki->set_rom_bank(data);
	else
		logerror("%s: warning, invalid sound bank = %02x\n", machine().describe_context(), data);
}

void cdracula_state::cdracula_io_map(address_map &map)
{
	map.global_mask(0xff);
	map(0x01, 0x07).w(m_blitter, FUNC(cdracula_blitter_device::regs_w));    // Blitter + Destination Layers
	map(0x10, 0x10).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
	map(0x11, 0x11).noprw();                                                // unpopulated oki
//  map(0x12, 0x12).nopw();                                                 // CRT Controller
//  map(0x13, 0x13).nopw();                                                 // CRT Controller
	map(0x20, 0x20).portr("P1");                                            // P1
	map(0x21, 0x21).portr("P2");                                            // P2
	map(0x22, 0x22).portr("COINS");                                         // Coins
	map(0x30, 0x30).w(FUNC(cdracula_state::dynax_layer_enable_w));          // Layers Enable
//  map(0x31, 0x31).w(FUNC(cdracula_state::dynax_rombank_w));               // BANK ROM Select
	map(0x32, 0x32).w(m_blitter, FUNC(cdracula_blitter_device::pen_w));     // Destination Pen
	map(0x33, 0x33).w(m_blitter, FUNC(cdracula_blitter_device::flags_w));   // Flags + Do Blit
	map(0x34, 0x34).w(FUNC(cdracula_state::dynax_blit_palette01_w));        // Layers Palettes (Low Bits)
	map(0x35, 0x35).w(FUNC(cdracula_state::dynax_blit_palette23_w));        //
	map(0x36, 0x36).w(FUNC(cdracula_state::dynax_blit_backpen_w));          // Background Color
	map(0x37, 0x37).w(FUNC(cdracula_state::dynax_vblank_ack_w));            // VBlank IRQ Ack
	map(0x40, 0x47).w(m_mainlatch, FUNC(ls259_device::write_d0));
	map(0x60, 0x60).portr("DSW2");
	map(0x61, 0x61).portr("DSW1");
	map(0x6b, 0x6b).w(FUNC(cdracula_state::cdracula_sound_rombank_w));      // OKI Bank
}


/***************************************************************************


                                Input Ports


***************************************************************************/

INPUT_PORTS_START( dynax_mahjong_keys )
	PORT_INCLUDE( mahjong_matrix_2p_ff )

	PORT_MODIFY("KEY4")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE )

	PORT_MODIFY("KEY9")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE ) PORT_PLAYER(2)
INPUT_PORTS_END

#define MAHJONG_COIN_TEST(ct, cm) \
		PORT_START("COINS") \
		PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )                      PORT_CONDITION(ct, cm, EQUALS, 0)   /* Pay          */ \
		PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )                      PORT_CONDITION(ct, cm, EQUALS, cm)                     \
		PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )                                                                /* 18B          */ \
		PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_TOGGLE                                                    /* Test         */ \
		PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )                                                            /* Analyzer     */ \
		PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET )                                                           /* Memory Reset */ \
		PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BILL1 )         PORT_CODE(KEYCODE_6)                                     /* Note         */ \
		PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )                                                                  /* Coin         */ \
		PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )                                                               /* Service      */

static INPUT_PORTS_START( cdracula )
	PORT_START("P1")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) // erase on highscore entry
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_START1 )

	PORT_START("P2")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) // erase on highscore entry
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_START2 )

	PORT_START("COINS")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_UNKNOWN  )

	PORT_START("DSW1")  // port $61 -> c217
	PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) )    PORT_DIPLOCATION( "SW1:1,2" )
	PORT_DIPSETTING(    0x03, DEF_STR( Easy )    ) // 44
	PORT_DIPSETTING(    0x02, DEF_STR( Normal )  ) // 47
	PORT_DIPSETTING(    0x01, DEF_STR( Hard )    ) // 4a
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) ) // 4d
	PORT_DIPNAME( 0x0c, 0x08, "Time" )                   PORT_DIPLOCATION( "SW1:3,4" )
	PORT_DIPSETTING(    0x0c, "120 sec" )
	PORT_DIPSETTING(    0x08, "90 sec" )
	PORT_DIPSETTING(    0x04, "60 sec" )
	PORT_DIPSETTING(    0x00, "60 sec (duplicate)" )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Lives ) )         PORT_DIPLOCATION( "SW1:5" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x20, 0x20, "Max Lives" )              PORT_DIPLOCATION( "SW1:6" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x00, "8" )
	PORT_DIPNAME( 0x40, 0x40, "Unknown 1-7" )            PORT_DIPLOCATION( "SW1:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )                  PORT_DIPLOCATION( "SW1:8" )

	PORT_START("DSW2")  // port $60 -> c216
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )       PORT_DIPLOCATION( "SW2:1,2" )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x04, 0x04, "Unknown 2-3" )            PORT_DIPLOCATION( "SW2:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "Reset Tiles After Miss" ) PORT_DIPLOCATION( "SW2:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Unknown 2-5" )            PORT_DIPLOCATION( "SW2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )   PORT_DIPLOCATION( "SW2:6" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Sound Test" )             PORT_DIPLOCATION( "SW2:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, "Graphics Test" )          PORT_DIPLOCATION( "SW2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
INPUT_PORTS_END

static INPUT_PORTS_START( hanamai )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_A ) )        PORT_DIPLOCATION( "DIP1:1,2" )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 1C_3C ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 1C_5C ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP1:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP1:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Censor Nudity" )          PORT_DIPLOCATION( "DIP1:5" ) // white circle over pubic area when not covered by clothing
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )   PORT_DIPLOCATION( "DIP1:6" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP1:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )  PORT_DIPLOCATION( "DIP1:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:1" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, "Starting Higi" )          PORT_DIPLOCATION( "DIP2:2" ) // minimum 秘技 before each round - used for buying special items
	PORT_DIPSETTING(    0x02, "0" )
	PORT_DIPSETTING(    0x00, "960" )
	PORT_DIPNAME( 0x04, 0x04, "Show CPU Hand" )          PORT_DIPLOCATION( "DIP2:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test ))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_hanafuda_keys )
INPUT_PORTS_END

static INPUT_PORTS_START( hnkochou )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:1" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:2" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Gokou Odds" )          PORT_DIPLOCATION( "DIPSW 1:6" )
	PORT_DIPSETTING(    0x20, "100" )
	PORT_DIPSETTING(    0x00, "200" )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 1:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x03, 0x03, "Game Mode" )           PORT_DIPLOCATION( "DIPSW 2:1,2" )
	PORT_DIPSETTING(    0x03, "A (Stage Select)" )    // stage select, gal re-dresses if player loses
	PORT_DIPSETTING(    0x02, "B" )                   // no stage select, gal doesn't re-dress if player loses
	PORT_DIPSETTING(    0x01, "C" )                   // no stage select, gal re-dresses if player loses
	PORT_DIPSETTING(    0x00, "D (Gals Off)" )        // no "show time" on win, gals still shown in attract mode
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 2:3" ) // possibly difficulty/pay rate?
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 2:4" ) // possibly difficulty/pay rate?
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 2:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Suggest Move" )        PORT_DIPLOCATION( "DIPSW 2:7" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )    PORT_DIPLOCATION( "DIPSW 2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // Pay
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW )       // Test (there isn't a DIP switch)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )   // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET )  // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN3 )         // Note
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2)
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_INCLUDE( dynax_hanafuda_keys_bet )
INPUT_PORTS_END


static INPUT_PORTS_START( hnoridur )
	PORT_START("DSW0")  /* note that these are in reverse order wrt the others */
	PORT_DIPNAME( 0xc0, 0xc0, DEF_STR( Coinage ) )       PORT_DIPLOCATION( "DIP1:2,1" )
	PORT_DIPSETTING(    0xc0, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x40, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING(    0x80, DEF_STR( 1C_3C ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 1C_5C ) )
	PORT_DIPNAME( 0x30, 0x30, DEF_STR( Difficulty ) )    PORT_DIPLOCATION( "DIP1:4,3" )
	PORT_DIPSETTING(    0x30, DEF_STR( Easy ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Normal ) )
	PORT_DIPSETTING(    0x20, DEF_STR( Hard ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Flip_Screen ) )   PORT_DIPLOCATION( "DIP1:5" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) )   PORT_DIPLOCATION( "DIP1:6" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x04, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, "Select Stage" )           PORT_DIPLOCATION( "DIP1:7" )
	PORT_DIPSETTING(    0x02, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Service_Mode ) )  PORT_DIPLOCATION( "DIP1:8" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:1" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:2" ) // moles on gals' faces when on - linked to nudity/censorship setting?
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Starting Higi" )          PORT_DIPLOCATION( "DIP2:7" ) // minimum 秘技 before each round - used for buying special items
	PORT_DIPSETTING(    0x40, "10" )
	PORT_DIPSETTING(    0x00, "500" )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test ))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_hanafuda_keys )

	PORT_START("DSW2")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:1" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:2" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP3:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW3")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:1" )
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:2" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP4:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
INPUT_PORTS_END

static INPUT_PORTS_START( hjingi )
	PORT_START("DSW0")  /* note that these are in reverse order wrt the others */
	PORT_DIPNAME( 0x80, 0x80, "Stage Select" )               PORT_DIPLOCATION("DIPSW 1:1")        // ステージセレクト
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x80, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x40, 0x40, "Gal H Mode" )                 PORT_DIPLOCATION("DIPSW 1:2")        // ギャルＨモード
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り              (more explicit win sequences)
	PORT_DIPNAME( 0x20, 0x20, "Renchan Gal" )                PORT_DIPLOCATION("DIPSW 1:3")        // 漣ちゃんギャル
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x20, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x10, 0x10, "In-Game Music" )              PORT_DIPLOCATION("DIPSW 1:4")        // ゲーム音楽
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x10, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x08, 0x08, DEF_STR(Demo_Sounds) )         PORT_DIPLOCATION("DIPSW 1:5")        // デモ音楽
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x08, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x04, 0x04, "Hand Lesson" )                PORT_DIPLOCATION("DIPSW 1:6")        // 手札教え
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x04, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) )         PORT_DIPLOCATION("DIPSW 1:7")        // 画面反転
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )                                                      // 正
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 逆
	PORT_DIPNAME( 0x01, 0x01, DEF_STR(Service_Mode) )        PORT_DIPLOCATION("DIPSW 1:8")
	PORT_DIPSETTING(    0x01, DEF_STR(Off) )                                                      // ゲームモード
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // テストモード

	PORT_START("DSW1")
	PORT_DIPNAME( 0x07, 0x07, "Hanafuda Game Payout Rate" )  PORT_DIPLOCATION("DIPSW 2:1,2,3")    // 花札　ゲーム　配当率
	PORT_DIPSETTING(    0x02, DEF_STR(Very_Low) )                                                 // 低い６
	PORT_DIPSETTING(    0x03, DEF_STR(Low) )                                                      // 　　５
	PORT_DIPSETTING(    0x04, DEF_STR(Medium) )                                                   // 　　４
	PORT_DIPSETTING(    0x05, DEF_STR(High) )                                                     // 　　３
	PORT_DIPSETTING(    0x06, DEF_STR(Higher) )                                                   // 　　２
	PORT_DIPSETTING(    0x07, DEF_STR(Highest) )                                                  // 高い１
//  PORT_DIPSETTING(    0x01, DEF_STR( ) )
//  PORT_DIPSETTING(    0x00, DEF_STR( ) )
	PORT_DIPNAME( 0x08, 0x08, "Payout Variation" )           PORT_DIPLOCATION("DIPSW 2:4")        // 配当の波
	PORT_DIPSETTING(    0x00, "Small" )                                                           // 小さい
	PORT_DIPSETTING(    0x08, "Large" )                                                           // 大きい
	PORT_DIPNAME( 0x10, 0x10, "Double-Up Game Payout Rate" ) PORT_DIPLOCATION("DIPSW 2:5")        // ＷＵＰゲーム配当率
	PORT_DIPSETTING(    0x00, DEF_STR(Low) )                                                      // 低い
	PORT_DIPSETTING(    0x10, DEF_STR(High) )                                                     // 高い
	PORT_DIPNAME( 0x20, 0x20, "Gokou Odds" )                 PORT_DIPLOCATION("DIPSW 2:6")        // 五光オッズ
	PORT_DIPSETTING(    0x20, "100" )
	PORT_DIPSETTING(    0x00, "200" )
	PORT_DIPNAME( 0x40, 0x40, "Gokou Cut" )                  PORT_DIPLOCATION("DIPSW 2:7")        // 五光カット
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 出ない
	PORT_DIPSETTING(    0x40, DEF_STR(On) )                                                       // 出る
	PORT_DIPNAME( 0x80, 0x80, "3-Renchan Bonus" )            PORT_DIPLOCATION("DIPSW 2:8")        // ３連ちゃんボーナス
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x80, DEF_STR(On) )                                                       // 有り

	PORT_START("DSW2")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) )             PORT_DIPLOCATION("DIPSW 3:1,2")      // コインレート
	PORT_DIPSETTING(    0x03, DEF_STR(1C_1C) )                                                    // １コイン　１プレイ
	PORT_DIPSETTING(    0x02, DEF_STR(1C_2C) )                                                    // １コイン　２プレイ
	PORT_DIPSETTING(    0x01, DEF_STR(1C_5C) )                                                    // １コイン　５プレイ
	PORT_DIPSETTING(    0x00, DEF_STR(1C_10C) )                                                   // １コイン１０プレイ
	PORT_DIPNAME( 0x04, 0x04, "Key-In Rate" )                PORT_DIPLOCATION("DIPSW 3:3")        // キーインレーと
	PORT_DIPSETTING(    0x00, "5" )      PORT_CONDITION("DSW2", 0x03, EQUALS, 0x03)               // ×　５
	PORT_DIPSETTING(    0x00, "10" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x02)
	PORT_DIPSETTING(    0x00, "25" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x01)
	PORT_DIPSETTING(    0x00, "50" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x00)
	PORT_DIPSETTING(    0x04, "10" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x03)               // ×１０
	PORT_DIPSETTING(    0x04, "20" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x02)
	PORT_DIPSETTING(    0x04, "50" )     PORT_CONDITION("DSW2", 0x03, EQUALS, 0x01)
	PORT_DIPSETTING(    0x04, "100" )    PORT_CONDITION("DSW2", 0x03, EQUALS, 0x00)
	PORT_DIPNAME( 0x18, 0x10, "Maximum Bet" )                PORT_DIPLOCATION("DIPSW 3:4,5")      // ベットｍａｘ
	PORT_DIPSETTING(    0x18, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x08, "20" )
	PORT_DIPSETTING(    0x00, "50" )
	PORT_DIPNAME( 0x60, 0x60, "Minimum Bet" )                PORT_DIPLOCATION("DIPSW 3:6,7")      //  ゲーム・スタートの最低レート枚数
	PORT_DIPSETTING(    0x60, "1" )
	PORT_DIPSETTING(    0x40, "2" )
	PORT_DIPSETTING(    0x20, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x80, 0x80, "Higi" )                       PORT_DIPLOCATION("DIPSW 3:8")        // 秘技
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x80, DEF_STR(On) )                                                       // 有り

	PORT_START("DSW3")
	PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "DIPSW 4:1")                                              // ＯＦＦ固定
	PORT_DIPNAME( 0x02, 0x02, "Payout Mode" )                PORT_DIPLOCATION("DIPSW 4:2")
	PORT_DIPSETTING(    0x02, "Key-out" )                                                         // クレジットタイプ
	PORT_DIPSETTING(    0x00, "Hopper" )                                                          // ホッパータイプ
	PORT_DIPNAME( 0x04, 0x04, "Hopper Polarity" )            PORT_DIPLOCATION("DIPSW 4:3")        // ホッパーマイクロｓｗ
	PORT_DIPSETTING(    0x04, "Active Low" )                                                      // Low Active
	PORT_DIPSETTING(    0x00, "Active High" )                                                     // High Active
	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "DIPSW 4:4")                                              // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "DIPSW 4:5")                                              // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "DIPSW 4:6")                                              // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "DIPSW 4:7")                                              // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "DIPSW 4:8")                                              // ＯＦＦ固定

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // Pay
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE4 )   // 18B
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR(Test))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_GAMBLE_KEYIN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )   // 18A

	PORT_INCLUDE( dynax_hanafuda_keys_bet )
//  PORT_INCLUDE( HANAFUDA_KEYS_BET_ALT )

	PORT_START("BET")
	PORT_CONFNAME( 0x40, 0x40, "Allow Betting" )
	PORT_CONFSETTING(    0x40, DEF_STR( Yes ) ) // 2 keyboards, normal bet layout, hopper not pulsing in key test
//  PORT_CONFSETTING(    0x00, DEF_STR( No ) )  // 1 keyboard,  alt bet layout,    hopper pulsing in key test
INPUT_PORTS_END


static INPUT_PORTS_START( drgpunch )
	PORT_START("P1")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(1)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1)
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1)
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_START1 )

	PORT_START("P2")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_START2 )

	PORT_START("COINS")
	PORT_BIT(  0x01, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(10)
	PORT_BIT(  0x02, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(10)
	PORT_BIT(  0x04, IP_ACTIVE_LOW, IPT_SERVICE1 )
	PORT_BIT(  0x08, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x10, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x20, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x40, IP_ACTIVE_LOW, IPT_UNKNOWN  )
	PORT_BIT(  0x80, IP_ACTIVE_LOW, IPT_UNKNOWN  )

	PORT_START("DSW0")
	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coin_A ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 5C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 4C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x07, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x06, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING(    0x05, DEF_STR( 1C_3C ) )
	PORT_DIPSETTING(    0x04, DEF_STR( 1C_4C ) )
	PORT_DIPNAME( 0x38, 0x38, DEF_STR( Coin_B ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 5C_1C ) )
	PORT_DIPSETTING(    0x08, DEF_STR( 4C_1C ) )
	PORT_DIPSETTING(    0x10, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x18, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x38, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x30, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING(    0x28, DEF_STR( 1C_3C ) )
	PORT_DIPSETTING(    0x20, DEF_STR( 1C_4C ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Flip_Screen ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_SERVICE( 0x80, IP_ACTIVE_LOW )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x07, 0x04, DEF_STR( Difficulty ) )   // Time
	PORT_DIPSETTING(    0x00, "1 (Easy)" )
	PORT_DIPSETTING(    0x01, "2" )
	PORT_DIPSETTING(    0x02, "3" )
	PORT_DIPSETTING(    0x03, "4" )
	PORT_DIPSETTING(    0x04, "5" )
	PORT_DIPSETTING(    0x05, "6" )
	PORT_DIPSETTING(    0x06, "7" )
	PORT_DIPSETTING(    0x07, "8 (Hard)" )
	PORT_DIPNAME( 0x18, 0x10, "Vs Time" )
	PORT_DIPSETTING(    0x18, "8 s" )
	PORT_DIPSETTING(    0x10, "10 s" )
	PORT_DIPSETTING(    0x08, "12 s" )
	PORT_DIPSETTING(    0x00, "14 s" )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Unknown 2-7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, "Unknown 2-8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
INPUT_PORTS_END

static INPUT_PORTS_START( sprtmtch )
	PORT_INCLUDE( drgpunch )

	PORT_MODIFY("DSW1")
	PORT_DIPNAME( 0x40, 0x40, "Intermissions" )         // Does not apply to drgpunch
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x40, DEF_STR( On ) )
INPUT_PORTS_END

static INPUT_PORTS_START( mjfriday )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )       PORT_DIPLOCATION( "DIP-1:1,2" )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x04, 0x04, "PINFU with TSUMO" )       PORT_DIPLOCATION( "DIP-1:3" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x18, 0x18, "Player Strength" )        PORT_DIPLOCATION( "DIP-1:4,5" )
	PORT_DIPSETTING(    0x18, "Weak" )
	PORT_DIPSETTING(    0x10, DEF_STR( Normal ) )
	PORT_DIPSETTING(    0x08, "Strong" )
	PORT_DIPSETTING(    0x00, "Strongest" )
	PORT_DIPNAME( 0x60, 0x60, "CPU Strength" )           PORT_DIPLOCATION( "DIP-1:6,7" )
	PORT_DIPSETTING(    0x60, "Weak" )
	PORT_DIPSETTING(    0x40, DEF_STR( Normal ) )
	PORT_DIPSETTING(    0x20, "Strong" )
	PORT_DIPSETTING(    0x00, "Strongest" )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )   PORT_DIPLOCATION( "DIP-1:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, "Auto TSUMO" )             PORT_DIPLOCATION( "DIP-2:1" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x01, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x02, 0x00, DEF_STR( Demo_Sounds ) )   PORT_DIPLOCATION( "DIP-2:2" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP-2:3" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP-2:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP-2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Full Test" )              PORT_DIPLOCATION( "DIP-2:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP-2:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )       PORT_DIPLOCATION( "DIP-2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "18B"
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )    // Test (there isn't a dip switch)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "18A"

	PORT_INCLUDE( dynax_mahjong_keys )
INPUT_PORTS_END


static INPUT_PORTS_START( mjdialq2 )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) )                PORT_DIPLOCATION("SW. 1:1,2")     // プレイ料金
	PORT_DIPSETTING(    0x00, DEF_STR(3C_1C) )                                                    // ３コイン　１プレー
	PORT_DIPSETTING(    0x02, DEF_STR(2C_1C) )                                                    // ２コイン　１プレー
	PORT_DIPSETTING(    0x03, DEF_STR(1C_1C) )                                                    // １コイン　１プレー
	PORT_DIPSETTING(    0x01, DEF_STR(1C_2C) )                                                    // １コイン　２プレー
	PORT_DIPNAME( 0x04, 0x00, "Allow Pinfu with Tsumo")         PORT_DIPLOCATION("SW. 1:3")       // ルール　ピンフ・ツモ複合
	PORT_DIPSETTING(    0x04, DEF_STR(No) )                                                       // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有り
	PORT_DIPNAME( 0x38, 0x20, DEF_STR(Difficulty) )             PORT_DIPLOCATION("SW. 1:4,5,6")   // 難易度　コンピュー
	PORT_DIPSETTING(    0x38, "1 (Weak)" )                                                        // 弱い　　（１）
	PORT_DIPSETTING(    0x30, "2" )                                                               // 　　　　（２）
	PORT_DIPSETTING(    0x28, "3" )                                                               // 　　　　（３）
	PORT_DIPSETTING(    0x20, "4 (Normal)" )                                                      // 標準　　（４）
	PORT_DIPSETTING(    0x18, "5" )                                                               // 　　　　（５）
	PORT_DIPSETTING(    0x10, "6" )                                                               // 　　　　（６）
	PORT_DIPSETTING(    0x08, "7" )                                                               // 　　　　（７）
	PORT_DIPSETTING(    0x00, "8 (Strong)" )                                                      // 強い　　（８）
	PORT_DIPNAME( 0x40, 0x00, DEF_STR(Demo_Sounds ) )           PORT_DIPLOCATION("SW. 1:7")       // デモ・サウンド
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW. 1:8")       // モニター画面反転
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                      // 正
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 逆

	PORT_START("DSW1")
	PORT_DIPNAME( 0x07, 0x07, "Game Clock Start" )              PORT_DIPLOCATION("SW. 2:1,2,3")   // ゲーム時計スタート
	PORT_DIPSETTING(    0x07, "08:30" )                                                           // 　８時３０分
	PORT_DIPSETTING(    0x06, "09:00" )                                                           // 　９時００分
	PORT_DIPSETTING(    0x05, "09:30" )                                                           // 　９時３０分
	PORT_DIPSETTING(    0x04, "10:00" )                                                           // １０時００分
	PORT_DIPSETTING(    0x03, "10:30" )                                                           // １０時３０分
	PORT_DIPSETTING(    0x02, "11:00" )                                                           // １１時００分
	PORT_DIPSETTING(    0x01, "11:30" )                                                           // １１時３０分
	PORT_DIPSETTING(    0x00, "12:00" )                                                           // １２時００分
	PORT_DIPNAME( 0x08, 0x00, "Time Service" )                  PORT_DIPLOCATION("SW. 2:4")       // タイム－サービス（時間等によりできる秘技）
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り                  (allows secret techniques depending on the time)
	PORT_DIPNAME( 0x10, 0x10, "Show Telephone Numbers" )        PORT_DIPLOCATION("SW. 2:5")       // ＴＥＬ表示
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x10, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x20, 0x20, "Gal Mode" )                      PORT_DIPLOCATION("SW. 2:6")       // ＧＡＬモード切り替え  (not clear what this does)
	PORT_DIPSETTING(    0x20, "1" )                                                               // １
	PORT_DIPSETTING(    0x00, "2" )                                                               // ２
	PORT_DIPNAME( 0x40, 0x40, "Bonus Item Select (cheat)" )     PORT_DIPLOCATION("SW. 2:7")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       //                       (allows you to select a bonus item and always win the jan-ken-pon game)
	PORT_DIPNAME( 0x80, 0x80, "Show Debug Info" )               PORT_DIPLOCATION("SW. 2:8")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "18B"
	PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW)     // Test (there isn't a dip switch)
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )    // "18A"

	PORT_INCLUDE( mahjong_matrix_2p_ff )
INPUT_PORTS_END


static INPUT_PORTS_START( yarunara )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )     // 1,6
	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )   // 3,4
	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )     // 5,2
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )  // 7,0
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Use Password" )
	PORT_DIPSETTING(    0x40, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x80, 0x80, "Set Date" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, "PINFU with TSUMO" )
	PORT_DIPSETTING(    0x01, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x02, 0x02, "Unknown 2-1" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, "Unknown 2-2" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "Unknown 2-3*" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Unknown 2-4" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Choose Bonus (Cheat)")
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Unknown 2-6" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "18B"
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE  ) PORT_NAME(DEF_STR( Test ))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1    )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_mahjong_keys )
INPUT_PORTS_END


static INPUT_PORTS_START( mjcomv1 )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) )                PORT_DIPLOCATION("SW 1:1,2")    // コインレート
	PORT_DIPSETTING(    0x00, DEF_STR(3C_1C) )                                                  // ３　コイン　１　プレー
	PORT_DIPSETTING(    0x01, DEF_STR(2C_1C) )                                                  // ２　コイン　１　プレー
	PORT_DIPSETTING(    0x03, DEF_STR(1C_1C) )                                                  // １　コイン　１　プレー
	PORT_DIPSETTING(    0x02, DEF_STR(1C_2C) )                                                  // １　コイン　２　プレー
	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR(Difficulty) )             PORT_DIPLOCATION("SW 1:3,4")    // コンピューターの強さ
	PORT_DIPSETTING(    0x08, DEF_STR(Easy) )                                                   // 弱い
	PORT_DIPSETTING(    0x0c, DEF_STR(Normal) )                                                 // 標準
	PORT_DIPSETTING(    0x04, DEF_STR(Hard) )
	PORT_DIPSETTING(    0x00, DEF_STR(Hardest) )                                                // 強い
	PORT_DIPNAME( 0x10, 0x10, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW 1:5")      // 画面反転
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                    // 通常
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                     // 反転
	PORT_DIPNAME( 0x20, 0x20, DEF_STR(Demo_Sounds) )            PORT_DIPLOCATION("SW 1:6")      // デモ　　サウンド
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )                                                    // 無
	PORT_DIPSETTING(    0x20, DEF_STR(On) )                                                     // 有
	PORT_DIPNAME( 0x40, 0x40, "Allow Pinfu with Tsumo")         PORT_DIPLOCATION("SW 1:7")      // ルール　ピンフ・ツモ複合
	PORT_DIPSETTING(    0x00, DEF_STR(No) )                                                     // 無
	PORT_DIPSETTING(    0x40, DEF_STR(Yes) )                                                    // 有
	PORT_DIPNAME( 0x80, 0x80, "Time Settings Mode" )            PORT_DIPLOCATION("SW 1:8")      // 時間設定モード
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                    // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                     // 有

	PORT_START("DSW1")
	PORT_DIPUNKNOWN_DIPLOC( 0x01, 0x01, "SW 2:1" )                                              // OFF 固定
	PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW 2:2" )                                              // OFF 固定
	PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW 2:3" )                                              // OFF 固定
	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW 2:4" )                                              // OFF 固定
	PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW 2:5" )                                              // OFF 固定
	PORT_DIPNAME( 0x20, 0x20, "Computer Hand Always Open" )     PORT_DIPLOCATION("SW 2:6")      // OFF 固定
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "SW 2:7" )                                              // OFF 固定
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Service_Mode) )           PORT_DIPLOCATION("SW 2:8")      // テストモード
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                    // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                     // 有

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )   // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )   // "18B"
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_TOGGLE PORT_NAME(DEF_STR(Test))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )   // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_mahjong_keys )
INPUT_PORTS_END


static INPUT_PORTS_START( warahana )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 1C_2C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x04, DEF_STR( Easy ) )
	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Hard ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Panel Type" )
	PORT_DIPSETTING(    0x00, "Mahjong" )
	PORT_DIPSETTING(    0x40, "Hanafuda" )
	PORT_DIPNAME( 0x80, 0x80, "Set Date" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, "Start with Quiz" )
	PORT_DIPSETTING(    0x01, DEF_STR( On  ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "18B"
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE  ) PORT_NAME(DEF_STR( Test ))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1    )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_mahjong_keys )
INPUT_PORTS_END

static INPUT_PORTS_START( hanayara )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )       PORT_DIPLOCATION( "DIP1:1,2" )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )    PORT_DIPLOCATION( "DIP1:3,4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Easy ) )     // 1,6
	PORT_DIPSETTING(    0x0c, DEF_STR( Normal ) )   // 3,4
	PORT_DIPSETTING(    0x04, DEF_STR( Hard ) )     // 5,2
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )  // 7,0
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) )   PORT_DIPLOCATION( "DIP1:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )   PORT_DIPLOCATION( "DIP1:6" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Use Password" )           PORT_DIPLOCATION( "DIP1:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x80, 0x80, "Set Date" )               PORT_DIPLOCATION( "DIP1:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x01, "PINFU with TSUMO" )       PORT_DIPLOCATION( "DIP2:1" ) // FIXME: doesn't make sense for hanafuda game
	PORT_DIPSETTING(    0x01, DEF_STR( No ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x02, 0x02, "Unknown 2-1" )            PORT_DIPLOCATION( "DIP2:2" )
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, "Unknown 2-2" )            PORT_DIPLOCATION( "DIP2:3" ) // moles on gals' faces when on - linked to nudity/censorship setting?
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "Unknown 2-3*" )           PORT_DIPLOCATION( "DIP2:4" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Unknown 2-4" )            PORT_DIPLOCATION( "DIP2:5" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Choose Bonus (Cheat)")    PORT_DIPLOCATION( "DIP2:6" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Show All Bonus Cards")    PORT_DIPLOCATION( "DIP2:7" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )  PORT_DIPLOCATION( "DIP2:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "17B"
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "18B"
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE  ) PORT_NAME(DEF_STR( Test ))
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN  )   // "06B"
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1    )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_hanafuda_keys )
INPUT_PORTS_END

static INPUT_PORTS_START( quiztvqq )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
	PORT_DIPSETTING(    0x00, DEF_STR( 3C_1C ) )
	PORT_DIPSETTING(    0x01, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x03, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Difficulty ) )
	PORT_DIPSETTING(    0x08, DEF_STR( Easy )    )
	PORT_DIPSETTING(    0x0c, DEF_STR( Normal )  )
	PORT_DIPSETTING(    0x04, DEF_STR( Hard )    )
	PORT_DIPSETTING(    0x00, DEF_STR( Hardest ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Flip_Screen ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Voices" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x80, 0x80, "Set Date" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x03, 0x03, "Unknown 2-0&1" )
	PORT_DIPSETTING(    0x03, "0" )
	PORT_DIPSETTING(    0x02, "1" )
	PORT_DIPSETTING(    0x01, "2" )
	PORT_DIPSETTING(    0x00, "3" )
	PORT_DIPNAME( 0x04, 0x04, "Unknown 2-2" )
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "Unknown 2-3*" )
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Unknown 2-4*" )
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, "Unknown 2-5" )
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, "Unknown 2-6" )
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test ))   // Test, during boot
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY0")
	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(1)
	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_START1 )

	PORT_START("KEY1")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY2")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY3")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY4")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY5")
	PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
	PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
	PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
	PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
	PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_START2 )

	PORT_START("KEY6")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY7")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY8")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_START("KEY9")
	PORT_BIT( 0x3f, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END


static INPUT_PORTS_START( mcnpshnt )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x06, 0x06, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2,3")
	PORT_DIPSETTING(    0x06, "0" )
	PORT_DIPSETTING(    0x04, "1" )
	PORT_DIPSETTING(    0x02, "2" )
	PORT_DIPSETTING(    0x00, "3" )
	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:4,5")
	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x18, DEF_STR( 1C_1C ) )
//  PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x20, 0x20, "Auto TSUMO" ) PORT_DIPLOCATION("SW1:6")
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION("SW1:7")
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x00, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW1:8")
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x80, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x07, 0x07, "Time Setting" ) PORT_DIPLOCATION("SW2:1,2,3")
	PORT_DIPSETTING(    0x07, "8:30" )
	PORT_DIPSETTING(    0x06, "9:00" )
	PORT_DIPSETTING(    0x05, "9:30" )
	PORT_DIPSETTING(    0x04, "10:00" )
	PORT_DIPSETTING(    0x03, "10:30" )
	PORT_DIPSETTING(    0x02, "11:00" )
	PORT_DIPSETTING(    0x01, "11:30" )
	PORT_DIPSETTING(    0x00, "12:00" )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:4")
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Buy Screen Bonus Points" ) PORT_DIPLOCATION("SW2:5") /* Sets your points to 100 every time you arrive at the screen for buying special items. */
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	/* make your game last at least 4 or 5 minutes. Continue if necessary. Before the next round you begin,
	you will get some sort of message in Japanese stating that it is some sort of lucky time of day for you, and
	you get 100 bonus points (for purchasing items). */
	PORT_DIPNAME( 0x20, 0x20, "Lucky Time Of Day Bonus" ) PORT_DIPLOCATION("SW2:6")
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW2:7")
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Service_Mode ) ) PORT_DIPLOCATION("SW2:8")
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )    // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( dynax_mahjong_keys )
INPUT_PORTS_END


static INPUT_PORTS_START( nanajign )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) )                PORT_DIPLOCATION("SW. 2:1,2")     // プレイ料金
	PORT_DIPSETTING(    0x00, DEF_STR(3C_1C) )                                                    // ３コイン　１プレー
	PORT_DIPSETTING(    0x02, DEF_STR(2C_1C) )                                                    // ２コイン　１プレー
	PORT_DIPSETTING(    0x03, DEF_STR(1C_1C) )                                                    // １コイン　１プレー
	PORT_DIPSETTING(    0x01, DEF_STR(1C_2C) )                                                    // １コイン　２プレー
	PORT_DIPNAME( 0x04, 0x00, "Allow Pinfu with Tsumo")         PORT_DIPLOCATION("SW. 2:3")       // ルール　ピンフ・ツモ複合
	PORT_DIPSETTING(    0x04, DEF_STR(No) )                                                       // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有り
	PORT_DIPNAME( 0x38, 0x20, DEF_STR(Difficulty) )             PORT_DIPLOCATION("SW. 2:4,5,6")   // 難易度　コンピューター
	PORT_DIPSETTING(    0x38, "1 (Weak)" )                                                        // 　　弱い　　（１）
	PORT_DIPSETTING(    0x30, "2" )                                                               // 　　　　　　（２）
	PORT_DIPSETTING(    0x28, "3" )                                                               // 　　　　　　（３）
	PORT_DIPSETTING(    0x20, "4 (Normal)" )                                                      // 標準　　　　（４）
	PORT_DIPSETTING(    0x18, "5" )                                                               // 　　　　　　（５）
	PORT_DIPSETTING(    0x10, "6" )                                                               // 　　　　　　（６）
	PORT_DIPSETTING(    0x08, "7" )                                                               // 　　　　　　（７）
	PORT_DIPSETTING(    0x00, "8 (Strong)" )                                                      // 　　強い　　（８）
	PORT_DIPNAME( 0x40, 0x40, "Auto Reach" )                    PORT_DIPLOCATION("SW. 2:7")       // オート・ツモ
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW. 2:8")       // モニター画面反転
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                      // 正
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 逆

	PORT_START("DSW1")
	PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds ) )           PORT_DIPLOCATION("SW. 3:1")       // デモ・サウンド
	PORT_DIPSETTING(    0x01, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り
	PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x02, "SW. 3:2" )                                               // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x04, "SW. 3:3" )                                               // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW. 3:4" )                                               // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW. 3:5" )                                               // ＯＦＦ固定
	PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW. 3:6" )                                               // ＯＦＦ固定
	PORT_DIPNAME( 0x40, 0x40, "Computer Hand Always Open" )     PORT_DIPLOCATION("SW. 3:7")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Service_Mode) )           PORT_DIPLOCATION("SW. 3:8")       //  ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR(Test))   // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_INCLUDE( mahjong_matrix_2p_ff )

	PORT_START("DSW2") // not shown in test mode or manual
	PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END


static INPUT_PORTS_START( janyuki )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 1:1")
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 1:2")
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 1:3")
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coinage ) )         PORT_DIPLOCATION("SW 1:4,5")
	PORT_DIPSETTING(    0x00, DEF_STR( 2C_1C ) )
//  PORT_DIPSETTING(    0x08, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x18, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Demo_Sounds ) )     PORT_DIPLOCATION("SW 1:6")
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x20, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 1:7") //*
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 1:8") //*
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")
	PORT_DIPNAME( 0x03, 0x03, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:1,2")
	PORT_DIPSETTING(    0x03, "0" )
	PORT_DIPSETTING(    0x02, "1" )
	PORT_DIPSETTING(    0x01, "2" )
	PORT_DIPSETTING(    0x00, "3" )
	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:3")
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:4")
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:5")
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:6") //*
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:7") //*
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )         PORT_DIPLOCATION("SW 2:8") //*
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE2 )   // Analyzer / Hardware Test
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_START("KEY0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)

	PORT_START("KEY1")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)

	PORT_START("KEY2")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY3")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY4")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END


static INPUT_PORTS_START( jantouki )
	PORT_START("DSW0")
	PORT_DIPNAME( 0x07, 0x07, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x07, "0" ) // 0 6 2
	PORT_DIPSETTING(    0x06, "1" ) // 0 6 1
	PORT_DIPSETTING(    0x05, "2" ) // 1 5 2
	PORT_DIPSETTING(    0x04, "3" ) // 1 5 1
	PORT_DIPSETTING(    0x03, "4" ) // 2 4 2
	PORT_DIPSETTING(    0x02, "5" ) // 2 4 1
	PORT_DIPSETTING(    0x01, "6" ) // 2 3 1
	PORT_DIPSETTING(    0x00, "7" ) // 2 2 1
	PORT_DIPNAME( 0x18, 0x18, DEF_STR( Coinage ) )
	PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
	PORT_DIPSETTING(    0x18, DEF_STR( 1C_1C ) )
//  PORT_DIPSETTING(    0x00, DEF_STR( 1C_1C ) )
	PORT_DIPSETTING(    0x10, DEF_STR( 1C_2C ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )  //*
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) )
	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("DSW1")
	PORT_DIPNAME( 0x07, 0x07, "Time Setting" )
	PORT_DIPSETTING(    0x07, "08:30" )
	PORT_DIPSETTING(    0x06, "09:00" )
	PORT_DIPSETTING(    0x05, "09:30" )
	PORT_DIPSETTING(    0x04, "10:00" )
	PORT_DIPSETTING(    0x03, "10:30" )
	PORT_DIPSETTING(    0x02, "11:00" )
	PORT_DIPSETTING(    0x01, "11:30" )
	PORT_DIPSETTING(    0x00, "12:00" )
	PORT_DIPNAME( 0x08, 0x00, "Nudity" )
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPSETTING(    0x08, DEF_STR( No ) )   // Moles On Gal's Face
	PORT_DIPNAME( 0x10, 0x10, "Buy Screen Bonus Points" ) /* Sets your points to 100 every time you arrive at the screen for buying special items. */
	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	/* make your game last at least 4 or 5 minutes. Continue if necessary. Before the next round you begin,
	you will get some sort of message in Japanese stating that it is some sort of lucky time of day for you, and
	you get 100 bonus points (for purchasing items). */
	PORT_DIPNAME( 0x20, 0x20, "Lucky Time Of Day Bonus" )
	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_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_SERVICE_NO_TOGGLE(0x04, IP_ACTIVE_LOW )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )

	PORT_START("KEY0")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_A )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_E )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_I )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_M )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_KAN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN)

	PORT_START("KEY1")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_B )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_F )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_J )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_N )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_REACH )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_BET )

	PORT_START("KEY2")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_C )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_G )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_K )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_CHI )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_RON )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY3")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_D )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_H )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_L )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_MAHJONG_PON )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_START("KEY4")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_START1 )
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END


static INPUT_PORTS_START( mjembase )
	PORT_START("DSW2")  /* DIP1, 7c20 (port $1e) */
	MAHJONG_PAYOUT_RATE(0, "SW 1:1,2,3,4")
	PORT_DIPNAME( 0x30, 0x10, "Maximum Bet" )                   PORT_DIPLOCATION("SW 1:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x00, "20" )
	MAHJONG_NOTE_CREDITS(6, "SW 1:7", "DSW1", 2)
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW 1:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("DSW1")  /* DIP2, 7c21 (port $1c) */
	MAHJONG_ODDS_RATE(0, "SW 2:1,2")
	MAHJONG_COINAGE(2, "SW 2:3,4")
	PORT_DIPNAME( 0x30, 0x30, "Minimum Bet" )                   PORT_DIPLOCATION("SW 2:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "2" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x40, 0x40, "Payout Mode" )                   PORT_DIPLOCATION("SW 2:7")
	PORT_DIPSETTING(    0x40, "Key-out" )
	PORT_DIPSETTING(    0x00, "Hopper" )
	PORT_DIPNAME( 0x80, 0x80, "Hopper Polarity" )               PORT_DIPLOCATION("SW 2:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Normal) )
	PORT_DIPSETTING(    0x00, "Inverted" )

	PORT_START("DSW0")  /* DIP3, 7c22 (port $06, AY) */ /* note that these are in reverse order wrt the others */
	PORT_DIPNAME( 0x01, 0x01, "Disable H Pose" )                PORT_DIPLOCATION("SW 3:8")
	PORT_DIPSETTING(    0x01, DEF_STR(No) )
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )   // win sequences show scrolling images of gals wearing bikinis irrespective of SW 4-8 setting
	PORT_DIPNAME( 0x02, 0x00, "Don Den Button" )                PORT_DIPLOCATION("SW 3:7")
	PORT_DIPSETTING(    0x02, "A" )
	PORT_DIPSETTING(    0x00, "Flip Flop" )
	PORT_DIPNAME( 0x04, 0x00, "Service Count" )                 PORT_DIPLOCATION("SW 3:6")
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x08, 0x00, "Computer Strength" )             PORT_DIPLOCATION("SW 3:5")
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) )
	PORT_DIPSETTING(    0x08, "Strong" )
	PORT_DIPNAME( 0x10, 0x10, "Yakuman Bonuses Per Cycle" )     PORT_DIPLOCATION("SW 3:4")
	PORT_DIPSETTING(    0x10, "1" )
	PORT_DIPSETTING(    0x00, "2" )
	PORT_DIPNAME( 0xe0, 0xc0, "Yakuman Bonus Cycle" )           PORT_DIPLOCATION("SW 3:3,2,1")
	PORT_DIPSETTING(    0xe0, "None" )
	PORT_DIPSETTING(    0x60, "First time only" )
	PORT_DIPSETTING(    0xa0, "Every 300 coins" )
	PORT_DIPSETTING(    0x20, "Every 500 coins" )
	PORT_DIPSETTING(    0xc0, "Every 700 coins" )
	PORT_DIPSETTING(    0x40, "Every 1000 coins" )
//  PORT_DIPSETTING(    0x80, "Every 1000 coins" )
//  PORT_DIPSETTING(    0x00, "Every 1000 coins" )

	PORT_START("DSW3")  /* DIP4, 7c23 (port $24) */
	PORT_DIPNAME( 0x01, 0x01, "Last Chance" )                   PORT_DIPLOCATION("SW 4:1")
	PORT_DIPSETTING(    0x01, "Free" )
	PORT_DIPSETTING(    0x00, "Paid" )
	PORT_DIPNAME( 0x02, 0x00, "Renchan Rate" )                  PORT_DIPLOCATION("SW 4:2")
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x04, 0x00, "Auto Reach" )                    PORT_DIPLOCATION("SW 4:3")
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x08, 0x00, "Double Bet" )                    PORT_DIPLOCATION("SW 4:4")
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )    // press Bet during game to double the bet
	PORT_DIPNAME( 0x10, 0x00, DEF_STR(Demo_Sounds) )            PORT_DIPLOCATION("SW 4:5")
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x20, 0x00, "In-Game Music" )                 PORT_DIPLOCATION("SW 4:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x40, "Gal Select" )                    PORT_DIPLOCATION("SW 4:7")
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, "Gal H Pose" )                    PORT_DIPLOCATION("SW 4:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )   // shows moles on gals' faces, win sequences show scrolling images of gals wearing bikinis
	PORT_DIPSETTING(    0x00, DEF_STR(On) )    // win sequences show "interaction" with gals if SW 3-8 is off

	PORT_START("FAKE")  /* IN10 - Fake DSW */
	PORT_CONFNAME( 0xff, 0xff, "Allow Bets" )
	PORT_CONFSETTING(    0x00, DEF_STR( Off ) )
	PORT_CONFSETTING(    0xff, DEF_STR( On ) )

	MAHJONG_COIN_TEST("DSW1", 0x40)

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
INPUT_PORTS_END


// DIP switch locations verified on mjelctrb PCB - disagrees with input test
static INPUT_PORTS_START( mjelct3 )
	MAHJONG_COIN_TEST("DSW1", 0x40)

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )

	PORT_START("SW1")  // port 85
	PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
	PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")

	PORT_START("DSW0")  /* 7c21 (select = 00) */
	PORT_DIPNAME( 0x03, 0x03, "Difficulty?" )                  PORT_DIPLOCATION("SW3:1,2")
	PORT_DIPSETTING(    0x03, "0" ) // 20
	PORT_DIPSETTING(    0x00, "1" ) // 32
	PORT_DIPSETTING(    0x01, "2" ) // 64
	PORT_DIPSETTING(    0x02, "3" ) // c8
	MAHJONG_COINAGE(2, "SW3:3,4")
	PORT_DIPNAME( 0x30, 0x30, "Minimum Bet" )                  PORT_DIPLOCATION("SW3:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "2" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x40, 0x40, "Payout Mode" )                  PORT_DIPLOCATION("SW3:7")
	PORT_DIPSETTING(    0x40, "Key-out" )
	PORT_DIPSETTING(    0x00, "Hopper" )
	PORT_DIPNAME( 0x80, 0x80, "Hopper Polarity" )              PORT_DIPLOCATION("SW3:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Normal) )
	PORT_DIPSETTING(    0x00, "Inverted" )

	PORT_START("DSW1")  /* 7c20 (select = 40) */
	MAHJONG_PAYOUT_RATE(0, "SW4:1,2,3,4")
	PORT_DIPNAME( 0x30, 0x30, "Maximum Bet" )                  PORT_DIPLOCATION("SW4:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x00, "20" )
	MAHJONG_NOTE_CREDITS(6, "SW4:7", "DSW0", 2)
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) )         PORT_DIPLOCATION("SW4:8")
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW2")  /* 7c22 (select = 80) */
	MAHJONG_YAKUMAN_BONUS(0, 0x04, "SW2:1,2,3")
	PORT_DIPNAME( 0x08, 0x08, "Yakuman Bonuses Per Cycle" )    PORT_DIPLOCATION("SW2:4")
	PORT_DIPSETTING(    0x08, "1" )
	PORT_DIPSETTING(    0x00, "2" )
	PORT_DIPNAME( 0x10, 0x10, "Win Rate?" )                    PORT_DIPLOCATION("SW2:5")
	PORT_DIPSETTING(    0x10, DEF_STR( High ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Low ) )
	PORT_DIPNAME( 0x20, 0x20, "Draw New Tile (Part 3 Only)" )  PORT_DIPLOCATION("SW2:6")
	PORT_DIPSETTING(    0x00, "Automatic" )
	PORT_DIPSETTING(    0x20, "Manual" )
	PORT_DIPNAME( 0x40, 0x00, "Don Den Button" )               PORT_DIPLOCATION("SW2:7")
	PORT_DIPSETTING(    0x40, "A" )
	PORT_DIPSETTING(    0x00, "Flip Flop" )
	PORT_DIPNAME( 0x80, 0x00, "Subtitle" )                     PORT_DIPLOCATION("SW2:8")
	PORT_DIPSETTING(    0x80, "None (Part 2)" )
	PORT_DIPSETTING(    0x00, "Super Express (Part 3)" )

	PORT_START("DSW3")  /* 7c23 (select = c0) */
	PORT_DIPNAME( 0x01, 0x01, "Last Chance" )                  PORT_DIPLOCATION("SW5:1")
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )
	PORT_DIPSETTING(    0x01, DEF_STR(On) )
	PORT_DIPNAME( 0x02, 0x02, "Pay Rate?" )                    PORT_DIPLOCATION("SW5:2")
	PORT_DIPSETTING(    0x02, DEF_STR( High ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Low ) )
	PORT_DIPNAME( 0x04, 0x04, "Choose Bonus" )                 PORT_DIPLOCATION("SW5:3")
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "In-Game Bet?" )                 PORT_DIPLOCATION("SW5:4")
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x08, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x00, DEF_STR(Demo_Sounds) )           PORT_DIPLOCATION("SW5:5")
	PORT_DIPSETTING(    0x10, DEF_STR(Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x20, 0x00, "In-Game Music" )                PORT_DIPLOCATION("SW5:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x40, "Gal Select" )                   PORT_DIPLOCATION("SW5:7")
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x00, "Nudity" )                       PORT_DIPLOCATION("SW5:8")
	PORT_DIPSETTING(    0x00, DEF_STR( Yes ) )
	PORT_DIPSETTING(    0x80, DEF_STR( No ) )   // Moles On Gal's Face

	PORT_START("FAKE")  /* IN10 - Fake DSW */
	PORT_DIPNAME( 0xff, 0xff, "Allow Bets" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0xff, DEF_STR( On ) )
INPUT_PORTS_END


static INPUT_PORTS_START( mjelctrn )
	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )                      // Pay
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )                            // 18B
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_TOGGLE                // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )                        // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET )                       // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BILL1 )         PORT_CODE(KEYCODE_6) // Note
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )                              // Coin
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )                           // Service

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )

	PORT_START("SW1")  // port 85
	PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "SW1:1")
	PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "SW1:2")

	PORT_START("DSW0")  /* 7c21 (select = 00) */
	MAHJONG_ODDS_RATE(0, "SW3:1,2");
	MAHJONG_COINAGE(2, "SW3:3,4")
	PORT_DIPNAME( 0x30, 0x30, "Minimum Bet" )                  PORT_DIPLOCATION("SW3:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "2" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x40, 0x40, "Payout Mode" )                  PORT_DIPLOCATION("SW3:7")
	PORT_DIPSETTING(    0x40, "Key-out" )
	PORT_DIPSETTING(    0x00, "Hopper" )
	PORT_DIPNAME( 0x80, 0x80, "Win A Prize?" )                 PORT_DIPLOCATION("SW3:8")
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW1")  /* 7c20 (select = 40) */
	MAHJONG_PAYOUT_RATE(0, "SW4:1,2,3,4")
	PORT_DIPNAME( 0x30, 0x10, "Maximum Bet" )                  PORT_DIPLOCATION("SW4:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x00, "20" )
	MAHJONG_NOTE_CREDITS(6, "SW4:7", "DSW0", 2)
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )           PORT_DIPLOCATION("SW4:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("DSW2")  /* 7c22 (select = 80) */
	MAHJONG_YAKUMAN_BONUS(0, 0x04, "SW2:1,2,3")
	PORT_DIPNAME( 0x08, 0x08, "Yakuman Bonuses Per Cycle" )    PORT_DIPLOCATION("SW2:4")
	PORT_DIPSETTING(    0x08, "1" )
	PORT_DIPSETTING(    0x00, "2" )
	PORT_DIPNAME( 0x10, 0x10, "Win Rate?" )                    PORT_DIPLOCATION("SW2:5")
	PORT_DIPSETTING(    0x10, DEF_STR( High ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Low ) )
	PORT_DIPNAME( 0x20, 0x20, "Draw Automatically (Part 4)" )  PORT_DIPLOCATION("SW2:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x00, "Don Den Button" )               PORT_DIPLOCATION("SW2:7")
	PORT_DIPSETTING(    0x40, "A" )
	PORT_DIPSETTING(    0x00, "Flip Flop" )
	PORT_DIPNAME( 0x80, 0x00, "Game Type" )                    PORT_DIPLOCATION("SW2:8")
	PORT_DIPSETTING(    0x80, "Part 2" )
	PORT_DIPSETTING(    0x00, "Part 4 (Choukyuu)" )

	PORT_START("DSW3")  /* 7c23 (select = c0) */
	PORT_DIPNAME( 0x01, 0x01, "Last Chance" )                  PORT_DIPLOCATION("SW5:1")
	PORT_DIPSETTING(    0x01, "Free" )
	PORT_DIPSETTING(    0x00, "Paid" )
	PORT_DIPNAME( 0x02, 0x02, "Pay Rate?" )                    PORT_DIPLOCATION("SW5:2")
	PORT_DIPSETTING(    0x02, DEF_STR( High ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Low ) )
	PORT_DIPNAME( 0x04, 0x04, "Auto Reach" )                   PORT_DIPLOCATION("SW5:3")
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x08, 0x00, "Double Bet" )                   PORT_DIPLOCATION("SW5:4")
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x10, 0x00, DEF_STR(Demo_Sounds) )           PORT_DIPLOCATION("SW5:5")
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x20, 0x00, "In-Game Music" )                PORT_DIPLOCATION("SW5:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x40, "Gal Select" )                   PORT_DIPLOCATION("SW5:7")
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x00, "Girls" )                        PORT_DIPLOCATION("SW5:8")
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("FAKE")  /* IN10 - Fake DSW */
	PORT_DIPNAME( 0xff, 0xff, "Allow Bets" )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0xff, DEF_STR( On ) )
INPUT_PORTS_END


static INPUT_PORTS_START( majxtal7 )
	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT )                      PORT_CONDITION("DSW0", 0x40, EQUALS, 0x00) // Pay
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_KEYOUT )                      PORT_CONDITION("DSW0", 0x40, EQUALS, 0x40)
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )                                                                       // 18B
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )                                                                       // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )                                                                   // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET )                                                                  // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BILL1 )         PORT_CODE(KEYCODE_6)                                            // Note
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )                                                                         // Coin
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_SERVICE1 )                                                                      // Service

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )

	PORT_START("DSW0")  /* select = 00 */
	MAHJONG_ODDS_RATE(0, "DIP2:1,2")
	MAHJONG_COINAGE(2, "DIP2:3,4")
	PORT_DIPNAME( 0x30, 0x30, "Minimum Bet" )                  PORT_DIPLOCATION("DIP2:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "2" )
	PORT_DIPSETTING(    0x10, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPNAME( 0x40, 0x40, "Payout Mode" )                  PORT_DIPLOCATION("DIP2:7")
	PORT_DIPSETTING(    0x40, "Key-out" )
	PORT_DIPSETTING(    0x00, "Hopper" )
	PORT_DIPNAME( 0x80, 0x80, "Hopper Polarity" )              PORT_DIPLOCATION("DIP2:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Normal) )
	PORT_DIPSETTING(    0x00, "Inverted" )

	PORT_START("DSW1") /* select = 40  */
	MAHJONG_PAYOUT_RATE(0, "DIP1:1,2,3,4")
	PORT_DIPNAME( 0x30, 0x10, "Maximum Bet" )                  PORT_DIPLOCATION("DIP1:5,6")
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x00, "20" )
	MAHJONG_NOTE_CREDITS(6, "DIP1:7", "DSW0", 2)
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )           PORT_DIPLOCATION("DIP1:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("DSW2") /* select = 80 */
	MAHJONG_YAKUMAN_BONUS(0, 0x04, "DIP3:1,2,3")
	PORT_DIPNAME( 0x08, 0x08, "Yakuman Bonuses Per Cycle" )    PORT_DIPLOCATION("DIP3:4")
	PORT_DIPSETTING(    0x08, "1" )
	PORT_DIPSETTING(    0x00, "2" )
	PORT_DIPNAME( 0x10, 0x10, "Win Rate?" )                    PORT_DIPLOCATION("DIP3:5")
	PORT_DIPSETTING(    0x10, DEF_STR( High ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Low ) )
	PORT_DIPNAME( 0x20, 0x20, DEF_STR(Unknown) )               PORT_DIPLOCATION("DIP3:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x00, "Don Den Button" )               PORT_DIPLOCATION("DIP3:7")
	PORT_DIPSETTING(    0x40, "A" )
	PORT_DIPSETTING(    0x00, "Flip Flop" )
	PORT_DIPNAME( 0x80, 0x80, "Game Title" )                   PORT_DIPLOCATION("DIP3:8")
	PORT_DIPSETTING(    0x80, "Mahjong X-tal 7" )
	PORT_DIPSETTING(    0x00, "Mahjong Diamond 7" )

	PORT_START("DSW3") /* select = c0 */
	PORT_DIPNAME( 0x01, 0x01, "Last Chance" )                  PORT_DIPLOCATION("DIP4:1")
	PORT_DIPSETTING(    0x01, "Free" )
	PORT_DIPSETTING(    0x00, "Paid" )
	PORT_DIPNAME( 0x02, 0x02, "Renchan Rate" )                 PORT_DIPLOCATION("DIP4:2")
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x04, 0x04, "Auto Reach" )                   PORT_DIPLOCATION("DIP4:3")
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x08, 0x08, DEF_STR(Unknown) )               PORT_DIPLOCATION("DIP4:4")
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )
	PORT_DIPSETTING(    0x08, DEF_STR(On) )
	PORT_DIPNAME( 0x10, 0x00, DEF_STR(Demo_Sounds) )           PORT_DIPLOCATION("DIP4:5")
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x20, 0x00, "In-Game Music" )                PORT_DIPLOCATION("DIP4:6")
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x40, 0x40, "Gal Select" )                   PORT_DIPLOCATION("DIP4:7")
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x00, DEF_STR(Unknown) )               PORT_DIPLOCATION("DIP4:8")
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("FAKE")  /* IN10 - Fake DSW */
	PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unknown ) )
	PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
	PORT_DIPSETTING(    0xff, DEF_STR( On ) )

	/* the following are needed to make happy the read handlers shared with mjelctrn */
	PORT_START("SW1")
INPUT_PORTS_END

static INPUT_PORTS_START( neruton )
	PORT_START("DSW0") /* 6a77 (select = 00) */
	PORT_DIPNAME( 0x07, 0x07, "Game Clock Start" )              PORT_DIPLOCATION("SW. 2:1,2,3")   // ゲーム時計スタート
	PORT_DIPSETTING(    0x07, "08:30" )                                                           // 　８時３０分
	PORT_DIPSETTING(    0x06, "09:00" )                                                           // 　９時００分
	PORT_DIPSETTING(    0x05, "09:30" )                                                           // 　９時３０分
	PORT_DIPSETTING(    0x04, "10:00" )                                                           // １０時００分
	PORT_DIPSETTING(    0x03, "10:30" )                                                           // １０時３０分
	PORT_DIPSETTING(    0x02, "11:00" )                                                           // １１時００分
	PORT_DIPSETTING(    0x01, "11:30" )                                                           // １１時３０分
	PORT_DIPSETTING(    0x00, "12:00" )                                                           // １２時００分
	PORT_DIPNAME( 0x08, 0x00, "Time Service" )                  PORT_DIPLOCATION("SW. 2:4")       // タイム－サービス（時間等によりできる秘技）
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り               (allows secret techniques depending on the time)
	PORT_DIPNAME( 0x10, 0x10, "Gal H Pose" )                    PORT_DIPLOCATION("SW. 2:5")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x00, DEF_STR(Off) )   // shows moles on gals' faces
	PORT_DIPSETTING(    0x10, DEF_STR(On) )    // win sequences show more "interaction" with gals
	PORT_DIPNAME( 0x20, 0x20, DEF_STR(Unknown) )                PORT_DIPLOCATION("SW. 2:6")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x00, "30" )
	PORT_DIPSETTING(    0x20, "60" )
	PORT_DIPNAME( 0x40, 0x40, "Computer Hand Always Open" )     PORT_DIPLOCATION("SW. 2:7")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Service_Mode) )           PORT_DIPLOCATION("SW. 2:8")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_START("DSW1")  /* 6a76 (select = 40) */
	PORT_DIPNAME( 0x03, 0x03, DEF_STR(Coinage) )                PORT_DIPLOCATION("SW. 1:1,2")     // プレイ料金
	PORT_DIPSETTING(    0x00, DEF_STR(3C_1C) )                                                    // ３コイン　１プレイ
	PORT_DIPSETTING(    0x02, DEF_STR(2C_1C) )                                                    // ２コイン　１プレイ
	PORT_DIPSETTING(    0x03, DEF_STR(1C_1C) )                                                    // １コイン　１プレイ
	PORT_DIPSETTING(    0x01, DEF_STR(1C_2C) )                                                    // １コイン　２プレイ
	PORT_DIPNAME( 0x04, 0x00, "Allow Pinfu with Tsumo")         PORT_DIPLOCATION("SW. 1:3")       // ルール　ピンフ・ツモ複合
	PORT_DIPSETTING(    0x04, DEF_STR(No) )                                                       // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有り
	PORT_DIPNAME( 0x38, 0x20, DEF_STR(Difficulty) )             PORT_DIPLOCATION("SW. 1:4,5,6")   // 難易度
	PORT_DIPSETTING(    0x38, "1 (Weak Computer)" )                                               // コンピューター　弱い　（１）
	PORT_DIPSETTING(    0x30, "2" )                                                               // 　　　　　　　　　　　（２）
	PORT_DIPSETTING(    0x28, "3" )                                                               // 　　　　　　　　　　　（３）
	PORT_DIPSETTING(    0x20, "4 (Normal)" )                                                      // 　　　　　　標準　　　（４）
	PORT_DIPSETTING(    0x18, "5" )                                                               // 　　　　　　　　　　　（５）
	PORT_DIPSETTING(    0x10, "6" )                                                               // 　　　　　　　　　　　（６）
	PORT_DIPSETTING(    0x08, "7" )                                                               // 　　　　　　　　　　　（７）
	PORT_DIPSETTING(    0x00, "8 (Strong Computer)" )                                             // コンピューター　強い　（８）
	PORT_DIPNAME( 0x40, 0x00, DEF_STR(Demo_Sounds ) )           PORT_DIPLOCATION("SW. 1:7")       // デモ・サウンド
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )                                                      // 無し
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有り
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW. 1:8")       // モニター画面反転
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                      // 正
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 逆

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )    // 17B
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )    // 18B
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test ))   // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )  // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET ) // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )    // 06B
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )  // Coin
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )    // 18A

	PORT_INCLUDE( mahjong_matrix_2p_ff )

	/* 2008-06 FP: the following are needed to make happy the read handlers shared with mjelctrn */
	PORT_START("SW1")
	PORT_START("DSW2")
	PORT_START("DSW3")
	PORT_START("FAKE")
INPUT_PORTS_END

static INPUT_PORTS_START( nerutona )
	PORT_INCLUDE(neruton)

	PORT_MODIFY("DSW0")
	PORT_DIPNAME( 0x10, 0x10, "Moles on Gals' Faces")           PORT_DIPLOCATION("SW. 2:5")       // ＯＦＦ固定
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )    // shows moles on gals' faces, but win sequences are not censored
INPUT_PORTS_END


static INPUT_PORTS_START( tenkai )
	// The manual provides two sets of standard settings:
	//       標準設定　シングル向け                        標準設定　コーナー向け
	// SW 1  OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF       OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF
	// SW 2  OFF OFF OFF OFF  ON  ON OFF  ON  ON  ON       OFF OFF OFF OFF OFF OFF OFF OFF  ON  ON
	// SW 3  OFF OFF  ON  ON  ON  ON  ON  ON OFF  ON       OFF OFF  ON  ON  ON  ON  ON  ON OFF  ON
	// SW 4  OFF  ON  ON  ON OFF OFF OFF OFF OFF OFF        ON  ON  ON  ON OFF OFF OFF OFF OFF OFF

	// The odds rate table entries correspond to the following hands:
	// * １ハン  1  han
	// * ２ハン  2  han
	// * ３ハン  3  han
	// * 満　貫  mangan
	// * 跳　満  haneman
	// * 倍　満  baiman
	// * 三倍満  sanbaiman
	// * 役　満  yakuman

	// Setting Gal Pose to Type B shows moles on the gals' faces, and inserts screens
	// in the stage 2 and 5 win animations implying that they've been censored by being
	// cut short.  However, the animations are complete - nothing shown for Type A is
	// actually cut.

	// There is an additional 4-switch bank (SW 5) for selecting the wiring options.

	PORT_START("DSW0")
	MAHJONG_PAYOUT_RATE(0, "SW 1:1,2,3,4")                                                        // ＰＡＹ－ＯＵＴ　ＲＡＴＥ
	MAHJONG_ODDS_RATE(4, "SW 1:5,6")                                                              // ＯＤＤＳ　ＲＡＴＥ
	PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" )                   PORT_DIPLOCATION("SW 1:7,8")      // ＢＥＴ－ＭＡＸ
	PORT_DIPSETTING(    0xc0, "1" )
	PORT_DIPSETTING(    0x80, "5" )
	PORT_DIPSETTING(    0x40, "10" )
	PORT_DIPSETTING(    0x00, "20" )

	PORT_START("DSW1")
	MAHJONG_COINAGE(0, "SW 2:1,2")                                                                // ＣＯＩＮ　ＲＡＴＥ
	PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" )                   PORT_DIPLOCATION("SW 2:3,4")      // ゲーム・スタート時の最低レート数
	PORT_DIPSETTING(    0x0c, "1" )                                                               // レート　１
	PORT_DIPSETTING(    0x08, "2" )                                                               // レート　２
	PORT_DIPSETTING(    0x04, "3" )                                                               // レート　３
	PORT_DIPSETTING(    0x00, "5" )                                                               // レート　５
	MAHJONG_YAKUMAN_BONUS(4, 0x04, "SW 2:5,6,7")                                                  // 役満ボーナスの設定周期
	PORT_DIPNAME( 0x80, 0x00, "Yakuman Bonuses Per Cycle" )     PORT_DIPLOCATION("SW 2:8")        // 役満ボーナスの回数設定周期毎に
	PORT_DIPSETTING(    0x00, "1" )                                                               // １回
	PORT_DIPSETTING(    0x80, "2" )                                                               // ２回

	PORT_START("DSW2")
	PORT_DIPNAME( 0x01, 0x01, "Payout Mode" )                   PORT_DIPLOCATION("SW 3:1")        // ゲーム・タイプ
	PORT_DIPSETTING(    0x01, "Key-out" )                                                         // クレジット・タイプ
	PORT_DIPSETTING(    0x00, "Hopper" )                                                          // ホッパー・タイプ
	PORT_DIPNAME( 0x02, 0x02, "Hopper Polarity" )               PORT_DIPLOCATION("SW 3:2")        // ホッパー・アクティブ
	PORT_DIPSETTING(    0x02, DEF_STR(Normal) )                                                   // 通常
	PORT_DIPSETTING(    0x00, "Inverted" )                                                        // 反転
	PORT_DIPNAME( 0x04, 0x00, "Tenkaigen Day" )                 PORT_DIPLOCATION("SW 3:3")        // 天開眼の日
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x08, 0x00, "Double Bet" )                    PORT_DIPLOCATION("SW 3:4")        // Ｗ－ＢＥＴ
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x10, 0x00, "Renchan Rate" )                  PORT_DIPLOCATION("SW 3:5")        // 連荘レート
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x20, 0x00, "Auto Reach" )                    PORT_DIPLOCATION("SW 3:6")        // オート・リーチ
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x40, 0x00, "Last Chance" )                   PORT_DIPLOCATION("SW 3:7")        // ラスト・チャンス
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x80, 0x00, "Don Den Button" )                PORT_DIPLOCATION("SW 3:8")        // Ｄｏｎ・Ｄｅｎ　機能ボタン変更
	PORT_DIPSETTING(    0x80, "Start" )                                                           // スタート・ボタ
	PORT_DIPSETTING(    0x00, "Flip Flop" )                                                       // Ｆ／Ｆ・ボタン

	PORT_START("DSW3")
	PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) )            PORT_DIPLOCATION("SW 4:1")        // デモ・サウンド
	PORT_DIPSETTING(    0x01, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x02, 0x00, "In-Game Music" )                 PORT_DIPLOCATION("SW 4:2")        // ゲーム・サウンド
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x04, 0x00, "Gal Select" )                    PORT_DIPLOCATION("SW 4:3")        // ギャル・セレクト
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x08, 0x00, "Gal Pose" )                      PORT_DIPLOCATION("SW 4:4")        // ギャル・ポーズ
	PORT_DIPSETTING(    0x00, "Type A" )                                                          // Ａタイプ
	PORT_DIPSETTING(    0x08, "Type B" )                                                          // Ｂタイプ
	PORT_DIPNAME( 0x10, 0x10, "Demo Message Language" )         PORT_DIPLOCATION("SW 4:5")        // デモメッセージ
	PORT_DIPSETTING(    0x10, DEF_STR(Japanese) )                                                 // 日本語メッセージ
	PORT_DIPSETTING(    0x00, DEF_STR(Taiwan) )                                                   // 台湾メッセージ
	PORT_DIPNAME( 0x20, 0x20, "SP Express Frequency" )          PORT_DIPLOCATION("SW 4:6")        // 特急便ＳＰの頻度
	PORT_DIPSETTING(    0x00, DEF_STR(Low) )                                                      // 少ない
	PORT_DIPSETTING(    0x20, DEF_STR(Normal) )                                                   // 普通
	PORT_DIPNAME( 0x40, 0x40, "Tenkaigen Day Frequency")        PORT_DIPLOCATION("SW 4:7")        // 天開眼の日頻度
	PORT_DIPSETTING(    0x00, DEF_STR(Low) )                                                      // 少ない
	PORT_DIPSETTING(    0x40, DEF_STR(Normal) )                                                   // 普通
	PORT_DIPNAME( 0x80, 0x80, "Time Settings Mode" )            PORT_DIPLOCATION("SW 4:8")        // 時間設定モード
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有

	PORT_START("DSW4")  /* (top) */
	MAHJONG_NOTE_CREDITS(0, "SW 1:9", "DSW1", 0)                                                  // ＮＯＴＥ　ＲＡＴＥ
	PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("SW 1:10")       // モニター画面反転
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )                                                      // 通常
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 反転
	PORT_DIPNAME( 0x04, 0x00, "Computer Strength" )             PORT_DIPLOCATION("SW 2:9")        // コンピューターの強さ
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) )                                                   // 普通
	PORT_DIPSETTING(    0x04, "Strong" )                                                          // 強い
	PORT_DIPNAME( 0x08, 0x00, "Service Count" )                 PORT_DIPLOCATION("SW 2:10")       // サービス・カウント
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x10, 0x10, "Don Den Count" )                 PORT_DIPLOCATION("SW 3:9")        // Ｄｏｎ・Ｄｅｎ　回数
	PORT_DIPSETTING(    0x00, "5 times" )                                                         // ５回
	PORT_DIPSETTING(    0x10, "8 times" )                                                         // ８回
	PORT_DIPNAME( 0x20, 0x00, "Show In-Game Clock" )            PORT_DIPLOCATION("SW 3:10")       // ゲーム中の時計表示
	PORT_DIPSETTING(    0x20, DEF_STR(No) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有
	PORT_DIPNAME( 0x40, 0x40, "Game Title" )                    PORT_DIPLOCATION("SW 4:9")        // ＯＦＦ固定
	PORT_DIPSETTING(    0x40, "Mahjong Tenkaigen" )
	PORT_DIPSETTING(    0x00, "Mahjong Tenkaigen Part 2" )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) )                PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x40) // ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, "Show Yakuman Table" )            PORT_DIPLOCATION("SW 4:10") PORT_CONDITION("DSW4", 0x40, EQUALS, 0x00)
	PORT_DIPSETTING(    0x80, DEF_STR(No) )
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )

	MAHJONG_COIN_TEST("DSW2", 0x01)

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
INPUT_PORTS_END


INPUT_PORTS_START( ougonhai )
	// The manual provides two sets of standard settings:
	//       標準設定　シングル向け                        標準設定　コーナー向け
	// SW 1  OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF       OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF
	// SW 2  OFF OFF OFF OFF  ON  ON OFF  ON  ON  ON       OFF OFF OFF OFF  ON OFF  ON  ON  ON  ON
	// SW 3  OFF OFF  ON  ON  ON  ON OFF OFF               OFF OFF OFF  ON  ON  ON  ON OFF
	// SW 4  OFF  ON  ON OFF OFF OFF OFF OFF                ON  ON  ON OFF OFF OFF OFF OFF

	// The manual implies SW 3 and SW 4 are banks of eight DIP switches, however
	// the board has pads for banks of ten DIP switches, and ten DIP switches
	// are shown in the input test.  Boards have been found populated with banks
	// of eight DIP switches or ten DIP switches.

	PORT_INCLUDE( tenkai )

	PORT_MODIFY("DSW2")
	PORT_DIPNAME( 0x04, 0x00, "Don Den Button" )                PORT_DIPLOCATION("SW 3:3")        // Ｄｏｎ・Ｄｅｎ　機能ボタン変更
	PORT_DIPSETTING(    0x04, "Start" )                                                           // スタート・ボタ
	PORT_DIPSETTING(    0x00, "Flip Flop" )                                                       // Ｆ／Ｆ・ボタン
	PORT_DIPNAME( 0x10, 0x00, "Auto Reach" )                    PORT_DIPLOCATION("SW 3:5")        // オート・リーチ
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x20, 0x00, "Slot Last Chance" )              PORT_DIPLOCATION("SW 3:6")        // スロット　ラスト・チャンス
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPNAME( 0x40, 0x40, "Show Yakuman Table" )            PORT_DIPLOCATION("SW 3:7")        // 役満ウインポイントの表示
	PORT_DIPSETTING(    0x40, DEF_STR(No) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有
	PORT_DIPNAME( 0x80, 0x80, "Gold Rush Payout Rate" )         PORT_DIPLOCATION("SW 3:8")        // ＧＯＬＤ　ＲＵＳＨ　出率
	PORT_DIPSETTING(    0x80, DEF_STR(Normal) )                                                   // 普通
	PORT_DIPSETTING(    0x00, DEF_STR(High) )                                                     // 多い

	PORT_MODIFY("DSW3")
	PORT_DIPNAME( 0x04, 0x00, "Show Renchan Gal" )              PORT_DIPLOCATION("SW 4:3")        // 連荘ギャル表示
	PORT_DIPSETTING(    0x04, DEF_STR(No) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(Yes) )                                                      // 有
	PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x08, "SW 4:4" )                                                // ＯＦＦ固定
	PORT_DIPNAME( 0x10, 0x10, DEF_STR(Language) )               PORT_DIPLOCATION("SW 4:5")        // ＯＦＦ固定
	PORT_DIPSETTING(    0x10, DEF_STR(Japanese) )
	PORT_DIPSETTING(    0x00, DEF_STR(Chinese) )
	PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW 4:6" )                                                // ＯＦＦ固定
	PORT_DIPNAME( 0x40, 0x40, DEF_STR(Service_Mode) )           PORT_DIPLOCATION("SW 4:7")        // ＯＦＦ固定
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, "Show Statistics (debug)" )       PORT_DIPLOCATION("SW 4:8" )       // ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	PORT_MODIFY("DSW4")
	PORT_DIPNAME( 0x08, 0x00, "Renchan Rate" )                  PORT_DIPLOCATION("SW 2:10")       // 連荘レート
	PORT_DIPSETTING(    0x08, DEF_STR(Off) )                                                      // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                       // 有
	PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x10, "SW 3:9" )                                                // not documented
	PORT_DIPUNKNOWN_DIPLOC( 0x20, 0x20, "SW 3:10" )                                               // not documented
	PORT_DIPUNKNOWN_DIPLOC( 0x40, 0x40, "SW 4:9" )                                                // not documented
	PORT_DIPUNKNOWN_DIPLOC( 0x80, 0x80, "SW 4:10" )                                               // not documented
INPUT_PORTS_END


static INPUT_PORTS_START( mjreach )
	// The manual provides two sets of standard settings:
	//       標準設定　シングル向け                        標準設定　メダルコーナー向け
	// SW 1  OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF       OFF OFF OFF  ON  ON  ON OFF  ON  ON OFF
	// SW 2  OFF OFF OFF OFF OFF OFF  ON  ON  ON  ON       OFF OFF OFF OFF  ON OFF OFF OFF  ON  ON

	PORT_START("DSW0")
	MAHJONG_PAYOUT_RATE(0, "DIP-SW1:1,2,3,4")
	MAHJONG_ODDS_RATE(4, "DIP-SW1:5,6")                                                            // ＯＤＤＳ 設定
	PORT_DIPNAME( 0xc0, 0x40, "Maximum Bet" )                   PORT_DIPLOCATION("DIP-SW1:7,8")    // ＢＥＴ ＭＡＸ
	PORT_DIPSETTING(    0xc0, "1" )
	PORT_DIPSETTING(    0x80, "5" )
	PORT_DIPSETTING(    0x40, "10" )
	PORT_DIPSETTING(    0x00, "20" )

	PORT_START("DSW1")
	MAHJONG_COINAGE(0, "DIP-SW2:1,2")                                                              // ＣＯＩＮ ＲＡＴＥ
	PORT_DIPNAME( 0x0c, 0x0c, "Minimum Bet" )                   PORT_DIPLOCATION("DIP-SW2:3,4")    // ゲーム・スタート時の最低レート数
	PORT_DIPSETTING(    0x0c, "1" )                                                                // レート１
	PORT_DIPSETTING(    0x08, "2" )                                                                // レート２
	PORT_DIPSETTING(    0x04, "3" )                                                                // レート３
	PORT_DIPSETTING(    0x00, "5" )                                                                // レート５
	MAHJONG_YAKUMAN_BONUS(4, 0x04, "DIP-SW2:5,6,7")                                                // 役満ボーナスチャンスの設定周期
	PORT_DIPNAME( 0x80, 0x00, "Yakuman Bonuses Per Cycle" )     PORT_DIPLOCATION("DIP-SW2:8")      // 役満ボーナスの回数設定周期毎に
	PORT_DIPSETTING(    0x00, "1" )                                                                // １回
	PORT_DIPSETTING(    0x80, "2" )                                                                // ２回

	PORT_START("DSW2")
	PORT_DIPNAME( 0x01, 0x01, "Payout Mode" )                   PORT_DIPLOCATION("DIP-SW3:1")      // ゲーム仕様
	PORT_DIPSETTING(    0x01, "Key-out" )                                                          // クレジット式
	PORT_DIPSETTING(    0x00, "Hopper" )                                                           // ホッパー式
	PORT_DIPNAME( 0x02, 0x02, "Hopper Polarity" )               PORT_DIPLOCATION("DIP-SW3:2")      // ホッパーアクティブ
	PORT_DIPSETTING(    0x02, DEF_STR(Normal) )                                                    // 通常
	PORT_DIPSETTING(    0x00, "Inverted" )                                                         // 反転
	PORT_DIPNAME( 0x04, 0x00, "Double Bet" )                    PORT_DIPLOCATION("DIP-SW3:3")      // Ｗ－ＢＥＴ機能
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x08, 0x00, "Computer Strength" )             PORT_DIPLOCATION("DIP-SW3:4")      // コンピューターの強さ
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) )                                                    // 普通
	PORT_DIPSETTING(    0x08, "Strong" )                                                           // 強い
	PORT_DIPNAME( 0x10, 0x00, "Renchan Rate" )                  PORT_DIPLOCATION("DIP-SW3:5")      // 連荘レート
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x20, 0x00, "Last Chance" )                   PORT_DIPLOCATION("DIP-SW3:6")      // ラストチャンス
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0xc0, 0x00, "Last Chance Count" )             PORT_DIPLOCATION("DIP-SW3:7,8")    // ラストチャンスのツモ回数
	PORT_DIPSETTING(    0xc0, "1" )
	PORT_DIPSETTING(    0x80, "3" )
	PORT_DIPSETTING(    0x00, "5" )
	PORT_DIPSETTING(    0x40, "10" )

	PORT_START("DSW3")
	PORT_DIPNAME( 0x01, 0x00, DEF_STR(Demo_Sounds) )            PORT_DIPLOCATION("DIP-SW4:1")      // デモ・サウンド
	PORT_DIPSETTING(    0x01, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x02, 0x00, "In-Game Music" )                 PORT_DIPLOCATION("DIP-SW4:2")      // ゲーム・サウンド
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x04, 0x00, "Auto Reach" )                    PORT_DIPLOCATION("DIP-SW4:3")      // オート・リーチ機能
	PORT_DIPSETTING(    0x04, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x08, 0x00, "Don Den Button" )                PORT_DIPLOCATION("DIP-SW4:4")      // Ｄｏｎ・Ｄｅｎ機能　ボタン変更
	PORT_DIPSETTING(    0x08, "Start" )                                                            // スタートボタン
	PORT_DIPSETTING(    0x00, "Flip Flop" )                                                        // Ｆ／Ｆボタン
	PORT_DIPNAME( 0x10, 0x00, "Show Renchan Gal" )              PORT_DIPLOCATION("DIP-SW4:5")      // 連荘ギャル表示
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x20, 0x00, "In-Game Messages" )              PORT_DIPLOCATION("DIP-SW4:6")      // ゲーム中のメッセージ
	PORT_DIPSETTING(    0x20, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有 (shows when kan/pon/chi/ron is possible)
	PORT_DIPNAME( 0x40, 0x00, DEF_STR(Unknown) )                PORT_DIPLOCATION("DIP-SW4:7")      // ＯＮ固定
	PORT_DIPSETTING(    0x40, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )
	PORT_DIPNAME( 0x80, 0x80, "Super Revolver Jackpot Payout Rate" ) PORT_DIPLOCATION("DIP-SW4:8") // スパーレボルバーのＪＡＣＫ－ＰＯＴの出率
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) )                                                    // 通常 (shows "super revolver" bonus game during attract mode)
	PORT_DIPSETTING(    0x80, "Frequent" )                                                         // よく出る

	PORT_START("DSW4")  /* 4 (top) */
	MAHJONG_NOTE_CREDITS(0, "DIP-SW1:9", "DSW1", 0)                                                // ＮＯＴＥ　ＲＡＴＥ
	PORT_DIPNAME( 0x02, 0x02, DEF_STR(Flip_Screen) )            PORT_DIPLOCATION("DIP-SW1:10")     // モニター画面反転
	PORT_DIPSETTING(    0x02, DEF_STR(Off) )                                                       // 通常
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 反転
	PORT_DIPNAME( 0x0c, 0x08, "Credit Limit" )                  PORT_DIPLOCATION("DIP-SW2:9,10")   // クレジット・コインリミット
	PORT_DIPSETTING(    0x0c, "300" )
	PORT_DIPSETTING(    0x08, "500" )
	PORT_DIPSETTING(    0x04, "700" )
	PORT_DIPSETTING(    0x00, "1000" )
	PORT_DIPNAME( 0x10, 0x00, "Super Revolver" )                PORT_DIPLOCATION("DIP-SW3:9")      // スパーレボルバー
	PORT_DIPSETTING(    0x10, DEF_STR(Off) )                                                       // 無
	PORT_DIPSETTING(    0x00, DEF_STR(On) )                                                        // 有
	PORT_DIPNAME( 0x20, 0x00, "Payout Variation" )              PORT_DIPLOCATION("DIP-SW3:10")     // 配当の波
	PORT_DIPSETTING(    0x20, "Small" )                                                            // 小さい
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) )                                                    // 通常
	PORT_DIPNAME( 0x40, 0x40, "Renchan Gal Display" )           PORT_DIPLOCATION("DIP-SW4:9")      // 連荘ギャルの表示の方式
	PORT_DIPSETTING(    0x40, "After Every Win" )                                                  // 勝つごとに表示 (= On according to manual page?)
	PORT_DIPSETTING(    0x00, "After 3 Consecutive Wins" )                                         // ３連荘のみ表示 (= Off according to manual page?)
	PORT_DIPNAME( 0x80, 0x80, DEF_STR(Unknown) )                PORT_DIPLOCATION("DIP-SW4:10")     // ＯＦＦ固定
	PORT_DIPSETTING(    0x80, DEF_STR(Off) )
	PORT_DIPSETTING(    0x00, DEF_STR(On) )

	MAHJONG_COIN_TEST("DSW2", 0x01)

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
INPUT_PORTS_END

static INPUT_PORTS_START( gekisha )
	PORT_START("DSW1") // $7C20
	MAHJONG_PAYOUT_RATE(0, "SW1:1,2,3,4") // ＰＡＹ－ＯＵＴ　ＲＡＴＥ
	PORT_DIPNAME( 0x30, 0x30, "Max Bet" ) PORT_DIPLOCATION( "SW1:5,6" ) // ＢＥＴ－ＭＡＸ
	PORT_DIPSETTING(    0x30, "1" )
	PORT_DIPSETTING(    0x20, "5" )
	PORT_DIPSETTING(    0x10, "10" )
	PORT_DIPSETTING(    0x00, "20" )
	PORT_DIPNAME( 0x40, 0x40, "Credits Per Note" ) PORT_DIPLOCATION( "SW1:7" ) // ＮＯＴＥ　ＲＡＴＥ
	PORT_DIPSETTING(    0x40, "5" )
	PORT_DIPSETTING(    0x00, "10" )
	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION( "SW1:8" ) // 画面反転
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("DSW2") // $7C21
	MAHJONG_ODDS_RATE(0, "SW2:1,2") // ＯＤＤＳ　ＲＡＴＥ
	MAHJONG_COINAGE(2, "SW2:3,4") // コイン レート
	PORT_DIPNAME( 0x30, 0x30, "Min Rate To Play" ) PORT_DIPLOCATION( "SW2:5,6" ) // ゲーム・スタートの最低レート枚数
	PORT_DIPSETTING(    0x30, "1" ) // レート　１
	PORT_DIPSETTING(    0x20, "2" ) // レート　２
	PORT_DIPSETTING(    0x10, "3" ) // レート　３
	PORT_DIPSETTING(    0x00, "5" ) // レート　５
	PORT_DIPNAME( 0x40, 0x40, "Game Type" ) PORT_DIPLOCATION( "SW2:7" ) // ゲームタイプ
	PORT_DIPSETTING(    0x40, "Credit" ) // クレジット式
	PORT_DIPSETTING(    0x00, "Hopper" ) // ホッパー式
	PORT_DIPNAME( 0x80, 0x80, "Hopper Switch" ) PORT_DIPLOCATION( "SW2:8" ) // ＨＯＰＰＥＲ　ＣＯＩＮ　感覚　ＳＷ
	PORT_DIPSETTING(    0x80, "Active Low" )
	PORT_DIPSETTING(    0x00, "Active High" )

	PORT_START("DSW3")  // $7c22
	MAHJONG_YAKUMAN_BONUS(0, 0x04, "SW3:1,2,3") // 役満ボーナスの設定
	PORT_DIPNAME( 0x08, 0x08, "Yakuman Bonuses Per Cycle" ) PORT_DIPLOCATION("SW3:4")// 役満ボーナスの回数設定周期毎に
	PORT_DIPSETTING(    0x08, "1" ) // １回
	PORT_DIPSETTING(    0x00, "2" ) // ２回
	PORT_DIPNAME( 0x10, 0x00, "Computer Strength" ) PORT_DIPLOCATION("SW3:5") // コンピューターの強さ
	PORT_DIPSETTING(    0x00, DEF_STR(Normal) ) // 普通
	PORT_DIPSETTING(    0x10, "Strong" )
	PORT_DIPNAME( 0x20, 0x20, "Payout Rate Change" ) PORT_DIPLOCATION( "SW3:6" ) // 自動配当率変更
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x00, "Service Count" ) PORT_DIPLOCATION( "SW3:7" ) // サービスカウント
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, "DonDen Key" ) PORT_DIPLOCATION( "SW3:8" ) // ＤｏｎＤｅｎ機能ボタン変更
	PORT_DIPSETTING(    0x80, "A" )
	PORT_DIPSETTING(    0x00, "Flip Flop" )

	PORT_START("DSW4")  // $7c23
	PORT_DIPNAME( 0x01, 0x01, "Last Chance" ) PORT_DIPLOCATION( "SW4:1" ) // ラスト チャンス
	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x02, 0x02, "Dice Chance" ) PORT_DIPLOCATION( "SW4:2" ) // ダイス チャンス
	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x04, 0x04, "Auto Tsumo after Reach" ) PORT_DIPLOCATION( "SW4:3" ) // オート ツモ
	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x08, 0x08, "Double Bet" ) PORT_DIPLOCATION( "SW4:4" ) // Ｗ－ＢＥＴ
	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x10, 0x10, "Girls (Demo)" ) PORT_DIPLOCATION( "SW4:5" ) // ギャル カット
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x10, DEF_STR( Yes ) )
	PORT_DIPNAME( 0x20, 0x20, "Girls (H-Scenes)" ) PORT_DIPLOCATION( "SW4:6" ) // ギャル Ｈカット
	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x40, 0x00, DEF_STR( Demo_Sounds ) ) PORT_DIPLOCATION( "SW4:7" ) // デモ サウンド
	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
	PORT_DIPNAME( 0x80, 0x80, "Unknown 4-7" ) PORT_DIPLOCATION( "SW4:8" )
	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
	PORT_DIPSETTING(    0x00, DEF_STR( On ) )

	PORT_START("BET")
	PORT_DIPNAME( 0x40, 0x40, "Bet" )
	PORT_DIPSETTING(    0x00, DEF_STR( No ) )
	PORT_DIPSETTING(    0x40, DEF_STR( Yes ) )

	PORT_START("COINS")
	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_GAMBLE_PAYOUT ) // Pay
	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE )       // Test
	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_GAMBLE_BOOK )   // Analyzer
	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MEMORY_RESET )  // Memory Reset
	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN2 )         // Note
	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN1 )         // Coin
	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )

	PORT_INCLUDE( mahjong_matrix_2p_bet_wup )
INPUT_PORTS_END


/***************************************************************************


                                Machine Drivers


***************************************************************************/

void dynax_state::machine_start()
{
	m_blitter_irq_mask = 1;

	save_item(NAME(m_blitter_irq_mask));

	save_item(NAME(m_input_sel));
	save_item(NAME(m_input_mode));
	save_item(NAME(m_dsw_sel));
	save_item(NAME(m_keyb));
	save_item(NAME(m_palbank));
	save_item(NAME(m_rombank));
	save_item(NAME(m_tenkai_p5_val));
	save_item(NAME(m_tenkai_6c));
	save_item(NAME(m_tenkai_70));
	save_item(NAME(m_gekisha_val));
	save_item(NAME(m_palette_ram));
}

void dynax_state::machine_reset()
{
	m_input_sel = 0;
	m_input_mode = 0;
	m_dsw_sel = 0;
	m_keyb = 0;
	m_palbank = 0;
	m_rombank = 0;
	m_tenkai_p5_val = 0;
	m_tenkai_6c = 0;
	m_tenkai_70 = 0;
	m_gekisha_val[0] = 0;
	m_gekisha_val[1] = 0;

	std::fill(std::begin(m_palette_ram), std::end(m_palette_ram), 0);
}

MACHINE_START_MEMBER(dynax_state, sprtmtch)
{
	uint8_t *ROM = memregion("maincpu")->base();
	membank("bank1")->configure_entries(0, 0x10, &ROM[0x8000], 0x8000);

	machine_start();
}

void dynax_adpcm_state::machine_start()
{
	dynax_state::machine_start();

	save_item(NAME(m_msm5205next));
	save_item(NAME(m_resetkludge));
	save_item(NAME(m_toggle));
}

void dynax_adpcm_state::machine_reset()
{
	dynax_state::machine_reset();

	m_msm5205next = 0;
	m_resetkludge = 0;
	m_toggle = 0;

	// start with the MSM5205 reset
	m_msm->reset_w(1);
}

MACHINE_START_MEMBER(dynax_adpcm_state, hjingi)
{
	uint8_t *ROM = memregion("maincpu")->base();
	membank("bank1")->configure_entries(0, 0x10, &ROM[0x0000], 0x8000);

	machine_start();
}

MACHINE_START_MEMBER(dynax_adpcm_state, hanamai)
{
	uint8_t *ROM = memregion("maincpu")->base();
	membank("bank1")->configure_entries(0, 0x10, &ROM[0x8000], 0x8000);

	machine_start();
}

/***************************************************************************
                                Castle Of Dracula
***************************************************************************/

void cdracula_state::cdracula(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, XTAL(21'477'272)/4); /* 5.3693175MHz measured */
	m_maincpu->set_addrmap(AS_PROGRAM, &cdracula_state::cdracula_mem_map);
	m_maincpu->set_addrmap(AS_IO, &cdracula_state::cdracula_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));  // IM 0 needs an opcode on the data bus

//  NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);    // no battery

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);

	LS259(config, m_mainlatch);
	m_mainlatch->q_out_cb<1>().set(FUNC(cdracula_state::flipscreen_w));       // Flip Screen
	m_mainlatch->q_out_cb<4>().set(FUNC(cdracula_state::blitter_ack_w));      // Blitter IRQ Ack
	m_mainlatch->q_out_cb<5>().set(FUNC(cdracula_state::blit_palbank_w));     // Layers Palettes (High Bit)

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(58.56);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256);
	m_screen->set_visarea(16, 512-16-1, 16, 256-1);
	m_screen->set_screen_update(FUNC(cdracula_state::screen_update_cdracula));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(cdracula_state::sprtmtch_vblank_w));

	cdracula_blitter_device &blitter(CDRACULA_BLITTER(config, m_blitter));
	blitter.vram_out_cb().set(FUNC(cdracula_state::cdracula_blit_pixel_w));
	blitter.scrollx_cb().set(FUNC(cdracula_state::dynax_blit_scrollx_w));
	blitter.scrolly_cb().set(FUNC(cdracula_state::dynax_blit_scrolly_w));
	blitter.ready_cb().set(FUNC(cdracula_state::sprtmtch_blitter_irq_w));
	blitter.blit_dest_cb().set(FUNC(cdracula_state::dynax_blit_dest_w));

	PALETTE(config, m_palette, FUNC(cdracula_state::sprtmtch_palette), 512); // static palette
	MCFG_VIDEO_START_OVERRIDE(cdracula_state,hanamai)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	OKIM6295(config, m_oki, XTAL(4'000'000) / 4, okim6295_device::PIN7_HIGH); /* 1MHz measured */
	m_oki->add_route(ALL_OUTPUTS, "mono", 0.80);
}


/***************************************************************************
                                Hana no Mai
***************************************************************************/

void dynax_adpcm_state::hanamai(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, 22000000 / 4);   /* 5.5MHz */
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::sprtmtch_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::hanamai_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));   // IM 0 needs an opcode on the data bus

	MCFG_MACHINE_START_OVERRIDE(dynax_adpcm_state, hanamai)

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);

	LS259(config, m_mainlatch);
	m_mainlatch->q_out_cb<0>().set(m_msm, FUNC(msm5205_device::reset_w)).invert();  // MSM5205 reset
	m_mainlatch->q_out_cb<0>().append(FUNC(dynax_adpcm_state::adpcm_reset_kludge_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_adpcm_state::flipscreen_w));       // Flip Screen
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_adpcm_state::coincounter_0_w));    // Coin Counters
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_adpcm_state::coincounter_1_w));    //
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_adpcm_state::blitter_ack_w));      // Blitter IRQ Ack
	m_mainlatch->q_out_cb<6>().set(FUNC(dynax_adpcm_state::blit_palbank_w));     // Layers Palettes (High Bit)
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_adpcm_state::layer_half_w));       // half of the interleaved layer to write to

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256);
	m_screen->set_visarea(0, 512-1-4, 16+8, 255-8);
	m_screen->set_screen_update(FUNC(dynax_adpcm_state::screen_update_hanamai));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(dynax_adpcm_state::sprtmtch_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_adpcm_state::hanamai_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(dynax_adpcm_state::sprtmtch_blitter_irq_w));

	PALETTE(config, m_palette, FUNC(dynax_adpcm_state::sprtmtch_palette), 512); // static palette
	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state,hanamai)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	AY8912(config, "aysnd", 22000000 / 8).add_route(ALL_OUTPUTS, "mono", 0.20);

	ym2203_device &ym2203(YM2203(config, "ym2203", 22000000 / 8));
	ym2203.irq_handler().set("mainirq", FUNC(rst_pos_buffer_device::rst1_w));
	ym2203.port_a_read_callback().set_ioport("DSW1");
	ym2203.port_b_read_callback().set_ioport("DSW0");
	ym2203.add_route(0, "mono", 0.20);
	ym2203.add_route(1, "mono", 0.20);
	ym2203.add_route(2, "mono", 0.20);
	ym2203.add_route(3, "mono", 0.50);

	MSM5205(config, m_msm, 384000);
	m_msm->vck_legacy_callback().set(FUNC(dynax_adpcm_state::adpcm_int));     /* IRQ handler */
	m_msm->set_prescaler_selector(msm5205_device::S48_4B);  /* 8 KHz, 4 Bits  */
	m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
}



/***************************************************************************
                                Hana Oriduru
***************************************************************************/

void dynax_adpcm_state::hnoridur(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, XTAL(22'000'000) / 4);   /* 5.5MHz */
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::hnoridur_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::hnoridur_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));   // IM 0 needs an opcode on the data bus

	ADDRESS_MAP_BANK(config, m_bankdev).set_map(&dynax_adpcm_state::hnoridur_banked_map).set_data_width(8).set_addr_width(20).set_stride(0x8000);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);

	LS259(config, m_mainlatch); // IC25
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_adpcm_state::flipscreen_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_adpcm_state::layer_half_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_adpcm_state::layer_half2_w));
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_adpcm_state::blitter_ack_w));

	ls259_device &outlatch(LS259(config, "outlatch")); // IC61
	outlatch.q_out_cb<0>().set(FUNC(dynax_adpcm_state::coincounter_0_w));
	outlatch.q_out_cb<1>().set(FUNC(dynax_adpcm_state::coincounter_1_w));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256+22);
	m_screen->set_visarea(0, 512-1-4, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_adpcm_state::screen_update_hnoridur));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(dynax_adpcm_state::sprtmtch_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_adpcm_state::hnoridur_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(dynax_adpcm_state::sprtmtch_blitter_irq_w));

	PALETTE(config, m_palette).set_entries(16*256);

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state,hnoridur)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ay8912_device &ay8912(AY8912(config, "aysnd", XTAL(22'000'000) / 16));
	ay8912.port_a_read_callback().set_ioport("DSW0");
	ay8912.add_route(ALL_OUTPUTS, "mono", 0.20);

	YM2413(config, "ym2413", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);

	MSM5205(config, m_msm, XTAL(384'000));
	m_msm->vck_legacy_callback().set(FUNC(dynax_adpcm_state::adpcm_int)); /* IRQ handler */
	m_msm->set_prescaler_selector(msm5205_device::S48_4B);  /* 8 KHz, 4 Bits  */
	m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
}


/***************************************************************************
                                Hana Jingi
***************************************************************************/

void dynax_adpcm_state::hjingi(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, XTAL(22'000'000) / 4);
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::hjingi_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::hjingi_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));   // IM 0 needs an opcode on the data bus

	MCFG_MACHINE_START_OVERRIDE(dynax_adpcm_state, hjingi)

	ADDRESS_MAP_BANK(config, m_bankdev).set_map(&dynax_adpcm_state::hjingi_banked_map).set_data_width(8).set_addr_width(20).set_stride(0x8000);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);

	LS259(config, m_mainlatch);
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_adpcm_state::flipscreen_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_adpcm_state::layer_half_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_adpcm_state::layer_half2_w));
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_adpcm_state::blitter_ack_w));

	ls259_device &outlatch(LS259(config, "outlatch"));
	outlatch.q_out_cb<0>().set(FUNC(dynax_adpcm_state::coincounter_0_w));
	outlatch.q_out_cb<1>().set(FUNC(dynax_adpcm_state::coincounter_1_w));
	outlatch.q_out_cb<2>().set(m_hopper, FUNC(hopper_device::motor_w));
	outlatch.q_out_cb<3>().set(FUNC(dynax_adpcm_state::hjingi_lockout_w));

	HOPPER(config, m_hopper, attotime::from_msec(50));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256);
	m_screen->set_visarea(0, 512-1-4, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_adpcm_state::screen_update_hnoridur));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(dynax_adpcm_state::sprtmtch_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_adpcm_state::hnoridur_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_adpcm_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(dynax_adpcm_state::sprtmtch_blitter_irq_w));

	PALETTE(config, m_palette).set_entries(16*256);

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state,hnoridur)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ay8912_device &ay8912(AY8912(config, "aysnd", XTAL(22'000'000) / 16));
	ay8912.port_a_read_callback().set_ioport("DSW0");
	ay8912.add_route(ALL_OUTPUTS, "mono", 0.20);

	YM2413(config, "ym2413", XTAL(3'579'545)).add_route(ALL_OUTPUTS, "mono", 1.0);

	MSM5205(config, m_msm, XTAL(384'000));
	m_msm->vck_legacy_callback().set(FUNC(dynax_adpcm_state::adpcm_int));     /* IRQ handler */
	m_msm->set_prescaler_selector(msm5205_device::S48_4B);  /* 8 KHz, 4 Bits  */
	m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);
}


/***************************************************************************
                                Sports Match
***************************************************************************/

void dynax_state::sprtmtch(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, 22000000 / 4);   /* 5.5MHz */
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::sprtmtch_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_state::sprtmtch_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));   // IM 0 needs an opcode on the data bus

	MCFG_MACHINE_START_OVERRIDE(dynax_state, sprtmtch)

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);

	LS259(config, m_mainlatch); // UF12 on Intergirl
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_state::flipscreen_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::coincounter_0_w));
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_state::coincounter_1_w));
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_state::blitter_ack_w));
	m_mainlatch->q_out_cb<5>().set(FUNC(dynax_state::blit_palbank_w));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256);
	m_screen->set_visarea(0, 512-1, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_state::screen_update_sprtmtch));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(dynax_state::sprtmtch_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_state::drgpunch_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(dynax_state::sprtmtch_blitter_irq_w));

	PALETTE(config, m_palette, FUNC(dynax_state::sprtmtch_palette), 512); // static palette
	MCFG_VIDEO_START_OVERRIDE(dynax_state,sprtmtch)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ym2203_device &ym2203(YM2203(config, "ym2203", 22000000 / 8));
	ym2203.irq_handler().set("mainirq", FUNC(rst_pos_buffer_device::rst1_w));
	ym2203.port_a_read_callback().set_ioport("DSW0");
	ym2203.port_b_read_callback().set_ioport("DSW1");
	ym2203.add_route(0, "mono", 0.20);
	ym2203.add_route(1, "mono", 0.20);
	ym2203.add_route(2, "mono", 0.20);
	ym2203.add_route(3, "mono", 1.0);
}


/***************************************************************************
                            Mahjong Friday
***************************************************************************/

void dynax_state::mjfriday_vblank_w(int state)
{
	if (state)
		m_maincpu->set_input_line(0, HOLD_LINE);
}

void dynax_state::mjfriday(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, 24000000/4);  /* 6 MHz? */
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::sprtmtch_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_state::mjfriday_io_map);

	MCFG_MACHINE_START_OVERRIDE(dynax_state, sprtmtch)

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	LS259(config, m_mainlatch); // IC15
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::mjdialq2_blit_dest1_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_state::mjdialq2_blit_dest0_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::blit_palbank_w));
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_state::flipscreen_w));
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_state::coincounter_0_w));
	m_mainlatch->q_out_cb<5>().set(FUNC(dynax_state::coincounter_1_w));
	m_mainlatch->q_out_cb<6>().set(FUNC(dynax_state::mjdialq2_layer1_enable_w));
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_state::mjdialq2_layer0_enable_w));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(256, 256);
	m_screen->set_visarea(0, 256-1, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_state::screen_update_mjdialq2));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(FUNC(dynax_state::mjfriday_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_state::mjdialq2_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_state::dynax_blit_scrolly_w));
	// No blitter IRQ

	PALETTE(config, m_palette, FUNC(dynax_state::sprtmtch_palette), 512); // static palette
	MCFG_VIDEO_START_OVERRIDE(dynax_state,mjdialq2)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	YM2413(config, "ym2413", 24000000/6).add_route(ALL_OUTPUTS, "mono", 1.0);
}


/***************************************************************************
                            Mahjong Dial Q2
***************************************************************************/

void dynax_state::mjdialq2(machine_config &config)
{
	mjfriday(config);

	/* basic machine hardware */
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::mjdialq2_mem_map);
}


/***************************************************************************
                    Yarunara / Quiz TV Q&Q / Mahjong Angels
***************************************************************************/

void dynax_adpcm_state::yarunara(machine_config &config)
{
	hnoridur(config);

	// basic machine hardware
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::yarunara_io_map);

	m_bankdev->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::yarunara_banked_map);

	config.device_remove("outlatch"); // ???

	m_screen->set_visarea(0, 336-1, 8, 256-1-8-1);

	// devices
	MSM6242(config, "rtc", 32.768_kHz_XTAL).out_int_handler().set(m_mainirq, FUNC(rst_pos_buffer_device::rst1_w));
}

void dynax_adpcm_state::mjangels(machine_config &config)
{
	yarunara(config);

	m_bankdev->set_map(&dynax_adpcm_state::mjangels_banked_map).set_addr_width(21);
}

void dynax_adpcm_state::quiztvqq(machine_config &config)
{
	mjangels(config);

	// basic machine hardware
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::quiztvqq_mem_map);
}


/***************************************************************************
                            Mahjong Campus Hunting
***************************************************************************/

void dynax_adpcm_state::mcnpshnt(machine_config &config)
{
	hnoridur(config);

	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::mcnpshnt_io_map);

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state, mcnpshnt) // different priorities
}


/***************************************************************************
                            7jigen
***************************************************************************/

void dynax_adpcm_state::nanajign(machine_config &config)
{
	hnoridur(config);

	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::nanajign_io_map);

	m_bankdev->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::nanajign_banked_map);
}


/***************************************************************************
                                Jantouki
***************************************************************************/

// dual monitor, 2 CPU's, 2 blitters

void jantouki_state::machine_start()
{
	uint8_t *MAIN = memregion("maincpu")->base();
	uint8_t *SOUND = memregion("soundcpu")->base();

	membank("bank1")->configure_entries(0, 0x10, &MAIN[0x8000],  0x8000);
	m_soundbank->configure_entries(0, 12,   &SOUND[0x8000], 0x8000);

	dynax_adpcm_state::machine_start();

	m_blitter2_irq_mask = 1;

	save_item(NAME(m_blitter2_irq_mask));

	save_item(NAME(m_toggle_cpu1));
}

void jantouki_state::machine_reset()
{
	dynax_adpcm_state::machine_reset();

	m_toggle_cpu1 = 0;
}


void jantouki_state::jantouki(machine_config &config)
{
	/* basic machine hardware */
	Z80(config, m_maincpu, 22000000 / 8);   /* 2.75MHz */
	m_maincpu->set_addrmap(AS_PROGRAM, &jantouki_state::jantouki_mem_map);
	m_maincpu->set_addrmap(AS_IO, &jantouki_state::jantouki_io_map);
	m_maincpu->set_irq_acknowledge_callback("mainirq", FUNC(rst_pos_buffer_device::inta_cb));   // IM 0 needs an opcode on the data bus

	Z80(config, m_soundcpu, 22000000 / 8);  /* 2.75MHz */
	m_soundcpu->set_addrmap(AS_PROGRAM, &jantouki_state::jantouki_sound_mem_map);
	m_soundcpu->set_addrmap(AS_IO, &jantouki_state::jantouki_sound_io_map);
	m_soundcpu->set_irq_acknowledge_callback("soundirq", FUNC(rst_pos_buffer_device::inta_cb)); // IM 0 needs an opcode on the data bus

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	RST_POS_BUFFER(config, m_mainirq).int_callback().set_inputline(m_maincpu, 0);
	RST_POS_BUFFER(config, m_soundirq).int_callback().set_inputline(m_soundcpu, 0);

	LS259(config, m_mainlatch);
	m_mainlatch->q_out_cb<0>().set(FUNC(jantouki_state::coincounter_0_w));  // Coin Counter
	m_mainlatch->q_out_cb<3>().set(FUNC(jantouki_state::blit2_palbank_w));  // Layers Palettes (High Bit)
	m_mainlatch->q_out_cb<5>().set(FUNC(jantouki_state::blit_palbank_w));
	m_mainlatch->q_out_cb<6>().set(FUNC(jantouki_state::jantouki_blitter_ack_w)); // Blitter IRQ Ack
	m_mainlatch->q_out_cb<7>().set(FUNC(jantouki_state::jantouki_blitter2_ack_w));    // Blitter 2 IRQ Ack

	GENERIC_LATCH_8(config, m_soundlatch);
	m_soundlatch->data_pending_callback().set(m_soundirq, FUNC(rst_pos_buffer_device::rst2_w));
	m_soundlatch->set_separate_acknowledge(true);

	/* video hardware */
	PALETTE(config, m_palette, FUNC(jantouki_state::sprtmtch_palette), 512); // static palette
	config.set_default_layout(layout_dualhovu);

	screen_device &top(SCREEN(config, "top", SCREEN_TYPE_RASTER));
	top.set_refresh_hz(60);
	top.set_vblank_time(ATTOSECONDS_IN_USEC(0));
	top.set_size(512, 256);
	top.set_visarea(0, 512-1, 16, 256-1);
	top.set_screen_update(FUNC(jantouki_state::screen_update_jantouki_top));
	top.set_palette(m_palette);
	top.screen_vblank().set(FUNC(jantouki_state::jantouki_vblank_w));

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(jantouki_state::jantouki_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(jantouki_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(jantouki_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(jantouki_state::jantouki_blitter_irq_w));

	screen_device &bottom(SCREEN(config, "bottom", SCREEN_TYPE_RASTER));
	bottom.set_refresh_hz(60);
	bottom.set_vblank_time(ATTOSECONDS_IN_USEC(0));
	bottom.set_size(512, 256);
	bottom.set_visarea(0, 512-1, 16, 256-1);
	bottom.set_screen_update(FUNC(jantouki_state::screen_update_jantouki_bottom));
	bottom.set_palette(m_palette);

	DYNAX_BLITTER_REV2(config, m_blitter2);
	m_blitter2->vram_out_cb().set(FUNC(jantouki_state::jantouki_blit2_pixel_w));
	m_blitter2->scrollx_cb().set(FUNC(jantouki_state::dynax_blit2_scrollx_w));
	m_blitter2->scrolly_cb().set(FUNC(jantouki_state::dynax_blit2_scrolly_w));
	m_blitter2->ready_cb().set(FUNC(jantouki_state::jantouki_blitter2_irq_w));

	MCFG_VIDEO_START_OVERRIDE(jantouki_state, jantouki)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	AY8912(config, "aysnd", 22000000 / 8).add_route(ALL_OUTPUTS, "mono", 0.20);

	ym2203_device &ym2203(YM2203(config, "ym2203", 22000000 / 8));
	ym2203.irq_handler().set("soundirq", FUNC(rst_pos_buffer_device::rst1_w));
	ym2203.add_route(0, "mono", 0.20);
	ym2203.add_route(1, "mono", 0.20);
	ym2203.add_route(2, "mono", 0.20);
	ym2203.add_route(3, "mono", 0.50);

	MSM5205(config, m_msm, 384000);
	m_msm->vck_legacy_callback().set(FUNC(jantouki_state::adpcm_int_cpu1));    /* IRQ handler */
	m_msm->set_prescaler_selector(msm5205_device::S48_4B);  /* 8 KHz, 4 Bits  */
	m_msm->add_route(ALL_OUTPUTS, "mono", 1.0);

	/* devices */
	MSM6242(config, "rtc", 32.768_kHz_XTAL);
}

void jantouki_state::janyuki(machine_config &config)
{
	jantouki(config);

	m_palette->set_init(FUNC(jantouki_state::janyuki_palette)); // static palette
}


/***************************************************************************
                            Mahjong Electron Base
***************************************************************************/

/*  It runs in IM 2, thus needs a vector on the data bus:
    0xfa and 0xfc are very similar, they should be triggered by the blitter
    0xf8 is vblank  */

void dynax_adpcm_state::mjelctrn(machine_config &config)
{
	hnoridur(config);

	TMPZ84C015(config.replace(), m_maincpu, XTAL(22'000'000) / 4);
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_adpcm_state::mjelctrn_io_map);

	m_bankdev->set_addrmap(AS_PROGRAM, &dynax_adpcm_state::mjelctrn_banked_map);

	LS259(config.replace(), m_mainlatch);
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_adpcm_state::flipscreen_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_adpcm_state::layer_half_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_adpcm_state::layer_half2_w));
	// Q3, Q4 seem to be related to wrap around enable

	subdevice<ls259_device>("outlatch")->q_out_cb<2>().set(m_hopper, FUNC(hopper_device::motor_w));
	config.device_remove("mainirq");

	HOPPER(config, m_hopper, attotime::from_msec(50));

	m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0)).invert();

	m_blitter->ready_cb().set(m_maincpu, FUNC(tmpz84c015_device::trg1));
	m_blitter->ready_cb().append(m_maincpu, FUNC(tmpz84c015_device::trg2));

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state, mjelctrn)
}

void dynax_adpcm_state::mjembase(machine_config &config)
{
	mjelctrn(config);

	tmpz84c015_device &maincpu(*subdevice<tmpz84c015_device>("maincpu"));
	maincpu.set_addrmap(AS_IO, &dynax_adpcm_state::mjembase_io_map);
	maincpu.in_pa_callback().set_ioport("DSW1");
	maincpu.in_pb_callback().set_ioport("DSW2");

	// 13C
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_adpcm_state::coincounter_0_w));
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_adpcm_state::coincounter_1_w));
	m_mainlatch->q_out_cb<5>().set(m_hopper, FUNC(hopper_device::motor_w));

	config.device_remove("outlatch");

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state, mjembase)
}

void dynax_state::qyjdzjp(machine_config &config)
{
	/* basic machine hardware */
	TMPZ84C015(config, m_maincpu, 21.477272_MHz_XTAL / 2);
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_state::qyjdzjp_io_map);

	ADDRESS_MAP_BANK(config, m_bankdev).set_map(&dynax_state::mjelctrn_banked_map).set_data_width(8).set_addr_width(20).set_stride(0x8000);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	LS259(config, m_mainlatch); // IC25
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::flipscreen_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_state::layer_half_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::layer_half2_w));
	// Q3, Q4 seem to be related to wrap around enable

	ls259_device &outlatch(LS259(config, "outlatch")); // IC61
	outlatch.q_out_cb<0>().set(FUNC(dynax_state::coincounter_0_w));
	outlatch.q_out_cb<1>().set(FUNC(dynax_state::coincounter_1_w));
	outlatch.q_out_cb<2>().set(m_hopper, FUNC(hopper_device::motor_w));

	HOPPER(config, m_hopper, attotime::from_msec(50));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256+22);
	m_screen->set_visarea(0, 512-1-4, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_state::screen_update_hnoridur));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set(m_maincpu, FUNC(tmpz84c015_device::trg0)).invert();

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_state::hnoridur_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_state::dynax_blit_scrolly_w));
	m_blitter->ready_cb().set(m_maincpu, FUNC(tmpz84c015_device::trg1));
	m_blitter->ready_cb().append(m_maincpu, FUNC(tmpz84c015_device::trg2));

	PALETTE(config, m_palette).set_entries(16*256);

	MCFG_VIDEO_START_OVERRIDE(dynax_state, mjelctrn)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ay8912_device &ay8912(AY8912(config, "aysnd", 12_MHz_XTAL / 8));
	ay8912.port_a_read_callback().set_ioport("DSW0");
	ay8912.add_route(ALL_OUTPUTS, "mono", 0.20);

	YM2413(config, "ym2413", 3.579545_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 1.0);

	OKIM6295(config, "oki", 12_MHz_XTAL / 12, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.8);
}


void dynax_state::baoqingt(machine_config &config)
{
	qyjdzjp(config);

	Z80(config.replace(), m_maincpu, 21.477272_MHz_XTAL / 4);
	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::nanajign_mem_map);
	m_maincpu->set_addrmap(AS_IO, &dynax_state::baoqingt_io_map);
	m_maincpu->set_vblank_int("screen", FUNC(dynax_state::irq0_line_hold));

	m_screen->screen_vblank().remove();

	m_blitter->ready_cb().set_inputline(m_maincpu, INPUT_LINE_NMI);

	subdevice<ay8912_device>("aysnd")->set_clock(21.477272_MHz_XTAL / 16);

	subdevice<okim6295_device>("oki")->set_clock(21.477272_MHz_XTAL / 16);
}

/***************************************************************************
                                    Neruton
***************************************************************************/

/*  It runs in IM 2, thus needs a vector on the data bus:
    0x42 and 0x44 are very similar, they should be triggered by the blitter
    0x40 is vblank
    0x46 is a periodic irq? */

void dynax_adpcm_state::neruton(machine_config &config)
{
	mjelctrn(config);

	MCFG_VIDEO_START_OVERRIDE(dynax_adpcm_state, neruton)
}



/***************************************************************************
                               Mahjong Tenkaigen
***************************************************************************/

void dynax_state::tenkai_blitter_irq_w(int state)
{
	if (state && m_blitter_irq_mask)
		m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
}

void dynax_state::tenkai_blitter_ack_w(int state)
{
	m_blitter_irq_mask = state;

	if (!m_blitter_irq_mask)
		m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
}


void dynax_state::tenkai(machine_config &config)
{
	/* basic machine hardware */
	tmp91640_device &tmp(TMP91640(config, m_maincpu, 21472700 / 2));
	tmp.set_addrmap(AS_PROGRAM, &dynax_state::tenkai_map);
	tmp.port_read<3>().set(FUNC(dynax_state::tenkai_p3_r));
	tmp.port_write<3>().set(FUNC(dynax_state::tenkai_p3_w));
	tmp.port_write<4>().set(FUNC(dynax_state::tenkai_p4_w));
	tmp.port_read<5>().set(FUNC(dynax_state::tenkai_p5_r));
	tmp.port_write<6>().set(FUNC(dynax_state::tenkai_p6_w));
	tmp.port_write<7>().set(FUNC(dynax_state::tenkai_p7_w));
	tmp.port_read<8>().set(FUNC(dynax_state::tenkai_p8_r));
	tmp.port_write<8>().set(FUNC(dynax_state::tenkai_p8_w));

	ADDRESS_MAP_BANK(config, m_bankdev).set_map(&dynax_state::tenkai_banked_map).set_data_width(8).set_addr_width(20).set_stride(0x8000);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	LS259(config, m_mainlatch); // 10C on Ougon no Pai
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::flipscreen_w)).invert();
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_state::layer_half_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::layer_half2_w));
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_state::tenkai_6c_w));
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_state::tenkai_70_w));
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_state::tenkai_blitter_ack_w));

	HOPPER(config, m_hopper, attotime::from_msec(50));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(512, 256+22);
	m_screen->set_visarea(4, 512-1, 4, 255-8-4);  // hide first 4 horizontal pixels (see scroll of gal 4 in test mode)
	m_screen->set_screen_update(FUNC(dynax_state::screen_update_hnoridur));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ1);

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_state::hnoridur_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_state::tenkai_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_state::tenkai_blit_scrolly_w));
	m_blitter->ready_cb().set(FUNC(dynax_state::tenkai_blitter_irq_w));

	PALETTE(config, m_palette).set_entries(16*256);

	MCFG_VIDEO_START_OVERRIDE(dynax_state,mjelctrn)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ay8910_device &ay8910(AY8910(config, "aysnd", 22000000 / 16));
	ay8910.port_a_read_callback().set(FUNC(dynax_state::tenkai_dsw_r));
	ay8910.port_b_write_callback().set(FUNC(dynax_state::tenkai_dswsel_w));
	ay8910.add_route(ALL_OUTPUTS, "mono", 0.20);

	YM2413(config, "ym2413", 3579545).add_route(ALL_OUTPUTS, "mono", 1.0);

	/* devices */
	MSM6242(config, "rtc", 32.768_kHz_XTAL).out_int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ2);
}

void dynax_state::majrjhdx(machine_config &config)
{
	tenkai(config);
	m_palette->set_entries(512);
	m_palette->set_init(FUNC(dynax_state::sprtmtch_palette)); // static palette
}

void dynax_state::mjreach(machine_config &config)
{
	tenkai(config);
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::flipscreen_w)); // not inverted
}

void dynax_state::mjtkp2(machine_config &config)
{
	ougonhaib1(config);

	tmp91640_device &tmp = downcast<tmp91640_device &>(*m_maincpu);
	tmp.set_addrmap(AS_PROGRAM, &dynax_state::mjtkp2_map);

	m_bankdev->set_map(&dynax_state::mjtkp2_banked_map);
}

void dynax_state::ougonhaib1(machine_config &config)
{
	tenkai(config);

	tmp91640_device &tmp = downcast<tmp91640_device &>(*m_maincpu);
	tmp.port_write<7>().set(FUNC(dynax_state::ougonhai_p7_w));
}

void dynax_state::ougonhai(machine_config &config)
{
	tenkai(config);

	tmp90840_device &tmp(TMP90840(config.replace(), m_maincpu, 21472700 / 2));
	tmp.set_addrmap(AS_PROGRAM, &dynax_state::ougonhai_map);
	tmp.port_read<3>().set(FUNC(dynax_state::tenkai_p3_r));
	tmp.port_write<3>().set(FUNC(dynax_state::tenkai_p3_w));
	tmp.port_write<4>().set(FUNC(dynax_state::tenkai_p4_w));
	tmp.port_read<5>().set(FUNC(dynax_state::tenkai_p5_r));
	tmp.port_write<6>().set(FUNC(dynax_state::tenkai_p6_w));
	tmp.port_write<7>().set(FUNC(dynax_state::ougonhai_p7_w));
	tmp.port_read<8>().set(FUNC(dynax_state::tenkai_p8_r));

	m_bankdev->set_map(&dynax_state::ougonhai_banked_map);
}

/***************************************************************************
                                Mahjong Gekisha
***************************************************************************/

void dynax_state::gekisha(machine_config &config)
{
	/* basic machine hardware */
	tmp90841_device &tmp(TMP90841(config, m_maincpu, XTAL(10'000'000)));   // ?
	tmp.set_addrmap(AS_PROGRAM, &dynax_state::gekisha_map);
	tmp.port_write<4>().set(FUNC(dynax_state::gekisha_p4_w));

	ADDRESS_MAP_BANK(config, m_bankdev).set_map(&dynax_state::gekisha_banked_map).set_data_width(8).set_addr_width(17).set_stride(0x8000);

	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

	LS259(config, m_mainlatch);
	m_mainlatch->q_out_cb<0>().set(FUNC(dynax_state::mjdialq2_blit_dest1_w));
	m_mainlatch->q_out_cb<1>().set(FUNC(dynax_state::mjdialq2_blit_dest0_w));
	m_mainlatch->q_out_cb<2>().set(FUNC(dynax_state::blit_palbank_w));
	m_mainlatch->q_out_cb<3>().set(FUNC(dynax_state::flipscreen_w));
	m_mainlatch->q_out_cb<4>().set(FUNC(dynax_state::coincounter_0_w));
	m_mainlatch->q_out_cb<5>().set(FUNC(dynax_state::coincounter_1_w));
	m_mainlatch->q_out_cb<6>().set(FUNC(dynax_state::mjdialq2_layer1_enable_w));
	m_mainlatch->q_out_cb<7>().set(FUNC(dynax_state::mjdialq2_layer0_enable_w));

	/* video hardware */
	SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
	m_screen->set_refresh_hz(60);
	m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(0));
	m_screen->set_size(256, 256);
	m_screen->set_visarea(2, 256-1, 16, 256-1);
	m_screen->set_screen_update(FUNC(dynax_state::screen_update_mjdialq2));
	m_screen->set_palette(m_palette);
	m_screen->screen_vblank().set_inputline(m_maincpu, INPUT_LINE_IRQ0);

	DYNAX_BLITTER_REV2(config, m_blitter);
	m_blitter->vram_out_cb().set(FUNC(dynax_state::mjdialq2_blit_pixel_w));
	m_blitter->scrollx_cb().set(FUNC(dynax_state::dynax_blit_scrollx_w));
	m_blitter->scrolly_cb().set(FUNC(dynax_state::dynax_blit_scrolly_w));

	PALETTE(config, m_palette, FUNC(dynax_state::sprtmtch_palette), 512); // static palette
	MCFG_VIDEO_START_OVERRIDE(dynax_state,mjdialq2)

	/* sound hardware */
	SPEAKER(config, "mono").front_center();

	ay8910_device &ay8910(AY8910(config, "aysnd", XTAL(24'000'000) / 16));    // ?
	ay8910.port_a_read_callback().set(FUNC(dynax_state::tenkai_dsw_r));
	ay8910.port_b_write_callback().set(FUNC(dynax_state::tenkai_dswsel_w));
	ay8910.add_route(ALL_OUTPUTS, "mono", 0.20);

	YM2413(config, "ym2413", XTAL(24'000'000) / 8).add_route(ALL_OUTPUTS, "mono", 1.0); // ?
}

/***************************************************************************
                           Mahjong Reach Part II
***************************************************************************/

void dynax_state::mjreachp2_p8_w(uint8_t data)
{
	m_rombank = (data & 0x08) ? (m_rombank & 0x0f) : (m_rombank & 0x0f) | 0x10;
	tenkai_update_rombank();
}


void dynax_state::mjreachp2(machine_config &config)
{
	mjreach(config);

	m_maincpu->set_addrmap(AS_PROGRAM, &dynax_state::mjreachp2_map);

	tmp91640_device &tmp = downcast<tmp91640_device &>(*m_maincpu);
	tmp.port_write<8>().set(FUNC(dynax_state::mjreachp2_p8_w));
}

/***************************************************************************


                                ROMs Loading


***************************************************************************/


/***************************************************************************

Castle Of Dracula
1994 Y.S.E.

Not a Dynax board:

GoldStar Z8400A PS (40-pin plastic DIP)
GoldStar GM68B45S
TI TPC1020AFN-084C
OKI M6295 (second OKI spot is unpopulated)
2 x DSW8, 28-way connector
PAL16L8ACN
4 MHz & 21.47727 MHz XTALs

Clocks:
    Z80 - 5.359MHz measured (21.47727MHz/4)
  M6295 - 1Mhz (4Mhz/4)

 V-SYNC - 58.560 Hz
 H-SYNC - 15.41 KHz
***************************************************************************/

ROM_START( cdracula )
	ROM_REGION( 0x10000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "escape.u202", 0x000000, 0x10000, CRC(92ceb689) SHA1(1b5d6cd51fc961f1b9a7b99d9ba48da8ea2e503b) )

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "escape.u214", 0x00000, 0x40000, CRC(52c2f3bc) SHA1(764fb447d749c1b83d2bb6bcd517949a1cd76593) )
	ROM_LOAD( "escape.u212", 0x40000, 0x40000, CRC(df536e91) SHA1(2c988e7793b2665d8ebb12a8f80a9aefdd3ed1dd) )
	ROM_LOAD( "escape.u210", 0x80000, 0x40000, CRC(d3f5bac2) SHA1(d81ac3ca159985b0a79d02ebe707b46fdeaefe64) )

	ROM_REGION( 0xc0000, "oki", 0 )
	ROM_LOAD( "escape.ua", 0x00000, 0x20000, CRC(2f25be27) SHA1(9b7653ae9ebfd4a301d786c5c731478774e5171d) )
	ROM_LOAD( "escape.ub", 0x20000, 0x20000, CRC(536a8dd0) SHA1(1ec226b0cd4d1320cdfce0a447ea0e481b85a802) )
	ROM_LOAD( "escape.uc", 0x40000, 0x20000, CRC(393fa285) SHA1(654ab2fb92efa28f65bcc7c70a9fae2e43657309) )
	ROM_LOAD( "escape.ud", 0x60000, 0x20000, CRC(eff474af) SHA1(7ab1f0079d051c9b0c4aa566a4d92032c7060d8e) )
	ROM_LOAD( "escape.ue", 0x80000, 0x20000, CRC(0f9dc93b) SHA1(a3b33795cf07882ecc80d9afa5174e771ee0df08) )
	ROM_FILL(              0xa0000, 0x20000, 0x000000 )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "82s147an.u26", 0x000, 0x200, CRC(1a3fe146) SHA1(7d1b4dd66fc95ea5ed584f0bb571cca09fe519b0) ) // FIXED BITS (00xxxxxx)
	ROM_LOAD( "82s147an.u25", 0x200, 0x200, CRC(31791990) SHA1(526c0d516f290dc6cc2ec76d9bcec8c900e2ae10) )

	ROM_REGION( 0x400, "plds", ROMREGION_ERASE00 )
	ROM_LOAD( "pal16l8acn.u47",  0x000, 0x117, CRC(fab530ca) SHA1(1cf8bd6e72f8a85dbf103a13478d31a36564517c) )
	ROM_LOAD( "pal16l8acn.u246", 0x200, 0x117, CRC(f65ec383) SHA1(38c2678c6b9cfa44f2ba35b21d1177a2939bac76) )
ROM_END


/***************************************************************************

Hana no Mai
(c)1988 Dynax

D1610088L1

CPU:    Z80-A
Sound:  AY-3-8912A
    YM2203C
    M5205
OSC:    22.000MHz
Custom: (TC17G032AP-0246)

***************************************************************************/

ROM_START( hanamai )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "1611.13a", 0x00000, 0x10000, CRC(5ca0b073) SHA1(56b64077e7967fdbb87a7685ca9662cc7881b5ec) )
	ROM_LOAD( "1610.14a", 0x48000, 0x10000, CRC(b20024aa) SHA1(bb6ce9821c1edbf7d4cfadc58a2b257755856937) )

	ROM_REGION( 0x200000, "blitter", 0 )    // blitter data
	ROM_LOAD( "1604.12e", 0x000000, 0x20000, CRC(3b8362f7) SHA1(166ce1fe5c48b02b728cf9b90f3dfae4461a3e2c) )
	ROM_LOAD( "1609.12c", 0x020000, 0x20000, CRC(91c5d211) SHA1(343ee4273e8075ba9c2f545c1ee2e403623e3185) )
	ROM_LOAD( "1603.13e", 0x040000, 0x20000, CRC(16a2a680) SHA1(7cd5de9a36fd05261d23f0a0e90d871b132368f0) )
	ROM_LOAD( "1608.13c", 0x060000, 0x20000, CRC(793dd4f8) SHA1(57c32fae553ba9d37c2ffdbfa96ede113f7bcccb) )
	ROM_LOAD( "1602.14e", 0x080000, 0x20000, CRC(3189a45f) SHA1(06e8cb1b6dd6d7e00a7270d4c76b894aba2e7734) )
	ROM_LOAD( "1607.14c", 0x0a0000, 0x20000, CRC(a58edfd0) SHA1(8112b0e0bf8c5bdd1d2e3338d23fe36cf3972a43) )
	ROM_LOAD( "1601.15e", 0x0c0000, 0x20000, CRC(84ff07af) SHA1(d7259056c4e09171aa8b9342ebaf3b8a3490613a) )
	ROM_LOAD( "1606.15c", 0x0e0000, 0x10000, CRC(ce7146c1) SHA1(dc2e202a67d1618538eb04248c1b2c7d7f62151e) )
	ROM_LOAD( "1605.10e", 0x100000, 0x10000, CRC(0f4fd9e4) SHA1(8bdc8b46bf4dafead25a5adaebb74d547386ce23) )
	ROM_LOAD( "1612.10c", 0x120000, 0x10000, CRC(8d9fb6e1) SHA1(2763f73069147d62fd46bb961b64cc9598687a28) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "2.3j",  0x000, 0x200, CRC(7b0618a5) SHA1(df3aadcc7d54fab0c07f85d20c138a45798644e4) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "1.4j",  0x200, 0x200, CRC(9cfcdd2d) SHA1(a649e9381754c4a19ccecc6e558067cc3ff27f91) )
ROM_END


/***************************************************************************

Hana Kochou (Hana no Mai BET ver.)
(c)1988 Dynax

D201901L2
D201901L1-0

CPU:    Z80-A
Sound:  AY-3-8912A
    YM2203C
    M5205
OSC:    22.000MHz
VDP:    HD46505SP
Custom: (TC17G032AP-0246)

***************************************************************************/

ROM_START( hnkochou )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "2009.s4a", 0x00000, 0x10000, CRC(b3657123) SHA1(3385edb2055abc7be3abb030509c6ac71907a5f3) )
	ROM_LOAD( "2008.s3a", 0x18000, 0x10000, CRC(1c009be0) SHA1(0f950d2685f8b67f37065e19deae0cf0cb9594f1) )

	ROM_REGION( 0x100000, "blitter", 0 )   // blitter data
	ROM_LOAD( "2004.12e", 0x000000, 0x20000, CRC(178aa996) SHA1(0bc8b7c093ed46a91c5781c03ae707d3dafaeef4) )
	ROM_LOAD( "2005.12c", 0x020000, 0x20000, CRC(ca57cac5) SHA1(7a55e1cb5cee5a38c67199f589e0c7ae5cd907a0) )
	ROM_LOAD( "2003.13e", 0x040000, 0x20000, CRC(092edf8d) SHA1(3d030462f96edbb0fa4efcc2a5302c17661dce54) )
	ROM_LOAD( "2006.13c", 0x060000, 0x20000, CRC(610c22ec) SHA1(af47bf94e01d1a83aa2a7195c906e13038057c35) )
	ROM_LOAD( "2002.14e", 0x080000, 0x20000, CRC(759b717d) SHA1(fd719fd792459789b559a1e99173144322605b8e) )
	ROM_LOAD( "2007.14c", 0x0a0000, 0x20000, CRC(d0f22355) SHA1(7b027930624ff1f883d620a8e78f962e821f4b23) )
	ROM_LOAD( "2001.15e", 0x0c0000, 0x20000, CRC(09ace2b5) SHA1(1756e3a52523557aa481c6bd6cdf168567af82ff) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "2.3j",  0x000, 0x200, CRC(7b0618a5) SHA1(df3aadcc7d54fab0c07f85d20c138a45798644e4) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "1.4j",  0x200, 0x200, CRC(9cfcdd2d) SHA1(a649e9381754c4a19ccecc6e558067cc3ff27f91) )
ROM_END



/***************************************************************************

Hana Oriduru
(c)1989 Dynax
D2304268L

CPU  : Z80B
Sound: AY-3-8912A YM2413 M5205
OSC  : 22MHz (X1, near main CPU), 384KHz (X2, near M5205)
       3.58MHz (X3, Sound section)

CRT Controller: HD46505SP (6845)
Custom chip: DYNAX TC17G032AP-0246 JAPAN 8929EAI

***************************************************************************/

ROM_START( hnoridur )
	ROM_REGION( 0x90000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "2309.12",  0x00000, 0x20000, CRC(5517dd68) SHA1(3da27032a412b51b67e852b61166c2fdc138a370) )
	ROM_RELOAD(           0x10000, 0x20000 )

	ROM_REGION( 0x100000, "blitter", 0 )   // blitter data
	ROM_LOAD( "2302.21",  0x000000, 0x20000, CRC(9dde2d59) SHA1(96df4ba97ee9611d9a3c7bcaae9cd97815a7b8a5) )
	ROM_LOAD( "2303.22",  0x020000, 0x20000, CRC(1ac59443) SHA1(e70fe6184e7090cf7229d83b87db65f7715de2a8) )
	ROM_LOAD( "2301.20",  0x040000, 0x20000, CRC(24391ddc) SHA1(6a2e3fae4b6d0b1d8073306f37c9fdaa04b69eb8) )
	ROM_LOAD( "2304.1",   0x060000, 0x20000, CRC(3756c745) SHA1(f275a72d6e07f21148900d24a8018d03504f249f) )
	ROM_LOAD( "2305.2",   0x080000, 0x20000, CRC(249d360a) SHA1(688fced1298c345a18314d2c88664c757a2de35c) )
	ROM_LOAD( "2306.3",   0x0a0000, 0x20000, CRC(014a4945) SHA1(0cd747787a81226fd4937616a6ce45af731a4049) )
	ROM_LOAD( "2307.4",   0x0c0000, 0x20000, CRC(8b6f8a2d) SHA1(c5f3ec64a7ea3edc556182f42e6da4842d88e0ba) )
	ROM_LOAD( "2308.5",   0x0e0000, 0x20000, CRC(6f996e6e) SHA1(c2b916afbfd257417f0383ad261f3720a027fdd9) )
ROM_END



/***************************************************************************

Sports Match
Dynax 1989

                     5563
                     3101
        SW2 SW1
                             3103
         YM2203              3102
                     16V8
                     Z80         DYNAX
         22MHz

           6845
                         53462
      17G                53462
      18G                53462
                         53462
                         53462
                         53462

***************************************************************************/

ROM_START( drgpunch )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "2401.3d", 0x00000, 0x10000, CRC(b310709c) SHA1(6ad6cfb54856f65a888ac44e694890f32f26e049) )
	ROM_LOAD( "2402.6d", 0x28000, 0x10000, CRC(d21ed237) SHA1(7e1c7b40c300578132ebd79cbad9f7976cc85947) ) // 01xxxxxxxxxxxxxx = 0xFF

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "2403.6c", 0x00000, 0x20000, CRC(b936f202) SHA1(4920d29a814ebdd74ce6f780cf821c8cb8142d9f) )
	ROM_LOAD( "2404.5c", 0x20000, 0x20000, CRC(2ee0683a) SHA1(e29225e08be11f6971fa04ce2715be914d29976b) )
	ROM_LOAD( "2405.3c", 0x40000, 0x20000, CRC(aefbe192) SHA1(9ed0ec7d6357eedec80a90364f196e43a5bfee03) )
	ROM_LOAD( "2406.1c", 0x60000, 0x20000, CRC(e137f96e) SHA1(c652f3cb17a56127d30a516af75154e15d7ce6c0) )
	ROM_LOAD( "2407.6a", 0x80000, 0x20000, CRC(f3f1b065) SHA1(531317e4d1ab5db60595ca3327234a6bdea79ce9) )
	ROM_LOAD( "2408.5a", 0xa0000, 0x20000, CRC(3a91e2b9) SHA1(b762c38ff2ebbd4ed832ca772973a15dd4a4ad73) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "2.18g", 0x000, 0x200, CRC(9adccc33) SHA1(acf4d5a28430378dbccc1b9fa0b6391cc8149fee) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "1.17g", 0x200, 0x200, CRC(324fa9cf) SHA1(a03e23d9a9687dec4c23a8e41254a3f4b70c7e25) )
ROM_END

ROM_START( drgpunchbl ) // bootleg PCB with 'Nevada SRL' sticker
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "1.o", 0x00000, 0x10000, CRC(b310709c) SHA1(6ad6cfb54856f65a888ac44e694890f32f26e049) ) // same as original
	ROM_LOAD( "2.q", 0x30000, 0x08000, CRC(17f646c4) SHA1(07528756b61ee4219deb56319518fdb6e38bf3f3) ) // same as the second half of the original ROM (1xxxxxxxxxxxxxx = 0xFF)

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "3.j",  0x00000, 0x10000, CRC(cb90f576) SHA1(5399d3c7bdf68445dcb8c61b9fb5f199720d548a) )
	ROM_LOAD( "4.k",  0x10000, 0x10000, CRC(ccf52f85) SHA1(fb9678c9a8f72f627b5c25dd00fb43b5582f1a96) )
	ROM_LOAD( "5.l",  0x20000, 0x10000, CRC(7f716bec) SHA1(4b55f4548b3eccf63bf70f72007431f6788753ca) )
	ROM_LOAD( "6.m",  0x30000, 0x10000, CRC(d0b22c51) SHA1(82eec2b7115e54718e10a84f72d97b78fc148733) )
	ROM_LOAD( "7.e",  0x40000, 0x10000, CRC(72024013) SHA1(35a57455d48f119006d38ec1d3ef62883de48a79) )
	ROM_LOAD( "8.f",  0x50000, 0x10000, CRC(19f2fe4c) SHA1(793b50f82c0a6dc3d121d624da7bed38d412628a) )
	ROM_LOAD( "9.g",  0x60000, 0x10000, CRC(b5cffb81) SHA1(5c0024726dac8f59ffaa3945430420da7ba537a6) )
	ROM_LOAD( "10.h", 0x70000, 0x10000, CRC(2b66b23f) SHA1(394c968f6d2c23b4993068d3ce61a9021d6cf5bd) )
	ROM_LOAD( "11.a", 0x80000, 0x10000, CRC(97e35f87) SHA1(5d6b521e806065a01c1d326a91cc0e39d26f08ff) )
	ROM_LOAD( "12.b", 0x90000, 0x10000, CRC(f29f0e2b) SHA1(eaf93d168383e7d9a38881f814393146f0c75662) )
	ROM_LOAD( "13.c", 0xa0000, 0x10000, CRC(01707705) SHA1(83750be8e09317bef6f2f71fbe7281be4c9ad004) )
	ROM_LOAD( "14.d", 0xb0000, 0x10000, CRC(2109af86) SHA1(1cd65a7e6d595665fca55c8d31aa47f7b56ab9fb) ) // only ROM with different content from the original

	ROM_REGION( 0x400, "proms", 0 ) // Color, weren't dumped for this set but given the GFX data mostly matches, they are believed correct
	ROM_LOAD( "2.18g", 0x000, 0x200, CRC(9adccc33) SHA1(acf4d5a28430378dbccc1b9fa0b6391cc8149fee) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "1.17g", 0x200, 0x200, CRC(324fa9cf) SHA1(a03e23d9a9687dec4c23a8e41254a3f4b70c7e25) )
ROM_END

ROM_START( sprtmtch )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "3101.3d", 0x00000, 0x08000, CRC(d8fa9638) SHA1(9851d38b6b3f56cf3cc101419c24f8d5f97950a9) )
	ROM_CONTINUE(        0x28000, 0x08000 )

	ROM_REGION( 0x40000, "blitter", 0 )    // blitter data
	ROM_LOAD( "3102.6c", 0x00000, 0x20000, CRC(46f90e59) SHA1(be4411c3cfa8c8ab26eba935289df0f0fd545b62) )
	ROM_LOAD( "3103.5c", 0x20000, 0x20000, CRC(ad29d7bd) SHA1(09ab84164e5cd14b595f33d129863735901aa922) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "18g", 0x000, 0x200, CRC(dcc4e0dd) SHA1(4e0fb8fd7192bf32247966742df4b80585f32c37) )   // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "17g", 0x200, 0x200, CRC(5443ebfb) SHA1(5b63220a3f6520e353db99b06e645640d1cfde2f) )
ROM_END


/***************************************************************************

Mahjong Friday
(c)1989 Dynax
D2607198L1

CPU  : Zilog Z0840006PSC (Z80)
Sound: YM2413
OSC  : 24MHz (X1)

CRT Controller: HD46505SP (6845)
Custom chip: DYNAX TC17G032AP-0246 JAPAN 8828EAI

***************************************************************************/

ROM_START( mjfriday )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "2606.2b",  0x00000, 0x10000, CRC(00e0e0d3) SHA1(89fa4d684ec36d5e974e39294efd65a9fd832517) )
	ROM_LOAD( "2605.2c",  0x28000, 0x10000, CRC(5459ebda) SHA1(86e51f0c120de87be8f51b498a562360e6b242b8) )

	ROM_REGION( 0x80000, "blitter", 0 )    // blitter data
	ROM_LOAD( "2601.2h",  0x000000, 0x20000, CRC(70a01fc7) SHA1(0ed2f7c258f3cd82229bea7514d262fca57bd925) )
	ROM_LOAD( "2602.2g",  0x020000, 0x20000, CRC(d9167c10) SHA1(0fa34a065b3ffd5d35d03275bdcdf753045d6491) )
	ROM_LOAD( "2603.2f",  0x040000, 0x20000, CRC(11892916) SHA1(0680ab77fc1a2cdb78637bf0c506f03ca514014b) )
	ROM_LOAD( "2604.2e",  0x060000, 0x20000, CRC(3cc1a65d) SHA1(221dc17042e46e58dc4634eef798568747aef3a2) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "d26_2.9e", 0x000, 0x200, CRC(d6db5c60) SHA1(89ee10d092011c2c4eaab2c097aa88f5bb98bb97) )  // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "d26_1.8e", 0x200, 0x200, CRC(af5edf32) SHA1(7202e0aa1ee3f22e3c5fb69a88db455a241929c5) )
ROM_END


/***************************************************************************

Maya
Promat, 1994

PCB Layout
----------

    6845      6264   3
 DSW1  DSW2    1     4
   YM2203      2     5
   3014B

              Z80
  22.1184MHz

 PROM1  TPC1020  D41264
 PROM2            (x6)


Notes:
      Z80 Clock: 5.522MHz
          HSync: 15.925 kHz
          VSync: 60Hz


***************************************************************************/

ROM_START( maya )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "1.17e", 0x00000, 0x10000, CRC(5aaa015e) SHA1(b84d02b1b6c07636176f226fef09a034d00445f0) )
	ROM_LOAD( "2.15e", 0x28000, 0x10000, CRC(7ea5b49a) SHA1(aaae848669d9f88c0660f46cc801e4eb0f5e3b89) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "3.18g", 0x00000, 0x40000, CRC(8534af04) SHA1(b9bc94541776b5c0c6bf0ecc63ffef914756376e) )
	ROM_LOAD( "4.17g", 0x40000, 0x40000, CRC(ab85ce5e) SHA1(845b846e0fb8c9fcd1540960cda006fdac364fea) )
	ROM_LOAD( "5.15g", 0x80000, 0x40000, CRC(c4316dec) SHA1(2e727a491a71eb1f4d9f338cc6ec76e03f7b46fd) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "prom2.5b",  0x000, 0x200, CRC(d276bf61) SHA1(987058b37182a54a360a80a2f073b000606a11c9) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "prom1.6b",  0x200, 0x200, CRC(e38eb360) SHA1(739960dd57ec3305edd57aa63816a81ddfbebf3e) )
ROM_END

ROM_START( mayaa )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "512-1.17e", 0x00000, 0x10000, CRC(00e3c72c) SHA1(2b01fafae242ec91a9c91deb2c6787265c0e2d4c) )
	ROM_LOAD( "512-2.15e", 0x28000, 0x10000, CRC(7ea5b49a) SHA1(aaae848669d9f88c0660f46cc801e4eb0f5e3b89) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "27c020-1.18g", 0x00000, 0x40000, CRC(deb7ead8) SHA1(06f47a170382a837d8e997fa23f4b3b516386adc) )
	ROM_LOAD( "27c020-2.17g", 0x40000, 0x40000, CRC(1929d93a) SHA1(a8d36aafac25b816598074d172ec8cb31c716afa) )
	ROM_LOAD( "27c020-3.15g", 0x80000, 0x40000, CRC(5c80645a) SHA1(fed12fa85e6f4ab6b4b94211013f18f723246ad1) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "promat01.bin",  0x000, 0x200, CRC(d276bf61) SHA1(987058b37182a54a360a80a2f073b000606a11c9) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "promat02.bin",  0x200, 0x200, CRC(e38eb360) SHA1(739960dd57ec3305edd57aa63816a81ddfbebf3e) )
ROM_END

ROM_START( mayab )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "512-1.bin", 0x00000, 0x10000, CRC(8ac94f49) SHA1(3c1e86c1aad67fb8cb1eb534a272222b58f1ff0f) )
	ROM_LOAD( "512-2.bin", 0x28000, 0x10000, CRC(7ea5b49a) SHA1(aaae848669d9f88c0660f46cc801e4eb0f5e3b89) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "27c020-1.bin", 0x00000, 0x40000, CRC(8d41d7ca) SHA1(7e28845457d00481b313ee52b8c7674f75b8c3c0) )
	ROM_LOAD( "27c020-2.bin", 0x40000, 0x40000, CRC(ab85ce5e) SHA1(845b846e0fb8c9fcd1540960cda006fdac364fea) )
	ROM_LOAD( "27c020-3.bin", 0x80000, 0x40000, CRC(c4316dec) SHA1(2e727a491a71eb1f4d9f338cc6ec76e03f7b46fd) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "promat01.bin",  0x000, 0x200, CRC(d276bf61) SHA1(987058b37182a54a360a80a2f073b000606a11c9) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "promat02.bin",  0x200, 0x200, CRC(e38eb360) SHA1(739960dd57ec3305edd57aa63816a81ddfbebf3e) )
ROM_END

ROM_START( mayac )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "e16", 0x00000, 0x10000, CRC(badafb62) SHA1(eabe390f5b3ca6acd4b194b65b81fda7ddca35b8) )
	ROM_LOAD( "e15", 0x28000, 0x10000, CRC(7ea5b49a) SHA1(aaae848669d9f88c0660f46cc801e4eb0f5e3b89) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "g18", 0x00000, 0x40000, CRC(b621955c) SHA1(8bb3cf16585f33e81921efe7958cf8ca08e8df7f) )
	ROM_LOAD( "g16", 0x40000, 0x40000, CRC(26b1c824) SHA1(e1a1a51ef94a3933d5fe4b3d47ad2c1dfb9a1c19) )
	ROM_LOAD( "g15", 0x80000, 0x40000, CRC(f7c6f77e) SHA1(27ba271ec67504dc0c6f9b20362206bbd4b0d90a) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "82s147-2.b5",  0x000, 0x200, CRC(5091de2b) SHA1(ae13676cd2fbde1b87c85480283b24440e069ba4) ) // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "82s147-1.b6",  0x200, 0x200, CRC(6d4940cd) SHA1(33875fd846977f8839fdb0f2a259959994552f35) )
ROM_END


ROM_START( inca )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "am27c512.1", 0x00000, 0x10000, CRC(b0d513f7) SHA1(65ef4702302bbfc7c7a77f7353120ee3f5c94b31) )
	ROM_LOAD( "2.15e", 0x28000, 0x10000, CRC(7ea5b49a) SHA1(aaae848669d9f88c0660f46cc801e4eb0f5e3b89) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "m27c2001.3", 0x00000, 0x40000, CRC(3a3c54ea) SHA1(2743c6a66d3eff60080c9183fa2bf9081207ac6b) )
	ROM_LOAD( "am27c020.4", 0x40000, 0x40000, CRC(d3571d63) SHA1(5f0abb0da19af34bbd3eb93270311e824839deb4) )
	ROM_LOAD( "m27c2001.5", 0x80000, 0x40000, CRC(bde60c29) SHA1(3ff7fbd5978bec27ff2ecf5977f640c66058e45d) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "n82s147n.2",  0x000, 0x200, CRC(268bd9d3) SHA1(1f77d9dc58ab29f013ee21d7ec521b90be72610d) )   // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "n82s147n.1",  0x200, 0x200, CRC(618dbeb3) SHA1(10c8a558430fd1c2cabf9133d3e4f0a5f80eab83) )
ROM_END



/*

Black Touch


PCB Layout
----------

YANG GI CO LTD
432605-0003
|----------------------------------------|
|      DSW1    DSW2   DIP40              |
|      YM2203                            |
|                 41264  41264           |
| 82S147          41264  41264           |
| 82S147          41264  41264           |
|       22.1184MHz                       |
|J        Z80                            |
|A        10D                            |
|M        8D           DIP40             |
|M        6264                           |
|A                                       |
|         GM68B45S                       |
|                                        |
|                                        |
|                                        |
|                                        |
|                        G1   H1    I1   |
|----------------------------------------|
Notes:
      Z80 clock 5.5296MHz [22.1184/4]
      YM2203 clock 2.7648MHz [22.1184/8]
      DIP40 - surface scratched, unknown

 */

ROM_START( blktouch )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "u43_d8",  0x00000, 0x10000, CRC(0972ab8c) SHA1(ff751fbb37562f216a4fddebd9190acee1f357c8) )
	ROM_LOAD( "u45_d10", 0x28000, 0x10000, CRC(5745424a) SHA1(d244d9a9b4c49d255f114842147ba0a795a3e9ac) )

	ROM_REGION( 0x100000, "blitter", 0 )
	ROM_LOAD( "u33_g1", 0x80000, 0x40000, CRC(88737a8b) SHA1(9d812ee732f6cc43c78d8585dabf1b51ed4b89ba) )
	ROM_LOAD( "u34_h1", 0x40000, 0x40000, CRC(07216e11) SHA1(402b201c665503a2c9bb1b2f74da0c3db5c3f660) )
	ROM_LOAD( "u35_i1", 0x00000, 0x40000, CRC(4ae52ccb) SHA1(84c9466e6f574ec99947084a2e8a336935ad4186) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "u12",  0x200, 0x200, CRC(80d282ff) SHA1(3ad8dc61fe098ceac3a4be8742c1b360dfa7223a) )
	ROM_LOAD( "u13",  0x000, 0x200, CRC(6984aaa9) SHA1(91645cd944cb21266edd13e55a8dc846f6edc419) )
ROM_END

void blktouch_state::init_blktouch()
{
	// fearsome encryption ;-)
	uint8_t *src;

	src = (uint8_t *)memregion("maincpu")->base();
	for (int i = 0; i < 0x90000; i++)
		src[i] = bitswap<8>(src[i], 7, 6, 5, 3, 4, 2, 1, 0);

	src = &m_blitter_gfx[0];
	for (int i = 0; i < 0xc0000; i++)
		src[i] = bitswap<8>(src[i], 7, 6, 5, 3, 4, 2, 1, 0);
}


void blktouch_state::init_maya_common()
{
	// Address lines scrambling on 1 z80 ROM
	uint8_t *rom = memregion("maincpu")->base() + 0x28000, *end = rom + 0x10000;
	for ( ; rom < end; rom += 8)
	{
		uint8_t temp[8];
		temp[0] = rom[0];   temp[1] = rom[1];   temp[2] = rom[2];   temp[3] = rom[3];
		temp[4] = rom[4];   temp[5] = rom[5];   temp[6] = rom[6];   temp[7] = rom[7];

		rom[0] = temp[0];   rom[1] = temp[4];   rom[2] = temp[1];   rom[3] = temp[5];
		rom[4] = temp[2];   rom[5] = temp[6];   rom[6] = temp[3];   rom[7] = temp[7];
	}
}


void blktouch_state::init_maya()
{
	init_maya_common();

	uint8_t *gfx = &m_blitter_gfx[0];
	/* Address lines scrambling on the blitter data roms */
	std::vector<uint8_t> rom(0xc0000);
	memcpy(&rom[0], gfx, 0xc0000);
	for (int i = 0; i < 0xc0000; i++)
		gfx[i] = rom[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)];
}


void blktouch_state::init_mayac()
{
	init_maya_common();

	uint8_t *gfx = &m_blitter_gfx[0];
	/* Address lines scrambling on the blitter data roms */
	std::vector<uint8_t> rom(0xc0000);
	memcpy(&rom[0], gfx, 0xc0000);
	for (int i = 0; i < 0xc0000; i++)
		gfx[i] = rom[bitswap<24>(i, 23, 22, 21, 20, 19, 18, 17, 14, 16, 15, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)];
}


/***************************************************************************

Mahjong Dial Q2
(c)1991 Dynax
D5212298L-1

CPU  : Z80
Sound: YM2413
OSC  : (240-100 624R001 KSSOB)?
Other: TC17G032AP-0246
CRT Controller: HD46505SP (6845)

***************************************************************************/

ROM_START( mjdialq2 )
	ROM_REGION( 0x78000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "5201.2b", 0x00000, 0x10000, CRC(5186c2df) SHA1(f05ae3fd5e6c39f3bf2263eaba645d89c454bd70) )
	ROM_RELOAD(          0x10000, 0x08000 )             // 1
	ROM_CONTINUE(        0x20000, 0x08000 )             // 3
	ROM_LOAD( "5202.2c", 0x30000, 0x08000, CRC(8e8b0038) SHA1(44130bb29b569610826e1fc7e4b2822f0e1034b1) )   // 5
	ROM_CONTINUE(        0x70000, 0x08000 )             // d

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "5207.2h", 0x00000, 0x20000, CRC(7794cd62) SHA1(7fa2fd50d7c975c381dda36f505df0e152196bb5) )
	ROM_LOAD( "5206.2g", 0x20000, 0x20000, CRC(9e810021) SHA1(cf1052c96b9da3abb263be1ce8481aeded2c5d00) )
	ROM_LOAD( "5205.2f", 0x40000, 0x20000, CRC(8c05572f) SHA1(544a5eb8b989fb1195986ed856da04350941ef59) )
	ROM_LOAD( "5204.2e", 0x60000, 0x20000, CRC(958ef9ab) SHA1(ec768c587dc9e6b691564b6b35abbece252bcd28) )
	ROM_LOAD( "5203.2d", 0x80000, 0x20000, CRC(706072d7) SHA1(d4692296d234b824961a94390e6d646ed9a7d5fd) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "d52-2.9e", 0x000, 0x200, CRC(18585ce3) SHA1(7f2e20bb09c1d810910094a6b19e5151666d74ac) )  // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "d52-1.8e", 0x200, 0x200, CRC(8868247a) SHA1(97652025c411b379dfab576dc7f2d8d0d61d0828) )
ROM_END

// Program roms from a non-working pcb. The other roms match the parent.
ROM_START( mjdialq2a )
	ROM_REGION( 0x78000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "5201.2b", 0x00000, 0x10000, CRC(6b735bb0) SHA1(2756e8711cf3be45ec0ca97bce621135df71e9fc) )
	ROM_RELOAD(          0x10000, 0x08000 )             // 1
	ROM_CONTINUE(        0x20000, 0x08000 )             // 3
	ROM_LOAD( "5202.2c", 0x30000, 0x08000, CRC(7819521f) SHA1(57a385b4ff3343dfa47499ddc25db26b3b64a441) )   // 5
	ROM_CONTINUE(        0x70000, 0x08000 )             // d

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "5207.2h", 0x00000, 0x20000, CRC(7794cd62) SHA1(7fa2fd50d7c975c381dda36f505df0e152196bb5) )
	ROM_LOAD( "5206.2g", 0x20000, 0x20000, CRC(9e810021) SHA1(cf1052c96b9da3abb263be1ce8481aeded2c5d00) )
	ROM_LOAD( "5205.2f", 0x40000, 0x20000, CRC(8c05572f) SHA1(544a5eb8b989fb1195986ed856da04350941ef59) )
	ROM_LOAD( "5204.2e", 0x60000, 0x20000, CRC(958ef9ab) SHA1(ec768c587dc9e6b691564b6b35abbece252bcd28) )
	ROM_LOAD( "5203.2d", 0x80000, 0x20000, CRC(706072d7) SHA1(d4692296d234b824961a94390e6d646ed9a7d5fd) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "d52-2.9e", 0x000, 0x200, CRC(18585ce3) SHA1(7f2e20bb09c1d810910094a6b19e5151666d74ac) )  // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "d52-1.8e", 0x200, 0x200, CRC(8868247a) SHA1(97652025c411b379dfab576dc7f2d8d0d61d0828) )
ROM_END


/***************************************************************************

Mahjong Yarunara
(c)1991 Dynax
D5512068L1-1
D4508308L-2 (sub board)

CPU  : Z80B
Sound: AY-3-8912A YM2413 M5205
OSC  : 22.000MHz (near main CPU), 14.31818MHz (Sound section)
       YC-38 (X1), 384KHz (X2, M5205)

ROMs (all ROMs are 541000 = 27C010 compatible):
5501M.2D     [d86fade5]
5502M.4D     [1ef09ff0]
5503M.8C     [9276a10a]
5504M.9C     [6ac42304]
5505M.10C    [b2ca9838]
5506M.11C    [161058fd]
5507M.13C    [7de17b26]
5508M.16C    [ced3155b]
5509M.17C    [ca46ed48]

Subboard ROMs (5515M is 27C040, others are 541000):
5510M.2A     [bb9c71e1]
5511M.3A     [40ee77d8]
5512M.4A     [b4220316]
5513M.1B     [32b7bcbd]
5514M.2B     [ac714bb7]
5515M.4B     [ef130237]

PALs (not dumped):
D55A.4E
D55B.11F
D55C.16N
D55D.17D
D55EH.6A

CRT controller:
HD46505SP (6845)

Real time clock:
OKI M6242B

Custom chip:
DYNAX NL-001 WD10100

***************************************************************************/

ROM_START( yarunara )
	ROM_REGION( 0x50000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "5501m.2d",  0x00000, 0x20000, CRC(d86fade5) SHA1(4ae5e22972eb4ead9aa4a455ff1a18e128c33ed6) )
	ROM_RELOAD(            0x10000, 0x20000 )
	ROM_LOAD( "5502m.4d",  0x30000, 0x20000, CRC(1ef09ff0) SHA1(bbedcc1c0f5b43c78e0c3ce0fc1a3c28025562ec) )

	ROM_REGION( 0x400000, "blitter", 0 )    // blitter data
	ROM_LOAD( "5507m.13c", 0x000000, 0x80000, CRC(7de17b26) SHA1(326667063ab045ac50e850f2f7821a65317879ad) )
	ROM_LOAD( "5508m.16c", 0x100000, 0x20000, CRC(ced3155b) SHA1(658e3947781f1be2ee87b43952999281c66683a6) )
	ROM_LOAD( "5509m.17c", 0x120000, 0x20000, CRC(ca46ed48) SHA1(0769ac0b211181b7b57033f09f72828c885186cc) )
	ROM_LOAD( "5506m.11c", 0x140000, 0x20000, CRC(161058fd) SHA1(cfc21abdc036e874d34bfa3c60486a5ab87cf9cd) )
	ROM_LOAD( "5505m.10c", 0x160000, 0x20000, CRC(b2ca9838) SHA1(7104697802a0466fab40414a467146a224eb6a74) )
	ROM_LOAD( "5504m.9c",  0x180000, 0x20000, CRC(6ac42304) SHA1(ce822da6d61e68578c08c9f1d0af1557c64ac5ae) )
	ROM_LOAD( "5503m.8c",  0x1a0000, 0x20000, CRC(9276a10a) SHA1(5a68fff20631a2002509d6cace06b5a9fa0e75d2) )
	ROM_LOAD( "5515m.4b",  0x200000, 0x80000, CRC(ef130237) SHA1(2c8f7a15249115b2cdcb3a8e0896ea8601e323d9) )
	ROM_LOAD( "5514m.2b",  0x300000, 0x20000, CRC(ac714bb7) SHA1(64056cbed9d0c4f68611921754c3e6a9bb14f7cc) )
	ROM_LOAD( "5513m.1b",  0x320000, 0x20000, CRC(32b7bcbd) SHA1(13277ae3f158da332e69c6f4f8828dfabbf3ea0a) )
	ROM_LOAD( "5512m.4a",  0x340000, 0x20000, CRC(b4220316) SHA1(b0797c9c6ab226520d29c780ea709f62e02dd268) )
	ROM_LOAD( "5511m.3a",  0x360000, 0x20000, CRC(40ee77d8) SHA1(e0dd9750d8b7b7dd9695a8365bdc926bd6d9f886) )
	ROM_LOAD( "5510m.2a",  0x380000, 0x20000, CRC(bb9c71e1) SHA1(21f2977196aaa27b76ee6547a08aba8da7aba76c) )
ROM_END


/***************************************************************************

Hana wo Yaraneba!
(c)1991 Dynax

D5512068L1-1
CPU: Z80B
Sound: AY38912A/P YM2413 M5205
OSC: 20.0000MHz 14.31818MHz ?(near 6242)
Others: Battery, M6242B
Custom: NL-001
        TC17G032AP-0246

ROMs:
5501H.2D
5502H.4D

5503H.8C
5504H.9C
5505H.10C
5506H.11C
5507H.13C
5508H.16C
5509H.17C

on Subboard D4508308L-2
5510H.2A
5511H.3A
5512H.4A
5513H.1B
5514H.2B
5515H.4B

dumped by sayu
--- Team Japump!!! ---

***************************************************************************/

ROM_START( hanayara )
	ROM_REGION( 0x50000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "5501h.2d", 0x00000, 0x20000, CRC(124860b7) SHA1(205459d95f876433a9ca329fe31cfe9b08023baf) )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_LOAD( "5502h.4d", 0x30000, 0x20000, CRC(93407801) SHA1(63dc3419f97d86221dbdd67b5be41d713364496b) )

	ROM_REGION( 0x400000, "blitter", 0 )    // blitter data
	ROM_LOAD( "5507h.13c", 0x000000, 0x80000, CRC(7de17b26) SHA1(326667063ab045ac50e850f2f7821a65317879ad) )
	ROM_LOAD( "5508h.16c", 0x100000, 0x20000, CRC(ced3155b) SHA1(658e3947781f1be2ee87b43952999281c66683a6) )
	ROM_LOAD( "5509h.17c", 0x120000, 0x20000, CRC(ca46ed48) SHA1(0769ac0b211181b7b57033f09f72828c885186cc) )
	ROM_LOAD( "5506h.11c", 0x140000, 0x20000, CRC(161058fd) SHA1(cfc21abdc036e874d34bfa3c60486a5ab87cf9cd) )
	ROM_LOAD( "5505h.10c", 0x160000, 0x20000, CRC(b2ca9838) SHA1(7104697802a0466fab40414a467146a224eb6a74) )
	ROM_LOAD( "5504h.9c",  0x180000, 0x20000, CRC(6ac42304) SHA1(ce822da6d61e68578c08c9f1d0af1557c64ac5ae) )
	ROM_LOAD( "5503h.8c",  0x1a0000, 0x20000, CRC(9276a10a) SHA1(5a68fff20631a2002509d6cace06b5a9fa0e75d2) )
	ROM_LOAD( "5515h.4b",  0x200000, 0x80000, CRC(ca742acc) SHA1(0aab6b3bbd0a229a0d6843849704f4faf27c8f72) )
	ROM_LOAD( "5514h.2b",  0x300000, 0x20000, CRC(ac714bb7) SHA1(64056cbed9d0c4f68611921754c3e6a9bb14f7cc) )
	ROM_LOAD( "5513h.1b",  0x320000, 0x20000, CRC(32b7bcbd) SHA1(13277ae3f158da332e69c6f4f8828dfabbf3ea0a) )
	ROM_LOAD( "5512h.4a",  0x340000, 0x20000, CRC(b4220316) SHA1(b0797c9c6ab226520d29c780ea709f62e02dd268) )
	ROM_LOAD( "5511h.3a",  0x360000, 0x20000, CRC(40ee77d8) SHA1(e0dd9750d8b7b7dd9695a8365bdc926bd6d9f886) )
	ROM_LOAD( "5510h.2a",  0x380000, 0x20000, CRC(bb9c71e1) SHA1(21f2977196aaa27b76ee6547a08aba8da7aba76c) )
ROM_END

/***************************************************************************

Quiz TV Gassyuukoku Q&Q (JPN ver.)
(c)1992 Dynax

DX-BASE (Dynax Motherboard System) D5512068L1-2
D6410288L-1 (SUB)

6401.2D   prg. / samples
6402.4D
6403.5D

6404.S2A  chr.
6405.S2B
6406.S2C
6407.S2D
6408.S2E
6409.S2F
6410.S2G
6411.S2H
6412.S3A
6413.S3B

***************************************************************************/

ROM_START( quiztvqq )
	ROM_REGION( 0x10000 + 0x28*0x8000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "6401.2d",  0x000000, 0x020000, CRC(ce0e237c) SHA1(fd94a45052e3a68ef8cda2853b911a9993675fa6) )
	// 14-17
	ROM_RELOAD(           0x0b0000, 0x020000 )
	// 04-07
	ROM_LOAD( "6402.4d",  0x030000, 0x020000, CRC(cf7a9aa8) SHA1(9eaa8b318479e82cbcf133c227c61be92d282996) )
	// 24-27
	ROM_CONTINUE(         0x130000, 0x020000 )
	// 08-0b
	ROM_LOAD( "6403.5d",  0x050000, 0x020000, CRC(62402ac9) SHA1(bf52d22b119d54410dad4949b0687bb0edf3e143) )

	ROM_REGION( 0x400000, "blitter", 0 )   // blitter data
	ROM_LOAD( "6404.s2a", 0x200000, 0x80000, CRC(996ebe0f) SHA1(6492644aa14b0c2859add31878b5a8d7870981c8) )
	ROM_LOAD( "6405.s2b", 0x280000, 0x20000, CRC(666bfb03) SHA1(e345a198d3e1bc69f22c6f43869ffa2b1501c4ad) )
	ROM_LOAD( "6406.s2c", 0x2a0000, 0x20000, CRC(006871ef) SHA1(ebf78b2e46e26d98a7d8952bd29e78c893243c7a) )
	ROM_LOAD( "6407.s2d", 0x2c0000, 0x20000, CRC(9cc61541) SHA1(a3c0e06c6ad77cb7b2e86a70c2e27e6a74c35f12) )
	ROM_LOAD( "6408.s2e", 0x2e0000, 0x20000, CRC(65a98946) SHA1(4528b300fa3b01d992cf50e87430105463ea3fbd) )
	ROM_LOAD( "6409.s2f", 0x300000, 0x20000, CRC(d5d11061) SHA1(c7ab5aedde6998d62427cc7c4bcf767e9b832a60) )
	ROM_LOAD( "6410.s2g", 0x320000, 0x20000, CRC(bd769d46) SHA1(46f1f9e36f7b5f8deec5f7cce8c0992178ad3be0) )
	ROM_LOAD( "6411.s2h", 0x340000, 0x20000, CRC(7bd43065) SHA1(13b4fcc4155f555ec0c7fbb2f3bb6c19c2788cf5) )
	ROM_LOAD( "6412.s3a", 0x360000, 0x20000, CRC(43e645f3) SHA1(67a2975d4428142a2fbfd1d7b20139a15757bfb4) )
	ROM_LOAD( "6413.s3b", 0x380000, 0x20000, CRC(f7b81238) SHA1(447d983971bed978816dd836504ffcfae0023a69) )
ROM_END


/***************************************************************************

Mahjong Angels (Comic Theater Vol.2)
(c)1991 Dynax

DX-BASE (Dynax Motherboard System) D5512068L1-1
D6107068L-1 (SUB)

612-01.2D   prg. / samples
612-02.4D
612-03.5D

612-04.S1A  chr.
612-05.S2A
612-06.S1B
612-07.S2B
612-08.S3C
612-09.S4C
612-10.S5C
612-11.S6C

***************************************************************************/

ROM_START( mjangels )
	ROM_REGION( 0x10000 + 0x28*0x8000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "612-01.2d",    0x000000, 0x020000, CRC(cd353ba9) SHA1(8344dc5dd482ad6d36aa1e6b5824a09a3627dc65) )
	// 00-03
	ROM_RELOAD(               0x010000, 0x20000 )
	// 0c-0f
	ROM_RELOAD(               0x070000, 0x20000 )
	// 24-27
	ROM_RELOAD(               0x130000, 0x20000 )
	// 04-07
	ROM_LOAD( "612-02.4d",    0x030000, 0x020000, CRC(c1be70f9) SHA1(a0bd266b15c1677e5f41411217ca91d25c75e347) )
	// 08-0b
	ROM_LOAD( "612-03.5d",    0x050000, 0x020000, CRC(62402ac9) SHA1(bf52d22b119d54410dad4949b0687bb0edf3e143) )

	ROM_REGION( 0x400000, "blitter", 0 )    // blitter data
	ROM_LOAD( "612-04.s1a",   0x200000, 0x80000, CRC(c9b568a0) SHA1(e6c68ee4871020ded48e8a92546a8183a25f331f) )
	ROM_LOAD( "612-05.s2a",   0x280000, 0x40000, CRC(2ed51c5d) SHA1(0d912f8dc64f8fae35ca61cc0a938187a13ab328) )
	ROM_LOAD( "612-06.s1b",   0x300000, 0x20000, CRC(8612904d) SHA1(5386e93ad16146ce4e48e81df304e8bf9d2db199) )
	ROM_LOAD( "612-07.s2b",   0x320000, 0x20000, CRC(0828c59d) SHA1(60c451de062c9e0000875022329450a55e913a3c) )
	ROM_LOAD( "612-11.s6c",   0x340000, 0x20000, CRC(473b6fcd) SHA1(1b99b1370bc739f0f00671c6b6cbb3255d581b55) )
	ROM_LOAD( "612-10.s5c",   0x360000, 0x20000, CRC(bf1edb0e) SHA1(932ca328c5968529d52b2c629b6bb866cfa1e784) )
	ROM_LOAD( "612-09.s4c",   0x380000, 0x20000, CRC(8345999e) SHA1(c70c731ababcb28752dd4961d6dc54d43cb6bcba) )
	ROM_LOAD( "612-08.s3c",   0x3a0000, 0x20000, CRC(aad88516) SHA1(e6c7ef3325a17b2945530847998d314685c39f5d) )
ROM_END


/***************************************************************************

Warai no Hana Tenshi
(c)1991 Dynax

D5512068L1-1 (DX-BASE)
D6107068L-1 (sub board)

CPU  : Z80B
Sound: AY-3-8912A YM2413 M5205
OSC  : 22.000MHz (near main CPU), 14.31818MHz (Sound section)
       YC-38 (X1), 384KHz (X2, M5205)


ROMs:
613-01.2D (M5M27C101K-15 - 128kB)
613-02.4D (M5M27C101K-15 - 128kB)
613-03.5D (Fujitsu Mask ROM 831000-15 - 128kB)

on Subboard
613-04.1A (AM27C040 - 512kB)
613-05.2A (AM27C020 - 256kB)
613-06.1B (M5M27C101K-15 - 128kB)
613-07.2B (M5M27C101K-15 - 128kB)
613-08.4C (M5M27C101K-15 - 128kB)
613-09.5C (M5M27C101K-15 - 128kB)
613-10.6C (M5M27C101K-15 - 128kB)

PALs (not dumped):
D613A.4E

on Subboard
D613B.7B

***************************************************************************/

ROM_START( warahana )
	ROM_REGION( 0x150000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "613-01.2d", 0x00000, 0x20000, CRC(1e067bfb) SHA1(9cdd261a87f5930dddc60d9224e0daf2ac6b28c9) )
	ROM_RELOAD(            0x10000, 0x20000 )
	ROM_RELOAD(            0x70000, 0x20000 )
	ROM_LOAD( "613-02.4d", 0x30000, 0x20000, CRC(d267a707) SHA1(c38cb06dc09f9062ad4cdd659333410bd2decd01) )
	ROM_LOAD( "613-03.5d", 0x50000, 0x20000, CRC(62402ac9) SHA1(bf52d22b119d54410dad4949b0687bb0edf3e143) )

	ROM_REGION( 0x400000, "blitter", 0 )    // blitter data
	ROM_LOAD( "613-04.1a",  0x200000, 0x80000, CRC(5c90cbb3) SHA1(7bb6fa95bde76382d4e86c3934d1820716f94eac) )
	ROM_LOAD( "613-05.2a",  0x280000, 0x40000, CRC(f6d03514) SHA1(de80bbc66055e4f67b66360e63aac703c5c436a3) )
	ROM_LOAD( "613-06.1b",  0x300000, 0x20000, CRC(34c502e1) SHA1(730bf01bfa5af0cff1420bb64e7c08d3fe42f97c) )
	ROM_LOAD( "613-07.2b",  0x320000, 0x20000, CRC(988c04da) SHA1(74e690d23182b06171f7445fee70ef5261d7eef7) )
	ROM_LOAD( "613-10.6c",  0x340000, 0x20000, CRC(a9e7fc66) SHA1(9f97946ab089d09c85cc0fae3695355cd1b3a8b3) )
	ROM_LOAD( "613-09.5c",  0x360000, 0x20000, CRC(c2c0c47b) SHA1(72bdc654841bf7ba90a4a2a8160dcc8f2a0bac8d) )
	ROM_LOAD( "613-08.4c",  0x380000, 0x20000, CRC(7cc529c3) SHA1(0ccef8adee8ca02b2dba2addbe888fb0ee6904a5) )
ROM_END


/***************************************************************************

Mahjong Campus Hunting
(c)1990 Dynax
D3312108L1-1
D23SUB BOARD1 (sub board)

CPU  : Z80B
Sound: AY-3-8912A YM2413 M5205
OSC  : 22MHz (X1, near main CPU), 384KHz (X2, near M5205)
       3.58MHz (X3, Sound section)

ROMs:
3309.20      [0c7d72f0] OKI M271000ZB
3310.21      [28f5f194]  |
3311.22      [cddbf667]  |
3312.1       [cf0afbb5]  |
3313.2       [36e25beb]  |
3314.3       [f1cf01bc]  |
3315.4       [7cac01c7] /

3316.10      [44006ee5] M5M27C101P
3317.11      [4bb62bb4] /
3318.12      [e3b457a8] 27C010

Subboard ROMs:
3301.1B      [8ec98d60] OKI M271000ZB
3302.2B      [d7024f2d]  |
3303.3B      [01548edc]  |
3304.4B      [deef9a4e]  |
3305.1A      [8a9ebab8]  |
3306.2A      [86afcc80]  |
3307.3A      [07dbaf8a]  |
3308.4A      [a2cac53d] /

PALs:
D33A.24 (16L8)
D33B.79 (16L8)
D33C.67 (16R8)

CRT Controller:
HD46505SP (6845)

Custom chip:
DYNAX TC17G032AP-0246 JAPAN 8951EAY

***************************************************************************/

ROM_START( mcnpshnt )
	ROM_REGION( 0x90000, "maincpu", 0 )    // Z80 Code
	ROM_LOAD( "3318.12", 0x000000, 0x020000, CRC(e3b457a8) SHA1(b768895797157cad029ac1f652a838ecf6587d4f) )
	ROM_RELOAD(          0x010000, 0x020000 )
	ROM_LOAD( "3317.11", 0x030000, 0x020000, CRC(4bb62bb4) SHA1(0de5605cecb1e729a5b5b866274395945cf88aa3) )
	ROM_LOAD( "3316.10", 0x050000, 0x020000, CRC(44006ee5) SHA1(287ffd095755dc2a1e40e667723985c9052fdcdf) )

	ROM_REGION( 0x300000, "blitter", 0 )    // blitter data
	ROM_LOAD( "3310.21", 0x000000, 0x20000, CRC(28f5f194) SHA1(ceb4605b25c49b6e6087e2e2f5db608d7e3ed0b2) )
	ROM_LOAD( "3311.22", 0x020000, 0x20000, CRC(cddbf667) SHA1(fbf94b8fdbe09cec5469c5f09d28e4d206763f90) )
	ROM_LOAD( "3309.20", 0x040000, 0x20000, CRC(0c7d72f0) SHA1(cbd0f29a31eab565b0e31fe1612e73164e6c61b4) )
	ROM_LOAD( "3312.1",  0x060000, 0x20000, CRC(cf0afbb5) SHA1(da340d49fb9513014f619124af56c115932cf18c) )
	ROM_LOAD( "3313.2",  0x080000, 0x20000, CRC(36e25beb) SHA1(21577849b356192d32d990d02d03092aa344e92e) )
	ROM_LOAD( "3314.3",  0x0a0000, 0x20000, CRC(f1cf01bc) SHA1(fb02593d8b772b5e0128017998a0e15fc0708898) )
	ROM_LOAD( "3315.4",  0x0c0000, 0x20000, CRC(7cac01c7) SHA1(cee5f157a23087b97709ff860078572b389e60cb) )
	ROM_LOAD( "3301.1b", 0x200000, 0x20000, CRC(8ec98d60) SHA1(e98d947096abb78e91c3013ede9eae7719b1d7b9) )
	ROM_LOAD( "3302.2b", 0x220000, 0x20000, CRC(d7024f2d) SHA1(49dfc26dc91a8632459852968766a5263be138eb) )
	ROM_LOAD( "3303.3b", 0x240000, 0x20000, CRC(01548edc) SHA1(a64b509a744dd010997d5b2cd4d12d2767dde6c8) )
	ROM_LOAD( "3304.4b", 0x260000, 0x20000, CRC(deef9a4e) SHA1(e0be7ba644e383d669a5ff1eb24c46461cc586a5) )
	ROM_LOAD( "3308.4a", 0x280000, 0x20000, CRC(a2cac53d) SHA1(fc580a85c94748afc1bbc49e25662e5a5cc8bb36) )
	ROM_LOAD( "3307.3a", 0x2a0000, 0x20000, CRC(07dbaf8a) SHA1(99f995b71ca116d2e5587e08f9b0b4493d96937b) )
	ROM_LOAD( "3306.2a", 0x2c0000, 0x20000, CRC(86afcc80) SHA1(e5d818761bb375b6c862546e238b2c6cf13898a8) )
	ROM_LOAD( "3305.1a", 0x2e0000, 0x20000, CRC(8a9ebab8) SHA1(755c40a64541518b27cfa94959feb5de6f55b358) )
ROM_END


/***************************************************************************

7jigen no Youseitachi (Mahjong 7 Dimensions)
(c)1990 Dynax

D3707198L1
D23SUB BOARD1

CPU:    Z80-B
Sound:  AY-3-8912A
    YM2413
    M5205
OSC:    22.000MHz
    3.58MHz
    384KHz
VDP:    HD46505SP
Custom: (TC17G032AP-0246)


3701.1A   prg.

3702.3A   samples
3703.4A

3704.S1B  chr.
3705.S2B
3706.S3B
3707.S4B
3708.S1A
3709.S2A
3710.S3A
3711.S4A
3712.14A
3713.16A
3714.17A
3715.18A
3716.20A
3717.17B

***************************************************************************/

ROM_START( 7jigen )
	ROM_REGION( 0x90000, "maincpu", 0 )    // Z80 Code
	ROM_LOAD( "3701.1a",  0x00000, 0x20000, CRC(ee8ab3c4) SHA1(9ccc9e9697dd452cd28e38c81cebea0b862f0642) )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_LOAD( "3702.3a",  0x30000, 0x20000, CRC(4e43a0bb) SHA1(d98a1ab43dcfab3d2a17f99db797f7bfa17e5ecc) )
	ROM_LOAD( "3703.4a",  0x50000, 0x20000, CRC(ec77b564) SHA1(5e9d5540b300e88c3ecdb53bca38830621eb0382) )

	ROM_REGION( 0x300000, "blitter", 0 )    // blitter data
	ROM_LOAD( "3713.16a", 0x000000, 0x20000, CRC(f3a745d2) SHA1(37b55e2c290b165a5afaf4c7b8539bb57dd0d927) )
	ROM_LOAD( "3712.14a", 0x020000, 0x20000, CRC(88786680) SHA1(34a31448a9f3e287d7c7fe478736771c5ef259e2) )
	ROM_LOAD( "3715.18a", 0x040000, 0x20000, CRC(19f7ab13) SHA1(ac11e43981e8667c2637b66d93ac052fb27e521d) )
	ROM_LOAD( "3716.20a", 0x060000, 0x20000, CRC(4f0c7f06) SHA1(e0bbbb69cdd16932778e0b2f67e7ed068991a0b9) )
	ROM_LOAD( "3717.17b", 0x080000, 0x20000, CRC(960cfd62) SHA1(df8ee9eb8617a5e8605170d404872e1c6f0987f0) )
	ROM_LOAD( "3714.17a", 0x0a0000, 0x20000, CRC(44ba5e35) SHA1(0c5c2b2a78aa397ea3d1264821ff717d093b81ae) )
	ROM_LOAD( "3704.s1b", 0x200000, 0x20000, CRC(26348ae4) SHA1(3659d18608848c58ad980a79bc1c29da238a5604) )
	ROM_LOAD( "3705.s2b", 0x220000, 0x20000, CRC(5b5ea036) SHA1(187a7f6356ead05d8e3d9f5efa82554004429780) )
	ROM_LOAD( "3706.s3b", 0x240000, 0x20000, CRC(7fdfb600) SHA1(ce4485e43ee6bf63b4e8e3bb91267295995c736f) )
	ROM_LOAD( "3707.s4b", 0x260000, 0x20000, CRC(67fa83ea) SHA1(f8b0012aaaf125b7266dbf1ae7df23d04d484e54) )
	ROM_LOAD( "3711.s4a", 0x280000, 0x20000, CRC(f1d4399d) SHA1(866af46900a4b04db69c838b7ec7e347a5fadd3d) )
	ROM_LOAD( "3710.s3a", 0x2a0000, 0x20000, CRC(0a92af7c) SHA1(4383dc8f3019b3b2716d32e1c91b0ac5b1e367c3) )
	ROM_LOAD( "3709.s2a", 0x2c0000, 0x20000, CRC(86f27f1c) SHA1(43b829597993d3043d5bbb0a468f603910638b87) )
	ROM_LOAD( "3708.s1a", 0x2e0000, 0x20000, CRC(8082d0ac) SHA1(44d708f8e307b782105082092edd3ea9affd2329) )
ROM_END


/***************************************************************************

Jong Yu Ki
(c)1988 Dynax

D1505178-A (main board)
D1505178-B (ROM board)

CPU:    Z80-B
Sound:  Z80-B
        AY-3-8912A
        YM2203C
        M5205
OSC:    22.000MHz
VDP:    HD46505SP
Custom: (TC17G032AP-0246) x2


c0.bin   MROM1  main prg.
c1.bin   MROM2

d0.bin   SROM1  sound prg.
d1.bin   SROM2  sound data
d2.bin   SROM3

b0.bin   BROM1  bottom monitor chr.
b1.bin   BROM2
b2.bin   BROM3
b3.bin   BROM4

a0.bin   AROM1  top monitor chr.
a1.bin   AROM2
a2.bin   AROM3
a3.bin   AROM4
a4.bin   AROM5
a5.bin   AROM6
a6.bin   AROM7
a7.bin   AROM8
a8.bin   AROM9
a9.bin   AROM10
a10.bin  AROM11
a11.bin  AROM12
a12.bin  AROM13
a13.bin  AROM14

***************************************************************************/

ROM_START( janyuki )
	ROM_REGION( 0x20000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "c0.6b",  0x000000, 0x10000, CRC(b91dde00) SHA1(75117428b9ffadf7513243799504b2b9f9c0e90c) )
	ROM_LOAD( "c1.6c",  0x010000, 0x10000, CRC(a32108bb) SHA1(c226cbefa673068a8d25dc76b3a7132d46ba41da) )

	ROM_REGION( 0x68000, "soundcpu", 0 )    // Z80 Code
	ROM_LOAD( "d0.8g",  0x000000, 0x10000, CRC(849cee82) SHA1(71aa76845ac80305dbaee203a1d21e8ca160e7e3) )
	// banks 4-b:
	ROM_LOAD( "d1.8f",  0x028000, 0x20000, CRC(2b6ea286) SHA1(11f5c6fd4611a5b34d7171ce1cb3870cc6c0438a) )
	ROM_LOAD( "d2.8e",  0x048000, 0x20000, CRC(31d7c298) SHA1(c51489c73b319153f2d6a47c6cd0b4b90fdc2011) )

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "b0.6d",  0x000000, 0x20000, CRC(d05ca62e) SHA1(4d29c7a6b81227b2dc6a922d9cbadd23f6fbc26e) )
	ROM_LOAD( "b1.4c",  0x020000, 0x20000, CRC(4cb131fb) SHA1(239c58c4662a7d2db08331d5fb9cd2c96e24190b) )
	ROM_LOAD( "b2.4d",  0x040000, 0x20000, CRC(a8b46c90) SHA1(b4b49ee68524fad741c0a93a2a912550bec592a8) )
	ROM_LOAD( "b3.6e",  0x060000, 0x20000, CRC(ef460f4b) SHA1(dcbe88dd5cf21529a846cb17aec16c6279d296b5) )

	ROM_REGION( 0x200000, "blitter2", 0 )   // blitter 2 data (banked)
	ROM_LOAD( "a0.6f",  0x000000, 0x20000, CRC(23501699) SHA1(c1a9c1ef483bcf7d93aa84c7207791128f773294) )
	ROM_LOAD( "a1.6g",  0x020000, 0x20000, CRC(3d58063b) SHA1(059ff975d084cc121d24549cd4e3799032261d4d) )
	ROM_LOAD( "a2.4e",  0x040000, 0x20000, CRC(7064752b) SHA1(3885bec0e28ba0c9052e76e26a3702f68a612216) )
	ROM_LOAD( "a3.4f",  0x060000, 0x20000, CRC(51d987c9) SHA1(4f41a64837e7b14ebce898315ef81b9804dcc1c8) )
	ROM_LOAD( "a4.4g",  0x080000, 0x20000, CRC(f0a877d6) SHA1(71e6a836b73282f8006b32ff971cc1c0533ef800) )
	ROM_LOAD( "a5.3c",  0x0a0000, 0x20000, CRC(c39c4e68) SHA1(79c1393c882d1cc7dc05b7164a2a572cec559c72) )
	ROM_LOAD( "a6.3d",  0x0c0000, 0x20000, CRC(8fea07cd) SHA1(dee1d162cb1c032167e037b760f2330617933656) )
	ROM_LOAD( "a7.3e",  0x0e0000, 0x20000, CRC(49ddf196) SHA1(2837f0ca1969c78a81284b2b7887c2450c6448f2) )
	ROM_LOAD( "a8.3f",  0x100000, 0x20000, CRC(a608c3f3) SHA1(8564571511938c6ffc9503a863f315a083bb6f95) )
	ROM_LOAD( "a9.3g",  0x120000, 0x20000, CRC(05937b3f) SHA1(5f5a1743423903a6e79986f42737ee5f8298073c) )
	ROM_LOAD( "a10.1c", 0x140000, 0x20000, CRC(37f9bbc7) SHA1(c38fc271bc9762235b5d377f017f078faff02a44) )
	ROM_LOAD( "a11.1d", 0x160000, 0x20000, CRC(f48f0413) SHA1(88b18c2d4729babb7b6b44bcbeec8c14e4a434f8) )
	ROM_LOAD( "a12.1e", 0x180000, 0x20000, CRC(13e82b8f) SHA1(426dac512f0e62460fc4b095b20227824ac9213b) )
	ROM_LOAD( "a13.1f", 0x1a0000, 0x20000, CRC(414370a4) SHA1(af2377b243939d60bdc69d6894a37ef5a86e4441) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	// upper screen?
	ROM_LOAD( "n82s147an.20h", 0x000000, 0x000200, CRC(958f066c) SHA1(1275be8e56d9ec9c9c1242bb598eedcd30175f71) )
	ROM_LOAD( "n82s147an.19h", 0x000200, 0x000200, CRC(3f685690) SHA1(6849d72458f5755bcd182be2c8096d39d836a6ff) )
	// lower screen?
	ROM_LOAD( "n82s147an.18g", 0x000000, 0x000200, CRC(958f066c) SHA1(1275be8e56d9ec9c9c1242bb598eedcd30175f71) )   // bad on the PCB, copied from 20h
	ROM_LOAD( "n82s147an.19g", 0x000200, 0x000200, CRC(3f685690) SHA1(6849d72458f5755bcd182be2c8096d39d836a6ff) )
ROM_END


/***************************************************************************

Jantouki
(c)1989 Dynax

D1505178-A (main board)
D2711078L-B (ROM board)

CPU:    Z80-B
Sound:  Z80-B
        AY-3-8912A
        YM2203C
        M5205
OSC:    22.000MHz
VDP:    HD46505SP
Custom: (TC17G032AP-0246) x2


2702.6D  MROM1  main prg.
2701.6C  MROM2

2705.6G  SROM1  sound prg.
2704.6F  SROM2  sound data
2703.6E  SROM3

2709.3G  BROM1  chr.
2710.3F  BROM2
2711.3E  BROM3
2712.3D  BROM4
2713.3C  BROM5
2706.5G  BROM6
2707.5F  BROM7
2708.5E  BROM8

2718.1G  AROM1  chr.
2719.1F  AROM2
2720.1E  AROM3
2721.1D  AROM4
2722.1C  AROM5
2714.2G  AROM6
2715.2F  AROM7
2716.2E  AROM8
2717.2D  AROM9

27-1_19H.18G    color
27-2.20H.19G

***************************************************************************/

ROM_START( jantouki )
	ROM_REGION( 0x20000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "2702.6d", 0x000000, 0x010000, CRC(9e9bea93) SHA1(c8b1a0621d3dae37d809bdbaa4ed4af73847b714) )
	ROM_LOAD( "2701.6c", 0x010000, 0x010000, CRC(a58bc982) SHA1(5cdea3cdf3eaacb6bdf6ddb68e3d57fe53d70bb9) )

	ROM_REGION( 0x68000, "soundcpu", 0 )    // Z80 Code
	ROM_LOAD( "2705.6g", 0x000000, 0x010000, CRC(9d21e4af) SHA1(454601f4cb89da53c6881f4d8109d3c0babcfe5e) )
	// banks 4-b:
	ROM_LOAD( "2704.6f", 0x028000, 0x020000, CRC(4bb62bb4) SHA1(0de5605cecb1e729a5b5b866274395945cf88aa3) )
	ROM_LOAD( "2703.6e", 0x048000, 0x020000, CRC(44006ee5) SHA1(287ffd095755dc2a1e40e667723985c9052fdcdf) )

	ROM_REGION( 0x100000, "blitter", 0 )   // blitter data
	ROM_LOAD( "2709.3g", 0x00000, 0x20000, CRC(e6dd4853) SHA1(85394e34eee95cd4430d062b3dbdfbe066c661b6) )
	ROM_LOAD( "2710.3f", 0x20000, 0x20000, CRC(7ef4d92f) SHA1(414e26242e824f5d4c40a039a3f3486f84338325) )
	ROM_LOAD( "2711.3e", 0x40000, 0x20000, CRC(8bfee4c2) SHA1(7c0e7535f7d7cd7f665e7925ff0cdab6b96a4b83) )
	ROM_LOAD( "2712.3d", 0x60000, 0x20000, CRC(6ecd4913) SHA1(00a2355d6cb1643b7cc964e702a4ac5cfe7906c5) )
	ROM_LOAD( "2713.3c", 0x80000, 0x20000, CRC(33272f5d) SHA1(8a23ef0e6ad24905fd5c249e8ea8560ec29a585c) )
	ROM_LOAD( "2706.5g", 0xa0000, 0x20000, CRC(fd72b190) SHA1(3d790dc1e40cbf963d8413ea91e518e19973734d) )
	ROM_LOAD( "2707.5f", 0xc0000, 0x20000, CRC(4ec7a81e) SHA1(a6227ca2b648ebc1a5a5f6fbfc6412c44752b77d) )
	ROM_LOAD( "2708.5e", 0xe0000, 0x20000, CRC(45845dc9) SHA1(cec3f82e3440f724f59d8386c8d2b0e030703ed5) )

	ROM_REGION( 0x200000, "blitter2", 0 )   // blitter 2 data (banked)
	ROM_LOAD( "2718.1g", 0x000000, 0x20000, CRC(65608d7e) SHA1(28a960450d2d1cfb314c574123c2fbc61f2ded51) )
	ROM_LOAD( "2719.1f", 0x020000, 0x20000, CRC(4cbc9361) SHA1(320d3ce504ad2e27937e7e3a761c672a22749658) )
	ROM_LOAD( "2720.1e", 0x040000, 0x20000, CRC(4c9a25e5) SHA1(0298a5dad034b1ac113f6e07f4e9334ed6e0e89b) )
	ROM_LOAD( "2721.1d", 0x060000, 0x20000, CRC(715c864a) SHA1(a4b436ddeaa161d6661063b6de503f07ecc5894a) )
	ROM_LOAD( "2722.1c", 0x080000, 0x20000, CRC(cc0b0cd7) SHA1(ccd3ff1cafbcaf87439a6dfe38b5057febc15012) )
	ROM_LOAD( "2714.2g", 0x0a0000, 0x20000, CRC(17341b6b) SHA1(0ae43e53429e9561a00ea9597299477f2c7ddf4b) )
	ROM_LOAD( "2715.2f", 0x0c0000, 0x20000, CRC(486b7138) SHA1(623ddb0e9a9444cf0e920b78562a4748fa1c54d9) )
	ROM_LOAD( "2716.2e", 0x0e0000, 0x20000, CRC(f388b0da) SHA1(4c04509eeda3f82bf6f8940a406e17423d0210a0) )
	ROM_LOAD( "2717.2d", 0x100000, 0x20000, CRC(3666bead) SHA1(2067bb894b76be2b51649bb1144e84e6ff0ab378) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "27-2_20h.19g", 0x000000, 0x000200, CRC(32d3f091) SHA1(ab9e8f467fc85357fb900bceae32909ce1f2d9c1) )
	ROM_LOAD( "27-1_19h.18g", 0x000200, 0x000200, CRC(9382a2a1) SHA1(0d14eb85017f87ddbe66e4f6443028e91540b36e) )
ROM_END


/***************************************************************************

    Mahjong Electron Base

***************************************************************************/

ROM_START( mjelctrn )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "u27b-020", 0x00000, 0x20000, CRC(7773d382) SHA1(1d2ae799677e99c7cba09b0a2c49bb9310232e80) )
	ROM_CONTINUE(         0x00000, 0x20000 )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_CONTINUE(         0x28000, 0x08000 )
	ROM_CONTINUE(         0x20000, 0x08000 )
	ROM_CONTINUE(         0x18000, 0x08000 )
	ROM_CONTINUE(         0x10000, 0x08000 )

	ROM_REGION( 0x300000, "blitter", 0 )   // blitter data
	ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
	ROM_LOAD( "mj-1c020",  0x200000, 0x040000, CRC(f8e8d91b) SHA1(409e276157b328e7bbba5dda6a4c7adc020d519a) )
ROM_END

ROM_START( mjelct3 )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "se-3010", 0x00000, 0x20000, CRC(370347e7) SHA1(2dc9f1fde4efaaff887722aae6507d7e9fac8eb6) )
	ROM_RELOAD(          0x10000, 0x08000 )
	ROM_CONTINUE(        0x28000, 0x08000 )
	ROM_CONTINUE(        0x20000, 0x08000 )
	ROM_CONTINUE(        0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

ROM_START( mjelct3a )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "dz-00.rom", 0x00000, 0x20000, CRC(d28358f7) SHA1(995c16e0865048069f79411574256a88d58c6be9) )
	ROM_RELOAD(            0x10000, 0x08000 )
	ROM_CONTINUE(          0x28000, 0x08000 )
	ROM_CONTINUE(          0x20000, 0x08000 )
	ROM_CONTINUE(          0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

ROM_START( mjelct3b ) // code almost identical to mjelct3
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "se-3010",   0x00000, 0x20000, CRC(bcdb5827) SHA1(f27987a0ef2146ba18f0243cb4409f48da772140) )
	ROM_RELOAD(            0x10000, 0x08000 )
	ROM_CONTINUE(          0x28000, 0x08000 )
	ROM_CONTINUE(          0x20000, 0x08000 )
	ROM_CONTINUE(          0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(f5b354d1) SHA1(d3f35d090de9af3f50aae9ff11de731950256212) ) // different GFX ROM
ROM_END

/***************************************************************************
Mahjong Electron Base (bootleg)

PCB Layout
----------

5G009B
|--------------------------------------------|
|    VOL  E5.U2        ALS9106               |
|uPC1242H                   TMS4461   TMS4461|
|         SANYA-01.U8                        |
|                           TMS4461   TMS4461|
|                                            |
|        3.579545MHz        6116      TMS4461|
|                                            |
|                           6116      TMS4461|
|  YM2149                                    |
|                                            |
|                          |-------|         |
|  6845                    |TAICOM |         |
|                          |AL9301 |     DSW2|
|           Z84C015        |       |         |
|                          |-------|     DSW3|
|                             DSW(2)         |
|  PRG.U27        21.25MHz               DSW4|
|    6264                                    |
|    10-WAY            18-WAY            DSW5|
|--------------------------------------------|
Notes:
PCB uses standard 10-way/18-way Mahjong pinout
ALS9106 - sound related?, tied to U2 & U8
AL9301  - TAICOM AL9301 graphics generator (QFP160)
Z84C015 - Toshiba TMPZ84C015BF-6 Z80 compatible CPU
***************************************************************************/

ROM_START( mjelctrb )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "prog.u27", 0x00000, 0x20000, CRC(688990ca) SHA1(34825cee8f76de93f12ccf2a1021f9c5369da46a) )
	ROM_RELOAD(           0x28000, 0x08000 )
	ROM_CONTINUE(         0x20000, 0x08000 )
	ROM_CONTINUE(         0x18000, 0x08000 )
	ROM_CONTINUE(         0x10000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "eb-01.rom", 0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "eb-02.rom", 0x100000, 0x080000, CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

// bootleg PCB with TMPZ84C015 with flying wire to the program ROM, AL9106 custom, GM68B45S, YM2149F, CCX413-2, 4 banks of 8 DIP switches
ROM_START( mjelct3bl )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "rom.u3", 0x00000, 0x20000, CRC(2cc0bbd8) SHA1(0653de340d470d209649b82b1844c3c3da5c545a) )
	ROM_CONTINUE(       0x00000, 0x20000 )
	ROM_RELOAD(         0x10000, 0x08000 )
	ROM_CONTINUE(       0x28000, 0x08000 )
	ROM_CONTINUE(       0x20000, 0x08000 )
	ROM_CONTINUE(       0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data, not dumped for this set
	ROM_LOAD( "e1.u82", 0x000000, 0x100000, BAD_DUMP CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "e2.u83", 0x100000, 0x080000, BAD_DUMP CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

// uses Z80 CPU and Z80CTC，ROM A17（30p）—— Z80 CPU M1（27p）
ROM_START( mjelct3bla ) // TODO: correct ROM loading
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "020.u3", 0x00000, 0x20000, CRC(34223e3b) SHA1(c3e936e9d6ba504ce240090cc675a55d0cde80fa) )
	ROM_CONTINUE(       0x00000, 0x20000 )
	ROM_RELOAD(         0x10000, 0x08000 )
	ROM_CONTINUE(       0x28000, 0x08000 )
	ROM_CONTINUE(       0x20000, 0x08000 )
	ROM_CONTINUE(       0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data, not dumped for this set
	ROM_LOAD( "e1.u82", 0x000000, 0x100000, BAD_DUMP CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "e2.u83", 0x100000, 0x080000, BAD_DUMP CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

// uses Z80 CPU and Z80CTC，ROM A17（30p）—— Z80 CPU M1（27p）
ROM_START( mjelct3blb ) // TODO: correct ROM loading
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "mjelct3bl1-fast ron-pld.u3", 0x00000, 0x20000, CRC(a8365b24) SHA1(76ec04fa9f5fa35c28733db4eb931d773d078bfc) )
	ROM_CONTINUE(                           0x00000, 0x20000 )
	ROM_RELOAD(                             0x10000, 0x08000 )
	ROM_CONTINUE(                           0x28000, 0x08000 )
	ROM_CONTINUE(                           0x20000, 0x08000 )
	ROM_CONTINUE(                           0x18000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data, not dumped for this set
	ROM_LOAD( "e1.u82", 0x000000, 0x100000, BAD_DUMP CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "e2.u83", 0x100000, 0x080000, BAD_DUMP CRC(e1f1b431) SHA1(04a612aff4c30cb8ea741f228bfa7e4289acfee8) )
ROM_END

/***************************************************************************
Que You Ji - Dian Zi Ji Pan Jiaqiang Ban (Mahjong Electron Base bootleg)
Hom Inn, 1997
Hardware Info By Guru
---------------------

2J-255
|--------------------------------------------|
|    VOL  SOCKET2  |-------|                 |
|uPC1241H          |       | 41264     41264 |
|         S-1.U8   |AL9106A|                 |
|                  |       | 41264     41264 |
|M3567             |-------|                 |
|        3.579545MHz         6116      41264 |
|                                            |
|WF19054                     6116      41264 |
|                                            |
|                                            |
|6845                      |-------|         |
|         |-------|        |TAICOM |         |
|         | ZILOG |        |AL9301 |     DSW2|
|         |Z80EIPC|        |       |         |
|         |-------|        |-------|     DSW3|
|                             DSW1           |
|  SOCKET1        21.477272MHz           DSW4|
|    6264 C1815     T518A C1815              |
|SC                                      DSW5|
|  |-| 10-WAY |----|     18-WAY      |--|    |
|--| |--------|    |-----------------|  |----|
Notes:
      AL9106 - TAICOM Custom Chip
      AL9301 - TAICOM AL9301 Graphics Generator (QFP160)
     Z84EIPC - Zilog Z84C1510FEC Z80 EIPC (Enhanced Intelligent Peripheral Controller).
               Compatible with Toshiba TMPZ84C015BF-6. Clock Input 10.7375MHz [21.477272/2]
       M3567 - Clone of Yamaha YM2413 OPLL FM Sound Chip. Clock Input 3.579545MHz
     WF19054 - Winbond WF19054 clone of AY-3-8910. Clock 1.500MHz [12/8]
    UPC1241H - NEC uPC1241H 7W Audio Power Amplifier
        6116 - 6116 2kB x8-bit SRAM
        6264 - 6264 8kB x8-bit SRAM (battery-backed)
       41264 - NEC D41264C-15 Dual-Port RAM with 64kB x4-bit DRAM Port and 256 x4-bit Serial Port
        6845 - Goldstar GM68B45S CRT Controller
       T518A - Mitsumi T518A Reset Chip
        DSW1 - 2-Position DIP Switch
      DSW2-5 - 8-Position DIP Switch
          SC - 0.047F 5.5V Super Cap
       C1815 - 2SC1815 General-Purpose NPN Transistor
         358 - LM358 Dual Operational Amplifier
      S-1.U8 - 27C4000 mask ROM
     SOCKET1 - Plugged in here is a sub-board marked 'HOM INN MJXB-1' containing....
               12MHz Crystal
               EPROM 27C020 (Oki Samples)
               EPROM 27C010 (Z80 Program)
               Oki M6295 ADPCM Sample Player. Clock Input 1.000MHz [12/12]. Pin 7 HIGH
               ALTERA EPM7032 PLCC44 CPLD
               7404 Logic Chip
               74161 Logic Chip
               78L05 5V Linear Regulator (TO92)
               2SC945 Transistor
               10-Pin Connector with cable joined to parts on main board with 7 wires.
     SOCKET2 - Plugged in here is a sub-board marked 'HOM INN MJXB-2' containing....
               2x 27C4000 mask ROMs
               74LS00 Logic Chip
               Socket on main board is wired for 8Mbit ROM so when highest address line
               A19 is low or high the logic chip enables OE on one of the 4Mbit ROMs.
***************************************************************************/

ROM_START( qyjdzjp )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "prg.u24", 0x00000, 0x20000, CRC(86d53500) SHA1(61f9aed3da2b49bf9c45ee8d7416cd2ea0300453) )
	ROM_RELOAD(          0x28000, 0x08000 )
	ROM_CONTINUE(        0x20000, 0x08000 )
	ROM_CONTINUE(        0x18000, 0x08000 )
	ROM_CONTINUE(        0x10000, 0x08000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "s-1.u8",   0x000000, 0x100000, CRC(e5c41448) SHA1(b8322e32b0cb3d771316c9c4f7be91de6e422a24) )
	ROM_LOAD( "4m-l.bin", 0x100000, 0x080000, CRC(140738f6) SHA1(996c92ec33b8a3b819a2be7795248c9e214562df) )
	ROM_LOAD( "4m-h.bin", 0x180000, 0x080000, CRC(865987c2) SHA1(0711e309e8c48af7d92b59dbd1407636ce0455ac) )

	ROM_REGION( 0x40000, "oki", 0 )
	ROM_LOAD( "oki.u22", 0x00000, 0x40000, CRC(a6340587) SHA1(91f55776fc4f20720f3e3ca965ba9388d3668881) )
ROM_END


/*******************************************************************
Bao Qing Tian, TIC, 1995
Hardware Info by Guru
---------------------

no number (bootleg-like so probably a rip-off of something else)
|-------------------------------------------------|
| uPC1241H   VOL1    VOL2          6606    TIC01  |
|            4558    4558                         |
|                           95123     3.579545MHz |
|-|             2018                             8|
  |                         95101          SCAP  L|
|-|             2018                             I|
|                                          6264  N|
|1                          Z8400A               E|
|8          |---------|                          R|
|W          |         |       |------|    TIC2-2  |
|A          |  95124  |       |PLCC68|            |
|Y          |         |       |ALTERA|    TIC03   |
|-|  SW4    |         |       |------|          |-|
  |         |---------|  21.47727MHz  T518B     |
|-|  SW3                                  TIC04 |-|
|          HM53462 HM53462    |----|              |
|10  SW2   HM53462 HM53462    |TK101      TIC05 10|
|WAY       HM53462 HM53462    |----|           WAY|
|                                                 |
|-|  SW1      JAMMA        |--|           TIC06   |
  |------------------------|  |-------------------|
Notes:
     Z8400A - Z80A CPU. Clock 5.3693175MHz [21.47727/4]
       6606 - Equivalent to OKI M6295 4-Channel ADPCM Voice Synthesis LSI. Clock input 1.342329375MHz [21.47727/16]. Pin 7 HIGH
      95123 - DIP18 IC. Could be equivalent to Yamaha YM2413 OPLL FM Synthesis Sound Chip. Clock input 3.579545MHz
      95101 - Equivalent to AY-3-8910. Clock input 1.342329375MHz [21.47727/16]
      95124 - Custom Chip (video)
      TK101 - Custom Chip (I/O?)
       2018 - 2kB x8-bit SRAM
       6264 - 8kB x8-bit SRAM (battery-backed)
    HM53462 - Hitachi HM53462 Multi-Port RAM; 64k-word x4-bit DRAM and 256-word x4-bit Serial Access RAM
              Seems to be the same type of Multi-Port RAM used on Mortal Kombat.
      SW1-4 - 8-position DIP Switch
   uPC1241H - NEC uPC1241H Audio Power Amp
       VOL1 - Music Volume Pot
       VOL2 - Voice Volume Pot
       4558 - Dual Operational Amplifier
     PLCC68 - Unknown PLCC68 IC. Altera logo partially visible so some kind of Altera CPLD
      T518B - Mitsumi PST518B Master Reset IC (TO92)
       SCAP - 5.5V 0.1F Supercap
      TIC01 - 27C2001 EPROM (oki samples)
     TIC2-2 - 27C2001 EPROM (main program)
   TIC03-06 - 27C4001 OTP EPROM (gfx)
*******************************************************************/

ROM_START( baoqingt )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "tic2-2.u4", 0x00000, 0x40000, CRC(a4d16608) SHA1(254aae41284fae0eeda6ab7f72ec907cd9a5c7e2) )
	ROM_RELOAD(          0x10000, 0x40000 )

	ROM_REGION( 0x200000, "blitter", ROMREGION_ERASE00 )
	ROM_LOAD( "tic03.u41", 0x000000, 0x80000, CRC(00c9faf2) SHA1(4eaebfc9506d7e3925e43f44c0d396c1ba38a214) ) // standard mahjong gameplay GFX are here
	ROM_LOAD( "tic04.u42", 0x080000, 0x80000, CRC(cb8f0831) SHA1(122da594df6b025f96eb30eb0edcdef2c0f59556) ) // bonus game GFX are here
	ROM_LOAD( "tic06.u44", 0x100000, 0x80000, CRC(a093594e) SHA1(56931c1014a862fa4db2d32eb97deda20e41d92f) ) // title screen
	ROM_LOAD( "tic05.u43", 0x180000, 0x80000, CRC(5736a700) SHA1(b61e011858a3ee91fd69d49450b48e1d157cb11d) )

	ROM_REGION( 0x40000, "oki", 0 )
	ROM_LOAD( "tic01.u9", 0x00000, 0x40000, CRC(b16b5dbf) SHA1(0896bb8a32c9a2d9645ce40653549b4ec9ce01a4) )
ROM_END


/***************************************************************************

Mahjong Electromagnetic Base (Dynax, 1989)

PCB Layout
----------

D3803248L1
sticker: M6100524A
  |--------------------------------------|
  |             TMS4461  17G032   3804   |
|-|             TMS4461           3805   |
|       TMS4461 TMS4461   3801    3806   |
|       TMS4461 TMS4461   3802    3807   |
|                         3803    3808   |
|             PAL                 3809   |
|     6845SP                      381A   |
|              2018     PAL              |
|  DSW4 384KHz 2018          DSW1   0.1UF|
|  LM358  M5205                          |
|  LM358  YM2413             CPU   TC5563|
|  MB3712   AY-3-8912                    |
|-|VOL      DSW3             DSW2        |
  |VOL   3.579545MHz       22MHz  3815   |
  |--------------------------------------|
Notes:
      CPU       - surface scratched, clock input 11MHz [22/2], looks like TMPZ84015
      AY-3-8912 - clock 1.375MHz [22/16]
      YM2413    - clock 3.579545MHz
      M5205     - clock 384kHz
      6845SP    - clock 2.75MHz [22/8], VSync pin - 60.1188Hz, HSync pin - 15.8112kHz
      TMS4461   - 1Mx4-bit DRAM
      2018      - 2kx8-bit SRAM
      TC5563    - 8kx8-bit SRAM
      17G032    - custom Dynax GFX chip
      DSW1-4    - 8-position DIP switches
      0.1UF     - 5.5v 0.1UF supercap
      MB3712    - Fujitsu MB3712 AMP

***************************************************************************/

ROM_START( mjembase )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "dynax_3815.20a", 0x00000, 0x20000, CRC(35b35b48) SHA1(9966804337a7c6de160a09087e1fea3b0a515fe4) )
	ROM_RELOAD(                 0x10000, 0x20000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "dynax_3803.7c",  0x000000, 0x20000, CRC(5480c4f8) SHA1(8f533683eb08281f50247c17e7ccfcfd2d8f1937) )
	ROM_LOAD( "dynax_3802.6c",  0x020000, 0x20000, CRC(ba27976a) SHA1(cb9ce82054b7568507807a891ada3d39adf094d2) )
	ROM_LOAD( "dynax_3801.5c",  0x040000, 0x20000, CRC(84a013ac) SHA1(3d5c196f7474bb13d9b724befec3de7f247953e3) )
	ROM_LOAD( "dynax_3804.1a",  0x060000, 0x20000, CRC(8c055525) SHA1(8e31bef48a8b89e79ecb8b71855bc20036667561) )
	ROM_LOAD( "dynax_3805.3a",  0x080000, 0x20000, CRC(a27b2063) SHA1(9da26086832f047c65ad88147e65d1f65e9b7677) )
	ROM_LOAD( "dynax_3806.5a",  0x0a0000, 0x20000, CRC(42486764) SHA1(217ea04fad8853b03522474a70a322642a5301a5) )
	ROM_LOAD( "dynax_3807.6a",  0x0c0000, 0x20000, CRC(c29abf8f) SHA1(79e05fc0decd450622189ce1c8681c4442c566b0) )
	ROM_LOAD( "dynax_3808.7a",  0x0e0000, 0x20000, CRC(72efcd62) SHA1(9b84043fc9b2dcaf97a58aba0ba4ce27ee64381c) )
	ROM_LOAD( "dynax_3809.9a",  0x100000, 0x20000, CRC(7c239069) SHA1(71c8b437a555ab48ce600ff283d50e0a21e9f8eb) )
	ROM_LOAD( "dynax_381a.10a", 0x120000, 0x20000, CRC(72c092c7) SHA1(3a4f1cd56c9544dcd4689e385c98407c45ac894c) )
ROM_END


/*

Sea Hunter Penguin

CPU
1x Z8400A (main)
1x YM2203C (sound)
1x blank DIP40 with GND on pin 1,22 and +5 on pin 20
1x oscillator 22.1184MHz
ROMs

2x 27512 (u43,u45)
6x 27C010

ROM u43.8d contains

MODEL:SEA HUNTER(EXT)
PROGRAM BY:WSAC SYSTEMS,.

DATE:1995/02/20

VER:1.30

*/

ROM_START( shpeng )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "u43.8d", 0x00000, 0x10000, CRC(6b993f68) SHA1(4d3ad750e23be93342c61c454498d432e40587bb) )
	ROM_LOAD( "u45.9d", 0x28000, 0x10000, CRC(6e79a1d1) SHA1(a72706425bcbd0faee4cf0220942fdcf510d4e89) )

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "u110.1j", 0x00000, 0x20000, CRC(31abac75) SHA1(20e91496ccb379d9449925b5aaca3532caaf9522) ) // ok! - main sprites etc.
	ROM_LOAD( "u111.0j", 0x20000, 0x20000, CRC(0672bfc9) SHA1(ea35af45cdfa72ae1e7dc13a09ed1db09c0062ec) ) // ok?
	ROM_LOAD( "u84.1h",  0x40000, 0x20000, CRC(7b476fac) SHA1(6b61b675fbfcc17a77b9757ea330f8d3e8751633) )
	ROM_LOAD( "u804.0h", 0x60000, 0x20000, CRC(abb2f1c3) SHA1(9faccbba26c0540d9edbd76ca8bf67069db0bb53) )
	ROM_LOAD( "u74.1g",  0x80000, 0x20000, CRC(2ac46b6e) SHA1(0046ee7ede1acff45e64c85a9fca8fc8efa31026) )
	ROM_LOAD( "u704.0g", 0xa0000, 0x20000, CRC(b062c928) SHA1(8c43689a1b8c444f91acbc7371eda744874eb538) )

	ROM_REGION( 0x400, "proms", ROMREGION_ERASE00 ) // Color PROMs
	ROM_LOAD( "n82s147n.u13", 0x000, 0x200, CRC(29b6415b) SHA1(8085ff3265cda2d564da3dff609eb05ff02fae49) ) // FIXED BITS (0xxxxxxx)  (Ok)
	ROM_LOAD( "n82s147n.u12", 0x200, 0x200, BAD_DUMP CRC(7b940daa) SHA1(3903ebef644b2519aebbbb6d16872441b283c780) ) // BADADDR xxx-xxxxx  (Bad Read, Prom has a broken leg!)

	/* this rom doesn't belong here, it is from Dragon Punch, but shpeng hardware and game code is a hack
	   of dragon punch.  This rom is better than the bad dump above for the sprite colours, although the
	   colours on the intro/cutscenes are wrong */
	ROM_LOAD( "1.17g", 0x200, 0x200, CRC(324fa9cf) SHA1(a03e23d9a9687dec4c23a8e41254a3f4b70c7e25) )
ROM_END

/*
Intergirl by Barko

1x  GM68A45S        uj11    CRT Controller (CRTC)
1x  Z8400ADSD-Z80ACPU       ug8     8-bit Microprocessor - main
1x  GL324       u14     Quad Operational Amplifier - sound
1x  YM2203C         uj5     FM Operator Type-N (OPM) - sound
1x  YM3014B         u13     D/A Converter (DAC) - sound
1x  oscillator  22.1184MHz  xt1

ROMs
2x  TMS27C512   1,2     dumped
3x  TMS27C020   3,4,5   dumped

RAMs
1x  GM76C88AL-15    ug1
6x  KM424C64P-10    uf13,uf13a,uf14,uf15,uf16,uf17

PLDs
1x  PAL16L8ACN  ug6     read protected
1x  CY7C381-0JC         read protected
*/

ROM_START( intrgirl )
	ROM_REGION( 0x90000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "ka-1.ug3", 0x00000, 0x10000, CRC(07b36540) SHA1(1679438a153a7449256c826c4f10443e739c0825) )
	ROM_LOAD( "ka-2.ug5", 0x28000, 0x10000, CRC(9f2fc058) SHA1(0be90d44ca7cac7040dfa53ba36f6bc3d504fb01) )

	ROM_REGION( 0x100000, "blitter", 0 )    // blitter data
	ROM_LOAD( "ka-3.rom1", 0x00000, 0x40000, CRC(57fd8b34) SHA1(b7fa977bb79a0e831bc86be635398950dd717b47) )
	ROM_LOAD( "ka-4.rom2", 0x40000, 0x40000, CRC(ad90d3a1) SHA1(d955620fdd4aacc96e59e9f94da85568cce47843) )
	ROM_LOAD( "ka-5.rom3", 0x80000, 0x40000, CRC(2ed30171) SHA1(883d9e96df4f234652b01599e065f7f1985d1748) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs
	ROM_LOAD( "n82s147n.uk16", 0x000, 0x200, CRC(17dd1678) SHA1(4ed1beea3de44a6b35c84fb49f65a3a258e716fd) )
	ROM_LOAD( "n82s147n.uk15", 0x200, 0x200, CRC(256e75bd) SHA1(63cb6e824742e8d45e8d69183b8f7693fc0fd6d4) )

	ROM_REGION( 0x104, "pals", ROMREGION_ERASE00 )
	ROM_LOAD( "pal16l8acn.ug6", 0x000, 0x104, NO_DUMP ) //read protected
ROM_END

// Decrypted by yong
void dynax_adpcm_state::init_mjelct3()
{
	uint8_t *rom = memregion("maincpu")->base();
	size_t  size = memregion("maincpu")->bytes();
	std::vector<uint8_t> rom1(size);

	memcpy(&rom1[0], rom, size);
	for (int i = 0; i < size; i++)
		rom[i] = bitswap<8>(rom1[bitswap<24>(i,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8, 1,6,5,4,3,2,7, 0)], 7,6, 1,4,3,2,5,0);
}

void dynax_adpcm_state::init_mjelct3a()
{
	uint8_t *rom = memregion("maincpu")->base();
	size_t  size = memregion("maincpu")->bytes();
	std::vector<uint8_t> rom1(size);

	memcpy(&rom1[0], rom, size);
	for (int i = 0; i < size; i++)
	{
		int j = i & ~0x7e00;
		switch (i & 0x7000)
		{
			case 0x0000:    j |= 0x0400;    break;
			case 0x1000:    j |= 0x4400;    break;
			case 0x2000:    j |= 0x4200;    break;
			case 0x3000:    j |= 0x0200;    break;
			case 0x4000:    j |= 0x4600;    break;
			case 0x5000:    j |= 0x4000;    break;
//              case 0x6000:    j |= 0x0000;    break;
			case 0x7000:    j |= 0x0600;    break;
		}
		switch (i & 0x0e00)
		{
			case 0x0000:    j |= 0x2000;    break;
			case 0x0200:    j |= 0x3800;    break;
			case 0x0400:    j |= 0x2800;    break;
			case 0x0600:    j |= 0x0800;    break;
			case 0x0800:    j |= 0x1800;    break;
//              case 0x0a00:    j |= 0x0000;    break;
			case 0x0c00:    j |= 0x1000;    break;
			case 0x0e00:    j |= 0x3000;    break;
		}
		rom[j] = rom1[i];
	}

	init_mjelct3();
}


/***************************************************************************

Mahjong Neruton Haikujiradan (Rev. B?)
(c)1990 Dynax / Yukiyoshi Tokoro (Illustration)
D4005208L1-1
D4508308L-2 (sub board)

CPU  : Z80?
Sound: AY-3-8912A YM2413 M5205
OSC  : 22MHz (near main CPU), 3.58MHz (Sound section)

ROMs (all ROMs are 27C010 compatible):
4501B.1A     [0e53eeee]
4502.3A      [c296293f]
4511.11A     [c4a96b6e]
4512.13A     [d7ebbcb9]
4513.14A     [e3bed454]
4514.15A     [ee258483]
4515.17A     [3bce0ca1]
4516.18A     [ee6b7e3b]
4517.19A     [b31f9694]
4518.17C     [fa88668e]
4519.18C     [68aca5f3]
4520.19C     [7bb2b298]

Subboard ROMs:
4503.1A      [dcbe2805]
4504.2A      [7b3387af]
4505.3A      [6f9fd275]
4506.4A      [6eac8b3c]
4507.1B      [106e6133]
4508.2B      [5c451ed4]
4509.3B      [4e1e6a2d]
4510.4B      [455305a1]


PALs:
10B (?)
10E (?)
15E (?)
D45SUB.6A (16L8)

CRT Controller:
HD46505SP (6845)

***************************************************************************/

ROM_START( neruton )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "4501b.1a", 0x00000, 0x20000, CRC(0e53eeee) SHA1(883138618a11295bfac148da4a092e01d92229b3) )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_LOAD( "4502.3a",  0x30000, 0x20000, CRC(c296293f) SHA1(466e87f7eca102568f1f00c6ba77dacc3df300dd) )

	ROM_REGION( 0x300000, "blitter", 0 )   // blitter data
	ROM_LOAD( "4511.11a", 0x000000, 0x20000, CRC(c4a96b6e) SHA1(15a6776509e0d30929f6a261798afe7dc0401d4e) )
	ROM_LOAD( "4512.13a", 0x020000, 0x20000, CRC(d7ebbcb9) SHA1(b8edd8b93eca8d36056c02f8b69ff8313c9ab120) )
	ROM_LOAD( "4513.14a", 0x040000, 0x20000, CRC(e3bed454) SHA1(03a66d31b8f41abc4ce83ebe22f8d14414d92152) )
	ROM_LOAD( "4514.15a", 0x060000, 0x20000, CRC(ee258483) SHA1(8c685fee4eaff5978f0ec222c33d55123a8fa496) )
	ROM_LOAD( "4515.17a", 0x080000, 0x20000, CRC(3bce0ca1) SHA1(1d0bb379077c52a63aa982bbe77f89df7b5b7b14) )
	ROM_LOAD( "4516.18a", 0x0a0000, 0x20000, CRC(ee6b7e3b) SHA1(5290fad850c7a52039cd9d26082bff8615bf3797) )
	ROM_LOAD( "4517.19a", 0x0c0000, 0x20000, CRC(b31f9694) SHA1(f22fc44908be4f1ef8dada57860f95ee74495605) )
	ROM_LOAD( "4519.18c", 0x0e0000, 0x20000, CRC(68aca5f3) SHA1(f03328362777e6d536f730bc3b52371d5daca54e) )
	ROM_LOAD( "4520.19c", 0x100000, 0x20000, CRC(7bb2b298) SHA1(643d21f6a45640bad5ec84af9745339487a7408c) )
	ROM_LOAD( "4518.17c", 0x120000, 0x20000, CRC(fa88668e) SHA1(fce80a8badacf39f30c36952cbe0a1491b8faef1) )
	ROM_LOAD( "4510.4b",  0x200000, 0x20000, CRC(455305a1) SHA1(103e1eaac485b37786a1d1d411819788ed385467) )
	ROM_LOAD( "4509.3b",  0x220000, 0x20000, CRC(4e1e6a2d) SHA1(04c71dd11594921142b6aa9554c0fe1b40254463) )
	ROM_LOAD( "4508.2b",  0x240000, 0x20000, CRC(5c451ed4) SHA1(59a27ddfae541cb61dafb32bdb5de8ddbc5abb8d) )
	ROM_LOAD( "4507.1b",  0x260000, 0x20000, CRC(106e6133) SHA1(d08deb17ea82fe43e458a11eea26ce98c26c51c1) )
	ROM_LOAD( "4506.4a",  0x280000, 0x20000, CRC(6eac8b3c) SHA1(70dbe3af582384571872e7b6b51df4192daed227) )
	ROM_LOAD( "4505.3a",  0x2a0000, 0x20000, CRC(6f9fd275) SHA1(123a928dcb60624d61a55b2fef25156975ba26c9) )
	ROM_LOAD( "4504.2a",  0x2c0000, 0x20000, CRC(7b3387af) SHA1(403cf67287469ae6ce9a7f662f6d82f62dac349b) )
	ROM_LOAD( "4503.1a",  0x2e0000, 0x20000, CRC(dcbe2805) SHA1(713edd2e3c950bc689446441eb85197bb7b1eb89) )
ROM_END

/***************************************************************************

Mahjong Neruton Haikujiradan (Rev. A?) [Mahjong Crimson-Whales]

Only one rom differs from neruton: 4501a.1a (4501b.1a in neruton)

***************************************************************************/

ROM_START( nerutona )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "4501a.1a", 0x00000, 0x20000, CRC(82361a95) SHA1(360fa767dc1515bf853458e95e321fc66f8dcf47) )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_LOAD( "4502.3a",  0x30000, 0x20000, CRC(c296293f) SHA1(466e87f7eca102568f1f00c6ba77dacc3df300dd) )

	ROM_REGION( 0x300000, "blitter", 0 )   // blitter data
	ROM_LOAD( "4511.11a", 0x000000, 0x20000, CRC(c4a96b6e) SHA1(15a6776509e0d30929f6a261798afe7dc0401d4e) )
	ROM_LOAD( "4512.13a", 0x020000, 0x20000, CRC(d7ebbcb9) SHA1(b8edd8b93eca8d36056c02f8b69ff8313c9ab120) )
	ROM_LOAD( "4513.14a", 0x040000, 0x20000, CRC(e3bed454) SHA1(03a66d31b8f41abc4ce83ebe22f8d14414d92152) )
	ROM_LOAD( "4514.15a", 0x060000, 0x20000, CRC(ee258483) SHA1(8c685fee4eaff5978f0ec222c33d55123a8fa496) )
	ROM_LOAD( "4515.17a", 0x080000, 0x20000, CRC(3bce0ca1) SHA1(1d0bb379077c52a63aa982bbe77f89df7b5b7b14) )
	ROM_LOAD( "4516.18a", 0x0a0000, 0x20000, CRC(ee6b7e3b) SHA1(5290fad850c7a52039cd9d26082bff8615bf3797) )
	ROM_LOAD( "4517.19a", 0x0c0000, 0x20000, CRC(b31f9694) SHA1(f22fc44908be4f1ef8dada57860f95ee74495605) )
	ROM_LOAD( "4519.18c", 0x0e0000, 0x20000, CRC(68aca5f3) SHA1(f03328362777e6d536f730bc3b52371d5daca54e) )
	ROM_LOAD( "4520.19c", 0x100000, 0x20000, CRC(7bb2b298) SHA1(643d21f6a45640bad5ec84af9745339487a7408c) )
	ROM_LOAD( "4518.17c", 0x120000, 0x20000, CRC(fa88668e) SHA1(fce80a8badacf39f30c36952cbe0a1491b8faef1) )
	ROM_LOAD( "4510.4b",  0x200000, 0x20000, CRC(455305a1) SHA1(103e1eaac485b37786a1d1d411819788ed385467) )
	ROM_LOAD( "4509.3b",  0x220000, 0x20000, CRC(4e1e6a2d) SHA1(04c71dd11594921142b6aa9554c0fe1b40254463) )
	ROM_LOAD( "4508.2b",  0x240000, 0x20000, CRC(5c451ed4) SHA1(59a27ddfae541cb61dafb32bdb5de8ddbc5abb8d) )
	ROM_LOAD( "4507.1b",  0x260000, 0x20000, CRC(106e6133) SHA1(d08deb17ea82fe43e458a11eea26ce98c26c51c1) )
	ROM_LOAD( "4506.4a",  0x280000, 0x20000, CRC(6eac8b3c) SHA1(70dbe3af582384571872e7b6b51df4192daed227) )
	ROM_LOAD( "4505.3a",  0x2a0000, 0x20000, CRC(6f9fd275) SHA1(123a928dcb60624d61a55b2fef25156975ba26c9) )
	ROM_LOAD( "4504.2a",  0x2c0000, 0x20000, CRC(7b3387af) SHA1(403cf67287469ae6ce9a7f662f6d82f62dac349b) )
	ROM_LOAD( "4503.1a",  0x2e0000, 0x20000, CRC(dcbe2805) SHA1(713edd2e3c950bc689446441eb85197bb7b1eb89) )
ROM_END


/***************************************************************************

Mahjong Crystal 7
Dynax, 1990

PCB Layout
----------

D4005208L1-1
|------------------------------------------------------------------|
|    VR1       3.579545MHz  3-8912    22MHz|------|        4001.1A |
|    VR2   358                             |TMPZ84|        4002.3A |
|               YM2413    6845             |C015-6|                |
|          358  384kHz                     |------|                |
|               M5205                                              |
|                                                          5563    |
|M                                                         5.5V_BAT|
|A            6264                                                 |
|H                                                                 |
|J            6264                PAL         PAL                  |
|O                                                                 |
|N                                                                 |
|G  DSW1(8)                                                        |
|2  DSW2(8)                                                        |
|8  DSW3(8)                                                        |
|   DSW4(8)                                |------------ 4011.11A -| |-ROM-sub-board-D23SUB--|
|                                          |             4012.13A  | |                       |
|                                          |             4013.14A  | | 4003.1B   4007.1A     |
|                                          |             4014.15A-|| |                    |-||
|                       HM53461  PAL       |                    | || | 4004.2B   4008.2A  | ||
|               HM53461 HM53461            |                    | || |                    | ||
|               HM53461 HM53461            |                    | || | 4005.3B   4009.3A  | ||
|               HM53461 HM53461            |                    |-|| |                    |-||
|               HM53461   |----------|     |                       | | 4006.4B   4010.4A     |
|                         |    %     |     |                       | |                       |
|                         |----------|     |                       | |                       |
|------------------------------------------|-----------------------| |-----------------------|
Notes:
      TMPZ84C015-6    - Toshiba TMPZ84C015F-6 (QFP100)
                        XTAL1- 11.000MHz [22/2], XTAL2- 11.000MHz [22/2], CLKIN- 5.500MHz [22/4], CLKOUT- 5.500MHz [22/4]
      %               - SDIP64 IC, surface scratched off. This is most likely a Dynax NL-00x graphics generator or similar.
      AY-3-8912 clock - 1.375MHz [22/16]
      YM2413 clock    - 3.579545MHz
      M5205 clock     - 384kHz
      VSync           - 60Hz
      HSync           - 15.87kHz

***************************************************************************/

ROM_START( majxtal7 )
	ROM_REGION( 0x50000, "maincpu", 0 ) // Z80 Code
	ROM_LOAD( "4001.1a",  0x00000, 0x20000, CRC(82fc6dd5) SHA1(3c6e58d4c302a0f305c67c31fce6a1d4cbfe5f78) )
	ROM_RELOAD(           0x10000, 0x20000 )
	ROM_LOAD( "4002.3a",  0x30000, 0x10000, CRC(b5fec88f) SHA1(bc3a2404150edd570ea7d320b2d43735fbdce195) )
	ROM_RELOAD(           0x40000, 0x10000 )

	ROM_REGION( 0x300000, "blitter", 0 )    // blitter data
	ROM_LOAD( "4011.11a", 0x000000, 0x20000, CRC(63551c37) SHA1(338f62125d217ab7a928476d36dd2797480ef3c1) )
	ROM_LOAD( "4012.13a", 0x020000, 0x20000, CRC(51a431d5) SHA1(df2327b61154f5c8eddc7572c08e714daa1498b4) )
	ROM_LOAD( "4013.14a", 0x040000, 0x20000, CRC(cdbb24f8) SHA1(6bec3931ceaed75bfee9079e095786b088b95e70) )
	ROM_LOAD( "4014.15a", 0x060000, 0x20000, CRC(f2677938) SHA1(778ce4a6bebef934749f65acd0b6472fd314ce7a) )
	ROM_LOAD( "4003.1b",  0x200000, 0x20000, CRC(26348ae4) SHA1(3659d18608848c58ad980a79bc1c29da238a5604) )
	ROM_LOAD( "4004.2b",  0x220000, 0x20000, CRC(5b5ea036) SHA1(187a7f6356ead05d8e3d9f5efa82554004429780) )
	ROM_LOAD( "4005.3b",  0x240000, 0x20000, CRC(7fdfb600) SHA1(ce4485e43ee6bf63b4e8e3bb91267295995c736f) )
	ROM_LOAD( "4006.4b",  0x260000, 0x20000, CRC(67fa83ea) SHA1(f8b0012aaaf125b7266dbf1ae7df23d04d484e54) )
	ROM_LOAD( "4010.4a",  0x280000, 0x20000, CRC(f1d4399d) SHA1(866af46900a4b04db69c838b7ec7e347a5fadd3d) )
	ROM_LOAD( "4009.3a",  0x2a0000, 0x20000, CRC(0a92af7c) SHA1(4383dc8f3019b3b2716d32e1c91b0ac5b1e367c3) )
	ROM_LOAD( "4008.2a",  0x2c0000, 0x20000, CRC(86f27f1c) SHA1(43b829597993d3043d5bbb0a468f603910638b87) )
	ROM_LOAD( "4007.1a",  0x2e0000, 0x20000, CRC(8082d0ac) SHA1(44d708f8e307b782105082092edd3ea9affd2329) )
ROM_END

ROM_START( mjreach )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "cs16-1.u15",     0x00000, 0x40000, CRC(b55bafa6) SHA1(eda4b5e90584bcdf6cd546ba767d9fbcf3aa35c5) )
	ROM_RELOAD(                 0x10000, 0x40000 )
	ROM_LOAD( "mjreach-mcu.u3", 0x00000, 0x02000, CRC(091a85dc) SHA1(964ccbc13466464c2feee10f807078ec517bed5c) ) // MCU has pins 9 to 12 & 15 to 16 stripped out

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "cs16-3.u13", 0x000000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_LOAD( "cs16-2.u12", 0x080000, 0x40000, CRC(5558428d) SHA1(b5e30673695b6e56a8c513b484f4f9c225c682cc) )
	ROM_RELOAD(             0x0c0000, 0x40000 )
	ROM_LOAD( "cs16-3.u13", 0x100000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_RELOAD(             0x180000, 0x80000 )
ROM_END

ROM_START( mjreacha )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "cs16-1.u15",     0x00000, 0x40000, CRC(d557ddf2) SHA1(504a8184270524a22be7767cc17cc33465e42d21) ) // SLDH
	ROM_RELOAD(                 0x10000, 0x40000 )
	ROM_LOAD( "mjreach-mcu.u3", 0x00000, 0x02000, CRC(091a85dc) SHA1(964ccbc13466464c2feee10f807078ec517bed5c) )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "cs16-3.u13", 0x000000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_LOAD( "cs16-2.u12", 0x080000, 0x40000, CRC(5558428d) SHA1(b5e30673695b6e56a8c513b484f4f9c225c682cc) )
	ROM_RELOAD(             0x0c0000, 0x40000 )
	ROM_LOAD( "cs16-3.u13", 0x100000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_RELOAD(             0x180000, 0x80000 )
ROM_END

/***************************************************************************

Mahjong Reach (bootleg)
Dynax, 1994

PCB Layout
----------

|-------------------------------------------|
|  10-WAY       18-WAY   M6242B     BATTERY |
|     4558  3.579545MHz  32.768kHz   6264   |
|uPC1241H  VOL           DSW   DSW   ROM.U15|
|           UM3567       DSW   DSW          |
|   DSW     YM2149                  PAL     |
|                                           |
|2          TK-102                 TMP91C640|
|8                    6116                  |
|W                                          |
|A             PAL                          |
|Y                                          |
|                                           |
|                                           |
|                                           |
|                                           |
|            PAL                            |
|                                   ROM.U12 |
|   81461  81461          TK-101            |
|   81461  81461                    ROM.U13 |
|   81461  81461        21.47727MHz         |
|-------------------------------------------|

***************************************************************************/

ROM_START( mjreachbl )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "rom.u15", 0x00000, 0x40000, CRC(d914ac92) SHA1(f3284d2a74380b33fd5fe8f73fe88c8360a9b783) )
	ROM_RELOAD(          0x10000, 0x40000 )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "rom.u13", 0x000000, 0x80000, CRC(c4c7c2fc) SHA1(adb33a8f0ff99c9574bd91fc570f82882d1381f9) )
	ROM_LOAD( "rom.u12", 0x080000, 0x40000, CRC(87f47db6) SHA1(e9e9aae2b7b8dcb7d873a1b715ad4c9629c8936b) )
	ROM_RELOAD(          0x0c0000, 0x40000 )
	ROM_LOAD( "rom.u13", 0x100000, 0x80000, CRC(c4c7c2fc) SHA1(adb33a8f0ff99c9574bd91fc570f82882d1381f9) )
	ROM_RELOAD(          0x180000, 0x80000 )
ROM_END

ROM_START( mjreachp2 ) // BTANB: typo on title screen shows 'Mahjong Reach Rart II' (verified with reference pics)
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "8801.2c",         0x00000, 0x40000, CRC(a92954bc) SHA1(473778eabd0ecc7b66c7e66ab7eb3d8b40554434) )
	ROM_RELOAD(                  0x10000, 0x40000 )
	ROM_LOAD( "mjreach2-mcu.5b", 0x00000, 0x02000, CRC(091a85dc) SHA1(964ccbc13466464c2feee10f807078ec517bed5c) ) // MCU has pins 9 to 12 & 15 to 16 stripped out

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "8802.13b", 0x000000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_LOAD( "8803.15b", 0x080000, 0x40000, CRC(ce1fb102) SHA1(ad7da2054b860277fac23da72d261f880224541e) )
	ROM_RELOAD(           0x0c0000, 0x40000 )
	ROM_LOAD( "8802.13b", 0x100000, 0x80000, CRC(90f6036f) SHA1(f92aafd0316dc235e58d615825f3110806bc2cf9) )
	ROM_RELOAD(           0x180000, 0x80000 )
ROM_END

/***************************************************************************

Mahjong Tenkaigen
Dynax, 1991

PCB Layout
----------

           |------|       |---------------|
|----------|      |-------|               |----------------------|
|           LM358                           M6242  6264  BATT    |
|       UPC1242  UM3567  3.57945MHz  DSW1 DSW2   TAICOM-00.2C    |
|           VOL  AY-3-8910           DSW3 DSW4            PAL1   |
|           DSW5                                 |-------------| |
|           ULN2003                    6116      |TMP91P640N-10| |
|                                                |(SDIP64)     | |
|                                                |-------------| |
|                       PAL2                                     |
|                                                                |
|                                                                |
|                                                                |
|                                                  PAL3          |
|                                                                |
|                3013554                           TAICOM-02.11B |
|                3013554  PAL4                     TAICOM-03.13B |
|                                       |-------|                |
|                41264  41264  41264    |AL9106 |                |
|                                       |(QFP64)|                |
|                41264  41264  41264    |-------|  TAICOM-01.15B |
|                                        21.47727MHz             |
------------------------------------------------------------------
Notes:
      TMP91P640N-10 - Main CPU; Toshiba TMP91P640N-10 Microcontroller with 16k internal ROM,
                      TLCS-90 core, running at 10.73635MHz [21.4727 / 2] (SDIP64)
      DSW1-4        - 10 switches each
      DSW5          - 8 switches each
      UM3567        - United Microelectronics Corporation UMC3567, compatible with YM2413 FM sound chip, running at 3.579549MHz (DIP24)
      UPC1242       - 5W Audio Power Amplifier
      LM358         - Low Power Dual Op Amp (DIP8)
      PAL1          - AMD PALCE16V8H (DIP20)
      PAL2          - AMI 18CV8 (DIP20)
      PAL3          - Signetics PLHS16L8ACN (DIP20)
      PAL4          - AMD PALCE22V10H (DIP24)
      6116          - 2K x8 SRAM (DIP24)
      6264          - 8K x8 SRAM (DIP28)
      AY-3-8910     - Microchip AY-3-8910A Programmable Sound Generator, running at 1.34204375MHz [21.4727 / 16] (DIP40)
      VOL           - Volume Potentiometer
      3013554       - Microchip 3013554-00 118438 (x2, DIP16)
      M6242         - OKI M6242 Real Time Clock chip (DIP18)
      41264         - NEC D41264C18184043 64K x4 VRAM (x6, SDIP24)
      ULN2003       - 7-bit 50V 500mA TTL-input NPN Darlington Driver (DIP16)
      AL9106        - AL9106 graphics generator (QFP64)

      ROMs          - Filename           Device
                      ----------------------------------------------------
                      TAICOM-00.2C     - ST M27C2001 256K x8 EPROM (DIP32)
                      TAICOM-01.15B    - 4MBit mask ROM (DIP32)
                      TAICOM-02.11B    - 4MBit mask ROM (DIP32)
                      TAICOM-03.13B    - AMD AM27C040 512K x8 EPROM (DIP32)
                      TMP91P640N-10.5B - Internal 16K ROM from MCU

***************************************************************************/

ROM_START( tenkai )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "taicom00.2c",      0x00000, 0x40000, CRC(a35e54db) SHA1(247c856e19989fb834e8ed135393927bbd9c0277) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	ROM_LOAD( "tmp91p640n-10.5b", 0x00000, 0x04000, CRC(509f1c97) SHA1(08557bea2e924053fd5bc9de5e306f3ecf8e98e6) )

	// Note by Whistler:
	// It appears that the first half of lzc-01.u6 in tenkaibb (as well as the same data in other bootleg versions)
	// does not exist _anywhere_ in this rom dump, and in this way some girls won't show correctly (such as the 3rd one)
	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "tydg002.u8",   0x000000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from ougonhaib
	ROM_LOAD( "taicom01.15b", 0x080000, 0x80000, BAD_DUMP CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // either this was dumped half size, or the above rom was missing from the pcb
	ROM_LOAD( "taicom02.11b", 0x100000, 0x80000, CRC(aae8cfb7) SHA1(736c6148aa6e7b22ca19615a27e9a10d41778aa7) )
	ROM_LOAD( "taicom03.13b", 0x180000, 0x80000, CRC(68cb730a) SHA1(7ce90e34fa51d50a7668ac1c5ccbc18bebe8ad84) )
ROM_END

/***************************************************************************

Mahjong Tenkaigen Part 2 (bootleg)
Dynax, 1991

PCB Layout
----------

83228-3.GT
|-------------------------------------------|
|     4558  3.579545MHz  DSW   DSW   BATTERY|
|uPC1241H  VOL           DSW   DSW          |
|           K-663                           |
|1                       M5255     32.768kHz|
|8          TK-102             PAL          |
|W                           PAL   RTC62421 |
|A       DSW    6116         PAL            |
|Y                                  6264    |
|                                           |
|                                   MC0     |
|               PAL        PAL              |
|                               TMP91C640N  |
|                                           |
|                       PAL         MC1     |
|1               PAL                        |
|0                                  MC2     |
|W  81461  81461  TK-101                    |
|A  81461  81461                    MC3     |
|Y  81461  81461  21.2MHz                   |
|-------------------------------------------|

romcmp tenkai2b tenkai:

mc0.u11      [1/4]      taicom00.2c  [1/4]      33.557129%
mc0.u11      [2/4]      taicom00.2c  [2/4]      37.846375%
mc0.u11      [3/4]      taicom00.2c  [3/4]      IDENTICAL

mc1.u8       [2/2]      taicom01.15b            IDENTICAL

mc2.u21      [1/2]      taicom02.11b            IDENTICAL
mc2.u21      [2/2]      taicom03.13b            92.501640%

mc3.u15      [2/2]      taicom00.2c  [4/4]      IDENTICAL

***************************************************************************/

ROM_START( tenkai2b )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "mc0.u11",          0x00000, 0x40000, CRC(8488a3ab) SHA1(f367a2dcc65410929db595b3c442d310d50a4940) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	// tenkai internal rom is incompatible with the code of this set
	ROM_LOAD( "tenkai2b_tmp91p640n-10.5b", 0x00000, 0x04000, NO_DUMP )

	ROM_REGION( 0x300000, "blitter", 0 )   // blitter data
	ROM_LOAD( "mc1.u8",  0x000000, 0x100000, CRC(786698e3) SHA1(9ddf4e31f454fb3c7969b1433771e95a976de741) )
	ROM_RELOAD(          0x200000, 0x100000 )
	ROM_LOAD( "mc2.u21", 0x100000, 0x100000, CRC(713f79d7) SHA1(6e518b3127b232cc280b172dedbbc708987f9325) )
	ROM_LOAD( "mc3.u15", 0x200000, 0x020000, CRC(5b552cdf) SHA1(86aaa02dcf8dab670d818287c91c8cb296362401) )   // 1xxxxxxxxxxxxxxxx = 0xFF
ROM_END

/***************************************************************************

Mahjong Tenkaigen (bootleg)
Dynax, 1991

PCB Layout
----------

|-------------------------------------------|
|     4558  3.579545MHz  32.768kHz   BATTERY|
|uPC1241H  VOL           DSW   DSW   6242B  |
|           YM2413       DSW   DSW          |
|1                       YM2149     PAL     |
|8          TK-102                          |
|W                                          |
|A              6116                        |
|Y                                  6264    |
|                                           |
|                                   TDH-12M |
|               PAL                         |
|                               TMP91P640N  |
|                                           |
|                       PAL         LZC-01  |
|1               PAL                        |
|0                                  LZC-02  |
|W  81461  81461  TK-101                    |
|A  81461  81461                    LZC-03  |
|Y  81461  81461  21.2MHz                   |
|-------------------------------------------|

romcmp tenkaibb tenkai2b:

lzc-01.u6               mc1.u8                  IDENTICAL

lzc-02.u19   [1/2]      mc2.u21      [1/2]      IDENTICAL
lzc-02.u19   [2/2]      mc2.u21      [2/2]      92.501640%

lzc-03.u15              mc3.u15                 IDENTICAL

tdh-12m.u11  [3/4]      mc0.u11      [3/4]      99.998474%
tdh-12m.u11  [4/4]      mc0.u11      [4/4]      99.597168%

romcmp tenkaibb tenkai:

lzc-01.u6    [2/2]      taicom01.15b            IDENTICAL

lzc-02.u19   [1/2]      taicom02.11b            IDENTICAL
lzc-02.u19   [2/2]      taicom03.13b            IDENTICAL

lzc-03.u15   [2/2]      taicom00.2c  [4/4]      IDENTICAL

tdh-12m.u11  [3/4]      taicom00.2c  [3/4]      99.998474%
tdh-12m.u11  [4/4]      taicom00.2c  [4/4]      IDENTICAL

***************************************************************************/

ROM_START( tenkaibb )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "tdh-12m.u11", 0x00000, 0x40000, CRC(7b877721) SHA1(41bba10ffb3d72af84d6577d4785225fe1ecc640) )
	ROM_RELOAD(              0x10000, 0x40000 )

	ROM_REGION( 0x300000, "blitter", 0 )   // blitter data
	ROM_LOAD( "lzc-01.u6",  0x000000, 0x100000, CRC(786698e3) SHA1(9ddf4e31f454fb3c7969b1433771e95a976de741) )
	ROM_RELOAD(             0x200000, 0x100000 )
	ROM_LOAD( "lzc-02.u19", 0x100000, 0x100000, CRC(90a19443) SHA1(8f593c00e39dd5acc76b058591019d117967a17b) )
	ROM_LOAD( "lzc-03.u15", 0x200000, 0x020000, CRC(5b552cdf) SHA1(86aaa02dcf8dab670d818287c91c8cb296362401) )  // 1xxxxxxxxxxxxxxxx = 0xFF
ROM_END

/***************************************************************************

Mahjong Tenkaigen (bootleg)
Dynax, 1991

PCB Layout
----------

|-------------------------------------------|
|  10-WAY       18-WAY   M6242B     BATTERY |
|     4558  3.579545MHz  32.768kHz   6264   |
|uPC1241H  VOL           DSW   DSW   ROM.U15|
|           UM3567       DSW   DSW          |
|   DSW     YM2149                  PAL     |
|                                           |
|2          TK-102                 TMP91C640|
|8                    6116                  |
|W                                          |
|A             PAL                          |
|Y                                          |
|                                           |
|                                           |
|                                           |
|                                           |
|            PAL                            |
|                                   ROM.U12 |
|   81461  81461          TK-101            |
|   81461  81461                    ROM.U13 |
|   81461  81461        21.47727MHz         |
|-------------------------------------------|

romcmp tenkai tenkaicb:

taicom00.2c  [3/4]      rom.u15      [3/4]      99.998474%
taicom00.2c  [4/4]      rom.u15      [4/4]      IDENTICAL

taicom01.15b            rom.u12                 IDENTICAL

taicom03.13b            rom.u13                 IDENTICAL

***************************************************************************/

ROM_START( tenkaicb )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "rom.u15", 0x00000, 0x40000, CRC(7b877721) SHA1(41bba10ffb3d72af84d6577d4785225fe1ecc640) )
	ROM_RELOAD(          0x10000, 0x40000 )
	// it doesn't need the internal rom from tenkai

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "tydg002.u8", 0x000000, 0x80000, BAD_DUMP CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // not dumped, rom taken from ougonhaib
	ROM_LOAD( "rom.u12",    0x080000, 0x80000, BAD_DUMP CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // either this was dumped half size, or the above rom was missing from the pcb
	ROM_LOAD( "taicom02.11b", 0x100000, 0x80000, BAD_DUMP CRC(aae8cfb7) SHA1(736c6148aa6e7b22ca19615a27e9a10d41778aa7) ) // not dumped, rom taken from tenkai
	ROM_LOAD( "rom.u13",      0x180000, 0x80000, BAD_DUMP CRC(68cb730a) SHA1(7ce90e34fa51d50a7668ac1c5ccbc18bebe8ad84) ) // either this was dumped half size, or the above rom was missing from the pcb
ROM_END

/***************************************************************************

tenkaigen set 2

romcmp tenkaie tenkai:

epr-a01.rom             taicom00.2c             IDENTICAL

lzc-01.rom   [2/2]      taicom01.15b            IDENTICAL

lzc-02.rom   [1/2]      taicom02.11b            IDENTICAL
lzc-02.rom   [2/2]      taicom03.13b            IDENTICAL

***************************************************************************/

ROM_START( tenkaie )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "epr-a01.rom",      0x00000, 0x40000, CRC(a35e54db) SHA1(247c856e19989fb834e8ed135393927bbd9c0277) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	ROM_LOAD( "tmp91p640n-10.5b", 0x00000, 0x04000, BAD_DUMP CRC(509f1c97) SHA1(08557bea2e924053fd5bc9de5e306f3ecf8e98e6) ) // sldh - not dumped, rom taken from tenkai

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "lzc-01.rom", 0x000000, 0x100000, CRC(786698e3) SHA1(9ddf4e31f454fb3c7969b1433771e95a976de741) )
	ROM_LOAD( "lzc-02.rom", 0x100000, 0x100000, CRC(90a19443) SHA1(8f593c00e39dd5acc76b058591019d117967a17b) )
ROM_END

/***************************************************************************

Mahjong 黄金の牌 (Ougon no Pai)
DYNAX D6209038L1-0

AY-3-8910A, YM2413, rest of the chips are scratched
2 x DSW10, 2 x DSW8, 1 x DSW4, Battery

***************************************************************************/

ROM_START( ougonhai )
	ROM_REGION( 0x90000, "maincpu", 0 )
	ROM_LOAD( "dynax_6201b.2c", 0x00000, 0x40000, CRC(18ef8eda) SHA1(48a3e4566b0a86db907602fd235c01d96eddec23) )
	ROM_RELOAD(                 0x10000, 0x40000 )
	ROM_RELOAD(                 0x50000, 0x40000 )
	ROM_LOAD( "tmp90840",       0x00000, 0x02000, CRC(091a85dc) SHA1(964ccbc13466464c2feee10f807078ec517bed5c) ) // internal ROM, MCU has pins 10 to 15 stripped out

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "dynax_6202.11b", 0x000000, 0x80000, CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) )  // = tydg002.u8 (ougonhaib)
	ROM_LOAD( "dynax_6203.13b", 0x080000, 0x80000, CRC(60717d91) SHA1(85dbb510d33b36d2255b740ccc4917216dd21497) )  // = tydg003.u6 (ougonhaib)
	ROM_LOAD( "dynax_6204.14b", 0x100000, 0x80000, CRC(4142f94b) SHA1(9982f12333973b307c210e39310eafc88b8620e1) )  // ~= tydg004.u21 (ougonhaib)
	ROM_LOAD( "dynax_6205.15b", 0x180000, 0x80000, CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) )  // = tydg005.u19 (ougonhaib)
ROM_END

/***************************************************************************

Mahjong 黄金の牌 (Ougon no Pai) (bootleg, PCB is not working)

PCB Layout
----------

|-------------------------------------------|
|     4558  3.579545MHz             BATTERY |
|uPC1241H  VOL  K-663A   DSW   DSW   6264   |
|                        DSW   DSW  TYDG001 |
|   DSW     NL-002    YM2149  PAL           |
|1                                          |
|8            6116                 TMP91C640|
|W                                          |
|A                         TYDG004  TYDG002 |
|Y             PAL                          |
|                                           |
|                                           |
|                          TYDG005  TYDG003 |
|          PAL                              |
|                      PAL                  |
|1                PAL                       |
|0                                          |
|W  81461  81461  TK-101                    |
|A  81461  81461                            |
|Y  81461  81461  21.245MHz                 |
|-------------------------------------------|

***************************************************************************/

ROM_START( ougonhaib1 )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "tydg001.u11",      0x00000, 0x40000, CRC(4ffa543c) SHA1(ab6ec7bd735358643f5186c6c983fa8b599fe84b) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	ROM_LOAD( "ougonhai_tmp91p640n-10.5b", 0x00000, 0x04000, CRC(eb7933b9) SHA1(c5c36231963681644d99130a79594cb61d0c09cc) )


	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "tydg002.u8",  0x000000, 0x80000, CRC(b0f08a20) SHA1(5f7083d5caadd77594eaf46efa11a8756cefcf7d) ) // = lzc-01.u6 [1/2]
	ROM_LOAD( "tydg003.u6",  0x080000, 0x80000, CRC(60717d91) SHA1(85dbb510d33b36d2255b740ccc4917216dd21497) )
	ROM_LOAD( "tydg004.u21", 0x100000, 0x80000, CRC(b7d49d04) SHA1(756c35bbe207b5bfc6e05d6da99a7ad5a3453506) )
	ROM_LOAD( "tydg005.u19", 0x180000, 0x80000, CRC(39e4e6f3) SHA1(5b543a5933446091d7cfd519d5a6f23047d8a9f2) ) // = taicom01.15b = lzc-01.u6 [2/2]
ROM_END


ROM_START( ougonhaib2 )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "hc03.u11",      0x00000, 0x40000, CRC(fc635d8a) SHA1(fb4cbe676022890c53e79cb173ceada5e22687f2) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	ROM_LOAD( "ougonhai_tmp91p640n-10.5b", 0x00000, 0x04000, CRC(eb7933b9) SHA1(c5c36231963681644d99130a79594cb61d0c09cc) )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "hc02.u8", 0x000000, 0x80000, CRC(f656e314) SHA1(69069a3cb961179edb7ba9ada3f574f37e3cbd80) )
	ROM_CONTINUE(0x100000, 0x80000)
	ROM_LOAD( "hc01.u19", 0x080000, 0x80000, CRC(57ce658b) SHA1(0608625ac112dea5d433f843230cf192623eddfc) )
	ROM_CONTINUE(0x180000, 0x80000)
ROM_END


ROM_START( ougonhaib3 )
	ROM_REGION( 0x50000, "maincpu", 0 )
	ROM_LOAD( "mg-1.u11",      0x00000, 0x40000, CRC(dd1ed979) SHA1(53ae532f789b184c7cd4d504408f4ad2c1492cfb) )
	ROM_RELOAD(                   0x10000, 0x40000 )
	ROM_RELOAD(                   0x10000, 0x38000 )
	ROM_CONTINUE(0, 0x4000)
	ROM_IGNORE(0x4000)

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "mc-1.u8",  0x000000, 0x100000, CRC(786698e3) SHA1(9ddf4e31f454fb3c7969b1433771e95a976de741) )
	ROM_LOAD( "mg-3.u21", 0x100000, 0x080000, CRC(8ef6a17a) SHA1(f4cbf91dd33b2a96a6a2ad67da3c9a69892e2405) )  // BADADDR     xx-xxxxxxxxxxxxxxxx
	ROM_LOAD( "m27c512.u15", 0x180000, 0x010000, CRC(4adbb785) SHA1(6838de0a7fb0fb4d566b9ed33993a51c59fb4686) )
ROM_END

/***************************************************************************

Mahjong Comic Gekijou Vol.1
(c)1991 Dynax / Tenho Iwatani
D5512068L1-1 (main PCB)
D6107068L-1  (sub PCB)

CPU: Z80B
Sound: AY-3-8912, YM2413, M5205
OSC: 20.0000MHz (near Z80B)
     14.31818MHz (near sound section)
     ?MHz (near RTC)
Custom: DYNAX NL-001
        DYNAX TC17G032AP-0246
Others: 3.6V Ni-Cd Battery, M6242B RTC

ROMs:
6101.2D      [60552776] \
6102.4D      [4b4f3966] -- Programs?

6103.5D      [6d56e5c1] -- Samples?

6104.1A      [04eb1ce0] \
6105.2A      [54115f33] |
6106.3A      [093faddb] |
6107.4A      [0b0997f5] |
6108.5A      [bd31ae6f] |
6109.1B      [cf718f69] |- Graphics
6110.2B      [2865eae4] |
6111.3B      [581edcc0] |
6112.4B      [3083c0cf] |
6113.5B      [e34e9541] |
6114.1C      [1aa9a1d7] /

d61a.4e \
d61b.7b -- PAL16CEV8 (not dumped)

6104-6114 and D61B is on sub PCB, others are on main PCB

***************************************************************************/

ROM_START( mjcomv1 )
	ROM_REGION( 0x10000 + 0x28*0x8000, "maincpu", 0 )   // Z80 Code
	ROM_LOAD( "6101.2d", 0x000000, 0x20000, CRC(60552776) SHA1(9876f1aece8f25b7e495c6fac24ebb5028916f73) )
	// 00-03
	ROM_RELOAD(          0x010000, 0x20000 )
	// 0c-0f
	ROM_RELOAD(          0x070000, 0x20000 )
	// 24-27
	ROM_RELOAD(          0x130000, 0x20000 )
	// 04-07
	ROM_LOAD( "6102.4d", 0x030000, 0x20000, CRC(4b4f3966) SHA1(150cf8fe6342ea9a956073b3ebba6553c13e9cf8) )
	// 08-0b
	ROM_LOAD( "6103.5d", 0x050000, 0x20000, CRC(6d56e5c1) SHA1(2c02a400d21e442cdd68bf6210b397b770cde3b5) )  // 1ST AND 2ND HALF IDENTICAL

	ROM_REGION( 0x500000, "blitter", 0 )   // blitter data
	//                   0x200000, 0x20000
	ROM_LOAD( "6105.2a", 0x220000, 0x20000, CRC(54115f33) SHA1(ed7d00c9b5c8aad066cf92c627b36c3a5e982d9f) )
	ROM_LOAD( "6106.3a", 0x240000, 0x20000, CRC(093faddb) SHA1(ac8ee5abcd8a7b28f28407f5488c21a4bbff305a) )
	ROM_LOAD( "6107.4a", 0x260000, 0x20000, CRC(0b0997f5) SHA1(ef31ca2818b8aef7fac01293e34fd7b37c8326f4) )
	ROM_LOAD( "6108.5a", 0x280000, 0x20000, CRC(bd31ae6f) SHA1(cc322dd07acab85874e5f033c65d2c99838d7474) )
	ROM_LOAD( "6109.1b", 0x2a0000, 0x20000, CRC(cf718f69) SHA1(0e8f9e6c9ef35f71a4b7fcaf62e4c22b486dcb9d) )
	ROM_LOAD( "6110.2b", 0x2c0000, 0x20000, CRC(2865eae4) SHA1(dd945a2a531a08e654f13c135bb9cb799589d513) )
	ROM_LOAD( "6111.3b", 0x2e0000, 0x20000, CRC(581edcc0) SHA1(d52de6ca199f03e0d88c8e4275fe2b37b3ef6016) )
	ROM_LOAD( "6112.4b", 0x300000, 0x20000, CRC(3083c0cf) SHA1(24465e2d01cb0f0646644a3a5d57d9c0f456cf96) )
	ROM_LOAD( "6113.5b", 0x320000, 0x20000, CRC(e34e9541) SHA1(fbe457b4107730f3d633536e82b9271dcbc71559) )
	ROM_LOAD( "6114.1c", 0x340000, 0x20000, CRC(1aa9a1d7) SHA1(67991ff4968443e596fd2fadb097e32d2e6802c3) )
	ROM_LOAD( "6104.1a", 0x400000, 0x80000, CRC(04eb1ce0) SHA1(670b213db190bb845c0a99e0a8b166ebff8a7ea1) )
ROM_END


/*
特急回転盤 Part 2 - Mahjong Tokkyū Kaiten-ban Part 2
Dynax 1991
*/

ROM_START( mjtkp2 )
	ROM_REGION( 0x50000, "maincpu", ROMREGION_ERASE00 )
	ROM_LOAD( "5909c_dynax.5a", 0x00000, 0x20000, CRC(61916017) SHA1(2f39749512a3e36966e3bd787f1fa3378e96b4bb) )
	ROM_RELOAD(                 0x10000, 0x20000 )
	ROM_RELOAD(                 0x30000, 0x20000 )
	ROM_LOAD( "tmp91c640n.2c",  0x00000, 0x04000, CRC(8fe634dd) SHA1(f11cd2160ecabe71edfddc956c323ff2e75d6cce) ) // chip type guessed (scratched off). MCU has pins  9, 10, 13, 14, 15, 16 stripped out

	ROM_REGION( 0x100000, "blitter", ROMREGION_ERASE00 )
	ROM_LOAD( "5901_dynax.15a", 0x00000, 0x20000, CRC(8b9d0192) SHA1(77ba366c87d3f1eb5549de30a1d066684950622a) ) // points, bets
	ROM_LOAD( "5902_dynax.13a", 0x20000, 0x20000, CRC(c053ba24) SHA1(76524a5a8f727c50be13adbca5eb9388c1f9887c) ) // text and mahjong tiles
	ROM_LOAD( "5903_dynax.12a", 0x40000, 0x20000, CRC(20f68aa7) SHA1(e18d39962caefb22c1ff39fd0fda0563877fa79c) )
	ROM_LOAD( "5904_dynax.10a", 0x60000, 0x20000, CRC(098a15dc) SHA1(4cc3313ca56c9c9a42e294e6d837c24c00463f73) ) // girl check D-E
	ROM_LOAD( "5908_dynax.6a",  0x80000, 0x20000, CRC(7ef47e7b) SHA1(15d05b8c52b82f1b43f0cc03979b2f2e8dd05ddd) ) // girl check B
	ROM_LOAD( "5907_dynax.7a",  0xa0000, 0x20000, CRC(f36baf94) SHA1(8474404a4137f7448c66a5adf507b474a97443a2) ) // girl check C
	ROM_LOAD( "5906_dynax.8a",  0xc0000, 0x20000, CRC(283935b1) SHA1(6af14310e44dfd7102f3c649c0c729ef406545e6) ) // girl check A
	ROM_LOAD( "5905a_dynax.9a", 0xe0000, 0x20000, CRC(62f9f922) SHA1(b75978db127fa24b28ac2c7c2587f3a5a360df6d) ) // title
ROM_END


/***************************************************************************

華仁義 Hana Jingi
Dynax 1990

PCB Layout
----------

|---------------------------------------------------|
|             PAL               SDIP64     H04.1    |
|    MB81461                               H05.2    |
|    MB81461  MB81461           H01.20     H06.3    |
|    MB81461  MB81461           H02.21     H07.4    |
|    MB81461  MB81461 PAL       H03.22     H08.5    |
|M            MB81461                      H09.6    |
|A                HD46505                           |
|H                                                  |
|J                                                  |
|O                6116          PAL                 |
|N DSW2                                             |
|G DSW3           6116                              |
|  DSW4    M5205                  |------22MHz------|
|      384kHz                     |                 |
|   LM358       AY38912           |                 |
|MB3712 LM358 YM2413      ULN2003 |            /\   |
|VOL1 VOL2 3.579545MHz DSW1 JP1   | DIP40      |    |
|---------------------------------|------------|----|
Notes:                            Sub Board Above
      JP1     - 8 position connector
      AY38912 - Clock 1.375MHz [22/16]
      YM2413  - Clock 3.579545MHz
      M5205   - Clock 384kHz
      ALL ROMs- Type 27C010


Sub Board
---------
D3312108L1-2
|----------------|
|DIP16 DIP14 SW1 |
| DIP24      0.1F|
| Z80      DIP28 |
| DIP40  H10B.4A |
|----------------|
Notes:
      DIP40 - connection socket
      DIP28 - Scratched chip, likely 6264 or 62256 SRAM
      DIP14 - Scratched chip, likely logic
      DIP16 - Scratched chip, likely logic
      DIP24 - Scratched chip, likely a PAL (PAL22V10 or something)
      0.1F  - 0.1 Farad supercap
      SW1   - SPST switch
      Z80   - Clock 5.5MHz [22/4]
      H10B.4A - 27C010 EPROM

***************************************************************************/

ROM_START( hjingi )
	ROM_REGION( 0x20000, "maincpu", 0 )
	ROM_LOAD( "h10b.4a", 0x00000, 0x20000, CRC(e1152b17) SHA1(ced822eafa96c89dda82fd8ea002e86c2eb4438a) )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "h02.21", 0x00000, 0x20000, CRC(9dde2d59) SHA1(96df4ba97ee9611d9a3c7bcaae9cd97815a7b8a5) )
	ROM_LOAD( "h03.22", 0x20000, 0x20000, CRC(1ac59443) SHA1(e70fe6184e7090cf7229d83b87db65f7715de2a8) )
	ROM_LOAD( "h01.20", 0x40000, 0x20000, CRC(24391ddc) SHA1(6a2e3fae4b6d0b1d8073306f37c9fdaa04b69eb8) )
	ROM_LOAD( "h04.1",  0x60000, 0x20000, CRC(3756c745) SHA1(f275a72d6e07f21148900d24a8018d03504f249f) )
	ROM_LOAD( "h05.2",  0x80000, 0x20000, CRC(249d360a) SHA1(688fced1298c345a18314d2c88664c757a2de35c) )
	ROM_LOAD( "h06.3",  0xa0000, 0x20000, CRC(014a4945) SHA1(0cd747787a81226fd4937616a6ce45af731a4049) )
	ROM_LOAD( "h07.4",  0xc0000, 0x20000, CRC(8b6f8a2d) SHA1(c5f3ec64a7ea3edc556182f42e6da4842d88e0ba) )
	ROM_LOAD( "h08.5",  0xe0000, 0x20000, CRC(6f996e6e) SHA1(c2b916afbfd257417f0383ad261f3720a027fdd9) )
	ROM_LOAD( "h09.6", 0x100000, 0x20000, CRC(86bde64d) SHA1(d9b79184697044ae8a4d04ea22deca2e14162065) )
ROM_END

// dump of the program roms only?
ROM_START( hjingia )
	ROM_REGION( 0x20000, "maincpu", 0 )
	ROM_LOAD( "h10b.4a", 0x00000, 0x20000, CRC(a77a062a) SHA1(cae76effd573c20e20172829220587a5d200eb9e) )

	ROM_REGION( 0x200000, "blitter", 0 )   // blitter data
	ROM_LOAD( "h02.21", 0x00000, 0x20000, CRC(9dde2d59) SHA1(96df4ba97ee9611d9a3c7bcaae9cd97815a7b8a5) )
	ROM_LOAD( "h03.22", 0x20000, 0x20000, CRC(1ac59443) SHA1(e70fe6184e7090cf7229d83b87db65f7715de2a8) )
	ROM_LOAD( "h01.20", 0x40000, 0x20000, CRC(24391ddc) SHA1(6a2e3fae4b6d0b1d8073306f37c9fdaa04b69eb8) )
	ROM_LOAD( "h04.1",  0x60000, 0x20000, CRC(3756c745) SHA1(f275a72d6e07f21148900d24a8018d03504f249f) )
	ROM_LOAD( "h05.2",  0x80000, 0x20000, CRC(249d360a) SHA1(688fced1298c345a18314d2c88664c757a2de35c) )
	ROM_LOAD( "h06.3",  0xa0000, 0x20000, CRC(014a4945) SHA1(0cd747787a81226fd4937616a6ce45af731a4049) )
	ROM_LOAD( "h07.4",  0xc0000, 0x20000, CRC(8b6f8a2d) SHA1(c5f3ec64a7ea3edc556182f42e6da4842d88e0ba) )
	ROM_LOAD( "h08.5",  0xe0000, 0x20000, CRC(6f996e6e) SHA1(c2b916afbfd257417f0383ad261f3720a027fdd9) )
	ROM_LOAD( "h09.6", 0x100000, 0x20000, CRC(86bde64d) SHA1(d9b79184697044ae8a4d04ea22deca2e14162065) )
ROM_END

/***************************************************************************

Mahjong Gekisha
1989 Dynax

Alternate title on flyers: Mahjoung Exposé (sic)

PCB Layout
----------
                            SUBBOARD HERE
D2809218L-1                    |
|--------------------------|---|-------|
|                          |   \/  5563|
|          2801 2802 2803 2804 2805    |
|    HD46505               |           |
|                          |           |
|            TC17G032AP-0246           |
|M                         |           |
|A                  4461   |-----------|
|H                  4461           0.1F|
|J                                     |
|O                  82S147  PAL        |
|N      DSW1                           |
|G      DSW2        82S147             |
|       DSW3                           |
|       DSW4  YM2413                   |
|                           62003      |
|    MB3712 VOL             CN1   24MHz|
|--------------------------------------|
Notes:
      CN1  - 8 pin connector
      0.1F - 0.1 Farad Supercap
      5563 - 8kx8 SRAM
      4461 - TMS4461 64kx4 Multiport Video RAM


Sub Board

D2809218L-2
|------------|
|DIP16  10MHz|
|  SDIP64    |
|            |
|DIP20  DIP20|
|            |
|  2806.IC6  |
|------------|
Notes:
      DIPxx    - unknown DIP chips, surface scratched
      SDIP64   - probably MCU
      2806.IC6 - 27C512 EPROM

***************************************************************************/

ROM_START( gekisha )
	ROM_REGION( 0x50000, "maincpu", 0 ) // TLCS90 Code
	ROM_LOAD( "2806.ic6",  0x00000, 0x10000, CRC(823214d7) SHA1(61e6b892f4bbed7ef5630e434f009b1cbf1a4a95) )
	ROM_LOAD( "2805.ic19", 0x10000, 0x10000, CRC(03e2ed1a) SHA1(644153a186a787efdb12a108d49700e1c94e8af2) )

	ROM_REGION( 0x80000, "blitter", 0 )    // blitter data
	ROM_LOAD( "2801.ic40", 0x00000, 0x20000, CRC(cf75f9a4) SHA1(d078d009c347f927d8efd325921f4f75f6485c79) )
	ROM_LOAD( "2802.ic32", 0x20000, 0x20000, CRC(c505c64a) SHA1(3920a085e7afacc1fa2fbc862d0e92fc2955d636) )
	ROM_LOAD( "2803.ic31", 0x40000, 0x20000, CRC(bfc8ffca) SHA1(adceebcde8f0b649219503257bb968202697b96a) )
	ROM_LOAD( "2804.ic22", 0x60000, 0x10000, CRC(94911930) SHA1(08bc57329a3c7aa716d9aee87bf84a2992269c07) )

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs (same as mjfriday)
	ROM_LOAD( "pr2.ic27", 0x000, 0x200, CRC(d6db5c60) SHA1(89ee10d092011c2c4eaab2c097aa88f5bb98bb97) )  // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "pr1.ic26", 0x200, 0x200, CRC(af5edf32) SHA1(7202e0aa1ee3f22e3c5fb69a88db455a241929c5) )
ROM_END

ROM_START( gekishap2 ) // same PCB set as gekisha
	ROM_REGION( 0x50000, "maincpu", 0 ) // TLCS90 Code
	ROM_LOAD( "dynax_2816.ic6",  0x00000, 0x10000, CRC(78be48da) SHA1(72455cd60fd39690b6c8ac737e1e5c8b3aa01d2b) ) // only ROM on the sub board
	ROM_LOAD( "dynax_2805.ic19", 0x10000, 0x10000, CRC(03e2ed1a) SHA1(644153a186a787efdb12a108d49700e1c94e8af2) ) // same as gekisha

	ROM_REGION( 0x80000, "blitter", 0 )    // blitter data
	ROM_LOAD( "dynax_2801.ic40", 0x00000, 0x20000, CRC(cf75f9a4) SHA1(d078d009c347f927d8efd325921f4f75f6485c79) )
	ROM_LOAD( "dynax_2802.ic32", 0x20000, 0x20000, CRC(c505c64a) SHA1(3920a085e7afacc1fa2fbc862d0e92fc2955d636) )
	ROM_LOAD( "dynax_2803.ic31", 0x40000, 0x20000, CRC(bfc8ffca) SHA1(adceebcde8f0b649219503257bb968202697b96a) )
	ROM_LOAD( "dynax_2814.ic22", 0x60000, 0x10000, CRC(b8c6760d) SHA1(bfb6d6e3c34f71a83d95d567060c6e362d7f879e) ) // only blitter ROM differing from gekisha

	ROM_REGION( 0x400, "proms", 0 ) // Color PROMs (same as mjfriday)
	ROM_LOAD( "pr2.ic27", 0x000, 0x200, CRC(d6db5c60) SHA1(89ee10d092011c2c4eaab2c097aa88f5bb98bb97) )  // FIXED BITS (0xxxxxxx)
	ROM_LOAD( "pr1.ic26", 0x200, 0x200, CRC(af5edf32) SHA1(7202e0aa1ee3f22e3c5fb69a88db455a241929c5) )
ROM_END


/***************************************************************************


                                Game Drivers


***************************************************************************/

GAME( 1988, janyuki,    0,        janyuki,    janyuki,  jantouki_state,    empty_init,    ROT0,   "Dynax",                     "Jong Yu Ki (Japan)",                                            MACHINE_SUPPORTS_SAVE )
GAME( 1988, hanamai,    0,        hanamai,    hanamai,  dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana no Mai (Japan)",                                           MACHINE_SUPPORTS_SAVE )
GAME( 1989, hnkochou,   hanamai,  hanamai,    hnkochou, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana Kochou (Japan)",                                           MACHINE_SUPPORTS_SAVE )
GAME( 1990, hjingi,     0,        hjingi,     hjingi,   dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana Jingi (Japan set 1)",                                      MACHINE_SUPPORTS_SAVE ) // 1990 05/01 11:58:24
GAME( 1990, hjingia,    hjingi,   hjingi,     hjingi,   dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana Jingi (Japan set 2)",                                      MACHINE_SUPPORTS_SAVE ) // 1990 05/01 11:58:24
GAME( 1989, hnoridur,   hjingi,   hnoridur,   hnoridur, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana Oriduru (Japan)",                                          MACHINE_SUPPORTS_SAVE )
GAME( 1989, drgpunch,   0,        sprtmtch,   drgpunch, dynax_state,       empty_init,    ROT0,   "Dynax",                     "Dragon Punch (Japan, ver. 1.30)",                               MACHINE_SUPPORTS_SAVE )
GAME( 1989, drgpunchbl, drgpunch, sprtmtch,   drgpunch, dynax_state,       empty_init,    ROT0,   "Dynax",                     "Dragon Punch (Japan, ver. 1.30, bootleg)",                      MACHINE_SUPPORTS_SAVE )
GAME( 1989, sprtmtch,   drgpunch, sprtmtch,   sprtmtch, dynax_state,       empty_init,    ROT0,   "Dynax (Fabtek license)",    "Sports Match",                                                  MACHINE_SUPPORTS_SAVE )
// these 3 are Korean hacks / bootlegs of Dragon Punch / Sports Match
GAME( 1994, maya,       0,        sprtmtch,   drgpunch, blktouch_state,    init_maya,     ROT0,   "Promat",                    "Maya (set 1)",                                                  MACHINE_SUPPORTS_SAVE ) // this set has backgrounds blacked out in attract
GAME( 1994, mayaa,      maya,     sprtmtch,   drgpunch, blktouch_state,    init_maya,     ROT0,   "Promat",                    "Maya (set 2)",                                                  MACHINE_SUPPORTS_SAVE ) // this set has backgrounds blacked out in attract
GAME( 1994, mayab,      maya,     sprtmtch,   drgpunch, blktouch_state,    init_maya,     ROT0,   "Promat",                    "Maya (set 3)",                                                  MACHINE_SUPPORTS_SAVE )
GAME( 1994, mayac,      maya,     sprtmtch,   drgpunch, blktouch_state,    init_mayac,    ROT0,   "Promat",                    "Maya (set 4, clean)",                                           MACHINE_SUPPORTS_SAVE )
GAME( 199?, inca,       0,        sprtmtch,   drgpunch, blktouch_state,    init_maya,     ROT0,   "<unknown>",                 "Inca",                                                          MACHINE_SUPPORTS_SAVE ) // PCB by "Barko", game too?
GAME( 199?, blktouch,   0,        sprtmtch,   drgpunch, blktouch_state,    init_blktouch, ROT0,   "Yang Gi Co Ltd.",           "Black Touch (Korea)",                                           MACHINE_SUPPORTS_SAVE )

GAME( 1989, mjfriday,   0,        mjfriday,   mjfriday, dynax_state,       empty_init,    ROT180, "Dynax",                     "Mahjong Friday (Japan)",                                        MACHINE_SUPPORTS_SAVE )
GAME( 1989, gekisha,    0,        gekisha,    gekisha,  dynax_state,       empty_init,    ROT180, "Dynax",                     "Mahjong Gekisha (Japan)",                                       MACHINE_SUPPORTS_SAVE )
GAME( 1990, gekishap2,  gekisha,  gekisha,    gekisha,  dynax_state,       empty_init,    ROT180, "Dynax",                     "Mahjong Gekisha Part II (Japan)",                               MACHINE_SUPPORTS_SAVE )
GAME( 1990, mcnpshnt,   0,        mcnpshnt,   mcnpshnt, dynax_adpcm_state, empty_init,    ROT0,   "Dynax",                     "Mahjong Campus Hunting (Japan)",                                MACHINE_SUPPORTS_SAVE )
GAME( 1990, 7jigen,     0,        nanajign,   nanajign, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "7jigen no Youseitachi - Mahjong 7 Dimensions (Japan)",          MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1990, jantouki,   0,        jantouki,   jantouki, jantouki_state,    empty_init,    ROT0,   "Dynax",                     "Jong Tou Ki (Japan)",                                           MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjdialq2,   0,        mjdialq2,   mjdialq2, dynax_state,       empty_init,    ROT180, "Dynax",                     "Mahjong Dial Q2 (Japan set 1)",                                 MACHINE_SUPPORTS_SAVE ) // "VER. 1.00" at bootup
GAME( 1991, mjdialq2a,  mjdialq2, mjdialq2,   mjdialq2, dynax_state,       empty_init,    ROT180, "Dynax",                     "Mahjong Dial Q2 (Japan set 2)",                                 MACHINE_SUPPORTS_SAVE ) // "VER. 1.00" at bootup
GAME( 1991, yarunara,   0,        yarunara,   yarunara, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Mahjong Yarunara (Japan)",                                      MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjangels,   0,        mjangels,   yarunara, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Mahjong Angels - Comic Theater Vol.2 (Japan)",                  MACHINE_SUPPORTS_SAVE )
GAME( 1991, warahana,   0,        mjangels,   warahana, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Warai no Hana Tenshi (Japan)",                                  MACHINE_SUPPORTS_SAVE )
GAME( 1992, quiztvqq,   0,        quiztvqq,   quiztvqq, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Quiz TV Gassyuukoku Q&Q (Japan)",                               MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelctrn,   0,        mjelctrn,   mjelctrn, dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax",                     "Mahjong Electron Base (parts 2 & 4, Japan)",                    MACHINE_SUPPORTS_SAVE )
GAME( 1989, mjembase,   mjelctrn, mjembase,   mjembase, dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax",                     "Mahjong Electromagnetic Base (Japan)",                          MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3,    mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax",                     "Mahjong Electron Base (parts 2 & 3, Japan set 1)",              MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3a,   mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3a, ROT180, "Dynax",                     "Mahjong Electron Base (parts 2 & 3, Japan set 2)",              MACHINE_SUPPORTS_SAVE )
GAME( 1990, mjelct3b,   mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax",                     "Mahjong Electron Base (parts 2 & 3, Japan set 3)",              MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelctrb,   mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "bootleg",                   "Mahjong Electron Base (parts 2 & 4, Japan bootleg)",            MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelct3bl,  mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "bootleg",                   "Mahjong Electron Base (parts 2 & 3, Japan bootleg set 1)",      MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelct3bla, mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "bootleg",                   "Mahjong Electron Base (parts 2 & 3, Japan bootleg set 2)",      MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1993, mjelct3blb, mjelctrn, mjelctrn,   mjelct3,  dynax_adpcm_state, init_mjelct3,  ROT180, "bootleg",                   "Mahjong Electron Base (parts 2 & 3, Japan bootleg set 3)",      MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1990, majxtal7,   7jigen,   neruton,    majxtal7, dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax",                     "Mahjong X-Tal 7 - Crystal Mahjong / Mahjong Diamond 7 (Japan)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) // reuses a subset of 7jigen assets
GAME( 1990, neruton,    0,        neruton,    neruton,  dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax / Yukiyoshi Tokoro",  "Mahjong Neruton Haikujiradan (Japan, Rev. B?)",                 MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1990, nerutona,   neruton,  neruton,    nerutona, dynax_adpcm_state, init_mjelct3,  ROT180, "Dynax / Yukiyoshi Tokoro",  "Mahjong Neruton Haikujiradan (Japan, Rev. A?)",                 MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1997, qyjdzjp,    mjelctrn, qyjdzjp,    mjelct3,  dynax_state,       empty_init,    ROT180, "bootleg (Hom Inn)",         "Que You Ji - Dian Zi Ji Pan Jiaqiang Ban (v201)",               MACHINE_SUPPORTS_SAVE )
GAME( 1995, baoqingt,   0,        baoqingt,   mjelct3,  dynax_state,       empty_init,    ROT0,   "TIC",                       "Bao Qing Tian (TIC)",                                           MACHINE_NOT_WORKING | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE )
GAME( 1991, hanayara,   0,        yarunara,   hanayara, dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Hana wo Yaraneba! (Japan)",                                     MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjcomv1,    0,        mjangels,   mjcomv1,  dynax_adpcm_state, empty_init,    ROT180, "Dynax",                     "Mahjong Comic Gekijou Vol.1 (Japan)",                           MACHINE_SUPPORTS_SAVE )
GAME( 1991, tenkai,     0,        tenkai,     tenkai,   dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Tenkaigen (Japan)",                                     MACHINE_SUPPORTS_SAVE )
GAME( 1991, tenkai2b,   tenkai,   tenkai,     tenkai,   dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Tenkaigen Part 2 (bootleg)",                            MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // FIXME: check if Japan & medal
GAME( 1991, tenkaibb,   tenkai,   tenkai,     tenkai,   dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Tenkaigen (Japan bootleg b)",                           MACHINE_SUPPORTS_SAVE ) // FIXME: check if "b" is a PCB rev. letter
GAME( 1991, tenkaicb,   tenkai,   tenkai,     tenkai,   dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Tenkaigen (Japan bootleg c)",                           MACHINE_SUPPORTS_SAVE ) // FIXME: check if "c" is a PCB rev. letter
GAME( 1991, tenkaie,    tenkai,   tenkai,     tenkai,   dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Tenkaigen (Japan set 2)",                               MACHINE_SUPPORTS_SAVE )
GAME( 1991, ougonhai,   0,        ougonhai,   ougonhai, dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Ougon no Pai (Japan)",                                  MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // FIXME: correct TMP90840 hookup, confirm being a medal game as well
GAME( 1991, ougonhaib1, ougonhai, ougonhaib1, ougonhai, dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Ougon no Pai (Japan bootleg set 1, medal)",             MACHINE_SUPPORTS_SAVE )
GAME( 1991, ougonhaib2, ougonhai, ougonhaib1, ougonhai, dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Ougon no Pai (Japan bootleg set 2, medal)",             MACHINE_SUPPORTS_SAVE )
GAME( 1991, ougonhaib3, ougonhai, ougonhaib1, ougonhai, dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Ougon no Pai (Japan bootleg set 3, medal)",             MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1991, mjtkp2,     0,        mjtkp2,     mjreach,  dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Tokkyu Kaiten-ban Part 2 (Japan)",                      MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // inputs / DSW, GFX glitches
GAME( 1994, mjreach,    0,        mjreach,    mjreach,  dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Reach (Ver. 1.00, set 1)",                              MACHINE_SUPPORTS_SAVE )
GAME( 1994, mjreacha,   mjreach,  mjreach,    mjreach,  dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Reach (Ver. 1.00, set 2)",                              MACHINE_SUPPORTS_SAVE )
GAME( 1994, mjreachbl,  mjreach,  mjreach,    mjreach,  dynax_state,       empty_init,    ROT0,   "bootleg",                   "Mahjong Reach (Ver. 1.00, bootleg)",                            MACHINE_SUPPORTS_SAVE )
GAME( 1994, mjreachp2,  mjreach,  mjreachp2,  mjreach,  dynax_state,       empty_init,    ROT0,   "Dynax",                     "Mahjong Reach Part II (Ver. D88)",                              MACHINE_SUPPORTS_SAVE )
GAME( 1994, cdracula,   0,        cdracula,   cdracula, cdracula_state,    empty_init,    ROT0,   "Yun Sung (Escape license)", "Castle Of Dracula",                                             MACHINE_SUPPORTS_SAVE ) // not a Dynax board
GAME( 1995, shpeng,     0,        sprtmtch,   drgpunch, dynax_state,       empty_init,    ROT0,   "WSAC Systems?",             "Sea Hunter Penguin",                                            MACHINE_NO_COCKTAIL | MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // not a Dynax board. PROMs?
GAME( 1995, intrgirl,   0,        sprtmtch,   drgpunch, dynax_state,       empty_init,    ROT0,   "Barko",                     "Intergirl",                                                     MACHINE_NO_COCKTAIL | MACHINE_SUPPORTS_SAVE ) // not a Dynax board.
