summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/i8085/i8085.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/i8085/i8085.cpp')
-rw-r--r--src/devices/cpu/i8085/i8085.cpp1161
1 files changed, 753 insertions, 408 deletions
diff --git a/src/devices/cpu/i8085/i8085.cpp b/src/devices/cpu/i8085/i8085.cpp
index 75a2360dc63..d15b6d45994 100644
--- a/src/devices/cpu/i8085/i8085.cpp
+++ b/src/devices/cpu/i8085/i8085.cpp
@@ -443,414 +443,759 @@ void i8085a_cpu_device::execute_one(int opcode)
switch (opcode)
{
- case 0x00: break; /* NOP */
- case 0x01: m_BC.w.l = ARG16(); break; /* LXI B,nnnn */
- case 0x02: WM(m_BC.d, m_AF.b.h); break; /* STAX B */
- case 0x03: m_BC.w.l++; /* INX B */
- if (IS_8085()) { if (m_BC.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x04: M_INR(m_BC.b.h); break; /* INR B */
- case 0x05: M_DCR(m_BC.b.h); break; /* DCR B */
- case 0x06: M_MVI(m_BC.b.h); break; /* MVI B,nn */
- case 0x07: M_RLC; break; /* RLC */
-
- case 0x08: if (IS_8085()) { M_DSUB(); } /* DSUB */
- /* else { ; } */ /* NOP undocumented */
- break;
- case 0x09: M_DAD(BC); break; /* DAD B */
- case 0x0a: m_AF.b.h = RM(m_BC.d); break; /* LDAX B */
- case 0x0b: m_BC.w.l--; /* DCX B */
- if (IS_8085()) { if (m_BC.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x0c: M_INR(m_BC.b.l); break; /* INR C */
- case 0x0d: M_DCR(m_BC.b.l); break; /* DCR C */
- case 0x0e: M_MVI(m_BC.b.l); break; /* MVI C,nn */
- case 0x0f: M_RRC; break; /* RRC */
-
- case 0x10: if (IS_8085()) { /* ASRH */
- m_AF.b.l = (m_AF.b.l & ~CF) | (m_HL.b.l & CF);
- m_HL.w.l = (m_HL.w.l >> 1);
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x11: m_DE.w.l = ARG16(); break; /* LXI D,nnnn */
- case 0x12: WM(m_DE.d, m_AF.b.h); break; /* STAX D */
- case 0x13: m_DE.w.l++; /* INX D */
- if (IS_8085()) { if (m_DE.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x14: M_INR(m_DE.b.h); break; /* INR D */
- case 0x15: M_DCR(m_DE.b.h); break; /* DCR D */
- case 0x16: M_MVI(m_DE.b.h); break; /* MVI D,nn */
- case 0x17: M_RAL; break; /* RAL */
-
- case 0x18: if (IS_8085()) { /* RLDE */
- m_AF.b.l = (m_AF.b.l & ~(CF | VF)) | (m_DE.b.h >> 7);
- m_DE.w.l = (m_DE.w.l << 1) | (m_DE.w.l >> 15);
- if (0 != (((m_DE.w.l >> 15) ^ m_AF.b.l) & CF)) m_AF.b.l |= VF;
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x19: M_DAD(DE); break; /* DAD D */
- case 0x1a: m_AF.b.h = RM(m_DE.d); break; /* LDAX D */
- case 0x1b: m_DE.w.l--; /* DCX D */
- if (IS_8085()) { if (m_DE.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x1c: M_INR(m_DE.b.l); break; /* INR E */
- case 0x1d: M_DCR(m_DE.b.l); break; /* DCR E */
- case 0x1e: M_MVI(m_DE.b.l); break; /* MVI E,nn */
- case 0x1f: M_RAR; break; /* RAR */
-
- case 0x20: if (IS_8085()) { /* RIM */
- m_AF.b.h = get_rim_value();
-
- /* if we have remembered state from taking a TRAP, fix up the IE flag here */
- if (m_trap_im_copy & 0x80) m_AF.b.h = (m_AF.b.h & ~IM_IE) | (m_trap_im_copy & IM_IE);
- m_trap_im_copy = 0;
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x21: m_HL.w.l = ARG16(); break; /* LXI H,nnnn */
- case 0x22: m_WZ.w.l = ARG16(); /* SHLD nnnn */
- WM(m_WZ.d, m_HL.b.l); m_WZ.w.l++;
- WM(m_WZ.d, m_HL.b.h);
- break;
- case 0x23: m_HL.w.l++; /* INX H */
- if (IS_8085()) { if (m_HL.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x24: M_INR(m_HL.b.h); break; /* INR H */
- case 0x25: M_DCR(m_HL.b.h); break; /* DCR H */
- case 0x26: M_MVI(m_HL.b.h); break; /* MVI H,nn */
- case 0x27: m_WZ.b.h = m_AF.b.h; /* DAA */
- if (IS_8085() && m_AF.b.l&VF) {
- if ((m_AF.b.l&HF) | ((m_AF.b.h&0xf)>9)) m_WZ.b.h-=6;
- if ((m_AF.b.l&CF) | (m_AF.b.h>0x99)) m_WZ.b.h-=0x60;
- }
- else {
- if ((m_AF.b.l&HF) | ((m_AF.b.h&0xf)>9)) m_WZ.b.h+=6;
- if ((m_AF.b.l&CF) | (m_AF.b.h>0x99)) m_WZ.b.h+=0x60;
- }
-
- m_AF.b.l=(m_AF.b.l&3) | (m_AF.b.h&0x28) | (m_AF.b.h>0x99) | ((m_AF.b.h^m_WZ.b.h)&0x10) | ZSP[m_WZ.b.h];
- m_AF.b.h=m_WZ.b.h;
- break;
-
- case 0x28: if (IS_8085()) { /* LDEH nn */
- m_WZ.d = ARG();
- m_DE.d = (m_HL.d + m_WZ.d) & 0xffff;
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x29: M_DAD(HL); break; /* DAD H */
- case 0x2a: m_WZ.d = ARG16(); /* LHLD nnnn */
- m_HL.b.l = RM(m_WZ.d); m_WZ.w.l++;
- m_HL.b.h = RM(m_WZ.d);
- break;
- case 0x2b: m_HL.w.l--; /* DCX H */
- if (IS_8085()) { if (m_HL.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x2c: M_INR(m_HL.b.l); break; /* INR L */
- case 0x2d: M_DCR(m_HL.b.l); break; /* DCR L */
- case 0x2e: M_MVI(m_HL.b.l); break; /* MVI L,nn */
- case 0x2f: m_AF.b.h ^= 0xff; /* CMA */
- if (IS_8085()) m_AF.b.l |= HF | VF;
- break;
-
- case 0x30: if (IS_8085()) { /* SIM */
- /* if bit 3 is set, bits 0-2 become the new masks */
- if (m_AF.b.h & 0x08) {
- m_IM &= ~(IM_M55 | IM_M65 | IM_M75 | IM_I55 | IM_I65);
- m_IM |= m_AF.b.h & (IM_M55 | IM_M65 | IM_M75);
-
- /* update live state based on the new masks */
- if ((m_IM & IM_M55) == 0 && m_irq_state[I8085_RST55_LINE]) m_IM |= IM_I55;
- if ((m_IM & IM_M65) == 0 && m_irq_state[I8085_RST65_LINE]) m_IM |= IM_I65;
- }
-
- /* bit if 4 is set, the 7.5 flip-flop is cleared */
- if (m_AF.b.h & 0x10) m_IM &= ~IM_I75;
-
- /* if bit 6 is set, then bit 7 is the new SOD state */
- if (m_AF.b.h & 0x40) set_sod(m_AF.b.h >> 7);
-
- /* check for revealed interrupts */
- check_for_interrupts();
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x31: m_SP.w.l = ARG16(); break; /* LXI SP,nnnn */
- case 0x32: m_WZ.d = ARG16(); /* STAX nnnn */
- WM(m_WZ.d, m_AF.b.h);
- break;
- case 0x33: m_SP.w.l++; /* INX SP */
- if (IS_8085()) { if (m_SP.w.l == 0x0000) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x34: m_WZ.b.l = RM(m_HL.d); /* INR M */
- M_INR(m_WZ.b.l);
- WM(m_HL.d, m_WZ.b.l);
- break;
- case 0x35: m_WZ.b.l = RM(m_HL.d); /* DCR M */
- M_DCR(m_WZ.b.l);
- WM(m_HL.d, m_WZ.b.l);
- break;
- case 0x36: m_WZ.b.l = ARG(); /* MVI M,nn */
- WM(m_HL.d, m_WZ.b.l);
- break;
- case 0x37: m_AF.b.l = (m_AF.b.l & 0xfe) | CF; break; /* STC */
-
- case 0x38: if (IS_8085()) { /* LDES nn */
- m_WZ.d = ARG();
- m_DE.d = (m_SP.d + m_WZ.d) & 0xffff;
- } /* else { ; } */ /* NOP undocumented */
- break;
- case 0x39: M_DAD(SP); break; /* DAD SP */
- case 0x3a: m_WZ.d = ARG16(); /* LDAX nnnn */
- m_AF.b.h = RM(m_WZ.d);
- break;
- case 0x3b: m_SP.w.l--; /* DCX SP */
- if (IS_8085()) { if (m_SP.w.l == 0xffff) m_AF.b.l |= X5F; else m_AF.b.l &= ~X5F; }
- break;
- case 0x3c: M_INR(m_AF.b.h); break; /* INR A */
- case 0x3d: M_DCR(m_AF.b.h); break; /* DCR A */
- case 0x3e: M_MVI(m_AF.b.h); break; /* MVI A,nn */
- case 0x3f: m_AF.b.l = (m_AF.b.l & 0xfe) | (~m_AF.b.l & CF); break; /* CMC */
-
- case 0x40: break; /* MOV B,B */
- case 0x41: m_BC.b.h = m_BC.b.l; break; /* MOV B,C */
- case 0x42: m_BC.b.h = m_DE.b.h; break; /* MOV B,D */
- case 0x43: m_BC.b.h = m_DE.b.l; break; /* MOV B,E */
- case 0x44: m_BC.b.h = m_HL.b.h; break; /* MOV B,H */
- case 0x45: m_BC.b.h = m_HL.b.l; break; /* MOV B,L */
- case 0x46: m_BC.b.h = RM(m_HL.d); break; /* MOV B,M */
- case 0x47: m_BC.b.h = m_AF.b.h; break; /* MOV B,A */
-
- case 0x48: m_BC.b.l = m_BC.b.h; break; /* MOV C,B */
- case 0x49: break; /* MOV C,C */
- case 0x4a: m_BC.b.l = m_DE.b.h; break; /* MOV C,D */
- case 0x4b: m_BC.b.l = m_DE.b.l; break; /* MOV C,E */
- case 0x4c: m_BC.b.l = m_HL.b.h; break; /* MOV C,H */
- case 0x4d: m_BC.b.l = m_HL.b.l; break; /* MOV C,L */
- case 0x4e: m_BC.b.l = RM(m_HL.d); break; /* MOV C,M */
- case 0x4f: m_BC.b.l = m_AF.b.h; break; /* MOV C,A */
-
- case 0x50: m_DE.b.h = m_BC.b.h; break; /* MOV D,B */
- case 0x51: m_DE.b.h = m_BC.b.l; break; /* MOV D,C */
- case 0x52: break; /* MOV D,D */
- case 0x53: m_DE.b.h = m_DE.b.l; break; /* MOV D,E */
- case 0x54: m_DE.b.h = m_HL.b.h; break; /* MOV D,H */
- case 0x55: m_DE.b.h = m_HL.b.l; break; /* MOV D,L */
- case 0x56: m_DE.b.h = RM(m_HL.d); break; /* MOV D,M */
- case 0x57: m_DE.b.h = m_AF.b.h; break; /* MOV D,A */
-
- case 0x58: m_DE.b.l = m_BC.b.h; break; /* MOV E,B */
- case 0x59: m_DE.b.l = m_BC.b.l; break; /* MOV E,C */
- case 0x5a: m_DE.b.l = m_DE.b.h; break; /* MOV E,D */
- case 0x5b: break; /* MOV E,E */
- case 0x5c: m_DE.b.l = m_HL.b.h; break; /* MOV E,H */
- case 0x5d: m_DE.b.l = m_HL.b.l; break; /* MOV E,L */
- case 0x5e: m_DE.b.l = RM(m_HL.d); break; /* MOV E,M */
- case 0x5f: m_DE.b.l = m_AF.b.h; break; /* MOV E,A */
-
- case 0x60: m_HL.b.h = m_BC.b.h; break; /* MOV H,B */
- case 0x61: m_HL.b.h = m_BC.b.l; break; /* MOV H,C */
- case 0x62: m_HL.b.h = m_DE.b.h; break; /* MOV H,D */
- case 0x63: m_HL.b.h = m_DE.b.l; break; /* MOV H,E */
- case 0x64: break; /* MOV H,H */
- case 0x65: m_HL.b.h = m_HL.b.l; break; /* MOV H,L */
- case 0x66: m_HL.b.h = RM(m_HL.d); break; /* MOV H,M */
- case 0x67: m_HL.b.h = m_AF.b.h; break; /* MOV H,A */
-
- case 0x68: m_HL.b.l = m_BC.b.h; break; /* MOV L,B */
- case 0x69: m_HL.b.l = m_BC.b.l; break; /* MOV L,C */
- case 0x6a: m_HL.b.l = m_DE.b.h; break; /* MOV L,D */
- case 0x6b: m_HL.b.l = m_DE.b.l; break; /* MOV L,E */
- case 0x6c: m_HL.b.l = m_HL.b.h; break; /* MOV L,H */
- case 0x6d: break; /* MOV L,L */
- case 0x6e: m_HL.b.l = RM(m_HL.d); break; /* MOV L,M */
- case 0x6f: m_HL.b.l = m_AF.b.h; break; /* MOV L,A */
-
- case 0x70: WM(m_HL.d, m_BC.b.h); break; /* MOV M,B */
- case 0x71: WM(m_HL.d, m_BC.b.l); break; /* MOV M,C */
- case 0x72: WM(m_HL.d, m_DE.b.h); break; /* MOV M,D */
- case 0x73: WM(m_HL.d, m_DE.b.l); break; /* MOV M,E */
- case 0x74: WM(m_HL.d, m_HL.b.h); break; /* MOV M,H */
- case 0x75: WM(m_HL.d, m_HL.b.l); break; /* MOV M,L */
- case 0x76: m_PC.w.l--; m_HALT = 1; /* HLT */
- set_status(0x8a); // halt acknowledge
- break;
- case 0x77: WM(m_HL.d, m_AF.b.h); break; /* MOV M,A */
-
- case 0x78: m_AF.b.h = m_BC.b.h; break; /* MOV A,B */
- case 0x79: m_AF.b.h = m_BC.b.l; break; /* MOV A,C */
- case 0x7a: m_AF.b.h = m_DE.b.h; break; /* MOV A,D */
- case 0x7b: m_AF.b.h = m_DE.b.l; break; /* MOV A,E */
- case 0x7c: m_AF.b.h = m_HL.b.h; break; /* MOV A,H */
- case 0x7d: m_AF.b.h = m_HL.b.l; break; /* MOV A,L */
- case 0x7e: m_AF.b.h = RM(m_HL.d); break; /* MOV A,M */
- case 0x7f: break; /* MOV A,A */
-
- case 0x80: M_ADD(m_BC.b.h); break; /* ADD B */
- case 0x81: M_ADD(m_BC.b.l); break; /* ADD C */
- case 0x82: M_ADD(m_DE.b.h); break; /* ADD D */
- case 0x83: M_ADD(m_DE.b.l); break; /* ADD E */
- case 0x84: M_ADD(m_HL.b.h); break; /* ADD H */
- case 0x85: M_ADD(m_HL.b.l); break; /* ADD L */
- case 0x86: m_WZ.b.l = RM(m_HL.d); M_ADD(m_WZ.b.l); break; /* ADD M */
- case 0x87: M_ADD(m_AF.b.h); break; /* ADD A */
-
- case 0x88: M_ADC(m_BC.b.h); break; /* ADC B */
- case 0x89: M_ADC(m_BC.b.l); break; /* ADC C */
- case 0x8a: M_ADC(m_DE.b.h); break; /* ADC D */
- case 0x8b: M_ADC(m_DE.b.l); break; /* ADC E */
- case 0x8c: M_ADC(m_HL.b.h); break; /* ADC H */
- case 0x8d: M_ADC(m_HL.b.l); break; /* ADC L */
- case 0x8e: m_WZ.b.l = RM(m_HL.d); M_ADC(m_WZ.b.l); break; /* ADC M */
- case 0x8f: M_ADC(m_AF.b.h); break; /* ADC A */
-
- case 0x90: M_SUB(m_BC.b.h); break; /* SUB B */
- case 0x91: M_SUB(m_BC.b.l); break; /* SUB C */
- case 0x92: M_SUB(m_DE.b.h); break; /* SUB D */
- case 0x93: M_SUB(m_DE.b.l); break; /* SUB E */
- case 0x94: M_SUB(m_HL.b.h); break; /* SUB H */
- case 0x95: M_SUB(m_HL.b.l); break; /* SUB L */
- case 0x96: m_WZ.b.l = RM(m_HL.d); M_SUB(m_WZ.b.l); break; /* SUB M */
- case 0x97: M_SUB(m_AF.b.h); break; /* SUB A */
-
- case 0x98: M_SBB(m_BC.b.h); break; /* SBB B */
- case 0x99: M_SBB(m_BC.b.l); break; /* SBB C */
- case 0x9a: M_SBB(m_DE.b.h); break; /* SBB D */
- case 0x9b: M_SBB(m_DE.b.l); break; /* SBB E */
- case 0x9c: M_SBB(m_HL.b.h); break; /* SBB H */
- case 0x9d: M_SBB(m_HL.b.l); break; /* SBB L */
- case 0x9e: m_WZ.b.l = RM(m_HL.d); M_SBB(m_WZ.b.l); break; /* SBB M */
- case 0x9f: M_SBB(m_AF.b.h); break; /* SBB A */
-
- case 0xa0: M_ANA(m_BC.b.h); break; /* ANA B */
- case 0xa1: M_ANA(m_BC.b.l); break; /* ANA C */
- case 0xa2: M_ANA(m_DE.b.h); break; /* ANA D */
- case 0xa3: M_ANA(m_DE.b.l); break; /* ANA E */
- case 0xa4: M_ANA(m_HL.b.h); break; /* ANA H */
- case 0xa5: M_ANA(m_HL.b.l); break; /* ANA L */
- case 0xa6: m_WZ.b.l = RM(m_HL.d); M_ANA(m_WZ.b.l); break; /* ANA M */
- case 0xa7: M_ANA(m_AF.b.h); break; /* ANA A */
-
- case 0xa8: M_XRA(m_BC.b.h); break; /* XRA B */
- case 0xa9: M_XRA(m_BC.b.l); break; /* XRA C */
- case 0xaa: M_XRA(m_DE.b.h); break; /* XRA D */
- case 0xab: M_XRA(m_DE.b.l); break; /* XRA E */
- case 0xac: M_XRA(m_HL.b.h); break; /* XRA H */
- case 0xad: M_XRA(m_HL.b.l); break; /* XRA L */
- case 0xae: m_WZ.b.l = RM(m_HL.d); M_XRA(m_WZ.b.l); break; /* XRA M */
- case 0xaf: M_XRA(m_AF.b.h); break; /* XRA A */
-
- case 0xb0: M_ORA(m_BC.b.h); break; /* ORA B */
- case 0xb1: M_ORA(m_BC.b.l); break; /* ORA C */
- case 0xb2: M_ORA(m_DE.b.h); break; /* ORA D */
- case 0xb3: M_ORA(m_DE.b.l); break; /* ORA E */
- case 0xb4: M_ORA(m_HL.b.h); break; /* ORA H */
- case 0xb5: M_ORA(m_HL.b.l); break; /* ORA L */
- case 0xb6: m_WZ.b.l = RM(m_HL.d); M_ORA(m_WZ.b.l); break; /* ORA M */
- case 0xb7: M_ORA(m_AF.b.h); break; /* ORA A */
-
- case 0xb8: M_CMP(m_BC.b.h); break; /* CMP B */
- case 0xb9: M_CMP(m_BC.b.l); break; /* CMP C */
- case 0xba: M_CMP(m_DE.b.h); break; /* CMP D */
- case 0xbb: M_CMP(m_DE.b.l); break; /* CMP E */
- case 0xbc: M_CMP(m_HL.b.h); break; /* CMP H */
- case 0xbd: M_CMP(m_HL.b.l); break; /* CMP L */
- case 0xbe: m_WZ.b.l = RM(m_HL.d); M_CMP(m_WZ.b.l); break; /* CMP M */
- case 0xbf: M_CMP(m_AF.b.h); break; /* CMP A */
-
- case 0xc0: M_RET( !(m_AF.b.l & ZF) ); break; /* RNZ */
- case 0xc1: M_POP(BC); break; /* POP B */
- case 0xc2: M_JMP( !(m_AF.b.l & ZF) ); break; /* JNZ nnnn */
- case 0xc3: M_JMP(1); break; /* JMP nnnn */
- case 0xc4: M_CALL( !(m_AF.b.l & ZF) ); break; /* CNZ nnnn */
- case 0xc5: M_PUSH(BC); break; /* PUSH B */
- case 0xc6: m_WZ.b.l = ARG(); M_ADD(m_WZ.b.l); break; /* ADI nn */
- case 0xc7: M_RST(0); break; /* RST 0 */
-
- case 0xc8: M_RET( m_AF.b.l & ZF ); break; /* RZ */
- case 0xc9: M_POP(PC); break; /* RET */
- case 0xca: M_JMP( m_AF.b.l & ZF ); break; /* JZ nnnn */
- case 0xcb: if (IS_8085()) { /* RST V */
- if (m_AF.b.l & VF) { M_RST(8); }
- else m_icount += 6; // RST not taken
- } else { M_JMP(1); } /* JMP nnnn undocumented */
- break;
- case 0xcc: M_CALL( m_AF.b.l & ZF ); break; /* CZ nnnn */
- case 0xcd: M_CALL(1); break; /* CALL nnnn */
- case 0xce: m_WZ.b.l = ARG(); M_ADC(m_WZ.b.l); break; /* ACI nn */
- case 0xcf: M_RST(1); break; /* RST 1 */
-
- case 0xd0: M_RET( !(m_AF.b.l & CF) ); break; /* RNC */
- case 0xd1: M_POP(DE); break; /* POP D */
- case 0xd2: M_JMP( !(m_AF.b.l & CF) ); break; /* JNC nnnn */
- case 0xd3: M_OUT; break; /* OUT nn */
- case 0xd4: M_CALL( !(m_AF.b.l & CF) ); break; /* CNC nnnn */
- case 0xd5: M_PUSH(DE); break; /* PUSH D */
- case 0xd6: m_WZ.b.l = ARG(); M_SUB(m_WZ.b.l); break; /* SUI nn */
- case 0xd7: M_RST(2); break; /* RST 2 */
-
- case 0xd8: M_RET( m_AF.b.l & CF ); break; /* RC */
- case 0xd9: if (IS_8085()) { /* SHLX */
- m_WZ.w.l = m_DE.w.l;
- WM(m_WZ.d, m_HL.b.l); m_WZ.w.l++;
- WM(m_WZ.d, m_HL.b.h);
- } else { M_POP(PC); } /* RET undocumented */
- break;
- case 0xda: M_JMP( m_AF.b.l & CF ); break; /* JC nnnn */
- case 0xdb: M_IN; break; /* IN nn */
- case 0xdc: M_CALL( m_AF.b.l & CF ); break; /* CC nnnn */
- case 0xdd: if (IS_8085()) { M_JMP( !(m_AF.b.l & X5F) ); } /* JNX nnnn */
- else { M_CALL(1); } /* CALL nnnn undocumented */
- break;
- case 0xde: m_WZ.b.l = ARG(); M_SBB(m_WZ.b.l); break; /* SBI nn */
- case 0xdf: M_RST(3); break; /* RST 3 */
-
- case 0xe0: M_RET( !(m_AF.b.l & PF) ); break; /* RPO */
- case 0xe1: M_POP(HL); break; /* POP H */
- case 0xe2: M_JMP( !(m_AF.b.l & PF) ); break; /* JPO nnnn */
- case 0xe3: M_POP(WZ); M_PUSH(HL); /* XTHL */
- m_HL.d = m_WZ.d;
- break;
- case 0xe4: M_CALL( !(m_AF.b.l & PF) ); break; /* CPO nnnn */
- case 0xe5: M_PUSH(HL); break; /* PUSH H */
- case 0xe6: m_WZ.b.l = ARG(); M_ANA(m_WZ.b.l); break; /* ANI nn */
- case 0xe7: M_RST(4); break; /* RST 4 */
-
- case 0xe8: M_RET( m_AF.b.l & PF ); break; /* RPE */
- case 0xe9: m_PC.d = m_HL.w.l; break; /* PCHL */
- case 0xea: M_JMP( m_AF.b.l & PF ); break; /* JPE nnnn */
- case 0xeb: m_WZ.d = m_DE.d; /* XCHG */
- m_DE.d = m_HL.d;
- m_HL.d = m_WZ.d;
- break;
- case 0xec: M_CALL( m_AF.b.l & PF ); break; /* CPE nnnn */
- case 0xed: if (IS_8085()) { /* LHLX */
- m_WZ.w.l = m_DE.w.l;
- m_HL.b.l = RM(m_WZ.d); m_WZ.w.l++;
- m_HL.b.h = RM(m_WZ.d);
- } else { M_CALL(1); } /* CALL nnnn undocumented */
- break;
- case 0xee: m_WZ.b.l = ARG(); M_XRA(m_WZ.b.l); break; /* XRI nn */
- case 0xef: M_RST(5); break; /* RST 5 */
-
- case 0xf0: M_RET( !(m_AF.b.l&SF) ); break; /* RP */
- case 0xf1: M_POP(AF); break; /* POP A */
- case 0xf2: M_JMP( !(m_AF.b.l & SF) ); break; /* JP nnnn */
- case 0xf3: set_inte(0); break; /* DI */
- case 0xf4: M_CALL( !(m_AF.b.l & SF) ); break; /* CP nnnn */
- case 0xf5: if (IS_8080()) m_AF.b.l = (m_AF.b.l&~(X3F|X5F))|VF; // on 8080, VF=1 and X3F=0 and X5F=0 always! (we don't have to check for it elsewhere)
- M_PUSH(AF); break; /* PUSH A */
- case 0xf6: m_WZ.b.l = ARG(); M_ORA(m_WZ.b.l); break; /* ORI nn */
- case 0xf7: M_RST(6); break; /* RST 6 */
-
- case 0xf8: M_RET( m_AF.b.l & SF ); break; /* RM */
- case 0xf9: m_SP.d = m_HL.d; break; /* SPHL */
- case 0xfa: M_JMP( m_AF.b.l & SF ); break; /* JM nnnn */
- case 0xfb: set_inte(1); m_after_ei = 2; break; /* EI */
- case 0xfc: M_CALL( m_AF.b.l & SF ); break; /* CM nnnn */
- case 0xfd: if (IS_8085()) { M_JMP( m_AF.b.l & X5F ); } /* JX nnnn */
- else { M_CALL(1); } /* CALL nnnn undocumented */
- break;
- case 0xfe: m_WZ.b.l = ARG(); M_CMP(m_WZ.b.l); break; /* CPI nn */
- case 0xff: M_RST(7); break; /* RST 7 */
- }
+ case 0x00: // NOP
+ break;
+ case 0x01: // LXI B,nnnn
+ m_BC.w.l = ARG16();
+ break;
+ case 0x02: // STAX B
+ WM(m_BC.d, m_AF.b.h);
+ break;
+ case 0x03: // INX B
+ m_BC.w.l++;
+ if (IS_8085())
+ {
+ if (m_BC.w.l == 0x0000)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x04: // INR B
+ M_INR(m_BC.b.h);
+ break;
+ case 0x05: // DCR B
+ M_DCR(m_BC.b.h);
+ break;
+ case 0x06: // MVI B,nn
+ M_MVI(m_BC.b.h);
+ break;
+ case 0x07: // RLC
+ M_RLC;
+ break;
+
+ case 0x08: // 8085: DSUB, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ M_DSUB();
+ }
+ break;
+ case 0x09: // DAD B
+ M_DAD(BC);
+ break;
+ case 0x0a: // LDAX B
+ m_AF.b.h = RM(m_BC.d);
+ break;
+ case 0x0b: // DCX B
+ m_BC.w.l--;
+ if (IS_8085())
+ {
+ if (m_BC.w.l == 0xffff)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x0c: // INR C
+ M_INR(m_BC.b.l);
+ break;
+ case 0x0d: // DCR C
+ M_DCR(m_BC.b.l);
+ break;
+ case 0x0e: // MVI C,nn
+ M_MVI(m_BC.b.l);
+ break;
+ case 0x0f: // RRC
+ M_RRC;
+ break;
+
+ case 0x10: // 8085: ASRH, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ m_AF.b.l = (m_AF.b.l & ~CF) | (m_HL.b.l & CF);
+ m_HL.w.l = (m_HL.w.l >> 1);
+ }
+ break;
+ case 0x11: // LXI D,nnnn
+ m_DE.w.l = ARG16();
+ break;
+ case 0x12: // STAX D
+ WM(m_DE.d, m_AF.b.h);
+ break;
+ case 0x13: // INX D
+ m_DE.w.l++;
+ if (IS_8085())
+ {
+ if (m_DE.w.l == 0x0000)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x14: // INR D
+ M_INR(m_DE.b.h);
+ break;
+ case 0x15: // DCR D
+ M_DCR(m_DE.b.h);
+ break;
+ case 0x16: // MVI D,nn
+ M_MVI(m_DE.b.h);
+ break;
+ case 0x17: // RAL
+ M_RAL;
+ break;
+
+ case 0x18: // 8085: RLDE, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ m_AF.b.l = (m_AF.b.l & ~(CF | VF)) | (m_DE.b.h >> 7);
+ m_DE.w.l = (m_DE.w.l << 1) | (m_DE.w.l >> 15);
+ if ((((m_DE.w.l >> 15) ^ m_AF.b.l) & CF) != 0)
+ m_AF.b.l |= VF;
+ }
+ break;
+ case 0x19: // DAD D
+ M_DAD(DE);
+ break;
+ case 0x1a: // LDAX D
+ m_AF.b.h = RM(m_DE.d);
+ break;
+ case 0x1b: // DCX D
+ m_DE.w.l--;
+ if (IS_8085())
+ {
+ if (m_DE.w.l == 0xffff)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x1c: // INR E
+ M_INR(m_DE.b.l);
+ break;
+ case 0x1d: // DCR E
+ M_DCR(m_DE.b.l);
+ break;
+ case 0x1e: // MVI E,nn
+ M_MVI(m_DE.b.l);
+ break;
+ case 0x1f: // RAR
+ M_RAR;
+ break;
+
+ case 0x20: // 8085: RIM, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ m_AF.b.h = get_rim_value();
+
+ // if we have remembered state from taking a TRAP, fix up the IE flag here
+ if (m_trap_im_copy & 0x80)
+ m_AF.b.h = (m_AF.b.h & ~IM_IE) | (m_trap_im_copy & IM_IE);
+ m_trap_im_copy = 0;
+ }
+ break;
+ case 0x21: // LXI H,nnnn
+ m_HL.w.l = ARG16();
+ break;
+ case 0x22: // SHLD nnnn
+ m_WZ.w.l = ARG16();
+ WM(m_WZ.d, m_HL.b.l);
+ m_WZ.w.l++;
+ WM(m_WZ.d, m_HL.b.h);
+ break;
+ case 0x23: // INX H
+ m_HL.w.l++;
+ if (IS_8085())
+ {
+ if (m_HL.w.l == 0x0000)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x24: // INR H
+ M_INR(m_HL.b.h);
+ break;
+ case 0x25: // DCR H
+ M_DCR(m_HL.b.h);
+ break;
+ case 0x26: // MVI H,nn
+ M_MVI(m_HL.b.h);
+ break;
+ case 0x27: // DAA
+ m_WZ.b.h = m_AF.b.h;
+ if (IS_8085() && m_AF.b.l&VF)
+ {
+ if ((m_AF.b.l&HF) || ((m_AF.b.h&0xf)>9))
+ m_WZ.b.h -= 6;
+ if ((m_AF.b.l&CF) || (m_AF.b.h>0x99))
+ m_WZ.b.h -= 0x60;
+ }
+ else
+ {
+ if ((m_AF.b.l&HF) || ((m_AF.b.h&0xf)>9))
+ m_WZ.b.h += 6;
+ if ((m_AF.b.l&CF) || (m_AF.b.h>0x99))
+ m_WZ.b.h += 0x60;
+ }
+
+ m_AF.b.l = (m_AF.b.l&3) | (m_AF.b.h&0x28) | (m_AF.b.h>0x99) | ((m_AF.b.h^m_WZ.b.h)&0x10) | ZSP[m_WZ.b.h];
+ m_AF.b.h = m_WZ.b.h;
+ break;
+
+ case 0x28: // 8085: LDEH nn, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ m_WZ.d = ARG();
+ m_DE.d = (m_HL.d + m_WZ.d) & 0xffff;
+ }
+ break;
+ case 0x29: // DAD H
+ M_DAD(HL);
+ break;
+ case 0x2a: // LHLD nnnn
+ m_WZ.d = ARG16();
+ m_HL.b.l = RM(m_WZ.d);
+ m_WZ.w.l++;
+ m_HL.b.h = RM(m_WZ.d);
+ break;
+ case 0x2b: // DCX H
+ m_HL.w.l--;
+ if (IS_8085())
+ {
+ if (m_HL.w.l == 0xffff)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x2c: // INR L
+ M_INR(m_HL.b.l);
+ break;
+ case 0x2d: // DCR L
+ M_DCR(m_HL.b.l);
+ break;
+ case 0x2e: // MVI L,nn
+ M_MVI(m_HL.b.l);
+ break;
+ case 0x2f: // CMA
+ m_AF.b.h ^= 0xff;
+ if (IS_8085())
+ m_AF.b.l |= HF | VF;
+ break;
+
+ case 0x30: // 8085: SIM, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ // if bit 3 is set, bits 0-2 become the new masks
+ if (m_AF.b.h & 0x08)
+ {
+ m_IM &= ~(IM_M55 | IM_M65 | IM_M75 | IM_I55 | IM_I65);
+ m_IM |= m_AF.b.h & (IM_M55 | IM_M65 | IM_M75);
+
+ // update live state based on the new masks
+ if ((m_IM & IM_M55) == 0 && m_irq_state[I8085_RST55_LINE])
+ m_IM |= IM_I55;
+ if ((m_IM & IM_M65) == 0 && m_irq_state[I8085_RST65_LINE])
+ m_IM |= IM_I65;
+ }
+
+ // bit if 4 is set, the 7.5 flip-flop is cleared
+ if (m_AF.b.h & 0x10)
+ m_IM &= ~IM_I75;
+
+ // if bit 6 is set, then bit 7 is the new SOD state
+ if (m_AF.b.h & 0x40)
+ set_sod(m_AF.b.h >> 7);
+
+ // check for revealed interrupts
+ check_for_interrupts();
+ }
+ break;
+ case 0x31: // LXI SP,nnnn
+ m_SP.w.l = ARG16();
+ break;
+ case 0x32: // STAX nnnn
+ m_WZ.d = ARG16();
+ WM(m_WZ.d, m_AF.b.h);
+ break;
+ case 0x33: // INX SP
+ m_SP.w.l++;
+ if (IS_8085())
+ {
+ if (m_SP.w.l == 0x0000)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x34: // INR M
+ m_WZ.b.l = RM(m_HL.d);
+ M_INR(m_WZ.b.l);
+ WM(m_HL.d, m_WZ.b.l);
+ break;
+ case 0x35: // DCR M
+ m_WZ.b.l = RM(m_HL.d);
+ M_DCR(m_WZ.b.l);
+ WM(m_HL.d, m_WZ.b.l);
+ break;
+ case 0x36: // MVI M,nn
+ m_WZ.b.l = ARG();
+ WM(m_HL.d, m_WZ.b.l);
+ break;
+ case 0x37: // STC
+ m_AF.b.l = (m_AF.b.l & 0xfe) | CF;
+ break;
+
+ case 0x38: // 8085: LDES nn, otherwise undocumented NOP
+ if (IS_8085())
+ {
+ m_WZ.d = ARG();
+ m_DE.d = (m_SP.d + m_WZ.d) & 0xffff;
+ }
+ break;
+ case 0x39: // DAD SP
+ M_DAD(SP);
+ break;
+ case 0x3a: // LDAX nnnn
+ m_WZ.d = ARG16();
+ m_AF.b.h = RM(m_WZ.d);
+ break;
+ case 0x3b: // DCX SP
+ m_SP.w.l--;
+ if (IS_8085())
+ {
+ if (m_SP.w.l == 0xffff)
+ m_AF.b.l |= X5F;
+ else
+ m_AF.b.l &= ~X5F;
+ }
+ break;
+ case 0x3c: // INR A
+ M_INR(m_AF.b.h);
+ break;
+ case 0x3d: // DCR A
+ M_DCR(m_AF.b.h);
+ break;
+ case 0x3e: // MVI A,nn
+ M_MVI(m_AF.b.h);
+ break;
+ case 0x3f: // CMC
+ m_AF.b.l = (m_AF.b.l & 0xfe) | (~m_AF.b.l & CF);
+ break;
+
+ // MOV [B/C/D/E/H/L/M/A],[B/C/D/E/H/L/M/A]
+ case 0x40: break; // MOV B,B
+ case 0x41: m_BC.b.h = m_BC.b.l; break;
+ case 0x42: m_BC.b.h = m_DE.b.h; break;
+ case 0x43: m_BC.b.h = m_DE.b.l; break;
+ case 0x44: m_BC.b.h = m_HL.b.h; break;
+ case 0x45: m_BC.b.h = m_HL.b.l; break;
+ case 0x46: m_BC.b.h = RM(m_HL.d); break;
+ case 0x47: m_BC.b.h = m_AF.b.h; break;
+
+ case 0x48: m_BC.b.l = m_BC.b.h; break;
+ case 0x49: break; // MOV C,C
+ case 0x4a: m_BC.b.l = m_DE.b.h; break;
+ case 0x4b: m_BC.b.l = m_DE.b.l; break;
+ case 0x4c: m_BC.b.l = m_HL.b.h; break;
+ case 0x4d: m_BC.b.l = m_HL.b.l; break;
+ case 0x4e: m_BC.b.l = RM(m_HL.d); break;
+ case 0x4f: m_BC.b.l = m_AF.b.h; break;
+
+ case 0x50: m_DE.b.h = m_BC.b.h; break;
+ case 0x51: m_DE.b.h = m_BC.b.l; break;
+ case 0x52: break; // MOV D,D
+ case 0x53: m_DE.b.h = m_DE.b.l; break;
+ case 0x54: m_DE.b.h = m_HL.b.h; break;
+ case 0x55: m_DE.b.h = m_HL.b.l; break;
+ case 0x56: m_DE.b.h = RM(m_HL.d); break;
+ case 0x57: m_DE.b.h = m_AF.b.h; break;
+
+ case 0x58: m_DE.b.l = m_BC.b.h; break;
+ case 0x59: m_DE.b.l = m_BC.b.l; break;
+ case 0x5a: m_DE.b.l = m_DE.b.h; break;
+ case 0x5b: break; // MOV E,E
+ case 0x5c: m_DE.b.l = m_HL.b.h; break;
+ case 0x5d: m_DE.b.l = m_HL.b.l; break;
+ case 0x5e: m_DE.b.l = RM(m_HL.d); break;
+ case 0x5f: m_DE.b.l = m_AF.b.h; break;
+
+ case 0x60: m_HL.b.h = m_BC.b.h; break;
+ case 0x61: m_HL.b.h = m_BC.b.l; break;
+ case 0x62: m_HL.b.h = m_DE.b.h; break;
+ case 0x63: m_HL.b.h = m_DE.b.l; break;
+ case 0x64: break; // MOV H,H
+ case 0x65: m_HL.b.h = m_HL.b.l; break;
+ case 0x66: m_HL.b.h = RM(m_HL.d); break;
+ case 0x67: m_HL.b.h = m_AF.b.h; break;
+
+ case 0x68: m_HL.b.l = m_BC.b.h; break;
+ case 0x69: m_HL.b.l = m_BC.b.l; break;
+ case 0x6a: m_HL.b.l = m_DE.b.h; break;
+ case 0x6b: m_HL.b.l = m_DE.b.l; break;
+ case 0x6c: m_HL.b.l = m_HL.b.h; break;
+ case 0x6d: break; // MOV L,L
+ case 0x6e: m_HL.b.l = RM(m_HL.d); break;
+ case 0x6f: m_HL.b.l = m_AF.b.h; break;
+
+ case 0x70: WM(m_HL.d, m_BC.b.h); break;
+ case 0x71: WM(m_HL.d, m_BC.b.l); break;
+ case 0x72: WM(m_HL.d, m_DE.b.h); break;
+ case 0x73: WM(m_HL.d, m_DE.b.l); break;
+ case 0x74: WM(m_HL.d, m_HL.b.h); break;
+ case 0x75: WM(m_HL.d, m_HL.b.l); break;
+ case 0x76: // HLT (instead of MOV M,M)
+ m_PC.w.l--;
+ m_HALT = 1;
+ set_status(0x8a); // halt acknowledge
+ break;
+ case 0x77: WM(m_HL.d, m_AF.b.h); break;
+
+ case 0x78: m_AF.b.h = m_BC.b.h; break;
+ case 0x79: m_AF.b.h = m_BC.b.l; break;
+ case 0x7a: m_AF.b.h = m_DE.b.h; break;
+ case 0x7b: m_AF.b.h = m_DE.b.l; break;
+ case 0x7c: m_AF.b.h = m_HL.b.h; break;
+ case 0x7d: m_AF.b.h = m_HL.b.l; break;
+ case 0x7e: m_AF.b.h = RM(m_HL.d); break;
+ case 0x7f: break; // MOV A,A
+
+ // alu op [B/C/D/E/H/L/M/A]
+ case 0x80: M_ADD(m_BC.b.h); break;
+ case 0x81: M_ADD(m_BC.b.l); break;
+ case 0x82: M_ADD(m_DE.b.h); break;
+ case 0x83: M_ADD(m_DE.b.l); break;
+ case 0x84: M_ADD(m_HL.b.h); break;
+ case 0x85: M_ADD(m_HL.b.l); break;
+ case 0x86: m_WZ.b.l = RM(m_HL.d); M_ADD(m_WZ.b.l); break;
+ case 0x87: M_ADD(m_AF.b.h); break;
+
+ case 0x88: M_ADC(m_BC.b.h); break;
+ case 0x89: M_ADC(m_BC.b.l); break;
+ case 0x8a: M_ADC(m_DE.b.h); break;
+ case 0x8b: M_ADC(m_DE.b.l); break;
+ case 0x8c: M_ADC(m_HL.b.h); break;
+ case 0x8d: M_ADC(m_HL.b.l); break;
+ case 0x8e: m_WZ.b.l = RM(m_HL.d); M_ADC(m_WZ.b.l); break;
+ case 0x8f: M_ADC(m_AF.b.h); break;
+
+ case 0x90: M_SUB(m_BC.b.h); break;
+ case 0x91: M_SUB(m_BC.b.l); break;
+ case 0x92: M_SUB(m_DE.b.h); break;
+ case 0x93: M_SUB(m_DE.b.l); break;
+ case 0x94: M_SUB(m_HL.b.h); break;
+ case 0x95: M_SUB(m_HL.b.l); break;
+ case 0x96: m_WZ.b.l = RM(m_HL.d); M_SUB(m_WZ.b.l); break;
+ case 0x97: M_SUB(m_AF.b.h); break;
+
+ case 0x98: M_SBB(m_BC.b.h); break;
+ case 0x99: M_SBB(m_BC.b.l); break;
+ case 0x9a: M_SBB(m_DE.b.h); break;
+ case 0x9b: M_SBB(m_DE.b.l); break;
+ case 0x9c: M_SBB(m_HL.b.h); break;
+ case 0x9d: M_SBB(m_HL.b.l); break;
+ case 0x9e: m_WZ.b.l = RM(m_HL.d); M_SBB(m_WZ.b.l); break;
+ case 0x9f: M_SBB(m_AF.b.h); break;
+
+ case 0xa0: M_ANA(m_BC.b.h); break;
+ case 0xa1: M_ANA(m_BC.b.l); break;
+ case 0xa2: M_ANA(m_DE.b.h); break;
+ case 0xa3: M_ANA(m_DE.b.l); break;
+ case 0xa4: M_ANA(m_HL.b.h); break;
+ case 0xa5: M_ANA(m_HL.b.l); break;
+ case 0xa6: m_WZ.b.l = RM(m_HL.d); M_ANA(m_WZ.b.l); break;
+ case 0xa7: M_ANA(m_AF.b.h); break;
+
+ case 0xa8: M_XRA(m_BC.b.h); break;
+ case 0xa9: M_XRA(m_BC.b.l); break;
+ case 0xaa: M_XRA(m_DE.b.h); break;
+ case 0xab: M_XRA(m_DE.b.l); break;
+ case 0xac: M_XRA(m_HL.b.h); break;
+ case 0xad: M_XRA(m_HL.b.l); break;
+ case 0xae: m_WZ.b.l = RM(m_HL.d); M_XRA(m_WZ.b.l); break;
+ case 0xaf: M_XRA(m_AF.b.h); break;
+
+ case 0xb0: M_ORA(m_BC.b.h); break;
+ case 0xb1: M_ORA(m_BC.b.l); break;
+ case 0xb2: M_ORA(m_DE.b.h); break;
+ case 0xb3: M_ORA(m_DE.b.l); break;
+ case 0xb4: M_ORA(m_HL.b.h); break;
+ case 0xb5: M_ORA(m_HL.b.l); break;
+ case 0xb6: m_WZ.b.l = RM(m_HL.d); M_ORA(m_WZ.b.l); break;
+ case 0xb7: M_ORA(m_AF.b.h); break;
+
+ case 0xb8: M_CMP(m_BC.b.h); break;
+ case 0xb9: M_CMP(m_BC.b.l); break;
+ case 0xba: M_CMP(m_DE.b.h); break;
+ case 0xbb: M_CMP(m_DE.b.l); break;
+ case 0xbc: M_CMP(m_HL.b.h); break;
+ case 0xbd: M_CMP(m_HL.b.l); break;
+ case 0xbe: m_WZ.b.l = RM(m_HL.d); M_CMP(m_WZ.b.l); break;
+ case 0xbf: M_CMP(m_AF.b.h); break;
+
+ case 0xc0: // RNZ
+ M_RET(!(m_AF.b.l & ZF));
+ break;
+ case 0xc1: // POP B
+ M_POP(BC);
+ break;
+ case 0xc2: // JNZ nnnn
+ M_JMP(!(m_AF.b.l & ZF));
+ break;
+ case 0xc3: // JMP nnnn
+ M_JMP(1);
+ break;
+ case 0xc4: // CNZ nnnn
+ M_CALL(!(m_AF.b.l & ZF));
+ break;
+ case 0xc5: // PUSH B
+ M_PUSH(BC);
+ break;
+ case 0xc6: // ADI nn
+ m_WZ.b.l = ARG();
+ M_ADD(m_WZ.b.l);
+ break;
+ case 0xc7: // RST 0
+ M_RST(0);
+ break;
+
+ case 0xc8: // RZ
+ M_RET(m_AF.b.l & ZF);
+ break;
+ case 0xc9: // RET
+ M_POP(PC);
+ break;
+ case 0xca: // JZ nnnn
+ M_JMP(m_AF.b.l & ZF);
+ break;
+ case 0xcb: // 8085: RST V, otherwise undocumented JMP nnnn
+ if (IS_8085())
+ {
+ if (m_AF.b.l & VF)
+ {
+ M_RST(8);
+ }
+ else
+ m_icount += 6; // RST not taken
+ }
+ else
+ {
+ M_JMP(1);
+ }
+ break;
+ case 0xcc: // CZ nnnn
+ M_CALL(m_AF.b.l & ZF);
+ break;
+ case 0xcd: // CALL nnnn
+ M_CALL(1);
+ break;
+ case 0xce: // ACI nn
+ m_WZ.b.l = ARG();
+ M_ADC(m_WZ.b.l);
+ break;
+ case 0xcf: // RST 1
+ M_RST(1);
+ break;
+
+ case 0xd0: // RNC
+ M_RET(!(m_AF.b.l & CF));
+ break;
+ case 0xd1: // POP D
+ M_POP(DE);
+ break;
+ case 0xd2: // JNC nnnn
+ M_JMP(!(m_AF.b.l & CF));
+ break;
+ case 0xd3: // OUT nn
+ M_OUT;
+ break;
+ case 0xd4: // CNC nnnn
+ M_CALL(!(m_AF.b.l & CF));
+ break;
+ case 0xd5: // PUSH D
+ M_PUSH(DE);
+ break;
+ case 0xd6: // SUI nn
+ m_WZ.b.l = ARG();
+ M_SUB(m_WZ.b.l);
+ break;
+ case 0xd7: // RST 2
+ M_RST(2);
+ break;
+
+ case 0xd8: // RC
+ M_RET(m_AF.b.l & CF);
+ break;
+ case 0xd9: // 8085: SHLX, otherwise undocumented RET
+ if (IS_8085())
+ {
+ m_WZ.w.l = m_DE.w.l;
+ WM(m_WZ.d, m_HL.b.l);
+ m_WZ.w.l++;
+ WM(m_WZ.d, m_HL.b.h);
+ }
+ else
+ {
+ M_POP(PC);
+ }
+ break;
+ case 0xda: // JC nnnn
+ M_JMP(m_AF.b.l & CF);
+ break;
+ case 0xdb: // IN nn
+ M_IN;
+ break;
+ case 0xdc: // CC nnnn
+ M_CALL(m_AF.b.l & CF);
+ break;
+ case 0xdd: // 8085: JNX nnnn, otherwise undocumented CALL nnnn
+ if (IS_8085())
+ {
+ M_JMP(!(m_AF.b.l & X5F));
+ }
+ else
+ {
+ M_CALL(1);
+ }
+ break;
+ case 0xde: // SBI nn
+ m_WZ.b.l = ARG();
+ M_SBB(m_WZ.b.l);
+ break;
+ case 0xdf: // RST 3
+ M_RST(3);
+ break;
+
+ case 0xe0: // RPO
+ M_RET(!(m_AF.b.l & PF));
+ break;
+ case 0xe1: // POP H
+ M_POP(HL);
+ break;
+ case 0xe2: // JPO nnnn
+ M_JMP(!(m_AF.b.l & PF));
+ break;
+ case 0xe3: // XTHL
+ M_POP(WZ);
+ M_PUSH(HL);
+ m_HL.d = m_WZ.d;
+ break;
+ case 0xe4: // CPO nnnn
+ M_CALL(!(m_AF.b.l & PF));
+ break;
+ case 0xe5: // PUSH H
+ M_PUSH(HL);
+ break;
+ case 0xe6: // ANI nn
+ m_WZ.b.l = ARG();
+ M_ANA(m_WZ.b.l);
+ break;
+ case 0xe7: // RST 4
+ M_RST(4);
+ break;
+
+ case 0xe8: // RPE
+ M_RET(m_AF.b.l & PF);
+ break;
+ case 0xe9: // PCHL
+ m_PC.d = m_HL.w.l;
+ break;
+ case 0xea: // JPE nnnn
+ M_JMP(m_AF.b.l & PF);
+ break;
+ case 0xeb: // XCHG
+ m_WZ.d = m_DE.d;
+ m_DE.d = m_HL.d;
+ m_HL.d = m_WZ.d;
+ break;
+ case 0xec: // CPE nnnn
+ M_CALL(m_AF.b.l & PF);
+ break;
+ case 0xed: // 8085: LHLX, otherwise undocumented CALL nnnn
+ if (IS_8085())
+ {
+ m_WZ.w.l = m_DE.w.l;
+ m_HL.b.l = RM(m_WZ.d);
+ m_WZ.w.l++;
+ m_HL.b.h = RM(m_WZ.d);
+ }
+ else
+ {
+ M_CALL(1);
+ }
+ break;
+ case 0xee: // XRI nn
+ m_WZ.b.l = ARG();
+ M_XRA(m_WZ.b.l);
+ break;
+ case 0xef: // RST 5
+ M_RST(5);
+ break;
+
+ case 0xf0: // RP
+ M_RET(!(m_AF.b.l & SF));
+ break;
+ case 0xf1: // POP A
+ M_POP(AF);
+ break;
+ case 0xf2: // JP nnnn
+ M_JMP(!(m_AF.b.l & SF));
+ break;
+ case 0xf3: // DI
+ set_inte(0);
+ break;
+ case 0xf4: // CP nnnn
+ M_CALL(!(m_AF.b.l & SF));
+ break;
+ case 0xf5: // PUSH A
+ // on 8080, VF=1 and X3F=0 and X5F=0 always! (we don't have to check for it elsewhere)
+ if (IS_8080())
+ m_AF.b.l = (m_AF.b.l&~(X3F|X5F))|VF;
+ M_PUSH(AF);
+ break;
+ case 0xf6: // ORI nn
+ m_WZ.b.l = ARG();
+ M_ORA(m_WZ.b.l);
+ break;
+ case 0xf7: // RST 6
+ M_RST(6);
+ break;
+
+ case 0xf8: // RM
+ M_RET(m_AF.b.l & SF);
+ break;
+ case 0xf9: // SPHL
+ m_SP.d = m_HL.d;
+ break;
+ case 0xfa: // JM nnnn
+ M_JMP(m_AF.b.l & SF);
+ break;
+ case 0xfb: // EI
+ set_inte(1);
+ m_after_ei = 2;
+ break;
+ case 0xfc: // CM nnnn
+ M_CALL(m_AF.b.l & SF);
+ break;
+ case 0xfd: // 8085: JX nnnn, otherwise undocumented CALL nnnn
+ if (IS_8085())
+ {
+ M_JMP(m_AF.b.l & X5F);
+ }
+ else
+ {
+ M_CALL(1);
+ }
+ break;
+ case 0xfe: // CPI nn
+ m_WZ.b.l = ARG();
+ M_CMP(m_WZ.b.l);
+ break;
+ case 0xff: // RST 7
+ M_RST(7);
+ break;
+ } // end big switch
}