mirror of https://github.com/bsnes-emu/bsnes.git
185 lines
3.2 KiB
C++
185 lines
3.2 KiB
C++
auto HuC6280::algorithmADC(uint8 i) -> uint8 {
|
|
int16 o;
|
|
if(!D) {
|
|
o = A + i + C;
|
|
V = ~(A ^ i) & (A ^ o) & 0x80;
|
|
} else {
|
|
io();
|
|
o = (A & 0x0f) + (i & 0x0f) + (C << 0);
|
|
if(o > 0x09) o += 0x06;
|
|
C = o > 0x0f;
|
|
o = (A & 0xf0) + (i & 0xf0) + (C << 4) + (o & 0x0f);
|
|
if(o > 0x9f) o += 0x60;
|
|
}
|
|
C = o.bit(8);
|
|
Z = uint8(o) == 0;
|
|
N = o.bit(7);
|
|
return o;
|
|
}
|
|
|
|
auto HuC6280::algorithmAND(uint8 i) -> uint8 {
|
|
uint8 o = A & i;
|
|
Z = o == 0;
|
|
N = o.bit(7);
|
|
return o;
|
|
}
|
|
|
|
auto HuC6280::algorithmASL(uint8 i) -> uint8 {
|
|
C = i.bit(7);
|
|
i <<= 1;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmBIT(uint8 i) -> uint8 {
|
|
Z = (A & i) == 0;
|
|
V = i.bit(6);
|
|
N = i.bit(7);
|
|
return A;
|
|
}
|
|
|
|
auto HuC6280::algorithmCMP(uint8 i) -> uint8 {
|
|
uint9 o = A - i;
|
|
C = !o.bit(8);
|
|
Z = uint8(o) == 0;
|
|
N = o.bit(7);
|
|
return A;
|
|
}
|
|
|
|
auto HuC6280::algorithmCPX(uint8 i) -> uint8 {
|
|
uint9 o = X - i;
|
|
C = !o.bit(8);
|
|
Z = uint8(o) == 0;
|
|
N = o.bit(7);
|
|
return X;
|
|
}
|
|
|
|
auto HuC6280::algorithmCPY(uint8 i) -> uint8 {
|
|
uint9 o = Y - i;
|
|
C = !o.bit(8);
|
|
Z = uint8(o) == 0;
|
|
N = o.bit(7);
|
|
return Y;
|
|
}
|
|
|
|
auto HuC6280::algorithmDEC(uint8 i) -> uint8 {
|
|
i--;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmEOR(uint8 i) -> uint8 {
|
|
uint8 o = A ^ i;
|
|
Z = o == 0;
|
|
N = o.bit(7);
|
|
return o;
|
|
}
|
|
|
|
auto HuC6280::algorithmINC(uint8 i) -> uint8 {
|
|
i++;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmLD(uint8 i) -> uint8 {
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmLSR(uint8 i) -> uint8 {
|
|
C = i.bit(0);
|
|
i >>= 1;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmORA(uint8 i) -> uint8 {
|
|
uint8 o = A | i;
|
|
Z = o == 0;
|
|
N = o.bit(7);
|
|
return o;
|
|
}
|
|
|
|
auto HuC6280::algorithmROL(uint8 i) -> uint8 {
|
|
bool c = C;
|
|
C = i.bit(7);
|
|
i = i << 1 | c;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmROR(uint8 i) -> uint8 {
|
|
bool c = C;
|
|
C = i.bit(0);
|
|
i = c << 7 | i >> 1;
|
|
Z = i == 0;
|
|
N = i.bit(7);
|
|
return i;
|
|
}
|
|
|
|
auto HuC6280::algorithmSBC(uint8 i) -> uint8 {
|
|
i ^= 0xff;
|
|
int16 o;
|
|
if(!D) {
|
|
o = A + i + C;
|
|
V = ~(A ^ i) & (A ^ o) & 0x80;
|
|
} else {
|
|
io();
|
|
o = (A & 0x0f) + (i & 0x0f) + (C << 0);
|
|
if(o <= 0x0f) o -= 0x06;
|
|
C = o > 0x0f;
|
|
o = (A & 0xf0) + (i & 0xf0) + (C << 4) + (o & 0x0f);
|
|
if(o <= 0xff) o -= 0x60;
|
|
}
|
|
C = o.bit(8);
|
|
Z = uint8(o) == 0;
|
|
N = o.bit(7);
|
|
return o;
|
|
}
|
|
|
|
auto HuC6280::algorithmTRB(uint8 i) -> uint8 {
|
|
Z = (A & i) == 0;
|
|
V = i.bit(6);
|
|
N = i.bit(7);
|
|
return ~A & i;
|
|
}
|
|
|
|
auto HuC6280::algorithmTSB(uint8 i) -> uint8 {
|
|
Z = (A & i) == 0;
|
|
V = i.bit(6);
|
|
N = i.bit(7);
|
|
return A | i;
|
|
}
|
|
|
|
//
|
|
|
|
auto HuC6280::algorithmTAI(uint16& source, uint16& target, bool alternate) -> void {
|
|
!alternate ? source++ : source--;
|
|
target++;
|
|
}
|
|
|
|
auto HuC6280::algorithmTDD(uint16& source, uint16& target, bool) -> void {
|
|
source--;
|
|
target--;
|
|
}
|
|
|
|
auto HuC6280::algorithmTIA(uint16& source, uint16& target, bool alternate) -> void {
|
|
source++;
|
|
!alternate ? target++ : target--;
|
|
}
|
|
|
|
auto HuC6280::algorithmTII(uint16& source, uint16& target, bool) -> void {
|
|
source++;
|
|
target++;
|
|
}
|
|
|
|
auto HuC6280::algorithmTIN(uint16& source, uint16& target, bool) -> void {
|
|
source++;
|
|
}
|