summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/igs_blit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/igs_blit.c')
-rw-r--r--src/mame/drivers/igs_blit.c3022
1 files changed, 3022 insertions, 0 deletions
diff --git a/src/mame/drivers/igs_blit.c b/src/mame/drivers/igs_blit.c
new file mode 100644
index 00000000000..f5e6421ded7
--- /dev/null
+++ b/src/mame/drivers/igs_blit.c
@@ -0,0 +1,3022 @@
+/***************************************************************************
+
+ -= IGS Blitter Based Hardware =-
+
+ driver by Luca Elia (l.elia@tin.it)
+ code decrypted by Olivier Galibert
+
+
+CPU : 68000
+Sound : M6295 + Optional FM / ICS2115
+Video : IGS011
+NVRAM : Battery for main RAM
+
+---------------------------------------------------------------------------
+Year + Game FM Sound Chips
+---------------------------------------------------------------------------
+1995 Long Hu Bang - ?
+1995 Zhong Guo Long YM3812 IGS003, IGS011, IGS012, IGSD0301
+1996 Long Hu Bang II YM2413 IGS011
+1996 Wan Li Chang Cheng - ?
+1996 Xing Yen Man Guan - ?
+1996 Virtua Bowling - IGS011, IGS012
+---------------------------------------------------------------------------
+
+To do:
+
+- Protection emulation instead of patching the roms
+- A few graphical bugs
+- xymg: when you press Reach it locks.
+- vbowlj: trackball support, slow & low volume sound
+- vbowl: decryption & protection
+- lhb: in the copyright screen the '5' in '1995' is drawn by the cpu on layer 5,
+ but with wrong colors (since the top nibble of the affected pixels is left to 0xf)
+
+***************************************************************************/
+
+#include "driver.h"
+#include "sound/okim6295.h"
+#include "sound/2413intf.h"
+#include "sound/3812intf.h"
+#include "sound/ics2115.h"
+
+/***************************************************************************
+
+ Video
+
+ There are 8 non scrolling layers as big as the screen (512 x 256).
+ Each layer has 256 colors and its own palette.
+
+ There are 8 priority codes with RAM associated to each (8 x 256 values).
+ For each screen position, to determine which pixel to display, the video
+ chip associates a bit to the opacity of that pixel for each layer
+ (1 = trasparent) to form an address into the selected priority RAM.
+ The value at that address (0-7) is the topmost layer.
+
+***************************************************************************/
+
+static UINT8 *layer[8];
+
+static UINT16 igs_priority, *igs_priority_ram;
+
+static UINT8 chmplst2_pen_hi; // high 3 bits of pens (chmplst2 only)
+
+
+static WRITE16_HANDLER( igs_priority_w )
+{
+ COMBINE_DATA(&igs_priority);
+
+// logerror("%06x: igs_priority = %02x\n", activecpu_get_pc(), igs_priority);
+
+ if (data & ~0x7)
+ logerror("%06x: warning, unknown bits written to igs_priority = %02x\n", activecpu_get_pc(), igs_priority);
+}
+
+
+static VIDEO_START(igs)
+{
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ layer[i] = auto_malloc(512 * 256);
+ }
+
+ chmplst2_pen_hi = 0;
+}
+
+static VIDEO_UPDATE(igs)
+{
+#ifdef MAME_DEBUG
+ int layer_enable = -1;
+#endif
+
+ int x,y,l,scr_addr,pri_addr;
+ UINT16 *pri_ram;
+
+#ifdef MAME_DEBUG
+ if (input_code_pressed(KEYCODE_Z))
+ {
+ int mask = 0;
+ if (input_code_pressed(KEYCODE_Q)) mask |= 0x01;
+ if (input_code_pressed(KEYCODE_W)) mask |= 0x02;
+ if (input_code_pressed(KEYCODE_E)) mask |= 0x04;
+ if (input_code_pressed(KEYCODE_R)) mask |= 0x08;
+ if (input_code_pressed(KEYCODE_A)) mask |= 0x10;
+ if (input_code_pressed(KEYCODE_S)) mask |= 0x20;
+ if (input_code_pressed(KEYCODE_D)) mask |= 0x40;
+ if (input_code_pressed(KEYCODE_F)) mask |= 0x80;
+ if (mask) layer_enable &= mask;
+ }
+#endif
+
+ pri_ram = &igs_priority_ram[(igs_priority & 7) * 512/2];
+
+ for (y = cliprect->min_y; y <= cliprect->max_y; y++)
+ {
+ for (x = cliprect->min_x; x <= cliprect->max_x; x++)
+ {
+ scr_addr = x + y * 512;
+ pri_addr = 0xff;
+
+ for (l = 0; l < 8; l++)
+ {
+ if ( (layer[l][scr_addr] != 0xff)
+#ifdef MAME_DEBUG
+ && (layer_enable & (1 << l))
+#endif
+ )
+ pri_addr &= ~(1 << l);
+ }
+
+
+ l = pri_ram[pri_addr] & 7;
+
+#ifdef MAME_DEBUG
+ if ((layer_enable != -1) && (pri_addr == 0xff))
+ *BITMAP_ADDR16(bitmap, y, x) = get_black_pen(machine);
+ else
+#endif
+ *BITMAP_ADDR16(bitmap, y, x) = layer[l][scr_addr] | (l << 8);
+ }
+ }
+ return 0;
+}
+
+static READ16_HANDLER( igs_layers_r )
+{
+ int layer0 = ((offset & (0x80000/2)) ? 4 : 0) + ((offset & 1) ? 0 : 2);
+
+ UINT8 *l0 = layer[layer0];
+ UINT8 *l1 = layer[layer0+1];
+
+ offset >>= 1;
+ offset &= 0x1ffff;
+
+ return (l0[offset] << 8) | l1[offset];
+}
+
+static WRITE16_HANDLER( igs_layers_w )
+{
+ UINT16 word;
+
+ int layer0 = ((offset & (0x80000/2)) ? 4 : 0) + ((offset & 1) ? 0 : 2);
+
+ UINT8 *l0 = layer[layer0];
+ UINT8 *l1 = layer[layer0+1];
+
+ offset >>= 1;
+ offset &= 0x1ffff;
+
+ word = (l0[offset] << 8) | l1[offset];
+ COMBINE_DATA(&word);
+ l0[offset] = word >> 8;
+ l1[offset] = word;
+}
+
+/***************************************************************************
+
+ Blitter
+
+***************************************************************************/
+
+static struct
+{
+
+ UINT16 x, y, w, h,
+ gfx_lo, gfx_hi,
+ depth,
+ pen,
+ flags;
+
+} blitter;
+
+
+static WRITE16_HANDLER( igs_blit_x_w ) { COMBINE_DATA(&blitter.x); }
+static WRITE16_HANDLER( igs_blit_y_w ) { COMBINE_DATA(&blitter.y); }
+static WRITE16_HANDLER( igs_blit_gfx_lo_w ) { COMBINE_DATA(&blitter.gfx_lo); }
+static WRITE16_HANDLER( igs_blit_gfx_hi_w ) { COMBINE_DATA(&blitter.gfx_hi); }
+static WRITE16_HANDLER( igs_blit_w_w ) { COMBINE_DATA(&blitter.w); }
+static WRITE16_HANDLER( igs_blit_h_w ) { COMBINE_DATA(&blitter.h); }
+static WRITE16_HANDLER( igs_blit_depth_w ) { COMBINE_DATA(&blitter.depth); }
+static WRITE16_HANDLER( igs_blit_pen_w ) { COMBINE_DATA(&blitter.pen); }
+
+
+static WRITE16_HANDLER( igs_blit_flags_w )
+{
+ int x, xstart, xend, xinc, flipx;
+ int y, ystart, yend, yinc, flipy;
+ int depth4, clear, opaque, z;
+ UINT8 trans_pen, clear_pen, pen_hi, *dest;
+ UINT8 pen = 0;
+
+ UINT8 *gfx = memory_region(REGION_GFX1);
+ UINT8 *gfx2 = memory_region(REGION_GFX2);
+ int gfx_size = memory_region_length(REGION_GFX1);
+ int gfx2_size = memory_region_length(REGION_GFX2);
+
+ rectangle clip = Machine->screen[0].visarea;
+
+ COMBINE_DATA(&blitter.flags);
+
+ logerror("%06x: blit x %03x, y %03x, w %03x, h %03x, gfx %03x%04x, depth %02x, pen %02x, flags %03x\n", activecpu_get_pc(),
+ blitter.x,blitter.y,blitter.w,blitter.h,blitter.gfx_hi,blitter.gfx_lo,blitter.depth,blitter.pen,blitter.flags);
+
+ dest = layer[ blitter.flags & 0x0007 ];
+ opaque = !(blitter.flags & 0x0008);
+ clear = blitter.flags & 0x0010;
+ flipx = blitter.flags & 0x0020;
+ flipy = blitter.flags & 0x0040;
+ if (!(blitter.flags & 0x0400)) return;
+
+ pen_hi = (chmplst2_pen_hi & 0x07) << 5;
+
+ // pixel address
+ z = blitter.gfx_lo + (blitter.gfx_hi << 16);
+
+ // what were they smoking???
+ depth4 = !((blitter.flags & 0x7) < (4 - (blitter.depth & 0x7))) ||
+ (z & 0x800000); // see chmplst2
+
+ z &= 0x7fffff;
+
+ if (depth4)
+ {
+ z *= 2;
+ if (gfx2 && (blitter.gfx_hi & 0x80)) trans_pen = 0x1f; // chmplst2
+ else trans_pen = 0x0f;
+
+ clear_pen = blitter.pen | 0xf0;
+ }
+ else
+ {
+ if (gfx2) trans_pen = 0x1f; // vbowl
+ else trans_pen = 0xff;
+
+ clear_pen = blitter.pen;
+ }
+
+ xstart = (blitter.x & 0x1ff) - (blitter.x & 0x200);
+ ystart = (blitter.y & 0x0ff) - (blitter.y & 0x100);
+
+ if (flipx) { xend = xstart - (blitter.w & 0x1ff) - 1; xinc = -1; }
+ else { xend = xstart + (blitter.w & 0x1ff) + 1; xinc = 1; }
+
+ if (flipy) { yend = ystart - (blitter.h & 0x0ff) - 1; yinc = -1; }
+ else { yend = ystart + (blitter.h & 0x0ff) + 1; yinc = 1; }
+
+ for (y = ystart; y != yend; y += yinc)
+ {
+ for (x = xstart; x != xend; x += xinc)
+ {
+ // fetch the pixel
+ if (!clear)
+ {
+ if (depth4) pen = (gfx[(z/2)%gfx_size] >> ((z&1)?4:0)) & 0x0f;
+ else pen = gfx[z%gfx_size];
+
+ if ( gfx2 )
+ {
+ pen &= 0x0f;
+ if ( gfx2[(z/8)%gfx2_size] & (1 << (z & 7)) )
+ pen |= 0x10;
+ }
+ }
+
+ // plot it
+ if (x >= clip.min_x && x <= clip.max_x && y >= clip.min_y && y <= clip.max_y)
+ {
+ if (clear) dest[x + y * 512] = clear_pen;
+ else if (pen != trans_pen) dest[x + y * 512] = pen | pen_hi;
+ else if (opaque) dest[x + y * 512] = 0xff;
+ }
+
+ z++;
+ }
+ }
+
+ #ifdef MAME_DEBUG
+#if 1
+ if (input_code_pressed(KEYCODE_Z))
+ { char buf[20];
+ sprintf(buf, "%02X%02X",blitter.depth,blitter.flags&0xff);
+// ui_draw_text(buf, blitter.x, blitter.y); // crashes mame!
+ }
+#endif
+ #endif
+}
+
+/***************************************************************************
+
+ Common functions
+
+***************************************************************************/
+
+// Inputs
+
+static UINT16 igs_input_sel,igs_input_sel2;
+
+#define IGS_INPUT_RW( NUM ) \
+ \
+static WRITE16_HANDLER( igs_##NUM##_input_w ) \
+{ \
+ COMBINE_DATA(&igs_input_sel); \
+ \
+ if ( (igs_input_sel & 0xff00) || ((~igs_input_sel) & ((1 << NUM)-1)) ) \
+ logerror("%06x: warning, unknown bits written in igs_input_sel = %02x\n", activecpu_get_pc(), igs_input_sel); \
+} \
+ \
+static READ16_HANDLER( igs_##NUM##_input_r ) \
+{ \
+ int i; \
+ UINT16 ret=0; \
+ \
+ for (i = 0; i < NUM; i++) \
+ if ((~igs_input_sel) & (1 << i) ) \
+ ret = readinputport(i); \
+ \
+ /* 0x0100 is blitter busy */ \
+ return (ret & 0xff) | 0x0000; \
+}
+
+IGS_INPUT_RW( 3 )
+IGS_INPUT_RW( 4 )
+IGS_INPUT_RW( 5 )
+
+
+
+// Palette r5g5b5
+// offset+0x000: xRRRRRGG
+// offset+0x800: GGGBBBBB
+
+static WRITE16_HANDLER( igs_palette_w )
+{
+ int rgb;
+
+ COMBINE_DATA(&paletteram16[offset]);
+
+ rgb = (paletteram16[offset & 0x7ff] & 0xff) | ((paletteram16[offset | 0x800] & 0xff) << 8);
+ palette_set_color_rgb(Machine,offset & 0x7ff,pal5bit(rgb >> 0),pal5bit(rgb >> 5),pal5bit(rgb >> 10));
+}
+
+
+
+/***************************************************************************
+
+ Code Decryption
+
+***************************************************************************/
+
+static void grtwall_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for (i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if ((i & 0x2000) == 0x0000 || (i & 0x0004) == 0x0000 || (i & 0x0090) == 0x0000)
+ x ^= 0x0004;
+ if ((i & 0x0100) == 0x0100 || (i & 0x0040) == 0x0040 || (i & 0x0012) == 0x0012)
+ x ^= 0x0020;
+ if ((i & 0x2400) == 0x0000 || (i & 0x4100) == 0x4100 || ((i & 0x2000) == 0x2000 && (i & 0x0c00) != 0x0000))
+ x ^= 0x0200;
+ if ((x & 0x0024) == 0x0004 || (x & 0x0024) == 0x0020)
+ x ^= 0x0024;
+ src[i] = x;
+ }
+}
+
+
+static void lhb_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for (i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if ((i & 0x1100) != 0x0100)
+ x ^= 0x0002;
+
+ if ((i & 0x0150) != 0x0000 && (i & 0x0152) != 0x0010)
+ x ^= 0x0400;
+
+ if ((i & 0x2084) != 0x2084 && (i & 0x2094) != 0x2014)
+ x ^= 0x2000;
+
+ src[i] = (x >> 8) | (x <<8);
+ }
+}
+
+
+static void chindrag_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for (i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if ((i & 0x2000) == 0x0000 || (i & 0x0004) == 0x0000 || (i & 0x0090) == 0x0000)
+ x ^= 0x0004;
+
+ if ((i & 0x0100) == 0x0100 || (i & 0x0040) == 0x0040 || (i & 0x0012) == 0x0012)
+ x ^= 0x0020;
+
+ if ((((i & 0x1000) == 0x1000) ^ ((i & 0x0100) == 0x0100))
+ || (i & 0x0880) == 0x0800 || (i & 0x0240) == 0x0240)
+ x ^= 0x0200;
+
+ if ((x & 0x0024) == 0x0004 || (x & 0x0024) == 0x0020)
+ x ^= 0x0024;
+
+ src[i] = x;
+ }
+}
+
+
+static void drgnwrld_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for (i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if ((i & 0x2000) == 0x0000 || (i & 0x0004) == 0x0000 || (i & 0x0090) == 0x0000)
+ x ^= 0x0004;
+
+ if ((i & 0x0100) == 0x0100 || (i & 0x0040) == 0x0040 || (i & 0x0012) == 0x0012)
+ x ^= 0x0020;
+/*
+ if ((((i & 0x1000) == 0x1000) ^ ((i & 0x0100) == 0x0100))
+ || (i & 0x0880) == 0x0800 || (i & 0x0240) == 0x0240)
+ x ^= 0x0200;
+*/
+ if ((x & 0x0024) == 0x0004 || (x & 0x0024) == 0x0020)
+ x ^= 0x0024;
+
+ src[i] = x;
+ }
+}
+
+
+static void chmplst2_decrypt(void)
+{
+ int i,j;
+ int rom_size = 0x80000;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+ UINT16 *result_data = malloc_or_die(rom_size);
+
+ for (i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if ((i & 0x0054) != 0x0000 && (i & 0x0056) != 0x0010)
+ x ^= 0x0400;
+
+ if ((i & 0x0204) == 0x0000)
+ x ^= 0x0800;
+
+ if ((i & 0x3080) != 0x3080 && (i & 0x3090) != 0x3010)
+ x ^= 0x2000;
+
+ j = BITSWAP24(i, 23,22,21,20,19,18,17,16,15,14,13, 8, 11,10, 9, 2, 7,6,5,4,3, 12, 1,0);
+
+ result_data[j] = (x >> 8) | (x << 8);
+ }
+
+ memcpy(src,result_data,rom_size);
+
+ free(result_data);
+}
+
+
+
+static void vbowlj_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for(i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if((i & 0x4100) == 0x0100)
+ x ^= 0x0002;
+
+ if((i & 0x4000) == 0x4000 && (i & 0x0300) != 0x0100)
+ x ^= 0x0002;
+
+ if((i & 0x5700) == 0x5100)
+ x ^= 0x0002;
+
+ if((i & 0x5500) == 0x1000)
+ x ^= 0x0002;
+
+ if((i & 0x0140) != 0x0000 || (i & 0x0012) == 0x0012)
+ x ^= 0x0400;
+
+ if((i & 0x2004) != 0x2004 || (i & 0x0090) == 0x0000)
+ x ^= 0x2000;
+
+ src[i] = (x << 8) | (x >> 8);
+ }
+}
+
+// To do:
+#ifdef UNUSED_FUNCTION
+void vbowl_decrypt(void)
+{
+ int i;
+ UINT16 *src = (UINT16 *) (memory_region(REGION_CPU1));
+
+ int rom_size = 0x80000;
+
+ for(i=0; i<rom_size/2; i++)
+ {
+ UINT16 x = src[i];
+
+ if((i & 0x0140) == 0x0000 && (i & 0x0012) != 0x0012)
+ x ^= 0x5555;
+ else
+ x ^= 0x5d55;
+
+ x = (x >> 1) + (x << 15);
+
+ src[i] = (x << 8) | (x >> 8);
+ }
+
+// vbowlj_decrypt();
+}
+#endif
+
+
+/***************************************************************************
+
+ Gfx Decryption
+
+***************************************************************************/
+
+
+static void chmplst2_decrypt_gfx(void)
+{
+ int i;
+ unsigned rom_size = 0x200000;
+ UINT8 *src = (UINT8 *) (memory_region(REGION_GFX1));
+ UINT8 *result_data = malloc_or_die(rom_size);
+
+ for (i=0; i<rom_size; i++)
+ result_data[i] = src[BITSWAP24(i, 23,22,21,20, 19, 17,16,15, 13,12, 10,9,8,7,6,5,4, 2,1, 3, 11, 14, 18, 0)];
+
+ memcpy(src,result_data,rom_size);
+
+ free(result_data);
+}
+
+static void chindrag_gfx_decrypt(void)
+{
+ int i;
+ unsigned rom_size = 0x400000;
+ UINT8 *src = (UINT8 *) (memory_region(REGION_GFX1));
+ UINT8 *result_data = malloc_or_die(rom_size);
+
+ for (i=0; i<rom_size; i++)
+ result_data[i] = src[BITSWAP24(i, 23,22,21,20,19,18,17,16,15, 12, 13, 14, 11,10,9,8,7,6,5,4,3,2,1,0)];
+
+ memcpy(src,result_data,rom_size);
+
+ free(result_data);
+}
+
+
+
+/***************************************************************************
+
+ Protection & I/O
+
+***************************************************************************/
+
+static UINT16 igs_magic[2];
+
+static WRITE16_HANDLER( chmplst2_magic_w )
+{
+ COMBINE_DATA(&igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(igs_magic[0])
+ {
+ case 0x00:
+ COMBINE_DATA(&igs_input_sel2);
+
+ if (ACCESSING_LSB)
+ {
+ coin_counter_w(0, data & 0x20);
+ // coin out data & 0x40
+ }
+
+ if ( igs_input_sel2 & ~0x7f )
+ logerror("%06x: warning, unknown bits written in igs_input_sel2 = %02x\n", activecpu_get_pc(), igs_input_sel2);
+
+// popmessage("sel2 %02x",igs_input_sel2&~0x1f);
+ break;
+
+ case 0x02:
+ if (ACCESSING_LSB)
+ {
+ chmplst2_pen_hi = data & 0x07;
+
+ OKIM6295_set_bank_base(0, (data & 0x08) ? 0x40000 : 0);
+ }
+
+ if ( chmplst2_pen_hi & ~0xf )
+ logerror("%06x: warning, unknown bits written in chmplst2_pen_hi = %02x\n", activecpu_get_pc(), chmplst2_pen_hi);
+
+// popmessage("oki %02x",chmplst2_pen_hi & 0x08);
+ break;
+
+ default:
+ logerror("%06x: warning, writing to igs_magic %02x = %02x\n", activecpu_get_pc(), igs_magic[0], data);
+ }
+}
+
+static READ16_HANDLER( chmplst2_magic_r )
+{
+ switch(igs_magic[0])
+ {
+ case 0x01:
+ if (~igs_input_sel2 & 0x01) return readinputport(4);
+ if (~igs_input_sel2 & 0x02) return readinputport(5);
+ if (~igs_input_sel2 & 0x04) return readinputport(6);
+ if (~igs_input_sel2 & 0x08) return readinputport(7);
+ if (~igs_input_sel2 & 0x10) return readinputport(8);
+ /* fall through */
+ default:
+ logerror("%06x: warning, reading with igs_magic = %02x\n", activecpu_get_pc(), igs_magic[0]);
+ break;
+
+ case 0x03: return 0xff; // ?
+
+ // Protection:
+ // 0544FE: 20 21 22 24 25 26 27 28 2A 2B 2C 2D 2E 30 31 32 33 34
+ // 0544EC: 49 47 53 41 41 7F 41 41 3E 41 49 F9 0A 26 49 49 49 32
+
+ case 0x20: return 0x49;
+ case 0x21: return 0x47;
+ case 0x22: return 0x53;
+
+ case 0x24: return 0x41;
+ case 0x25: return 0x41;
+ case 0x26: return 0x7f;
+ case 0x27: return 0x41;
+ case 0x28: return 0x41;
+
+ case 0x2a: return 0x3e;
+ case 0x2b: return 0x41;
+ case 0x2c: return 0x49;
+ case 0x2d: return 0xf9;
+ case 0x2e: return 0x0a;
+
+ case 0x30: return 0x26;
+ case 0x31: return 0x49;
+ case 0x32: return 0x49;
+ case 0x33: return 0x49;
+ case 0x34: return 0x32;
+ }
+
+ return 0;
+}
+
+
+
+static WRITE16_HANDLER( chindrag_magic_w )
+{
+ COMBINE_DATA(&igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(igs_magic[0])
+ {
+
+ case 0x00:
+ if (ACCESSING_LSB)
+ coin_counter_w(0,data & 2);
+
+ if (data & ~0x2)
+ logerror("%06x: warning, unknown bits written in coin counter = %02x\n", activecpu_get_pc(), data);
+
+ break;
+
+ default:
+// popmessage("magic %x <- %04x",igs_magic[0],data);
+ logerror("%06x: warning, writing to igs_magic %02x = %02x\n", activecpu_get_pc(), igs_magic[0], data);
+ }
+}
+
+static READ16_HANDLER( chindrag_magic_r )
+{
+ switch(igs_magic[0])
+ {
+ case 0x00: return readinputport(4);
+ case 0x01: return readinputport(5);
+ case 0x02: return readinputport(6);
+
+ case 0x20: return 0x49;
+ case 0x21: return 0x47;
+ case 0x22: return 0x53;
+
+ case 0x24: return 0x41;
+ case 0x25: return 0x41;
+ case 0x26: return 0x7f;
+ case 0x27: return 0x41;
+ case 0x28: return 0x41;
+
+ case 0x2a: return 0x3e;
+ case 0x2b: return 0x41;
+ case 0x2c: return 0x49;
+ case 0x2d: return 0xf9;
+ case 0x2e: return 0x0a;
+
+ case 0x30: return 0x26;
+ case 0x31: return 0x49;
+ case 0x32: return 0x49;
+ case 0x33: return 0x49;
+ case 0x34: return 0x32;
+
+ default:
+ logerror("%06x: warning, reading with igs_magic = %02x\n", activecpu_get_pc(), igs_magic[0]);
+ }
+
+ return 0;
+}
+
+
+
+static WRITE16_HANDLER( grtwall_magic_w )
+{
+ COMBINE_DATA(&igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(igs_magic[0])
+ {
+ case 0x02:
+ if (ACCESSING_LSB)
+ {
+ coin_counter_w(0,data & 0x01);
+
+ OKIM6295_set_bank_base(0, (data & 0x10) ? 0x40000 : 0);
+ }
+
+ if (data & ~0x11)
+ logerror("%06x: warning, unknown bits written in coin counter = %02x\n", activecpu_get_pc(), data);
+
+// popmessage("coin %02x",data);
+ break;
+
+ default:
+ logerror("%06x: warning, writing to igs_magic %02x = %02x\n", activecpu_get_pc(), igs_magic[0], data);
+ }
+}
+
+static READ16_HANDLER( grtwall_magic_r )
+{
+ switch(igs_magic[0])
+ {
+ case 0x00: return readinputport(5);
+
+ case 0x20: return 0x49;
+ case 0x21: return 0x47;
+ case 0x22: return 0x53;
+
+ case 0x24: return 0x41;
+ case 0x25: return 0x41;
+ case 0x26: return 0x7f;
+ case 0x27: return 0x41;
+ case 0x28: return 0x41;
+
+ case 0x2a: return 0x3e;
+ case 0x2b: return 0x41;
+ case 0x2c: return 0x49;
+ case 0x2d: return 0xf9;
+ case 0x2e: return 0x0a;
+
+ case 0x30: return 0x26;
+ case 0x31: return 0x49;
+ case 0x32: return 0x49;
+ case 0x33: return 0x49;
+ case 0x34: return 0x32;
+
+ default:
+ logerror("%06x: warning, reading with igs_magic = %02x\n", activecpu_get_pc(), igs_magic[0]);
+ }
+
+ return 0;
+}
+
+
+
+static WRITE16_HANDLER( lhb_okibank_w )
+{
+ if (ACCESSING_MSB)
+ {
+ OKIM6295_set_bank_base(0, (data & 0x200) ? 0x40000 : 0);
+ }
+
+ if ( data & (~0x200) )
+ logerror("%06x: warning, unknown bits written in oki bank = %02x\n", activecpu_get_pc(), data);
+
+// popmessage("oki %04x",data);
+}
+
+static WRITE16_HANDLER( lhb_input2_w )
+{
+ COMBINE_DATA(&igs_input_sel2);
+
+ if (ACCESSING_LSB)
+ {
+ coin_counter_w(0, data & 0x20 );
+ // coin out data & 0x40
+ // pay out? data & 0x80
+ }
+
+ if ( igs_input_sel2 & (~0x7f) )
+ logerror("%06x: warning, unknown bits written in igs_input_sel2 = %02x\n", activecpu_get_pc(), igs_input_sel2);
+
+// popmessage("sel2 %02x",igs_input_sel2&~0x1f);
+}
+
+static READ16_HANDLER( lhb_input2_r )
+{
+ switch(offset)
+ {
+ case 0: return igs_input_sel2;
+
+ case 1:
+ if (~igs_input_sel2 & 0x01) return readinputport(6);
+ if (~igs_input_sel2 & 0x02) return readinputport(7);
+ if (~igs_input_sel2 & 0x04) return readinputport(8);
+ if (~igs_input_sel2 & 0x08) return readinputport(9);
+ if (~igs_input_sel2 & 0x10) return readinputport(10);
+
+ logerror("%06x: warning, reading with igs_input_sel2 = %02x\n", activecpu_get_pc(), igs_input_sel2);
+ break;
+ }
+ return 0;
+}
+
+
+
+static WRITE16_HANDLER( vbowl_magic_w )
+{
+ COMBINE_DATA(&igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(igs_magic[0])
+ {
+ case 0x02:
+ if (ACCESSING_LSB)
+ {
+ coin_counter_w(0,data & 1);
+ coin_counter_w(1,data & 2);
+ }
+
+ if (data & ~0x3)
+ logerror("%06x: warning, unknown bits written in coin counter = %02x\n", activecpu_get_pc(), data);
+
+ break;
+
+ default:
+// popmessage("magic %x <- %04x",igs_magic[0],data);
+ logerror("%06x: warning, writing to igs_magic %02x = %02x\n", activecpu_get_pc(), igs_magic[0], data);
+ }
+}
+
+static READ16_HANDLER( vbowl_magic_r )
+{
+ switch(igs_magic[0])
+ {
+ case 0x00: return readinputport(5);
+ case 0x01: return readinputport(6);
+
+ case 0x20: return 0x49;
+ case 0x21: return 0x47;
+ case 0x22: return 0x53;
+
+ case 0x24: return 0x41;
+ case 0x25: return 0x41;
+ case 0x26: return 0x7f;
+ case 0x27: return 0x41;
+ case 0x28: return 0x41;
+
+ case 0x2a: return 0x3e;
+ case 0x2b: return 0x41;
+ case 0x2c: return 0x49;
+ case 0x2d: return 0xf9;
+ case 0x2e: return 0x0a;
+
+ case 0x30: return 0x26;
+ case 0x31: return 0x49;
+ case 0x32: return 0x49;
+ case 0x33: return 0x49;
+ case 0x34: return 0x32;
+
+ default:
+ logerror("%06x: warning, reading with igs_magic = %02x\n", activecpu_get_pc(), igs_magic[0]);
+ }
+
+ return 0;
+}
+
+
+
+static WRITE16_HANDLER( xymg_magic_w )
+{
+ COMBINE_DATA(&igs_magic[offset]);
+
+ if (offset == 0)
+ return;
+
+ switch(igs_magic[0])
+ {
+ case 0x01:
+ COMBINE_DATA(&igs_input_sel2);
+
+ if (ACCESSING_LSB)
+ {
+ coin_counter_w(0, data & 0x20);
+ // coin out data & 0x40
+ }
+
+ if ( igs_input_sel2 & ~0x3f )
+ logerror("%06x: warning, unknown bits written in igs_input_sel2 = %02x\n", activecpu_get_pc(), igs_input_sel2);
+
+// popmessage("sel2 %02x",igs_input_sel2&~0x1f);
+ break;
+
+ default:
+ logerror("%06x: warning, writing to igs_magic %02x = %02x\n", activecpu_get_pc(), igs_magic[0], data);
+ }
+}
+
+static READ16_HANDLER( xymg_magic_r )
+{
+ switch(igs_magic[0])
+ {
+ case 0x00: return readinputport(3);
+
+ case 0x02:
+ if (~igs_input_sel2 & 0x01) return readinputport(4);
+ if (~igs_input_sel2 & 0x02) return readinputport(5);
+ if (~igs_input_sel2 & 0x04) return readinputport(6);
+ if (~igs_input_sel2 & 0x08) return readinputport(7);
+ if (~igs_input_sel2 & 0x10) return readinputport(8);
+ /* fall through */
+ default:
+ logerror("%06x: warning, reading with igs_magic = %02x\n", activecpu_get_pc(), igs_magic[0]);
+ break;
+ }
+
+ return 0;
+}
+
+
+
+/***************************************************************************
+
+ Memory Maps
+
+***************************************************************************/
+
+static WRITE16_HANDLER( igs_YM3812_control_port_0_w )
+{
+ if (ACCESSING_LSB)
+ YM3812_control_port_0_w(0,data);
+}
+
+static WRITE16_HANDLER( igs_YM3812_write_port_0_w )
+{
+ if (ACCESSING_LSB)
+ YM3812_write_port_0_w(0,data);
+}
+
+static ADDRESS_MAP_START( chindrag_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x400000, 0x401fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x500000, 0x500001) AM_READ(input_port_3_word_r)
+ AM_RANGE(0x600000, 0x600001) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0x800002, 0x800003) AM_READ(chindrag_magic_r)
+ AM_RANGE(0xa88000, 0xa88001) AM_READ(igs_3_input_r)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( chindrag_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x400000, 0x401fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x600000, 0x600001) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x700000, 0x700001) AM_WRITE(igs_YM3812_control_port_0_w)
+ AM_RANGE(0x700002, 0x700003) AM_WRITE(igs_YM3812_write_port_0_w)
+ AM_RANGE(0x800000, 0x800003) AM_WRITE(chindrag_magic_w)
+ AM_RANGE(0xa20000, 0xa20001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0xa40000, 0xa40001) AM_WRITE(igs_3_input_w)
+ AM_RANGE(0xa58000, 0xa58001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0xa58800, 0xa58801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0xa59000, 0xa59001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0xa59800, 0xa59801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0xa5a000, 0xa5a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0xa5a800, 0xa5a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0xa5b000, 0xa5b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0xa5b800, 0xa5b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0xa5c000, 0xa5c001) AM_WRITE(igs_blit_depth_w)
+ADDRESS_MAP_END
+
+
+
+static ADDRESS_MAP_START( chmplst2_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200001) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0x208002, 0x208003) AM_READ(chmplst2_magic_r)
+ AM_RANGE(0x20c000, 0x20cfff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x210000, 0x211fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x214000, 0x214001) AM_READ(input_port_3_word_r)
+ AM_RANGE(0xa88000, 0xa88001) AM_READ(igs_3_input_r)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( chmplst2_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x200000, 0x200001) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x204000, 0x204001) AM_WRITE(YM2413_register_port_0_lsb_w )
+ AM_RANGE(0x204002, 0x204003) AM_WRITE(YM2413_data_port_0_lsb_w )
+ AM_RANGE(0x208000, 0x208003) AM_WRITE(chmplst2_magic_w)
+ AM_RANGE(0x20c000, 0x20cfff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x210000, 0x211fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0xa20000, 0xa20001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0xa40000, 0xa40001) AM_WRITE(igs_3_input_w)
+ AM_RANGE(0xa58000, 0xa58001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0xa58800, 0xa58801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0xa59000, 0xa59001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0xa59800, 0xa59801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0xa5a000, 0xa5a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0xa5a800, 0xa5a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0xa5b000, 0xa5b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0xa5b800, 0xa5b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0xa5c000, 0xa5c001) AM_WRITE(igs_blit_depth_w)
+ADDRESS_MAP_END
+
+
+
+static ADDRESS_MAP_START( grtwall_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x400000, 0x401fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x520000, 0x520001) AM_READ(input_port_4_word_r)
+ AM_RANGE(0x600000, 0x600001) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0x800002, 0x800003) AM_READ(grtwall_magic_r)
+ AM_RANGE(0xa88000, 0xa88001) AM_READ(igs_4_input_r)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( grtwall_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x400000, 0x401fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x600000, 0x600001) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x800000, 0x800003) AM_WRITE(grtwall_magic_w)
+ AM_RANGE(0xa20000, 0xa20001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0xa40000, 0xa40001) AM_WRITE(igs_4_input_w)
+ AM_RANGE(0xa58000, 0xa58001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0xa58800, 0xa58801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0xa59000, 0xa59001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0xa59800, 0xa59801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0xa5a000, 0xa5a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0xa5a800, 0xa5a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0xa5b000, 0xa5b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0xa5b800, 0xa5b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0xa5c000, 0xa5c001) AM_WRITE(igs_blit_depth_w)
+ADDRESS_MAP_END
+
+
+
+static ADDRESS_MAP_START( lhb_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x300000, 0x3fffff) AM_READ(igs_layers_r)
+ AM_RANGE(0x400000, 0x401fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x600000, 0x600001) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0x700000, 0x700001) AM_READ(input_port_5_word_r)
+ AM_RANGE(0x700002, 0x700005) AM_READ(lhb_input2_r)
+ AM_RANGE(0x888000, 0x888001) AM_READ(igs_5_input_r)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( lhb_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x010000, 0x010001) AM_WRITE(lhb_okibank_w)
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x300000, 0x3fffff) AM_WRITE(igs_layers_w)
+ AM_RANGE(0x400000, 0x401fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x600000, 0x600001) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x700002, 0x700003) AM_WRITE(lhb_input2_w)
+ AM_RANGE(0x820000, 0x820001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0x840000, 0x840001) AM_WRITE(igs_5_input_w)
+ AM_RANGE(0x858000, 0x858001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0x858800, 0x858801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0x859000, 0x859001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0x859800, 0x859801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0x85a000, 0x85a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0x85a800, 0x85a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0x85b000, 0x85b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0x85b800, 0x85b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0x85c000, 0x85c001) AM_WRITE(igs_blit_depth_w)
+ADDRESS_MAP_END
+
+
+
+
+static READ16_HANDLER( ics2115_0_word_r )
+{
+ switch(offset)
+ {
+ case 0: return ics2115_r(0);
+ case 1: return ics2115_r(1);
+ case 2: return (ics2115_r(3) << 8) | ics2115_r(2);
+ }
+ return 0xff;
+}
+
+static WRITE16_HANDLER( ics2115_0_word_w )
+{
+ switch(offset)
+ {
+ case 1:
+ if (ACCESSING_LSB) ics2115_w(1,data);
+ break;
+ case 2:
+ if (ACCESSING_LSB) ics2115_w(2,data);
+ if (ACCESSING_MSB) ics2115_w(3,data>>8);
+ break;
+ }
+}
+
+#ifdef UNUSED_FUNCTION
+static WRITE16_HANDLER( vbowl_unk_w )
+{
+}
+#endif
+
+static READ16_HANDLER( vbowl_unk_r )
+{
+ return 0xffff;
+}
+
+static UINT16 *vbowl_trackball;
+static VIDEO_EOF( vbowl )
+{
+ vbowl_trackball[0] = vbowl_trackball[1];
+ vbowl_trackball[1] = (readinputport(8) << 8) | readinputport(7);
+}
+
+static WRITE16_HANDLER( vbowl_pen_hi_w )
+{
+ if (ACCESSING_LSB)
+ {
+ chmplst2_pen_hi = data & 0x07;
+ }
+
+ if (data & ~0x7)
+ logerror("%06x: warning, unknown bits written to pen_hi = %04x\n", activecpu_get_pc(), igs_priority);
+}
+
+static WRITE16_HANDLER( vbowl_link_0_w ) { }
+static WRITE16_HANDLER( vbowl_link_1_w ) { }
+static WRITE16_HANDLER( vbowl_link_2_w ) { }
+static WRITE16_HANDLER( vbowl_link_3_w ) { }
+
+static ADDRESS_MAP_START( vbowl_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x300000, 0x3fffff) AM_READ(igs_layers_r)
+ AM_RANGE(0x400000, 0x401fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x520000, 0x520001) AM_READ(input_port_4_word_r)
+ AM_RANGE(0x600000, 0x600007) AM_READ(ics2115_0_word_r)
+ AM_RANGE(0x700000, 0x700003) AM_READ(MRA16_RAM)
+ AM_RANGE(0x800002, 0x800003) AM_READ(vbowl_magic_r)
+ AM_RANGE(0xa88000, 0xa88001) AM_READ(igs_4_input_r)
+
+ AM_RANGE(0xa80000, 0xa80001) AM_READ(vbowl_unk_r)
+ AM_RANGE(0xa90000, 0xa90001) AM_READ(vbowl_unk_r)
+ AM_RANGE(0xa98000, 0xa98001) AM_READ(vbowl_unk_r)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START( vbowl_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x300000, 0x3fffff) AM_WRITE(igs_layers_w)
+ AM_RANGE(0x400000, 0x401fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x600000, 0x600007) AM_WRITE(ics2115_0_word_w)
+ AM_RANGE(0x700000, 0x700003) AM_WRITE(MWA16_RAM) AM_BASE(&vbowl_trackball)
+ AM_RANGE(0x700004, 0x700005) AM_WRITE(vbowl_pen_hi_w)
+ AM_RANGE(0x800000, 0x800003) AM_WRITE(vbowl_magic_w)
+
+ AM_RANGE(0xa00000, 0xa00001) AM_WRITE(vbowl_link_0_w)
+ AM_RANGE(0xa08000, 0xa08001) AM_WRITE(vbowl_link_1_w)
+ AM_RANGE(0xa10000, 0xa10001) AM_WRITE(vbowl_link_2_w)
+ AM_RANGE(0xa18000, 0xa18001) AM_WRITE(vbowl_link_3_w)
+
+ AM_RANGE(0xa20000, 0xa20001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0xa40000, 0xa40001) AM_WRITE(igs_4_input_w)
+ AM_RANGE(0xa58000, 0xa58001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0xa58800, 0xa58801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0xa59000, 0xa59001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0xa59800, 0xa59801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0xa5a000, 0xa5a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0xa5a800, 0xa5a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0xa5b000, 0xa5b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0xa5b800, 0xa5b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0xa5c000, 0xa5c001) AM_WRITE(igs_blit_depth_w)
+ADDRESS_MAP_END
+
+
+
+static ADDRESS_MAP_START( xymg_readmem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x000000, 0x07ffff) AM_READ(MRA16_ROM)
+ AM_RANGE(0x100000, 0x103fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x400000, 0x401fff) AM_READ(MRA16_RAM)
+ AM_RANGE(0x600000, 0x600001) AM_READ(OKIM6295_status_0_lsb_r)
+ AM_RANGE(0x700002, 0x700003) AM_READ(xymg_magic_r)
+ AM_RANGE(0x888000, 0x888001) AM_READ(igs_3_input_r)
+ AM_RANGE(0x1f0000, 0x1f3fff) AM_READ(MRA16_RAM)
+ADDRESS_MAP_END
+static ADDRESS_MAP_START( xymg_writemem, ADDRESS_SPACE_PROGRAM, 16 )
+ AM_RANGE(0x010000, 0x010001) AM_WRITE(lhb_okibank_w)
+ AM_RANGE(0x100000, 0x103fff) AM_WRITE(MWA16_RAM)
+ AM_RANGE(0x200000, 0x200fff) AM_WRITE(MWA16_RAM) AM_BASE(&igs_priority_ram)
+ AM_RANGE(0x400000, 0x401fff) AM_WRITE(igs_palette_w) AM_BASE(&paletteram16)
+ AM_RANGE(0x600000, 0x600001) AM_WRITE(OKIM6295_data_0_lsb_w)
+ AM_RANGE(0x700000, 0x700003) AM_WRITE(xymg_magic_w)
+ AM_RANGE(0x820000, 0x820001) AM_WRITE(igs_priority_w)
+ AM_RANGE(0x840000, 0x840001) AM_WRITE(igs_3_input_w)
+ AM_RANGE(0x858000, 0x858001) AM_WRITE(igs_blit_x_w)
+ AM_RANGE(0x858800, 0x858801) AM_WRITE(igs_blit_y_w)
+ AM_RANGE(0x859000, 0x859001) AM_WRITE(igs_blit_w_w)
+ AM_RANGE(0x859800, 0x859801) AM_WRITE(igs_blit_h_w)
+ AM_RANGE(0x85a000, 0x85a001) AM_WRITE(igs_blit_gfx_lo_w)
+ AM_RANGE(0x85a800, 0x85a801) AM_WRITE(igs_blit_gfx_hi_w)
+ AM_RANGE(0x85b000, 0x85b001) AM_WRITE(igs_blit_flags_w)
+ AM_RANGE(0x85b800, 0x85b801) AM_WRITE(igs_blit_pen_w)
+ AM_RANGE(0x85c000, 0x85c001) AM_WRITE(igs_blit_depth_w)
+ AM_RANGE(0x1f0000, 0x1f3fff) AM_WRITE(MWA16_RAM) AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size) // extra ram
+ADDRESS_MAP_END
+
+
+
+/***************************************************************************
+
+ Input Ports
+
+***************************************************************************/
+
+static INPUT_PORTS_START( chindrag )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
+ 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( 0x18, 0x18, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) // 513
+ PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) // 627
+ PORT_DIPSETTING( 0x08, DEF_STR( Harder ) ) // 741
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // 855
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x01, 0x01, "Background" )
+ PORT_DIPSETTING( 0x01, "Girl" )
+ PORT_DIPSETTING( 0x00, "Landscape" )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, "Tiles" )
+ PORT_DIPSETTING( 0x04, "Mahjong" )
+ PORT_DIPSETTING( 0x00, "Symbols" )
+ PORT_DIPNAME( 0x08, 0x08, "Send Boom?" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Test?" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN3
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test )) PORT_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE2 ) // used?
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // used?
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) // press in girl test to pause, button 3 advances
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN5
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_START // IN6
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
+
+static INPUT_PORTS_START( chmplst2 )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x07, 0x02, "Pay Out (%)" )
+ PORT_DIPSETTING( 0x07, "50" )
+ PORT_DIPSETTING( 0x06, "54" )
+ PORT_DIPSETTING( 0x05, "58" )
+ PORT_DIPSETTING( 0x04, "62" )
+ PORT_DIPSETTING( 0x03, "66" )
+ PORT_DIPSETTING( 0x02, "70" )
+ PORT_DIPSETTING( 0x01, "74" )
+ PORT_DIPSETTING( 0x00, "78" )
+ PORT_DIPNAME( 0x08, 0x08, "Odds Rate" )
+ PORT_DIPSETTING( 0x08, "1,2,3,5,8,15,30,50" )
+ PORT_DIPSETTING( 0x00, "1,2,3,4,5,6,7,8" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Bet" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPSETTING( 0x10, "10" )
+ PORT_DIPNAME( 0x60, 0x60, "Min Credits To Start" )
+ PORT_DIPSETTING( 0x60, "1" )
+ PORT_DIPSETTING( 0x40, "2" )
+ PORT_DIPSETTING( 0x20, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) ) // Only when bit 4 = 1
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x04, 0x04, "Credits Per Note" ) // Only when bit 4 = 0
+ PORT_DIPSETTING( 0x04, "10" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x08, 0x08, "Max Note Credits" )
+ PORT_DIPSETTING( 0x08, "100" )
+ PORT_DIPSETTING( 0x00, "500" )
+ PORT_DIPNAME( 0x10, 0x10, "Money Type" ) // Decides whether to use bits 0&1 or bit 2
+ PORT_DIPSETTING( 0x10, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x03, "500" )
+ PORT_DIPSETTING( 0x02, "1000" )
+ PORT_DIPSETTING( 0x01, "2000" )
+ PORT_DIPSETTING( 0x00, "30000" )
+ PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0c, "0" )
+ PORT_DIPSETTING( 0x08, "1" )
+ PORT_DIPSETTING( 0x04, "2" )
+// PORT_DIPSETTING( 0x00, "2" )
+ PORT_DIPNAME( 0x70, 0x70, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x70, "1 : 1" )
+ PORT_DIPSETTING( 0x60, "1 : 2" )
+ PORT_DIPSETTING( 0x50, "1 : 5" )
+ PORT_DIPSETTING( 0x40, "1 : 6" )
+ PORT_DIPSETTING( 0x30, "1 : 7" )
+ PORT_DIPSETTING( 0x20, "1 : 8" )
+ PORT_DIPSETTING( 0x10, "1 : 9" )
+ PORT_DIPSETTING( 0x00, "1 : 10" )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN3
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_SERVICE1 ) // data clear
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test )) PORT_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE4 ) // haba?
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE2 ) // stats
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // clear coin
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN4
+ 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_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ? set to 0 both
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN ) // ? and you can't start a game
+
+ PORT_START // IN5
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN6
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN7
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN8
+ 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_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 )
+INPUT_PORTS_END
+
+
+
+static INPUT_PORTS_START( drgnwrld )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
+ 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( 0x18, 0x18, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x18, DEF_STR( Normal ) ) // 513
+ PORT_DIPSETTING( 0x10, DEF_STR( Hard ) ) // 627
+ PORT_DIPSETTING( 0x08, DEF_STR( Harder ) ) // 741
+ PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) // 855
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x01, 0x01, "Open Girl?" )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "Background" )
+ PORT_DIPSETTING( 0x02, "Girl" )
+ PORT_DIPSETTING( 0x00, "Landscape" )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, "Bang Turtle?" )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Send Boom?" )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, "Test?" )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN3
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test )) PORT_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_SERVICE2 ) // used?
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // used?
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) // press in girl test to pause, button 3 advances
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN5
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_START // IN6
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON3 )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+INPUT_PORTS_END
+
+
+
+static INPUT_PORTS_START( grtwall )
+ PORT_START // IN0 - DSW3
+ PORT_DIPNAME( 0xff, 0xff, "3" )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x03, "1000" )
+ PORT_DIPSETTING( 0x02, "1500" )
+ PORT_DIPSETTING( 0x01, "2000" )
+ PORT_DIPSETTING( 0x00, "3000" )
+ PORT_DIPNAME( 0x0c, 0x0c, "Min Credits To Start" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) // changes title screen?
+ 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 // IN2 - DSW1
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ 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_4C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" )
+ PORT_DIPSETTING( 0x0c, "10" )
+ PORT_DIPSETTING( 0x08, "20" )
+ PORT_DIPSETTING( 0x04, "50" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" )
+ PORT_DIPSETTING( 0x10, "500" )
+ PORT_DIPSETTING( 0x00, "9999" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" ) // use bits 0-1
+ PORT_DIPSETTING( 0x00, "Notes" ) // use bits 2-3
+ 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( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START // IN3 - DSW4
+ PORT_DIPNAME( 0xff, 0xff, "4" )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_NAME(DEF_STR( Test )) PORT_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ 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 // IN5
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( lhb )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x0f, 0x07, "Pay Out (%)" )
+ PORT_DIPSETTING( 0x0f, "96" )
+ PORT_DIPSETTING( 0x0e, "93" )
+ PORT_DIPSETTING( 0x0d, "90" )
+ PORT_DIPSETTING( 0x0c, "87" )
+ PORT_DIPSETTING( 0x0b, "84" )
+ PORT_DIPSETTING( 0x0a, "81" )
+ PORT_DIPSETTING( 0x09, "78" )
+ PORT_DIPSETTING( 0x08, "75" )
+ PORT_DIPSETTING( 0x07, "71" )
+ PORT_DIPSETTING( 0x06, "68" )
+ PORT_DIPSETTING( 0x05, "65" )
+ PORT_DIPSETTING( 0x04, "62" )
+ PORT_DIPSETTING( 0x03, "59" )
+ PORT_DIPSETTING( 0x02, "56" )
+ PORT_DIPSETTING( 0x01, "53" )
+ PORT_DIPSETTING( 0x00, "50" )
+ PORT_DIPNAME( 0x30, 0x30, "YAKUMAN Point" )
+ PORT_DIPSETTING( 0x30, "1" )
+ PORT_DIPSETTING( 0x20, "2" )
+ PORT_DIPSETTING( 0x10, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0xc0, 0xc0, "Max Bet" )
+ PORT_DIPSETTING( 0xc0, "1" )
+ PORT_DIPSETTING( 0x80, "5" )
+ PORT_DIPSETTING( 0x40, "10" )
+ PORT_DIPSETTING( 0x00, "20" )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 2C_1C ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( 1C_1C ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( 1C_2C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 1C_3C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Min Credits To Start" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x70, 0x70, "DAI MANGUAN Cycle" )
+ PORT_DIPSETTING( 0x70, "300" )
+// PORT_DIPSETTING( 0x60, "300" )
+// PORT_DIPSETTING( 0x50, "300" )
+// PORT_DIPSETTING( 0x40, "300" )
+// PORT_DIPSETTING( 0x30, "300" )
+// PORT_DIPSETTING( 0x20, "300" )
+// PORT_DIPSETTING( 0x10, "300" )
+// PORT_DIPSETTING( 0x00, "300" )
+ PORT_DIPNAME( 0x80, 0x80, "DAI MANGUAN Times" )
+ PORT_DIPSETTING( 0x80, "2" )
+// PORT_DIPSETTING( 0x00, "2" )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0x03, 0x03, "Max Credit" )
+ PORT_DIPSETTING( 0x03, "1000" )
+ PORT_DIPSETTING( 0x02, "2000" )
+ PORT_DIPSETTING( 0x01, "5000" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Max Note" )
+ PORT_DIPSETTING( 0x0c, "1000" )
+ PORT_DIPSETTING( 0x08, "2000" )
+ PORT_DIPSETTING( 0x04, "5000" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPNAME( 0x10, 0x10, "CPU Strength" )
+ PORT_DIPSETTING( 0x10, "Strong" )
+ PORT_DIPSETTING( 0x00, "Weak" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" )
+ PORT_DIPSETTING( 0x00, "Notes" )
+ PORT_DIPNAME( 0xc0, 0xc0, "DONDEN Times" )
+ PORT_DIPSETTING( 0xc0, "0" )
+ PORT_DIPSETTING( 0x80, "3" )
+ PORT_DIPSETTING( 0x40, "5" )
+ PORT_DIPSETTING( 0x00, "8" )
+
+ PORT_START // IN3 - DSW4
+ PORT_DIPNAME( 0x01, 0x00, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, "In Game Music" )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0c, 0x00, "Girls" )
+ PORT_DIPSETTING( 0x0c, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x08, "Dressed" )
+ PORT_DIPSETTING( 0x04, "Underwear" )
+ PORT_DIPSETTING( 0x00, "Nude" )
+ PORT_DIPNAME( 0x10, 0x10, "Note Rate" )
+ PORT_DIPSETTING( 0x10, "5" )
+ PORT_DIPSETTING( 0x00, "10" )
+ PORT_DIPNAME( 0x20, 0x20, "Pay Out" )
+ PORT_DIPSETTING( 0x20, "Score" )
+ PORT_DIPSETTING( 0x00, "Coin" )
+ PORT_DIPNAME( 0x40, 0x40, "Coin In" )
+ PORT_DIPSETTING( 0x40, "Credit" )
+ PORT_DIPSETTING( 0x00, "Score" )
+ PORT_DIPNAME( 0x80, 0x80, "Last Chance" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Yes ) )
+
+ PORT_START // IN4 - DSW5
+ PORT_DIPNAME( 0xff, 0xff, "5" )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN5
+ 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_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) // stats
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // clear coin
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN6
+ 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_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN7
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN8
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN9
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN10
+ 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_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 )
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( vbowl )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x02, 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_DIPSETTING( 0x03, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Special Picture" ) /* Sexy Interlude pics */
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, "Open Pitcure" )
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Controls ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Joystick ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Trackball ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Free_Play ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) // 5
+ PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) // 7
+ PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) // 9
+ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) // 11
+ PORT_DIPNAME( 0x04, 0x04, "Spares To Win (Frames 1-5)" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x18, 0x18, "Points To Win (Frames 6-10)" )
+ PORT_DIPSETTING( 0x18, "160" )
+ PORT_DIPSETTING( 0x10, "170" )
+ PORT_DIPSETTING( 0x08, "180" )
+ PORT_DIPSETTING( 0x00, "190" )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0x03, 0x03, "Cabinet ID" )
+ PORT_DIPSETTING( 0x03, "1" )
+ PORT_DIPSETTING( 0x02, "2" )
+ PORT_DIPSETTING( 0x01, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x04, 0x04, "Linked Cabinets" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
+
+ PORT_START // IN3 - DSW4
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ 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 // IN5
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
+
+ PORT_START // IN6
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_START // IN7
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1)
+
+ PORT_START // IN8
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( vbowlj )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( 4C_1C ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( 3C_1C ) )
+ PORT_DIPSETTING( 0x02, 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_DIPSETTING( 0x03, DEF_STR( 1C_5C ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, "Special Picture" ) /* Sexy Interlude pics */
+ PORT_DIPSETTING( 0x00, DEF_STR( No ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Yes ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Controls ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Joystick ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Trackball ) )
+ 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( Free_Play ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x02, DEF_STR( Difficulty ) )
+ PORT_DIPSETTING( 0x03, DEF_STR( Easy ) ) // 5
+ PORT_DIPSETTING( 0x02, DEF_STR( Normal ) ) // 7
+ PORT_DIPSETTING( 0x01, DEF_STR( Medium ) ) // 9
+ PORT_DIPSETTING( 0x00, DEF_STR( Hard ) ) // 11
+ PORT_DIPNAME( 0x04, 0x04, "Spares To Win (Frames 1-5)" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x18, 0x18, "Points To Win (Frames 6-10)" )
+ PORT_DIPSETTING( 0x18, "160" )
+ PORT_DIPSETTING( 0x10, "170" )
+ PORT_DIPSETTING( 0x08, "180" )
+ PORT_DIPSETTING( 0x00, "190" )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0x03, 0x03, "Cabinet ID" )
+ PORT_DIPSETTING( 0x03, "1" )
+ PORT_DIPSETTING( 0x02, "2" )
+ PORT_DIPSETTING( 0x01, "3" )
+ PORT_DIPSETTING( 0x00, "4" )
+ PORT_DIPNAME( 0x04, 0x04, "Linked Cabinets" )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_SERVICE( 0x80, IP_ACTIVE_LOW )
+
+ PORT_START // IN3 - DSW4
+ PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN4
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_COIN2 )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 )
+ 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 // IN5
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START1 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 )
+
+ PORT_START // IN6
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_START2 )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_PLAYER(2)
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2)
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2)
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2)
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+
+ PORT_START // IN7
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1)
+
+ PORT_START // IN8
+ PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_Y ) PORT_SENSITIVITY(30) PORT_KEYDELTA(30) PORT_PLAYER(1)
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( xymg )
+ PORT_START // IN0 - DSW1
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coinage ) )
+ 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_4C ) )
+ PORT_DIPNAME( 0x0c, 0x0c, "Credits Per Note" )
+ PORT_DIPSETTING( 0x0c, "10" )
+ PORT_DIPSETTING( 0x08, "20" )
+ PORT_DIPSETTING( 0x04, "50" )
+ PORT_DIPSETTING( 0x00, "100" )
+ PORT_DIPNAME( 0x10, 0x10, "Max Note Credits" )
+ PORT_DIPSETTING( 0x10, "500" )
+ PORT_DIPSETTING( 0x00, "9999" )
+ PORT_DIPNAME( 0x20, 0x20, "Money Type" )
+ PORT_DIPSETTING( 0x20, "Coins" ) // use bits 0-1
+ PORT_DIPSETTING( 0x00, "Notes" ) // use bits 2-3
+ 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( Demo_Sounds ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( On ) )
+
+ PORT_START // IN1 - DSW2
+ PORT_DIPNAME( 0x03, 0x03, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x03, "1000" )
+ PORT_DIPSETTING( 0x02, "1500" )
+ PORT_DIPSETTING( 0x01, "2000" )
+ PORT_DIPSETTING( 0x00, "3000" )
+ PORT_DIPNAME( 0x0c, 0x0c, "Min Credits To Start" )
+ PORT_DIPSETTING( 0x0c, "1" )
+ PORT_DIPSETTING( 0x08, "2" )
+ PORT_DIPSETTING( 0x04, "3" )
+ PORT_DIPSETTING( 0x00, "5" )
+ PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+ PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN2 - DSW3
+ PORT_DIPNAME( 0xff, 0xff, DEF_STR( Unused ) )
+ PORT_DIPSETTING( 0xff, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x00, DEF_STR( On ) )
+
+ PORT_START // IN3
+ 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_CODE(KEYCODE_F1) // keep pressed while booting
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_SERVICE1 ) // stats
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN1 )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_SERVICE3 ) // clear coin
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN4
+ 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_START1 )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN5
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN6
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN7
+ 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_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN8
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_MAHJONG_LAST_CHANCE )
+ PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_MAHJONG_SCORE )
+ PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_MAHJONG_DOUBLE_UP )
+ PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_MAHJONG_BIG )
+ PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_MAHJONG_SMALL )
+ PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+
+/***************************************************************************
+
+ Machine Drivers
+
+***************************************************************************/
+
+/*
+// for debugging
+
+static const gfx_layout gfxlayout_8x8x4 =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 4, 0, 12, 8, 20,16, 28,24 },
+ { STEP8(0,8*4) },
+ 8*8*4
+};
+static const gfx_layout gfxlayout_16x16x4 =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 4,
+ { STEP4(0,1) },
+ { 4, 0, 12, 8, 20,16, 28,24,
+ 36,32, 44,40, 52,48, 60,56 },
+ { STEP16(0,16*4) },
+ 16*16*4
+};
+static const gfx_layout gfxlayout_8x8x8 =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
+ 8*8*8
+};
+static const gfx_layout gfxlayout_16x16x8 =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP16(0,8) },
+ { STEP16(0,16*8) },
+ 16*16*8
+};
+static const gfx_layout gfxlayout_16x16x1 =
+{
+ 16,16,
+ RGN_FRAC(1,1),
+ 1,
+ { 0 },
+ { STEP16(15,-1) },
+ { STEP16(0,16*1) },
+ 16*16*1
+};
+
+static GFXDECODE_START( igs_blit )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_8x8x4, 0, 0x80 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_16x16x4, 0, 0x80 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_8x8x8, 0, 0x08 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_16x16x8, 0, 0x08 )
+GFXDECODE_END
+static GFXDECODE_START( chmplst2 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_8x8x4, 0, 0x80 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_16x16x4, 0, 0x80 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_8x8x8, 0, 0x08 )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, gfxlayout_16x16x8, 0, 0x08 )
+ GFXDECODE_ENTRY( REGION_GFX2, 0, gfxlayout_16x16x1, 0, 0x80 )
+GFXDECODE_END
+*/
+
+static MACHINE_DRIVER_START( igs_base )
+ MDRV_CPU_ADD_TAG("main",M68000, 22000000/3)
+
+ MDRV_SCREEN_REFRESH_RATE(60)
+ MDRV_SCREEN_VBLANK_TIME(DEFAULT_60HZ_VBLANK_DURATION)
+
+ MDRV_NVRAM_HANDLER(generic_0fill)
+
+// MDRV_GFXDECODE(igs_blit)
+
+ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER)
+ MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
+ MDRV_SCREEN_SIZE(512, 256)
+ MDRV_SCREEN_VISIBLE_AREA(0, 512-1, 0, 240-1)
+ MDRV_PALETTE_LENGTH(0x800)
+
+ MDRV_VIDEO_START( igs )
+ MDRV_VIDEO_UPDATE( igs )
+
+ /* sound hardware */
+ MDRV_SPEAKER_STANDARD_MONO("mono")
+
+ MDRV_SOUND_ADD_TAG("OKIM6295", OKIM6295, 1047600)
+ MDRV_SOUND_CONFIG(okim6295_interface_region_1_pin7high)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_DRIVER_END
+
+
+static INTERRUPT_GEN( chmplst2_interrupt )
+{
+ switch (cpu_getiloops())
+ {
+ case 0: cpunum_set_input_line(0, 6, HOLD_LINE); break;
+ default:
+ case 1: cpunum_set_input_line(0, 5, HOLD_LINE); break;
+ }
+}
+
+static MACHINE_DRIVER_START( chmplst2 )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(chmplst2_readmem,chmplst2_writemem)
+ MDRV_CPU_VBLANK_INT(chmplst2_interrupt,1+4) // lev5 frequency drives the music tempo
+
+// MDRV_GFXDECODE(chmplst2)
+
+ MDRV_SOUND_ADD(YM2413, 3579545)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
+MACHINE_DRIVER_END
+
+
+static MACHINE_DRIVER_START( chindrag )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(chindrag_readmem,chindrag_writemem)
+ MDRV_CPU_VBLANK_INT(chmplst2_interrupt,1+4) // lev5 frequency drives the music tempo
+
+ MDRV_SOUND_ADD(YM3812, 3579545)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 2.0)
+MACHINE_DRIVER_END
+
+
+static INTERRUPT_GEN( grtwall_interrupt )
+{
+ switch (cpu_getiloops())
+ {
+ case 0: cpunum_set_input_line(0, 3, HOLD_LINE); break;
+ case 1: cpunum_set_input_line(0, 6, HOLD_LINE); break;
+ }
+}
+
+static MACHINE_DRIVER_START( grtwall )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(grtwall_readmem,grtwall_writemem)
+ MDRV_CPU_VBLANK_INT(grtwall_interrupt,2)
+MACHINE_DRIVER_END
+
+
+
+static INTERRUPT_GEN( lhb_interrupt )
+{
+ switch (cpu_getiloops())
+ {
+ case 0: cpunum_set_input_line(0, 3, HOLD_LINE); break;
+ case 1: cpunum_set_input_line(0, 5, HOLD_LINE); break;
+ case 2: cpunum_set_input_line(0, 6, HOLD_LINE); break;
+ }
+}
+
+static MACHINE_DRIVER_START( lhb )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(lhb_readmem,lhb_writemem)
+ MDRV_CPU_VBLANK_INT(lhb_interrupt,3)
+MACHINE_DRIVER_END
+
+
+
+static void sound_irq(int state)
+{
+// cpunum_set_input_line(0, 3, state);
+}
+
+static struct ics2115_interface pgm_ics2115_interface = {
+ REGION_SOUND1,
+ sound_irq
+};
+
+static INTERRUPT_GEN( vbowl_interrupt )
+{
+ switch (cpu_getiloops())
+ {
+ case 0: cpunum_set_input_line(0, 4, HOLD_LINE); break;
+ case 1: cpunum_set_input_line(0, 5, HOLD_LINE); break;
+ case 2: cpunum_set_input_line(0, 6, HOLD_LINE); break;
+ default:
+ case 3: cpunum_set_input_line(0, 3, HOLD_LINE); break; // sound
+ }
+}
+
+static MACHINE_DRIVER_START( vbowl )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(vbowl_readmem,vbowl_writemem)
+ MDRV_CPU_VBLANK_INT(vbowl_interrupt,3+4)
+
+ MDRV_VIDEO_EOF(vbowl) // trackball
+// MDRV_GFXDECODE(chmplst2)
+
+ MDRV_SOUND_REMOVE("OKIM6295")
+ MDRV_SOUND_ADD(ICS2115, 0)
+ MDRV_SOUND_CONFIG(pgm_ics2115_interface)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 5.0)
+MACHINE_DRIVER_END
+
+
+
+static MACHINE_DRIVER_START( xymg )
+ MDRV_IMPORT_FROM(igs_base)
+ MDRV_CPU_MODIFY("main")
+ MDRV_CPU_PROGRAM_MAP(xymg_readmem,xymg_writemem)
+ MDRV_CPU_VBLANK_INT(grtwall_interrupt,2)
+MACHINE_DRIVER_END
+
+
+
+static DRIVER_INIT( chmplst2 )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ chmplst2_decrypt();
+ chmplst2_decrypt_gfx();
+
+ // PROTECTION CHECKS
+ rom[0x034f4/2] = 0x4e71; // 0034F4: 660E bne 3504 (rom test, fills palette with white otherwise)
+ rom[0x03502/2] = 0x6032; // 003502: 6732 beq 3536 (rom test, fills palette with white otherwise)
+ rom[0x1afea/2] = 0x6034; // 01AFEA: 6734 beq 1b020 (fills palette with black otherwise)
+ rom[0x24b8a/2] = 0x6036; // 024B8A: 6736 beq 24bc2 (fills palette with green otherwise)
+ rom[0x29ef8/2] = 0x6036; // 029EF8: 6736 beq 29f30 (fills palette with red otherwise)
+ rom[0x2e69c/2] = 0x6036; // 02E69C: 6736 beq 2e6d4 (fills palette with green otherwise)
+ rom[0x2fe96/2] = 0x6036; // 02FE96: 6736 beq 2fece (fills palette with red otherwise)
+ rom[0x325da/2] = 0x6036; // 0325DA: 6736 beq 32612 (fills palette with green otherwise)
+ rom[0x3d80a/2] = 0x6034; // 03D80A: 6734 beq 3d840 (fills palette with black otherwise)
+ rom[0x3ed80/2] = 0x6036; // 03ED80: 6736 beq 3edb8 (fills palette with red otherwise)
+ rom[0x41d72/2] = 0x6034; // 041D72: 6734 beq 41da8 (fills palette with black otherwise)
+ rom[0x44834/2] = 0x6034; // 044834: 6734 beq 4486a (fills palette with black otherwise)
+}
+
+static DRIVER_INIT( chindrag )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ chindrag_decrypt();
+ chindrag_gfx_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x033d2/2] = 0x606c; // 0033D2: 676C beq 3440 (ASIC11 CHECK PORT ERROR 3)
+ rom[0x11c74/2] = 0x606c; // 011C74: 676C beq 11ce2 (CHECK PORT ERROR 1)
+ rom[0x23d2a/2] = 0x606c; // 023D2A: 676C beq 23d98
+ rom[0x23f68/2] = 0x606c; // 023F68: 676C beq 23fd6
+ rom[0x240d4/2] = 0x606c; // 0240D4: 676C beq 24142 (CHECK PORT ERROR 3)
+ rom[0x242ac/2] = 0x606c; // 0242AC: 676C beq 2431a
+ rom[0x244b2/2] = 0x606c; // 0244B2: 676C beq 24520
+ rom[0x24630/2] = 0x606c; // 024630: 676C beq 2469e
+ rom[0x24886/2] = 0x606c; // 024886: 676C beq 248f4
+ rom[0x24aca/2] = 0x606c; // 024ACA: 676C beq 24b38
+ rom[0x24d46/2] = 0x606c; // 024D46: 676C beq 24db4
+ rom[0x24f8e/2] = 0x606c; // 024F8E: 676C beq 24ffc
+ rom[0x254ba/2] = 0x6000; // 0254BA: 6700 E620 beq 23adc (ASIC12 CHECK PORT ERROR 1)
+ rom[0x26a52/2] = 0x606c; // 026A52: 676C beq 26ac0 (ASIC12 CHECK PORT ERROR 1)
+ rom[0x276aa/2] = 0x606c; // 0276AA: 676C beq 27718 (CHECK PORT ERROR 3)
+ rom[0x2a870/2] = 0x606c; // 02A870: 676C beq 2a8de (ASIC11 CHECK PORT ERROR 2)
+}
+
+static DRIVER_INIT( chugokur )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ chindrag_decrypt();
+ chindrag_gfx_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x033d2/2] = 0x606c; // 0033D2: 676C beq 3440 (ASIC11 CHECK PORT ERROR 3)
+ rom[0x11c74/2] = 0x606c; // 011C74: 676C beq 11ce2 (CHECK PORT ERROR 1)
+ rom[0x23d2a/2] = 0x606c; // 023D2A: 676C beq 23d98
+ rom[0x23f68/2] = 0x606c; // 023F68: 676C beq 23fd6
+ rom[0x240d4/2] = 0x606c; // 0240D4: 676C beq 24142 (CHECK PORT ERROR 3)
+ rom[0x242ac/2] = 0x606c; // 0242AC: 676C beq 2431a
+ rom[0x244b2/2] = 0x606c; // 0244B2: 676C beq 24520
+ rom[0x24630/2] = 0x606c; // 024630: 676C beq 2469e
+ rom[0x24886/2] = 0x606c; // 024886: 676C beq 248f4
+ rom[0x24aca/2] = 0x606c; // 024ACA: 676C beq 24b38
+ rom[0x24d46/2] = 0x606c; // 024D46: 676C beq 24db4
+ rom[0x24f8e/2] = 0x606c; // 024F8E: 676C beq 24ffc
+ rom[0x254ba/2] = 0x6000; // 0254BA: 6700 E620 beq 23adc (ASIC12 CHECK PORT ERROR 1)
+ rom[0x26a52/2] = 0x606c; // 026A52: 676C beq 26ac0 (ASIC12 CHECK PORT ERROR 1)
+ // different from chindrag:
+ rom[0x276a0/2] = 0x606c; // 0276A0: 676C beq 2770e (CHECK PORT ERROR 3)
+ rom[0x2a86e/2] = 0x606c; // 02A86E: 676C beq 2a8dc (ASIC11 CHECK PORT ERROR 2)
+}
+
+static DRIVER_INIT( drgnwrld )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ drgnwrld_decrypt();
+ chindrag_gfx_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x032ee/2] = 0x606c; // 0032EE: 676C beq 335c (ASIC11 CHECK PORT ERROR 3)
+ rom[0x23d5e/2] = 0x606c; // 023D5E: 676C beq 23dcc (CHECK PORT ERROR 1)
+ rom[0x23fd0/2] = 0x606c; // 023FD0: 676C beq 2403e (CHECK PORT ERROR 2)
+ rom[0x24170/2] = 0x606c; // 024170: 676C beq 241de (CHECK PORT ERROR 3)
+ rom[0x24348/2] = 0x606c; // 024348: 676C beq 243b6 (ASIC11 CHECK PORT ERROR 4)
+ rom[0x2454e/2] = 0x606c; // 02454E: 676C beq 245bc (ASIC11 CHECK PORT ERROR 3)
+ rom[0x246cc/2] = 0x606c; // 0246CC: 676C beq 2473a (ASIC11 CHECK PORT ERROR 2)
+ rom[0x24922/2] = 0x606c; // 024922: 676C beq 24990 (ASIC11 CHECK PORT ERROR 1)
+ rom[0x24b66/2] = 0x606c; // 024B66: 676C beq 24bd4 (ASIC12 CHECK PORT ERROR 4)
+ rom[0x24de2/2] = 0x606c; // 024DE2: 676C beq 24e50 (ASIC12 CHECK PORT ERROR 3)
+ rom[0x2502a/2] = 0x606c; // 02502A: 676C beq 25098 (ASIC12 CHECK PORT ERROR 2)
+ rom[0x25556/2] = 0x6000; // 025556: 6700 E584 beq 23adc (ASIC12 CHECK PORT ERROR 1)
+ rom[0x2a16c/2] = 0x606c; // 02A16C: 676C beq 2a1da (ASIC11 CHECK PORT ERROR 2)
+}
+
+static DRIVER_INIT( grtwall )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ grtwall_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x16b96/2] = 0x6000; // 016B96: 6700 02FE beq 16e96 (fills palette with red otherwise)
+ rom[0x16e5e/2] = 0x6036; // 016E5E: 6736 beq 16e96 (fills palette with green otherwise)
+ rom[0x17852/2] = 0x6000; // 017852: 6700 01F2 beq 17a46 (fills palette with green otherwise)
+ rom[0x17a0e/2] = 0x6036; // 017A0E: 6736 beq 17a46 (fills palette with red otherwise)
+ rom[0x23636/2] = 0x6036; // 023636: 6736 beq 2366e (fills palette with red otherwise)
+ rom[0x2b1e6/2] = 0x6000; // 02B1E6: 6700 0218 beq 2b400 (fills palette with green otherwise)
+ rom[0x2f9f2/2] = 0x6000; // 02F9F2: 6700 04CA beq 2febe (fills palette with green otherwise)
+ rom[0x2fb2e/2] = 0x6000; // 02FB2E: 6700 038E beq 2febe (fills palette with red otherwise)
+ rom[0x2fcf2/2] = 0x6000; // 02FCF2: 6700 01CA beq 2febe (fills palette with red otherwise)
+ rom[0x2fe86/2] = 0x6036; // 02FE86: 6736 beq 2febe (fills palette with red otherwise)
+ rom[0x3016e/2] = 0x6000; // 03016E: 6700 03F6 beq 30566 (fills palette with green otherwise)
+ rom[0x303c8/2] = 0x6000; // 0303C8: 6700 019C beq 30566 (fills palette with green otherwise)
+ rom[0x3052e/2] = 0x6036; // 03052E: 6736 beq 30566 (fills palette with green otherwise)
+}
+
+static DRIVER_INIT( lhb )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ lhb_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x2eef6/2] = 0x4e75; // 02EEF6: 4E56 FE00 link A6, #-$200 (fills palette with pink otherwise)
+}
+
+
+
+
+static DRIVER_INIT( vbowl )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+ UINT8 *gfx = (UINT8 *) memory_region(REGION_GFX1);
+ int i;
+
+ vbowlj_decrypt();
+
+ for (i = 0x400000-1; i >= 0; i--)
+ {
+ gfx[i * 2 + 1] = (gfx[i] & 0xf0) >> 4;
+ gfx[i * 2 + 0] = (gfx[i] & 0x0f) >> 0;
+ }
+
+ // PROTECTION CHECKS
+ rom[0x3764/2] = 0x4e75; // 003764: 4E56 0000 link A6, #$0
+}
+
+static DRIVER_INIT( vbowlj )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+ UINT8 *gfx = (UINT8 *) memory_region(REGION_GFX1);
+ int i;
+
+ vbowlj_decrypt();
+
+ for (i = 0x400000-1; i >= 0; i--)
+ {
+ gfx[i * 2 + 1] = (gfx[i] & 0xf0) >> 4;
+ gfx[i * 2 + 0] = (gfx[i] & 0x0f) >> 0;
+ }
+
+ // PROTECTION CHECKS
+ rom[0x37b4/2] = 0x4e75; // 0037B4: 4E56 0000 link A6, #$0
+}
+
+
+
+static DRIVER_INIT( xymg )
+{
+ UINT16 *rom = (UINT16 *) memory_region(REGION_CPU1);
+
+ lhb_decrypt();
+
+ // PROTECTION CHECKS
+ rom[0x00502/2] = 0x6006; // 000502: 6050 bra 554
+ rom[0x4342c/2] = 0x4e75; // 04342C: 4E56 0000 link A6, #$0
+
+ rom[0x0fc1c/2] = 0x6036; // 00FC1C: 6736 beq fc54 (fills palette with red otherwise)
+ rom[0x1232a/2] = 0x6036; // 01232A: 6736 beq 12362 (fills palette with red otherwise)
+ rom[0x18244/2] = 0x6036; // 018244: 6736 beq 1827c (fills palette with red otherwise)
+ rom[0x1e15e/2] = 0x6036; // 01E15E: 6736 beq 1e196 (fills palette with red otherwise)
+ rom[0x22286/2] = 0x6000; // 022286: 6700 02D2 beq 2255a (fills palette with green otherwise)
+ rom[0x298ce/2] = 0x6036; // 0298CE: 6736 beq 29906 (fills palette with red otherwise)
+ rom[0x2e07c/2] = 0x6036; // 02E07C: 6736 beq 2e0b4 (fills palette with red otherwise)
+ rom[0x397f4/2] = 0x6000; // 0397F4: 6700 02C0 beq 39ab6 (fills palette with green otherwise)
+ rom[0x39976/2] = 0x6000; // 039976: 6700 013E beq 39ab6 (fills palette with green otherwise)
+ rom[0x39a7e/2] = 0x6036; // 039A7E: 6736 beq 39ab6 (fills palette with green otherwise)
+ rom[0x49966/2] = 0x6036; // 049966: 6736 beq 4999e (fills palette with blue otherwise)
+ rom[0x58140/2] = 0x6036; // 058140: 6736 beq 58178 (fills palette with red otherwise)
+ rom[0x5e05a/2] = 0x6036; // 05E05A: 6736 beq 5e092 (fills palette with red otherwise)
+ rom[0x5ebf0/2] = 0x6000; // 05EBF0: 6700 0208 beq 5edfa (fills palette with red otherwise)
+ rom[0x5edc2/2] = 0x6036; // 05EDC2: 6736 beq 5edfa (fills palette with green otherwise)
+ rom[0x5f71c/2] = 0x6000; // 05F71C: 6700 01F2 beq 5f910 (fills palette with green otherwise)
+ rom[0x5f8d8/2] = 0x6036; // 05F8D8: 6736 beq 5f910 (fills palette with red otherwise)
+ rom[0x64836/2] = 0x6036; // 064836: 6736 beq 6486e (fills palette with red otherwise)
+}
+
+
+
+/***************************************************************************
+
+ ROMs Loading
+
+***************************************************************************/
+
+/*
+
+Champion List II
+IGS, 1996
+
+PCB Layout
+----------
+
+IGS PCB NO-0115
+|---------------------------------------------|
+| M6295 IGSS0503.U38 |
+| UM3567 3.57945MHz |
+| DSW3 |
+| DSW2 PAL |
+| IGSM0502.U5 DSW1 6264 |
+| IGSM0501.U7 PAL 6264 |
+| PAL |
+| PAL IGS011 |
+| PAL |
+| PAL |
+| |
+| MC68HC000P10 22MHz TC524258AZ-10|
+| 6264 8255 TC524258AZ-10|
+| BATT 6264 MAJ2V185H.U29 TC524258AZ-10|
+| TC524258AZ-10|
+|---------------------------------------------|
+
+Notes:
+ 68k clock: 7.3333MHz (i.e. 22/3)
+ M6295 clock: 1.0476MHz (i.e. 22/21) \
+ M6295 SS: HIGH / Therefore sampling freq = 7.936363636kHz (i.e. 1047600 / 132)
+ UM3567: Compatible with YM2413, clock = 3.57945MHz
+ HSync: 15.78kHz
+ VSync: 60Hz
+*/
+
+ROM_START( chmplst2 )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD( "maj2v185h.u29", 0x00000, 0x80000, CRC(2572d59a) SHA1(1d5362e209dadf8b21c10d1351d4bb038bfcaaef) )
+
+ ROM_REGION( 0x200000, REGION_GFX1, 0 )
+ ROM_LOAD( "igsm0501.u7", 0x00000, 0x200000, CRC(1c952bd6) SHA1(a6b6f1cdfb29647e81c032ffe59c94f1a10ceaf8) )
+
+ ROM_REGION( 0x80000, REGION_GFX2, 0 ) // high order bit of graphics (5th bit)
+ /* these are identical ..seems ok as igs number is same, only ic changed */
+ ROM_LOAD( "igsm0502.u4", 0x00000, 0x80000, CRC(5d73ae99) SHA1(7283aa3d6b15ceb95db80756892be46eb997ef15) )
+ ROM_LOAD( "igsm0502.u5", 0x00000, 0x80000, CRC(5d73ae99) SHA1(7283aa3d6b15ceb95db80756892be46eb997ef15) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igss0503.u38", 0x00000, 0x80000, CRC(c9609c9c) SHA1(f036e682b792033409966e84292a69275eaa05e5) ) // 2 banks
+ROM_END
+
+/*
+
+chuugokuryuu (china dragon jpn ver.)
+(c)IGS
+Distributed by ALTA
+
+
+
+MAIN CPU : 68000
+I/O : IGS003 (=8255)
+SOUND ? : 6564L (=OPL?) , AR17961 (=M6295?)
+CRTC ? : IGS011
+SOUND CPU? : IGSD0301 (DIP 42P)
+OSC : 22Mhz , 3.579545Mhz
+DIPSW : 8bitx 3 (SW3 is not used)
+OTHER : IGS012
+
+MAIN PRG : "CHINA DRAGON U020J" (japan)
+SOUND PRG? : "CHINA DRAGON SP"
+SOUND DATA?: "CHINA DRAGON U44"
+
+*/
+
+ROM_START( drgnwrld )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_WORD_SWAP( "chinadr-v0400.u3", 0x00000, 0x80000, CRC(a6daa2b8) SHA1(0cbfd001c1fd82a6385453d1c2a808add67746af) )
+
+ ROM_REGION( 0x420000, REGION_GFX1, 0 )
+ ROM_LOAD( "igs-d0301.u39", 0x000000, 0x400000, CRC(78ab45d9) SHA1(c326ee9f150d766edd6886075c94dea3691b606d) )
+
+ ROM_REGION( 0x40000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igs-s0302.u43", 0x00000, 0x40000, CRC(fde63ce1) SHA1(cc32d2cace319fe4d5d0aa96d7addb2d1def62f2) )
+ROM_END
+
+ROM_START( drgwrld3 )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_WORD_SWAP( "chinadr-v0300.u3", 0x00000, 0x80000, CRC(5ac243e5) SHA1(50cccff0307239187ac2b65331ad2bcc666f8033) )
+
+ ROM_REGION( 0x420000, REGION_GFX1, 0 )
+ ROM_LOAD( "igs-d0301.u39", 0x000000, 0x400000, CRC(78ab45d9) SHA1(c326ee9f150d766edd6886075c94dea3691b606d) )
+
+ ROM_REGION( 0x40000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igs-s0302.u43", 0x00000, 0x40000, CRC(fde63ce1) SHA1(cc32d2cace319fe4d5d0aa96d7addb2d1def62f2) )
+ROM_END
+
+ROM_START( chugokur )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_WORD_SWAP( "china_jp.v20", 0x00000, 0x80000, CRC(9e018d1a) SHA1(fe14e6344434cabf43685e50fd49c90f05f565be) )
+
+ ROM_REGION( 0x420000, REGION_GFX1, 0 )
+ // wasn't in this set ..
+ ROM_LOAD( "igs-d0301.u39", 0x000000, 0x400000, CRC(78ab45d9) SHA1(c326ee9f150d766edd6886075c94dea3691b606d) )
+ ROM_LOAD( "china.u44", 0x400000, 0x020000, CRC(10549746) SHA1(aebd83796679c85b43ad514b2771897f94e61294) ) // 1xxxxxxxxxxxxxxxx = 0x00
+
+ ROM_REGION( 0x40000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igs-s0302.u43", 0x00000, 0x40000, CRC(fde63ce1) SHA1(cc32d2cace319fe4d5d0aa96d7addb2d1def62f2) ) // original label: "sp"
+ROM_END
+
+ROM_START( chindrag )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_WORD_SWAP( "v-021j", 0x00000, 0x80000, CRC(2f87f6e4) SHA1(d43065b078fdd9605c121988ad3092dce6cf0bf1) )
+
+ ROM_REGION( 0x420000, REGION_GFX1, 0 )
+ ROM_LOAD( "igs-d0301.u39", 0x000000, 0x400000, CRC(78ab45d9) SHA1(c326ee9f150d766edd6886075c94dea3691b606d) )
+ ROM_LOAD( "cg", 0x400000, 0x020000, CRC(2dda0be3) SHA1(587b7cab747d4336515c98eb3365341bb6c7e5e4) )
+
+ ROM_REGION( 0x40000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igs-s0302.u43", 0x00000, 0x40000, CRC(fde63ce1) SHA1(cc32d2cace319fe4d5d0aa96d7addb2d1def62f2) ) // original label: "sp"
+ROM_END
+
+
+/*
+ The Great Wall?
+
+ Other files in the zip:
+
+ 5.942 16-6126.G16
+ 14.488 U3-9911.G22
+ 14.488 U4-82E6.G22
+ 14.488 U5-6C5E.G22
+*/
+
+ROM_START( grtwall )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD16_WORD_SWAP( "wlcc4096.rom", 0x00000, 0x80000, CRC(3b16729f) SHA1(4ef4e5cbd6ccc65775e36c2c8b459bc1767d6574) )
+ ROM_CONTINUE ( 0x00000, 0x80000 ) // 1ST+2ND IDENTICAL
+
+ ROM_REGION( 0x280000, REGION_GFX1, ROMREGION_ERASE00 )
+ ROM_LOAD( "m0201-ig.160", 0x000000, 0x200000, CRC(ec54452c) SHA1(0ee7ffa3d4845af083944e64faf5a1c78247aaa2) )
+ ROM_LOAD( "grtwall.gfx", 0x200000, 0x080000, CRC(1f7ad299) SHA1(ab0a8fb31906519b9352ba172def48456e8d565c) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ ROM_LOAD( "040-c3c2.snd", 0x00000, 0x80000, CRC(220949aa) SHA1(1e0dba168a0687d32aaaed42714ae24358f4a3e7) ) // 2 banks
+ ROM_CONTINUE( 0x00000, 0x80000 ) // 1ST+2ND IDENTICAL
+ROM_END
+
+/*
+ Long Hu Bang
+
+ Other files in the zip:
+
+ 5.938 16V8.jed
+ 14.464 LHB-U33.jed
+ 14.488 LHB-U34.jed
+ 14.488 LHB-U35.jed
+*/
+
+ROM_START( lhb )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ // identical to LHB-4096
+ ROM_LOAD( "v305j-409", 0x00000, 0x80000, CRC(701de8ef) SHA1(4a77160f642f4de02fa6fbacf595b75c0d4a505d) )
+
+ ROM_REGION( 0x200000, REGION_GFX1, 0 )
+ ROM_LOAD( "m0201-ig.160", 0x000000, 0x200000, CRC(ec54452c) SHA1(0ee7ffa3d4845af083944e64faf5a1c78247aaa2) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ // identical to 040-c3c2.snd
+ ROM_LOAD( "m0202.snd", 0x00000, 0x80000, CRC(220949aa) SHA1(1e0dba168a0687d32aaaed42714ae24358f4a3e7) ) // 2 banks
+ ROM_CONTINUE( 0x00000, 0x80000 ) // 1ST+2ND IDENTICAL
+ROM_END
+
+ROM_START( lhba )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD( "maj_v-033c.u30", 0x00000, 0x80000, CRC(02a0b716) SHA1(cd0ee32ea69f66768196b0e9b4df0fae3af84ed3) )
+
+ ROM_REGION( 0x200000, REGION_GFX1, 0 )
+ ROM_LOAD( "igs_m0201.u15", 0x000000, 0x200000, CRC(ec54452c) SHA1(0ee7ffa3d4845af083944e64faf5a1c78247aaa2) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ // identical to 040-c3c2.snd
+ ROM_LOAD( "igs_m0202.u39", 0x00000, 0x80000, CRC(106ac5f7) SHA1(5796a880c3424e3d2251b2223a0e594957afecaf) ) // 2 banks
+
+ROM_END
+
+ROM_START( dbc )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD( "maj-h_v027h.u30", 0x00000, 0x80000, CRC(5d5ccd5b) SHA1(7a1223923f9a5825fd919ae9a36912284e705382) )
+
+ ROM_REGION( 0x300000, REGION_GFX1, 0 )
+ ROM_LOAD( "igs_m0201.u15", 0x000000, 0x200000, CRC(ec54452c) SHA1(0ee7ffa3d4845af083944e64faf5a1c78247aaa2) )
+ ROM_LOAD( "maj-h_cg.u8", 0x200000, 0x080000, CRC(ee45cc46) SHA1(ed011f758a02026222994aaea0677a4e9580fbda) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ ROM_LOAD( "igs_m0202.u39", 0x00000, 0x80000, CRC(106ac5f7) SHA1(5796a880c3424e3d2251b2223a0e594957afecaf) ) // 2 banks
+
+ROM_END
+
+
+
+/*
+Virtua Bowling by IGS
+
+PCB # 0101
+
+U45 (27c240) is probably program
+next to 68000 processor
+U68,U69 probably images (27c800 - mask)
+U67, U66 sound and ???? (27c040)
+
+ASIC chip used
+
+SMD - custom chip IGS 011 F5XD 174
+SMD - custom --near sound section - unknown -- i.d. rubbed off
+SMD - custom -- near inputs and 68000 IGS 012 9441EK001
+
+XTL near sound 33.868mhz
+XTL near 68000 22.0000mhz
+
+there are 4 banks of 8 dip switches
+*/
+
+ROM_START( vbowl )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ /*
+ This version reboots at the end of the game. Is this a bad dump?? Don't think it's a protection check
+ */
+ ROM_LOAD( "bowlingv101xcm.u45", 0x00000, 0x80000, CRC(ab8e3f1f) SHA1(69159e22559d6a26fe2afafd770aa640c192ba4b) )
+
+ ROM_REGION( 0x800000, REGION_GFX1, 0)
+ ROM_LOAD( "vrbowlng.u69", 0x000000, 0x400000, CRC(b0d339e8) SHA1(a26a5e0202a78e8cdc562b10d64e14eadfa4e115) )
+ // extra space to expand every 4 bits to 8
+
+ ROM_REGION( 0x100000, REGION_GFX2, ROMREGION_INVERT )
+ ROM_LOAD( "vrbowlng.u68", 0x000000, 0x100000, CRC(b0ce27e7) SHA1(6d3ef97edd606f384b1e05b152fbea12714887b7) )
+
+ ROM_REGION( 0x400000, REGION_SOUND1, 0 )
+ ROM_LOAD( "vrbowlng.u67", 0x00000, 0x80000, CRC(53000936) SHA1(e50c6216f559a9248c095bdfae05c3be4be79ff3) ) // 8 bit signed mono & u-law
+ ROM_LOAD( "vrbowlng.u66", 0x80000, 0x80000, CRC(f62cf8ed) SHA1(c53e47e2c619ed974ad40ee4aaa4a35147ea8311) ) // 8 bit signed mono
+ ROM_COPY( REGION_SOUND1, 0, 0x100000,0x100000)
+ ROM_COPY( REGION_SOUND1, 0, 0x200000,0x100000)
+ ROM_COPY( REGION_SOUND1, 0, 0x300000,0x100000)
+ROM_END
+
+ROM_START( vbowlj )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD( "vrbowlng.u45", 0x00000, 0x80000, CRC(091c19c1) SHA1(5a7bfbee357122e9061b38dfe988c3853b0984b0) ) // second half all 00
+
+ ROM_REGION( 0x800000, REGION_GFX1, 0)
+ ROM_LOAD( "vrbowlng.u69", 0x000000, 0x400000, CRC(b0d339e8) SHA1(a26a5e0202a78e8cdc562b10d64e14eadfa4e115) )
+ // extra space to expand every 4 bits to 8
+
+ ROM_REGION( 0x100000, REGION_GFX2, ROMREGION_INVERT )
+ ROM_LOAD( "vrbowlng.u68", 0x000000, 0x100000, CRC(b0ce27e7) SHA1(6d3ef97edd606f384b1e05b152fbea12714887b7) )
+
+ ROM_REGION( 0x400000, REGION_SOUND1, 0 )
+ ROM_LOAD( "vrbowlng.u67", 0x00000, 0x80000, CRC(53000936) SHA1(e50c6216f559a9248c095bdfae05c3be4be79ff3) ) // 8 bit signed mono & u-law
+ ROM_LOAD( "vrbowlng.u66", 0x80000, 0x80000, CRC(f62cf8ed) SHA1(c53e47e2c619ed974ad40ee4aaa4a35147ea8311) ) // 8 bit signed mono
+ ROM_COPY( REGION_SOUND1, 0, 0x100000,0x100000)
+ ROM_COPY( REGION_SOUND1, 0, 0x200000,0x100000)
+ ROM_COPY( REGION_SOUND1, 0, 0x300000,0x100000)
+ROM_END
+
+
+/*
+ Xing Yen Man Guan
+
+ Other files in the zip:
+
+ 14.484 U33-82E6.jed
+ 14.484 U34-1.jed
+ 14.484 U35-7068.jed
+*/
+
+ROM_START( xymg )
+ ROM_REGION( 0x80000, REGION_CPU1, 0 )
+ ROM_LOAD( "u30-ebac.rom", 0x00000, 0x80000, CRC(7d272b6f) SHA1(15fd1be23cabdc77b747541f5cd9fed6b08be4ad) )
+
+ ROM_REGION( 0x280000, REGION_GFX1, 0 )
+ ROM_LOAD( "m0201-ig.160", 0x000000, 0x200000, CRC(ec54452c) SHA1(0ee7ffa3d4845af083944e64faf5a1c78247aaa2) )
+ ROM_LOAD( "ygxy-u8.rom", 0x200000, 0x080000, CRC(56a2706f) SHA1(98bf4b3153eef53dd449e2538b4b7ff2cc2fe6fa) )
+
+ ROM_REGION( 0x80000, REGION_SOUND1, 0 )
+ // identical to 040-c3c2.snd
+ ROM_LOAD( "m0202.snd", 0x00000, 0x80000, CRC(220949aa) SHA1(1e0dba168a0687d32aaaed42714ae24358f4a3e7) ) // 2 banks
+ ROM_CONTINUE( 0x00000, 0x80000 ) // 1ST+2ND IDENTICAL
+ROM_END
+
+
+/***************************************************************************
+
+ Game Drivers
+
+***************************************************************************/
+
+GAME( 1995, lhb, 0, lhb, lhb, lhb, ROT0, "IGS", "Long Hu Bang", 0 )
+// the screenshot in the zip shows a 1995 copyright, but only 199 is displayed in MAME? todo: verify protection patch is correct for this set
+GAME( 1995, lhba, lhb, lhb, lhb, lhb, ROT0, "IGS", "Long Hu Bang (set 2)", 0 )
+GAME( 199?, dbc, 0, lhb, lhb, 0, ROT0, "IGS", "Da Ban Cheng", GAME_NOT_WORKING ) // needs decrypting / prot patches
+GAME( 1995, chindrag, drgnwrld, chindrag, chindrag, chindrag, ROT0, "IGS / ALTA", "Zhong Guo Long (Japan, V021J)", 0 )
+GAME( 1995, chugokur, drgnwrld, chindrag, chindrag, chugokur, ROT0, "IGS / ALTA", "Zhong Guo Long (Japan, V020J)", 0 )
+GAME( 1996, chmplst2, 0, chmplst2, chmplst2, chmplst2, ROT0, "IGS", "Long Hu Bang II", GAME_IMPERFECT_GRAPHICS )
+GAME( 1996, xymg, 0, xymg, xymg, xymg, ROT0, "IGS", "Xing Yen Man Guan (V651C)", GAME_IMPERFECT_GRAPHICS | GAME_NOT_WORKING )
+GAME( 1996, grtwall, xymg, grtwall, grtwall, grtwall, ROT0, "IGS", "Wan Li Chang Cheng (V638C)", GAME_IMPERFECT_GRAPHICS )
+GAME( 1996, vbowl, 0, vbowl, vbowl, vbowl, ROT0, "Alta / IGS", "Virtua Bowling (World, V101XCM)", GAME_IMPERFECT_SOUND ) /* Bad dump?? it reboots at end of game */
+GAME( 1996, vbowlj, vbowl, vbowl, vbowlj, vbowlj, ROT0, "Alta / IGS", "Virtua Bowling (Japan, V100JCM)", GAME_IMPERFECT_SOUND )
+GAME( 1997, drgnwrld, 0, chindrag, drgnwrld, drgnwrld, ROT0, "IGS", "Dragon World (World, V0400)", 0 )
+GAME( 1995, drgwrld3, drgnwrld, chindrag, drgnwrld, drgnwrld, ROT0, "IGS", "Dragon World (World, V0300)", 0 )