Remove dobie core
This never really worked. Besides being unusuably slow and not very accurate, there was a miscompliation problem that caused release builds to not function.
This commit is contained in:
parent
8289c1051b
commit
89972a3579
|
@ -31,9 +31,6 @@
|
|||
[submodule "waterbox/llvm-project"]
|
||||
path = waterbox/llvm-project
|
||||
url = https://github.com/llvm/llvm-project.git
|
||||
[submodule "waterbox/dobie/dobiestation"]
|
||||
path = waterbox/dobie/dobiestation
|
||||
url = https://github.com/nattthebear/DobieStation.git
|
||||
[submodule "submodules/libdarm"]
|
||||
path = submodules/libdarm
|
||||
url = https://github.com/jbremer/darm.git
|
||||
|
|
|
@ -315,7 +315,6 @@ There are also works-in-progress for:
|
|||
* Amstrad CPC (home-grown core)
|
||||
* Fairchild Channel F (home-grown core)
|
||||
* [MAME](https://mamedev.org)
|
||||
* Playstation 2 via [Dobiestation](https://github.com/PSI-Rockin/DobieStation)
|
||||
* others maybe ([candidates](https://gitlab.com/TASVideos/BizHawk/snippets/1890492))
|
||||
|
||||
Please don't bother core devs about these WIPs unless you're looking to contribute in some way.
|
||||
|
|
|
@ -61,7 +61,6 @@ using BizHawk.Emulation.Cores.Nintendo.SubNESHawk;
|
|||
using BizHawk.Emulation.Cores.PCEngine;
|
||||
using BizHawk.Emulation.Cores.Sega.GGHawkLink;
|
||||
using BizHawk.Emulation.Cores.Sega.MasterSystem;
|
||||
using BizHawk.Emulation.Cores.Sony.PS2;
|
||||
using BizHawk.Emulation.Cores.Sony.PSX;
|
||||
using BizHawk.Emulation.Cores.Waterbox;
|
||||
using BizHawk.Emulation.Cores.WonderSwan;
|
||||
|
@ -2805,9 +2804,6 @@ namespace BizHawk.Client.EmuHawk
|
|||
// Cygne
|
||||
items.Add(CreateCoreSubmenu(VSystemCategory.Handhelds, CoreNames.Cygne, CreateGenericCoreConfigItem<WonderSwan>(CoreNames.Cygne)));
|
||||
|
||||
// DobieStation
|
||||
items.Add(CreateCoreSubmenu(VSystemCategory.Consoles, CoreNames.DobieStation, CreateGenericCoreConfigItem<DobieStation>(CoreNames.DobieStation)));
|
||||
|
||||
// Emu83
|
||||
items.Add(CreateCoreSubmenu(VSystemCategory.Other, CoreNames.Emu83, CreateSettingsItem("Palette...", (_, _) => OpenTI83PaletteSettingsDialog(GetSettingsAdapterFor<Emu83>()))));
|
||||
|
||||
|
|
|
@ -1,201 +0,0 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using BizHawk.Common;
|
||||
using BizHawk.Emulation.Common;
|
||||
using BizHawk.Emulation.Cores.Waterbox;
|
||||
using BizHawk.Emulation.DiscSystem;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Sony.PS2
|
||||
{
|
||||
[PortedCore(CoreNames.DobieStation, "PSI", "fa33778b056aa32", "https://github.com/PSI-Rockin/DobieStation", isReleased: false)]
|
||||
public unsafe class DobieStation : WaterboxCore, ISettable<object, DobieStation.DobieSyncSettings>
|
||||
{
|
||||
private readonly LibDobieStation _core;
|
||||
[CoreConstructor(VSystemID.Raw.PS2)]
|
||||
public DobieStation(CoreLoadParameters<object, DobieSyncSettings> lp)
|
||||
:base(lp.Comm, new Configuration
|
||||
{
|
||||
MaxWidth = 640,
|
||||
MaxHeight = 480,
|
||||
DefaultWidth = 640,
|
||||
DefaultHeight = 480,
|
||||
DefaultFpsNumerator = 294912000,
|
||||
DefaultFpsDenominator = 4920115,
|
||||
MaxSamples = 1024,
|
||||
SystemId = VSystemID.Raw.PS2,
|
||||
})
|
||||
{
|
||||
if (lp.Discs.Count != 1)
|
||||
{
|
||||
throw new InvalidOperationException("Must load a CD or DVD with PS2 core!");
|
||||
}
|
||||
ControllerDefinition = DualShock;
|
||||
_syncSettings = lp.SyncSettings ?? new DobieSyncSettings();
|
||||
_syncSettingsActual = lp.SyncSettings ?? new DobieSyncSettings();
|
||||
|
||||
_disc = new DiscSectorReader(lp.Discs[0].DiscData);
|
||||
_cdCallback = ReadCd;
|
||||
_core = PreInit<LibDobieStation>(new WaterboxOptions
|
||||
{
|
||||
Filename = "dobie.wbx",
|
||||
SbrkHeapSizeKB = 64 * 1024,
|
||||
SealedHeapSizeKB = 4 * 1024,
|
||||
InvisibleHeapSizeKB = 4 * 1024,
|
||||
PlainHeapSizeKB = 256,
|
||||
MmapHeapSizeKB = 2 * 1024 * 1024,
|
||||
SkipCoreConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck),
|
||||
SkipMemoryConsistencyCheck = lp.Comm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxMemoryConsistencyCheck),
|
||||
}, new[] { _cdCallback });
|
||||
|
||||
var bios = lp.Comm.CoreFileProvider.GetFirmwareOrThrow(new("PS2", "BIOS"));
|
||||
_exe.AddReadonlyFile(new byte[0x840000], "MEMCARD0");
|
||||
|
||||
var worked = _core.Initialize(bios,
|
||||
(ulong)(lp.Discs[0].DiscData.Session1.Tracks[2].LBA - lp.Discs[0].DiscData.Session1.Tracks[1].LBA) * 2048,
|
||||
_cdCallback,
|
||||
_syncSettingsActual.GetNativeSettings()
|
||||
);
|
||||
|
||||
if (!worked)
|
||||
{
|
||||
throw new InvalidOperationException("Initialize failed!");
|
||||
}
|
||||
|
||||
_exe.RemoveReadonlyFile("MEMCARD0");
|
||||
|
||||
PostInit();
|
||||
|
||||
_resampler = new SpeexResampler((SpeexResampler.Quality)6, 480, 441, 48000, 44100, null, this);
|
||||
_serviceProvider.Register<ISoundProvider>(_resampler);
|
||||
}
|
||||
|
||||
private SpeexResampler _resampler;
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
if (_resampler != null)
|
||||
{
|
||||
_resampler.Dispose();
|
||||
_resampler = null;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly LibDobieStation.CdCallback _cdCallback;
|
||||
private readonly DiscSectorReader _disc;
|
||||
private void ReadCd(ulong sector, byte* dest)
|
||||
{
|
||||
var tmp = new byte[2048];
|
||||
_disc.ReadLBA_2048((int)sector, tmp, 0);
|
||||
Marshal.Copy(tmp, 0, (IntPtr)dest, 2048);
|
||||
}
|
||||
|
||||
protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound)
|
||||
{
|
||||
var ret = new LibDobieStation.FrameInfo();
|
||||
for (int i = 0; i < DualShock.BoolButtons.Count; i++)
|
||||
{
|
||||
if (controller.IsPressed(DualShock.BoolButtons[i]))
|
||||
{
|
||||
ret.Buttons |= 1u << i;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < DualShock.Axes.Count; i++)
|
||||
{
|
||||
ret.Axes |= (uint)controller.AxisValue(DualShock.Axes[i]) << (i * 8);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
protected override void FrameAdvancePost()
|
||||
{
|
||||
// DobieStation core kicks back 0 values sometimes. Not sure what they mean, no image produced?
|
||||
// Easiest to just fix them here.
|
||||
if (BufferWidth == 0)
|
||||
BufferWidth = 640;
|
||||
if (BufferHeight == 0)
|
||||
BufferHeight = 480;
|
||||
}
|
||||
|
||||
public object GetSettings() => new object();
|
||||
public PutSettingsDirtyBits PutSettings(object o) => PutSettingsDirtyBits.None;
|
||||
|
||||
private DobieSyncSettings _syncSettings;
|
||||
private readonly DobieSyncSettings _syncSettingsActual;
|
||||
|
||||
public DobieSyncSettings GetSyncSettings()
|
||||
{
|
||||
return _syncSettings.Clone();
|
||||
}
|
||||
|
||||
public PutSettingsDirtyBits PutSyncSettings(DobieSyncSettings o)
|
||||
{
|
||||
_syncSettings = o;
|
||||
return DobieSyncSettings.NeedsReboot(_syncSettings, _syncSettingsActual)
|
||||
? PutSettingsDirtyBits.RebootCore
|
||||
: PutSettingsDirtyBits.None;
|
||||
}
|
||||
|
||||
private static readonly ControllerDefinition DualShock = new ControllerDefinition("PS2 DualShock")
|
||||
{
|
||||
BoolButtons =
|
||||
{
|
||||
"SELECT",
|
||||
"L3",
|
||||
"R3",
|
||||
"START",
|
||||
"UP",
|
||||
"RIGHT",
|
||||
"DOWN",
|
||||
"LEFT",
|
||||
"L2",
|
||||
"R2",
|
||||
"L1",
|
||||
"R1",
|
||||
"TRIANGLE",
|
||||
"CIRCLE",
|
||||
"CROSS",
|
||||
"SQUARE",
|
||||
},
|
||||
Axes =
|
||||
{
|
||||
{ "RIGHT X", new AxisSpec(0.RangeTo(255), 128) },
|
||||
{ "RIGHT Y", new AxisSpec(0.RangeTo(255), 128) },
|
||||
{ "LEFT X", new AxisSpec(0.RangeTo(255), 128) },
|
||||
{ "LEFT Y", new AxisSpec(0.RangeTo(255), 128) },
|
||||
}
|
||||
}.MakeImmutable();
|
||||
|
||||
public class DobieSyncSettings
|
||||
{
|
||||
public enum CpuMode
|
||||
{
|
||||
Jit,
|
||||
Interpreter
|
||||
}
|
||||
|
||||
public CpuMode EEMode { get; set;}
|
||||
public CpuMode VU0Mode { get; set; }
|
||||
public CpuMode VU1Mode { get; set; }
|
||||
|
||||
public static bool NeedsReboot(DobieSyncSettings x, DobieSyncSettings y)
|
||||
{
|
||||
return !DeepEquality.DeepEquals(x, y);
|
||||
}
|
||||
|
||||
public DobieSyncSettings Clone()
|
||||
{
|
||||
return (DobieSyncSettings)MemberwiseClone();
|
||||
}
|
||||
|
||||
public LibDobieStation.SyncSettings GetNativeSettings()
|
||||
{
|
||||
return new LibDobieStation.SyncSettings
|
||||
{
|
||||
EEJit = EEMode == CpuMode.Jit,
|
||||
VU0Jit = VU0Mode == CpuMode.Jit,
|
||||
VU1Jit = VU1Mode == CpuMode.Jit
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
using System.Runtime.InteropServices;
|
||||
using BizHawk.BizInvoke;
|
||||
using BizHawk.Emulation.Cores.Waterbox;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Sony.PS2
|
||||
{
|
||||
public abstract class LibDobieStation : LibWaterboxCore
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public new class FrameInfo : LibWaterboxCore.FrameInfo
|
||||
{
|
||||
public uint Buttons;
|
||||
public uint Axes;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public class SyncSettings
|
||||
{
|
||||
public bool EEJit;
|
||||
public bool VU0Jit;
|
||||
public bool VU1Jit;
|
||||
}
|
||||
|
||||
public unsafe delegate void CdCallback(ulong sector, byte* dest);
|
||||
|
||||
[BizImport(CC)]
|
||||
public abstract bool Initialize(byte[] bios, ulong cdLength, CdCallback cdCallback, SyncSettings syncSettings);
|
||||
}
|
||||
}
|
|
@ -19,10 +19,9 @@ namespace BizHawk.Emulation.Cores
|
|||
public const string ColecoHawk = "ColecoHawk";
|
||||
public const string CPCHawk = "CPCHawk";
|
||||
public const string Cygne = "Cygne/Mednafen";
|
||||
public const string DobieStation = "DobieStation";
|
||||
public const string Emu83 = "Emu83";
|
||||
public const string Faust = "Faust";
|
||||
public const string Gambatte = "Gambatte";
|
||||
public const string Gambatte = "Gambatte";
|
||||
public const string GambatteLink = "GambatteLink";
|
||||
public const string GbHawk = "GBHawk";
|
||||
public const string GBHawkLink = "GBHawkLink";
|
||||
|
@ -53,7 +52,7 @@ namespace BizHawk.Emulation.Cores
|
|||
public const string Snes9X = "Snes9x";
|
||||
public const string SubGbHawk = "SubGBHawk";
|
||||
public const string SubNesHawk = "SubNESHawk";
|
||||
public const string TI83Hawk = "TI83Hawk";
|
||||
public const string TI83Hawk = "TI83Hawk";
|
||||
public const string TIC80 = "TIC-80";
|
||||
public const string TST = "T. S. T.";
|
||||
public const string TurboNyma = "TurboNyma";
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
CXXFLAGS := \
|
||||
-Wall -Werror=int-to-pointer-cast \
|
||||
-std=c++14 -fomit-frame-pointer -fno-rtti \
|
||||
-Wno-reorder -Wno-unused-value \
|
||||
-Idobiestation/ext/libdeflate \
|
||||
-Dprivate=public
|
||||
|
||||
CCFLAGS := \
|
||||
-Wall -Wundef -Wpedantic -Wdeclaration-after-statement -Wmissing-prototypes -Wstrict-prototypes -Wvla \
|
||||
-D_ANSI_SOURCE \
|
||||
-Idobiestation/ext/libdeflate \
|
||||
-Idobiestation/ext/libdeflate/common
|
||||
|
||||
TARGET = dobie.wbx
|
||||
|
||||
CORE_SRCS = \
|
||||
audio/utils.cpp \
|
||||
ee/bios_hle.cpp \
|
||||
ee/cop0.cpp \
|
||||
ee/cop1.cpp \
|
||||
ee/cop2.cpp \
|
||||
ee/dmac.cpp \
|
||||
ee/ee_jit.cpp \
|
||||
ee/ee_jit64.cpp \
|
||||
ee/ee_jit64_cop2.cpp \
|
||||
ee/ee_jit64_fpu.cpp \
|
||||
ee/ee_jit64_fpu_avx.cpp \
|
||||
ee/ee_jit64_gpr.cpp \
|
||||
ee/ee_jit64_mmi.cpp \
|
||||
ee/ee_jittrans.cpp \
|
||||
ee/emotion.cpp \
|
||||
ee/emotion_fpu.cpp \
|
||||
ee/emotion_mmi.cpp \
|
||||
ee/emotion_special.cpp \
|
||||
ee/emotion_vu0.cpp \
|
||||
ee/emotionasm.cpp \
|
||||
ee/emotiondisasm.cpp \
|
||||
ee/emotioninterpreter.cpp \
|
||||
ee/intc.cpp \
|
||||
ee/ipu/chromtable.cpp \
|
||||
ee/ipu/codedblockpattern.cpp \
|
||||
ee/ipu/dct_coeff.cpp \
|
||||
ee/ipu/dct_coeff_table0.cpp \
|
||||
ee/ipu/dct_coeff_table1.cpp \
|
||||
ee/ipu/ipu.cpp \
|
||||
ee/ipu/ipu_fifo.cpp \
|
||||
ee/ipu/lumtable.cpp \
|
||||
ee/ipu/mac_addr_inc.cpp \
|
||||
ee/ipu/mac_b_pic.cpp \
|
||||
ee/ipu/mac_i_pic.cpp \
|
||||
ee/ipu/mac_p_pic.cpp \
|
||||
ee/ipu/motioncode.cpp \
|
||||
ee/ipu/vlc_table.cpp \
|
||||
ee/timers.cpp \
|
||||
ee/vif.cpp \
|
||||
ee/vu.cpp \
|
||||
ee/vu_disasm.cpp \
|
||||
ee/vu_interpreter.cpp \
|
||||
ee/vu_jit.cpp \
|
||||
ee/vu_jit64.cpp \
|
||||
ee/vu_jittrans.cpp \
|
||||
emulator.cpp \
|
||||
errors.cpp \
|
||||
gif.cpp \
|
||||
gs.cpp \
|
||||
gscontext.cpp \
|
||||
gsmem.cpp \
|
||||
gsregisters.cpp \
|
||||
gsthread.cpp \
|
||||
iop/cdvd/bincuereader.cpp \
|
||||
iop/cdvd/cdvd.cpp \
|
||||
iop/cdvd/cso_reader.cpp \
|
||||
iop/cdvd/iso_reader.cpp \
|
||||
iop/firewire.cpp \
|
||||
iop/gamepad.cpp \
|
||||
iop/iop.cpp \
|
||||
iop/iop_cop0.cpp \
|
||||
iop/iop_dma.cpp \
|
||||
iop/iop_intc.cpp \
|
||||
iop/iop_interpreter.cpp \
|
||||
iop/iop_timers.cpp \
|
||||
iop/memcard.cpp \
|
||||
iop/sio2.cpp \
|
||||
iop/spu/spu.cpp \
|
||||
iop/spu/spu_adpcm.cpp \
|
||||
iop/spu/spu_envelope.cpp \
|
||||
iop/spu/spu_tables.cpp \
|
||||
jitcommon/emitter64.cpp \
|
||||
jitcommon/ir_block.cpp \
|
||||
jitcommon/ir_instr.cpp \
|
||||
jitcommon/jitcache.cpp \
|
||||
scheduler.cpp \
|
||||
serialize.cpp \
|
||||
sif.cpp \
|
||||
tests/iop/alu.cpp
|
||||
|
||||
DEFLATE_SRCS = \
|
||||
lib/aligned_malloc.c \
|
||||
lib/deflate_decompress.c \
|
||||
lib/x86/cpu_features.c
|
||||
|
||||
SRCS = \
|
||||
$(addprefix dobiestation/src/core/,$(CORE_SRCS)) \
|
||||
$(addprefix dobiestation/ext/libdeflate/,$(DEFLATE_SRCS)) \
|
||||
cinterface.cpp
|
||||
|
||||
include ../common.mak
|
|
@ -1,184 +0,0 @@
|
|||
#include "../emulibc/emulibc.h"
|
||||
#include "../emulibc/waterboxcore.h"
|
||||
#include <stdint.h>
|
||||
#include "dobiestation/src/core/emulator.hpp"
|
||||
#include "dobiestation/src/core/iop/cdvd/cdvd_container.hpp"
|
||||
|
||||
|
||||
static size_t cd_length;
|
||||
static void (*cdcallback)(size_t sector, uint8_t* dest);
|
||||
static size_t cd_pos;
|
||||
|
||||
class DVD: public CDVD_Container
|
||||
{
|
||||
virtual bool open(std::string name) override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
virtual void close() override {}
|
||||
virtual size_t read(uint8_t* buff, size_t bytes)
|
||||
{
|
||||
uint8_t* buff_end = buff + bytes;
|
||||
if (cd_pos % 2048 != 0)
|
||||
{
|
||||
auto offset = cd_pos % 2048;
|
||||
auto nread = std::min(2048 - offset, bytes);
|
||||
uint8_t tmp[2048];
|
||||
cdcallback(cd_pos / 2048, tmp);
|
||||
memcpy(buff, tmp + offset, nread);
|
||||
buff += nread;
|
||||
cd_pos += nread;
|
||||
}
|
||||
while (buff_end >= buff + 2048)
|
||||
{
|
||||
cdcallback(cd_pos / 2048, buff);
|
||||
buff += 2048;
|
||||
cd_pos += 2048;
|
||||
}
|
||||
if (buff_end > buff)
|
||||
{
|
||||
auto nread = buff_end - buff;
|
||||
uint8_t tmp[2048];
|
||||
cdcallback(cd_pos / 2048, tmp);
|
||||
memcpy(buff, tmp, nread);
|
||||
cd_pos += nread;
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
virtual void seek(size_t pos, std::ios::seekdir whence) override
|
||||
{
|
||||
cd_pos = pos * 2048;
|
||||
}
|
||||
virtual bool is_open() override
|
||||
{
|
||||
return true;
|
||||
}
|
||||
virtual size_t get_size() override
|
||||
{
|
||||
return cd_length;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct MyFrameInfo: public FrameInfo
|
||||
{
|
||||
uint32_t Buttons;
|
||||
uint32_t Axes;
|
||||
};
|
||||
|
||||
Emulator* emu;
|
||||
|
||||
struct SyncSettings
|
||||
{
|
||||
bool EEJit;
|
||||
bool VU0Jit;
|
||||
bool VU1Jit;
|
||||
};
|
||||
|
||||
ECL_EXPORT bool Initialize(
|
||||
const uint8_t* bios,
|
||||
size_t cd_length_,
|
||||
void (*cdcallback_)(size_t sector, uint8_t* dest),
|
||||
const SyncSettings& syncSettings
|
||||
)
|
||||
{
|
||||
cd_length = cd_length_;
|
||||
cdcallback = cdcallback_;
|
||||
emu = new Emulator();
|
||||
emu->reset();
|
||||
emu->set_skip_BIOS_hack(LOAD_DISC);
|
||||
emu->load_BIOS(bios);
|
||||
emu->load_memcard(0, "MEMCARD0");
|
||||
if (!emu->load_CDVD_Container("", std::unique_ptr<CDVD_Container>(new DVD())))
|
||||
return false;
|
||||
emu->set_ee_mode(syncSettings.EEJit ? JIT : INTERPRETER);
|
||||
printf("EE Mode: %s\n", syncSettings.EEJit ? "JIT" : "INTERPRETER");
|
||||
emu->set_vu0_mode(syncSettings.VU0Jit ? JIT : INTERPRETER);
|
||||
printf("VU0 Mode: %s\n", syncSettings.VU0Jit ? "JIT" : "INTERPRETER");
|
||||
emu->set_vu1_mode(syncSettings.VU1Jit ? JIT : INTERPRETER);
|
||||
printf("VU1 Mode: %s\n", syncSettings.VU1Jit ? "JIT" : "INTERPRETER");
|
||||
emu->set_wav_output(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
static int16_t* audio_pos;
|
||||
void hacky_enqueue_audio(stereo_sample s)
|
||||
{
|
||||
*audio_pos++ = s.left;
|
||||
*audio_pos++ = s.right;
|
||||
}
|
||||
|
||||
bool hacky_lag_flag;
|
||||
void (*hacky_input_callback)();
|
||||
|
||||
ECL_EXPORT void FrameAdvance(MyFrameInfo& f)
|
||||
{
|
||||
for (auto i = 0; i < 16; i++)
|
||||
{
|
||||
if (f.Buttons & 1 << i)
|
||||
{
|
||||
emu->press_button((PAD_BUTTON)i);
|
||||
}
|
||||
else
|
||||
{
|
||||
emu->release_button((PAD_BUTTON)i);
|
||||
}
|
||||
}
|
||||
for (auto i = 0; i < 4; i++)
|
||||
{
|
||||
emu->update_joystick((JOYSTICK)(i >> 1), (JOYSTICK_AXIS)(i & 1), f.Axes >> (i * 8));
|
||||
}
|
||||
audio_pos = f.SoundBuffer;
|
||||
hacky_lag_flag = true;
|
||||
emu->run();
|
||||
f.Lagged = hacky_lag_flag;
|
||||
emu->get_inner_resolution(f.Width, f.Height);
|
||||
{
|
||||
const uint32_t* src = emu->get_framebuffer();
|
||||
const uint32_t* srcend = src + f.Width * f.Height;
|
||||
uint32_t* dst = f.VideoBuffer;
|
||||
while (src < srcend)
|
||||
{
|
||||
*dst = *src;
|
||||
std::swap(((uint8_t*)dst)[2], ((uint8_t*)dst)[0]);
|
||||
src++;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
f.Samples = (audio_pos - f.SoundBuffer) / 2;
|
||||
audio_pos = nullptr;
|
||||
}
|
||||
|
||||
ECL_EXPORT void GetMemoryAreas(MemoryArea *m)
|
||||
{
|
||||
m[0].Data = emu->RDRAM;
|
||||
m[0].Name = "RDRAM";
|
||||
m[0].Size = 1024 * 1024 * 32;
|
||||
m[0].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4 | MEMORYAREA_FLAGS_PRIMARY;
|
||||
|
||||
m[1].Data = emu->IOP_RAM;
|
||||
m[1].Name = "IOP_RAM";
|
||||
m[1].Size = 1024 * 1024 * 2;
|
||||
m[1].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4;
|
||||
|
||||
m[2].Data = emu->BIOS;
|
||||
m[2].Name = "BIOS";
|
||||
m[2].Size = 1024 * 1024 * 4;
|
||||
m[2].Flags = MEMORYAREA_FLAGS_WORDSIZE4;
|
||||
|
||||
m[3].Data = emu->SPU_RAM;
|
||||
m[3].Name = "SPU_RAM";
|
||||
m[3].Size = 1024 * 1024 * 2;
|
||||
m[3].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4;
|
||||
|
||||
m[4].Data = emu->memcard.mem;
|
||||
m[4].Name = "MEMCARD0";
|
||||
m[4].Size = 0x840000;
|
||||
m[4].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_SAVERAMMABLE;
|
||||
}
|
||||
|
||||
ECL_EXPORT void SetInputCallback(void (*callback)())
|
||||
{
|
||||
hacky_input_callback = callback;
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
Subproject commit b736d7d5668aa2e52705faabb1e32fbfaff4c3ce
|
Loading…
Reference in New Issue