2015-02-17 22:58:25 +00:00
|
|
|
|
using System.IO;
|
2015-03-27 23:24:58 +00:00
|
|
|
|
using System.Linq;
|
2015-02-17 22:58:25 +00:00
|
|
|
|
using BizHawk.Emulation.Common;
|
|
|
|
|
using Jellyfish.Virtu;
|
2015-03-21 21:45:12 +00:00
|
|
|
|
using Jellyfish.Virtu.Services;
|
2015-03-27 23:24:58 +00:00
|
|
|
|
using System;
|
2015-04-12 23:38:19 +00:00
|
|
|
|
using System.Collections.Generic;
|
2015-02-17 22:58:25 +00:00
|
|
|
|
|
|
|
|
|
namespace BizHawk.Emulation.Cores.Computers.AppleII
|
|
|
|
|
{
|
|
|
|
|
[CoreAttributes(
|
|
|
|
|
"Virtu",
|
2015-06-10 22:32:47 +00:00
|
|
|
|
"fool",
|
2015-02-17 22:58:25 +00:00
|
|
|
|
isPorted: true,
|
2015-06-10 22:32:47 +00:00
|
|
|
|
isReleased: true
|
2015-02-17 22:58:25 +00:00
|
|
|
|
)]
|
2015-05-19 23:33:50 +00:00
|
|
|
|
public partial class AppleII : IEmulator, IDriveLight
|
2015-02-17 22:58:25 +00:00
|
|
|
|
{
|
2015-06-16 23:24:52 +00:00
|
|
|
|
public AppleII(CoreComm comm, IEnumerable<GameInfo> gameInfoSet, IEnumerable<byte[]> romSet, Settings settings)
|
|
|
|
|
: this(comm, gameInfoSet.First(), romSet.First(), settings)
|
2015-04-12 23:38:19 +00:00
|
|
|
|
{
|
|
|
|
|
GameInfoSet = gameInfoSet.ToList();
|
|
|
|
|
RomSet = romSet.ToList();
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-17 22:58:25 +00:00
|
|
|
|
[CoreConstructor("AppleII")]
|
2015-06-16 23:24:52 +00:00
|
|
|
|
public AppleII(CoreComm comm, GameInfo game, byte[] rom, Settings settings)
|
2015-02-17 22:58:25 +00:00
|
|
|
|
{
|
2015-04-13 00:46:11 +00:00
|
|
|
|
GameInfoSet = new List<GameInfo>();
|
|
|
|
|
|
2015-02-17 22:58:25 +00:00
|
|
|
|
var ser = new BasicServiceProvider(this);
|
|
|
|
|
ServiceProvider = ser;
|
|
|
|
|
CoreComm = comm;
|
|
|
|
|
|
2015-07-05 15:09:07 +00:00
|
|
|
|
Tracer = new TraceBuffer();
|
|
|
|
|
MemoryCallbacks = new MemoryCallbackSystem();
|
2015-07-06 19:15:48 +00:00
|
|
|
|
InputCallbacks = new InputCallbackSystem();
|
2015-07-05 15:09:07 +00:00
|
|
|
|
|
2015-02-17 22:58:25 +00:00
|
|
|
|
_disk1 = rom;
|
2015-05-10 20:20:24 +00:00
|
|
|
|
RomSet.Add(rom);
|
2015-02-17 22:58:25 +00:00
|
|
|
|
|
2015-04-09 00:18:01 +00:00
|
|
|
|
_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");
|
2015-02-18 00:06:49 +00:00
|
|
|
|
|
2015-04-10 00:30:59 +00:00
|
|
|
|
_machine = new Machine(_appleIIRom, _diskIIRom);
|
2015-02-18 00:06:49 +00:00
|
|
|
|
|
|
|
|
|
_machine.BizInitialize();
|
|
|
|
|
|
|
|
|
|
//make a writeable memory stream cloned from the rom.
|
|
|
|
|
//for junk.dsk the .dsk is important because it determines the format from that
|
2015-05-18 00:14:00 +00:00
|
|
|
|
InitDisk();
|
2015-04-13 18:53:36 +00:00
|
|
|
|
|
2015-06-21 14:31:18 +00:00
|
|
|
|
ser.Register<ITraceable>(Tracer);
|
|
|
|
|
|
2015-07-06 20:09:18 +00:00
|
|
|
|
setCallbacks();
|
2015-07-06 19:15:48 +00:00
|
|
|
|
|
2015-05-18 01:30:30 +00:00
|
|
|
|
InitSaveStates();
|
2015-04-13 18:53:36 +00:00
|
|
|
|
SetupMemoryDomains();
|
2015-06-16 23:24:52 +00:00
|
|
|
|
PutSettings(settings ?? new Settings());
|
2015-02-18 00:06:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-06-21 14:31:18 +00:00
|
|
|
|
|
2015-04-13 00:46:11 +00:00
|
|
|
|
public List<GameInfo> GameInfoSet { get; private set; }
|
|
|
|
|
private readonly List<byte[]> RomSet = new List<byte[]>();
|
2015-04-12 23:38:19 +00:00
|
|
|
|
|
|
|
|
|
public int CurrentDisk { get; private set; }
|
2015-04-13 00:46:11 +00:00
|
|
|
|
public int DiskCount { get { return RomSet.Count; } }
|
|
|
|
|
|
2015-06-21 14:31:18 +00:00
|
|
|
|
private ITraceable Tracer { get; set; }
|
|
|
|
|
|
2015-04-13 00:46:11 +00:00
|
|
|
|
public void SetDisk(int discNum)
|
|
|
|
|
{
|
|
|
|
|
CurrentDisk = discNum;
|
|
|
|
|
InitDisk();
|
|
|
|
|
}
|
2015-04-12 23:38:19 +00:00
|
|
|
|
|
|
|
|
|
private void IncrementDisk()
|
|
|
|
|
{
|
|
|
|
|
CurrentDisk++;
|
|
|
|
|
if (CurrentDisk >= RomSet.Count)
|
|
|
|
|
{
|
|
|
|
|
CurrentDisk = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InitDisk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void DecrementDisk()
|
|
|
|
|
{
|
|
|
|
|
CurrentDisk--;
|
|
|
|
|
if (CurrentDisk < 0)
|
|
|
|
|
{
|
|
|
|
|
CurrentDisk = RomSet.Count - 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InitDisk();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void InitDisk()
|
|
|
|
|
{
|
|
|
|
|
_disk1 = RomSet[CurrentDisk];
|
|
|
|
|
|
|
|
|
|
//make a writeable memory stream cloned from the rom.
|
|
|
|
|
//for junk.dsk the .dsk is important because it determines the format from that
|
2015-05-18 00:14:00 +00:00
|
|
|
|
_machine.BootDiskII.Drives[0].InsertDisk("junk.dsk", (byte[])_disk1.Clone(), false);
|
2015-04-12 23:38:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-18 00:14:00 +00:00
|
|
|
|
private Machine _machine;
|
2015-04-12 23:38:19 +00:00
|
|
|
|
private byte[] _disk1;
|
2015-02-17 22:58:25 +00:00
|
|
|
|
private readonly byte[] _appleIIRom;
|
|
|
|
|
private readonly byte[] _diskIIRom;
|
|
|
|
|
|
2015-05-18 00:14:00 +00:00
|
|
|
|
private static readonly ControllerDefinition AppleIIController;
|
|
|
|
|
|
2015-05-31 15:02:42 +00:00
|
|
|
|
private static readonly List<string> RealButtons = new List<string>(Keyboard.GetKeyNames()
|
|
|
|
|
.Where(k => k != "White Apple") // Hack because these buttons aren't wired up yet
|
|
|
|
|
.Where(k => k != "Black Apple")
|
|
|
|
|
.Where(k => k != "Reset"));
|
2015-05-18 00:14:00 +00:00
|
|
|
|
|
|
|
|
|
private static readonly List<string> ExtraButtons = new List<string>
|
2015-03-08 03:10:20 +00:00
|
|
|
|
{
|
2015-05-18 00:14:00 +00:00
|
|
|
|
"Previous Disk",
|
|
|
|
|
"Next Disk",
|
|
|
|
|
};
|
2015-03-08 03:10:20 +00:00
|
|
|
|
|
2015-05-18 00:14:00 +00:00
|
|
|
|
static AppleII()
|
2015-03-08 03:10:20 +00:00
|
|
|
|
{
|
2015-05-18 00:14:00 +00:00
|
|
|
|
AppleIIController = new ControllerDefinition { Name = "Apple IIe Keyboard" };
|
|
|
|
|
AppleIIController.BoolButtons.AddRange(RealButtons);
|
|
|
|
|
AppleIIController.BoolButtons.AddRange(ExtraButtons);
|
2015-03-08 03:10:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-19 23:33:50 +00:00
|
|
|
|
public bool DriveLightEnabled { get { return true; } }
|
|
|
|
|
public bool DriveLightOn { get { return _machine.DriveLight; } }
|
|
|
|
|
|
2015-06-08 20:56:29 +00:00
|
|
|
|
private bool _nextPressed = false;
|
|
|
|
|
private bool _prevPressed = false;
|
|
|
|
|
|
2015-03-21 21:45:12 +00:00
|
|
|
|
private void FrameAdv(bool render, bool rendersound)
|
2015-03-08 03:10:20 +00:00
|
|
|
|
{
|
2015-06-21 14:31:18 +00:00
|
|
|
|
if (Tracer.Enabled)
|
|
|
|
|
_machine.Cpu.TraceCallback = (s) => Tracer.Put(s);
|
|
|
|
|
else
|
|
|
|
|
_machine.Cpu.TraceCallback = null;
|
|
|
|
|
|
2015-06-08 20:56:29 +00:00
|
|
|
|
if (Controller["Next Disk"] && !_nextPressed)
|
2015-04-12 23:38:19 +00:00
|
|
|
|
{
|
2015-06-08 20:56:29 +00:00
|
|
|
|
_nextPressed = true;
|
2015-04-12 23:38:19 +00:00
|
|
|
|
IncrementDisk();
|
|
|
|
|
}
|
2015-06-08 20:56:29 +00:00
|
|
|
|
else if (Controller["Previous Disk"] && !_prevPressed)
|
2015-04-12 23:38:19 +00:00
|
|
|
|
{
|
2015-06-08 20:56:29 +00:00
|
|
|
|
_prevPressed = true;
|
2015-04-12 23:38:19 +00:00
|
|
|
|
DecrementDisk();
|
|
|
|
|
}
|
2015-05-18 00:14:00 +00:00
|
|
|
|
|
2015-06-08 20:56:29 +00:00
|
|
|
|
if (!Controller["Next Disk"])
|
|
|
|
|
{
|
|
|
|
|
_nextPressed = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!Controller["Previous Disk"])
|
|
|
|
|
{
|
|
|
|
|
_prevPressed = false;
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-18 00:14:00 +00:00
|
|
|
|
_machine.BizFrameAdvance(RealButtons.Where(b => Controller[b]));
|
2015-04-26 12:40:21 +00:00
|
|
|
|
if (IsLagFrame)
|
|
|
|
|
{
|
|
|
|
|
LagCount++;
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-21 21:45:12 +00:00
|
|
|
|
Frame++;
|
2015-03-08 03:10:20 +00:00
|
|
|
|
}
|
2015-07-06 20:09:18 +00:00
|
|
|
|
|
|
|
|
|
private void setCallbacks()
|
|
|
|
|
{
|
|
|
|
|
_machine.Memory.ReadCallback = MemoryCallbacks.CallReads;
|
|
|
|
|
_machine.Memory.WriteCallback = MemoryCallbacks.CallWrites;
|
|
|
|
|
_machine.Memory.ExecuteCallback = MemoryCallbacks.CallExecutes;
|
|
|
|
|
_machine.Memory.InputCallback = InputCallbacks.Call;
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-17 22:58:25 +00:00
|
|
|
|
}
|
|
|
|
|
}
|