Vectrex: More bug fixes
This commit is contained in:
parent
65e350ef7d
commit
dd0d34593e
|
@ -1 +1,3 @@
|
|||
SHA1:67F8513958C04E936B135740ED4EC6E6FA1763D5 Clean Sweep VEC
|
||||
SHA1:38E38B5C60466146D4648F8929B5CE3A08DCBE0D Scramble VEC
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0x83: IMD_OP_D(SUB16, D); break; // SUBD (Immediate)
|
||||
case 0x84: REG_OP_IMD(AND8, A); break; // ANDA (Immediate)
|
||||
case 0x85: REG_OP_IMD(BIT, A); break; // BITA (Immediate)
|
||||
case 0x86: REG_OP_IMD(TR, A); break; // LDA (Immediate)
|
||||
case 0x86: REG_OP_IMD(LD_8, A); break; // LDA (Immediate)
|
||||
case 0x87: ILLEGAL(); break; // ILLEGAL
|
||||
case 0x88: REG_OP_IMD(XOR8, A); break; // EORA (Immediate)
|
||||
case 0x89: REG_OP_IMD(ADC8, A); break; // ADCA (Immediate)
|
||||
|
@ -173,7 +173,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0x93: DIR_OP_D(SUB16, D); break; // SUBD (Direct)
|
||||
case 0x94: DIRECT_MEM_4(AND8, A); break; // ANDA (Direct)
|
||||
case 0x95: DIRECT_MEM_4(BIT, A); break; // BITA (Direct)
|
||||
case 0x96: DIRECT_MEM_4(TR, A); break; // LDA (Direct)
|
||||
case 0x96: DIRECT_MEM_4(LD_8, A); break; // LDA (Direct)
|
||||
case 0x97: DIRECT_ST_4(A); break; // STA (Direct)
|
||||
case 0x98: DIRECT_MEM_4(XOR8, A); break; // EORA (Direct)
|
||||
case 0x99: DIRECT_MEM_4(ADC8, A); break; // ADCA (Direct)
|
||||
|
@ -205,7 +205,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0xB3: EXT_OP_D(SUB16, D); break; // SUBD (Extended)
|
||||
case 0xB4: EXT_REG(AND8, A); break; // ANDA (Extended)
|
||||
case 0xB5: EXT_REG(BIT, A); break; // BITA (Extended)
|
||||
case 0xB6: EXT_REG(TR, A); break; // LDA (Extended)
|
||||
case 0xB6: EXT_REG(LD_8, A); break; // LDA (Extended)
|
||||
case 0xB7: EXT_ST(A); break; // STA (Extended)
|
||||
case 0xB8: EXT_REG(XOR8, A); break; // EORA (Extended)
|
||||
case 0xB9: EXT_REG(ADC8, A); break; // ADCA (Extended)
|
||||
|
@ -221,7 +221,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0xC3: IMD_OP_D(ADD16, D); break; // ADDD (Immediate)
|
||||
case 0xC4: REG_OP_IMD(AND8, B); break; // ANDB (Immediate)
|
||||
case 0xC5: REG_OP_IMD(BIT, B); break; // BITB (Immediate)
|
||||
case 0xC6: REG_OP_IMD(TR, B); break; // LDB (Immediate)
|
||||
case 0xC6: REG_OP_IMD(LD_8, B); break; // LDB (Immediate)
|
||||
case 0xC7: ILLEGAL(); break; // ILLEGAL
|
||||
case 0xC8: REG_OP_IMD(XOR8, B); break; // EORB (Immediate)
|
||||
case 0xC9: REG_OP_IMD(ADC8, B); break; // ADCB (Immediate)
|
||||
|
@ -237,7 +237,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0xD3: DIR_OP_D(ADD16, D); break; // ADDD (Direct)
|
||||
case 0xD4: DIRECT_MEM_4(AND8, B); break; // ANDB (Direct)
|
||||
case 0xD5: DIRECT_MEM_4(BIT, B); break; // BITB (Direct)
|
||||
case 0xD6: DIRECT_MEM_4(TR, B); break; // LDB (Direct)
|
||||
case 0xD6: DIRECT_MEM_4(LD_8, B); break; // LDB (Direct)
|
||||
case 0xD7: DIRECT_ST_4(B); break; // STB (Direct)
|
||||
case 0xD8: DIRECT_MEM_4(XOR8, B); break; // EORB (Direct)
|
||||
case 0xD9: DIRECT_MEM_4(ADC8, B); break; // ADCB (Direct)
|
||||
|
@ -269,7 +269,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case 0xF3: EXT_OP_D(ADD16, D); break; // ADDD (Extended)
|
||||
case 0xF4: EXT_REG(AND8, B); break; // ANDB (Extended)
|
||||
case 0xF5: EXT_REG(BIT, B); break; // BITB (Extended)
|
||||
case 0xF6: EXT_REG(TR, B); break; // LDB (Extended)
|
||||
case 0xF6: EXT_REG(LD_8, B); break; // LDB (Extended)
|
||||
case 0xF7: EXT_ST(B); break; // STB (Extended)
|
||||
case 0xF8: EXT_REG(XOR8, B); break; // EORB (Extended)
|
||||
case 0xF9: EXT_REG(ADC8, B); break; // ADCB (Extended)
|
||||
|
|
|
@ -86,7 +86,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
|
||||
private void INDEX_OP_LEA(ushort dest)
|
||||
{
|
||||
PopulateCURINSTR(TR, dest, IDX_EA,
|
||||
PopulateCURINSTR(LEA, dest, IDX_EA,
|
||||
IDLE);
|
||||
|
||||
IRQS = 2;
|
||||
|
@ -96,7 +96,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
{
|
||||
PopulateCURINSTR(IDLE,
|
||||
RD_INC, ALU, IDX_EA,
|
||||
RD_INC_OP, ALU2, IDX_EA, SET_ADDR, indexed_op_reg, ALU, ALU2);
|
||||
RD_INC_OP, ALU2, IDX_EA, LD_16, indexed_op_reg, ALU, ALU2);
|
||||
|
||||
IRQS = 3;
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
{
|
||||
PopulateCURINSTR(IDLE,
|
||||
RD_INC, A, IDX_EA,
|
||||
RD_INC, B, IDX_EA);
|
||||
RD_INC_OP, B, IDX_EA, LD_16, ADDR, A, B);
|
||||
|
||||
IRQS = 3;
|
||||
}
|
||||
|
@ -430,7 +430,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case I_SBC: INDEX_OP_EX4(SBC8); break; // SBC A,B
|
||||
case I_AND: INDEX_OP_EX4(AND8); break; // AND A,B
|
||||
case I_BIT: INDEX_OP_EX4(BIT); break; // BIT A,B
|
||||
case I_LD: INDEX_OP_EX4(TR); break; // LD A,B
|
||||
case I_LD: INDEX_OP_EX4(LD_8); break; // LD A,B
|
||||
case I_ST: INDEX_OP_EX4_ST(); break; // ST A,B
|
||||
case I_XOR: INDEX_OP_EX4(XOR8); break; // XOR A,B
|
||||
case I_ADC: INDEX_OP_EX4(ADC8); break; // ADC A,B
|
||||
|
|
|
@ -74,6 +74,9 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
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 MC6809()
|
||||
{
|
||||
|
@ -149,6 +152,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
public void ExecuteOne()
|
||||
{
|
||||
//Console.Write(opcode_see + " ");
|
||||
//Console.WriteLine(Regs[PC] + " ");
|
||||
switch (cur_instr[instr_pntr++])
|
||||
{
|
||||
case IDLE:
|
||||
|
@ -246,6 +250,16 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[ALU2] << 8) + Regs[ADDR]);
|
||||
PUL_n_BLD(cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LD_8:
|
||||
LD_8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LD_16:
|
||||
LD_16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LEA:
|
||||
LEA_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
|
||||
}
|
||||
break;
|
||||
case WR:
|
||||
|
@ -284,6 +298,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
case TR:
|
||||
TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LD_8:
|
||||
LD_8_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LD_16:
|
||||
LD_16_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case LEA:
|
||||
LEA_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
|
||||
break;
|
||||
case EXG:
|
||||
EXG_Func(cur_instr[instr_pntr++]);
|
||||
break;
|
||||
|
|
|
@ -150,7 +150,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
private void REG_OP_LD_16D()
|
||||
{
|
||||
PopulateCURINSTR(RD_INC, A, PC,
|
||||
RD_INC, B, PC);
|
||||
RD_INC_OP, B, PC, LD_16, ADDR, A, B);
|
||||
|
||||
IRQS = 2;
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU,
|
||||
IDLE,
|
||||
RD_INC, A, ADDR,
|
||||
RD_INC, B, ADDR);
|
||||
RD_INC_OP, B, ADDR, LD_16, ADDR, A, B);
|
||||
|
||||
IRQS = 4;
|
||||
}
|
||||
|
@ -198,7 +198,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
private void REG_OP_LD_16(ushort dest)
|
||||
{
|
||||
PopulateCURINSTR(RD_INC, ALU, PC,
|
||||
RD_INC_OP, ALU2, PC, SET_ADDR, dest, ALU, ALU2);
|
||||
RD_INC_OP, ALU2, PC, LD_16, dest, ALU, ALU2);
|
||||
|
||||
IRQS = 2;
|
||||
}
|
||||
|
@ -208,7 +208,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU,
|
||||
IDLE,
|
||||
RD_INC, ALU, ADDR,
|
||||
RD_INC_OP, ALU2, ADDR, SET_ADDR, dest, ALU, ALU2);
|
||||
RD_INC_OP, ALU2, ADDR, LD_16, dest, ALU, ALU2);
|
||||
|
||||
IRQS = 4;
|
||||
}
|
||||
|
@ -229,7 +229,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
|
||||
IDLE,
|
||||
RD_INC, ALU, ADDR,
|
||||
RD_INC_OP, ALU2, ADDR, SET_ADDR, dest, ALU, ALU2);
|
||||
RD_INC_OP, ALU2, ADDR, LD_16, dest, ALU, ALU2);
|
||||
|
||||
IRQS = 5;
|
||||
}
|
||||
|
@ -251,7 +251,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
|
||||
IDLE,
|
||||
RD_INC, A, ADDR,
|
||||
RD_INC, B, ADDR);
|
||||
RD_INC_OP, B, ADDR, LD_16, ADDR, A, B);
|
||||
|
||||
IRQS = 5;
|
||||
}
|
||||
|
@ -601,14 +601,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
}
|
||||
else if (Regs[ALU].Bit(4))
|
||||
{
|
||||
PopulateCURINSTR(RD_INC_OP, ALU2, src,
|
||||
PopulateCURINSTR(RD_INC, ALU2, src,
|
||||
RD_INC_OP, ADDR, src, SET_ADDR_PUL, X, src);
|
||||
|
||||
Regs[ALU] &= 0xE0;
|
||||
}
|
||||
else if (Regs[ALU].Bit(5))
|
||||
{
|
||||
PopulateCURINSTR(RD_INC_OP, ALU2, src,
|
||||
PopulateCURINSTR(RD_INC, ALU2, src,
|
||||
RD_INC_OP, ADDR, src, SET_ADDR_PUL, Y, src);
|
||||
|
||||
Regs[ALU] &= 0xC0;
|
||||
|
@ -617,12 +617,12 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
{
|
||||
if (src == US)
|
||||
{
|
||||
PopulateCURINSTR(RD_INC_OP, ALU2, src,
|
||||
PopulateCURINSTR(RD_INC, ALU2, src,
|
||||
RD_INC_OP, ADDR, src, SET_ADDR_PUL, SP, src);
|
||||
}
|
||||
else
|
||||
{
|
||||
PopulateCURINSTR(RD_INC_OP, ALU2, src,
|
||||
PopulateCURINSTR(RD_INC, ALU2, src,
|
||||
RD_INC_OP, ADDR, src, SET_ADDR_PUL, US, src);
|
||||
}
|
||||
|
||||
|
@ -630,7 +630,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
}
|
||||
else if (Regs[ALU].Bit(7))
|
||||
{
|
||||
PopulateCURINSTR(RD_INC_OP, ALU2, src,
|
||||
PopulateCURINSTR(RD_INC, ALU2, src,
|
||||
RD_INC_OP, ADDR, src, SET_ADDR_PUL, PC, src);
|
||||
|
||||
Regs[ALU] = 0;
|
||||
|
|
|
@ -85,6 +85,35 @@ namespace BizHawk.Emulation.Common.Components.MC6809
|
|||
Regs[dest] = Regs[src];
|
||||
}
|
||||
|
||||
public void LD_8_Func(ushort dest, ushort src)
|
||||
{
|
||||
Regs[dest] = Regs[src];
|
||||
|
||||
FlagZ = (Regs[dest] & 0xFF) == 0;
|
||||
FlagV = false;
|
||||
FlagN = (Regs[dest] & 0xFF) > 127;
|
||||
}
|
||||
|
||||
public void LD_16_Func(ushort dest, ushort src_h, ushort src_l)
|
||||
{
|
||||
Regs[dest] = (ushort)(Regs[src_h] << 8 | Regs[src_l]);
|
||||
|
||||
FlagZ = Regs[dest] == 0;
|
||||
FlagV = false;
|
||||
FlagN = Regs[dest] > 0x7FFF;
|
||||
}
|
||||
|
||||
// for LEAX/Y, zero flag can be effected, but not for U/S
|
||||
public void LEA_Func(ushort dest, ushort src)
|
||||
{
|
||||
Regs[dest] = Regs[src];
|
||||
|
||||
if ((dest == X) || (dest == Y))
|
||||
{
|
||||
FlagZ = Regs[dest] == 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void TST_Func(ushort src)
|
||||
{
|
||||
FlagZ = Regs[src] == 0;
|
||||
|
|
|
@ -17,6 +17,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
|
|||
public partial class VectrexHawk
|
||||
{
|
||||
public byte dir_dac, dir_ctrl;
|
||||
public byte reg_A, reg_B;
|
||||
|
||||
public byte portB_ret, portA_ret;
|
||||
|
||||
|
@ -111,20 +112,26 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
|
|||
case 0x0:
|
||||
wrt_val = (byte)(value & dir_ctrl);
|
||||
|
||||
portB_ret = (byte)(wrt_val | (reg_B & ~(dir_ctrl)));
|
||||
|
||||
int_fl &= 0xE7;
|
||||
update_int_fl();
|
||||
break;
|
||||
case 0x1:
|
||||
wrt_val = (byte)(value & dir_dac);
|
||||
|
||||
portA_ret = (byte)(wrt_val | (reg_A & ~(dir_dac)));
|
||||
|
||||
int_fl &= 0xFC;
|
||||
update_int_fl();
|
||||
break;
|
||||
case 0x2:
|
||||
dir_ctrl = value;
|
||||
Console.WriteLine("dir_ctrl: " + value);
|
||||
break;
|
||||
case 0x3:
|
||||
dir_dac = value;
|
||||
Console.WriteLine("dir_dac: " + value);
|
||||
break;
|
||||
case 0x4:
|
||||
t1_low = value;
|
||||
|
|
|
@ -68,6 +68,21 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
|
|||
Console.WriteLine("SHA1:" + rom.HashSHA1(0, rom.Length));
|
||||
|
||||
_rom = rom;
|
||||
|
||||
// mirror games that are too small
|
||||
if (_rom.Length < 0x8000)
|
||||
{
|
||||
_rom = new byte[0x8000];
|
||||
|
||||
for (int i = 0; i < 0x8000 / rom.Length; i++)
|
||||
{
|
||||
for (int j = 0; j < rom.Length; j++)
|
||||
{
|
||||
_rom[j + i * rom.Length] = rom[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Setup_Mapper();
|
||||
|
||||
_frameHz = 60;
|
||||
|
@ -114,6 +129,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
|
|||
private void Setup_Mapper()
|
||||
{
|
||||
mapper = new MapperDefault();
|
||||
mapper.Core = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue