using System; using System.Collections.Generic; using System.IO; namespace BizHawk { public interface IEmulator : IDisposable { IVideoProvider VideoProvider { get; } ISoundProvider SoundProvider { get; } ISyncSoundProvider SyncSoundProvider { get; } /// /// false if core doesn't support async sound bool StartAsyncSound(); void EndAsyncSound(); ControllerDefinition ControllerDefinition { get; } IController Controller { get; set; } // note that most cores expect you to call SoundProvider.GetSamples() after each FrameAdvance() // please do this, even when rendersound = false void FrameAdvance(bool render, bool rendersound = true); int Frame { get; } int LagCount { get; set; } bool IsLagFrame { get; } string SystemId { get; } /// if you want to set this, look in the emulator's constructor or Load() method bool DeterministicEmulation { get; } /// /// return a copy of the saveram. editing it won't do you any good unless you later call StoreSaveRam() /// byte[] ReadSaveRam(); /// /// store new saveram to the emu core. the data should be the same size as the return from ReadSaveRam() /// void StoreSaveRam(byte[] data); /// /// reset saveram to a standard initial state /// void ClearSaveRam(); bool SaveRamModified { get; set; } void ResetFrameCounter(); void SaveStateText(TextWriter writer); void LoadStateText(TextReader reader); void SaveStateBinary(BinaryWriter writer); void LoadStateBinary(BinaryReader reader); byte[] SaveStateBinary(); // Arbitrary extensible core comm mechanism CoreInputComm CoreInputComm { get; set; } CoreOutputComm CoreOutputComm { get; } // ----- Client Debugging API stuff ----- IList MemoryDomains { get; } // this MUST BE the same as MemoryDomains[0], else DRAGONS MemoryDomain MainMemory { get; } } public class MemoryDomain { public readonly string Name; public readonly int Size; public readonly Endian Endian; public readonly Func PeekByte; public readonly Action PokeByte; public MemoryDomain(string name, int size, Endian endian, Func peekByte, Action pokeByte) { Name = name; Size = size; Endian = endian; PeekByte = peekByte; PokeByte = pokeByte; } public MemoryDomain() { } public MemoryDomain(MemoryDomain domain) { Name = domain.Name; Size = domain.Size; Endian = domain.Endian; PeekByte = domain.PeekByte; PokeByte = domain.PokeByte; } public override string ToString() { return Name; } } public enum Endian { Big, Little, Unknown } public enum DisplayType { NTSC, PAL } }