diff options
author | 2021-07-28 16:43:28 -0400 | |
---|---|---|
committer | 2021-07-28 16:45:18 -0400 | |
commit | f3cae23ba079a3fa6f1591d68126a4a80b3a9a1c (patch) | |
tree | eb39d1f4cf446c9af713dac330b161cdb8a32743 | |
parent | 58ef5d8372c595d555cc8610a1707a439b3f9fa9 (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.cpp | 527 | ||||
-rw-r--r-- | src/devices/cpu/f2mc16/f2mc16.h | 128 |
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)); |