-Fixed the overflow calculation for ADDR, SUBR, and CMPR.

-Implemented the remaining XXX@ ops.
This commit is contained in:
brandman211 2012-07-28 17:20:16 +00:00
parent 188e5662ca
commit 748efbcd20
1 changed files with 147 additions and 7 deletions

View File

@ -634,9 +634,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
result = Register[dest] + Register[src];
src_value = Register[src];
dest_value = Register[dest];
result = dest_value + src_value;
Calc_FlagC(result);
Calc_FlagO_Add(dest, src);
Calc_FlagO_Add(dest_value, src_value);
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
@ -711,9 +713,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
src_value = Register[src];
dest_value = Register[dest];
result = Register[dest] - Register[src];
Calc_FlagC(result);
Calc_FlagO_Add(ones, 1);
Calc_FlagO_Add(dest_value, -src_value);
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
@ -788,9 +792,11 @@ namespace BizHawk.Emulation.CPUs.CP1610
throw new NotImplementedException();
src = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
result = Register[dest] - Register[src];
src_value = Register[src];
dest_value = Register[dest];
result = dest_value - src_value;
Calc_FlagC(result);
Calc_FlagO_Add(ones, 1);
Calc_FlagO_Add(dest_value, -src_value);
Calc_FlagS(result);
Calc_FlagZ(result);
PendingCycles -= 6; TotalExecutedCycles += 6;
@ -1364,9 +1370,9 @@ namespace BizHawk.Emulation.CPUs.CP1610
if (mem >= 0x4 && mem != 0x6)
Register[mem]++;
dest_value = Register[dest];
result = mem_read + dest_value;
result = dest_value + mem_read;
Calc_FlagC(result);
Calc_FlagO_Add(mem_read, dest_value);
Calc_FlagO_Add(dest_value, mem_read);
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
@ -1440,6 +1446,42 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x33E:
case 0x33F:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
// Auto-decrement the stack pointer if it's the memory register.
if (mem == 0x6)
RegisterSP--;
if (!FlagD)
{
mem_read = ReadMemory(Register[mem]);
if (mem != 0x6)
{
PendingCycles -= 8; TotalExecutedCycles += 8;
}
else
{
PendingCycles -= 11; TotalExecutedCycles += 11;
}
}
else
{
// Double Byte Data.
mem_read = (ushort)(ReadMemory(Register[mem]++) << 8);
mem_read |= (ushort)(ReadMemory(Register[mem]) & 0xFF);
PendingCycles -= 10; TotalExecutedCycles += 10;
}
// Auto-increment the memory register if it does so on write.
if (mem >= 0x4 && mem != 0x6)
Register[mem]++;
dest_value = Register[dest];
result = dest_value - mem_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -mem_read);
Calc_FlagS(result);
Calc_FlagZ(result);
result &= 0xFFFF;
Register[dest] = (ushort)result;
break;
// CMP
case 0x340:
case 0x341:
@ -1508,6 +1550,40 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x37E:
case 0x37F:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
// Auto-decrement the stack pointer if it's the memory register.
if (mem == 0x6)
RegisterSP--;
if (!FlagD)
{
mem_read = ReadMemory(Register[mem]);
if (mem != 0x6)
{
PendingCycles -= 8; TotalExecutedCycles += 8;
}
else
{
PendingCycles -= 11; TotalExecutedCycles += 11;
}
}
else
{
// Double Byte Data.
mem_read = (ushort)(ReadMemory(Register[mem]++) << 8);
mem_read |= (ushort)(ReadMemory(Register[mem]) & 0xFF);
PendingCycles -= 10; TotalExecutedCycles += 10;
}
// Auto-increment the memory register if it does so on write.
if (mem >= 0x4 && mem != 0x6)
Register[mem]++;
dest_value = Register[dest];
result = dest_value - mem_read;
Calc_FlagC(result);
Calc_FlagO_Add(dest_value, -mem_read);
Calc_FlagS(result);
Calc_FlagZ(result);
break;
// AND
case 0x380:
case 0x381:
@ -1576,6 +1652,38 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x3BE:
case 0x3BF:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
// Auto-decrement the stack pointer if it's the memory register.
if (mem == 0x6)
RegisterSP--;
if (!FlagD)
{
mem_read = ReadMemory(Register[mem]);
if (mem != 0x6)
{
PendingCycles -= 8; TotalExecutedCycles += 8;
}
else
{
PendingCycles -= 11; TotalExecutedCycles += 11;
}
}
else
{
// Double Byte Data.
mem_read = (ushort)(ReadMemory(Register[mem]++) << 8);
mem_read |= (ushort)(ReadMemory(Register[mem]) & 0xFF);
PendingCycles -= 10; TotalExecutedCycles += 10;
}
// Auto-increment the memory register if it does so on write.
if (mem >= 0x4 && mem != 0x6)
Register[mem]++;
result = Register[dest] & mem_read;
Calc_FlagS(result);
Calc_FlagZ(result);
Register[dest] = (ushort)result;
break;
// XOR
case 0x3C0:
case 0x3C1:
@ -1644,6 +1752,38 @@ namespace BizHawk.Emulation.CPUs.CP1610
case 0x3FE:
case 0x3FF:
throw new NotImplementedException();
mem = (byte)((opcode >> 3) & 0x7);
dest = (byte)(opcode & 0x7);
// Auto-decrement the stack pointer if it's the memory register.
if (mem == 0x6)
RegisterSP--;
if (!FlagD)
{
mem_read = ReadMemory(Register[mem]);
if (mem != 0x6)
{
PendingCycles -= 8; TotalExecutedCycles += 8;
}
else
{
PendingCycles -= 11; TotalExecutedCycles += 11;
}
}
else
{
// Double Byte Data.
mem_read = (ushort)(ReadMemory(Register[mem]++) << 8);
mem_read |= (ushort)(ReadMemory(Register[mem]) & 0xFF);
PendingCycles -= 10; TotalExecutedCycles += 10;
}
// Auto-increment the memory register if it does so on write.
if (mem >= 0x4 && mem != 0x6)
Register[mem]++;
result = Register[dest] ^ mem_read;
Calc_FlagS(result);
Calc_FlagZ(result);
Register[dest] = (ushort)result;
break;
}
LogData();
}