mirror of https://github.com/bsnes-emu/bsnes.git
parent
3bd29088d1
commit
05526571e7
|
@ -37,14 +37,14 @@ void UPD77C25::enter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void UPD77C25::exec_op(uint24 opcode) {
|
void UPD77C25::exec_op(uint24 opcode) {
|
||||||
uint2 pselect = opcode >> 20; //p-select
|
uint2 pselect = opcode >> 20; //P select
|
||||||
uint4 alu = opcode >> 16; //ALU
|
uint4 alu = opcode >> 16; //ALU operation mode
|
||||||
uint1 asl = opcode >> 15; //ASL
|
uint1 asl = opcode >> 15; //accumulator select
|
||||||
uint2 dpl = opcode >> 13; //DPl
|
uint2 dpl = opcode >> 13; //DP low modify
|
||||||
uint4 dphm = opcode >> 9; //DPhM
|
uint4 dphm = opcode >> 9; //DP high XOR modify
|
||||||
uint1 rpdcr = opcode >> 8; //RP decrement
|
uint1 rpdcr = opcode >> 8; //RP decrement
|
||||||
uint4 src = opcode >> 4; //source
|
uint4 src = opcode >> 4; //move source
|
||||||
uint4 dst = opcode >> 0; //destination
|
uint4 dst = opcode >> 0; //move destination
|
||||||
|
|
||||||
unsigned p, q, r;
|
unsigned p, q, r;
|
||||||
Flag flag;
|
Flag flag;
|
||||||
|
@ -71,8 +71,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,8 +81,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,8 +91,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,12 +100,12 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q - p;
|
r = q - p;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,12 +113,12 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q + p;
|
r = q + p;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,12 +126,12 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q - p - flag.c;
|
r = q - p - flag.c;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,12 +139,12 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q + p + flag.c;
|
r = q + p + flag.c;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,12 +152,12 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q - 1;
|
r = q - 1;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,22 +165,22 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
r = q + 1;
|
r = q + 1;
|
||||||
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
bool pov = (((p | q) & 0x8000) == 0x0000) && ((r & 0x8000) == 0x8000);
|
||||||
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
bool nov = (((p & q) & 0x8000) == 0x8000) && ((r & 0x8000) == 0x0000);
|
||||||
flag.s1 = nov;
|
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
|
flag.s1 = pov;
|
||||||
flag.c = r > 0xffff;
|
flag.c = r > 0xffff;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
//flag.ov1 = ?;
|
|
||||||
flag.ov0 = pov | nov;
|
flag.ov0 = pov | nov;
|
||||||
|
flag.ov1 ^= flag.ov0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 10: { //CMP (complement)
|
case 10: { //CMP (complement)
|
||||||
r = !q;
|
r = ~q;
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,8 +189,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = q & 1;
|
flag.c = q & 1;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,8 +199,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = r & 0x8000;
|
flag.c = r & 0x8000;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,8 +209,8 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,18 +219,18 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 15: { //XCHG
|
case 15: { //XCHG
|
||||||
r = (q & 0xff00) | (p & 0x00ff);
|
r = (q << 8) | (q >> 8);
|
||||||
flag.s0 = r & 0x8000;
|
flag.s0 = r & 0x8000;
|
||||||
flag.c = 0;
|
flag.c = 0;
|
||||||
flag.z = !r;
|
flag.z = !r;
|
||||||
flag.ov1 = 0;
|
|
||||||
flag.ov0 = 0;
|
flag.ov0 = 0;
|
||||||
|
flag.ov1 = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -255,6 +255,11 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
default: print("OP: unhandled src case ", strhex<2>(src), "\n"); break;
|
default: print("OP: unhandled src case ", strhex<2>(src), "\n"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch(asl) {
|
||||||
|
case 0: regs.a = r; regs.flaga = flag; break;
|
||||||
|
case 1: regs.b = r; regs.flagb = flag; break;
|
||||||
|
}
|
||||||
|
|
||||||
switch(dst) {
|
switch(dst) {
|
||||||
case 0: break;
|
case 0: break;
|
||||||
case 1: regs.a = regs.idb; break;
|
case 1: regs.a = regs.idb; break;
|
||||||
|
@ -275,11 +280,6 @@ void UPD77C25::exec_op(uint24 opcode) {
|
||||||
default: print("OP: unhandled dst case ", strhex<2>(dst), "\n"); break;
|
default: print("OP: unhandled dst case ", strhex<2>(dst), "\n"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(asl) {
|
|
||||||
case 0: regs.a = r; regs.flaga = flag; break;
|
|
||||||
case 1: regs.b = r; regs.flagb = flag; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(dpl) {
|
switch(dpl) {
|
||||||
case 0: break; //DPNOP
|
case 0: break; //DPNOP
|
||||||
case 1: regs.dp = (regs.dp & 0xf0) + ((regs.dp + 1) & 0x0f); break; //DPINC
|
case 1: regs.dp = (regs.dp & 0xf0) + ((regs.dp + 1) & 0x0f); break; //DPINC
|
||||||
|
@ -370,7 +370,7 @@ void UPD77C25::exec_ld(uint24 opcode) {
|
||||||
//case 9: regs.som = id; break;
|
//case 9: regs.som = id; break;
|
||||||
case 10: regs.k = id; break;
|
case 10: regs.k = id; break;
|
||||||
case 11: regs.k = regs.idb; regs.l = dataROM[regs.rp]; break;
|
case 11: regs.k = regs.idb; regs.l = dataROM[regs.rp]; break;
|
||||||
//case 12: regs.klm = id; break;
|
case 12: regs.k = dataRAM[regs.dp | 0x40]; regs.l = regs.idb; break;
|
||||||
case 13: regs.l = id; break;
|
case 13: regs.l = id; break;
|
||||||
case 14: regs.trb = id; break;
|
case 14: regs.trb = id; break;
|
||||||
case 15: dataRAM[regs.dp] = id; break;
|
case 15: dataRAM[regs.dp] = id; break;
|
||||||
|
@ -400,16 +400,16 @@ uint8 UPD77C25::read(bool mode) {
|
||||||
//16-bit
|
//16-bit
|
||||||
if(regs.sr.drs == 0) {
|
if(regs.sr.drs == 0) {
|
||||||
regs.sr.drs = 1;
|
regs.sr.drs = 1;
|
||||||
return regs.dr >> 0;
|
return regs.dr >> 8;
|
||||||
} else {
|
} else {
|
||||||
regs.sr.rqm = 0;
|
regs.sr.rqm = 0;
|
||||||
regs.sr.drs = 0;
|
regs.sr.drs = 0;
|
||||||
return regs.dr >> 8;
|
return regs.dr >> 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//8-bit
|
//8-bit
|
||||||
regs.sr.rqm = 0;
|
regs.sr.rqm = 0;
|
||||||
return regs.dr >> 0;
|
return regs.dr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -420,16 +420,16 @@ void UPD77C25::write(bool mode, uint8 data) {
|
||||||
//16-bit
|
//16-bit
|
||||||
if(regs.sr.drs == 0) {
|
if(regs.sr.drs == 0) {
|
||||||
regs.sr.drs = 1;
|
regs.sr.drs = 1;
|
||||||
regs.dr = (regs.dr & 0xff00) | (data << 0);
|
regs.dr = (data << 8) | (regs.dr & 0x00ff);
|
||||||
} else {
|
} else {
|
||||||
regs.sr.rqm = 0;
|
regs.sr.rqm = 0;
|
||||||
regs.sr.drs = 0;
|
regs.sr.drs = 0;
|
||||||
regs.dr = (data << 8) | (regs.dr & 0x00ff);
|
regs.dr = (regs.dr & 0xff00) | (data << 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//8-bit
|
//8-bit
|
||||||
regs.sr.rqm = 0;
|
regs.sr.rqm = 0;
|
||||||
regs.dr = (regs.dr & 0xff00) | (data << 0);
|
regs.dr = data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,8 +494,6 @@ void UPD77C25::reset() {
|
||||||
regs.rp = 0x3ff;
|
regs.rp = 0x3ff;
|
||||||
regs.siack = 0;
|
regs.siack = 0;
|
||||||
regs.soack = 0;
|
regs.soack = 0;
|
||||||
|
|
||||||
regs.sr.rqm = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 UPD77C25SR::read(unsigned) { return upd77c25.read(0); }
|
uint8 UPD77C25SR::read(unsigned) { return upd77c25.read(0); }
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
namespace SNES {
|
namespace SNES {
|
||||||
namespace Info {
|
namespace Info {
|
||||||
static const char Name[] = "bsnes";
|
static const char Name[] = "bsnes";
|
||||||
static const char Version[] = "072.09";
|
static const char Version[] = "072.10";
|
||||||
static const unsigned SerializerVersion = 14;
|
static const unsigned SerializerVersion = 14;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,18 +48,42 @@ namespace SNES {
|
||||||
typedef uint32_t uint32;
|
typedef uint32_t uint32;
|
||||||
typedef uint64_t uint64;
|
typedef uint64_t uint64;
|
||||||
|
|
||||||
typedef uint_t<1> uint1;
|
typedef uint_t< 1> uint1;
|
||||||
typedef uint_t<2> uint2;
|
typedef uint_t< 2> uint2;
|
||||||
typedef uint_t<3> uint3;
|
typedef uint_t< 3> uint3;
|
||||||
typedef uint_t<4> uint4;
|
typedef uint_t< 4> uint4;
|
||||||
typedef uint_t<6> uint6;
|
typedef uint_t< 5> uint5;
|
||||||
typedef uint_t<9> uint9;
|
typedef uint_t< 6> uint6;
|
||||||
|
typedef uint_t< 7> uint7;
|
||||||
|
|
||||||
|
typedef uint_t< 9> uint9;
|
||||||
typedef uint_t<10> uint10;
|
typedef uint_t<10> uint10;
|
||||||
typedef uint_t<11> uint11;
|
typedef uint_t<11> uint11;
|
||||||
|
typedef uint_t<12> uint12;
|
||||||
|
typedef uint_t<13> uint13;
|
||||||
|
typedef uint_t<14> uint14;
|
||||||
|
typedef uint_t<15> uint15;
|
||||||
|
|
||||||
typedef uint_t<17> uint17;
|
typedef uint_t<17> uint17;
|
||||||
|
typedef uint_t<18> uint18;
|
||||||
|
typedef uint_t<19> uint19;
|
||||||
|
typedef uint_t<20> uint20;
|
||||||
|
typedef uint_t<21> uint21;
|
||||||
|
typedef uint_t<22> uint22;
|
||||||
|
typedef uint_t<23> uint23;
|
||||||
typedef uint_t<24> uint24;
|
typedef uint_t<24> uint24;
|
||||||
|
typedef uint_t<25> uint25;
|
||||||
|
typedef uint_t<26> uint26;
|
||||||
|
typedef uint_t<27> uint27;
|
||||||
|
typedef uint_t<28> uint28;
|
||||||
|
typedef uint_t<29> uint29;
|
||||||
|
typedef uint_t<30> uint30;
|
||||||
typedef uint_t<31> uint31;
|
typedef uint_t<31> uint31;
|
||||||
|
|
||||||
|
typedef uint_t<40> uint40;
|
||||||
|
typedef uint_t<48> uint48;
|
||||||
|
typedef uint_t<56> uint56;
|
||||||
|
|
||||||
struct Processor {
|
struct Processor {
|
||||||
cothread_t thread;
|
cothread_t thread;
|
||||||
unsigned frequency;
|
unsigned frequency;
|
||||||
|
|
Loading…
Reference in New Issue