mirror of https://github.com/bsnes-emu/bsnes.git
Update to v101r23 release.
byuu says: This is a really tiny WIP. Just wanted to add the known fixes before I start debugging it against Mednafen in a fork. Changelog: - Z80: fixed flag calculations on 8-bit ADC, ADD, SBC, SUB - Z80: fixed flag calculations on 16-bit ADD - Z80: simplified DAA logic \[AWJ\] - Z80: RETI sets IFF1=IFF2 (same as RETN)
This commit is contained in:
parent
c2c957a9da
commit
1d7b674dd4
|
@ -12,7 +12,7 @@ using namespace nall;
|
||||||
|
|
||||||
namespace Emulator {
|
namespace Emulator {
|
||||||
static const string Name = "higan";
|
static const string Name = "higan";
|
||||||
static const string Version = "101.22";
|
static const string Version = "101.23";
|
||||||
static const string Author = "byuu";
|
static const string Author = "byuu";
|
||||||
static const string License = "GPLv3";
|
static const string License = "GPLv3";
|
||||||
static const string Website = "http://byuu.org/";
|
static const string Website = "http://byuu.org/";
|
||||||
|
|
|
@ -15,11 +15,11 @@ auto Z80::ADD(uint8 x, uint8 y, bool c) -> uint8 {
|
||||||
|
|
||||||
CF = z.bit(8);
|
CF = z.bit(8);
|
||||||
NF = 0;
|
NF = 0;
|
||||||
VF = ~(x ^ y) & (x ^ z) & 0x80;
|
VF = uint8(~(x ^ y) & (x ^ z)).bit(7);
|
||||||
XF = z.bit(3);
|
XF = z.bit(3);
|
||||||
HF = (x ^ y ^ z) & 0x10;
|
HF = uint8(x ^ y ^ z).bit(4);
|
||||||
YF = z.bit(5);
|
YF = z.bit(5);
|
||||||
ZF = (uint8)z == 0;
|
ZF = uint8(z) == 0;
|
||||||
SF = z.bit(7);
|
SF = z.bit(7);
|
||||||
|
|
||||||
return z;
|
return z;
|
||||||
|
@ -230,11 +230,11 @@ auto Z80::SUB(uint8 x, uint8 y, bool c) -> uint8 {
|
||||||
|
|
||||||
CF = z.bit(8);
|
CF = z.bit(8);
|
||||||
NF = 1;
|
NF = 1;
|
||||||
VF = (x ^ y) & (x ^ z) & 0x80;
|
VF = uint8((x ^ y) & (x ^ z)).bit(7);
|
||||||
XF = z.bit(3);
|
XF = z.bit(3);
|
||||||
HF = (x ^ y ^ z) & 0x10;
|
HF = uint8(x ^ y ^ z).bit(4);
|
||||||
YF = z.bit(5);
|
YF = z.bit(5);
|
||||||
ZF = (uint8)z == 0;
|
ZF = uint8(z) == 0;
|
||||||
SF = z.bit(7);
|
SF = z.bit(7);
|
||||||
|
|
||||||
return z;
|
return z;
|
||||||
|
@ -291,12 +291,13 @@ auto Z80::instructionADD_a_r(uint8& x) -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Z80::instructionADD_hl_rr(uint16& x) -> void {
|
auto Z80::instructionADD_hl_rr(uint16& x) -> void {
|
||||||
|
auto vf = VF, zf = ZF, sf = SF;
|
||||||
wait(4);
|
wait(4);
|
||||||
auto lo = ADD(HL >> 0, x >> 0);
|
auto lo = ADD(HL >> 0, x >> 0);
|
||||||
wait(3);
|
wait(3);
|
||||||
auto hi = ADD(HL >> 8, x >> 8, CF);
|
auto hi = ADD(HL >> 8, x >> 8, CF);
|
||||||
HL = hi << 8 | lo << 0;
|
HL = hi << 8 | lo << 0;
|
||||||
ZF = HL == 0;
|
VF = vf, ZF = zf, SF = sf; //restore unaffected flags
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Z80::instructionAND_a_irr(uint16& x) -> void {
|
auto Z80::instructionAND_a_irr(uint16& x) -> void {
|
||||||
|
@ -390,27 +391,13 @@ auto Z80::instructionCPL() -> void {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Z80::instructionDAA() -> void {
|
auto Z80::instructionDAA() -> void {
|
||||||
uint8 lo = A.bits(0,3);
|
auto a = A;
|
||||||
uint8 hi = A.bits(4,7);
|
if(CF || (A.bits(0,7) > 0x99)) { A += NF ? -0x60 : 0x60; CF = 1; }
|
||||||
uint8 diff;
|
if(HF || (A.bits(0,3) > 0x09)) { A += NF ? -0x06 : 0x06; }
|
||||||
|
|
||||||
if(CF) {
|
|
||||||
diff = lo <= 9 && !HF ? 0x60 : 0x66;
|
|
||||||
} else if(lo >= 10) {
|
|
||||||
diff = hi <= 8 ? 0x06 : 0x66;
|
|
||||||
} else if(hi >= 10) {
|
|
||||||
diff = HF ? 0x66 : 0x60;
|
|
||||||
} else {
|
|
||||||
diff = HF ? 0x06 : 0x00;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(NF == 0) A += diff;
|
|
||||||
if(NF == 1) A -= diff;
|
|
||||||
|
|
||||||
CF = CF || (lo <= 9 ? hi >= 10 : hi >= 9);
|
|
||||||
PF = parity(A);
|
PF = parity(A);
|
||||||
XF = A.bit(3);
|
XF = A.bit(3);
|
||||||
HF = NF ? (HF && lo <= 5) : (lo >= 10);
|
HF = uint8(A ^ a).bit(4);
|
||||||
YF = A.bit(5);
|
YF = A.bit(5);
|
||||||
ZF = A == 0;
|
ZF = A == 0;
|
||||||
SF = A.bit(7);
|
SF = A.bit(7);
|
||||||
|
@ -724,7 +711,7 @@ auto Z80::instructionRET_c(bool c) -> void {
|
||||||
|
|
||||||
auto Z80::instructionRETI() -> void {
|
auto Z80::instructionRETI() -> void {
|
||||||
PC = pop();
|
PC = pop();
|
||||||
//todo: there's more to RETI than just PC restore ...
|
r.iff1 = r.iff2;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Z80::instructionRETN() -> void {
|
auto Z80::instructionRETN() -> void {
|
||||||
|
|
Loading…
Reference in New Issue