mirror of https://github.com/bsnes-emu/bsnes.git
142 lines
2.7 KiB
C++
142 lines
2.7 KiB
C++
auto LR35902::ADD(uint8 target, uint8 source, bool carry) -> uint8 {
|
|
uint16 x = target + source + carry;
|
|
uint16 y = (uint4)target + (uint4)source + carry;
|
|
CF = x > 0xff;
|
|
HF = y > 0x0f;
|
|
NF = 0;
|
|
ZF = (uint8)x == 0;
|
|
return x;
|
|
}
|
|
|
|
auto LR35902::AND(uint8 target, uint8 source) -> uint8 {
|
|
target &= source;
|
|
CF = 0;
|
|
HF = 1;
|
|
NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::BIT(uint3 index, uint8 target) -> void {
|
|
HF = 1;
|
|
NF = 0;
|
|
ZF = target.bit(index) == 0;
|
|
}
|
|
|
|
auto LR35902::CP(uint8 target, uint8 source) -> void {
|
|
uint16 x = target - source;
|
|
uint16 y = (uint4)target - (uint4)source;
|
|
CF = x > 0xff;
|
|
HF = y > 0x0f;
|
|
NF = 1;
|
|
ZF = (uint8)x == 0;
|
|
}
|
|
|
|
auto LR35902::DEC(uint8 target) -> uint8 {
|
|
target--;
|
|
HF = (uint4)target == 0x0f;
|
|
NF = 1;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::INC(uint8 target) -> uint8 {
|
|
target++;
|
|
HF = (uint4)target == 0x00;
|
|
NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::OR(uint8 target, uint8 source) -> uint8 {
|
|
target |= source;
|
|
CF = HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::RL(uint8 target) -> uint8 {
|
|
bool carry = target.bit(7);
|
|
target = target << 1 | CF;
|
|
CF = carry;
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::RLC(uint8 target) -> uint8 {
|
|
target = target << 1 | target >> 7;
|
|
CF = target.bit(0);
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::RR(uint8 target) -> uint8 {
|
|
bool carry = target.bit(0);
|
|
target = CF << 7 | target >> 1;
|
|
CF = carry;
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::RRC(uint8 target) -> uint8 {
|
|
target = target << 7 | target >> 1;
|
|
CF = target.bit(7);
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::SLA(uint8 target) -> uint8 {
|
|
bool carry = target.bit(7);
|
|
target <<= 1;
|
|
CF = carry;
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::SRA(uint8 target) -> uint8 {
|
|
bool carry = target.bit(0);
|
|
target = (int8)target >> 1;
|
|
CF = carry;
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::SRL(uint8 target) -> uint8 {
|
|
bool carry = target.bit(0);
|
|
target >>= 1;
|
|
CF = carry;
|
|
HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::SUB(uint8 target, uint8 source, bool carry) -> uint8 {
|
|
uint16 x = target - source - carry;
|
|
uint16 y = (uint4)target - (uint4)source - carry;
|
|
CF = x > 0xff;
|
|
HF = y > 0x0f;
|
|
NF = 1;
|
|
ZF = (uint8)x == 0;
|
|
return x;
|
|
}
|
|
|
|
auto LR35902::SWAP(uint8 target) -> uint8 {
|
|
target = target << 4 | target >> 4;
|
|
CF = HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|
|
|
|
auto LR35902::XOR(uint8 target, uint8 source) -> uint8 {
|
|
target ^= source;
|
|
CF = HF = NF = 0;
|
|
ZF = target == 0;
|
|
return target;
|
|
}
|