Merge branch 'master' into c64-refactor

This commit is contained in:
SaxxonPike 2019-07-05 20:14:28 -05:00
commit 8698aa41be
12 changed files with 222 additions and 66 deletions

View File

@ -133,7 +133,11 @@ namespace BizHawk.Client.EmuHawk
{
if (ToWindowRadio.Checked)
{
TraceView.VirtualListSize = _instructions.Count;
// setting to zero first fixes an exception when scrolling the view
// how or why I don't know
// it's hidden behind an internal class ListViewNativeItemCollection
TraceView.VirtualListSize = 0;
TraceView.VirtualListSize = _instructions.Count;
}
else
{
@ -148,7 +152,7 @@ namespace BizHawk.Client.EmuHawk
//connect tracer to sink for next frame
if (ToWindowRadio.Checked)
{
//update listview with most recentr results
//update listview with most recent results
TraceView.BlazingFast = !GlobalWin.MainForm.EmulatorPaused;
Tracer.Sink = new CallbackSink()

View File

@ -68,7 +68,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
"RTS", // 39
"ABX", // 3a
"RTI", // 3b
"CWAI", // 3c
"CWAI i8", // 3c
"MUL", // 3d
"???", // 3e
"SWI1", // 3f

View File

@ -8,7 +8,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
Regs[ADDR] = 0xFFF8;
PopulateCURINSTR(IDLE,
IDLE,
SET_E,
DEC16, SP,
WR_DEC_LO, SP, PC,
WR_DEC_HI, SP, PC,
@ -22,7 +22,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
WR_DEC_LO, SP, B,
WR_DEC_LO, SP, A,
WR, SP, CC,
SET_F_I,
SET_I,
RD_INC, ALU, ADDR,
RD_INC, ALU2, ADDR,
SET_ADDR, PC, ALU, ALU2);
@ -34,7 +34,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
Regs[ADDR] = 0xFFF6;
PopulateCURINSTR(IDLE,
IDLE,
CLR_E,
DEC16, SP,
WR_DEC_LO, SP, PC,
WR_DEC_HI, SP, PC,
@ -51,7 +51,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
Regs[ADDR] = 0xFFFC;
PopulateCURINSTR(IDLE,
IDLE,
SET_E,
DEC16, SP,
WR_DEC_LO, SP, PC,
WR_DEC_HI, SP, PC,

View File

@ -66,17 +66,19 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public const ushort WR_DEC_HI_OP = 55;
public const ushort SET_ADDR_PUL = 56;
public const ushort SET_F_I = 57;
public const ushort SET_E = 58;
public const ushort ANDCC = 59;
public const ushort CMP8 = 60;
public const ushort SUB16 = 61;
public const ushort ADD16 = 62;
public const ushort CMP16 = 63;
public const ushort CMP16D = 64;
public const ushort WR_HI_INC = 65;
public const ushort LD_8 = 66;
public const ushort LD_16 = 67;
public const ushort LEA = 68;
public const ushort SET_I = 58;
public const ushort SET_E = 59;
public const ushort ANDCC = 60;
public const ushort CMP8 = 61;
public const ushort SUB16 = 62;
public const ushort ADD16 = 63;
public const ushort CMP16 = 64;
public const ushort CMP16D = 65;
public const ushort WR_HI_INC = 66;
public const ushort LD_8 = 67;
public const ushort LD_16 = 68;
public const ushort LEA = 69;
public const ushort CLR_E = 70;
public MC6809()
{
@ -231,7 +233,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
Regs[reg_d_ad] = (ushort)((Regs[reg_h_ad] << 8) | Regs[reg_l_ad]);
break;
case JPE:
if (!FlagE) { instr_pntr = 45; };
if (!FlagE) { instr_pntr = 44; irq_pntr = 10; };
break;
case IDX_DCDE:
Index_decode();
@ -353,9 +355,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case SET_F_I:
FlagI = true; FlagF = true;
break;
case SET_I:
FlagI = true;
break;
case SET_E:
FlagE = true;
break;
case CLR_E:
FlagE = false;
break;
case ANDCC:
Regs[CC] &= Regs[instr_pntr++];
break;
@ -449,6 +457,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case CWAI:
if (NMIPending)
{
NMIPending = false;
Regs[ADDR] = 0xFFFC;
PopulateCURINSTR(RD_INC, ALU, ADDR,
RD_INC, ALU2, ADDR,
@ -460,6 +470,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
}
else if (FIRQPending && !FlagF)
{
FIRQPending = false;
Regs[ADDR] = 0xFFF6;
PopulateCURINSTR(RD_INC, ALU, ADDR,
RD_INC, ALU2, ADDR,
@ -471,6 +483,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
}
else if (IRQPending && !FlagI)
{
IRQPending = false;
Regs[ADDR] = 0xFFF8;
PopulateCURINSTR(RD_INC, ALU, ADDR,
RD_INC, ALU2, ADDR,
@ -542,7 +556,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(IDLE);
}
}
// then regular IRQ
// then regular IRQ
else if (IRQPending && !FlagI)
{
if (!FlagI)
@ -567,7 +581,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
instr_pntr = irq_pntr = 0;
PopulateCURINSTR(IDLE);
}
}
}
// otherwise start the next instruction
else
{

View File

@ -472,8 +472,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC, ALU, SP,
RD_INC_OP, ALU2, SP, SET_ADDR, US, ALU, ALU2,
RD_INC, ALU, SP,
RD_INC_OP, ALU2, SP,
SET_ADDR, PC, ALU, ALU2);
RD_INC_OP, ALU2, SP, SET_ADDR, PC, ALU, ALU2);
IRQS = 14;
}

View File

@ -82,6 +82,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
Regs[i] = 0;
}
FlagI = true;
}
}
}

