void gen_softreset(int state) { if (state) { /* Halt 68k */ m68k_pulse_halt(); /* Z80 bus is released & Z80 is reseted */ zstate = 0; m68k_memory_map[0xa0].read8 = m68k_read_bus_8; m68k_memory_map[0xa0].read16 = m68k_read_bus_16; m68k_memory_map[0xa0].write8 = m68k_unused_8_w; m68k_memory_map[0xa0].write16 = m68k_unused_16_w; /* Assume default bank is $000000-$007FFF */ zbank = 0; /* Reset YM2612 */ fm_reset(0); } else { /* Reset Cartridge Hardware */ cart_hw_reset(0); /* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */ mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX)); /* Reset 68k, Z80 & YM2612 */ m68k_pulse_reset(); z80_reset(); fm_reset(0); } }
void m68k_lockup_w_16 (unsigned int address, unsigned int data) { #ifdef LOGERROR error ("Lockup %08X = %04X (%08X)\n", address, data, m68k_get_reg (NULL, M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); } }
void m68k_lockup_w_8 (unsigned int address, unsigned int data) { #ifdef LOGERROR error ("Lockup %08X = %02X (%08X)\n", address, data, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } }
unsigned int m68k_lockup_r_16 (unsigned int address) { #ifdef LOGERROR error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg (NULL, M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); } return m68k_read_pcrelative_16(REG_PC); }
unsigned int m68k_lockup_r_16 (unsigned int address) { #ifdef LOGERROR error ("Lockup %08X.w (%08X)\n", address, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } address = m68k.pc; return *(uint16 *)(m68k.memory_map[((address)>>16)&0xff].base + ((address) & 0xffff)); }
unsigned int m68k_lockup_r_8 (unsigned int address) { #ifdef LOGERROR error ("Lockup %08X.b (%08X)\n", address, m68k_get_reg(M68K_REG_PC)); #endif if (!config.force_dtack) { m68k_pulse_halt(); m68k.cycles = m68k.cycle_end; } address = m68k.pc | (address & 1); return READ_BYTE(m68k.memory_map[((address)>>16)&0xff].base, (address) & 0xffff); }
void gen_reset(int hard_reset) { /* System Reset */ if (hard_reset) { /* clear RAM */ memset (work_ram, 0x00, sizeof (work_ram)); memset (zram, 0x00, sizeof (zram)); } else { /* reset YM2612 (on hard reset, this is done by sound_reset) */ fm_reset(0); } /* 68k & Z80 could restart anywhere in VDP frame (Bonkers, Eternal Champions, X-Men 2) */ mcycles_68k = mcycles_z80 = (uint32)((MCYCLES_PER_LINE * lines_per_frame) * ((double)rand() / (double)RAND_MAX)); //mcycles_68k = mcycles_z80 = 0; if (system_hw == SYSTEM_PBC) { /* reset MS cartridge hardware */ sms_cart_reset(); /* Z80 is running */ zstate = 1; /* 68k is halted */ m68k_pulse_halt(); } else { /* reset MD cartridge hardware */ md_cart_reset(hard_reset); /* Z80 bus is released & Z80 is reseted */ m68k_memory_map[0xa0].read8 = m68k_read_bus_8; m68k_memory_map[0xa0].read16 = m68k_read_bus_16; m68k_memory_map[0xa0].write8 = m68k_unused_8_w; m68k_memory_map[0xa0].write16 = m68k_unused_16_w; zstate = 0; /* assume default bank is $000000-$007FFF */ zbank = 0; /* TMSS & OS ROM support */ if (config.tmss & 1) { /* clear TMSS register */ memset(tmss, 0x00, sizeof(tmss)); /* VDP access is locked by default */ int i; for (i=0xc0; i<0xe0; i+=8) { m68k_memory_map[i].read8 = m68k_lockup_r_8; m68k_memory_map[i].read16 = m68k_lockup_r_16; m68k_memory_map[i].write8 = m68k_lockup_w_8; m68k_memory_map[i].write16 = m68k_lockup_w_16; zbank_memory_map[i].read = zbank_lockup_r; zbank_memory_map[i].write = zbank_lockup_w; } /* OS ROM is mapped at $000000-$0007FF */ if (config.tmss & 2) { m68k_memory_map[0].base = bios_rom; } } /* reset 68k */ m68k_pulse_reset(); } /* reset Z80 */ z80_reset(); }