diff options
Diffstat (limited to 'src/devices/cpu/i8085/i8085.cpp')
-rw-r--r-- | src/devices/cpu/i8085/i8085.cpp | 1161 |
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 } |