View File

@ -59,7 +59,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ret = (byte)((portB_ret & 0x7F) | (PB7 ? 0x80 : 0x0));
}
if (!dir_ctrl.Bit(5)) { ret |= (byte)(compare ? 0x0 : 0x20); }
if (!dir_ctrl.Bit(5)) { ret |= (byte)(!compare ? 0x0 : 0x20); }
int_fl &= 0xE7;
update_int_fl();
@ -181,8 +181,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
if (sel0)
{
if (sel1) {/* sound samples direct to output */ audio.pcm_sample = (short)(portA_ret << 6); }
else { ppu.vec_scale = portA_ret; if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); } }
if (sel1)
{
/* sound samples direct to output */
audio.pcm_sample = (short)(portA_ret << 6);
}
else
{
ppu.vec_scale = portA_ret;
if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); }
}
}
else
{
@ -195,7 +203,37 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ppu.bright = (byte)(portA_ret & 0x3F);
ppu.bright_int_3 = (uint)(0xFF000000 | (ppu.bright << 16) | (ppu.bright << 8) | ppu.bright);
}
else { ppu.y_vel = (byte)(portA_ret ^ 0x80); }
else
{
ppu.y_vel = (byte)(portA_ret ^ 0x80);
}
}
}
if (sel0)
{
if (sel1)
{
if (portA_ret >= joy2_UD) { compare = true; }
else { compare = false; }
}
else
{
if (portA_ret >= joy1_UD) { compare = true; }
else { compare = false; }
}
}
else
{
if (sel1)
{
if (portA_ret >= joy2_LR) { compare = true; }
else { compare = false; }
}
else
{
if (portA_ret >= joy1_LR) { compare = true; }
else { compare = false; }
}
}
@ -220,8 +258,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
if (sel0)
{
if (sel1) {/* sound samples direct to output */ audio.pcm_sample = (short)(portA_ret << 6); }
else { ppu.vec_scale = portA_ret; if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); } }
if (sel1)
{
/* sound samples direct to output */
audio.pcm_sample = (short)(portA_ret << 6);
}
else
{
ppu.vec_scale = portA_ret;
if (portA_ret != 0) { Console.WriteLine("scale: " + portA_ret); }
}
}
else
{
@ -234,7 +280,37 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ppu.bright = (byte)(portA_ret & 0x3F);
ppu.bright_int_3 = (uint)(0xFF000000 | (ppu.bright << 16) | (ppu.bright << 8) | ppu.bright);
}
else { ppu.y_vel = (byte)(portA_ret ^ 0x80); }
else
{
ppu.y_vel = (byte)(portA_ret ^ 0x80);
}
}
}
if (sel0)
{
if (sel1)
{
if (portA_ret >= joy2_UD) { compare = true; }
else { compare = false; }
}
else
{
if (portA_ret >= joy1_UD) { compare = true; }
else { compare = false; }
}
}
else
{
if (sel1)
{
if (portA_ret >= joy2_LR) { compare = true; }
else { compare = false; }
}
else
{
if (portA_ret >= joy1_LR) { compare = true; }
else { compare = false; }
}
}
@ -341,6 +417,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
int_en &= (byte)((~value) & 0x7F);
}
update_int_fl();
break;
case 0xF:
@ -392,7 +469,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
int_fl |= 0x40;
update_int_fl();
//if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (t1_ctrl.Bit(7)) { PB7 = !PB7; ppu.ramp_sig = !PB7; }
}
@ -404,7 +481,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
int_fl |= 0x40;
update_int_fl();
//if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (t1_ctrl.Bit(7)) { PB7 = true; ppu.ramp_sig = false; }
t1_shot_go = false;
@ -420,10 +497,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
if (t2_ctrl.Bit(5))
{
t2_counter = (t2_high << 8) | t2_low;
int_fl |= 0x20;
update_int_fl();
//if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (int_en.Bit(5)) { cpu.IRQPending = true; }
}
else
{
@ -433,7 +509,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
int_fl |= 0x20;
update_int_fl();
//if (int_en.Bit(6)) { cpu.IRQPending = true; }
if (int_en.Bit(5)) { cpu.IRQPending = true; }
t2_shot_go = false;
}
@ -488,6 +564,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
test |= int_en.Bit(i) & int_fl.Bit(i);
}
if (!test) { cpu.IRQPending = false; }
int_fl |= (byte)(test ? 0x80 : 0);
}

