move along

This commit is contained in:
zeromus 2015-02-18 00:06:49 +00:00
parent 5183a8e20d
commit 5cbc68a0b2
6 changed files with 187 additions and 110 deletions

View File

@ -10,7 +10,7 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
isPorted: true,
isReleased: false
)]
public partial class AppleII : IEmulator, IVideoProvider
public partial class AppleII : IEmulator
{
[CoreConstructor("AppleII")]
public AppleII(CoreComm comm, GameInfo game, byte[] rom, object Settings)
@ -25,10 +25,86 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
_appleIIRom = File.ReadAllBytes("C:\\apple\\AppleIIe.rom");
_diskIIRom = File.ReadAllBytes("C:\\apple\\DiskII.rom");
_machine = new Machine();
_machine.Pause();
_machine = new Machine();
var vidService = new BizVideoService(_machine);
var gpService = new Jellyfish.Virtu.Services.GamePortService(_machine);
var kbService = new BizKeyboardService(_machine);
_machine.Services.AddService(typeof(Jellyfish.Virtu.Services.DebugService), new Jellyfish.Virtu.Services.DebugService(_machine));
_machine.Services.AddService(typeof(Jellyfish.Virtu.Services.AudioService), new BizAudioService(_machine));
_machine.Services.AddService(typeof(Jellyfish.Virtu.Services.VideoService), vidService);
_machine.Services.AddService(typeof(Jellyfish.Virtu.Services.GamePortService), gpService);
_machine.Services.AddService(typeof(Jellyfish.Virtu.Services.KeyboardService), kbService);
_machine.BizInitialize();
(ServiceProvider as BasicServiceProvider).Register<IVideoProvider>(vidService);
//make a writeable memory stream cloned from the rom.
//for junk.dsk the .dsk is important because it determines the format from that
var ms = new MemoryStream();
ms.Write(rom,0,rom.Length);
ms.Position = 0;
bool writeProtected = false; //!!!!!!!!!!!!!!!!!!!
Jellyfish.Virtu.Services.StorageService.LoadFile(ms, stream => _machine.BootDiskII.Drives[0].InsertDisk("junk.dsk", stream, writeProtected));
}
class BizKeyboardService : Jellyfish.Virtu.Services.KeyboardService
{
public BizKeyboardService(Machine _machine) : base(_machine) { }
public override bool IsKeyDown(int key)
{
return false; //TODO! lol
}
}
class BizAudioService : Jellyfish.Virtu.Services.AudioService
{
public BizAudioService(Machine _machine) : base(_machine) { }
public override void SetVolume(float volume)
{
}
}
public class BizVideoService : Jellyfish.Virtu.Services.VideoService, IVideoProvider
{
public int[] fb;
int[] IVideoProvider.GetVideoBuffer() { return fb; }
// put together, these describe a metric on the screen
// they should define the smallest size that the buffer can be placed inside such that:
// 1. no actual pixel data is lost
// 2. aspect ratio is accurate
int IVideoProvider.VirtualWidth { get { return 560; } }
int IVideoProvider.VirtualHeight { get { return 384; } }
int IVideoProvider.BufferWidth { get { return 560; } }
int IVideoProvider.BufferHeight { get { return 384; } }
int IVideoProvider.BackgroundColor { get { return 0; } }
public BizVideoService(Machine machine) :
base(machine)
{
fb = new int[560*384];
}
public override void SetFullScreen(bool isFullScreen)
{
}
public override void SetPixel(int x, int y, uint color)
{
fb[560 * y + x] = (int)color;
}
public override void Update()
{
}
}
private readonly Machine _machine;
private readonly byte[] _disk1;
private readonly byte[] _appleIIRom;
@ -46,38 +122,10 @@ namespace BizHawk.Emulation.Cores.Computers.AppleII
private void FrameAdv(bool render, bool rendersound)
{
_machine.Unpause();
while (!_machine.Video.IsVBlank)
{
// Do nothing
}
while (_machine.Video.IsVBlank)
{
// Do nothing
}
_machine.Pause();
_machine.BizFrameAdvance();
Frame++;
}
#region IVideoProvider
public int VirtualWidth { get { return 256; } }
public int VirtualHeight { get { return 192; } }
public int BufferWidth { get { return 256; } }
public int BufferHeight { get { return 192; } }
public int BackgroundColor { get { return 0; } }
public int[] GetVideoBuffer()
{
//_machine.Video // Uh, yeah, something
return new int[BufferWidth * BufferHeight];
}
#endregion
#region IEmulator
public IEmulatorServiceProvider ServiceProvider { get; private set; }

