/********************************************************************************************************************* 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); } 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); } 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 ***************************************************************************/ 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)