Compare commits

..

No commits in common. "master" and "073u6" have entirely different histories.

View file

@ -100,7 +100,6 @@ void NECDSP::exec_op(uint24 opcode) {
flag.s0 = (r & 0x8000); flag.s0 = (r & 0x8000);
flag.z = (r == 0); flag.z = (r == 0);
if (!flag.ov1) flag.s1 = flag.s0;
switch(alu) { switch(alu) {
case 1: case 2: case 3: case 10: case 13: case 14: case 15: { case 1: case 2: case 3: case 10: case 13: case 14: case 15: {
@ -112,14 +111,17 @@ void NECDSP::exec_op(uint24 opcode) {
case 4: case 5: case 6: case 7: case 8: case 9: { case 4: case 5: case 6: case 7: case 8: case 9: {
if(alu & 1) { if(alu & 1) {
//addition //addition
flag.ov0 = (q ^ r) & (p ^ r) & 0x8000; flag.ov0 = (q ^ r) & ~(q ^ p) & 0x8000;
flag.c = (r < q); flag.c = (r < q);
} else { } else {
//subtraction //subtraction
flag.ov0 = (q ^ r) & (q ^ p) & 0x8000; flag.ov0 = (q ^ r) & (q ^ p) & 0x8000;
flag.c = (r > q); flag.c = (r > q);
} }
flag.ov1 = (flag.ov0 & flag.ov1) ? (flag.s1 == flag.s0) : (flag.ov0 | flag.ov1); if(flag.ov0) {
flag.s1 = flag.ov1 ^ !(r & 0x8000);
flag.ov1 = !flag.ov1;
}
break; break;
} }
case 11: { case 11: {
@ -144,16 +146,15 @@ void NECDSP::exec_op(uint24 opcode) {
exec_ld((idb << 6) + dst); exec_ld((idb << 6) + dst);
if (dst != 4) { switch(dpl) {
switch(dpl) { 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 case 2: regs.dp = (regs.dp & 0xf0) + ((regs.dp - 1) & 0x0f); break; //DPDEC
case 2: regs.dp = (regs.dp & 0xf0) + ((regs.dp - 1) & 0x0f); break; //DPDEC case 3: regs.dp = (regs.dp & 0xf0); break; //DPCLR
case 3: regs.dp = (regs.dp & 0xf0); break; //DPCLR
}
regs.dp ^= dphm << 4;
} }
if(rpdcr && dst != 5) regs.rp--; regs.dp ^= dphm << 4;
if(rpdcr) regs.rp--;
} }
void NECDSP::exec_rt(uint24 opcode) { void NECDSP::exec_rt(uint24 opcode) {