Vectrex: More bug fixes

This commit is contained in:
alyosha-tas 2019-06-01 12:25:30 -04:00
parent 65e350ef7d
commit dd0d34593e
8 changed files with 98 additions and 21 deletions

View File

@ -1 +1,3 @@
SHA1:67F8513958C04E936B135740ED4EC6E6FA1763D5 Clean Sweep VEC SHA1:67F8513958C04E936B135740ED4EC6E6FA1763D5 Clean Sweep VEC
SHA1:38E38B5C60466146D4648F8929B5CE3A08DCBE0D Scramble VEC

View File

@ -157,7 +157,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case 0x83: IMD_OP_D(SUB16, D); break; // SUBD (Immediate) case 0x83: IMD_OP_D(SUB16, D); break; // SUBD (Immediate)
case 0x84: REG_OP_IMD(AND8, A); break; // ANDA (Immediate) case 0x84: REG_OP_IMD(AND8, A); break; // ANDA (Immediate)
case 0x85: REG_OP_IMD(BIT, A); break; // BITA (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 0x87: ILLEGAL(); break; // ILLEGAL
case 0x88: REG_OP_IMD(XOR8, A); break; // EORA (Immediate) case 0x88: REG_OP_IMD(XOR8, A); break; // EORA (Immediate)
case 0x89: REG_OP_IMD(ADC8, A); break; // ADCA (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 0x93: DIR_OP_D(SUB16, D); break; // SUBD (Direct)
case 0x94: DIRECT_MEM_4(AND8, A); break; // ANDA (Direct) case 0x94: DIRECT_MEM_4(AND8, A); break; // ANDA (Direct)
case 0x95: DIRECT_MEM_4(BIT, A); break; // BITA (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 0x97: DIRECT_ST_4(A); break; // STA (Direct)
case 0x98: DIRECT_MEM_4(XOR8, A); break; // EORA (Direct) case 0x98: DIRECT_MEM_4(XOR8, A); break; // EORA (Direct)
case 0x99: DIRECT_MEM_4(ADC8, A); break; // ADCA (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 0xB3: EXT_OP_D(SUB16, D); break; // SUBD (Extended)
case 0xB4: EXT_REG(AND8, A); break; // ANDA (Extended) case 0xB4: EXT_REG(AND8, A); break; // ANDA (Extended)
case 0xB5: EXT_REG(BIT, A); break; // BITA (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 0xB7: EXT_ST(A); break; // STA (Extended)
case 0xB8: EXT_REG(XOR8, A); break; // EORA (Extended) case 0xB8: EXT_REG(XOR8, A); break; // EORA (Extended)
case 0xB9: EXT_REG(ADC8, A); break; // ADCA (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 0xC3: IMD_OP_D(ADD16, D); break; // ADDD (Immediate)
case 0xC4: REG_OP_IMD(AND8, B); break; // ANDB (Immediate) case 0xC4: REG_OP_IMD(AND8, B); break; // ANDB (Immediate)
case 0xC5: REG_OP_IMD(BIT, B); break; // BITB (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 0xC7: ILLEGAL(); break; // ILLEGAL
case 0xC8: REG_OP_IMD(XOR8, B); break; // EORB (Immediate) case 0xC8: REG_OP_IMD(XOR8, B); break; // EORB (Immediate)
case 0xC9: REG_OP_IMD(ADC8, B); break; // ADCB (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 0xD3: DIR_OP_D(ADD16, D); break; // ADDD (Direct)
case 0xD4: DIRECT_MEM_4(AND8, B); break; // ANDB (Direct) case 0xD4: DIRECT_MEM_4(AND8, B); break; // ANDB (Direct)
case 0xD5: DIRECT_MEM_4(BIT, B); break; // BITB (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 0xD7: DIRECT_ST_4(B); break; // STB (Direct)
case 0xD8: DIRECT_MEM_4(XOR8, B); break; // EORB (Direct) case 0xD8: DIRECT_MEM_4(XOR8, B); break; // EORB (Direct)
case 0xD9: DIRECT_MEM_4(ADC8, B); break; // ADCB (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 0xF3: EXT_OP_D(ADD16, D); break; // ADDD (Extended)
case 0xF4: EXT_REG(AND8, B); break; // ANDB (Extended) case 0xF4: EXT_REG(AND8, B); break; // ANDB (Extended)
case 0xF5: EXT_REG(BIT, B); break; // BITB (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 0xF7: EXT_ST(B); break; // STB (Extended)
case 0xF8: EXT_REG(XOR8, B); break; // EORB (Extended) case 0xF8: EXT_REG(XOR8, B); break; // EORB (Extended)
case 0xF9: EXT_REG(ADC8, B); break; // ADCB (Extended) case 0xF9: EXT_REG(ADC8, B); break; // ADCB (Extended)

