summaryrefslogtreecommitdiffstats
path: root/src/devices/cpu/f2mc16/f2mc16.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/f2mc16/f2mc16.cpp')
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp95
1 files changed, 88 insertions, 7 deletions
diff --git a/src/devices/cpu/f2mc16/f2mc16.cpp b/src/devices/cpu/f2mc16/f2mc16.cpp
index 9cda22ea9ea..7f2c737d9da 100644
--- a/src/devices/cpu/f2mc16/f2mc16.cpp
+++ b/src/devices/cpu/f2mc16/f2mc16.cpp
@@ -213,6 +213,7 @@ void f2mc16_device::execute_run()
{
case 0x00: // NOP
m_icount--;
+ m_pc++;
break;
case 0x03:
@@ -366,8 +367,12 @@ void f2mc16_device::execute_run()
m_icount -= 3;
break;
+ // ADDL A, #imm32
case 0x18:
- // util::stream_format(stream, "ADDL A, #$%08x", opcodes.r16(pc+1) | (opcodes.r16(pc+3)<<16));
+ m_tmp32 = read_32((m_pcb << 16) | (m_pc+1));
+ m_acc = doADD_32(m_acc, m_tmp32);
+ m_pc += 5;
+ m_icount -= 4;
break;
// SUBL A, #imm32
@@ -802,27 +807,37 @@ void f2mc16_device::execute_run()
break;
case 0x75: // ea-type instructions
- fatalerror("Unknown F2MC EA75 opcode %02x\n", opcode);
+ opcodes_ea75(read_8((m_pcb<<16) | (m_pc+1)));
break;
case 0x76: // ea-type instructions
- fatalerror("Unknown F2MC EA76 opcode %02x\n", opcode);
+ opcodes_ea76(read_8((m_pcb<<16) | (m_pc+1)));
break;
case 0x77: // ea-type instructions
- fatalerror("Unknown F2MC EA77 opcode %02x\n", opcode);
+ opcodes_ea77(read_8((m_pcb<<16) | (m_pc+1)));
break;
case 0x78: // ea-type instructions
- fatalerror("Unknown F2MC EA78 opcode %02x\n", opcode);
+ opcodes_ea78(read_8((m_pcb<<16) | (m_pc+1)));
break;
// MOV A, Rx
case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87:
+ m_acc <<= 16;
+ m_acc |= read_rX(opcode & 7);
+ setNZ_8(m_acc & 0xff);
+ m_pc++;
+ m_icount -= 2;
break;
// MOVW A, RWx
case 0x88: case 0x89: case 0x8a: case 0x8b: case 0x8c: case 0x8d: case 0x8e: case 0x8f:
+ m_acc <<= 16;
+ m_acc |= read_rwX(opcode & 7);
+ setNZ_16(m_acc & 0xff);
+ m_pc++;
+ m_icount -= 2;
break;
// MOV Rx, A
@@ -859,10 +874,12 @@ void f2mc16_device::execute_run()
m_pc += 3;
break;
+ // MOVX A, Rx
case 0xb0: case 0xb1: case 0xb2: case 0xb3: case 0xb4: case 0xb5: case 0xb6: case 0xb7:
// util::stream_format(stream, "MOVX A, R%d", (opcode & 0x7));
break;
+ // MOVW A, @RWx + disp8
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;
@@ -873,6 +890,7 @@ void f2mc16_device::execute_run()
m_icount -= 10;
break;
+ // MOVX A, @Rx + disp8
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);
break;
@@ -903,7 +921,7 @@ void f2mc16_device::execute_run()
case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5: case 0xe6: case 0xe7:
case 0xe8: case 0xe9: case 0xea: case 0xeb: case 0xec: case 0xed: case 0xee: case 0xef:
- // util::stream_format(stream, "CALL #$%01x", (opcode & 0xf));
+ // util::stream_format(stream, "CALLV #$%01x", (opcode & 0xf));
break;
// BEQ
@@ -1307,6 +1325,19 @@ void f2mc16_device::opcodes_ea71(u8 operand)
{
switch (operand)
{
+ // CALLP @RWx + disp8
+ case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:
+ push_16(m_pcb);
+ 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;
+ m_icount -= 11;
+ break;
+
// INCL @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));
@@ -1441,7 +1472,7 @@ void f2mc16_device::opcodes_ea74(u8 operand)
switch (operand)
{
// CMP A, @RWx + disp8
- case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x57:
+ 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));
@@ -1456,6 +1487,56 @@ void f2mc16_device::opcodes_ea74(u8 operand)
}
}
+void f2mc16_device::opcodes_ea75(u8 operand)
+{
+ switch (operand)
+ {
+ default:
+ fatalerror("Unknown F2MC EA75 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc);
+ break;
+ }
+}
+
+void f2mc16_device::opcodes_ea76(u8 operand)
+{
+ switch (operand)
+ {
+ // CMPW 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));
+ m_tmp16 = read_rwX(operand & 7) + (s8)m_tmp8;
+ m_tmp16 = read_16(getRWbank(operand & 7, m_tmp16));
+ doCMP_16(m_acc & 0xffff, m_tmp16);
+ m_pc += 3;
+ m_icount -= 10;
+ break;
+
+ default:
+ fatalerror("Unknown F2MC EA76 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc);
+ break;
+ }
+}
+
+void f2mc16_device::opcodes_ea77(u8 operand)
+{
+ switch (operand)
+ {
+ default:
+ fatalerror("Unknown F2MC EA77 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc);
+ break;
+ }
+}
+
+void f2mc16_device::opcodes_ea78(u8 operand)
+{
+ switch (operand)
+ {
+ default:
+ fatalerror("Unknown F2MC EA78 opcode %02x (PC=%x)\n", operand, (m_pcb<<16) | m_pc);
+ break;
+ }
+}
+
void f2mc16_device::execute_set_input(int inputnum, int state)
{
}