static DRIVER_INIT( esb ) { /* init the slapstic */ slapstic_init(101); slapstic_source = &memory_region(REGION_CPU1)[0x14000]; slapstic_base = &memory_region(REGION_CPU1)[0x08000]; /* install an opcode base handler */ memory_set_opbase_handler(0, esb_setopbase); /* install read/write handlers for it */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x9fff, 0, 0, esb_slapstic_r); memory_install_write8_handler(0, ADDRESS_SPACE_PROGRAM, 0x8000, 0x9fff, 0, 0, esb_slapstic_w); /* install additional banking */ memory_install_read8_handler(0, ADDRESS_SPACE_PROGRAM, 0xa000, 0xffff, 0, 0, MRA8_BANK2); /* prepare the mathbox */ starwars_is_esb = 1; swmathbox_init(); /* initialize banking */ memory_configure_bank(1, 0, 2, memory_region(REGION_CPU1) + 0x6000, 0x10000 - 0x6000); memory_set_bank(1, 0); memory_configure_bank(2, 0, 2, memory_region(REGION_CPU1) + 0xa000, 0x1c000 - 0xa000); memory_set_bank(2, 0); }
static OPBASE_HANDLER( psx_setopbase ) { if( address == 0x80030000 ) { UINT8 *p_ram; UINT8 *p_psxexe; UINT32 n_stack; UINT32 n_ram; UINT32 n_left; UINT32 n_address; logerror( "psx_exe_load: pc %08x\n", m_psxexe_header.pc0 ); logerror( "psx_exe_load: org %08x\n", m_psxexe_header.t_addr ); logerror( "psx_exe_load: len %08x\n", m_psxexe_header.t_size ); logerror( "psx_exe_load: sp %08x\n", m_psxexe_header.s_addr ); logerror( "psx_exe_load: len %08x\n", m_psxexe_header.s_size ); p_ram = (UINT8 *)g_p_n_psxram; n_ram = g_n_psxramsize; p_psxexe = m_p_psxexe; n_address = m_psxexe_header.t_addr; n_left = m_psxexe_header.t_size; while( n_left != 0 ) { p_ram[ BYTE4_XOR_LE( n_address ) % n_ram ] = *( p_psxexe ); n_address++; p_psxexe++; n_left--; } free( m_p_psxexe ); activecpu_set_reg( MIPS_PC, m_psxexe_header.pc0 ); activecpu_set_reg( MIPS_R28, m_psxexe_header.gp0 ); n_stack = m_psxexe_header.s_addr + m_psxexe_header.s_size; if( n_stack != 0 ) { activecpu_set_reg( MIPS_R29, n_stack ); activecpu_set_reg( MIPS_R30, n_stack ); } memory_set_opbase_handler( 0, NULL ); mips_stop(); return ~0; } return address; }
static QUICKLOAD_LOAD( psx_exe_load ) { if( mame_fread( fp, &m_psxexe_header, sizeof( m_psxexe_header ) ) != sizeof( m_psxexe_header ) ) { logerror( "psx_exe_load: invalid exe\n" ); return INIT_FAIL; } if( memcmp( m_psxexe_header.id, "PS-X EXE", 8 ) != 0 ) { logerror( "psx_exe_load: invalid header id\n" ); return INIT_FAIL; } psxexe_conv32( &m_psxexe_header.text ); psxexe_conv32( &m_psxexe_header.data ); psxexe_conv32( &m_psxexe_header.pc0 ); psxexe_conv32( &m_psxexe_header.gp0 ); psxexe_conv32( &m_psxexe_header.t_addr ); psxexe_conv32( &m_psxexe_header.t_size ); psxexe_conv32( &m_psxexe_header.d_addr ); psxexe_conv32( &m_psxexe_header.d_size ); psxexe_conv32( &m_psxexe_header.b_addr ); psxexe_conv32( &m_psxexe_header.b_size ); psxexe_conv32( &m_psxexe_header.s_addr ); psxexe_conv32( &m_psxexe_header.s_size ); psxexe_conv32( &m_psxexe_header.SavedSP ); psxexe_conv32( &m_psxexe_header.SavedFP ); psxexe_conv32( &m_psxexe_header.SavedGP ); psxexe_conv32( &m_psxexe_header.SavedRA ); psxexe_conv32( &m_psxexe_header.SavedS0 ); m_p_psxexe = malloc( m_psxexe_header.t_size ); if( m_p_psxexe == NULL ) { logerror( "psx_exe_load: out of memory\n" ); return INIT_FAIL; } mame_fread( fp, m_p_psxexe, m_psxexe_header.t_size ); memory_set_opbase_handler( 0, psx_setopbase ); return INIT_PASS; }
static DRIVER_INIT( esb ) { /* init the slapstic */ slapstic_init(101); slapstic_source = &memory_region(REGION_CPU1)[0x14000]; slapstic_base = &memory_region(REGION_CPU1)[0x08000]; /* install an opcode base handler */ memory_set_opbase_handler(0, esb_setopbase); /* install read/write handlers for it */ install_mem_read_handler(0, 0x8000, 0x9fff, esb_slapstic_r); install_mem_write_handler(0, 0x8000, 0x9fff, esb_slapstic_w); /* install additional banking */ install_mem_read_handler(0, 0xa000, 0xffff, MRA_BANK2); /* prepare the mathbox */ is_esb = 1; swmathbox_init(); }
static void common_init_machine(opbase_handler setopbase) { memory_set_opbase_handler(0, setopbase); zx_tape_bit = 0x80; }