View File

@ -7,7 +7,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
public VectrexHawk Core { get; set; }
public bool zero_sig, ramp_sig, blank_sig;
public bool zero_sig, ramp_sig, blank_sig, off_screen;
public byte vec_scale, x_vel, y_vel, bright;
public double x_pos, y_pos;
@ -32,13 +32,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
skip--;
}
if (x_pos > 257) { x_pos = 257; }
if (x_pos < 2) { x_pos = 2; }
if (y_pos > 385) { y_pos = 385; }
if (y_pos < 2) { y_pos = 2; }
off_screen = false;
if (x_pos > 257) { off_screen = true; if (x_pos > (257 + 256)) { x_pos = (257 + 256); } }
if (x_pos < 2) { off_screen = true; if (x_pos < (2 - 256)) { x_pos = (2 - 256); } }
if (y_pos > 385) { off_screen = true; if (y_pos > (385 + 256)) { y_pos = (385 + 256); } }
if (y_pos < 2) { off_screen = true; if (y_pos < (2 - 256)) { y_pos = (2 - 256); } }
}
else if (zero_sig)
{
@ -46,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
y_pos = 192 + 2;
}
if (!blank_sig)
if (!blank_sig && !off_screen)
{
Core._vidbuffer[(int)(Math.Round(x_pos) + 260 * Math.Round(y_pos))] |= (int)(br & bright_int_1);
@ -84,6 +86,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ser.Sync(nameof(zero_sig), ref zero_sig);
ser.Sync(nameof(blank_sig), ref blank_sig);
ser.Sync(nameof(ramp_sig), ref ramp_sig);
ser.Sync(nameof(off_screen), ref off_screen);
ser.Sync(nameof(vec_scale), ref vec_scale);
ser.Sync(nameof(x_vel), ref x_vel);

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using BizHawk.Emulation.Common;
using BizHawk.Emulation.Common.Components.MC6809;
namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
@ -11,21 +12,22 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
return new Dictionary<string, RegisterValue>
{
/*
["A"] = cpu.A,
["X"] = cpu.X,
["Y"] = cpu.Y,
["S"] = cpu.S,
["PC"] = cpu.PC,
["Flag C"] = cpu.FlagC,
["Flag Z"] = cpu.FlagZ,
["A"] = cpu.Regs[MC6809.A],
["B"] = cpu.Regs[MC6809.B],
["X"] = cpu.Regs[MC6809.X],
["Y"] = cpu.Regs[MC6809.Y],
["US"] = cpu.Regs[MC6809.US],
["SP"] = cpu.Regs[MC6809.SP],
["PC"] = cpu.Regs[MC6809.PC],
["Flag E"] = cpu.FlagE,
["Flag F"] = cpu.FlagF,
["Flag H"] = cpu.FlagH,
["Flag I"] = cpu.FlagI,
["Flag D"] = cpu.FlagD,
["Flag B"] = cpu.FlagB,
["Flag V"] = cpu.FlagV,
["Flag N"] = cpu.FlagN,
["Flag T"] = cpu.FlagT
*/
["Flag Z"] = cpu.FlagZ,
["Flag V"] = cpu.FlagV,
["Flag C"] = cpu.FlagC
};
}
@ -36,22 +38,49 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
default:
throw new InvalidOperationException();
case "A":
//cpu.A = (byte)value;
cpu.Regs[MC6809.A] = (byte)value;
break;
case "B":
cpu.Regs[MC6809.B] = (byte)value;
break;
case "X":
//cpu.X = (byte)value;
cpu.Regs[MC6809.X] = (byte)value;
break;
case "Y":
//cpu.Y = (byte)value;
cpu.Regs[MC6809.Y] = (ushort)value;
break;
case "S":
//cpu.S = (byte)value;
case "US":
cpu.Regs[MC6809.US] = (ushort)value;
break;
case "SP":
cpu.Regs[MC6809.SP] = (ushort)value;
break;
case "PC":
//cpu.PC = (ushort)value;
cpu.Regs[MC6809.PC] = (ushort)value;
break;
case "Flag E":
cpu.FlagE = value > 0;
break;
case "Flag F":
cpu.FlagF = value > 0;
break;
case "Flag H":
cpu.FlagH = value > 0;
break;
case "Flag I":
//cpu.FlagI = value > 0;
cpu.FlagI = value > 0;
break;
case "Flag N":
cpu.FlagN = value > 0;
break;
case "Flag Z":
cpu.FlagZ = value > 0;
break;
case "Flag V":
cpu.FlagV = value > 0;
break;
case "Flag C":
cpu.FlagC = value > 0;
break;
}
}

