summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/bishjan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/bishjan.c')
-rw-r--r--src/mame/drivers/bishjan.c489
1 files changed, 489 insertions, 0 deletions
diff --git a/src/mame/drivers/bishjan.c b/src/mame/drivers/bishjan.c
new file mode 100644
index 00000000000..a23d1a3945b
--- /dev/null
+++ b/src/mame/drivers/bishjan.c
@@ -0,0 +1,489 @@
+/*********************************************************************************************************************
+
+Bishou Jan (Laugh World) (C)1999 Subsino
+
+driver by Luca Elia
+
+PCB Layout
+----------
+
+|------------------------------------------------------|
+|TDA1519A 28-WAY |
+| VOL |
+| HM86171 ULN2003 |
+| LM324 |
+| S-1 ULN2003 |
+| |
+| |-------| DSW1(8) |
+| |-------| |SUBSINO| |
+| 2-V201.U9 |SUBSINO| |SS9802 | |
+| |SS9904 | | | |
+| | | |-------| |
+| |-------| |
+| |
+| 44.1MHz CXK58257 |
+| 3-V201.U25 |
+| 1-V203.U21 |
+| 4-V201.U26 SW1|
+| |-------| |-------| |-----| |
+| 5-V201.U27 |SUBSINO| |SUBSINO| |H8 | |
+| |SS9601 | |SS9803 | |3044 | |
+| 6-V201.U28 | | | | |-----| |
+| |-------| |-------| |
+| 62256 62256 BATTERY |
+|------------------------------------------------------|
+Notes:
+ H8/3044 - Subsino re-badged Hitachi H8/3044 HD6433044A22F Microcontroller (QFP100)
+ The H8/3044 is a H8/3002 with 24bit address bus and has 32k MASKROM and 2k RAM, clock input is 14.7MHz [44.1/3]
+ MD0,MD1 & MD2 are configured to MODE 6 16MByte Expanded Mode with the on-chip 32k MASKROM enabled.
+ CXK58257 - Sony CXK58257 32k x8 SRAM (SOP28)
+ HM86171 - Hualon Microelectronics HMC HM86171 VGA 256 colour RAMDAC (DIP28)
+ S-1 - ?? Probably some kind of audio OP AMP or DAC? (DIP8)
+ SW1 - Push Button Test Switch
+ HSync - 15.75kHz
+ VSync - 60Hz
+
+*********************************************************************************************************************/
+
+#include "driver.h"
+#include "cpu/h83002/h83002.h"
+
+/***************************************************************************
+ Video Hardware
+***************************************************************************/
+
+static int clr_offset;
+
+static UINT16 *bishjan_scroll, *bishjan_layers;
+
+static UINT16 *bishjan_videoram1, *bishjan_videoram2;
+static tilemap *tmap1, *tmap2;
+
+static TILE_GET_INFO( get_tile_info1 ) { SET_TILE_INFO(0, bishjan_videoram1[ tile_index ], 0, 0); }
+static TILE_GET_INFO( get_tile_info2 ) { SET_TILE_INFO(0, bishjan_videoram2[ tile_index ], 0, 0); }
+
+static VIDEO_START(bishjan)
+{
+ tmap1 = tilemap_create( get_tile_info1, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8,8, 0x80,0x40 );
+
+ tmap2 = tilemap_create( get_tile_info2, tilemap_scan_rows,
+ TILEMAP_TYPE_PEN, 8,8, 0x80,0x40 );
+
+ tilemap_set_transparent_pen(tmap1, 0);
+ tilemap_set_transparent_pen(tmap2, 0);
+
+ bishjan_videoram1 = (UINT16*)auto_malloc(sizeof(UINT16) * 0x80 * 0x40);
+ bishjan_videoram2 = (UINT16*)auto_malloc(sizeof(UINT16) * 0x80 * 0x40);
+
+ colorram = auto_malloc(256*3);
+}
+
+static VIDEO_UPDATE( bishjan )
+{
+ int layers_ctrl = ~bishjan_layers[0];
+
+ int scroll1_x = ((bishjan_scroll[1] & 0x0f00)>>0) | (bishjan_scroll[0] >> 8);
+ int scroll1_y = ((bishjan_scroll[1] & 0xf000)>>4) | (bishjan_scroll[0] & 0xff);
+
+ int scroll2_x = ((bishjan_scroll[2] & 0x0f)<<8) | (bishjan_scroll[1] & 0xff);
+ int scroll2_y = ((bishjan_scroll[2] & 0xf0)<<4) | (bishjan_scroll[2] >> 8);
+
+#ifdef MAME_DEBUG
+if (input_code_pressed(KEYCODE_Z))
+{
+ int msk = 0;
+ if (input_code_pressed(KEYCODE_Q)) msk |= 1;
+ if (input_code_pressed(KEYCODE_W)) msk |= 2;
+ if (msk != 0) layers_ctrl &= msk;
+}
+#endif
+
+ scroll1_y += 1;
+ scroll2_y += 1;
+
+ tilemap_set_scrollx( tmap1, 0, scroll1_x); tilemap_set_scrolly( tmap1, 0, scroll1_y );
+ tilemap_set_scrollx( tmap2, 0, scroll2_x); tilemap_set_scrolly( tmap2, 0, scroll2_y );
+
+ fillbitmap(bitmap,get_black_pen(machine),cliprect);
+
+ if (layers_ctrl & 1) tilemap_draw(bitmap,cliprect, tmap1, 0, 0);
+ if (layers_ctrl & 2) tilemap_draw(bitmap,cliprect, tmap2, 0, 0);
+
+// popmessage("23: %03x,%03x - %03x,%03x LY: %02x", scroll1_x,scroll1_y, scroll2_x,scroll2_y, (int)*bishjan_layers);
+
+ return 0;
+}
+
+// Palette: HMC HM86171 VGA 256 colour RAMDAC
+
+static WRITE16_HANDLER(colordac_w)
+{
+ if (ACCESSING_LSB)
+ {
+ colorram[clr_offset] = data;
+ palette_set_color_rgb(Machine, clr_offset/3,
+ pal6bit(colorram[(clr_offset/3)*3+0]),
+ pal6bit(colorram[(clr_offset/3)*3+1]),
+ pal6bit(colorram[(clr_offset/3)*3+2])
+ );
+ clr_offset = (clr_offset+1) % (256*3);
+ }
+
+ if (ACCESSING_MSB)
+ {
+ clr_offset = (data>>8) * 3;
+ }
+}
+
+// Tilemaps
+
+static UINT16 bishjan_low;
+
+static WRITE16_HANDLER( bishjan_low_w )
+{
+ if (ACCESSING_MSB) bishjan_low = data >> 8;
+}
+
+static WRITE16_HANDLER( bishjan_tmap1_w )
+{
+ if (ACCESSING_MSB)
+ {
+ bishjan_videoram1[offset*2] = data | bishjan_low;
+ tilemap_mark_tile_dirty(tmap1, offset*2);
+ }
+ if (ACCESSING_LSB)
+ {
+ bishjan_videoram1[offset*2+1] = (data << 8) | bishjan_low;
+ tilemap_mark_tile_dirty(tmap1, offset*2+1);
+ }
+}
+static WRITE16_HANDLER( bishjan_tmap2_w )
+{
+ if (ACCESSING_MSB)
+ {
+ bishjan_videoram2[offset*2] = data | bishjan_low;
+ tilemap_mark_tile_dirty(tmap2, offset*2);
+ }
+ if (ACCESSING_LSB)
+ {
+ bishjan_videoram2[offset*2+1] = (data << 8) | bishjan_low;
+ tilemap_mark_tile_dirty(tmap2, offset*2+1);
+ }
+}
+
+static READ16_HANDLER( bishjan_tmap1_lo_r )
+{
+ return (bishjan_videoram1[offset*2+0] << 8) | (bishjan_videoram1[offset*2+1] & 0x00ff);
+}
+static READ16_HANDLER( bishjan_tmap1_hi_r )
+{
+ return (bishjan_videoram1[offset*2+0] & 0xff00) | (bishjan_videoram1[offset*2+1] >> 8);
+}
+
+static READ16_HANDLER( bishjan_tmap2_lo_r )
+{
+ return (bishjan_videoram2[offset*2+0] << 8) | (bishjan_videoram2[offset*2+1] & 0x00ff);
+}
+static READ16_HANDLER( bishjan_tmap2_hi_r )
+{
+ return (bishjan_videoram2[offset*2+0] & 0xff00) | (bishjan_videoram2[offset*2+1] >> 8);
+}
+
+// Inputs
+
+static UINT16 bishjan_sel, bishjan_input, bishjan_hopper;
+
+static WRITE16_HANDLER( bishjan_sel_w )
+{
+ if (ACCESSING_MSB) bishjan_sel = data >> 8;
+}
+
+static READ16_HANDLER( bishjan_unk_r )
+{
+ return
+ (mame_rand(Machine) & 0x9800) | // bit 7 eeprom?
+ (((bishjan_sel==0x12) ? 0x40:0x00) << 8) |
+// (mame_rand() & 0xff);
+// (((cpu_getcurrentframe()%60)==0)?0x18:0x00);
+ 0x18;
+}
+
+static WRITE16_HANDLER( bishjan_input_w )
+{
+ if (ACCESSING_MSB) bishjan_input = data >> 8;
+}
+
+static READ16_HANDLER( bishjan_input_r )
+{
+ int i;
+ UINT16 res = 0xff;
+
+ for (i = 0; i < 5; i++)
+ if (bishjan_input & (1 << i))
+ res = readinputport(4+i);
+
+ return (res << 8) |
+ readinputport(3) |
+ ((bishjan_hopper && !(cpu_getcurrentframe()%10)) ? 0x00 : 0x04) // bit 2: hopper sensor
+ ;
+}
+
+static WRITE16_HANDLER( bishjan_coin_w )
+{
+ if (ACCESSING_LSB)
+ {
+ // coin out data & 0x01;
+ bishjan_hopper = data & 0x02; // hopper
+ coin_counter_w( 1, data & 0x10 );
+ }
+}
+
+/***************************************************************************
+ Memory Maps
+***************************************************************************/
+
+/*
+432000 & 436000 W + lo (80*20=1000)
+412000 & 422000 R (lo & hi)
+416000 & 426000 R (lo & hi)
+
+433000 & 437000 W
+413000 & 423000 R
+417000 & 427000 R
+*/
+
+static ADDRESS_MAP_START( bishjan_map, ADDRESS_SPACE_PROGRAM, 16 )
+ ADDRESS_MAP_FLAGS( AMEF_ABITS(24) )
+
+ AM_RANGE( 0x000000, 0x07ffff ) AM_ROM AM_REGION(REGION_CPU1, 0)
+ AM_RANGE( 0x080000, 0x0fffff ) AM_ROM AM_REGION(REGION_CPU1, 0)
+
+ AM_RANGE( 0x200000, 0x207fff ) AM_RAM AM_BASE(&generic_nvram16) AM_SIZE(&generic_nvram_size) // battery
+
+ AM_RANGE( 0x412000, 0x412fff ) AM_READ( bishjan_tmap2_lo_r ) //?
+ AM_RANGE( 0x413000, 0x413fff ) AM_READ( MRA16_RAM ) AM_SHARE(1)
+ AM_RANGE( 0x416000, 0x416fff ) AM_READ( bishjan_tmap1_lo_r ) //?
+ AM_RANGE( 0x417000, 0x417fff ) AM_READ( MRA16_RAM ) AM_SHARE(1)
+ AM_RANGE( 0x422000, 0x422fff ) AM_READ( bishjan_tmap2_hi_r ) //?
+ AM_RANGE( 0x423000, 0x423fff ) AM_READ( MRA16_RAM ) AM_SHARE(2)
+ AM_RANGE( 0x426000, 0x426fff ) AM_READ( bishjan_tmap1_hi_r )
+ AM_RANGE( 0x427000, 0x427fff ) AM_READ( MRA16_RAM ) AM_SHARE(2)
+ AM_RANGE( 0x430000, 0x431fff ) AM_WRITE( bishjan_tmap2_w )
+ AM_RANGE( 0x432000, 0x432fff ) AM_WRITE( bishjan_tmap2_w ) //?
+ AM_RANGE( 0x433000, 0x433fff ) AM_WRITE( MWA16_RAM ) AM_SHARE(1)
+ AM_RANGE( 0x434000, 0x435fff ) AM_WRITE( bishjan_tmap1_w )
+ AM_RANGE( 0x436000, 0x436fff ) AM_WRITE( bishjan_tmap1_w ) //?
+ AM_RANGE( 0x437000, 0x437fff ) AM_WRITE( MWA16_RAM ) AM_SHARE(2)
+
+ AM_RANGE( 0x600000, 0x600001 ) AM_READWRITE( MRA16_NOP, bishjan_sel_w )
+ AM_RANGE( 0x600060, 0x600061 ) AM_WRITE( colordac_w )
+ AM_RANGE( 0x600062, 0x600063 ) AM_WRITE( MWA16_NOP ) // ff to 600062
+ AM_RANGE( 0x6000a0, 0x6000a1 ) AM_WRITE( bishjan_low_w )
+
+ AM_RANGE( 0xa0001e, 0xa0001f ) AM_WRITE( MWA16_RAM ) AM_BASE( &bishjan_layers )
+
+ AM_RANGE( 0xa00020, 0xa00025 ) AM_WRITE( MWA16_RAM ) AM_BASE( &bishjan_scroll )
+
+ AM_RANGE( 0xc00000, 0xc00001 ) AM_READ( input_port_1_word_r ) // c00001 sw1
+ AM_RANGE( 0xc00002, 0xc00003 ) AM_READWRITE( input_port_2_word_r, bishjan_input_w ) // in c
+ AM_RANGE( 0xc00004, 0xc00005 ) AM_READ( bishjan_input_r ) // in a & b
+ AM_RANGE( 0xc00006, 0xc00007 ) AM_READ( bishjan_unk_r ) // c00006 in d ($18)
+ AM_RANGE( 0xc00008, 0xc00009 ) AM_READWRITE( input_port_0_word_r, bishjan_coin_w ) // c00009 reset
+ADDRESS_MAP_END
+
+
+/***************************************************************************
+ Graphics Layout
+***************************************************************************/
+
+static const gfx_layout bishjan_8x8_layout =
+{
+ 8,8,
+ RGN_FRAC(1,1),
+ 8,
+ { STEP8(0,1) },
+ { STEP8(0,8) },
+ { STEP8(0,8*8) },
+ 8*8*8
+};
+
+static GFXDECODE_START( bishjan )
+ GFXDECODE_ENTRY( REGION_GFX1, 0, bishjan_8x8_layout, 0, 1 )
+GFXDECODE_END
+
+
+/***************************************************************************
+ Input Ports
+***************************************************************************/
+
+static INPUT_PORTS_START( bishjan )
+ PORT_START // IN0 - Reset
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F1)
+
+ PORT_START // IN1 - DSW(SW1)
+ PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Controls ) )
+ PORT_DIPSETTING( 0x0001, "Keyboard" )
+ PORT_DIPSETTING( 0x0000, DEF_STR( Joystick ) )
+ PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0002, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0004, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0008, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0010, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0020, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0040, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+ PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) )
+ PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
+ PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
+
+ PORT_START // IN2 - C
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_START1 ) // start (joy)
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) // down (joy)
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) // left (joy)
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) // right (joy)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON1 ) // n (joy)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) // bet (joy)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON2 ) // select (joy)
+
+ PORT_START // IN3 - A
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE ) // test
+ PORT_BIT( 0x0004, IP_ACTIVE_HIGH,IPT_SPECIAL ) // hopper sensor
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) // stats
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SERVICE2 ) // pay out? "hopper empty"
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(2) // coin
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_SERVICE3 ) // pay out? "hopper empty"
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_IMPULSE(2) // coin
+
+ PORT_START // IN4 - B(1)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_A ) // a
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_E ) // e
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_I ) // i
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_M ) // m
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // i2
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_START1 ) // b2 (start)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN5 - B(2)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_B ) // b
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_F ) // f
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_J ) // j
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_MAHJONG_N ) // n
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // l2
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_MAHJONG_BET ) // c2 (bet)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN6 - B(3)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_C ) // c
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_G ) // g
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_K ) // k
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // k2
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // m2
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN7 - B(4)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_MAHJONG_D ) // d
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_MAHJONG_H ) // h
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_MAHJONG_L ) // l
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN ) // j2
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+
+ PORT_START // IN8 - B(5)
+ PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_UNKNOWN ) // g2
+ PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_UNKNOWN ) // e2
+ PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_UNKNOWN ) // d2
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_UNKNOWN ) // f2
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_UNKNOWN )
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_UNKNOWN )
+INPUT_PORTS_END
+
+
+/***************************************************************************
+ Machine Drivers
+***************************************************************************/
+
+static INTERRUPT_GEN( bishjan_interrupt )
+{
+ switch (cpu_getiloops())
+ {
+ case 0:
+ cpunum_set_input_line(0, 0, PULSE_LINE);
+ break;
+ default:
+ h8_3002_InterruptRequest(24);
+ break;
+ }
+}
+
+static MACHINE_DRIVER_START( bishjan )
+ MDRV_CPU_ADD(H83002, 44100000/3)
+ MDRV_CPU_PROGRAM_MAP( bishjan_map, 0 )
+ MDRV_CPU_VBLANK_INT(bishjan_interrupt,2)
+
+ MDRV_NVRAM_HANDLER(generic_0fill)
+
+ /* video hardware */
+ 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, 256-16-1 )
+ MDRV_GFXDECODE(bishjan)
+ MDRV_PALETTE_LENGTH( 256 )
+ MDRV_SCREEN_REFRESH_RATE( 60 )
+
+ MDRV_VIDEO_START( bishjan )
+ MDRV_VIDEO_UPDATE( bishjan )
+MACHINE_DRIVER_END
+
+/***************************************************************************
+ ROMs Loading
+***************************************************************************/
+
+ROM_START( bishjan )
+ ROM_REGION( 0x100000, REGION_CPU1, 0 ) // H8/3044 program
+ ROM_LOAD( "1-v203.u21", 0x000000, 0x080000, CRC(1f891d48) SHA1(0b6a5aa8b781ba8fc133289790419aa8ea21c400) )
+
+ ROM_REGION( 0x400000, REGION_GFX1, 0 ) // Tiles
+ ROM_LOAD32_BYTE( "3-v201.u25", 0x000000, 0x100000, CRC(e013e647) SHA1(a5b0f82f3454393c1ea5e635b0d37735a25e2ea5) )
+ ROM_LOAD32_BYTE( "4-v201.u26", 0x000001, 0x100000, CRC(e0d40ef1) SHA1(95f80889103a7b93080b46387274cb1ffe0c8768) )
+ ROM_LOAD32_BYTE( "5-v201.u27", 0x000002, 0x100000, CRC(85067d40) SHA1(3ecf7851311a77a0dfca90775fcbf6faabe9c2ab) )
+ ROM_LOAD32_BYTE( "6-v201.u28", 0x000003, 0x100000, CRC(430bd9d7) SHA1(dadf5a7eb90cf2dc20f97dbf20a4b6c8e7734fb1) )
+
+ ROM_REGION( 0x100000, REGION_SOUND1, 0 ) // Samples
+ ROM_LOAD( "2-v201.u9", 0x000000, 0x100000, CRC(ea42764d) SHA1(13fe1cd30e474f4b092949c440068e9ddca79976) )
+ROM_END
+
+static DRIVER_INIT(bishjan)
+{
+ UINT16 *rom = (UINT16*)memory_region(REGION_CPU1);
+
+ // check
+ rom[0x042EA/2] = 0x4008;
+
+ // rts -> rte
+ rom[0x33386/2] = 0x5670;
+ rom[0x0CC5C/2] = 0x5670;
+}
+
+GAME(1999, bishjan, 0, bishjan, bishjan, bishjan, ROT0, "Subsino", "Bishou Jan", GAME_NO_SOUND)