Genesis - hook up lag counter (shows all frames as lag currently), and hook core up to input config dialog (1 controller only currently)

This commit is contained in:
andres.delikat 2011-12-24 01:59:51 +00:00
parent 242e6c8aed
commit b2748b7836
5 changed files with 182 additions and 90 deletions

View File

@ -7,9 +7,13 @@ using BizHawk.Emulation.Sound;
namespace BizHawk.Emulation.Consoles.Sega namespace BizHawk.Emulation.Consoles.Sega
{ {
[CoreVersion("0.0.0.1", FriendlyName = "MegaHawk")] [CoreVersion("0.0.0.1", FriendlyName = "MegaHawk")]
public sealed partial class Genesis : IEmulator public sealed partial class Genesis : IEmulator
{ {
private int _lagcount = 0;
private bool lagged = true;
private bool islag = false;
// ROM // ROM
public byte[] RomData; public byte[] RomData;
@ -78,16 +82,18 @@ namespace BizHawk.Emulation.Consoles.Sega
SoundCPU.ReadHardware = x => 0xFF; SoundCPU.ReadHardware = x => 0xFF;
SoundCPU.IRQCallback = () => SoundCPU.Interrupt = false; SoundCPU.IRQCallback = () => SoundCPU.Interrupt = false;
Z80Reset = true; Z80Reset = true;
RomData = new byte[0x400000]; RomData = new byte[0x400000];
for (int i = 0; i < rom.Length; i++) for (int i = 0; i < rom.Length; i++)
RomData[i] = rom[i]; RomData[i] = rom[i];
SetupMemoryDomains(); SetupMemoryDomains();
MainCPU.Reset(); MainCPU.Reset();
} }
public void FrameAdvance(bool render) public void FrameAdvance(bool render)
{ {
lagged = true;
Frame++; Frame++;
PSG.BeginFrame(SoundCPU.TotalExecutedCycles); PSG.BeginFrame(SoundCPU.TotalExecutedCycles);
for (VDP.ScanLine = 0; VDP.ScanLine < 262; VDP.ScanLine++) for (VDP.ScanLine = 0; VDP.ScanLine < 262; VDP.ScanLine++)
@ -96,7 +102,7 @@ namespace BizHawk.Emulation.Consoles.Sega
if (VDP.ScanLine < 224) if (VDP.ScanLine < 224)
VDP.RenderLine(); VDP.RenderLine();
MainCPU.ExecuteCycles(487); // 488?? MainCPU.ExecuteCycles(487); // 488??
if (Z80Runnable) if (Z80Runnable)
{ {
@ -107,7 +113,7 @@ namespace BizHawk.Emulation.Consoles.Sega
if (VDP.ScanLine == 224) if (VDP.ScanLine == 224)
{ {
MainCPU.ExecuteCycles(16);// stupid crap to sync with genesis plus for log testing MainCPU.ExecuteCycles(16);// stupid crap to sync with genesis plus for log testing
// End-frame stuff // End-frame stuff
if (VDP.VInterruptEnabled) if (VDP.VInterruptEnabled)
MainCPU.Interrupt = 6; MainCPU.Interrupt = 6;
@ -117,6 +123,15 @@ namespace BizHawk.Emulation.Consoles.Sega
} }
} }
PSG.EndFrame(SoundCPU.TotalExecutedCycles); PSG.EndFrame(SoundCPU.TotalExecutedCycles);
Controller.UpdateControls(Frame++);
if (lagged)
{
_lagcount++;
islag = true;
}
else
islag = false;
} }
public CoreInputComm CoreInputComm { get; set; } public CoreInputComm CoreInputComm { get; set; }
@ -133,8 +148,8 @@ namespace BizHawk.Emulation.Consoles.Sega
} }
public int Frame { get; set; } public int Frame { get; set; }
public int LagCount { get { return -1; } set { return; } } //TODO: Implement public int LagCount { get { return _lagcount; } set { _lagcount = value; } }
public bool IsLagFrame { get { return false; } } public bool IsLagFrame { get { return islag; } }
public bool DeterministicEmulation { get; set; } public bool DeterministicEmulation { get; set; }
public string SystemId { get { return "GEN"; } } public string SystemId { get { return "GEN"; } }
@ -180,30 +195,30 @@ namespace BizHawk.Emulation.Consoles.Sega
return new byte[0]; return new byte[0];
} }
IList<MemoryDomain> memoryDomains; IList<MemoryDomain> memoryDomains;
void SetupMemoryDomains() void SetupMemoryDomains()
{ {
var domains = new List<MemoryDomain>(3); var domains = new List<MemoryDomain>(3);
var MainMemoryDomain = new MemoryDomain("68000 RAM", Ram.Length, Endian.Big, var MainMemoryDomain = new MemoryDomain("68000 RAM", Ram.Length, Endian.Big,
addr => Ram[addr & 0xFFFF], addr => Ram[addr & 0xFFFF],
(addr, value) => Ram[addr & 0xFFFF] = value); (addr, value) => Ram[addr & 0xFFFF] = value);
var Z80Domain = new MemoryDomain("Z80 RAM", Z80Ram.Length, Endian.Little, var Z80Domain = new MemoryDomain("Z80 RAM", Z80Ram.Length, Endian.Little,
addr => Z80Ram[addr & 0x1FFF], addr => Z80Ram[addr & 0x1FFF],
(addr, value) => { Z80Ram[addr & 0x1FFF] = value; }); (addr, value) => { Z80Ram[addr & 0x1FFF] = value; });
var VRamDomain = new MemoryDomain("Video RAM", VDP.VRAM.Length, Endian.Big, var VRamDomain = new MemoryDomain("Video RAM", VDP.VRAM.Length, Endian.Big,
addr => VDP.VRAM[addr & 0xFFFF], addr => VDP.VRAM[addr & 0xFFFF],
(addr, value) => VDP.VRAM[addr & 0xFFFF] = value); (addr, value) => VDP.VRAM[addr & 0xFFFF] = value);
domains.Add(MainMemoryDomain); domains.Add(MainMemoryDomain);
domains.Add(Z80Domain); domains.Add(Z80Domain);
domains.Add(VRamDomain); domains.Add(VRamDomain);
memoryDomains = domains.AsReadOnly(); memoryDomains = domains.AsReadOnly();
} }
public IList<MemoryDomain> MemoryDomains { get { return memoryDomains; } } public IList<MemoryDomain> MemoryDomains { get { return memoryDomains; } }
public MemoryDomain MainMemory { get { return memoryDomains[0]; } } public MemoryDomain MainMemory { get { return memoryDomains[0]; } }
public void Dispose() { } public void Dispose() { }
} }

