From ce43fc50dc0d9b5bccfe63992f3e377b2e8c6e29 Mon Sep 17 00:00:00 2001 From: arbee Date: Sun, 14 Jul 2019 10:22:37 -0400 Subject: f2mc16: Many more opcodes supported, several bugfixes to both disassembly and emulation (nw) --- src/devices/cpu/f2mc16/f2mc16.cpp | 465 ++++++++++++++++++++++++++++++++-- src/devices/cpu/f2mc16/f2mc16.h | 4 + src/devices/cpu/f2mc16/f2mc16dasm.cpp | 85 ++++++- src/mame/drivers/tomy_princ.cpp | 1 + 4 files changed, 515 insertions(+), 40 deletions(-) diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp index 7f2c737d9da..6be664d9916 100644 --- a/src/devices/cpu/f2mc16/f2mc16.cpp +++ b/src/devices/cpu/f2mc16/f2mc16.cpp @@ -307,7 +307,6 @@ void f2mc16_device::execute_run() // LSLW A case 0x0c: m_tmp16 = m_acc & 0xffff; - m_acc &= 0xffff0000; m_ps &= ~F_C; if (m_tmp16 & 0x8000) { @@ -315,6 +314,7 @@ void f2mc16_device::execute_run() } m_tmp16 <<= 1; setNZ_16(m_tmp16); + m_acc &= 0xffff0000; m_acc |= m_tmp16; m_pc++; m_icount -= 2; @@ -392,8 +392,21 @@ void f2mc16_device::execute_run() m_icount -= 2; break; + // EXTW case 0x1c: - // stream << "EXTW"; + m_acc &= 0xffff; + m_ps &= ~(F_N|F_Z); + if (m_acc & 0x8000) + { + m_acc |= 0xffff0000; + m_ps |= F_N; + } + else + { + m_ps |= F_Z; + } + m_pc++; + m_icount-=2; break; // ZEXTW @@ -404,8 +417,13 @@ void f2mc16_device::execute_run() m_icount--; break; + // SWAPW case 0x1e: - // stream << "SWAPW"; + m_tmp16 = (m_acc & 0xffff); + m_acc >>= 16; + m_acc |= (m_tmp16 << 16); + m_pc++; + m_icount -= 2; break; case 0x20: @@ -451,6 +469,8 @@ void f2mc16_device::execute_run() // ADDW A case 0x28: m_tmp16 = doADD_16((m_acc>>16) & 0xffff, m_acc & 0xffff); + m_acc &= 0xffff0000; + m_acc |= m_tmp16; m_pc++; m_icount -= 2; break; @@ -480,8 +500,11 @@ void f2mc16_device::execute_run() } break; + // CMPW A case 0x2b: - // stream << "CMPW A"; + doCMP_16((m_acc>>16) & 0xffff, m_acc & 0xffff); + m_pc++; + m_icount--; break; // ANDW A @@ -496,16 +519,40 @@ void f2mc16_device::execute_run() m_icount -= 2; break; + // ORW A case 0x2d: - // stream << "ORW A"; + m_tmp16 = (m_acc>>16) & 0xffff; + m_acc |= m_tmp16; + setNZ_16(m_acc & 0xffff); + m_ps &= ~F_V; + m_pc++; + m_icount -= 2; break; + // XORW A case 0x2e: - // stream << "XORW A"; + m_tmp16 = (m_acc>>16) & 0xffff; + m_acc ^= m_tmp16; + setNZ_16(m_acc & 0xffff); + m_ps &= ~F_V; + m_pc++; + m_icount -= 2; break; + // MULUW A case 0x2f: - // stream << "MULUW A"; + m_tmp16 = (m_acc >> 16) & 0xffff; + if (m_tmp16 == 0) + { + m_acc = 0; + m_icount -= 3; + } + else + { + m_acc = m_tmp16 * (m_acc & 0xffff); + m_icount -= 11; + } + m_pc++; break; case 0x30: @@ -536,8 +583,17 @@ void f2mc16_device::execute_run() // util::stream_format(stream, "OR A, #$%02x", operand); break; + // XOR A, #imm8 case 0x36: - // util::stream_format(stream, "XOR A, #$%02x", operand); + 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; + m_pc += 2; + m_icount -= 2; break; case 0x37: @@ -552,8 +608,21 @@ void f2mc16_device::execute_run() // util::stream_format(stream, "SUBW A, #$%04x", opcodes.r16(pc+1)); break; + // CWBNE A, #imm16, disp8 case 0x3a: - // util::stream_format(stream, "CWBNE A, #$%04X, $%04X", opcodes.r16(pc+1), (s8)opcodes.r8(pc+3) + (pc & 0xffff) + 4); + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + m_tmp8 = read_8((m_pcb<<16) | (m_pc+3)); + doCMP_16(m_acc & 0xffff, m_tmp16); + if (m_ps & F_Z) + { + m_pc += 4; + m_icount -= 4; + } + else + { + m_pc = m_pc + 4 + (s8)m_tmp8; + m_icount -= 5; + } break; // CMPW A, #imm16 @@ -564,7 +633,7 @@ void f2mc16_device::execute_run() m_icount -= 2; break; - // ANDW A, #imm16 fc4eb1 + // ANDW A, #imm16 case 0x3c: m_tmp32 = read_16((m_pcb<<16) | (m_pc+1)); m_tmp32 |= 0xffff0000; @@ -575,10 +644,30 @@ void f2mc16_device::execute_run() m_icount -= 2; break; + // ORW A, #imm16 + case 0x3d: + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + m_acc |= m_tmp16; + setNZ_16(m_acc & 0xffff); + m_ps &= ~F_V; + m_pc += 3; + m_icount -= 2; + break; + case 0x3f: // stream << "NOTW A"; break; + // MOV dir, A + case 0x41: + m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)); + m_tmp32 |= (m_dpr<<8) | (m_dtb<<8); + write_8(m_tmp32, m_acc & 0xff); + setNZ_8(m_acc & 0xff); + m_pc += 2; + m_icount -= 3; + break; + // MOV A, #imm8 case 0x42: m_tmp8 = read_8((m_pcb<<16) | (m_pc+1)); @@ -589,6 +678,16 @@ void f2mc16_device::execute_run() m_icount -= 2; break; + // MOV dir, #imm8 + case 0x44: + m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)); + m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); + m_tmp32 |= (m_dpr<<8) | (m_dtb<<8); + write_8(m_tmp32, m_tmp8); + m_pc += 3; + m_icount -= 5; + break; + case 0x46: // util::stream_format(stream, "MOVW A, SP"); break; @@ -607,6 +706,16 @@ void f2mc16_device::execute_run() m_pc += 1; break; + // MOVW dir, A + case 0x49: + m_tmp32 = read_8((m_pcb<<16) | (m_pc+1)); + m_tmp32 |= (m_dpr<<8) | (m_dtb<<8); + write_16(m_tmp32, m_acc & 0xffff); + setNZ_16(m_acc & 0xffff); + m_pc += 2; + m_icount -= 3; + break; + // MOVW A, #imm16 case 0x4a: m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); @@ -668,24 +777,78 @@ void f2mc16_device::execute_run() } break; + // MOV A, adr16 case 0x52: - // util::stream_format(stream, "MOV A, $%04x", opcodes.r16(pc+1)); + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + m_acc <<= 16; + if (m_prefix_valid) + { + m_prefix_valid = false; + m_acc |= read_8((m_prefix<<16) | m_tmp16); + } + else + { + m_acc |= read_8((m_dtb<<16) | m_tmp16); + } + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 4; break; + // MOV adr16, A case 0x53: - // util::stream_format(stream, "MOV $%04x, A", opcodes.r16(pc+1)); + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + if (m_prefix_valid) + { + m_prefix_valid = false; + write_8((m_prefix<<16) | m_tmp16, m_acc & 0xff); + } + else + { + write_8((m_dtb<<16) | m_tmp16, m_acc & 0xff); + } + setNZ_8(m_acc & 0xff); + m_pc += 3; + m_icount -= 4; break; case 0x57: // util::stream_format(stream, "MOVX A, $%04x", opcodes.r16(pc+1)); break; + // MOVW A, adr16 case 0x5a: - // util::stream_format(stream, "MOVW A, $%04x", opcodes.r16(pc+1)); + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + m_acc <<= 16; + if (m_prefix_valid) + { + m_prefix_valid = false; + m_acc |= read_16((m_prefix<<16) | m_tmp16); + } + else + { + m_acc |= read_16((m_dtb<<16) | m_tmp16); + } + setNZ_16(m_acc & 0xffff); + m_pc += 3; + m_icount -= 4; break; + // MOVW adr16, A case 0x5b: - // util::stream_format(stream, "MOVW $%04x, A", opcodes.r16(pc+1)); + m_tmp16 = read_16((m_pcb<<16) | (m_pc+1)); + if (m_prefix_valid) + { + m_prefix_valid = false; + write_16((m_prefix<<16) | m_tmp16, m_acc & 0xffff); + } + else + { + write_16((m_dtb<<16) | m_tmp16, m_acc & 0xffff); + } + setNZ_16(m_acc & 0xfff); + m_pc += 3; + m_icount -= 4; break; // POPW A @@ -778,6 +941,10 @@ void f2mc16_device::execute_run() // stream << "RETI"; break; + case 0x6c: // bit operation instructions + opcodes_bo6c(read_8((m_pcb<<16) | (m_pc+1))); + break; + case 0x6e: // string instructions opcodes_str6e(read_8((m_pcb<<16) | (m_pc+1))); break; @@ -1149,7 +1316,7 @@ void f2mc16_device::execute_run() break; default: - fatalerror("Unknown F2MC opcode %02x\n", opcode); + fatalerror("Unknown F2MC opcode %02x, PC=%02x%04x\n", opcode, m_pcb, m_pc); break; } @@ -1187,10 +1354,137 @@ void f2mc16_device::opcodes_str6e(u8 operand) } } +void f2mc16_device::opcodes_bo6c(u8 operand) +{ + switch (operand) + { + // CLRB adr16, bit + 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)); + 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_pc += 2; + m_icount -= 7; + break; + + // SETB adr16, bit + case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: + m_tmp16 = 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); + } + 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_pc += 2; + m_icount -= 7; + break; + + // BBC adr16, bit, disp8 + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2)); + m_tmp8 = read_8((m_pcb << 16) | (m_pc + 4)); + m_ps &= ~F_Z; + m_pc += 5; + if (m_prefix_valid) + { + m_prefix_valid = false; + m_tmp32 = (m_prefix<<16) | m_tmp16; + } + else + { + m_tmp32 = (m_dtb<<16) | m_tmp16; + } + + if (!(read_8(m_tmp32) & (1 << (operand & 7)))) + { + m_ps |= F_Z; + m_pc += (s8)m_tmp8; + m_icount--; + } + m_icount -= 7; + break; + + // BBS adr16, bit, disp8 + case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: + m_tmp16 = read_16((m_pcb << 16) | (m_pc + 2)); + m_tmp8 = read_8((m_pcb << 16) | (m_pc + 4)); + m_ps &= ~F_Z; + m_pc += 5; + if (m_prefix_valid) + { + m_prefix_valid = false; + m_tmp32 = (m_prefix<<16) | m_tmp16; + } + else + { + m_tmp32 = (m_dtb<<16) | m_tmp16; + } + + if (read_8(m_tmp32) & (1 << (operand & 7))) + { + m_pc += (s8)m_tmp8; + m_icount--; + } + else + { + m_ps |= F_Z; + } + m_icount -= 7; + break; + + default: + fatalerror("Unknown F2MC 6C bit-op opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc); + break; + } +} + void f2mc16_device::opcodes_2b6f(u8 operand) { switch (operand) { + // LSLW A, R0 + case 0x0c: + m_tmp8 = read_rX(0); + if (m_tmp8 == 0) + { + m_icount -= 6; + } + else + { + m_tmp16 = m_acc & 0xffff; + for (u8 count = 0; count < m_tmp8; count++) + { + m_ps &= ~F_C; + m_ps |= (m_tmp16 & 0x8000) ? F_C : 0; + m_tmp16 <<= 1; + m_icount -= 5; + } + setNZ_16(m_tmp16); + m_acc &= 0xffff0000; + m_acc |= m_tmp16; + } + m_pc += 2; + break; + // ASRW A, R0 case 0x0e: m_tmp8 = read_rX(0); @@ -1222,7 +1516,7 @@ void f2mc16_device::opcodes_2b6f(u8 operand) if (m_tmp16 & 0x8000) { m_tmp16 >>= 1; - m_tmp16 |= 1; + m_tmp16 |= 0x8000; } else { @@ -1239,6 +1533,45 @@ void f2mc16_device::opcodes_2b6f(u8 operand) } break; + // LSRW A, R0 + case 0xf: + m_tmp8 = read_rX(0); + if (m_tmp8 == 0) + { + // docs don't say if N is cleared in this case or not + m_ps &= ~(F_C|F_T); + m_ps |= F_Z; + m_pc += 2; + m_icount -= 6; + } + else + { + m_tmp16 = m_acc & 0xffff; + for (u8 count = 0; count < m_tmp8; count++) + { + // T is set if either carry or T are set beforehand + if ((m_ps & F_C) || (m_ps & F_T)) + { + m_ps |= F_T; + } + // C becomes the previous LSB + m_ps &= ~F_C; + if (m_tmp16 & 1) + { + m_ps |= F_C; + } + + m_tmp16 >>= 1; + setNZ_16(m_tmp16); + m_icount -= 5; + } + + m_acc &= 0xffff0000; + m_acc |= m_tmp16; + m_pc += 2; + } + break; + // MOV DTB, A case 0x10: m_dtb = m_acc & 0xff; @@ -1274,22 +1607,22 @@ void f2mc16_device::opcodes_2b6f(u8 operand) m_icount -= 1; break; - // MOV @RWx + #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_tmp16 = read_rwX((operand>>1) & 0x3) + (s8)m_tmp8; - write_8(getRWbank((operand>>1) & 0x3, m_tmp16), m_acc & 0xff); + m_tmp32 = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8; + write_8(m_tmp32, m_acc & 0xff); setNZ_8(m_acc & 0xff); m_pc += 3; m_icount -= 10; break; - // MOV A, @RWx + disp8 + // MOV A, @RLx + disp8 case 0x40: case 0x42: case 0x44: case 0x46: m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); - m_tmp16 = read_rwX((operand>>1) & 0x3) + (s8)m_tmp8; + m_tmp32 = read_rlX((operand>>1) & 0x3) + (s8)m_tmp8; m_acc <<= 16; - m_acc |= read_8(getRWbank((operand>>1) & 0x3, m_tmp16)); + m_acc |= read_8(m_tmp32); setNZ_8(m_acc & 0xff); m_pc += 3; m_icount -= 10; @@ -1305,6 +1638,13 @@ void f2mc16_device::opcodes_ea70(u8 operand) { switch (operand) { + // ADDL A, RLx + case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: + m_acc = doADD_32(m_acc, read_rlX((operand>>1) & 3)); + m_pc += 3; + m_icount -= 7; + break; + // 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)); @@ -1331,7 +1671,6 @@ 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; - printf("CALLP EAR = %04x\n", m_tmp16); m_tmp32 = read_32(getRWbank(operand & 7, m_tmp16)); m_pc = m_tmp32 & 0xffff; m_pcb = (m_tmp32 >> 16) & 0xff; @@ -1347,7 +1686,7 @@ void f2mc16_device::opcodes_ea71(u8 operand) write_32(getRWbank(operand & 7, m_tmp16), m_tmp64 & 0xffffffff); setNZ_32(m_tmp64 & 0xffffffff); m_ps &= ~F_V; - if (m_tmp32 & 0x100000000) + if (m_tmp64 & 0x100000000) { m_ps |= F_V; } @@ -1393,6 +1732,23 @@ void f2mc16_device::opcodes_ea71(u8 operand) m_icount -= 4; break; + // MOVL addr16, A + case 0xbf: + m_tmp16 = read_16((m_pcb<<16) | (m_pc+2)); + if (m_prefix_valid) + { + m_prefix_valid = false; + write_32((m_prefix<<16) | m_tmp16, m_acc); + } + else + { + write_32((m_dtb<<16) | m_tmp16, m_acc); + } + setNZ_32(m_acc); + m_pc += 4; + m_icount -= 5; + break; + // MOV @RWx, #imm8 case 0xc8: case 0xc9: case 0xca: case 0xcb: m_tmp8 = read_8((m_pcb<<16) | (m_pc+2)); @@ -1413,13 +1769,30 @@ void f2mc16_device::opcodes_ea72(u8 operand) { switch (operand) { - // MOVW A, @RWx + disp8 + // 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)); + 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_pc += 3; + m_icount -= 5; + 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)); m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8; m_acc <<= 16; - m_acc |= read_16(getRWbank(operand & 7, m_tmp16)); - setNZ_16(m_acc & 0xffff); + m_acc |= read_8(getRWbank(operand & 7, m_tmp16)); + setNZ_8(m_acc & 0xff); m_pc += 3; m_icount -= 5; break; @@ -1461,6 +1834,33 @@ void f2mc16_device::opcodes_ea73(u8 operand) m_icount -= 5; break; + // MOVW @RWx + disp16, #imm16 + case 0xd8: case 0xd9: case 0xda: case 0xdb: + 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_pc += 6; + m_icount -= 4; + break; + + // MOVW addr16, #imm16 + case 0xdf: + m_tmp32 = 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); + } + else + { + write_16((m_dtb<<16) | m_tmp32, m_tmp16); + } + m_pc += 6; + m_icount -= 4; + break; + default: fatalerror("Unknown F2MC EA73 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc); break; @@ -1511,6 +1911,17 @@ void f2mc16_device::opcodes_ea76(u8 operand) m_icount -= 10; break; + // ORW A, @RWx + case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: + m_tmp16 = read_rwX(operand & 7); + m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16)); + m_acc |= m_tmp16; + setNZ_16(m_acc & 0xffff); + m_ps &= ~F_V; + m_pc += 2; + m_icount -= 4; + break; + default: fatalerror("Unknown F2MC EA76 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc); break; diff --git a/src/devices/cpu/f2mc16/f2mc16.h b/src/devices/cpu/f2mc16/f2mc16.h index 1467aa1462c..02342ed883b 100644 --- a/src/devices/cpu/f2mc16/f2mc16.h +++ b/src/devices/cpu/f2mc16/f2mc16.h @@ -98,10 +98,12 @@ private: } inline void write_8(u32 addr, u8 data) { +// printf("write %02x to %08x\n", data, addr); m_program->write_byte(addr, data); } inline void write_16(u32 addr, u16 data) { +// printf("write %04x to %08x\n", data, addr); if (addr & 1) { m_program->write_byte(addr, data & 0xff); @@ -114,6 +116,7 @@ private: } inline void write_32(u32 addr, u32 data) { + //printf("write %08x to %08x\n", data, addr); if (addr & 3) { m_program->write_byte(addr, data & 0xff); @@ -402,6 +405,7 @@ private: m_icount -= 4; } + void opcodes_bo6c(u8 operand); void opcodes_str6e(u8 operand); void opcodes_2b6f(u8 operand); void opcodes_ea70(u8 operand); diff --git a/src/devices/cpu/f2mc16/f2mc16dasm.cpp b/src/devices/cpu/f2mc16/f2mc16dasm.cpp index c00972bcc29..9f45e433ae7 100644 --- a/src/devices/cpu/f2mc16/f2mc16dasm.cpp +++ b/src/devices/cpu/f2mc16/f2mc16dasm.cpp @@ -386,15 +386,30 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d bytes = 3; break; + case 0x3d: + util::stream_format(stream, "ORW A, #$%04x", opcodes.r16(pc+1)); + bytes = 3; + break; + case 0x3f: stream << "NOTW A"; break; + case 0x41: + util::stream_format(stream, "MOV dir(%02x), A", operand); + bytes = 2; + break; + case 0x42: util::stream_format(stream, "MOV A, #$%02x", operand); bytes = 2; break; + case 0x44: + util::stream_format(stream, "MOV dir(%02x), #$%02x", operand, opcodes.r8(pc+2)); + bytes = 3; + break; + case 0x46: util::stream_format(stream, "MOVW A, SP"); break; @@ -403,6 +418,11 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d util::stream_format(stream, "MOVW SP, A"); break; + case 0x49: + util::stream_format(stream, "MOVW dir(%02x), A", operand); + bytes = 2; + break; + case 0x4a: util::stream_format(stream, "MOVW A, #$%04x", opcodes.r16(pc+1)); bytes = 3; @@ -524,6 +544,35 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d stream << "RETI"; break; + case 0x6c: // bit operations + switch (operand) + { + case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: + util::stream_format(stream, "CLRB $%04x, %d", opcodes.r16(pc+2), operand & 7); + bytes = 2; + break; + + case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f: + util::stream_format(stream, "SETB $%04x, %d", opcodes.r16(pc+2), operand & 7); + bytes = 2; + break; + + case 0x98: case 0x99: case 0x9a: case 0x9b: case 0x9c: case 0x9d: case 0x9e: case 0x9f: + util::stream_format(stream, "BBC $%04x, %d, $%x", opcodes.r16(pc+2), operand & 7, pc+5+(s8)opcodes.r8(pc+4)); + bytes = 5; + break; + + case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: + util::stream_format(stream, "BBS $%04x, %d, $%x", opcodes.r16(pc+2), operand & 7, pc+5+(s8)opcodes.r8(pc+4)); + bytes = 5; + break; + + default: + stream << "UNK 6C bit op"; + break; + } + break; + case 0x6e: // string instructions switch (operand) { @@ -641,22 +690,22 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d break; case 0x30: case 0x32: case 0x34: case 0x36: - util::stream_format(stream, "MOV @RW%d + #$%02x, A", ((operand>>1) & 0x3), opcodes.r8(pc+2)); + util::stream_format(stream, "MOV @RL%d + #$%02x, A", ((operand>>1) & 0x3), opcodes.r8(pc+2)); bytes = 3; break; case 0x38: case 0x3a: case 0x3c: case 0x3e: - util::stream_format(stream, "MOVW @RW%d + #$%02x, A", ((operand>>1) & 0x3), opcodes.r8(pc+2)); + util::stream_format(stream, "MOVW @RL%d + #$%02x, A", ((operand>>1) & 0x3), opcodes.r8(pc+2)); bytes = 3; break; case 0x40: case 0x42: case 0x44: case 0x46: - util::stream_format(stream, "MOV A, @RW%d + #$%02x", ((operand>>1) & 0x3), opcodes.r8(pc+2)); + util::stream_format(stream, "MOV A, @RL%d + #$%02x", ((operand>>1) & 0x3), opcodes.r8(pc+2)); bytes = 3; break; case 0x48: case 0x4a: case 0x4c: case 0x4e: - util::stream_format(stream, "MOVW A, @RW%d + #$%02x", ((operand>>1) & 0x3), opcodes.r8(pc+2)); + util::stream_format(stream, "MOVW A, @RL%d + #$%02x", ((operand>>1) & 0x3), opcodes.r8(pc+2)); bytes = 3; break; @@ -785,8 +834,8 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d bytes = 3; break; - case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: - util::stream_format(stream, "MOV @RW%d + #$%04x, A", (operand & 0x7), opcodes.r16(pc+2)); + case 0xbf: + util::stream_format(stream, "MOVL $%04x, A", opcodes.r16(pc+2)); bytes = 4; break; @@ -804,23 +853,28 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0x72: // ea-type instructions switch (operand) { + case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: + util::stream_format(stream, "INC @RW%d + #$%02x", (operand & 0x7), opcodes.r8(pc+2)); + bytes = 3; + break; + case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: - util::stream_format(stream, "MOVW A, @RW%d + #$%02x", (operand & 0x7), opcodes.r8(pc+2)); + util::stream_format(stream, "MOV A, @RW%d + #$%02x", (operand & 0x7), opcodes.r8(pc+2)); bytes = 3; break; case 0x98: case 0x99: case 0x9a: case 0x9b: - util::stream_format(stream, "MOVW A, @RW%d + #$%04x", (operand & 0x7), opcodes.r16(pc+2)); + util::stream_format(stream, "MOV A, @RW%d + #$%04x", (operand & 0x7), opcodes.r16(pc+2)); bytes = 4; break; case 0x9c: case 0x9d: - util::stream_format(stream, "MOVW A, @RW%d + RW7", (operand & 0x1)); + util::stream_format(stream, "MOV A, @RW%d + RW7", (operand & 0x1)); bytes = 2; break; case 0x9e: - util::stream_format(stream, "MOVW A, @PC + #$04x ($%04X)", (operand & 0x1), opcodes.r16(pc+2), (s16)opcodes.r16(pc+2) + (pc & 0xffff)); + util::stream_format(stream, "MOV A, @PC + #$04x ($%04X)", (operand & 0x1), opcodes.r16(pc+2), (s16)opcodes.r16(pc+2) + (pc & 0xffff)); bytes = 4; break; @@ -1095,6 +1149,11 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d bytes = 4; break; + case 0xa0: case 0xa1: case 0xa2: case 0xa3: case 0xa4: case 0xa5: case 0xa6: case 0xa7: + util::stream_format(stream, "ORW A, @RW%d", (operand & 0x1)); + bytes = 2; + break; + default: stream << "UNK ea-type 76"; break; @@ -1165,17 +1224,17 @@ offs_t f2mc16_disassembler::disassemble(std::ostream &stream, offs_t pc, const d break; case 0xb8: case 0xb9: case 0xba: case 0xbb: case 0xbc: case 0xbd: case 0xbe: case 0xbf: - util::stream_format(stream, "MOVW A, @R%d + %02x", (opcode & 0x7), operand); + util::stream_format(stream, "MOVW A, @RW%d + #$%02x", (opcode & 0x7), operand); bytes = 2; break; case 0xc0: case 0xc1: case 0xc2: case 0xc3: case 0xc4: case 0xc5: case 0xc6: case 0xc7: - util::stream_format(stream, "MOVX A, @R%d + %02x", (opcode & 0x7), operand); + util::stream_format(stream, "MOVX A, @RW%d + #$%02x", (opcode & 0x7), operand); bytes = 2; break; case 0xc8: case 0xc9: case 0xca: case 0xcb: case 0xcc: case 0xcd: case 0xce: case 0xcf: - util::stream_format(stream, "MOVW @RW%d + %02x, A", (opcode & 0x7), operand); + util::stream_format(stream, "MOVW @RW%d + #$%02x, A", (opcode & 0x7), operand); bytes = 2; break; diff --git a/src/mame/drivers/tomy_princ.cpp b/src/mame/drivers/tomy_princ.cpp index b49e769ab89..cf2e22b4ae2 100644 --- a/src/mame/drivers/tomy_princ.cpp +++ b/src/mame/drivers/tomy_princ.cpp @@ -46,6 +46,7 @@ uint32_t tomy_princ_state::screen_update_tomy_princ(screen_device &screen, bitma void tomy_princ_state::princ_map(address_map &map) { + map(0x68ff44, 0x68ff44).lr8("free0", [this]() -> u8 { return m_screen->vblank() ? 1 : 0; }); map(0xe00000, 0xe07fff).ram(); // stacks are placed here map(0xf00000, 0xffffff).rom().region("maincpu", 0x00000); } -- cgit v1.2.3