summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2021-07-28 16:43:28 -0400
committer AJR <ajrhacker@users.noreply.github.com>2021-07-28 16:45:18 -0400
commitf3cae23ba079a3fa6f1591d68126a4a80b3a9a1c (patch)
treeeb39d1f4cf446c9af713dac330b161cdb8a32743
parent58ef5d8372c595d555cc8610a1707a439b3f9fa9 (diff)
f2mc16: General cleanup
- Add helper functions for increment and decrement operations and short direct banking - Rationalize use of temporary variables - Modify only lowest 8 bits of accumulator for XOR A, #imm8 - Perform a 16-bit rather than 8-bit write for MOVW @RLx + #disp8, A - Use SSB instead of USB for @RW3 or @RW7 addressing when S flag is set - Fix numerous flag calculations
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp527
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.h128
2 files changed, 277 insertions, 378 deletions
diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp
index d98c95a9fa7..edd5cb2fed1 100644
--- a/src/devices/cpu/f2mc16/f2mc16.cpp
+++ b/src/devices/cpu/f2mc16/f2mc16.cpp
@@ -39,7 +39,7 @@ f2mc16_device::f2mc16_device(const machine_config &mconfig, device_type type, co
m_tmp8 = 0;
m_tmp16 = 0;
m_tmp32 = 0;
- m_tmp64 = 0;
+ m_tmpea = 0;
m_prefix_valid = false;
}
@@ -99,7 +99,6 @@ void f2mc16_device::device_start()
save_item(NAME(m_ssp));
save_item(NAME(m_ps));
save_item(NAME(m_tmp16));
- save_item(NAME(m_tmpea));
save_item(NAME(m_tmp16aux));
save_item(NAME(m_pcb));
save_item(NAME(m_dtb));
@@ -112,8 +111,7 @@ void f2mc16_device::device_start()
save_item(NAME(m_acc));
save_item(NAME(m_temp));
save_item(NAME(m_tmp32));
- save_item(NAME(m_tmp32aux));
- save_item(NAME(m_tmp64));
+ save_item(NAME(m_tmpea));
save_item(NAME(m_prefix_valid));
}
@@ -345,10 +343,10 @@ void f2mc16_device::execute_run()
// NEGW A
case 0x0b:
- m_tmp32 = doSUB_32(0, m_acc&0xffff);
+ m_tmp16 = doSUB_16(0, m_acc&0xffff);
m_acc &= 0xffff0000;
- m_acc |= m_tmp32 & 0xffff;
- setNZ_16(m_acc & 0xffff);
+ m_acc |= m_tmp16;
+ setNZ_16(m_tmp16);
m_pc++;
m_icount -= 2;
break;
@@ -509,7 +507,7 @@ void f2mc16_device::execute_run()
m_acc |= 0xffff0000;
m_ps |= F_N;
}
- else
+ else if (m_acc == 0)
{
m_ps |= F_Z;
}
@@ -716,9 +714,6 @@ void f2mc16_device::execute_run()
// XOR A, #imm8
case 0x36:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp16 = m_acc & 0xffff;
- m_acc <<= 16;
- m_acc |= m_tmp16;
m_acc ^= m_tmp8;
setNZ_8(m_acc & 0xff);
m_ps &= ~F_V;
@@ -822,33 +817,19 @@ void f2mc16_device::execute_run()
// MOV A, dir
case 0x40:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)) | (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
- }
- else
- m_tmp32 |= (m_dtb<<16);
- m_tmp8 = read_8(m_tmp32);
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+1)));
+ m_tmp8 = read_8(m_tmpea);
m_acc <<= 16;
m_acc |= m_tmp8;
- setNZ_16(m_acc & 0xff);
+ setNZ_8(m_acc & 0xff);
m_pc += 2;
m_icount -= 3;
break;
// MOV dir, A
case 0x41:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)) | (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
- }
- else
- m_tmp32 |= (m_dtb<<16);
- write_8(m_tmp32, m_acc & 0xff);
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+1)));
+ write_8(m_tmpea, m_acc & 0xff);
setNZ_8(m_acc & 0xff);
m_pc += 2;
m_icount -= 3;
@@ -880,17 +861,9 @@ void f2mc16_device::execute_run()
// MOV dir, #imm8
case 0x44:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+1)));
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
- }
- else
- m_tmp32 |= (m_dtb<<16);
- write_8(m_tmp32, m_tmp8);
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 5;
break;
@@ -926,16 +899,8 @@ void f2mc16_device::execute_run()
// MOVW A, dir
case 0x48:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
- }
- else
- m_tmp32 |= (m_dtb<<16);
- m_tmp16 = read_16(m_tmp32);
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+1)));
+ m_tmp16 = read_16(m_tmpea);
m_acc <<= 16;
m_acc |= m_tmp16;
setNZ_16(m_acc & 0xffff);
@@ -945,16 +910,8 @@ void f2mc16_device::execute_run()
// MOVW dir, A
case 0x49:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmp32 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
- }
- else
- m_tmp32 |= (m_dtb<<16);
- write_16(m_tmp32, m_acc & 0xffff);
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+1)));
+ write_16(m_tmpea, m_acc & 0xffff);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 3;
@@ -1023,9 +980,9 @@ void f2mc16_device::execute_run()
// MOV A, io
case 0x50:
- m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
m_acc <<= 16;
- m_acc |= read_8(m_tmp8);
+ m_acc |= read_8(m_tmpea);
setNZ_8(m_acc & 0xff);
m_pc += 2;
m_icount -= 3;
@@ -1033,8 +990,8 @@ void f2mc16_device::execute_run()
// MOV io, A
case 0x51:
- m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
- write_8(m_tmp8, m_acc & 0xff);
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
+ write_8(m_tmpea, m_acc & 0xff);
setNZ_8(m_acc & 0xff);
m_pc += 2;
m_icount -= 3;
@@ -1077,18 +1034,18 @@ void f2mc16_device::execute_run()
// MOV io, #imm8
case 0x54:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- write_8(m_tmp32, m_tmp8);
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 5;
break;
// MOVW io, #imm16
case 0x56:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
m_tmp16 = read_16((m_pcb<<16) | (m_pc+2));
- write_16(m_tmp32, m_tmp16);
+ write_16(m_tmpea, m_tmp16);
m_pc += 4;
m_icount -= 5;
break;
@@ -1099,9 +1056,9 @@ void f2mc16_device::execute_run()
// MOVW A, io
case 0x58:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
m_acc <<= 16;
- m_acc |= read_16(m_tmp32);
+ m_acc |= read_16(m_tmpea);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 3;
@@ -1109,8 +1066,8 @@ void f2mc16_device::execute_run()
// MOVW io, A
case 0x59:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+1));
- write_16(m_tmp32, m_acc & 0xffff);
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+1));
+ write_16(m_tmpea, m_acc & 0xffff);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 3;
@@ -1407,8 +1364,9 @@ void f2mc16_device::execute_run()
case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
m_tmp16 = read_rwX(opcode & 0x7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(opcode & 0x7, m_tmp16);
m_acc <<= 16;
- m_acc |= read_16(getRWbank(opcode & 0x7, m_tmp16));
+ m_acc |= read_16(m_tmpea);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 10;
@@ -1417,8 +1375,9 @@ void f2mc16_device::execute_run()
// MOVX A, @Rx + disp8
case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
- m_tmpea = read_rwX(opcode & 0x7) + (s8)m_tmp8;
- m_tmp8 = read_8(getRWbank(opcode & 7, m_tmpea));
+ m_tmp16 = read_rwX(opcode & 0x7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(opcode & 7, m_tmp16);
+ m_tmp8 = read_8(m_tmpea);
m_tmp16 = (m_tmp8 & 0x80) ? (m_tmp8 | 0xff00) : m_tmp8;
m_acc <<= 16;
m_acc |= m_tmp16;
@@ -1430,7 +1389,8 @@ void f2mc16_device::execute_run()
case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+1));
m_tmp16 = read_rwX(opcode & 0x7) + (s8)m_tmp8;
- write_16(getRWbank(opcode & 0x7, m_tmp16), m_acc & 0xffff);
+ m_tmpea = getRWbank(opcode & 0x7, m_tmp16);
+ write_16(m_tmpea, m_acc & 0xffff);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 10;
@@ -1743,15 +1703,8 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
{
// MOVB A, dir:bp
case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:
- m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp16 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
- }
- else
- m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
+ m_tmp8 = read_8(m_tmpea);
m_acc &= 0xffff0000;
if (m_tmp8 & (1 << (operand & 7)))
m_acc |= 0xff;
@@ -1762,27 +1715,13 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// MOVB dir:bp, A
case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:
- m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp16 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
- if (m_acc & 0xff)
- m_tmp8 |= (1 << (operand & 7));
- else
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_prefix<<16) | m_tmp16, m_tmp8);
- }
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
+ m_tmp8 = read_8(m_tmpea);
+ if (m_acc & 0xff)
+ m_tmp8 |= (1 << (operand & 7));
else
- {
- m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
- if (m_acc & 0xff)
- m_tmp8 |= (1 << (operand & 7));
- else
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_dtb<<16) | m_tmp16, m_tmp8);
- }
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8(m_tmpea, m_tmp8);
setNZ_8(m_acc & 0xff);
m_pc += 3;
m_icount -= 7;
@@ -1790,82 +1729,57 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// CLRB io:bp
case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
- m_tmp16 = read_8((m_pcb << 16) | (m_pc + 2));
- m_tmp8 = read_8(m_tmp16);
+ m_tmpea = read_8((m_pcb << 16) | (m_pc + 2));
+ m_tmp8 = read_8(m_tmpea);
m_tmp8 &= ~(1 << (operand & 7));
- write_8(m_tmp16, m_tmp8);
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 7;
break;
// CLRB dir:bp
case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4c: case 0x4d: case 0x4e: case 0x4f:
- m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp16 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_prefix<<16) | m_tmp16, m_tmp8);
- }
- else
- {
- m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_dtb<<16) | m_tmp16, m_tmp8);
- }
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
+ m_tmp8 = read_8(m_tmpea);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 7;
break;
// CLRB addr16:bp
case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f:
- m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2));
+ m_tmpea = read_16((m_pcb << 16) | (m_pc + 2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_prefix<<16) | m_tmp16, m_tmp8);
+ m_tmpea |= (m_prefix<<16);
}
else
- {
- m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
- m_tmp8 &= ~(1 << (operand & 7));
- write_8((m_dtb<<16) | m_tmp16, m_tmp8);
- }
+ m_tmpea |= (m_dtb<<16);
+ m_tmp8 = read_8(m_tmpea);
+ m_tmp8 &= ~(1 << (operand & 7));
+ write_8(m_tmpea, m_tmp8);
m_pc += 4;
m_icount -= 7;
break;
// SETB io:bp
case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67:
- m_tmp16 = read_8((m_pcb << 16) | (m_pc + 2));
- m_tmp8 = read_8(m_tmp16);
+ m_tmpea = read_8((m_pcb << 16) | (m_pc + 2));
+ m_tmp8 = read_8(m_tmpea);
m_tmp8 |= (1 << (operand & 7));
- write_8(m_tmp16, m_tmp8);
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 7;
break;
// SETB dir:bp
case 0x68: case 0x69: case 0x6a: case 0x6b: case 0x6c: case 0x6d: case 0x6e: case 0x6f:
- m_tmp16 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp16 |= (m_dpr<<8);
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp8 = read_8((m_prefix<<16) | m_tmp16);
- m_tmp8 |= (1 << (operand & 7));
- write_8((m_prefix<<16) | m_tmp16, m_tmp8);
- }
- else
- {
- m_tmp8 = read_8((m_dtb<<16) | m_tmp16);
- m_tmp8 |= (1 << (operand & 7));
- write_8((m_dtb<<16) | m_tmp16, m_tmp8);
- }
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
+ m_tmp8 = read_8(m_tmpea);
+ m_tmp8 |= (1 << (operand & 7));
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 7;
break;
@@ -1892,11 +1806,11 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// BBC io:bp, disp8
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+2));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
m_ps &= ~F_Z;
m_pc += 4;
- if (!(read_8(m_tmp32) & (1 << (operand & 7))))
+ if (!(read_8(m_tmpea) & (1 << (operand & 7))))
{
m_ps |= F_Z;
m_pc += (s8)m_tmp8;
@@ -1907,20 +1821,11 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// BBC dir:bp, disp8
case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16) | (m_dpr<<8);
- }
- else
- {
- m_tmp32 |= (m_dtb<<16) | (m_dpr<<8);
- }
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
m_ps &= ~F_Z;
m_pc += 4;
- if (!(read_8(m_tmp32) & (1 << (operand & 7))))
+ if (!(read_8(m_tmpea) & (1 << (operand & 7))))
{
m_ps |= F_Z;
m_pc += (s8)m_tmp8;
@@ -1938,14 +1843,14 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 = (m_prefix<<16) | m_tmp16;
+ m_tmpea = (m_prefix<<16) | m_tmp16;
}
else
{
- m_tmp32 = (m_dtb<<16) | m_tmp16;
+ m_tmpea = (m_dtb<<16) | m_tmp16;
}
- if (!(read_8(m_tmp32) & (1 << (operand & 7))))
+ if (!(read_8(m_tmpea) & (1 << (operand & 7))))
{
m_ps |= F_Z;
m_pc += (s8)m_tmp8;
@@ -1956,11 +1861,11 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// BBS io:bp, disp8
case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_8((m_pcb<<16) | (m_pc+2));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
m_ps &= ~F_Z;
m_pc += 4;
- if (read_8(m_tmp32) & (1 << (operand & 7)))
+ if (read_8(m_tmpea) & (1 << (operand & 7)))
{
m_pc += (s8)m_tmp8;
m_icount--;
@@ -1974,20 +1879,11 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
// BBS dir:bp, disp8
case 0xa8: case 0xa9: case 0xaa: case 0xab: case 0xac: case 0xad: case 0xae: case 0xaf:
- m_tmp32 = read_8((m_pcb<<16) | (m_pc+2));
- if (m_prefix_valid)
- {
- m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16) | (m_dpr<<8);
- }
- else
- {
- m_tmp32 |= (m_dtb<<16) | (m_dpr<<8);
- }
+ m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2)));
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 3));
m_ps &= ~F_Z;
m_pc += 4;
- if (read_8(m_tmp32) & (1 << (operand & 7)))
+ if (read_8(m_tmpea) & (1 << (operand & 7)))
{
m_pc += (s8)m_tmp8;
m_icount--;
@@ -2008,14 +1904,14 @@ void f2mc16_device::opcodes_bo6c(u8 operand)
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 = (m_prefix<<16) | m_tmp16;
+ m_tmpea = (m_prefix<<16) | m_tmp16;
}
else
{
- m_tmp32 = (m_dtb<<16) | m_tmp16;
+ m_tmpea = (m_dtb<<16) | m_tmp16;
}
- if (read_8(m_tmp32) & (1 << (operand & 7)))
+ if (read_8(m_tmpea) & (1 << (operand & 7)))
{
m_pc += (s8)m_tmp8;
m_icount--;
@@ -2311,8 +2207,8 @@ void f2mc16_device::opcodes_2b6f(u8 operand)
// MOV @RLx + #disp8, A
case 0x30: case 0x32: case 0x34: case 0x36:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
- write_8(m_tmp32, m_acc & 0xff);
+ m_tmpea = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
+ write_8(m_tmpea, m_acc & 0xff);
setNZ_8(m_acc & 0xff);
m_pc += 3;
m_icount -= 10;
@@ -2322,8 +2218,8 @@ void f2mc16_device::opcodes_2b6f(u8 operand)
case 0x38: case 0x3a: case 0x3c: case 0x3e:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmpea = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
- write_8(m_tmpea, m_acc & 0xffff);
- setNZ_8(m_acc & 0xffff);
+ write_16(m_tmpea, m_acc & 0xffff);
+ setNZ_16(m_acc & 0xffff);
m_pc += 3;
m_icount -= 10;
break;
@@ -2331,9 +2227,9 @@ void f2mc16_device::opcodes_2b6f(u8 operand)
// MOV A, @RLx + disp8
case 0x40: case 0x42: case 0x44: case 0x46:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
+ m_tmpea = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
m_acc <<= 16;
- m_acc |= read_8(m_tmp32);
+ m_acc |= read_8(m_tmpea);
setNZ_8(m_acc & 0xff);
m_pc += 3;
m_icount -= 10;
@@ -2342,10 +2238,10 @@ void f2mc16_device::opcodes_2b6f(u8 operand)
// MOVW A, @RLx + disp8
case 0x48: case 0x4a: case 0x4c: case 0x4e:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
+ m_tmpea = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8;
m_acc <<= 16;
- m_acc |= read_16(m_tmp32);
- setNZ_8(m_acc & 0xffff);
+ m_acc |= read_16(m_tmpea);
+ setNZ_16(m_acc & 0xffff);
m_pc += 3;
m_icount -= 10;
break;
@@ -2370,8 +2266,9 @@ void f2mc16_device::opcodes_ea70(u8 operand)
// ADDL A, @RWx + disp8
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
m_tmp8 = read_32((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_32(getRWbank(operand & 7, m_tmpea));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = read_32(m_tmpea);
m_acc = doADD_32(m_acc, m_tmp32);
m_pc += 3;
m_icount -= 7;
@@ -2387,8 +2284,9 @@ void f2mc16_device::opcodes_ea70(u8 operand)
// SUBL A, @RWx + disp8
case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
m_tmp8 = read_32((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_32(getRWbank(operand & 7, m_tmpea));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = read_32(m_tmpea);
m_acc = doSUB_32(m_acc, m_tmp32);
m_pc += 3;
m_icount -= 7;
@@ -2404,8 +2302,9 @@ void f2mc16_device::opcodes_ea70(u8 operand)
// CMPL A, @RWx + disp8
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
m_tmp8 = read_32((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_32(getRWbank(operand & 7, m_tmpea));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = read_32(m_tmpea);
doCMP_32(m_acc, m_tmp32);
m_pc += 3;
m_icount -= 7;
@@ -2424,8 +2323,9 @@ void f2mc16_device::opcodes_ea70(u8 operand)
// ANDL A, @RWx + disp8
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
m_tmp8 = read_32((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_32(getRWbank(operand & 7, m_tmpea));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = read_32(m_tmpea);
m_acc &= m_tmp32;
setNZ_32(m_acc);
m_ps &= ~F_V;
@@ -2449,7 +2349,8 @@ void f2mc16_device::opcodes_ea71(u8 operand)
push_16(m_pc+4);
m_tmp8 = read_8((m_pcb << 16) | (m_pc + 2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_32(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = read_32(m_tmpea);
m_pc = m_tmp32 & 0xffff;
m_pcb = (m_tmp32 >> 16) & 0xff;
m_icount -= 11;
@@ -2457,15 +2358,8 @@ void f2mc16_device::opcodes_ea71(u8 operand)
// INCL RLx
case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47:
- m_tmp64 = read_rlX((operand>>1) & 3);
- m_tmp64++;
- write_rlX((operand>>1) & 3, m_tmp64&0xffffffff);
- setNZ_32(m_tmp64 & 0xffffffff);
- m_ps &= ~F_V;
- if (m_tmp64 & 0x100000000)
- {
- m_ps |= F_V;
- }
+ m_tmp32 = doINC_32(read_rlX((operand>>1) & 3));
+ write_rlX((operand>>1) & 3, m_tmp32);
m_pc += 2;
m_icount -= 7;
break;
@@ -2474,38 +2368,25 @@ void f2mc16_device::opcodes_ea71(u8 operand)
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp64 = read_32(getRWbank(operand & 7, m_tmp16));
- m_tmp64++;
- write_32(getRWbank(operand & 7, m_tmp16), m_tmp64 & 0xffffffff);
- setNZ_32(m_tmp64 & 0xffffffff);
- m_ps &= ~F_V;
- if (m_tmp64 & 0x100000000)
- {
- m_ps |= F_V;
- }
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp32 = doINC_32(read_32(m_tmpea));
+ write_32(m_tmpea, m_tmp32);
m_pc += 3;
m_icount -= 7;
break;
// INCL addr16
case 0x5f:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 |= (m_prefix<<16);
+ m_tmpea |= (m_prefix<<16);
}
else
- m_tmp32 |= (m_dtb<<16);
- m_tmp64 = read_32(m_tmp32);
- m_tmp64++;
- write_32(m_tmp32, m_tmp64 & 0xffffffff);
- setNZ_32(m_tmp64 & 0xffffffff);
- m_ps &= ~F_V;
- if (m_tmp64 & 0x100000000)
- {
- m_ps |= F_V;
- }
+ m_tmpea |= (m_dtb<<16);
+ m_tmp32 = doINC_32(read_32(m_tmpea));
+ write_32(m_tmpea, m_tmp32);
m_pc += 4;
m_icount -= 7;
break;
@@ -2521,8 +2402,9 @@ void f2mc16_device::opcodes_ea71(u8 operand)
// MOVL A, @RWx + disp8
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- m_acc = read_32(getRWbank(operand & 7, m_tmpea));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_acc = read_32(m_tmpea);
setNZ_32(m_acc);
m_pc += 3;
m_icount -= 4;
@@ -2531,8 +2413,9 @@ void f2mc16_device::opcodes_ea71(u8 operand)
// MOVL A, @RWx + disp16
case 0x98: case 0x99: case 0x9a: case 0x9b:
m_tmp16 = read_16((m_pcb<<16) | (m_pc+2));
- m_tmpea = read_rwX(operand & 3) + (s16)m_tmp16;
- m_acc = read_32(getRWbank(operand & 3, m_tmpea));
+ m_tmp16 = read_rwX(operand & 3) + (s16)m_tmp16;
+ m_tmpea = getRWbank(operand & 3, m_tmp16);
+ m_acc = read_32(m_tmpea);
setNZ_32(m_acc);
m_pc += 4;
m_icount -= 4;
@@ -2540,17 +2423,17 @@ void f2mc16_device::opcodes_ea71(u8 operand)
// MOVL A, addr16
case 0x9f:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 |= (m_prefix << 16);
+ m_tmpea |= (m_prefix << 16);
}
else
{
- m_tmp32 |= (m_dtb << 16);
+ m_tmpea |= (m_dtb << 16);
}
- m_acc = read_32(m_tmp32);
+ m_acc = read_32(m_tmpea);
setNZ_32(m_acc);
m_pc += 4;
m_icount -= 4;
@@ -2568,7 +2451,8 @@ void f2mc16_device::opcodes_ea71(u8 operand)
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- write_32(getRWbank(operand & 7, m_tmp16), m_acc);
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ write_32(m_tmpea, m_acc);
setNZ_32(m_acc);
m_pc += 3;
m_icount -= 4;
@@ -2595,7 +2479,8 @@ void f2mc16_device::opcodes_ea71(u8 operand)
case 0xc8: case 0xc9: case 0xca: case 0xcb:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7);
- write_8(getRWbank(operand & 7, m_tmp16), m_tmp8);
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ write_8(m_tmpea, m_tmp8);
setNZ_8(m_tmp8);
m_pc += 3;
m_icount -= 2;
@@ -2626,40 +2511,27 @@ void f2mc16_device::opcodes_ea72(u8 operand)
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_16(getRWbank(operand & 7, m_tmp16));
- m_tmp32++;
- write_8(getRWbank(operand & 7, m_tmp16), m_tmp32 & 0xff);
- setNZ_8(m_tmp32 & 0xff);
- m_ps &= ~F_V;
- if (m_tmp32 & 0x100)
- {
- m_ps |= F_V;
- }
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp8 = doINC_8(read_8(m_tmpea));
+ write_8(m_tmpea, m_tmp8);
m_pc += 3;
m_icount -= 5;
break;
// INC addr16
case 0x5f:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 |= (m_prefix << 16);
+ m_tmpea |= (m_prefix << 16);
}
else
{
- m_tmp32 |= (m_dtb << 16);
- }
- m_tmp16 = read_8(m_tmp32);
- m_tmp16++;
- write_8(m_tmp32, m_tmp16 & 0xff);
- setNZ_8(m_tmp16 & 0xff);
- m_ps &= ~F_V;
- if (m_tmp16 & 0x100)
- {
- m_ps |= F_V;
+ m_tmpea |= (m_dtb << 16);
}
+ m_tmp8 = doINC_8(read_8(m_tmpea));
+ write_8(m_tmpea, m_tmp8);
m_pc += 4;
m_icount -= 5;
break;
@@ -2668,8 +2540,9 @@ void f2mc16_device::opcodes_ea72(u8 operand)
case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
m_acc <<= 16;
- m_acc |= read_8(getRWbank(operand & 7, m_tmp16));
+ m_acc |= read_8(m_tmpea);
setNZ_8(m_acc & 0xff);
m_pc += 3;
m_icount -= 5;
@@ -2679,7 +2552,8 @@ void f2mc16_device::opcodes_ea72(u8 operand)
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- write_8(getRWbank(operand & 7, m_tmp16), m_acc & 0xff);
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ write_8(m_tmpea, m_acc & 0xff);
setNZ_8(m_acc & 0xff);
m_pc += 3;
m_icount -= 10;
@@ -2699,40 +2573,27 @@ void f2mc16_device::opcodes_ea73(u8 operand)
case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_16(getRWbank(operand & 7, m_tmp16));
- m_tmp32++;
- write_16(getRWbank(operand & 7, m_tmp16), m_tmp32 & 0xffff);
- setNZ_16(m_tmp32 & 0xffff);
- m_ps &= ~F_V;
- if (m_tmp32 & 0x10000)
- {
- m_ps |= F_V;
- }
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = doINC_16(read_16(m_tmpea));
+ write_16(m_tmpea, m_tmp16);
m_pc += 3;
m_icount -= 5;
break;
// INCW addr16
case 0x5f:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 |= (m_prefix << 16);
+ m_tmpea |= (m_prefix << 16);
}
else
{
- m_tmp32 |= (m_dtb << 16);
- }
- m_tmp32aux = read_16(m_tmp32);
- m_tmp32aux++;
- write_16(m_tmp32, m_tmp32aux & 0xffff);
- setNZ_16(m_tmp32aux & 0xffff);
- m_ps &= ~F_V;
- if (m_tmp32aux & 0x10000)
- {
- m_ps |= F_V;
+ m_tmpea |= (m_dtb << 16);
}
+ m_tmp16 = doINC_16(read_16(m_tmpea));
+ write_16(m_tmpea, m_tmp16);
m_pc += 4;
m_icount -= 5;
break;
@@ -2741,51 +2602,37 @@ void f2mc16_device::opcodes_ea73(u8 operand)
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp32 = read_16(getRWbank(operand & 7, m_tmp16));
- m_tmp32aux = m_tmp32;
- m_tmp32--;
- write_16(getRWbank(operand & 7, m_tmp16), m_tmp32 & 0xffff);
- setNZ_16(m_tmp32 & 0xffff);
- m_ps &= ~F_V;
- if ((m_tmp32aux ^ 0x0001) & (m_tmp32aux ^ m_tmp32) & 0x8000)
- {
- m_ps |= F_V;
- }
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = doDEC_16(read_16(m_tmpea));
+ write_16(m_tmpea, m_tmp16);
m_pc += 3;
m_icount -= 5;
break;
// DECW addr16
case 0x7f:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
if (m_prefix_valid)
{
m_prefix_valid = false;
- m_tmp32 |= (m_prefix << 16);
+ m_tmpea |= (m_prefix << 16);
}
else
{
- m_tmp32 |= (m_dtb << 16);
- }
- m_tmp16 = read_16(m_tmp32);
- m_tmp16aux = m_tmp16;
- m_tmp16--;
- write_16(m_tmp32, m_tmp16);
- setNZ_16(m_tmp16);
- m_ps &= ~F_V;
- if ((m_tmp16aux ^ 0x0001) & (m_tmp16aux ^ m_tmp16) & 0x8000)
- {
- m_ps |= F_V;
+ m_tmpea |= (m_dtb << 16);
}
+ m_tmp16 = doDEC_16(read_16(m_tmpea));
+ write_16(m_tmpea, m_tmp16);
m_pc += 4;
m_icount -= 5;
break;
// MOVW A, @RWx
case 0x88: case 0x89: case 0x8a: case 0x8b:
- m_tmpea = read_rwX(operand & 3);
+ m_tmp16 = read_rwX(operand & 3);
+ m_tmpea = getRWbank(operand & 3, m_tmp16);
m_acc <<= 16;
- m_acc |= read_16(getRWbank(operand & 3, m_tmpea));
+ m_acc |= read_16(m_tmpea);
setNZ_16(m_acc & 0xffff);
m_pc += 2;
m_icount -= 2;
@@ -2796,7 +2643,8 @@ void f2mc16_device::opcodes_ea73(u8 operand)
m_tmp8 = read_16((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_16((m_pcb<<16) | (m_pc+3));
m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8;
- write_16(getRWbank(operand & 7, m_tmpea), m_tmp16);
+ m_tmpea = getRWbank(operand & 7, m_tmpea);
+ write_16(m_tmpea, m_tmp16);
m_pc += 5;
m_icount -= 4;
break;
@@ -2806,23 +2654,24 @@ void f2mc16_device::opcodes_ea73(u8 operand)
m_tmp16 = read_16((m_pcb<<16) | (m_pc+2));
m_tmp32 = read_16((m_pcb<<16) | (m_pc+4));
m_tmpea = read_rwX(operand & 7) + (s16)m_tmp16;
- write_16(getRWbank(operand & 7, m_tmpea), m_tmp32 & 0xffff);
+ m_tmpea = getRWbank(operand & 7, m_tmpea);
+ write_16(m_tmpea, m_tmp32 & 0xffff);
m_pc += 6;
m_icount -= 4;
break;
// MOVW addr16, #imm16
case 0xdf:
- m_tmp32 = read_16((m_pcb<<16) | (m_pc+2));
+ m_tmpea = read_16((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_16((m_pcb<<16) | (m_pc+4));
if (m_prefix_valid)
{
m_prefix_valid = false;
- write_16((m_prefix<<16) | m_tmp32, m_tmp16);
+ write_16((m_prefix<<16) | m_tmpea, m_tmp16);
}
else
{
- write_16((m_dtb<<16) | m_tmp32, m_tmp16);
+ write_16((m_dtb<<16) | m_tmpea, m_tmp16);
}
m_pc += 6;
m_icount -= 4;
@@ -2842,7 +2691,8 @@ void f2mc16_device::opcodes_ea74(u8 operand)
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp8 = read_8(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp8 = read_8(m_tmpea);
doCMP_8(m_acc & 0xff, m_tmp8);
m_pc += 3;
m_icount -= 10;
@@ -2850,17 +2700,9 @@ void f2mc16_device::opcodes_ea74(u8 operand)
// DBNZ Rx, disp8
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
- m_tmp16 = read_rX(operand & 7);
- m_tmp16aux = m_tmp16;
- m_tmp16--;
- write_rX(operand & 7, m_tmp16 & 0xff);
- setNZ_8(m_tmp16 & 0xff);
- m_ps &= ~F_V;
- if ((m_tmp16aux ^ 0x01) & (m_tmp16aux ^ m_tmp16) & 0x80)
- {
- m_ps |= F_V;
- }
- if (m_tmp16 & 0xff)
+ m_tmp8 = doDEC_8(read_rX(operand & 7));
+ write_rX(operand & 7, m_tmp8);
+ if (m_tmp8 != 0)
{
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_pc = (m_pc + 3) + (s8)m_tmp8;
@@ -2906,7 +2748,8 @@ void f2mc16_device::opcodes_ea76(u8 operand)
case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
m_tmp16aux = doADD_16(m_acc & 0xffff, m_tmp16);
m_acc &= 0xffff0000;
m_acc |= m_tmp16aux;
@@ -2927,7 +2770,8 @@ void f2mc16_device::opcodes_ea76(u8 operand)
case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
m_tmp16aux = doSUB_16(m_acc & 0xffff, m_tmp16);
m_acc &= 0xffff0000;
m_acc |= m_tmp16aux;
@@ -2965,7 +2809,8 @@ void f2mc16_device::opcodes_ea76(u8 operand)
case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
doCMP_16(m_acc & 0xffff, m_tmp16);
m_pc += 3;
m_icount -= 10;
@@ -3002,7 +2847,8 @@ void f2mc16_device::opcodes_ea76(u8 operand)
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
m_acc |= m_tmp16;
setNZ_16(m_acc & 0xffff);
m_ps &= ~F_V;
@@ -3050,7 +2896,8 @@ void f2mc16_device::opcodes_ea78(u8 operand)
case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
m_tmp8 = read_8((m_pcb<<16) | (m_pc+2));
m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
- m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ m_tmpea = getRWbank(operand & 7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
if (m_tmp16 == 0)
{
m_icount -= 4;
@@ -3070,11 +2917,11 @@ void f2mc16_device::opcodes_ea78(u8 operand)
m_tmp16 = read_rwX(operand & 7);
if (m_tmp16)
{
- m_tmp32aux = m_acc / m_tmp16;
+ m_tmp32 = m_acc / m_tmp16;
m_tmp16 = (m_acc % m_tmp16) & 0xffff;
// overflow?
- if (m_tmp32aux >= 0x10000)
+ if (m_tmp32 >= 0x10000)
{
m_ps |= F_V;
m_icount -= 7;
@@ -3083,7 +2930,7 @@ void f2mc16_device::opcodes_ea78(u8 operand)
else // normal operation
{
m_acc &= ~0xffff;
- m_acc |= (m_tmp32aux & 0xffff);
+ m_acc |= (m_tmp32 & 0xffff);
write_rwX(operand & 7, m_tmp16);
m_icount -= 22;
}
@@ -3106,9 +2953,9 @@ void f2mc16_device::opcodes_rwi7a(u8 operand)
{
if (operand & 0x10)
{ // MOV Rx, @RWy + disp8
- m_tmpea = read_rwX(operand & 7) + (s8)read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 = getRWbank(operand & 0x7, m_tmpea);
- m_tmp8 = read_8(m_tmp32);
+ m_tmp16 = read_rwX(operand & 7) + (s8)read_8((m_pcb<<16) | (m_pc+2));
+ m_tmpea = getRWbank(operand & 0x7, m_tmp16);
+ m_tmp8 = read_8(m_tmpea);
write_rX((operand>>5) & 0x7, m_tmp8);
setNZ_8(m_tmp8);
m_pc += 3;
@@ -3128,9 +2975,9 @@ void f2mc16_device::opcodes_rwi7b(u8 operand)
{
if (operand & 0x10)
{ // MOVW RWx, @RWy + disp8
- m_tmpea = read_rwX(operand & 7) + (s8)read_8((m_pcb<<16) | (m_pc+2));
- m_tmp32 = getRWbank(operand & 0x7, m_tmpea);
- m_tmp16 = read_16(m_tmp32);
+ m_tmp16 = read_rwX(operand & 7) + (s8)read_8((m_pcb<<16) | (m_pc+2));
+ m_tmpea = getRWbank(operand & 0x7, m_tmp16);
+ m_tmp16 = read_16(m_tmpea);
write_rwX((operand>>5) & 0x7, m_tmp16);
setNZ_16(m_tmp16);
m_pc += 3;
diff --git a/src/devices/cpu/f2mc16/f2mc16.h b/src/devices/cpu/f2mc16/f2mc16.h
index 10dbc237734..fc1ffc3aa55 100644
--- a/src/devices/cpu/f2mc16/f2mc16.h
+++ b/src/devices/cpu/f2mc16/f2mc16.h
@@ -65,11 +65,10 @@ private:
address_space_config m_program_config;
address_space *m_program;
- u16 m_pc, m_usp, m_ssp, m_ps, m_tmp16, m_tmpea, m_tmp16aux;
+ u16 m_pc, m_usp, m_ssp, m_ps, m_tmp16, m_tmp16aux;
u8 m_pcb, m_dtb, m_usb, m_ssb, m_adb, m_dpr, m_tmp8, m_prefix;
- u32 m_acc, m_temp, m_tmp32, m_tmp32aux;
+ u32 m_acc, m_temp, m_tmp32, m_tmpea;
s32 m_icount;
- u64 m_tmp64;
bool m_prefix_valid;
inline u8 read_8(u32 addr)
@@ -190,13 +189,28 @@ private:
case 3:
case 7:
- return (m_usb<<16) | uBankAddr;
+ if (m_ps & F_S)
+ return (m_ssb<<16) | uBankAddr;
+ else
+ return (m_usb<<16) | uBankAddr;
}
// this can't happen, but GCC insists
return (m_dtb<<16) | uBankAddr;
}
+ // get the full 24 bit address for a short direct access
+ inline u32 getdirbank(u8 uDirAddr)
+ {
+ if (m_prefix_valid)
+ {
+ m_prefix_valid = false;
+ return (m_prefix<<16) | (m_dpr<<8) | uDirAddr;
+ }
+ else
+ return (m_dtb<<16) | (m_dpr<<8) | uDirAddr;
+ }
+
inline void push_8(u8 val)
{
if (m_ps & F_S)
@@ -321,45 +335,15 @@ private:
inline void doCMP_8(u8 lhs, u8 rhs)
{
- u16 tmp16 = lhs - rhs;
- setNZ_8(tmp16 & 0xff);
- m_ps &= ~(F_C|F_V);
- if (tmp16 & 0x100)
- {
- m_ps |= F_C;
- }
- if ((lhs ^ rhs) & (lhs ^ (tmp16 & 0xff)) & 0x80)
- {
- m_ps |= F_V;
- }
+ (void)doSUB_8(lhs, rhs);
}
inline void doCMP_16(u16 lhs, u16 rhs)
{
- u32 tmp32 = lhs - rhs;
- setNZ_16(tmp32 & 0xffff);
- m_ps &= ~(F_C|F_V);
- if (tmp32 & 0x10000)
- {
- m_ps |= F_C;
- }
- if ((lhs ^ rhs) & (lhs ^ (tmp32 & 0xffff)) & 0x8000)
- {
- m_ps |= F_V;
- }
+ (void)doSUB_16(lhs, rhs);
}
inline void doCMP_32(u32 lhs, u32 rhs)
{
- u64 tmp64 = lhs - rhs;
- setNZ_32(tmp64 & 0xffffffff);
- m_ps &= ~(F_C|F_V);
- if (tmp64 & 0x100000000)
- {
- m_ps |= F_C;
- }
- if ((lhs ^ rhs) & (lhs ^ (tmp64 & 0xffffffff)) & 0x80000000)
- {
- m_ps |= F_V;
- }
+ (void)doSUB_32(lhs, rhs);
}
inline u8 doSUB_8(u8 lhs, u8 rhs)
@@ -403,7 +387,7 @@ private:
{
m_ps |= F_C;
}
- if ((lhs ^ rhs) & (lhs ^ (tmp64 & 0xffffffff)) & 0x8000000)
+ if ((lhs ^ rhs) & (lhs ^ (tmp64 & 0xffffffff)) & 0x80000000)
{
m_ps |= F_V;
}
@@ -459,6 +443,74 @@ private:
return tmp64 & 0xffffffff;
}
+ inline u8 doINC_8(u8 val)
+ {
+ val++;
+ setNZ_8(val);
+ if (val == 0x80)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+ inline u16 doINC_16(u16 val)
+ {
+ val++;
+ setNZ_16(val);
+ if (val == 0x8000)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+ inline u32 doINC_32(u32 val)
+ {
+ val++;
+ setNZ_32(val);
+ if (val == 0x80000000)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+
+ inline u8 doDEC_8(u8 val)
+ {
+ val--;
+ setNZ_8(val);
+ if (val == 0x7f)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+ inline u16 doDEC_16(u16 val)
+ {
+ val--;
+ setNZ_16(val);
+ if (val == 0x7fff)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+ inline u32 doDEC_32(u32 val)
+ {
+ val--;
+ setNZ_32(val);
+ if (val == 0x7fffffff)
+ m_ps |= F_V;
+ else
+ m_ps &= ~F_V;
+
+ return val;
+ }
+
inline void take_branch()
{
u8 tmp8 = read_8((m_pcb << 16) | (m_pc+1));