View File

@ -22,7 +22,8 @@ namespace Jellyfish.Virtu
public override void Initialize()
{
StorageService.LoadResource("Roms/DiskII.rom", stream => stream.ReadBlock(_romRegionC1C7));
//TODO lol!!
StorageService.LoadResource("c:\\apple\\DiskII.rom", stream => stream.ReadBlock(_romRegionC1C7));
}
public override void Reset()

View File

@ -40,7 +40,7 @@ namespace Jellyfish.Virtu
BootDiskII = Slots.OfType<DiskIIController>().Last();
Thread = new Thread(Run) { Name = "Machine" };
//Thread = new Thread(Run) { Name = "Machine" };
}
public void Dispose()
@ -59,48 +59,48 @@ namespace Jellyfish.Virtu
}
}
[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
public void Start()
{
_debugService = Services.GetService<DebugService>();
_storageService = Services.GetService<StorageService>();
//[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
//public void Start()
//{
// _debugService = Services.GetService<DebugService>();
// _storageService = Services.GetService<StorageService>();
_debugService.WriteMessage("Starting machine");
State = MachineState.Starting;
Thread.Start();
}
// _debugService.WriteMessage("Starting machine");
// State = MachineState.Starting;
// Thread.Start();
//}
[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
public void Pause()
{
_debugService.WriteMessage("Pausing machine");
State = MachineState.Pausing;
_pauseEvent.WaitOne();
State = MachineState.Paused;
_debugService.WriteMessage("Paused machine");
}
//[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
//public void Pause()
//{
// _debugService.WriteMessage("Pausing machine");
// State = MachineState.Pausing;
// _pauseEvent.WaitOne();
// State = MachineState.Paused;
// _debugService.WriteMessage("Paused machine");
//}
[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
public void Unpause()
{
_debugService.WriteMessage("Running machine");
State = MachineState.Running;
_unpauseEvent.Set();
}
//[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
//public void Unpause()
//{
// _debugService.WriteMessage("Running machine");
// State = MachineState.Running;
// _unpauseEvent.Set();
//}
[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
public void Stop()
{
_debugService.WriteMessage("Stopping machine");
State = MachineState.Stopping;
_unpauseEvent.Set();
if (Thread.IsAlive)
{
Thread.Join();
}
State = MachineState.Stopped;
_debugService.WriteMessage("Stopped machine");
}
//[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
//public void Stop()
//{
// _debugService.WriteMessage("Stopping machine");
// State = MachineState.Stopping;
// _unpauseEvent.Set();
// if (Thread.IsAlive)
// {
// Thread.Join();
// }
// State = MachineState.Stopped;
// _debugService.WriteMessage("Stopped machine");
//}
private void Initialize()
{
@ -201,40 +201,64 @@ namespace Jellyfish.Virtu
}
}
[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
private void Run() // machine thread
{
Initialize();
Reset();
LoadState();
//[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Jellyfish.Virtu.Services.DebugService.WriteMessage(System.String)")]
//private void Run() // machine thread
//{
// Initialize();
// Reset();
// LoadState();
_debugService.WriteMessage("Running machine");
State = MachineState.Running;
do
{
do
{
Events.HandleEvents(Cpu.Execute());
}
while (State == MachineState.Running);
// _debugService.WriteMessage("Running machine");
// State = MachineState.Running;
// do
// {
// do
// {
// Events.HandleEvents(Cpu.Execute());
// }
// while (State == MachineState.Running);
if (State == MachineState.Pausing)
{
_pauseEvent.Set();
_unpauseEvent.WaitOne();
}
}
while (State != MachineState.Stopping);
// if (State == MachineState.Pausing)
// {
// _pauseEvent.Set();
// _unpauseEvent.WaitOne();
// }
// }
// while (State != MachineState.Stopping);
SaveState();
Uninitialize();
}
// SaveState();
// Uninitialize();
//}
public void BizInitialize()
{
_debugService = Services.GetService<DebugService>();
_storageService = Services.GetService<StorageService>();
Initialize();
Reset();
}
public void BizFrameAdvance()
{
//frame begins at vsync.. beginning of vblank
while (Video.IsVBlank)
Events.HandleEvents(Cpu.Execute());
//now, while not vblank, we're in a frame
while (!Video.IsVBlank)
Events.HandleEvents(Cpu.Execute());
}
public void BizShutdown()
{
Uninitialize();
}
public const string Version = "0.9.4.0";
public MachineEvents Events { get; private set; }
public MachineServices Services { get; private set; }
public MachineState State { get { return _state; } private set { _state = value; } }
//public MachineState State { get { return _state; } private set { _state = value; } }
public Cpu Cpu { get; private set; }
public Memory Memory { get; private set; }
@ -265,7 +289,7 @@ namespace Jellyfish.Virtu
private DebugService _debugService;
private StorageService _storageService;
private volatile MachineState _state;
//private volatile MachineState _state;
private AutoResetEvent _pauseEvent = new AutoResetEvent(false);
private AutoResetEvent _unpauseEvent = new AutoResetEvent(false);

View File

@ -96,7 +96,8 @@ namespace Jellyfish.Virtu
_video = Machine.Video;
_noSlotClock = Machine.NoSlotClock;
StorageService.LoadResource("Roms/AppleIIe.rom", stream =>
//TODO lol!!
StorageService.LoadResource("c:\\apple\\AppleIIe.rom", stream =>
{
stream.SkipBlock(0x0100);
stream.ReadBlock(_romInternalRegionC1CF);

View File

@ -18,14 +18,16 @@
if (!_resetKeyDown)
{
_resetKeyDown = true; // entering reset; pause until key released
Machine.Pause();
Machine.Reset();
//TODO ADELIKAT : HANDLE RESET DIFFERENTLY
//Machine.Pause();
//Machine.Reset();
}
}
else if (_resetKeyDown)
{
_resetKeyDown = false; // leaving reset
Machine.Unpause();
//TODO ADELIKAT : HANDLE RESET DIFFERENTLY
//Machine.Unpause();
}
}

View File

@ -36,7 +36,7 @@ namespace Jellyfish.Virtu.Services
[SecuritySafeCritical]
#endif
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
public static bool LoadFile(string fileName, Action<Stream> reader)
public static bool LoadFile(Stream stream, Action<Stream> reader)
{
if (reader == null)
{
@ -45,8 +45,7 @@ namespace Jellyfish.Virtu.Services
try
{
DebugService.Default.WriteMessage("Loading file '{0}'", fileName);
using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
DebugService.Default.WriteMessage("Loading file '{0}'", "STREAM");
{
reader(stream);
}
@ -103,10 +102,12 @@ namespace Jellyfish.Virtu.Services
try
{
DebugService.Default.WriteMessage("Loading resource '{0}'", resourceName);
using (var stream = GetResourceStream(resourceName))
{
reader(stream);
}
using (var stream = File.OpenRead(resourceName))
reader(stream);
//using (var stream = GetResourceStream(resourceName))
//{
// reader(stream);
//}
}
catch (Exception ex)
{