private void ShockMemCallback(uint address, OctoshockDll.eShockMemCb type, uint size, uint value) { MemoryCallbackFlags flags = 0; switch (type) { case OctoshockDll.eShockMemCb.Read: flags |= MemoryCallbackFlags.AccessRead; break; case OctoshockDll.eShockMemCb.Write: flags |= MemoryCallbackFlags.AccessWrite; break; case OctoshockDll.eShockMemCb.Execute: flags |= MemoryCallbackFlags.AccessExecute; break; } MemoryCallbacks.CallMemoryCallbacks(address, value, (uint)flags, "System Bus"); }
public void frame_advance() { if (!emulator_running) { return; } event_frameend = false; m64pCoreDoCommandPtr(m64p_command.M64CMD_ADVANCE_FRAME, 0, IntPtr.Zero); //the way we should be able to do it: //m64pFrameComplete.WaitOne(); //however. since this is probably an STAThread, this call results in message pumps running. //those message pumps are only supposed to respond to critical COM stuff, but in fact they interfere with other things. //so here are two workaround methods. //method 1. //BizHawk.Common.Win32ThreadHacks.HackyPinvokeWaitOne(m64pFrameComplete); //method 2. //BizHawk.Common.Win32ThreadHacks.HackyComWaitOne(m64pFrameComplete); for (;;) { BizHawk.Common.Win32ThreadHacks.HackyPinvokeWaitOne(m64pEvent, 200); if (event_frameend) { break; } if (event_breakpoint) { MemoryCallbackFlags flags = 0; switch (_breakparams._type) { case BreakType.Read: flags |= MemoryCallbackFlags.AccessRead; break; case BreakType.Write: flags |= MemoryCallbackFlags.AccessWrite; break; case BreakType.Execute: flags |= MemoryCallbackFlags.AccessExecute; break; } _breakparams._mcs.CallMemoryCallbacks(_breakparams._addr, 0, (uint)flags, "System Bus"); event_breakpoint = false; Resume(); continue; } //no event.. must be a timeout //check if the core crashed and bail if it did //otherwise wait longer (could be inside slow emulation or lua logic) if (!emulator_running) { break; } } }
private LibGambatte.MemoryCallback CreateCallback(MemoryCallbackFlags flags, Func <bool> getHasCBOfType, string which = "") { var rawFlags = (uint)flags; return((address, cycleOffset) => { callbackCycleCount = _cycleCount + cycleOffset; if (getHasCBOfType()) { MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "System Bus"); var bank = LibGambatte.gambatte_getaddrbank(GambatteState, (ushort)address); if (address < 0x4000u) // usually rom bank 0 for most mbcs, some mbcs might have this at a different rom bank { address += (uint)(bank * 0x4000); MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "ROM"); } else if (address < 0x8000u) // rom bank x { address += (uint)(bank * 0x4000); address -= 0x4000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "ROM"); } else if (address < 0xA000u) // vram (may be banked on CGB in CGB enhanced mode) { if (IsCGBMode() && !IsCGBDMGMode()) { address += (uint)(bank * 0x2000); } address -= 0x8000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "VRAM"); } else if (address < 0xC000u) // sram (may be banked) { address += (uint)(bank * 0x2000); address -= 0xA000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "SRAM"); } else if (address < 0xD000u) // wram bank 0 { address -= 0xC000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "WRAM"); } else if (address < 0xE000u) // wram bank x (always one for dmg/cgb in dmg mode) { if (IsCGBMode() && !IsCGBDMGMode()) { address += (uint)(bank * 0x1000); } address -= 0xD000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "WRAM"); } else if (address < 0xFE00u) // echo ram { // do we do something here? } else if (address < 0xFEA0u) // oam { address -= 0xFE00u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "OAM"); } else if (address < 0xFF00u) // "extra" oam { // do we do something here? } else if (address < 0xFF80u) // mmio { // do we do something here? } else if (address < 0xFFFF) // hram { address -= 0xFF80u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "HRAM"); } else if (address == 0xFFFF) // ie reg { // do we do something here? } else { throw new InvalidOperationException("Core accessed invalid address???"); } } }); }
private LibGambatte.MemoryCallback CreateCallback(MemoryCallbackFlags flags, Func <bool> getHasCBOfType, string which = "") { var rawFlags = (uint)flags; return((address, cycleOffset) => { callbackCycleCount = _cycleCount + cycleOffset; if (getHasCBOfType()) { MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "System Bus"); if (address < 0x4000u) // always rom bank 0 for most mbcs (todo: edge mbcs where this doesn't apply) { MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "ROM"); } else if (address < 0x8000u) // rom bank x { var bank = LibGambatte.gambatte_getrombank(GambatteState); // this will return 1 in case there is no mbc (0 is valid for some mbcs too) address += (uint)(bank * 0x4000); address -= 0x4000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "ROM"); } else if (address < 0xA000u) // vram (may be banked on CGB in CGB enhanced mode) { if (IsCGBMode() && !IsCGBDMGMode()) { var bank = LibGambatte.gambatte_cpuread(GambatteState, 0xFF4F) & 1; address += (uint)(bank * 0x2000); } address -= 0x8000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "VRAM"); } else if (address < 0xC000u) // sram (may be banked) { var bank = LibGambatte.gambatte_getsrambank(GambatteState); // this will return 0 in case there is only one bank address += (uint)(bank * 0x2000); address -= 0xA000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "SRAM"); } else if (address < 0xD000u) // wram bank 0 { address -= 0xC000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "WRAM"); } else if (address < 0xE000u) // wram bank x (always one for dmg/cgb in dmg mode) { if (IsCGBMode() && !IsCGBDMGMode()) { var bank = Math.Max(LibGambatte.gambatte_cpuread(GambatteState, 0xFF70) & 7, 1); address += (uint)(bank * 0x1000); } address -= 0xD000u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "WRAM"); } else if (address < 0xFE00u) // echo ram { // do we do something here? } else if (address < 0xFEA0u) // oam { address -= 0xFE00u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "OAM"); } else if (address < 0xFF00u) // "extra" oam { // do we do something here? } else if (address < 0xFF80u) // mmio { // do we do something here? } else if (address < 0xFFFF) // hram { address -= 0xFF80u; MemoryCallbacks.CallMemoryCallbacks(address, 0, rawFlags, which + "HRAM"); } else if (address == 0xFFFF) // ie reg { // do we do something here? } else { throw new InvalidOperationException("Core accessed invalid address???"); } } }); }