diff options
author | 2021-07-28 23:09:56 -0400 | |
---|---|---|
committer | 2021-07-28 23:10:42 -0400 | |
commit | 5cbd1144732e8c0e1c558ffd6715dfbabf2668b7 (patch) | |
tree | fadb04511c69f340965c87441add59bd5fcff8b2 | |
parent | f4213dc209ebf2247f3c7e46f32d9bd2711bb374 (diff) |
f2mc16: Updates
- Emulate many more opcodes
- Add interrupt callback for debugger
- Correct disassembly of MOVW io, A
-rw-r--r-- | src/devices/cpu/f2mc16/f2mc16.cpp | 412 | ||||
-rw-r--r-- | src/devices/cpu/f2mc16/f2mc16d.cpp | 5 |
2 files changed, 402 insertions, 15 deletions
diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp index edd5cb2fed1..a55193b5737 100644 --- a/src/devices/cpu/f2mc16/f2mc16.cpp +++ b/src/devices/cpu/f2mc16/f2mc16.cpp @@ -438,8 +438,22 @@ void f2mc16_device::execute_run() // stream << "SUBDC A"; break; + // EXT case 0x14: - // stream << "EXT"; + m_ps &= ~(F_N|F_Z); + if (m_acc & 0x80) + { + m_acc |= 0xff00; + m_ps |= F_N; + } + else + { + m_acc &= 0xffff00ff; + if ((m_acc & 0xff) == 0) + m_pc |= F_Z; + } + m_pc++; + m_icount--; break; // ZEXT @@ -454,8 +468,11 @@ void f2mc16_device::execute_run() m_icount--; break; + // SWAP case 0x16: - // stream << "SWAP"; + m_acc = (m_acc & 0xffff0000) | swapendian_int16(m_acc & 0xffff); + m_pc++; + m_icount -= 3; break; // ADDSP #imm8 @@ -707,8 +724,14 @@ void f2mc16_device::execute_run() m_icount -= 2; break; + // OR A, #imm8 case 0x35: - // util::stream_format(stream, "OR A, #$%02x", operand); + m_tmp8 = read_8((m_pcb<<16) | (m_pc+1)); + m_acc |= m_tmp8; + setNZ_8(m_acc & 0xff); + m_ps &= ~F_V; + m_pc += 2; + m_icount -= 2; break; // XOR A, #imm8 @@ -1701,6 +1724,18 @@ void f2mc16_device::opcodes_bo6c(u8 operand) { switch (operand) { + // MOVB A, io:bp + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + m_tmpea = 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; + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 4; + break; + // MOVB A, dir:bp case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f: m_tmpea = getdirbank(read_8((m_pcb<<16) | (m_pc+2))); @@ -1710,7 +1745,21 @@ void f2mc16_device::opcodes_bo6c(u8 operand) m_acc |= 0xff; setNZ_8(m_acc & 0xff); m_pc += 3; - m_icount -= 7; + m_icount -= 5; + break; + + // MOVB io:bp, A + case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: + m_tmpea = 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 &= ~(1 << (operand & 7)); + write_8(m_tmpea, m_tmp8); + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 6; break; // MOVB dir:bp, A @@ -1923,6 +1972,24 @@ void f2mc16_device::opcodes_bo6c(u8 operand) m_icount -= 7; break; + // WTBS io:bp + case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: + m_tmpea = read_8((m_pcb<<16) | (m_pc+2)); + m_tmp8 = read_8(m_tmpea); + if (m_tmp8 & (1 << (operand & 7))) + m_pc += 3; + m_icount -= 4; + break; + + // WTBC io:bp + case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: + m_tmpea = read_8((m_pcb<<16) | (m_pc+2)); + m_tmp8 = read_8(m_tmpea); + if (!(m_tmp8 & (1 << (operand & 7)))) + m_pc += 3; + m_icount -= 4; + break; + default: fatalerror("Unknown F2MC 6C bit-op opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc); break; @@ -2204,7 +2271,7 @@ void f2mc16_device::opcodes_2b6f(u8 operand) } break; - // MOV @RLx + #disp8, A + // MOV @RLx + disp8, A case 0x30: case 0x32: case 0x34: case 0x36: m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); m_tmpea = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8; @@ -2214,7 +2281,7 @@ void f2mc16_device::opcodes_2b6f(u8 operand) m_icount -= 10; break; - // MOVW @RLx + #disp8, A + // MOVW @RLx + disp8, A 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; @@ -2478,8 +2545,42 @@ void f2mc16_device::opcodes_ea71(u8 operand) // MOV @RWx, #imm8 case 0xc8: case 0xc9: case 0xca: case 0xcb: m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); - m_tmp16 = read_rwX(operand & 7); - m_tmpea = getRWbank(operand & 7, m_tmp16); + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_8(m_tmpea, m_tmp8); + setNZ_8(m_tmp8); + m_pc += 3; + m_icount -= 2; + break; + + // MOV @RWx+, #imm8 + case 0xcc: case 0xcd: case 0xce: case 0xcf: + m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); + m_tmp16 = read_rwX(operand & 3); + write_rwX(operand & 3, m_tmp16 + 1); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_8(m_tmpea, m_tmp8); + setNZ_8(m_tmp8); + m_pc += 3; + m_icount -= 4; + break; + + // MOV @RWx + disp8, #imm8 + case 0xd0: case 0xd1: case 0xd2: case 0xd3: case 0xd4: case 0xd5: case 0xd6: case 0xd7: + m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); + m_tmp16 = read_8((m_pcb<<16) | (m_pc+3)); + m_tmpea = read_rwX(operand & 7) + (s8)m_tmp8; + m_tmpea = getRWbank(operand & 7, m_tmpea); + write_8(m_tmpea, m_tmp16 & 0xff); + setNZ_8(m_tmp16 & 0xff); + m_pc += 4; + m_icount -= 2; + break; + + // MOV @RWx + RW7, #imm8 + case 0xdc: case 0xdd: + m_tmp16 = read_rwX(operand & 1) + read_rwX(7); + m_tmpea = getRWbank(operand & 3, m_tmp16); write_8(m_tmpea, m_tmp8); setNZ_8(m_tmp8); m_pc += 3; @@ -2507,6 +2608,24 @@ void f2mc16_device::opcodes_ea72(u8 operand) { switch (operand) { + // INC Rx + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: + m_tmp8 = doINC_8(read_rX(operand & 7)); + write_rX(operand & 7, m_tmp8); + m_pc += 2; + m_icount -= 3; + break; + + // INC @RWx + case 0x48: case 0x49: case 0x4a: case 0x4b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp8 = doINC_8(read_8(m_tmpea)); + write_8(m_tmpea, m_tmp8); + m_pc += 2; + m_icount -= 5; + break; + // INC @RWx + disp8 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)); @@ -2536,6 +2655,68 @@ void f2mc16_device::opcodes_ea72(u8 operand) m_icount -= 5; break; + // DEC Rx + case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: + m_tmp8 = doDEC_8(read_rX(operand & 7)); + write_rX(operand & 7, m_tmp8); + m_pc += 2; + m_icount -= 3; + break; + + // DEC @RWx + case 0x68: case 0x69: case 0x6a: case 0x6b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp8 = doDEC_8(read_8(m_tmpea)); + write_8(m_tmpea, m_tmp8); + m_pc += 2; + m_icount -= 5; + break; + + // MOV A, @RWx + case 0x88: case 0x89: case 0x8a: case 0x8b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_acc <<= 16; + m_acc |= read_8(m_tmpea); + setNZ_8(m_acc & 0xff); + m_pc += 2; + m_icount -= 5; + break; + + // MOV A, @RWx+ + case 0x8c: case 0x8d: case 0x8e: case 0x8f: + m_tmp16 = read_rwX(operand & 3); + write_rwX(operand & 3, m_tmp16 + 1); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_acc <<= 16; + m_acc |= read_8(m_tmpea); + setNZ_8(m_acc & 0xff); + m_pc += 2; + m_icount -= 7; + break; + + // MOV @RWx, A + case 0xa8: case 0xa9: case 0xaa: case 0xab: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_8(m_tmpea, m_acc & 0xff); + setNZ_8(m_acc & 0xff); + m_pc += 2; + m_icount -= 5; + break; + + // MOV @RWx+, A + case 0xac: case 0xad: case 0xae: case 0xaf: + m_tmp16 = read_rwX(operand & 3); + write_rwX(operand & 3, m_tmp16 + 1); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_8(m_tmpea, m_acc & 0xff); + setNZ_8(m_acc & 0xff); + m_pc += 2; + m_icount -= 7; + break; + // MOV 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)); @@ -2548,6 +2729,17 @@ void f2mc16_device::opcodes_ea72(u8 operand) m_icount -= 5; break; + // MOV A, @RWx + RW7 + case 0x9c: case 0x9d: + m_tmp16 = read_rwX(operand & 1) + read_rwX(7); + m_tmpea = getRWbank(operand & 1, m_tmp16); + m_acc <<= 16; + m_acc |= read_8(m_tmpea); + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 7; + break; + // MOV @RWx + disp8, A 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)); @@ -2556,7 +2748,17 @@ void f2mc16_device::opcodes_ea72(u8 operand) write_8(m_tmpea, m_acc & 0xff); setNZ_8(m_acc & 0xff); m_pc += 3; - m_icount -= 10; + m_icount -= 5; + break; + + // MOV @RWx + RW7, A + case 0xbc: case 0xbd: + m_tmp16 = read_rwX(operand & 1) + read_rwX(7); + m_tmpea = getRWbank(operand & 1, m_tmp16); + write_8(m_tmpea, m_acc & 0xff); + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 7; break; default: @@ -2569,6 +2771,24 @@ void f2mc16_device::opcodes_ea73(u8 operand) { switch (operand) { + // INCW RWx + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: + m_tmp16 = doINC_16(read_rwX(operand & 7)); + write_rwX(operand & 7, m_tmp16); + m_pc += 2; + m_icount -= 3; + break; + + // INCW @RWx + case 0x48: case 0x49: case 0x4a: case 0x4b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp16 = doINC_16(read_16(m_tmpea)); + write_16(m_tmpea, m_tmp16); + m_pc += 3; + m_icount -= 5; + break; + // INCW @RWx + disp8 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)); @@ -2598,6 +2818,24 @@ void f2mc16_device::opcodes_ea73(u8 operand) m_icount -= 5; break; + // DECW RWx + case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: + m_tmp16 = doDEC_16(read_rwX(operand & 7)); + write_rwX(operand & 7, m_tmp16); + m_pc += 2; + m_icount -= 3; + break; + + // DECW @RWx + case 0x68: case 0x69: case 0x6a: case 0x6b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp16 = doDEC_16(read_16(m_tmpea)); + write_16(m_tmpea, m_tmp16); + m_pc += 3; + m_icount -= 5; + break; + // DECW @RWx + disp8 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)); @@ -2635,7 +2873,71 @@ void f2mc16_device::opcodes_ea73(u8 operand) m_acc |= read_16(m_tmpea); setNZ_16(m_acc & 0xffff); m_pc += 2; - m_icount -= 2; + m_icount -= 5; + break; + + // MOVW A, @RWx+ + case 0x8c: case 0x8d: case 0x8e: case 0x8f: + m_tmp16 = read_rwX(operand & 3); + write_rwX(operand & 3, m_tmp16 + 2); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_acc <<= 16; + m_acc |= read_16(m_tmpea); + setNZ_16(m_acc & 0xffff); + m_pc += 2; + m_icount -= 7; + break; + + // MOVW @RWx, A + case 0xa8: case 0xa9: case 0xaa: case 0xab: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_16(m_tmpea, m_acc & 0xffff); + setNZ_16(m_acc & 0xffff); + m_pc += 2; + m_icount -= 5; + break; + + // MOVW @RWx+, A + case 0xac: case 0xad: case 0xae: case 0xaf: + m_tmp16 = read_rwX(operand & 3); + write_rwX(operand & 3, m_tmp16 + 2); + m_tmpea = getRWbank(operand & 3, m_tmp16); + write_16(m_tmpea, m_acc & 0xffff); + setNZ_16(m_acc & 0xffff); + m_pc += 2; + m_icount -= 7; + break; + + // MOVW @RWx + RW7, A + case 0xbc: case 0xbd: + m_tmp16 = read_rwX(operand & 1) + read_rwX(7); + m_tmpea = getRWbank(operand & 1, m_tmp16); + write_16(m_tmpea, m_acc & 0xffff); + setNZ_16(m_acc & 0xffff); + m_pc += 2; + m_icount -= 7; + break; + + // MOVW @RWx, #imm16 + case 0xc8: case 0xc9: case 0xca: case 0xcb: + m_tmp16 = read_16((m_pcb<<16) | (m_pc+2)); + m_tmpea = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmpea); + write_16(m_tmpea, m_tmp16); + m_pc += 4; + m_icount -= 4; + break; + + // MOVW @RWx+, #imm16 + case 0xcc: case 0xcd: case 0xce: case 0xcf: + m_tmp16 = read_16((m_pcb<<16) | (m_pc+2)); + m_tmpea = read_rwX(operand & 3); + write_rwX(operand & 3, (m_tmpea + 2) & 0xffff); + m_tmpea = getRWbank(operand & 3, m_tmpea); + write_16(m_tmpea, m_tmp16); + m_pc += 4; + m_icount -= 6; break; // MOVW @RWx + disp8, #imm16 @@ -2687,6 +2989,13 @@ void f2mc16_device::opcodes_ea74(u8 operand) { switch (operand) { + // CMP A, Rx + case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: + doCMP_8(m_acc & 0xff, read_rX(operand & 7)); + m_pc += 2; + m_icount -= 2; + break; + // CMP A, @RWx + disp8 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)); @@ -2698,6 +3007,26 @@ void f2mc16_device::opcodes_ea74(u8 operand) m_icount -= 10; break; + // OR A, Rx + case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: + m_acc |= read_rX(operand & 7); + setNZ_8(m_acc & 0xff); + m_ps &= ~F_V; + m_pc += 2; + m_icount -= 3; + break; + + // OR A, @RWx + case 0xa8: case 0xa9: case 0xaa: case 0xab: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_acc |= read_8(m_tmpea); + setNZ_8(m_acc & 0xff); + m_ps &= ~F_V; + m_pc += 2; + m_icount -= 7; + break; + // DBNZ Rx, disp8 case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7: m_tmp8 = doDEC_8(read_rX(operand & 7)); @@ -2725,6 +3054,24 @@ void f2mc16_device::opcodes_ea75(u8 operand) { switch (operand) { + // ADD Rx, A + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + m_tmp8 = doADD_8(read_rX(operand & 7), m_acc & 0xff); + write_rX(operand & 7, m_tmp8); + m_pc += 2; + m_icount -= 3; + break; + + // ADD @RWx, A + case 0x08: case 0x09: case 0x0a: case 0x0b: + m_tmp16 = read_rwX(operand & 7); + m_tmpea = getRWbank(operand & 7, m_tmp16); + m_tmp8 = doADD_8(read_8(m_tmpea), m_acc & 0xff); + write_8(m_tmpea, m_tmp8); + m_pc += 2; + m_icount -= 7; + break; + default: fatalerror("Unknown F2MC EA75 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc); break; @@ -2736,7 +3083,7 @@ void f2mc16_device::opcodes_ea76(u8 operand) switch (operand) { // ADDW A, RWx - case 0x0: case 0x1: case 0x2: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7: + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: m_tmp16 = doADD_16(m_acc & 0xffff, read_rwX(operand & 7)); m_acc &= 0xffff0000; m_acc |= m_tmp16; @@ -2744,6 +3091,18 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_icount -= 3; break; + // ADDW A, @RWx + case 0x08: case 0x09: case 0x0a: case 0x0b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp16 = read_16(m_tmpea); + m_tmp16aux = doADD_16(m_acc & 0xffff, m_tmp16); + m_acc &= 0xffff0000; + m_acc |= m_tmp16aux; + m_pc += 2; + m_icount -= 5; + break; + // ADDW A, @RWx + disp8 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)); @@ -2754,7 +3113,7 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_acc &= 0xffff0000; m_acc |= m_tmp16aux; m_pc += 3; - m_icount -= 3; + m_icount -= 5; break; // SUBW A, RWx @@ -2766,6 +3125,18 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_icount -= 3; break; + // SUBW A, @RWx + case 0x28: case 0x29: case 0x2a: case 0x2b: + m_tmp16 = read_rwX(operand & 3); + m_tmpea = getRWbank(operand & 3, m_tmp16); + m_tmp16 = read_16(m_tmpea); + m_tmp16aux = doSUB_16(m_acc & 0xffff, m_tmp16); + m_acc &= 0xffff0000; + m_acc |= m_tmp16aux; + m_pc += 2; + m_icount -= 5; + break; + // SUBW A, @RWx + disp8 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)); @@ -2776,7 +3147,7 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_acc &= 0xffff0000; m_acc |= m_tmp16aux; m_pc += 3; - m_icount -= 3; + m_icount -= 5; break; // SUBW A, addr16 @@ -2843,6 +3214,18 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_icount -= 4; break; + // ORW A, @RWx + case 0xa8: case 0xa9: case 0xaa: case 0xab: + m_tmp16 = read_rwX(operand & 7); + 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; + m_pc += 2; + m_icount -= 6; + break; + // ORW A, @RWx + disp8 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)); @@ -2853,7 +3236,7 @@ void f2mc16_device::opcodes_ea76(u8 operand) setNZ_16(m_acc & 0xffff); m_ps &= ~F_V; m_pc += 3; - m_icount -= 3; + m_icount -= 6; break; default: @@ -3020,6 +3403,7 @@ void f2mc16_device::clear_irq(int vector) // note: this function must not use m_tmp16 unless you change RETI void f2mc16_device::take_irq(int vector, int level) { + standard_irq_callback(vector); // printf("take_irq: vector %d, level %d, old PC = %02x%04x\n", vector, level, m_pcb, m_pc); push_16_ssp(m_acc>>16); push_16_ssp(m_acc & 0xffff); diff --git a/src/devices/cpu/f2mc16/f2mc16d.cpp b/src/devices/cpu/f2mc16/f2mc16d.cpp index 705327c9ce4..2d121f32f30 100644 --- a/src/devices/cpu/f2mc16/f2mc16d.cpp +++ b/src/devices/cpu/f2mc16/f2mc16d.cpp @@ -1450,7 +1450,10 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const f case 0x49: case 0x59: util::stream_format(stream, "%-8s", "MOVW"); - format_dir(stream, segm, opcodes.r8(pc + bytes++)); + if (BIT(op, 4)) + format_io(stream, opcodes.r8(pc + bytes++)); + else + format_dir(stream, segm, opcodes.r8(pc + bytes++)); stream << ", A"; break; |