mirror of https://github.com/bsnes-emu/bsnes.git
445 lines
13 KiB
C++
445 lines
13 KiB
C++
inline void bCPU::flags_eor_b() {
|
|
regs.p.n = !!(regs.a.l & 0x80);
|
|
regs.p.z = (regs.a.l == 0);
|
|
}
|
|
|
|
inline void bCPU::flags_eor_w() {
|
|
regs.p.n = !!(regs.a.w & 0x8000);
|
|
regs.p.z = (regs.a.w == 0);
|
|
}
|
|
|
|
/************************
|
|
*** 0x49: eor #const ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; idl
|
|
[2a] pbr,pc+2 ; idh [1]
|
|
*/
|
|
void bCPU::op_eor_constb() {
|
|
regs.a.l ^= op_read(); //2
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_constw() {
|
|
regs.a.l ^= op_read(); //2
|
|
regs.a.h ^= op_read(); //2a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x4d: eor addr ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] dbr,aa ; data low
|
|
[4a] dbr,aa+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_addrb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //4
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_addrw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //4
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //4a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x5d: eor addr,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opereor
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[3a] dbr,aah,aal+xl ; io [4]
|
|
[4 ] dbr,aa+x ; data low
|
|
[4a] dbr,aa+x+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_addrxb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_c4(aa.w, aa.w + regs.x.w); //3a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.x.w); //4
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_addrxw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_c4(aa.w, aa.w + regs.x.w); //3a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.x.w); //4
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //4a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/********************
|
|
*** 0x45: eor dp ***
|
|
********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opereor
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] 0,d+dp ; data low
|
|
[3a] 0,d+dp+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_dpb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
regs.a.l ^= op_read(OPMODE_DP, dp); //3
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_dpw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
regs.a.l ^= op_read(OPMODE_DP, dp); //3
|
|
regs.a.h ^= op_read(OPMODE_DP, dp + 1); //3a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x52: eor (dp) ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] 0,d+dp ; aal
|
|
[4 ] 0,d+dp+1 ; aah
|
|
[5 ] dbr,aa ; data low
|
|
[5a] dbr,aa+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_idpb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //5
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_idpw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //5
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //5
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x47: eor [dp] ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] 0,d+dp ; aal
|
|
[4 ] 0,d+dp+1 ; aah
|
|
[5 ] 0,d+dp+2 ; aab
|
|
[6 ] aab,aa ; data low
|
|
[6a] aab,aa+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_ildpb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
aa.b = op_read(OPMODE_DP, dp + 2); //5
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d); //6
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_ildpw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
aa.b = op_read(OPMODE_DP, dp + 2); //5
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d); //6
|
|
regs.a.h ^= op_read(OPMODE_LONG, aa.d + 1); //6a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x4f: eor long ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] pbr,pc+3 ; aab
|
|
[5 ] aab,aa ; data low
|
|
[5a] aab,aa+1 ; data high
|
|
*/
|
|
void bCPU::op_eor_longb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
aa.b = op_read(); //4
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d); //5
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_longw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
aa.b = op_read(); //4
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d); //5
|
|
regs.a.h ^= op_read(OPMODE_LONG, aa.d + 1); //5a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x5f: eor long,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] pbr,pc+3 ; aab
|
|
[5 ] aab,aa+x ; data low
|
|
[5a] aab,aa+x+1 ; data high
|
|
*/
|
|
void bCPU::op_eor_longxb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
aa.b = op_read(); //4
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.x.w); //5
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_longxw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
aa.b = op_read(); //4
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.x.w); //5
|
|
regs.a.h ^= op_read(OPMODE_LONG, aa.d + regs.x.w + 1); //5a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x59: eor addr,y ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opereor
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[3a] dbr,aah,aal+yl ; io [4]
|
|
[4 ] dbr,aa+y ; data low
|
|
[4a] dbr,aa+y+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_addryb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_c4(aa.w, aa.w + regs.y.w); //3a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //4
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_addryw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_c4(aa.w, aa.w + regs.y.w); //3a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //4
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //4a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x55: eor dp,x ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io
|
|
[3 ] pbr,pc+1 ; io
|
|
[4 ] 0,d+dp+x ; data low
|
|
[4a] 0,d+dp+x+1 ; data high
|
|
*/
|
|
void bCPU::op_eor_dpxb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
regs.a.l ^= op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_dpxw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
regs.a.l ^= op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
regs.a.h ^= op_read(OPMODE_DP, dp + regs.x.w + 1); //4a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x41: eor (dp,x) ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] pbr,pc+1 ; io
|
|
[4 ] 0,d+dp+x ; aal
|
|
[5 ] 0,d+dp+x+1 ; aah
|
|
[6 ] dbr,aa ; data low
|
|
[6a] dbr,aa+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_idpxb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //6
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_idpxw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
aa.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
aa.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //5
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w); //6
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + 1); //6a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x51: eor (dp),y ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] 0,d+dp ; aal
|
|
[4 ] 0,d+dp+1 ; aah
|
|
[4a] dbr,aah,aal+yl ; io [4]
|
|
[5 ] dbr,aa+y ; data low
|
|
[5a] dbr,aa+y+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_idpyb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
cpu_c4(aa.w, aa.w + regs.y.w); //4a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //5
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_idpyw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
cpu_c4(aa.w, aa.w + regs.y.w); //4a
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //5
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //5a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/************************
|
|
*** 0x57: eor [dp],y ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; dp
|
|
[2a] pbr,pc+1 ; io [2]
|
|
[3 ] 0,d+dp ; aal
|
|
[4 ] 0,d+dp+1 ; aah
|
|
[5 ] 0,d+dp+2 ; aab
|
|
[6 ] aab,aa+y ; data low
|
|
[6a] aab,aa+y+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_ildpyb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
aa.b = op_read(OPMODE_DP, dp + 2); //5
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.y.w); //6
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_ildpyw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
aa.l = op_read(OPMODE_DP, dp); //3
|
|
aa.h = op_read(OPMODE_DP, dp + 1); //4
|
|
aa.b = op_read(OPMODE_DP, dp + 2); //5
|
|
regs.a.l ^= op_read(OPMODE_LONG, aa.d + regs.y.w); //6
|
|
regs.a.h ^= op_read(OPMODE_LONG, aa.d + regs.y.w + 1); //6a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**********************
|
|
*** 0x43: eor sr,s ***
|
|
**********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; sp
|
|
[3 ] pbr,pc+1 ; io
|
|
[4 ] 0,s+sp ; data low
|
|
[4a] 0,s+sp+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_srb() {
|
|
sp = op_read(); //2
|
|
cpu_io(); //3
|
|
regs.a.l ^= op_read(OPMODE_SP, sp); //4
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_srw() {
|
|
sp = op_read(); //2
|
|
cpu_io(); //3
|
|
regs.a.l ^= op_read(OPMODE_SP, sp); //4
|
|
regs.a.h ^= op_read(OPMODE_SP, sp + 1); //4a
|
|
flags_eor_w();
|
|
}
|
|
|
|
/**************************
|
|
*** 0x53: eor (sr,s),y ***
|
|
**************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; sp
|
|
[3 ] pbr,pc+1 ; io
|
|
[4 ] 0,s+sp ; aal
|
|
[5 ] 0,s+sp+1 ; aah
|
|
[6 ] 0,s+sp+1 ; io
|
|
[7 ] dbr,aa+y ; data low
|
|
[7a] dbr,aa+y+1 ; data high [1]
|
|
*/
|
|
void bCPU::op_eor_isryb() {
|
|
sp = op_read(); //2
|
|
cpu_io(); //3
|
|
aa.l = op_read(OPMODE_SP, sp); //4
|
|
aa.h = op_read(OPMODE_SP, sp + 1); //5
|
|
cpu_io(); //6
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //7
|
|
flags_eor_b();
|
|
}
|
|
|
|
void bCPU::op_eor_isryw() {
|
|
sp = op_read(); //2
|
|
cpu_io(); //3
|
|
aa.l = op_read(OPMODE_SP, sp); //4
|
|
aa.h = op_read(OPMODE_SP, sp + 1); //5
|
|
cpu_io(); //6
|
|
regs.a.l ^= op_read(OPMODE_DBR, aa.w + regs.y.w); //7
|
|
regs.a.h ^= op_read(OPMODE_DBR, aa.w + regs.y.w + 1); //7a
|
|
flags_eor_w();
|
|
}
|