View File

@ -1,18 +1,18 @@
namespace BizHawk.Emulation.Consoles.Sega namespace BizHawk.Emulation.Consoles.Sega
{ {
partial class Genesis partial class Genesis
{ {
public static readonly ControllerDefinition GenesisController = new ControllerDefinition public static readonly ControllerDefinition GenesisController = new ControllerDefinition
{ {
Name = "Genesis 3-Button Controller", Name = "Genesis 3-Button Controller",
BoolButtons = BoolButtons =
{ {
"Reset", "Reset",
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 A", "P1 B", "P1 C", "P1 Start" "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 A", "P1 B", "P1 C", "P1 Start"
} }
}; };
public ControllerDefinition ControllerDefinition { get { return GenesisController; } } public ControllerDefinition ControllerDefinition { get { return GenesisController; } }
public IController Controller { get; set; } public IController Controller { get; set; }
} }
} }

View File

@ -17,6 +17,9 @@
NESController[3] = new NESControllerTemplate(false); NESController[3] = new NESControllerTemplate(false);
GameBoyController = new NESControllerTemplate(true); GameBoyController = new NESControllerTemplate(true);
TI83Controller[0] = new TI83ControllerTemplate(true); TI83Controller[0] = new TI83ControllerTemplate(true);
GenesisController[0] = new GenControllerTemplate(true);
GenesisAutoController[0] = new GenControllerTemplate(true);
NESAutoController[0] = new NESControllerTemplate(false); NESAutoController[0] = new NESControllerTemplate(false);
NESAutoController[1] = new NESControllerTemplate(false); NESAutoController[1] = new NESControllerTemplate(false);
@ -443,8 +446,8 @@
public PCEControllerTemplate[] PCEAutoController = new PCEControllerTemplate[5]; public PCEControllerTemplate[] PCEAutoController = new PCEControllerTemplate[5];
// Genesis Settings // Genesis Settings
public GenControllerTemplate GenesisController = new GenControllerTemplate(true); public GenControllerTemplate[] GenesisController = new GenControllerTemplate[1];
public GenControllerTemplate GenesisAutoController = new GenControllerTemplate(); public GenControllerTemplate[] GenesisAutoController = new GenControllerTemplate[1];
//GameBoy Settings //GameBoy Settings
public NESControllerTemplate GameBoyController = new NESControllerTemplate(true); public NESControllerTemplate GameBoyController = new NESControllerTemplate(true);
@ -621,33 +624,35 @@
} }
} }
public class GenControllerTemplate public class GenControllerTemplate
{ {
public string Up = ""; public string Up = "";
public string Down = ""; public string Down = "";
public string Left = ""; public string Left = "";
public string Right = ""; public string Right = "";
public string A = ""; public string A = "";
public string B = ""; public string B = "";
public string C = ""; public string C = "";
public string Start = ""; public string Start = "";
public bool Enabled;
public GenControllerTemplate() { } public GenControllerTemplate() { }
public GenControllerTemplate(bool defaults) public GenControllerTemplate(bool defaults)
{ {
if (defaults) if (defaults)
{ {
Up = "UpArrow, J1 Up"; Enabled = true;
Down = "DownArrow, J1 Down"; Up = "UpArrow, J1 Up";
Left = "LeftArrow, J1 Left"; Down = "DownArrow, J1 Down";
Right = "RightArrow, J1 Right"; Left = "LeftArrow, J1 Left";
A = "Z, J1 B1"; Right = "RightArrow, J1 Right";
B = "X, J1 B3"; A = "Z, J1 B1";
C = "C, J1 B4"; B = "X, J1 B3";
Start = "Return, J1 B8"; C = "C, J1 B4";
} Start = "Return, J1 B8";
} }
} }
}
public class TI83ControllerTemplate public class TI83ControllerTemplate
{ {

View File

@ -634,26 +634,26 @@ namespace BizHawk.MultiClient
Global.AutofireGBControls = agbControls; Global.AutofireGBControls = agbControls;
var genControls = new Controller(Genesis.GenesisController); var genControls = new Controller(Genesis.GenesisController);
genControls.BindMulti("P1 Up", Global.Config.GenesisController.Up); genControls.BindMulti("P1 Up", Global.Config.GenesisController[0].Up);
genControls.BindMulti("P1 Left", Global.Config.GenesisController.Left); genControls.BindMulti("P1 Left", Global.Config.GenesisController[0].Left);
genControls.BindMulti("P1 Right", Global.Config.GenesisController.Right); genControls.BindMulti("P1 Right", Global.Config.GenesisController[0].Right);
genControls.BindMulti("P1 Down", Global.Config.GenesisController.Down); genControls.BindMulti("P1 Down", Global.Config.GenesisController[0].Down);
genControls.BindMulti("P1 A", Global.Config.GenesisController.A); genControls.BindMulti("P1 A", Global.Config.GenesisController[0].A);
genControls.BindMulti("P1 B", Global.Config.GenesisController.B); genControls.BindMulti("P1 B", Global.Config.GenesisController[0].B);
genControls.BindMulti("P1 C", Global.Config.GenesisController.C); genControls.BindMulti("P1 C", Global.Config.GenesisController[0].C);
genControls.BindMulti("P1 Start", Global.Config.GenesisController.Start); genControls.BindMulti("P1 Start", Global.Config.GenesisController[0].Start);
Global.GenControls = genControls; Global.GenControls = genControls;
var agenControls = new AutofireController(Genesis.GenesisController); var agenControls = new AutofireController(Genesis.GenesisController);
agbControls.Autofire = true; agbControls.Autofire = true;
genControls.BindMulti("P1 Up", Global.Config.GenesisAutoController.Up); genControls.BindMulti("P1 Up", Global.Config.GenesisAutoController[0].Up);
genControls.BindMulti("P1 Left", Global.Config.GenesisAutoController.Left); genControls.BindMulti("P1 Left", Global.Config.GenesisAutoController[0].Left);
genControls.BindMulti("P1 Right", Global.Config.GenesisAutoController.Right); genControls.BindMulti("P1 Right", Global.Config.GenesisAutoController[0].Right);
genControls.BindMulti("P1 Down", Global.Config.GenesisAutoController.Down); genControls.BindMulti("P1 Down", Global.Config.GenesisAutoController[0].Down);
genControls.BindMulti("P1 A", Global.Config.GenesisAutoController.A); genControls.BindMulti("P1 A", Global.Config.GenesisAutoController[0].A);
genControls.BindMulti("P1 B", Global.Config.GenesisAutoController.B); genControls.BindMulti("P1 B", Global.Config.GenesisAutoController[0].B);
genControls.BindMulti("P1 C", Global.Config.GenesisAutoController.C); genControls.BindMulti("P1 C", Global.Config.GenesisAutoController[0].C);
genControls.BindMulti("P1 Start", Global.Config.GenesisAutoController.Start); genControls.BindMulti("P1 Start", Global.Config.GenesisAutoController[0].Start);
Global.AutofireGenControls = agenControls; Global.AutofireGenControls = agenControls;
var TI83Controls = new Controller(TI83.TI83Controller); var TI83Controls = new Controller(TI83.TI83Controller);

View File

@ -20,7 +20,7 @@ namespace BizHawk.MultiClient
const string ControllerStr = "Configure Controllers - "; const string ControllerStr = "Configure Controllers - ";
public static string[] SMSControlList = new string[] { "Up", "Down", "Left", "Right", "B1", "B2", "Pause", "Reset" }; public static string[] SMSControlList = new string[] { "Up", "Down", "Left", "Right", "B1", "B2", "Pause", "Reset" };
public static string[] PCEControlList = new string[] { "Up", "Down", "Left", "Right", "I", "II", "Run", "Select" }; public static string[] PCEControlList = new string[] { "Up", "Down", "Left", "Right", "I", "II", "Run", "Select" };
public static string[] GenesisControlList = new string[] { "Up", "Down", "Left", "Right", "A", "B", "C", "Start", "X,T,0", "Y=", "Z" }; public static string[] GenesisControlList = new string[] { "Up", "Down", "Left", "Right", "A", "B", "C", "Start", };
public static string[] NESControlList = new string[] { "Up", "Down", "Left", "Right", "A", "B", "Select", "Start" }; public static string[] NESControlList = new string[] { "Up", "Down", "Left", "Right", "A", "B", "Select", "Start" };
public static string[] TI83ControlList = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "ON", public static string[] TI83ControlList = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", "ON",
"ENTER", "Up", "Down", "Left", "Right", "+", "-", "Multiply", "Divide", "CLEAR", "^", "-", "(", ")", "TAN", "VARS", "ENTER", "Up", "Down", "Left", "Right", "+", "-", "Multiply", "Divide", "CLEAR", "^", "-", "(", ")", "TAN", "VARS",
@ -309,8 +309,80 @@ namespace BizHawk.MultiClient
private void DoGen() private void DoGen()
{ {
Label TempLabel;
InputWidget TempTextBox;
this.Text = ControllerStr + "Sega Genesis"; this.Text = ControllerStr + "Sega Genesis";
ControllerImage.Image = BizHawk.MultiClient.Properties.Resources.GENController; ControllerImage.Image = BizHawk.MultiClient.Properties.Resources.GENController;
int jpad = this.ControllComboBox.SelectedIndex;
string[] ButtonMappings = new string[GenesisControlList.Length];
ButtonMappings[0] = Global.Config.GenesisController[0].Up;
ButtonMappings[1] = Global.Config.GenesisController[0].Down;
ButtonMappings[2] = Global.Config.GenesisController[0].Left;
ButtonMappings[3] = Global.Config.GenesisController[0].Right;
ButtonMappings[4] = Global.Config.GenesisController[0].A;
ButtonMappings[5] = Global.Config.GenesisController[0].B;
ButtonMappings[6] = Global.Config.GenesisController[0].C;
ButtonMappings[7] = Global.Config.GenesisController[0].Start;
IDX_CONTROLLERENABLED.Checked = Global.Config.GenesisController[0].Enabled;
Changed = true;
Labels.Clear();
TextBoxes.Clear();
for (int i = 0; i < GenesisControlList.Length; i++)
{
TempLabel = new Label();
TempLabel.Text = GenesisControlList[i];
TempLabel.Location = new Point(8, 20 + (i * 24));
Labels.Add(TempLabel);
TempTextBox = new InputWidget();
TempTextBox.Location = new Point(48, 20 + (i * 24));
TextBoxes.Add(TempTextBox);
TempTextBox.SetBindings(ButtonMappings[i]);
ButtonsGroupBox.Controls.Add(TempTextBox);
ButtonsGroupBox.Controls.Add(TempLabel);
}
Changed = true;
}
private void UpdateGen(int prev)
{
ButtonsGroupBox.Controls.Clear();
InputWidget TempBox;
Label TempLabel;
TempBox = TextBoxes[0] as InputWidget;
Global.Config.GenesisController[0].Up = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Up);
TempBox.Dispose();
TempBox = TextBoxes[1] as InputWidget;
Global.Config.GenesisController[0].Down = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Down);
TempBox.Dispose();
TempBox = TextBoxes[2] as InputWidget;
Global.Config.GenesisController[0].Left = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Left);
TempBox.Dispose();
TempBox = TextBoxes[3] as InputWidget;
Global.Config.GenesisController[0].Right = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Right);
TempBox.Dispose();
TempBox = TextBoxes[4] as InputWidget;
Global.Config.GenesisController[0].A = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].I);
TempBox.Dispose();
TempBox = TextBoxes[5] as InputWidget;
Global.Config.GenesisController[0].B = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].II);
TempBox.Dispose();
TempBox = TextBoxes[6] as InputWidget;
Global.Config.GenesisController[0].C = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Run);
TempBox.Dispose();
TempBox = TextBoxes[7] as InputWidget;
Global.Config.GenesisController[0].Start = AppendButtonMapping(TempBox.Text, Global.Config.PCEController[prev].Select);
TempBox.Dispose();
Global.Config.GenesisController[0].Enabled = IDX_CONTROLLERENABLED.Checked;
for (int i = 0; i < GenesisControlList.Length; i++)
{
TempLabel = Labels[i] as Label;
TempLabel.Dispose();
}
} }
private void DoTI83() private void DoTI83()