#include "driver.h" #include "video/ppu2c0x.h" #include "machine/rp5h01.h" /* Globals */ int pc10_sdcs; /* ShareD Chip Select */ int pc10_dispmask; /* Display Mask */ int pc10_nmi_enable; /* nmi enable */ int pc10_dog_di; /* watchdog disable */ int pc10_int_detect; /* interrupt detect */ int pc10_gun_controller; int pc10_game_mode; /* Used in Single monitor version to display Game or PPU */ int pc10_dispmask_old; /* Locals */ static int cart_sel; static int cntrl_mask; static int input_latch[2]; static int mirroring; static int MMC2_bank[4], MMC2_bank_latch[2]; /************************************* * * Init machine * *************************************/ MACHINE_RESET( pc10 ) { /* initialize latches and flip-flops */ pc10_nmi_enable = pc10_dog_di = pc10_dispmask = pc10_sdcs = pc10_int_detect = 0; pc10_game_mode = pc10_dispmask_old = 0; cart_sel = 0; cntrl_mask = 1; input_latch[0] = input_latch[1] = 0; /* variables used only in MMC2 game (mapper 9) */ MMC2_bank[0] = MMC2_bank[1] = MMC2_bank[2] = MMC2_bank[3] = 0; MMC2_bank_latch[0] = MMC2_bank_latch[1] = 0xfe; /* reset the security chip */ RP5H01_enable_w( 0, 0 ); RP5H01_0_reset_w( 0, 0 ); RP5H01_0_reset_w( 0, 1 ); RP5H01_enable_w( 0, 1 ); /* reset the ppu */ ppu2c0x_reset( 0, /* video_screen_get_scan_period(0) * */ 1 ); ppu2c0x_set_mirroring( 0, mirroring ); } /************************************* * * BIOS ports handling * *************************************/ READ8_HANDLER( pc10_port_0_r ) { return readinputport( 0 ) | ( ( ~pc10_int_detect & 1 ) << 3 ); } WRITE8_HANDLER( pc10_SDCS_w ) { /* Hooked to CLR on LS194A - Sheet 2, bottom left. Drives character and color code to 0. It's used to keep the screen black during redraws. Also hooked to the video sram. Prevent writes. */ pc10_sdcs = ~data & 1; } WRITE8_HANDLER( pc10_CNTRLMASK_w ) { cntrl_mask = ~data & 1; } WRITE8_HANDLER( pc10_DISPMASK_w ) { pc10_dispmask = ~data & 1; } WRITE8_HANDLER( pc10_SOUNDMASK_w ) { /* should mute the APU - unimplemented yet */ } WRITE8_HANDLER( pc10_NMIENABLE_w ) { pc10_nmi_enable = data & 1; } WRITE8_HANDLER( pc10_DOGDI_w ) { pc10_dog_di = data & 1; } WRITE8_HANDLER( pc10_GAMERES_w ) { cpunum_set_input_line(1, INPUT_LINE_RESET, ( data & 1 ) ? CLEAR_LINE : ASSERT_LINE ); } WRITE8_HANDLER( pc10_GAMESTOP_w ) { cpunum_set_input_line(1, INPUT_LINE_HALT, ( data & 1 ) ? CLEAR_LINE : ASSERT_LINE ); } WRITE8_HANDLER( pc10_PPURES_w ) { if ( data & 1 ) ppu2c0x_reset( 0, /* video_screen_get_scan_period(0) * */ 1 ); } READ8_HANDLER( pc10_detectclr_r ) { pc10_int_detect = 0; return 0; } WRITE8_HANDLER( pc10_CARTSEL_w ) { cart_sel &= ~( 1 << offset ); cart_sel |= ( data & 1 ) << offset; } /************************************* * * RP5H01 handling * *************************************/ READ8_HANDLER( pc10_prot_r ) { int data = 0xe7; /* we only support a single cart connected at slot 0 */ if ( cart_sel == 0 ) { RP5H01_0_enable_w( 0, 0 ); data |= ( ( ~RP5H01_counter_r( 0 ) ) << 4 ) & 0x10; /* D4 */ data |= ( ( RP5H01_data_r( 0 ) ) << 3 ) & 0x08; /* D3 */ RP5H01_0_enable_w( 0, 1 ); } return data; } WRITE8_HANDLER( pc10_prot_w ) { /* we only support a single cart connected at slot 0 */ if ( cart_sel == 0 ) { RP5H01_0_enable_w( 0, 0 ); RP5H01_0_test_w( 0, data & 0x10 ); /* D4 */ RP5H01_0_clock_w( 0, data & 0x08 ); /* D3 */ RP5H01_0_reset_w( 0, ~data & 0x01 ); /* D0 */ RP5H01_0_enable_w( 0, 1 ); /* this thing gets dense at some point */ /* it wants to jump and execute an opcode at $ffff, wich */ /* is the actual protection memory area */ /* setting the whole 0x2000 region every time is a waste */ /* so we just set $ffff with the current value */ memory_region( REGION_CPU1 )[0xffff] = pc10_prot_r(0); } } /************************************* * * Input Ports * *************************************/ WRITE8_HANDLER( pc10_in0_w ) { /* Toggling bit 0 high then low resets both controllers */ if ( data & 1 ) return; /* load up the latches */ input_latch[0] = readinputport( 3 ); input_latch[1] = readinputport( 4 ); /* apply any masking from the BIOS */ if ( cntrl_mask ) { /* mask out select and start */ input_latch[0] &= ~0x0c; } } READ8_HANDLER( pc10_in0_r ) { int ret = ( input_latch[0] ) & 1; /* shift */ input_latch[0] >>= 1; /* some games expect bit 6 to be set because the last entry on the data bus shows up */ /* in the unused upper 3 bits, so typically a read from $4016 leaves 0x40 there. */ ret |= 0x40; return ret; } READ8_HANDLER( pc10_in1_r ) { int ret = ( input_latch[1] ) & 1; /* shift */ input_latch[1] >>= 1; /* do the gun thing */ if ( pc10_gun_controller ) { int trigger = readinputport( 3 ); int x = readinputport( 5 ); int y = readinputport( 6 ); UINT32 pix, color_base; const pen_t *pens = Machine->pens; /* no sprite hit (yet) */ ret |= 0x08; /* get the pixel at the gun position */ pix = ppu2c0x_get_pixel( 0, x, y ); /* get the color base from the ppu */ color_base = ppu2c0x_get_colorbase( 0 ); /* look at the screen and see if the cursor is over a bright pixel */ if ( ( pix == pens[color_base+0x20] ) || ( pix == pens[color_base+0x30] ) || ( pix == pens[color_base+0x33] ) || ( pix == pens[color_base+0x34] ) ) { ret &= ~0x08; /* sprite hit */ } /* now, add the trigger if not masked */ if ( !cntrl_mask ) { ret |= ( trigger & 2 ) << 3; } } /* some games expect bit 6 to be set because the last entry on the data bus shows up */ /* in the unused upper 3 bits, so typically a read from $4016 leaves 0x40 there. */ ret |= 0x40; return ret; } /* RP5H01 interface */ static struct RP5H01_interface rp5h01_interface = { 1, { REGION_USER1 }, { 0 } }; /************************************* * * Common init for all games * *************************************/ DRIVER_INIT( playch10 ) { /* initialize the security chip */ if ( RP5H01_init( &rp5h01_interface ) ) { fatalerror("rp5h01_interface initualization failed"); } /* set the controller to default */ pc10_gun_controller = 0; /* default mirroring */ mirroring = PPU_MIRROR_NONE; } /********************************************************************************** * * Game and Board-specific initialization * **********************************************************************************/ /* Gun games */ DRIVER_INIT( pc_gun ) { /* common init */ driver_init_playch10(machine); /* set the control type */ pc10_gun_controller = 1; } /* Horizontal mirroring */ DRIVER_INIT( pc_hrz ) { /* common init */ driver_init_playch10(machine); /* setup mirroring */ mirroring = PPU_MIRROR_HORZ; } /* MMC1 mapper, used by D and F boards */ static int mmc1_shiftreg; static int mmc1_shiftcount; static int mmc1_rom_mask; static WRITE8_HANDLER( mmc1_rom_switch_w ) { /* basically, a MMC1 mapper from the nes */ static int size16k, switchlow, vrom4k; int reg = ( offset >> 13 ); /* reset mapper */ if ( data & 0x80 ) { mmc1_shiftreg = mmc1_shiftcount = 0; size16k = 1; switchlow = 1; vrom4k = 0; return; } /* see if we need to clock in data */ if ( mmc1_shiftcount < 5 ) { mmc1_shiftreg >>= 1; mmc1_shiftreg |= ( data & 1 ) << 4; mmc1_shiftcount++; } /* are we done shifting? */ if ( mmc1_shiftcount == 5 ) { /* reset count */ mmc1_shiftcount = 0; /* apply data to registers */ switch( reg ) { case 0: /* mirroring and options */ { int _mirroring; vrom4k = mmc1_shiftreg & 0x10; size16k = mmc1_shiftreg & 0x08; switchlow = mmc1_shiftreg & 0x04; switch( mmc1_shiftreg & 3 ) { case 0: _mirroring = PPU_MIRROR_LOW; break; case 1: _mirroring = PPU_MIRROR_HIGH; break; case 2: _mirroring = PPU_MIRROR_VERT; break; default: case 3: _mirroring = PPU_MIRROR_HORZ; break; } /* apply mirroring */ ppu2c0x_set_mirroring( 0, _mirroring ); } break; case 1: /* video rom banking - bank 0 - 4k or 8k */ ppu2c0x_set_videorom_bank( 0, 0, ( vrom4k ) ? 4 : 8, ( mmc1_shiftreg & 0x1f ), 256 ); break; case 2: /* video rom banking - bank 1 - 4k only */ if ( vrom4k ) ppu2c0x_set_videorom_bank( 0, 4, 4, ( mmc1_shiftreg & 0x1f ), 256 ); break; case 3: /* program banking */ { int bank = ( mmc1_shiftreg & mmc1_rom_mask ) * 0x4000; if ( !size16k ) { /* switch 32k */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x010000+bank], 0x8000 ); } else { /* switch 16k */ if ( switchlow ) { /* low */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x010000+bank], 0x4000 ); } else { /* high */ memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[0x010000+bank], 0x4000 ); } } } break; } } } /**********************************************************************************/ /* A Board games (Track & Field, Gradius) */ static WRITE8_HANDLER( aboard_vrom_switch_w ) { ppu2c0x_set_videorom_bank( 0, 0, 8, ( data & 3 ), 512 ); } DRIVER_INIT( pcaboard ) { /* switches vrom with writes to the $803e-$8041 area */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0x8fff, 0, 0, aboard_vrom_switch_w ); /* common init */ driver_init_playch10(machine); /* set the mirroring here */ mirroring = PPU_MIRROR_VERT; } /**********************************************************************************/ /* B Board games (Contra, Rush N' Attach, Pro Wrestling) */ static WRITE8_HANDLER( bboard_rom_switch_w ) { int bankoffset = 0x10000 + ( ( data & 7 ) * 0x4000 ); memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bankoffset], 0x4000 ); } DRIVER_INIT( pcbboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x28000], 0x8000 ); /* Roms are banked at $8000 to $bfff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, bboard_rom_switch_w ); /* common init */ driver_init_playch10(machine); /* set the mirroring here */ mirroring = PPU_MIRROR_VERT; } /**********************************************************************************/ /* C Board games (The Goonies) */ static WRITE8_HANDLER( cboard_vrom_switch_w ) { ppu2c0x_set_videorom_bank( 0, 0, 8, ( ( data >> 1 ) & 1 ), 512 ); } DRIVER_INIT( pccboard ) { /* switches vrom with writes to $6000 */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6000, 0, 0, cboard_vrom_switch_w ); /* common init */ driver_init_playch10(machine); } /**********************************************************************************/ /* D Board games (Rad Racer) */ DRIVER_INIT( pcdboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x28000], 0x8000 ); mmc1_rom_mask = 0x07; /* MMC mapper at writes to $8000-$ffff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ driver_init_playch10(machine); } /* D Board games with extra ram (Metroid) */ DRIVER_INIT( pcdboard_2 ) { /* extra ram at $6000-$7fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); /* common init */ driver_init_pcdboard(machine); } /**********************************************************************************/ /* E Board games (Mike Tyson's Punchout) - BROKEN - FIX ME */ /* callback for the ppu_latch */ static void mapper9_latch( offs_t offset ) { if( (offset & 0x1ff0) == 0x0fd0 && MMC2_bank_latch[0] != 0xfd ) { MMC2_bank_latch[0] = 0xfd; ppu2c0x_set_videorom_bank( 0, 0, 4, MMC2_bank[0], 256 ); } else if( (offset & 0x1ff0) == 0x0fe0 && MMC2_bank_latch[0] != 0xfe ) { MMC2_bank_latch[0] = 0xfe; ppu2c0x_set_videorom_bank( 0, 0, 4, MMC2_bank[1], 256 ); } else if( (offset & 0x1ff0) == 0x1fd0 && MMC2_bank_latch[1] != 0xfd ) { MMC2_bank_latch[1] = 0xfd; ppu2c0x_set_videorom_bank( 0, 4, 4, MMC2_bank[2], 256 ); } else if( (offset & 0x1ff0) == 0x1fe0 && MMC2_bank_latch[1] != 0xfe ) { MMC2_bank_latch[1] = 0xfe; ppu2c0x_set_videorom_bank( 0, 4, 4, MMC2_bank[3], 256 ); } } static WRITE8_HANDLER( eboard_rom_switch_w ) { /* a variation of mapper 9 on a nes */ switch( offset & 0x7000 ) { case 0x2000: /* code bank switching */ { int bankoffset = 0x10000 + ( data & 0x0f ) * 0x2000; memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bankoffset], 0x2000 ); } break; case 0x3000: /* gfx bank 0 - 4k */ MMC2_bank[0] = data; if( MMC2_bank_latch[0] == 0xfd ) ppu2c0x_set_videorom_bank( 0, 0, 4, data, 256 ); break; case 0x4000: /* gfx bank 0 - 4k */ MMC2_bank[1] = data; if( MMC2_bank_latch[0] == 0xfe ) ppu2c0x_set_videorom_bank( 0, 0, 4, data, 256 ); break; case 0x5000: /* gfx bank 1 - 4k */ MMC2_bank[2] = data; if( MMC2_bank_latch[1] == 0xfd ) ppu2c0x_set_videorom_bank( 0, 4, 4, data, 256 ); break; case 0x6000: /* gfx bank 1 - 4k */ MMC2_bank[3] = data; if( MMC2_bank_latch[1] == 0xfe ) ppu2c0x_set_videorom_bank( 0, 4, 4, data, 256 ); break; case 0x7000: /* mirroring */ ppu2c0x_set_mirroring( 0, data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); break; } } DRIVER_INIT( pceboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x28000], 0x8000 ); /* basically a mapper 9 on a nes */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, eboard_rom_switch_w ); /* ppu_latch callback */ ppu_latch = mapper9_latch; /* nvram at $6000-$6fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MWA8_RAM ); /* common init */ driver_init_playch10(machine); } /**********************************************************************************/ /* F Board games (Ninja Gaiden, Double Dragon) */ DRIVER_INIT( pcfboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x28000], 0x8000 ); mmc1_rom_mask = 0x07; /* MMC mapper at writes to $8000-$ffff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ driver_init_playch10(machine); } /* F Board games with extra ram (Baseball Stars) */ DRIVER_INIT( pcfboard_2 ) { /* extra ram at $6000-$6fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x6fff, 0, 0, MWA8_RAM ); /* common init */ driver_init_pcfboard(machine); } /**********************************************************************************/ /* G Board games (Super Mario Bros. 3) */ static int gboard_scanline_counter; static int gboard_scanline_latch; static int gboard_banks[2]; static int gboard_4screen; static void gboard_scanline_cb( int num, int scanline, int vblank, int blanked ) { if ( !vblank && !blanked ) { if ( --gboard_scanline_counter == -1 ) { gboard_scanline_counter = gboard_scanline_latch; cpunum_set_input_line( 1, 0, PULSE_LINE ); } } } static WRITE8_HANDLER( gboard_rom_switch_w ) { /* basically, a MMC3 mapper from the nes */ static int last_bank = 0xff; static int gboard_command; switch( offset & 0x7001 ) { case 0x0000: gboard_command = data; if ( last_bank != ( data & 0xc0 ) ) { int bank; /* reset the banks */ if ( gboard_command & 0x40 ) { /* high bank */ bank = gboard_banks[0] * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x4c000], 0x2000 ); } else { /* low bank */ bank = gboard_banks[0] * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[0x4c000], 0x2000 ); } /* mid bank */ bank = gboard_banks[1] * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x0a000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); last_bank = data & 0xc0; } break; case 0x0001: { UINT8 cmd = gboard_command & 0x07; int page = ( gboard_command & 0x80 ) >> 5; int bank; switch( cmd ) { case 0: /* char banking */ case 1: /* char banking */ data &= 0xfe; page ^= ( cmd << 1 ); ppu2c0x_set_videorom_bank( 0, page, 2, data, 64 ); break; case 2: /* char banking */ case 3: /* char banking */ case 4: /* char banking */ case 5: /* char banking */ page ^= cmd + 2; ppu2c0x_set_videorom_bank( 0, page, 1, data, 64 ); break; case 6: /* program banking */ if ( gboard_command & 0x40 ) { /* high bank */ gboard_banks[0] = data & 0x1f; bank = ( gboard_banks[0] ) * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x4c000], 0x2000 ); } else { /* low bank */ gboard_banks[0] = data & 0x1f; bank = ( gboard_banks[0] ) * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[0x4c000], 0x2000 ); } break; case 7: /* program banking */ { /* mid bank */ gboard_banks[1] = data & 0x1f; bank = gboard_banks[1] * 0x2000 + 0x10000; memcpy( &memory_region( REGION_CPU2 )[0x0a000], &memory_region( REGION_CPU2 )[bank], 0x2000 ); } break; } } break; case 0x2000: /* mirroring */ if( !gboard_4screen ) { if ( data & 0x40 ) ppu2c0x_set_mirroring( 0, PPU_MIRROR_HIGH ); else ppu2c0x_set_mirroring( 0, ( data & 1 ) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT ); } break; case 0x2001: /* enable ram at $6000 */ /* ignored - we always enable it */ break; case 0x4000: /* scanline counter */ gboard_scanline_counter = data; break; case 0x4001: /* scanline latch */ gboard_scanline_latch = data; break; case 0x6000: /* disable irqs */ ppu2c0x_set_scanline_callback( 0, 0 ); break; case 0x6001: /* enable irqs */ ppu2c0x_set_scanline_callback( 0, gboard_scanline_cb ); break; } } DRIVER_INIT( pcgboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x4c000], 0x4000 ); memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[0x4c000], 0x4000 ); /* MMC3 mapper at writes to $8000-$ffff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, gboard_rom_switch_w ); /* extra ram at $6000-$7fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); gboard_banks[0] = 0x1e; gboard_banks[1] = 0x1f; gboard_scanline_counter = 0; gboard_scanline_latch = 0; gboard_4screen = 0; /* common init */ driver_init_playch10(machine); } DRIVER_INIT( pcgboard_type2 ) { /* common init */ driver_init_pcgboard(machine); /* enable 4 screen mirror */ gboard_4screen = 1; } /**********************************************************************************/ /* i Board games (Captain Sky Hawk, Solar Jetman) */ static WRITE8_HANDLER( iboard_rom_switch_w ) { int bank = data & 7; if ( data & 0x10 ) ppu2c0x_set_mirroring( 0, PPU_MIRROR_HIGH ); else ppu2c0x_set_mirroring( 0, PPU_MIRROR_LOW ); memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[bank * 0x8000 + 0x10000], 0x8000 ); } DRIVER_INIT( pciboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x10000], 0x8000 ); /* Roms are banked at $8000 to $bfff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, iboard_rom_switch_w ); /* common init */ driver_init_playch10(machine); } /**********************************************************************************/ /* H Board games (PinBot) */ DRIVER_INIT( pchboard ) { memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x4c000], 0x4000 ); memcpy( &memory_region( REGION_CPU2 )[0x0c000], &memory_region( REGION_CPU2 )[0x4c000], 0x4000 ); /* Roms are banked at $8000 to $bfff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, gboard_rom_switch_w ); /* extra ram at $6000-$7fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); gboard_banks[0] = 0x1e; gboard_banks[1] = 0x1f; gboard_scanline_counter = 0; gboard_scanline_latch = 0; /* common init */ driver_init_playch10(machine); } /**********************************************************************************/ /* K Board games (Mario Open Golf) */ DRIVER_INIT( pckboard ) { /* We do manual banking, in case the code falls through */ /* Copy the initial banks */ memcpy( &memory_region( REGION_CPU2 )[0x08000], &memory_region( REGION_CPU2 )[0x48000], 0x8000 ); mmc1_rom_mask = 0x0f; /* extra ram at $6000-$7fff */ memory_install_read8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MRA8_RAM ); memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x6000, 0x7fff, 0, 0, MWA8_RAM ); /* Roms are banked at $8000 to $bfff */ memory_install_write8_handler(1, ADDRESS_SPACE_PROGRAM, 0x8000, 0xffff, 0, 0, mmc1_rom_switch_w ); /* common init */ driver_init_playch10(machine); }