View File

@ -12,6 +12,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public ControllerDefinition ControllerDefinition => _controllerDeck.Definition;
byte joy1_LR, joy2_LR, joy1_UD, joy2_UD;
public bool FrameAdvance(IController controller, bool render, bool rendersound)
{
if (_tracer.Enabled)
@ -37,7 +39,23 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
audio.Register[14] |= (byte)(_controllerDeck.ReadPort2(controller) << 4);
// joystick position is based on pot reading
joy1_LR = (byte)(Math.Floor(controller.GetFloat("P1 Stick X")) + 128);
joy1_UD = (byte)(Math.Floor(controller.GetFloat("P1 Stick Y")) + 128);
joy2_LR = (byte)(Math.Floor(controller.GetFloat("P2 Stick X")) + 128);
joy2_UD = (byte)(Math.Floor(controller.GetFloat("P2 Stick Y")) + 128);
// override stick reading with digital input if supplied
// On vectrex there is no such thing as pressing left + right or up + down
// so convention will be up and right dominate
if (controller.IsPressed("P1 Down")) { joy1_UD = 0xFF; }
if (controller.IsPressed("P1 Up")) { joy1_UD = 0; }
if (controller.IsPressed("P1 Left")) { joy1_LR = 0xFF; }
if (controller.IsPressed("P1 Right")) { joy1_LR = 0; }
if (controller.IsPressed("P2 Down")) { joy2_UD = 0xFF; }
if (controller.IsPressed("P2 Up")) { joy2_UD = 0; }
if (controller.IsPressed("P2 Left")) { joy2_LR = 0xFF; }
if (controller.IsPressed("P2 Right")) { joy2_LR = 0; }
frame_end = false;
@ -55,8 +73,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public void do_frame()
{
_vidbuffer = new int[VirtualWidth * VirtualHeight];
//PB7_undriven = true;
//for (int i = 0; i < 1000; i++)
//for (int i = 0; i < 100; i++)
while (!frame_end)
{
internal_state_tick();

View File

@ -104,6 +104,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
ser.Sync(nameof(PB7_undriven), ref PB7_undriven);
ser.Sync(nameof(pot_val), ref pot_val);
ser.Sync(nameof(joy1_LR), ref joy1_LR);
ser.Sync(nameof(joy1_UD), ref joy1_UD);
ser.Sync(nameof(joy2_LR), ref joy2_LR);
ser.Sync(nameof(joy2_UD), ref joy2_UD);
// probably a better way to do this
if (cart_RAM != null)
{

View File

@ -35,7 +35,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
.Select(b => "P" + PortNum + " " + b)
.ToList(),
FloatControls = { "P" + PortNum + " Stick X", "P" + PortNum + " Stick Y" },
FloatRanges = { new[] { -127.0f, 0, 127.0f }, new[] { -127.0f, 0, 127.0f } }
FloatRanges = { new[] { 127.0f, 0, -128.0f }, new[] { -128.0f, 0, 127.0f } }
};
}
@ -57,6 +57,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
private static readonly string[] BaseDefinition =
{
"Up",
"Down",
"Left",
"Right",
"Button 1",
"Button 2",
"Button 3",