View File

@ -86,7 +86,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void INDEX_OP_LEA(ushort dest) private void INDEX_OP_LEA(ushort dest)
{ {
PopulateCURINSTR(TR, dest, IDX_EA, PopulateCURINSTR(LEA, dest, IDX_EA,
IDLE); IDLE);
IRQS = 2; IRQS = 2;
@ -96,7 +96,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{ {
PopulateCURINSTR(IDLE, PopulateCURINSTR(IDLE,
RD_INC, ALU, IDX_EA, 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; IRQS = 3;
} }
@ -114,7 +114,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{ {
PopulateCURINSTR(IDLE, PopulateCURINSTR(IDLE,
RD_INC, A, IDX_EA, RD_INC, A, IDX_EA,
RD_INC, B, IDX_EA); RD_INC_OP, B, IDX_EA, LD_16, ADDR, A, B);
IRQS = 3; 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_SBC: INDEX_OP_EX4(SBC8); break; // SBC A,B
case I_AND: INDEX_OP_EX4(AND8); break; // AND 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_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_ST: INDEX_OP_EX4_ST(); break; // ST A,B
case I_XOR: INDEX_OP_EX4(XOR8); break; // XOR A,B case I_XOR: INDEX_OP_EX4(XOR8); break; // XOR A,B
case I_ADC: INDEX_OP_EX4(ADC8); break; // ADC A,B case I_ADC: INDEX_OP_EX4(ADC8); break; // ADC A,B

View File

@ -74,6 +74,9 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public const ushort CMP16 = 63; public const ushort CMP16 = 63;
public const ushort CMP16D = 64; public const ushort CMP16D = 64;
public const ushort WR_HI_INC = 65; 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() public MC6809()
{ {
@ -149,6 +152,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
public void ExecuteOne() public void ExecuteOne()
{ {
//Console.Write(opcode_see + " "); //Console.Write(opcode_see + " ");
//Console.WriteLine(Regs[PC] + " ");
switch (cur_instr[instr_pntr++]) switch (cur_instr[instr_pntr++])
{ {
case IDLE: case IDLE:
@ -246,6 +250,16 @@ namespace BizHawk.Emulation.Common.Components.MC6809
Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[ALU2] << 8) + Regs[ADDR]); Regs[cur_instr[instr_pntr++]] = (ushort)((Regs[ALU2] << 8) + Regs[ADDR]);
PUL_n_BLD(cur_instr[instr_pntr++]); PUL_n_BLD(cur_instr[instr_pntr++]);
break; 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; break;
case WR: case WR:
@ -284,6 +298,15 @@ namespace BizHawk.Emulation.Common.Components.MC6809
case TR: case TR:
TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]); TR_Func(cur_instr[instr_pntr++], cur_instr[instr_pntr++]);
break; 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: case EXG:
EXG_Func(cur_instr[instr_pntr++]); EXG_Func(cur_instr[instr_pntr++]);
break; break;

View File

@ -150,7 +150,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void REG_OP_LD_16D() private void REG_OP_LD_16D()
{ {
PopulateCURINSTR(RD_INC, A, PC, PopulateCURINSTR(RD_INC, A, PC,
RD_INC, B, PC); RD_INC_OP, B, PC, LD_16, ADDR, A, B);
IRQS = 2; IRQS = 2;
} }
@ -160,7 +160,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU, PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU,
IDLE, IDLE,
RD_INC, A, ADDR, RD_INC, A, ADDR,
RD_INC, B, ADDR); RD_INC_OP, B, ADDR, LD_16, ADDR, A, B);
IRQS = 4; IRQS = 4;
} }
@ -198,7 +198,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
private void REG_OP_LD_16(ushort dest) private void REG_OP_LD_16(ushort dest)
{ {
PopulateCURINSTR(RD_INC, ALU, PC, 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; IRQS = 2;
} }
@ -208,7 +208,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU, PopulateCURINSTR(RD_INC_OP, ALU, PC, SET_ADDR, ADDR, DP, ALU,
IDLE, IDLE,
RD_INC, ALU, ADDR, 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; IRQS = 4;
} }
@ -229,7 +229,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2, RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
IDLE, IDLE,
RD_INC, ALU, ADDR, 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; IRQS = 5;
} }
@ -251,7 +251,7 @@ namespace BizHawk.Emulation.Common.Components.MC6809
RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2, RD_INC_OP, ALU2, PC, SET_ADDR, ADDR, ALU, ALU2,
IDLE, IDLE,
RD_INC, A, ADDR, RD_INC, A, ADDR,
RD_INC, B, ADDR); RD_INC_OP, B, ADDR, LD_16, ADDR, A, B);
IRQS = 5; IRQS = 5;
} }
@ -601,14 +601,14 @@ namespace BizHawk.Emulation.Common.Components.MC6809
} }
else if (Regs[ALU].Bit(4)) 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); RD_INC_OP, ADDR, src, SET_ADDR_PUL, X, src);
Regs[ALU] &= 0xE0; Regs[ALU] &= 0xE0;
} }
else if (Regs[ALU].Bit(5)) 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); RD_INC_OP, ADDR, src, SET_ADDR_PUL, Y, src);
Regs[ALU] &= 0xC0; Regs[ALU] &= 0xC0;
@ -617,12 +617,12 @@ namespace BizHawk.Emulation.Common.Components.MC6809
{ {
if (src == US) if (src == US)
{ {
PopulateCURINSTR(RD_INC_OP, ALU2, src, PopulateCURINSTR(RD_INC, ALU2, src,
RD_INC_OP, ADDR, src, SET_ADDR_PUL, SP, src); RD_INC_OP, ADDR, src, SET_ADDR_PUL, SP, src);
} }
else else
{ {
PopulateCURINSTR(RD_INC_OP, ALU2, src, PopulateCURINSTR(RD_INC, ALU2, src,
RD_INC_OP, ADDR, src, SET_ADDR_PUL, US, 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)) 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); RD_INC_OP, ADDR, src, SET_ADDR_PUL, PC, src);
Regs[ALU] = 0; Regs[ALU] = 0;

View File

@ -85,6 +85,35 @@ namespace BizHawk.Emulation.Common.Components.MC6809
Regs[dest] = Regs[src]; 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) public void TST_Func(ushort src)
{ {
FlagZ = Regs[src] == 0; FlagZ = Regs[src] == 0;

View File

@ -17,6 +17,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
public partial class VectrexHawk public partial class VectrexHawk
{ {
public byte dir_dac, dir_ctrl; public byte dir_dac, dir_ctrl;
public byte reg_A, reg_B;
public byte portB_ret, portA_ret; public byte portB_ret, portA_ret;
@ -111,20 +112,26 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
case 0x0: case 0x0:
wrt_val = (byte)(value & dir_ctrl); wrt_val = (byte)(value & dir_ctrl);
portB_ret = (byte)(wrt_val | (reg_B & ~(dir_ctrl)));
int_fl &= 0xE7; int_fl &= 0xE7;
update_int_fl(); update_int_fl();
break; break;
case 0x1: case 0x1:
wrt_val = (byte)(value & dir_dac); wrt_val = (byte)(value & dir_dac);
portA_ret = (byte)(wrt_val | (reg_A & ~(dir_dac)));
int_fl &= 0xFC; int_fl &= 0xFC;
update_int_fl(); update_int_fl();
break; break;
case 0x2: case 0x2:
dir_ctrl = value; dir_ctrl = value;
Console.WriteLine("dir_ctrl: " + value);
break; break;
case 0x3: case 0x3:
dir_dac = value; dir_dac = value;
Console.WriteLine("dir_dac: " + value);
break; break;
case 0x4: case 0x4:
t1_low = value; t1_low = value;

View File

@ -68,6 +68,21 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
Console.WriteLine("SHA1:" + rom.HashSHA1(0, rom.Length)); Console.WriteLine("SHA1:" + rom.HashSHA1(0, rom.Length));
_rom = rom; _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(); Setup_Mapper();
_frameHz = 60; _frameHz = 60;
@ -114,6 +129,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Vectrex
private void Setup_Mapper() private void Setup_Mapper()
{ {
mapper = new MapperDefault(); mapper = new MapperDefault();
mapper.Core = this;
} }
} }
} }