mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-04 10:46:32 +02:00
I have done quite a bit, so I´ll try my best to recap most of the fixes since the last release... - HDMA was not running during DMA transfers - Emulator did not recognize any filetype other than .smc - Added configuration file support and imported my vector/string/config libraries into bsnes - Added option to use system RAM instead of video RAM for display, this can greatly increase speed on certain video cards - Increased speed by ~15% by adding 256x224 renderer (still very buggy when the SNES mixes video modes mid-frame) - mvn/mvp opcodes were not setting the DB register - Fixed joypad input in many games (Super Mario: All Stars, Dragon Quest III, etc.) - Major speedup with frakeskip option - Fixed default aspect ratio when emulator is first started There´s probably a lot more, but that´s all I remember offhand... this release should be a lot closer to the quality of v0.005a, but still needs a bit more polishing.
780 lines
22 KiB
C++
780 lines
22 KiB
C++
/*****************
|
|
*** 0x0a: asl ***
|
|
*****************
|
|
cycles:
|
|
[1] pbr,pc ; opcode
|
|
[2] pbr,pc+1 ; io
|
|
*/
|
|
void bCPU::op_aslb() {
|
|
cpu_io(); //2
|
|
regs.p.c = !!(regs.a.l & 0x80);
|
|
regs.a.l <<= 1;
|
|
regs.p.n = !!(regs.a.l & 0x80);
|
|
regs.p.z = (regs.a.l == 0);
|
|
}
|
|
|
|
void bCPU::op_aslw() {
|
|
cpu_io(); //2
|
|
regs.p.c = !!(regs.a.w & 0x8000);
|
|
regs.a.w <<= 1;
|
|
regs.p.n = !!(regs.a.w & 0x8000);
|
|
regs.p.z = (regs.a.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x0e: asl 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]
|
|
[5 ] dbr,aa+1 ; io
|
|
[6a] dbr,aa+1 ; data high [1]
|
|
[6 ] dbr,aa ; data low
|
|
*/
|
|
void bCPU::op_asl_addrb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_asl_addrw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/************************
|
|
*** 0x1e: asl addr,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] dbr,aah,aal+xl ; io
|
|
[5 ] dbr,aa+x ; data low
|
|
[5a] dbr,aa+x+1 ; data high [1]
|
|
[6 ] dbr,aa+x+1 ; io
|
|
[7a] dbr,aa+x+1 ; data high [1]
|
|
[7 ] dbr,aa+x ; data low
|
|
*/
|
|
void bCPU::op_asl_addrxb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_asl_addrxw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/********************
|
|
*** 0x06: asl dp ***
|
|
********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[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]
|
|
[4 ] 0,d+dp+1 ; io
|
|
[5a] 0,d+dp+1 ; data high [1]
|
|
[5 ] 0,d+dp ; data low
|
|
*/
|
|
void bCPU::op_asl_dpb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_asl_dpw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
rd.h = op_read(OPMODE_DP, dp + 1); //3a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp + 1, rd.h); //5a
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x16: asl 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 ; data low
|
|
[4a] 0,d+dp+x+1 ; data high [1]
|
|
[5 ] 0,d+dp+x+1 ; io
|
|
[6a] 0,d+dp+x+1 ; data high [1]
|
|
[6 ] 0,d+dp+x ; data low
|
|
*/
|
|
void bCPU::op_asl_dpxb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_asl_dpxw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/*****************
|
|
*** 0x4a: lsr ***
|
|
*****************
|
|
cycles:
|
|
[1] pbr,pc ; opcode
|
|
[2] pbr,pc+1 ; io
|
|
*/
|
|
void bCPU::op_lsrb() {
|
|
cpu_io(); //2
|
|
regs.p.c = regs.a.l & 1;
|
|
regs.a.l >>= 1;
|
|
regs.p.n = !!(regs.a.l & 0x80);
|
|
regs.p.z = (regs.a.l == 0);
|
|
}
|
|
|
|
void bCPU::op_lsrw() {
|
|
cpu_io(); //2
|
|
regs.p.c = regs.a.w & 1;
|
|
regs.a.w >>= 1;
|
|
regs.p.n = !!(regs.a.w & 0x8000);
|
|
regs.p.z = (regs.a.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x4e: lsr 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]
|
|
[5 ] dbr,aa+1 ; io
|
|
[6a] dbr,aa+1 ; data high [1]
|
|
[6 ] dbr,aa ; data low
|
|
*/
|
|
void bCPU::op_lsr_addrb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_lsr_addrw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/************************
|
|
*** 0x5e: lsr addr,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] dbr,aah,aal+xl ; io
|
|
[5 ] dbr,aa+x ; data low
|
|
[5a] dbr,aa+x+1 ; data high [1]
|
|
[6 ] dbr,aa+x+1 ; io
|
|
[7a] dbr,aa+x+1 ; data high [1]
|
|
[7 ] dbr,aa+x ; data low
|
|
*/
|
|
void bCPU::op_lsr_addrxb() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_lsr_addrxw() {
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/********************
|
|
*** 0x46: lsr dp ***
|
|
********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[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]
|
|
[4 ] 0,d+dp+1 ; io
|
|
[5a] 0,d+dp+1 ; data high [1]
|
|
[5 ] 0,d+dp ; data low
|
|
*/
|
|
void bCPU::op_lsr_dpb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_lsr_dpw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
rd.h = op_read(OPMODE_DP, dp + 1); //3a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp + 1, rd.h); //5a
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x56: lsr 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 ; data low
|
|
[4a] 0,d+dp+x+1 ; data high [1]
|
|
[5 ] 0,d+dp+x+1 ; io
|
|
[6a] 0,d+dp+x+1 ; data high [1]
|
|
[6 ] 0,d+dp+x ; data low
|
|
*/
|
|
void bCPU::op_lsr_dpxb() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_lsr_dpxw() {
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/*****************
|
|
*** 0x2a: rol ***
|
|
*****************
|
|
cycles:
|
|
[1] pbr,pc ; opcode
|
|
[2] pbr,pc+1 ; io
|
|
*/
|
|
void bCPU::op_rolb() {
|
|
uint8 c = regs.p.c;
|
|
cpu_io(); //2
|
|
regs.p.c = !!(regs.a.l & 0x80);
|
|
regs.a.l <<= 1;
|
|
regs.a.l |= c;
|
|
regs.p.n = !!(regs.a.l & 0x80);
|
|
regs.p.z = (regs.a.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rolw() {
|
|
uint16 c = regs.p.c;
|
|
cpu_io(); //2
|
|
regs.p.c = !!(regs.a.w & 0x8000);
|
|
regs.a.w <<= 1;
|
|
regs.a.w |= c;
|
|
regs.p.n = !!(regs.a.w & 0x8000);
|
|
regs.p.z = (regs.a.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x2e: rol 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]
|
|
[5 ] dbr,aa+1 ; io
|
|
[6a] dbr,aa+1 ; data high [1]
|
|
[6 ] dbr,aa ; data low
|
|
*/
|
|
void bCPU::op_rol_addrb() {
|
|
uint8 c = regs.p.c;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rol_addrw() {
|
|
uint16 c = regs.p.c;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/************************
|
|
*** 0x3e: rol addr,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] dbr,aah,aal+xl ; io
|
|
[5 ] dbr,aa+x ; data low
|
|
[5a] dbr,aa+x+1 ; data high [1]
|
|
[6 ] dbr,aa+x+1 ; io
|
|
[7a] dbr,aa+x+1 ; data high [1]
|
|
[7 ] dbr,aa+x ; data low
|
|
*/
|
|
void bCPU::op_rol_addrxb() {
|
|
uint8 c = regs.p.c;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rol_addrxw() {
|
|
uint16 c = regs.p.c;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/********************
|
|
*** 0x26: rol dp ***
|
|
********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[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]
|
|
[4 ] 0,d+dp+1 ; io
|
|
[5a] 0,d+dp+1 ; data high [1]
|
|
[5 ] 0,d+dp ; data low
|
|
*/
|
|
void bCPU::op_rol_dpb() {
|
|
uint8 c = regs.p.c;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rol_dpw() {
|
|
uint16 c = regs.p.c;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
rd.h = op_read(OPMODE_DP, dp + 1); //3a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp + 1, rd.h); //5a
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x36: rol 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 ; data low
|
|
[4a] 0,d+dp+x+1 ; data high [1]
|
|
[5 ] 0,d+dp+x+1 ; io
|
|
[6a] 0,d+dp+x+1 ; data high [1]
|
|
[6 ] 0,d+dp+x ; data low
|
|
*/
|
|
void bCPU::op_rol_dpxb() {
|
|
uint8 c = regs.p.c;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
regs.p.c = !!(rd.l & 0x80);
|
|
rd.l <<= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rol_dpxw() {
|
|
uint16 c = regs.p.c;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a
|
|
regs.p.c = !!(rd.w & 0x8000);
|
|
rd.w <<= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/*****************
|
|
*** 0x6a: ror ***
|
|
*****************
|
|
cycles:
|
|
[1] pbr,pc ; opcode
|
|
[2] pbr,pc+1 ; io
|
|
*/
|
|
void bCPU::op_rorb() {
|
|
uint8 c = (regs.p.c)?0x80:0;
|
|
cpu_io(); //2
|
|
regs.p.c = regs.a.l & 1;
|
|
regs.a.l >>= 1;
|
|
regs.a.l |= c;
|
|
regs.p.n = !!(regs.a.l & 0x80);
|
|
regs.p.z = (regs.a.l == 0);
|
|
}
|
|
|
|
void bCPU::op_rorw() {
|
|
uint16 c = (regs.p.c)?0x8000:0;
|
|
cpu_io(); //2
|
|
regs.p.c = regs.a.w & 1;
|
|
regs.a.w >>= 1;
|
|
regs.a.w |= c;
|
|
regs.p.n = !!(regs.a.w & 0x8000);
|
|
regs.p.z = (regs.a.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x6e: ror 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]
|
|
[5 ] dbr,aa+1 ; io
|
|
[6a] dbr,aa+1 ; data high [1]
|
|
[6 ] dbr,aa ; data low
|
|
*/
|
|
void bCPU::op_ror_addrb() {
|
|
uint8 c = (regs.p.c)?0x80:0;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_ror_addrw() {
|
|
uint16 c = (regs.p.c)?0x8000:0;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
rd.l = op_read(OPMODE_DBR, aa.w); //4
|
|
rd.h = op_read(OPMODE_DBR, aa.w + 1); //4a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DBR, aa.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DBR, aa.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/************************
|
|
*** 0x7e: ror addr,x ***
|
|
************************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[2 ] pbr,pc+1 ; aal
|
|
[3 ] pbr,pc+2 ; aah
|
|
[4 ] dbr,aah,aal+xl ; io
|
|
[5 ] dbr,aa+x ; data low
|
|
[5a] dbr,aa+x+1 ; data high [1]
|
|
[6 ] dbr,aa+x+1 ; io
|
|
[7a] dbr,aa+x+1 ; data high [1]
|
|
[7 ] dbr,aa+x ; data low
|
|
*/
|
|
void bCPU::op_ror_addrxb() {
|
|
uint8 c = (regs.p.c)?0x80:0;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_ror_addrxw() {
|
|
uint16 c = (regs.p.c)?0x8000:0;
|
|
aa.l = op_read(); //2
|
|
aa.h = op_read(); //3
|
|
cpu_io(); //4
|
|
rd.l = op_read(OPMODE_DBR, aa.w + regs.x.w); //5
|
|
rd.h = op_read(OPMODE_DBR, aa.w + regs.x.w + 1); //5a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //6
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w + 1, rd.h); //7a
|
|
op_write(OPMODE_DBR, aa.w + regs.x.w, rd.l); //7
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/********************
|
|
*** 0x66: ror dp ***
|
|
********************
|
|
cycles:
|
|
[1 ] pbr,pc ; opcode
|
|
[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]
|
|
[4 ] 0,d+dp+1 ; io
|
|
[5a] 0,d+dp+1 ; data high [1]
|
|
[5 ] 0,d+dp ; data low
|
|
*/
|
|
void bCPU::op_ror_dpb() {
|
|
uint8 c = (regs.p.c)?0x80:0;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_ror_dpw() {
|
|
uint16 c = (regs.p.c)?0x8000:0;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
rd.l = op_read(OPMODE_DP, dp); //3
|
|
rd.h = op_read(OPMODE_DP, dp + 1); //3a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //4
|
|
op_write(OPMODE_DP, dp + 1, rd.h); //5a
|
|
op_write(OPMODE_DP, dp, rd.l); //5
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|
|
|
|
/**********************
|
|
*** 0x76: ror 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 ; data low
|
|
[4a] 0,d+dp+x+1 ; data high [1]
|
|
[5 ] 0,d+dp+x+1 ; io
|
|
[6a] 0,d+dp+x+1 ; data high [1]
|
|
[6 ] 0,d+dp+x ; data low
|
|
*/
|
|
void bCPU::op_ror_dpxb() {
|
|
uint8 c = (regs.p.c)?0x80:0;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
regs.p.c = rd.l & 1;
|
|
rd.l >>= 1;
|
|
rd.l |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.l & 0x80);
|
|
regs.p.z = (rd.l == 0);
|
|
}
|
|
|
|
void bCPU::op_ror_dpxw() {
|
|
uint16 c = (regs.p.c)?0x8000:0;
|
|
dp = op_read(); //2
|
|
cpu_c2(); //2a
|
|
cpu_io(); //3
|
|
rd.l = op_read(OPMODE_DP, dp + regs.x.w); //4
|
|
rd.h = op_read(OPMODE_DP, dp + regs.x.w + 1); //4a
|
|
regs.p.c = rd.w & 1;
|
|
rd.w >>= 1;
|
|
rd.w |= c;
|
|
cpu_io(); //5
|
|
op_write(OPMODE_DP, dp + regs.x.w + 1, rd.h); //6a
|
|
op_write(OPMODE_DP, dp + regs.x.w, rd.l); //6
|
|
regs.p.n = !!(rd.w & 0x8000);
|
|
regs.p.z = (rd.w == 0);
|
|
}
|