summaryrefslogtreecommitdiffstatshomepage
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.cpp412
1 files changed, 398 insertions, 14 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);