BizHawk/BizHawk.Emulation.Cores/Computers/AppleII/AppleII.cs

163 lines
6.5 KiB
C#

using System.IO;
using System.Linq;
using BizHawk.Emulation.Common;
using Jellyfish.Virtu;
using Jellyfish.Virtu.Services;
using System;
namespace BizHawk.Emulation.Cores.Computers.AppleII
{
[CoreAttributes(
"Virtu",
"TODO",
isPorted: true,
isReleased: false
)]
public partial class AppleII : IEmulator, IStatable
{
[CoreConstructor("AppleII")]
public AppleII(CoreComm comm, GameInfo game, byte[] rom, object Settings)
{
var ser = new BasicServiceProvider(this);
ServiceProvider = ser;
CoreComm = comm;
_disk1 = rom;
_appleIIRom = comm.CoreFileProvider.GetFirmware(
SystemId, "AppleIIe", true, "The Apple IIe BIOS firmware is required");
_diskIIRom = comm.CoreFileProvider.GetFirmware(
SystemId, "DiskII", true, "The DiskII firmware is required");
_machine = new Machine(_appleIIRom, _diskIIRom);
var vidService = new BizVideoService(_machine);
_soundService = new BizAudioService(_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), _soundService);
_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));
}
private readonly Machine _machine;
private readonly byte[] _disk1;
private readonly byte[] _appleIIRom;
private readonly byte[] _diskIIRom;
private readonly BizAudioService _soundService;
private static readonly ControllerDefinition AppleIIController =
new ControllerDefinition
{
Name = "Apple II Keyboard",
BoolButtons =
{
"Up", "Down", "Left", "Right",
"Tab", "Enter", "Escape", "Back", "Space",
"Ctrl", "Shift", "Caps",
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R",
"S", "T", "U", "V", "W", "X", "Y", "Z"
}
};
private class BizKeyboardService : KeyboardService
{
public BizKeyboardService(Machine _machine) : base(_machine) { }
public override bool IsKeyDown(int key)
{
return key > 0;
}
}
private class BizAudioService : AudioService, ISyncSoundProvider
{
public BizAudioService(Machine _machine) : base(_machine) { }
public override void SetVolume(float volume)
{
}
public void DiscardSamples()
{
Reset();
}
}
private void FrameAdv(bool render, bool rendersound)
{
_machine.Buttons = GetButtons();
_machine.BizFrameAdvance();
Frame++;
}
private Buttons GetButtons()
{
Jellyfish.Virtu.Buttons ret = 0;
if (Controller["Up"]) ret |= Jellyfish.Virtu.Buttons.Up;
if (Controller["Down"]) ret |= Jellyfish.Virtu.Buttons.Down;
if (Controller["Left"]) ret |= Jellyfish.Virtu.Buttons.Left;
if (Controller["Right"]) ret |= Jellyfish.Virtu.Buttons.Right;
if (Controller["Tab"]) ret |= Jellyfish.Virtu.Buttons.Tab;
if (Controller["Enter"]) ret |= Jellyfish.Virtu.Buttons.Enter;
if (Controller["Escape"]) ret |= Jellyfish.Virtu.Buttons.Escape;
if (Controller["Back"]) ret |= Jellyfish.Virtu.Buttons.Back;
if (Controller["Space"]) ret |= Jellyfish.Virtu.Buttons.Space;
if (Controller["Ctrl"]) ret |= Jellyfish.Virtu.Buttons.Ctrl;
if (Controller["Shift"]) ret |= Jellyfish.Virtu.Buttons.Shift;
if (Controller["Caps"]) ret |= Jellyfish.Virtu.Buttons.Caps;
if (Controller["1"]) ret |= Jellyfish.Virtu.Buttons.Key1;
if (Controller["2"]) ret |= Jellyfish.Virtu.Buttons.Key2;
if (Controller["3"]) ret |= Jellyfish.Virtu.Buttons.Key3;
if (Controller["4"]) ret |= Jellyfish.Virtu.Buttons.Key4;
if (Controller["5"]) ret |= Jellyfish.Virtu.Buttons.Key5;
if (Controller["6"]) ret |= Jellyfish.Virtu.Buttons.Key6;
if (Controller["7"]) ret |= Jellyfish.Virtu.Buttons.Key7;
if (Controller["8"]) ret |= Jellyfish.Virtu.Buttons.Key8;
if (Controller["9"]) ret |= Jellyfish.Virtu.Buttons.Key9;
if (Controller["0"]) ret |= Jellyfish.Virtu.Buttons.Key0;
if (Controller["A"]) ret |= Jellyfish.Virtu.Buttons.KeyA;
if (Controller["B"]) ret |= Jellyfish.Virtu.Buttons.KeyB;
if (Controller["C"]) ret |= Jellyfish.Virtu.Buttons.KeyC;
if (Controller["D"]) ret |= Jellyfish.Virtu.Buttons.KeyD;
if (Controller["E"]) ret |= Jellyfish.Virtu.Buttons.KeyE;
if (Controller["F"]) ret |= Jellyfish.Virtu.Buttons.KeyF;
if (Controller["G"]) ret |= Jellyfish.Virtu.Buttons.KeyG;
if (Controller["H"]) ret |= Jellyfish.Virtu.Buttons.KeyH;
if (Controller["I"]) ret |= Jellyfish.Virtu.Buttons.KeyI;
if (Controller["J"]) ret |= Jellyfish.Virtu.Buttons.KeyJ;
if (Controller["K"]) ret |= Jellyfish.Virtu.Buttons.KeyK;
if (Controller["L"]) ret |= Jellyfish.Virtu.Buttons.KeyL;
if (Controller["M"]) ret |= Jellyfish.Virtu.Buttons.KeyM;
if (Controller["N"]) ret |= Jellyfish.Virtu.Buttons.KeyN;
if (Controller["O"]) ret |= Jellyfish.Virtu.Buttons.KeyO;
if (Controller["P"]) ret |= Jellyfish.Virtu.Buttons.KeyP;
if (Controller["Q"]) ret |= Jellyfish.Virtu.Buttons.KeyQ;
if (Controller["R"]) ret |= Jellyfish.Virtu.Buttons.KeyR;
if (Controller["S"]) ret |= Jellyfish.Virtu.Buttons.KeyS;
if (Controller["T"]) ret |= Jellyfish.Virtu.Buttons.KeyT;
if (Controller["U"]) ret |= Jellyfish.Virtu.Buttons.KeyU;
if (Controller["V"]) ret |= Jellyfish.Virtu.Buttons.KeyV;
if (Controller["W"]) ret |= Jellyfish.Virtu.Buttons.KeyW;
if (Controller["X"]) ret |= Jellyfish.Virtu.Buttons.KeyX;
if (Controller["Y"]) ret |= Jellyfish.Virtu.Buttons.KeyY;
if (Controller["Z"]) ret |= Jellyfish.Virtu.Buttons.KeyZ;
return ret;
}
}
}