diff --git a/Assets/gamedb/gamedb.txt b/Assets/gamedb/gamedb.txt
index 5b6a8ab82b..f2c2ba9c25 100644
--- a/Assets/gamedb/gamedb.txt
+++ b/Assets/gamedb/gamedb.txt
@@ -21,6 +21,7 @@
#include gamedb_sega_md.txt
#include gamedb_snes.txt
#include gamedb_user.txt
+#include gamedb_vectrex.txt
#include gamedb_ws.txt
#include gamedb_wsc.txt
#include gamedb_zxspectrum.txt
diff --git a/Assets/gamedb/gamedb_vectrex.txt b/Assets/gamedb/gamedb_vectrex.txt
new file mode 100644
index 0000000000..1a706121e4
--- /dev/null
+++ b/Assets/gamedb/gamedb_vectrex.txt
@@ -0,0 +1 @@
+SHA1:67F8513958C04E936B135740ED4EC6E6FA1763D5 Clean Sweep VEC
diff --git a/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs b/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs
index a9d0fdafe6..a8a3751112 100644
--- a/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs
+++ b/BizHawk.Client.ApiHawk/Classes/BizHawkSystemIdToCoreSystemEnumConverter.cs
@@ -93,6 +93,9 @@ namespace BizHawk.Client.ApiHawk
case "TI83":
return CoreSystem.TI83;
+ case "VEC":
+ return CoreSystem.Vectrex;
+
case "WSWAN":
return CoreSystem.WonderSwan;
diff --git a/BizHawk.Client.Common/Api/CoreSystem.cs b/BizHawk.Client.Common/Api/CoreSystem.cs
index 48a10efbfc..48ba2e4f1a 100644
--- a/BizHawk.Client.Common/Api/CoreSystem.cs
+++ b/BizHawk.Client.Common/Api/CoreSystem.cs
@@ -29,6 +29,7 @@
WonderSwan,
Libretro,
VirtualBoy,
+ Vectrex,
NeoGeoPocket,
ZXSpectrum,
AmstradCPC,
diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs
index fe093b2532..0e10ef3bf4 100644
--- a/BizHawk.Client.Common/RomLoader.cs
+++ b/BizHawk.Client.Common/RomLoader.cs
@@ -28,6 +28,7 @@ using GPGX64 = BizHawk.Emulation.Cores.Consoles.Sega.gpgx;
using BizHawk.Emulation.Cores.Consoles.Sega.Saturn;
using BizHawk.Emulation.Cores.Consoles.NEC.PCFX;
using BizHawk.Emulation.Cores.Computers.AmstradCPC;
+using BizHawk.Emulation.Cores.Consoles.Vectrex;
namespace BizHawk.Client.Common
{
diff --git a/BizHawk.Client.Common/SystemInfo.cs b/BizHawk.Client.Common/SystemInfo.cs
index 258b5b1c4d..a109e7ddf9 100644
--- a/BizHawk.Client.Common/SystemInfo.cs
+++ b/BizHawk.Client.Common/SystemInfo.cs
@@ -183,6 +183,11 @@ namespace BizHawk.Client.Common
///
public static SystemInfo VirtualBoy { get; } = new SystemInfo("Virtual Boy", CoreSystem.VirtualBoy, 1);
+ ///
+ /// Gets the instance for Vectrex
+ ///
+ public static SystemInfo Vectrex { get; } = new SystemInfo("Vextrex", CoreSystem.Vectrex, 2);
+
///
/// Gets the instance for TI-83
///
diff --git a/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs b/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs
index 32ba4651e5..79e2233317 100644
--- a/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs
+++ b/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs
@@ -30,6 +30,7 @@ namespace BizHawk.Emulation.Common
FirmwareAndOption("5A140136A16D1D83E4FF32A19409CA376A8DF874", 16384, "A78", "Bios_PAL", "7800PALBIOS.bin", "PAL Bios");
FirmwareAndOption("A3AF676991391A6DD716C79022D4947206B78164", 4096, "A78", "Bios_HSC", "7800highscore.bin", "Highscore Bios");
FirmwareAndOption("45BEDC4CBDEAC66C7DF59E9E599195C778D86A92", 8192, "Coleco", "Bios", "ColecoBios.bin", "Bios");
+ FirmwareAndOption("B9BBF5BB0EAC52D039A4A993A2D8064B862C9E28", 4096, "Vectrex", "Bios", "VectrexBios.bin", "Bios");
var gbaNormal = File("300C20DF6731A33952DED8C436F7F186D25D3492", 16384, "gbabios.rom", "Bios (World)");
var gbaJDebug = File("AA98A2AD32B86106340665D1222D7D973A1361C7", 16384, "gbabios.rom", "Bios (J Debug)");
diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
index 2aec848dac..b7fa5086d0 100644
--- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
+++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj
@@ -596,7 +596,6 @@
-
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/Disassembler.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/Disassembler.cs
index a60e48e565..892d6015d1 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/Disassembler.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/Disassembler.cs
@@ -793,17 +793,23 @@ namespace BizHawk.Emulation.Common.Components.MC6809
bytes.Add(reader(addr++));
string result = table[bytes[0]];
- if (bytes[0] == 0xcb)
+ if (bytes[0] == 0x10)
{
bytes.Add(reader(addr++));
- result = table[bytes[1] + 256];
+ result = table2[bytes[1]];
}
- if (result.Contains("d8"))
+ if (bytes[0] == 0x11)
+ {
+ bytes.Add(reader(addr++));
+ result = table3[bytes[1]];
+ }
+
+ if (result.Contains("i8"))
{
byte d = reader(addr++);
bytes.Add(d);
- result = result.Replace("d8", string.Format("#{0:X2}h", d));
+ result = result.Replace("i8", string.Format("#{0:X2}h", d));
}
else if (result.Contains("d16"))
{
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/Execute.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/Execute.cs
index 910dcb9cea..836508c574 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/Execute.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/Execute.cs
@@ -8,14 +8,19 @@ namespace BizHawk.Emulation.Common.Components.MC6809
// variables for executing instructions
public int instr_pntr = 0;
- public ushort[] cur_instr;
- public int opcode;
+ public ushort[] cur_instr = new ushort[60];
+ public int opcode_see;
public int IRQS;
public int irq_pntr;
+ ushort reg_d_ad;
+ ushort reg_h_ad;
+ ushort reg_l_ad;
+
public void FetchInstruction(byte opcode)
{
+ opcode_see = opcode;
switch (opcode)
{
case 0x00: DIRECT_MEM(NEG); break; // NEG (Direct)
@@ -279,6 +284,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public void FetchInstruction2(byte opcode)
{
+ opcode_see = opcode;
switch (opcode)
{
case 0x21: LBR_(false); break; // BRN (Relative)
@@ -326,6 +332,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public void FetchInstruction3(byte opcode)
{
+ opcode_see = opcode;
switch (opcode)
{
case 0x3F: SWI2_3(3); break; // SWI3 (Inherent)
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/Indexed_Modes.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/Indexed_Modes.cs
index 97cb87682b..8025b1d0f9 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/Indexed_Modes.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/Indexed_Modes.cs
@@ -53,7 +53,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(RD_INC_OP, ALU, PC, IDX_DCDE);
- IRQS = 0;
+ IRQS = -1;
}
private void INDEX_OP_REG(ushort oper, ushort src)
@@ -63,25 +63,25 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(RD_INC_OP, ALU, PC, IDX_DCDE);
- IRQS = 0;
+ IRQS = -1;
}
private void INDEX_OP_JMP()
{
PopulateCURINSTR(TR, PC, IDX_EA);
- IRQS = irq_pntr + 2;
+ IRQS = 1;
}
private void INDEX_OP_JSR()
{
- PopulateCURINSTR(IDLE,
- IDLE,
+ PopulateCURINSTR(TR, ADDR, PC,
+ DEC16, SP,
TR, PC, IDX_EA,
WR_DEC_LO, SP, ADDR,
WR_HI, SP, ADDR);
- IRQS = irq_pntr + 6;
+ IRQS = 5;
}
private void INDEX_OP_LEA(ushort dest)
@@ -89,7 +89,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(TR, dest, IDX_EA,
IDLE);
- IRQS = irq_pntr + 3;
+ IRQS = 2;
}
private void INDEX_OP_LD()
@@ -98,7 +98,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC, ALU, IDX_EA,
RD_INC_OP, ALU2, IDX_EA, SET_ADDR, indexed_op_reg, ALU, ALU2);
- IRQS = irq_pntr + 4;
+ IRQS = 3;
}
private void INDEX_OP_ST()
@@ -107,7 +107,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
WR_HI_INC, IDX_EA, indexed_op_reg,
WR_DEC_LO, IDX_EA, indexed_op_reg);
- IRQS = irq_pntr + 4;
+ IRQS = 3;
}
private void INDEX_OP_LDD()
@@ -116,7 +116,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC, A, IDX_EA,
RD_INC, B, IDX_EA);
- IRQS = irq_pntr + 4;
+ IRQS = 3;
}
private void INDEX_OP_STD()
@@ -125,7 +125,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
WR_HI_INC, IDX_EA, ADDR,
WR_DEC_LO, IDX_EA, B);
- IRQS = irq_pntr + 4;
+ Console.WriteLine("here");
+ IRQS = 3;
}
private void INDEX_OP_EX4(ushort oper)
@@ -133,7 +134,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(IDLE,
RD_INC_OP, ALU, IDX_EA, oper, indexed_op_reg, ALU);
- IRQS = irq_pntr + 3;
+ IRQS = 2;
}
private void INDEX_OP_EX4_ST()
@@ -141,7 +142,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(IDLE,
WR, ALU, IDX_EA, indexed_op_reg);
- IRQS = irq_pntr + 3;
+ IRQS = 2;
}
private void INDEX_OP_EX6(ushort oper)
@@ -151,7 +152,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
oper, ALU,
WR, IDX_EA, ALU);
- IRQS = irq_pntr + 5;
+ IRQS = 4;
}
private void INDEX_OP_EX6D(ushort oper)
@@ -161,7 +162,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC_OP, ALU2, IDX_EA, SET_ADDR, ADDR, ALU, ALU2,
oper, ADDR);
- IRQS = irq_pntr + 5;
+ IRQS = 4;
}
private void INDEX_CMP_EX6(ushort oper)
@@ -171,7 +172,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC_OP, ALU2, IDX_EA, SET_ADDR, ADDR, ALU, ALU2,
oper, indexed_op_reg, ADDR);
- IRQS = irq_pntr + 5;
+ IRQS = 4;
}
// ALU holds the post byte
@@ -348,6 +349,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case 0x4:
Regs[IDX_EA] = Regs[indexed_reg];
Index_Op_Builder();
+ return; // need to return here or else we run into the code below invalidating irq_pntr
break;
case 0x5:
Regs[IDX_EA] = (ushort)(Regs[indexed_reg] + (((Regs[B] & 0x80) == 0x80) ? (Regs[B] | 0xFF00) : Regs[B]));
@@ -447,7 +449,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
}
instr_pntr = 0;
- irq_pntr = 100;
+ irq_pntr = -1;
}
}
}
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/MC6809.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/MC6809.cs
index f3c8ee7cf2..e1019df6f9 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/MC6809.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/MC6809.cs
@@ -85,12 +85,12 @@ namespace BizHawk.Emulation.Common.Components.MC6809
ResetRegisters();
ResetInterrupts();
TotalExecutedCycles = 0;
- Regs[ADDR] = 0xFFFE;
+ Regs[PC] = 0xFFFE;
PopulateCURINSTR(IDLE,
IDLE,
IDLE,
- RD_INC, ALU, ADDR,
- RD_INC, ALU2, ADDR,
+ RD_INC, ALU, PC,
+ RD_INC, ALU2, PC,
SET_ADDR, PC, ALU, ALU2);
IRQS = 6;
@@ -148,6 +148,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
// Execute instructions
public void ExecuteOne()
{
+ Console.Write(opcode_see + " ");
switch (cur_instr[instr_pntr++])
{
case IDLE:
@@ -160,12 +161,17 @@ namespace BizHawk.Emulation.Common.Components.MC6809
if (CDLCallback != null) CDLCallback(PC, eCDLogMemFlags.FetchFirst);
FetchInstruction(ReadMemory(Regs[PC]++));
instr_pntr = 0;
+ irq_pntr = -1;
break;
case OP_PG_2:
FetchInstruction2(ReadMemory(Regs[PC]++));
+ instr_pntr = 0;
+ irq_pntr = -1;
break;
case OP_PG_3:
FetchInstruction3(ReadMemory(Regs[PC]++));
+ instr_pntr = 0;
+ irq_pntr = -1;
break;
case RD:
Read_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
@@ -207,8 +213,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case DEC16:
DEC16_Func(cur_instr[instr_pntr++]);
break;
+ case TR:
+ TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
+ break;
case SET_ADDR:
- Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[cur_instr[instr_pntr++]] << 8) | Regs[cur_instr[instr_pntr++]]);
+ reg_d_ad = cur_instr[instr_pntr++];
+ reg_h_ad = cur_instr[instr_pntr++];
+ reg_l_ad = cur_instr[instr_pntr++];
+
+ Regs[reg_d_ad] = (ushort)((Regs[reg_h_ad] << 8) | Regs[reg_l_ad]);
break;
case JPE:
if (!FlagE) { instr_pntr = 45; };
@@ -282,7 +295,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
TFR_Func(cur_instr[instr_pntr++]);
break;
case SET_ADDR:
- Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[cur_instr[instr_pntr++]] << 8) | Regs[cur_instr[instr_pntr++]]);
+ reg_d_ad = cur_instr[instr_pntr++];
+ reg_h_ad = cur_instr[instr_pntr++];
+ reg_l_ad = cur_instr[instr_pntr++];
+
+ // Console.WriteLine(reg_d_ad + " " + reg_h_ad + " " + reg_l_ad);
+ // Console.WriteLine(Regs[reg_d_ad] + " " + Regs[reg_h_ad] + " " + Regs[reg_l_ad]);
+
+ Regs[reg_d_ad] = (ushort)((Regs[reg_h_ad] << 8) | Regs[reg_l_ad]);
break;
case NEG:
NEG_8_Func(cur_instr[instr_pntr++]);
@@ -436,7 +456,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
PopulateCURINSTR(CWAI);
irq_pntr = 0;
- IRQS = 0;
+ IRQS = -1;
}
instr_pntr = 0;
break;
@@ -525,6 +545,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
PopulateCURINSTR(OP);
instr_pntr = irq_pntr = 0;
+ IRQS = -1;
}
}
@@ -548,7 +569,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
Disassembly = string.Format(
"{0} ",
- disassemble ? Disassemble(PC, ReadMemory, out notused) : "---").PadRight(40),
+ disassemble ? Disassemble(Regs[PC], ReadMemory, out notused) : "---").PadRight(40),
RegisterInfo = string.Format(
"A:{0:X2} B:{1:X2} X:{2:X4} Y:{3:X4} US:{4:X4} SP:{5:X4} DP:{6:X2} CC:{7:X2} Cy:{8} {9}{10}{11}{12}{13}{14}{15}{16}",
Regs[A],
@@ -621,7 +642,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
ser.Sync("instr_pntr", ref instr_pntr);
ser.Sync("cur_instr", ref cur_instr, false);
- ser.Sync("opcode", ref opcode);
+ ser.Sync("opcode_see", ref opcode_see);
ser.Sync("IRQS", ref IRQS);
ser.Sync("irq_pntr", ref irq_pntr);
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/OP_Tables.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/OP_Tables.cs
index 91d83517a9..bc9e27f4ec 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/OP_Tables.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/OP_Tables.cs
@@ -17,7 +17,10 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void ILLEGAL()
{
- throw new Exception("Encountered illegal instruction");
+ //throw new Exception("Encountered illegal instruction");
+ PopulateCURINSTR(IDLE);
+
+ IRQS = 1;
}
private void SYNC_()
@@ -25,7 +28,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(IDLE,
SYNC);
- IRQS = 0;
+ IRQS = -1;
}
private void REG_OP(ushort oper, ushort src)
@@ -278,7 +281,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void EXG_()
{
- PopulateCURINSTR(RD_INC, ALU,
+ PopulateCURINSTR(RD_INC, ALU, PC,
EXG, ALU,
IDLE,
IDLE,
@@ -291,7 +294,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void TFR_()
{
- PopulateCURINSTR(RD_INC, ALU,
+ PopulateCURINSTR(RD_INC, ALU, PC,
TFR, ALU,
IDLE,
IDLE,
@@ -321,7 +324,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
PopulateCURINSTR(RD_INC, ALU, PC,
SET_ADDR, ADDR, DP, ALU,
- IDLE,
+ DEC16, SP,
TR, PC, ADDR,
WR_DEC_LO, SP, ADDR,
WR_HI, SP, ADDR);
@@ -332,12 +335,12 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void JSR_EXT()
{
PopulateCURINSTR(RD_INC, ALU, PC,
- RD_INC_OP, ALU2, PC,
- SET_ADDR, ADDR, ALU, ALU2,
- IDLE,
+ RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
+ TR, ALU, PC,
+ DEC16, SP,
TR, PC, ADDR,
- WR_DEC_LO, SP, ADDR,
- WR_HI, SP, ADDR);
+ WR_DEC_LO, SP, ALU,
+ WR_HI, SP, ALU);
IRQS = 7;
}
@@ -384,8 +387,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void BSR_()
{
PopulateCURINSTR(RD_INC, ALU, PC,
- ADD8BR, PC, ALU,
TR, ADDR, PC,
+ ADD8BR, PC, ALU,
DEC16, SP,
WR_DEC_LO, SP, ADDR,
WR_HI, SP, ADDR);
@@ -398,11 +401,11 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(RD_INC, ALU, PC,
RD_INC, ALU2, PC,
SET_ADDR, ADDR, ALU, ALU2,
+ TR, ALU, PC,
ADD16BR, PC, ADDR,
- TR, ADDR, PC,
DEC16, SP,
- WR_DEC_LO, SP, ADDR,
- WR_HI, SP, ADDR);
+ WR_DEC_LO, SP, ALU,
+ WR_HI, SP, ALU);
IRQS = 8;
}
@@ -411,14 +414,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
PopulateCURINSTR(OP_PG_2);
- IRQS = 0;
+ IRQS = -1;
}
private void PAGE_3()
{
PopulateCURINSTR(OP_PG_3);
- IRQS = 0;
+ IRQS = -1;
}
private void ABX_()
@@ -482,7 +485,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
DEC16, SP,
PSH_n, src);
- IRQS = 0;
+ IRQS = -1;
}
// Post byte info is in ALU
@@ -546,6 +549,8 @@ namespace BizHawk.Emulation.Common.Components.MC6809
else if (Regs[ALU].Bit(0))
{
PopulateCURINSTR(WR_DEC_LO_OP, src, CC, PSH_n, src);
+
+ Regs[ALU] = 0;
}
else
{
@@ -561,55 +566,54 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{
PopulateCURINSTR(RD_INC, ALU, PC,
IDLE,
- PSH_n, src);
+ PUL_n, src);
- IRQS = 0;
+ IRQS = -1;
}
// Post byte info is in ALU
// mask out bits until the end
private void PUL_n_BLD(ushort src)
{
- if (Regs[ALU].Bit(7))
+ if (Regs[ALU].Bit(0))
{
PopulateCURINSTR(RD_INC_OP, CC, src, PUL_n, src);
- Regs[ALU] &= 0x7F;
+ Regs[ALU] &= 0xFE;
}
- else if (Regs[ALU].Bit(6))
+ else if (Regs[ALU].Bit(1))
{
PopulateCURINSTR(RD_INC_OP, A, src, PUL_n, src);
- Regs[ALU] &= 0x3F;
+ Regs[ALU] &= 0xFC;
}
- else if (Regs[ALU].Bit(5))
+ else if (Regs[ALU].Bit(2))
{
PopulateCURINSTR(RD_INC_OP, B, src, PUL_n, src);
-
- Regs[ALU] &= 0x1F;
+ Regs[ALU] &= 0xF8;
}
- else if (Regs[ALU].Bit(4))
+ else if (Regs[ALU].Bit(3))
{
PopulateCURINSTR(RD_INC_OP, DP, src, PUL_n, src);
- Regs[ALU] &= 0xF;
+ Regs[ALU] &= 0xF0;
}
- else if (Regs[ALU].Bit(3))
+ else if (Regs[ALU].Bit(4))
{
PopulateCURINSTR(RD_INC_OP, ALU2, src,
RD_INC_OP, ADDR, src, SET_ADDR_PUL, X, src);
- Regs[ALU] &= 0x7;
+ Regs[ALU] &= 0xE0;
}
- else if (Regs[ALU].Bit(2))
+ else if (Regs[ALU].Bit(5))
{
PopulateCURINSTR(RD_INC_OP, ALU2, src,
RD_INC_OP, ADDR, src, SET_ADDR_PUL, Y, src);
- Regs[ALU] &= 0x3;
+ Regs[ALU] &= 0xC0;
}
- else if (Regs[ALU].Bit(1))
+ else if (Regs[ALU].Bit(6))
{
if (src == US)
{
@@ -622,12 +626,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC_OP, ADDR, src, SET_ADDR_PUL, US, src);
}
- Regs[ALU] &= 0x1;
+ Regs[ALU] &= 0x80;
}
- else if (Regs[ALU].Bit(0))
+ else if (Regs[ALU].Bit(7))
{
PopulateCURINSTR(RD_INC_OP, ALU2, src,
RD_INC_OP, ADDR, src, SET_ADDR_PUL, PC, src);
+
+ Regs[ALU] = 0;
}
else
{
diff --git a/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs b/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs
index e7f22c98da..6621a45fd4 100644
--- a/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs
+++ b/BizHawk.Emulation.Cores/CPUs/MC6809/Operations.cs
@@ -22,9 +22,11 @@ namespace BizHawk.Emulation.Common.Components.MC6809
if (src == PC) CDLCallback(Regs[src], eCDLogMemFlags.FetchOperand);
else CDLCallback(Regs[src], eCDLogMemFlags.Data);
}
+ //Console.WriteLine(dest + " " + src + " " + opcode_see);
+
Regs[dest] = ReadMemory(Regs[src]);
- Regs[src] = Regs[src]++;
+ Regs[src]++;
}
public void Write_Func(ushort dest_l, ushort dest_h, ushort src)
@@ -698,7 +700,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
}
else
{
- Regs[dest] = Regs[dest];
+ Regs[dest] = Regs[src];
}
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Audio.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Audio.cs
index 7ed548d780..1af35bb959 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Audio.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Audio.cs
@@ -8,7 +8,6 @@ using BizHawk.Common.NumberExtensions;
namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
// An AY_3_8912
-
public class Audio : ISoundProvider
{
public VectrexHawk Core { get; set; }
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs
index 5d7a9cdf07..ebada2c06f 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/HW_Registers.cs
@@ -7,9 +7,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
public partial class VectrexHawk
{
- // Interact with Hardware registers through these read and write methods
- // Typically you will only be able to access different parts of the hardware through their available registers
- // Sending the memory map of these regiesters through here helps keep things organized even though it results in an extra function call
public byte Read_Registers(int addr)
{
byte ret = 0;
@@ -33,7 +30,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public void Register_Reset()
{
- // Registers will start with a default value at power on, use this funciton to set them
+
}
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs
index 8fce90198f..176bc1beaa 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/MemoryMap.cs
@@ -15,30 +15,104 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
public partial class VectrexHawk
{
- // typically here you have a big if / else if block to decide what to do with memory reads and writes
- // send hardware register accesses to the Read_register / Write_register methods
- // make sure you are returning the correct value (typically 0 or 0xFF) for unmapped memory
-
- // PeekMemory is called by the hex eidtor and other tools to read what's on the bus
- // make sure it doesn't modify anything in the core or you will be in debugging hell.
-
public byte ReadMemory(ushort addr)
{
- // memory callbacks are used for LUA and such
MemoryCallbacks.CallReads(addr, "System Bus");
- return 0;
+ if (addr < 0x8000)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xC800)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xD000)
+ {
+ return RAM[(addr-0xC800) & 0x3FF];
+ }
+ else if (addr < 0xD800)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xE000)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xF000)
+ {
+ return 0xFF;
+ }
+ else
+ {
+ return _bios[addr - 0xF000];
+ }
}
public void WriteMemory(ushort addr, byte value)
{
MemoryCallbacks.CallWrites(addr, "System Bus");
-
+
+ if (addr < 0x8000)
+ {
+
+ }
+ else if (addr < 0xC800)
+ {
+
+ }
+ else if (addr < 0xD000)
+ {
+ RAM[(addr - 0xC800) & 0x3FF] = value;
+ }
+ else if (addr < 0xD800)
+ {
+
+ }
+ else if (addr < 0xE000)
+ {
+
+ }
+ else if (addr < 0xF000)
+ {
+
+ }
+ else
+ {
+
+ }
}
public byte PeekMemory(ushort addr)
{
- return 0;
+ if (addr < 0x8000)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xC800)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xD000)
+ {
+ return RAM[(addr - 0xC800) & 0x3FF];
+ }
+ else if (addr < 0xD800)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xE000)
+ {
+ return 0xFF;
+ }
+ else if (addr < 0xF000)
+ {
+ return 0xFF;
+ }
+ else
+ {
+ return _bios[addr - 0xF000];
+ }
}
}
}
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs
index 00eb6ac7de..2d2118bc80 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/PPU.cs
@@ -3,11 +3,6 @@ using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
- // Here is where you will write the renderer for the core.
- // You will probably spend just about all of your time writing this part.
- // Plan ahead on what types of memory structures you want, and understand how the physical display unit sees data
- // if you get stuck, probably GBHawk has the cleanest implementation to use for reference
-
public class PPU
{
public VectrexHawk Core { get; set; }
@@ -22,13 +17,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
- // you should be able to run the PPU one step at a time through this method.
public void tick()
{
}
- // if some values aren't latched immediately, you might need this function to delay their latching
public virtual void latch_delay()
{
@@ -39,7 +32,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
- // Reset all values here, should be called along with other reset methods
public void Reset()
{
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/SerialPort.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/SerialPort.cs
index 992542757b..1212ce8a24 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/SerialPort.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/SerialPort.cs
@@ -5,11 +5,6 @@ using BizHawk.Common;
namespace BizHawk.Emulation.Cores.Consoles.Vectrex
{
- // your core may have several integral peripherals beyond the usual graphics / sound / controller
- // here is one such example
- // Treat it the same way as any other component. you should be able to run it one tick at a time in sync with the
- // other parts of the core
-
public class SerialPort
{
public VectrexHawk Core { get; set; }
@@ -24,7 +19,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
}
-
public void serial_transfer_tick()
{
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Vectrex.CpuLink.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Vectrex.CpuLink.cs
deleted file mode 100644
index c5348ac547..0000000000
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/Vectrex.CpuLink.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-using BizHawk.Emulation.Cores.Components.M6502;
-
-namespace BizHawk.Emulation.Cores.Consoles.Vectrex
-{
- public partial class VectrexHawk
- {
- public struct CpuLink : IMOS6502XLink
- {
- private readonly VectrexHawk _Vectrex;
-
- public CpuLink(VectrexHawk Vectrex)
- {
- _Vectrex = Vectrex;
- }
-
- public byte DummyReadMemory(ushort address) => _Vectrex.ReadMemory(address);
-
- public void OnExecFetch(ushort address) => _Vectrex.ExecFetch(address);
-
- public byte PeekMemory(ushort address) => _Vectrex.CDL == null ? _Vectrex.PeekMemory(address) : _Vectrex.FetchMemory_CDL(address);
-
- public byte ReadMemory(ushort address) => _Vectrex.CDL == null ? _Vectrex.ReadMemory(address) : _Vectrex.ReadMemory_CDL(address);
-
- public void WriteMemory(ushort address, byte value) => _Vectrex.WriteMemory(address, value);
- }
- }
-}
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs
index 300cd5663b..5f91994a35 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.IEmulator.cs
@@ -44,12 +44,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public void do_frame()
{
-
+ for (int i = 0; i < 4500; i++)
+ {
+ cpu.ExecuteOne();
+ }
}
public int Frame => _frame;
- public string SystemId => "VIC20";
+ public string SystemId => "VEC";
public bool DeterministicEmulation { get; set; }
diff --git a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs
index 5e84fee7ab..9f9bc9b929 100644
--- a/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs
+++ b/BizHawk.Emulation.Cores/Consoles/GCE/Vectrex/VectrexHawk.cs
@@ -17,22 +17,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public partial class VectrexHawk : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable,
ISettable
{
- // declaractions
- // put top level core variables here
- // including things like RAM and BIOS
- // they will be used in the hex editor and others
-
- // the following declaraion is only an example
- // see memoryDomains.cs to see how it is used to define a Memory Domain that you can see in Hex editor
- // ex:
- public byte[] RAM = new byte[0x8000];
+ public byte[] RAM = new byte[0x400];
public byte[] _bios;
public readonly byte[] _rom;
- // sometimes roms will have a header
- // the following is only an example in order to demonstrate how to extract the header
public readonly byte[] header = new byte[0x50];
public byte[] cart_RAM;
@@ -49,9 +39,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public Audio audio;
public SerialPort serialport;
- private static byte[] GBA_override = { 0xFF, 0x00, 0xCD, 0x03, 0x35, 0xAA, 0x31, 0x90, 0x94, 0x00, 0x00, 0x00, 0x00 };
-
- [CoreConstructor("Vectrex")]
+ [CoreConstructor("VEC")]
public VectrexHawk(CoreComm comm, GameInfo game, byte[] rom, /*string gameDbFn,*/ object settings, object syncSettings)
{
var ser = new BasicServiceProvider(this);
@@ -75,30 +63,24 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
_syncSettings = (VectrexSyncSettings)syncSettings ?? new VectrexSyncSettings();
_controllerDeck = new VectrexHawkControllerDeck(_syncSettings.Port1);
- // BIOS stuff can be tricky. Sometimes you'll have more then one vailable BIOS or different BIOSes for different regions
- // for now I suggest just picking one going
byte[] Bios = null;
- //Bios = comm.CoreFileProvider.GetFirmware("Vectrex", "Bios", true, "BIOS Not Found, Cannot Load");
+ Bios = comm.CoreFileProvider.GetFirmware("Vectrex", "Bios", true, "BIOS Not Found, Cannot Load");
_bios = Bios;
- // the following few lines are jsut examples of working with a header and hashes
Buffer.BlockCopy(rom, 0x100, header, 0, 0x50);
string hash_md5 = null;
hash_md5 = "md5:" + rom.HashMD5(0, rom.Length);
Console.WriteLine(hash_md5);
- // in this case our working ROm has the header removed (might not be the case for your system)
_rom = rom;
Setup_Mapper();
_frameHz = 60;
- // usually you want to have a reflected core available to the various components since they share some information
audio.Core = this;
ppu.Core = this;
serialport.Core = this;
- // the following is just interface setup, dont worry to much about it
ser.Register(this);
ser.Register(audio);
ServiceProvider = ser;
@@ -111,6 +93,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
SetupMemoryDomains();
HardReset();
+
+ cpu.SetCallbacks(ReadMemory, PeekMemory, PeekMemory, WriteMemory);
}
public DisplayType Region => DisplayType.NTSC;
@@ -132,8 +116,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
MemoryCallbacks.CallExecutes(addr, "System Bus");
}
- // most systems have cartridges or other storage media that map memory in more then one way.
- // Use this ethod to set that stuff up when first starting the core
private void Setup_Mapper()
{
mapper = new MapperDefault();