#include "Processor.h"
void Processor::OPCodeED0x40()
{
OPCodes_IN_C(BC.GetHighRegister());
}
void Processor::OPCodeED0x41()
{
OPCodes_OUT_C(BC.GetHighRegister());
}
void Processor::OPCodeED0x42()
{
OPCodes_SBC_HL(BC.GetValue());
}
void Processor::OPCodeED0x43()
{
OPCodes_LD_nn_dd(&BC);
}
void Processor::OPCodeED0x44()
{
u8 value = AF.GetHigh();
AF.SetHigh(0x00);
OPCodes_SUB(value);
}
void Processor::OPCodeED0x45()
{
OPCodes_RET();
m_bIFF1 = m_bIFF2;
}
void Processor::OPCodeED0x46()
{
SetInterruptMode(0);
}
void Processor::OPCodeED0x47()
{
OPCodes_LD(&I, AF.GetHigh());
}
void Processor::OPCodeED0x48()
{
OPCodes_IN_C(BC.GetLowRegister());
}
void Processor::OPCodeED0x49()
{
OPCodes_OUT_C(BC.GetLowRegister());
}
void Processor::OPCodeED0x4A()
{
OPCodes_ADC_HL(BC.GetValue());
}
void Processor::OPCodeED0x4B()
{
OPCodes_LD_dd_nn(&BC);
}
void Processor::OPCodeED0x4C()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x4D()
{
OPCodes_RET();
m_bIFF1 = m_bIFF2;
}
void Processor::OPCodeED0x4E()
{
UndocumentedOPCode();
OPCodeED0x46();
}
void Processor::OPCodeED0x4F()
{
OPCodes_LD(&R, AF.GetHigh());
}
void Processor::OPCodeED0x50()
{
OPCodes_IN_C(DE.GetHighRegister());
}
void Processor::OPCodeED0x51()
{
OPCodes_OUT_C(DE.GetHighRegister());
}
void Processor::OPCodeED0x52()
{
OPCodes_SBC_HL(DE.GetValue());
}
void Processor::OPCodeED0x53()
{
OPCodes_LD_nn_dd(&DE);
}
void Processor::OPCodeED0x54()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x55()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x56()
{
SetInterruptMode(1);
}
void Processor::OPCodeED0x57()
{
u8 value = I;
OPCodes_LD(AF.GetHighRegister(), value);
ToggleSignFlagFromResult(value);
ToggleZeroFlagFromResult(value);
ToggleXYFlagsFromResult(value);
ClearFlag(FLAG_HALF);
ClearFlag(FLAG_NEGATIVE);
if (m_bIFF2)
ToggleFlag(FLAG_PARITY);
else
ClearFlag(FLAG_PARITY);
}
void Processor::OPCodeED0x58()
{
OPCodes_IN_C(DE.GetLowRegister());
}
void Processor::OPCodeED0x59()
{
OPCodes_OUT_C(DE.GetLowRegister());
}
void Processor::OPCodeED0x5A()
{
OPCodes_ADC_HL(DE.GetValue());
}
void Processor::OPCodeED0x5B()
{
OPCodes_LD_dd_nn(&DE);
}
void Processor::OPCodeED0x5C()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x5D()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x5E()
{
SetInterruptMode(2);
}
void Processor::OPCodeED0x5F()
{
u8 value = R;
OPCodes_LD(AF.GetHighRegister(), value);
ToggleSignFlagFromResult(value);
ToggleZeroFlagFromResult(value);
ToggleXYFlagsFromResult(value);
ClearFlag(FLAG_HALF);
ClearFlag(FLAG_NEGATIVE);
if (m_bIFF2)
ToggleFlag(FLAG_PARITY);
else
ClearFlag(FLAG_PARITY);
}
void Processor::OPCodeED0x60()
{
OPCodes_IN_C(HL.GetHighRegister());
}
void Processor::OPCodeED0x61()
{
OPCodes_OUT_C(HL.GetHighRegister());
}
void Processor::OPCodeED0x62()
{
OPCodes_SBC_HL(HL.GetValue());
}
void Processor::OPCodeED0x63()
{
OPCodes_LD_nn_dd(&HL);
}
void Processor::OPCodeED0x64()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x65()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x66()
{
UndocumentedOPCode();
OPCodeED0x46();
}
void Processor::OPCodeED0x67()
{
u16 address = HL.GetValue();
u8 value = m_pMemory->Read(address);
u8 result = (AF.GetHigh() & 0xF0) | (value & 0x0F);
m_pMemory->Write(address, ((AF.GetHigh() << 4) & 0xF0) | ((value >> 4) & 0x0F));
AF.SetHigh(result);
IsSetFlag(FLAG_CARRY) ? SetFlag(FLAG_CARRY) : ClearAllFlags();
ToggleZeroFlagFromResult(result);
ToggleSignFlagFromResult(result);
ToggleParityFlagFromResult(result);
ToggleXYFlagsFromResult(result);
WZ.SetValue(address + 1);
}
void Processor::OPCodeED0x68()
{
OPCodes_IN_C(HL.GetLowRegister());
}
void Processor::OPCodeED0x69()
{
OPCodes_OUT_C(HL.GetLowRegister());
}
void Processor::OPCodeED0x6A()
{
OPCodes_ADC_HL(HL.GetValue());
}
void Processor::OPCodeED0x6B()
{
OPCodes_LD_dd_nn(&HL);
}
void Processor::OPCodeED0x6C()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x6D()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x6E()
{
UndocumentedOPCode();
OPCodeED0x46();
}
void Processor::OPCodeED0x6F()
{
u16 address = HL.GetValue();
u8 value = m_pMemory->Read(address);
u8 result = (AF.GetHigh() & 0xF0) | ((value >> 4) & 0x0F);
m_pMemory->Write(address, ((value << 4) & 0xF0) | (AF.GetHigh() & 0x0F));
AF.SetHigh(result);
IsSetFlag(FLAG_CARRY) ? SetFlag(FLAG_CARRY) : ClearAllFlags();
ToggleZeroFlagFromResult(result);
ToggleSignFlagFromResult(result);
ToggleParityFlagFromResult(result);
ToggleXYFlagsFromResult(result);
WZ.SetValue(address + 1);
}
void Processor::OPCodeED0x70()
{
UndocumentedOPCode();
OPCodes_IN_C(NULL);
}
void Processor::OPCodeED0x71()
{
UndocumentedOPCode();
m_pIOPorts->Out(BC.GetLow(), 0);
}
void Processor::OPCodeED0x72()
{
OPCodes_SBC_HL(SP.GetValue());
}
void Processor::OPCodeED0x73()
{
OPCodes_LD_nn_dd(&SP);
}
void Processor::OPCodeED0x74()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x75()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x76()
{
UndocumentedOPCode();
OPCodeED0x56();
}
void Processor::OPCodeED0x78()
{
OPCodes_IN_C(AF.GetHighRegister());
WZ.SetValue(BC.GetValue() + 1);
}
void Processor::OPCodeED0x79()
{
OPCodes_OUT_C(AF.GetHighRegister());
WZ.SetValue(BC.GetValue() + 1);
}
void Processor::OPCodeED0x7A()
{
OPCodes_ADC_HL(SP.GetValue());
}
void Processor::OPCodeED0x7B()
{
OPCodes_LD_dd_nn(&SP);
}
void Processor::OPCodeED0x7C()
{
UndocumentedOPCode();
OPCodeED0x44();
}
void Processor::OPCodeED0x7D()
{
UndocumentedOPCode();
OPCodeED0x45();
}
void Processor::OPCodeED0x7E()
{
UndocumentedOPCode();
OPCodeED0x5E();
}
void Processor::OPCodeED0xA0()
{
OPCodes_LDI();
}
void Processor::OPCodeED0xA1()
{
OPCodes_CPI();
}
void Processor::OPCodeED0xA2()
{
OPCodes_INI();
}
void Processor::OPCodeED0xA3()
{
OPCodes_OUTI();
}
void Processor::OPCodeED0xA8()
{
OPCodes_LDD();
}
void Processor::OPCodeED0xA9()
{
OPCodes_CPD();
}
void Processor::OPCodeED0xAA()
{
OPCodes_IND();
}
void Processor::OPCodeED0xAB()
{
OPCodes_OUTD();
}
void Processor::OPCodeED0xB0()
{
OPCodes_LDI();
if (BC.GetValue() != 0)
{
PC.Decrement();
PC.Decrement();
WZ.SetValue(PC.GetValue() + 1);
m_iTStates += 5;
}
}
void Processor::OPCodeED0xB1()
{
OPCodes_CPI();
if ((BC.GetValue() != 0) && !IsSetFlag(FLAG_ZERO))
{
PC.Decrement();
PC.Decrement();
WZ.SetValue(PC.GetValue() + 1);
m_iTStates += 5;
}
}
void Processor::OPCodeED0xB2()
{
OPCodes_INI();
if (BC.GetHigh() != 0)
{
PC.Decrement();
PC.Decrement();
m_iTStates += 5;
}
}
void Processor::OPCodeED0xB3()
{
OPCodes_OUTI();
if (BC.GetHigh() != 0)
{
PC.Decrement();
PC.Decrement();
m_iTStates += 5;
}
}
void Processor::OPCodeED0xB8()
{
OPCodes_LDD();
if (BC.GetValue() != 0)
{
PC.Decrement();
PC.Decrement();
WZ.SetValue(PC.GetValue() + 1);
m_iTStates += 5;
}
}
void Processor::OPCodeED0xB9()
{
OPCodes_CPD();
if ((BC.GetValue() != 0) && !IsSetFlag(FLAG_ZERO))
{
PC.Decrement();
PC.Decrement();
WZ.SetValue(PC.GetValue() + 1);
m_iTStates += 5;
}
}
void Processor::OPCodeED0xBA()
{
OPCodes_IND();
if (BC.GetHigh() != 0)
{
PC.Decrement();
PC.Decrement();
m_iTStates += 5;
}
}
void Processor::OPCodeED0xBB()
{
OPCodes_OUTD();
if (BC.GetHigh() != 0)
{
PC.Decrement();
PC.Decrement();
m_iTStates += 5;
}
}