📄 i8085.c
字号:
/*******************************************************
*
* Portable (hopefully ;-) I8085A emulator
*
* Written by Juergen Buchmueller for use with MAME
*
* Partially based on Z80Em by Marcel De Kogel
*
*******************************************************/
#define VERBOSE
#ifdef VERBOSE
#include <stdio.h>
#include "driver.h"
#endif
#include "memory.h"
#include "i8085/i8085.h"
#include "i8085/i8085cpu.h"
#include "i8085/i8085daa.h"
int I8085_ICount = 0;
static I8085_Regs I;
static byte ZS[256];
static byte ZSP[256];
static int RDOP(void) { return cpu_readop(I.PC.W.l++); }
static int RDOPARG(void) { return cpu_readop_arg(I.PC.W.l++); }
static int RDOPARG_WORD(void) { int w = cpu_readop_arg(I.PC.W.l++); w += cpu_readop_arg(I.PC.W.l++) << 8; return w; }
static int RDMEM(int a) { return cpu_readmem16(a); }
static void WRMEM(int a, int v) { cpu_writemem16(a, v); }
INLINE void ExecOne(int opcode)
{
switch (opcode)
{
case 0x00: I8085_ICount -= 4; /* NOP */
/* no op */
break;
case 0x01: I8085_ICount -= 10; /* LXI B,nnnn */
I.BC.W.l = RDOPARG_WORD();
break;
case 0x02: I8085_ICount -= 7; /* STAX B */
WRMEM(I.BC.D, I.AF.B.h);
break;
case 0x03: I8085_ICount -= 6; /* INX B */
I.BC.W.l++;
break;
case 0x04: I8085_ICount -= 4; /* INR B */
M_INR(I.BC.B.h);
break;
case 0x05: I8085_ICount -= 4; /* DCR B */
M_DCR(I.BC.B.h);
break;
case 0x06: I8085_ICount -= 7; /* MVI B,nn */
M_MVI(I.BC.B.h);
break;
case 0x07: I8085_ICount -= 4; /* RLC */
M_RLC;
break;
case 0x08: I8085_ICount -= 4; /* ???? */
break;
case 0x09: I8085_ICount -= 11; /* DAD B */
M_DAD(BC);
break;
case 0x0a: I8085_ICount -= 7; /* LDAX B */
I.AF.B.h = RDMEM(I.BC.D);
break;
case 0x0b: I8085_ICount -= 6; /* DCX B */
I.BC.W.l--;
break;
case 0x0c: I8085_ICount -= 4; /* INR C */
M_INR(I.BC.B.l);
break;
case 0x0d: I8085_ICount -= 4; /* DCR C */
M_DCR(I.BC.B.l);
break;
case 0x0e: I8085_ICount -= 7; /* MVI C,nn */
M_MVI(I.BC.B.l);
break;
case 0x0f: I8085_ICount -= 4; /* RRC */
M_RRC;
break;
case 0x10: I8085_ICount -= 8; /* ???? */
break;
case 0x11: I8085_ICount -= 10; /* LXI D,nnnn */
I.DE.W.l = RDOPARG_WORD();
break;
case 0x12: I8085_ICount -= 7; /* STAX D */
WRMEM(I.DE.D, I.AF.B.h);
break;
case 0x13: I8085_ICount -= 6; /* INX D */
I.DE.W.l++;
break;
case 0x14: I8085_ICount -= 4; /* INR D */
M_INR(I.DE.B.h);
break;
case 0x15: I8085_ICount -= 4; /* DCR D */
M_DCR(I.DE.B.h);
break;
case 0x16: I8085_ICount -= 7; /* MVI D,nn */
M_MVI(I.DE.B.h);
break;
case 0x17: I8085_ICount -= 4; /* RAL */
M_RAL;
break;
case 0x18: I8085_ICount -= 7; /* ????? */
break;
case 0x19: I8085_ICount -= 11; /* DAD D */
M_DAD(DE);
break;
case 0x1a: I8085_ICount -= 7; /* LDAX D */
I.AF.B.h = RDMEM(I.DE.D);
break;
case 0x1b: I8085_ICount -= 6; /* DCX D */
I.DE.W.l--;
break;
case 0x1c: I8085_ICount -= 4; /* INR E */
M_INR(I.DE.B.l);
break;
case 0x1d: I8085_ICount -= 4; /* DCR E */
M_DCR(I.DE.B.l);
break;
case 0x1e: I8085_ICount -= 7; /* MVI E,nn */
M_MVI(I.DE.B.l);
break;
case 0x1f: I8085_ICount -= 4; /* RAR */
M_RAR;
break;
case 0x20: I8085_ICount -= 7; /* RIM */
I.AF.B.h = I.IM;
break;
case 0x21: I8085_ICount -= 10; /* LXI H,nnnn */
I.HL.W.l = RDOPARG_WORD();
break;
case 0x22: I8085_ICount -= 16; /* SHLD nnnn */
I.XX.W.l = RDOPARG_WORD();
WRMEM(I.XX.D, I.HL.B.l);
I.XX.W.l++;
WRMEM(I.XX.D, I.HL.B.h);
break;
case 0x23: I8085_ICount -= 6; /* INX H */
I.HL.W.l++;
break;
case 0x24: I8085_ICount -= 4; /* INR H */
M_INR(I.HL.B.h);
break;
case 0x25: I8085_ICount -= 4; /* DCR H */
M_DCR(I.HL.B.h);
break;
case 0x26: I8085_ICount -= 7; /* MVI H,nn */
M_MVI(I.HL.B.h);
break;
case 0x27: I8085_ICount -= 4; /* DAA */
I.XX.D = I.AF.B.h;
if (I.AF.B.l & CF) I.XX.D |= 0x100;
if (I.AF.B.l & HF) I.XX.D |= 0x200;
if (I.AF.B.l & NF) I.XX.D |= 0x400;
I.AF.W.l = DAA[I.XX.D];
break;
case 0x28: I8085_ICount -= 7; /* ???? */
break;
case 0x29: I8085_ICount -= 11; /* DAD H */
M_DAD(HL);
break;
case 0x2a: I8085_ICount -= 16; /* LHLD nnnn */
I.XX.D = RDOPARG_WORD();
I.HL.B.l = RDMEM(I.XX.D);
I.XX.W.l++;
I.HL.B.h = RDMEM(I.XX.D);
break;
case 0x2b: I8085_ICount -= 6; /* DCX H */
I.HL.W.l--;
break;
case 0x2c: I8085_ICount -= 4; /* INR L */
M_INR(I.HL.B.l);
break;
case 0x2d: I8085_ICount -= 4; /* DCR L */
M_DCR(I.HL.B.l);
break;
case 0x2e: I8085_ICount -= 7; /* MVI L,nn */
M_MVI(I.HL.B.l);
break;
case 0x2f: I8085_ICount -= 4; /* CMA */
I.AF.B.h ^= 0xff;
I.AF.B.l |= HF + NF;
break;
case 0x30: I8085_ICount -= 7; /* SIM */
if ((I.IM ^ I.AF.B.h) & 0x80)
{
if (I.SOD_callback)
(*I.SOD_callback)(I.AF.B.h >> 7);
}
I.IM &= (IM_SID + IM_IEN + IM_TRAP);
I.IM |= (I.AF.B.h & ~(IM_SID + IM_SOD + IM_IEN + IM_TRAP));
if (I.AF.B.h & 0x80)
I.IM |= IM_SOD;
break;
case 0x31: I8085_ICount -= 10; /* LXI SP,nnnn */
I.SP.W.l = RDOPARG_WORD();
break;
case 0x32: I8085_ICount -= 13; /* STAX nnnn */
I.XX.D = RDOPARG_WORD();
WRMEM(I.XX.D, I.AF.B.h);
break;
case 0x33: I8085_ICount -= 6; /* INX SP */
I.SP.W.l++;
break;
case 0x34: I8085_ICount -= 11; /* INR M */
I.XX.B.l = RDMEM(I.HL.D);
M_INR(I.XX.B.l);
WRMEM(I.HL.D, I.XX.B.l);
break;
case 0x35: I8085_ICount -= 11; /* DCR M */
I.XX.B.l = RDMEM(I.HL.D);
M_DCR(I.XX.B.l);
WRMEM(I.HL.D, I.XX.B.l);
break;
case 0x36: I8085_ICount -= 10; /* MVI M,nn */
I.XX.B.l = RDOPARG();
WRMEM(I.HL.D, I.XX.B.l);
break;
case 0x37: I8085_ICount -= 4; /* STC */
I.AF.B.l = (I.AF.B.l & ~(HF + NF)) | CF;
break;
case 0x38: I8085_ICount -= 7; /* ???? */
break;
case 0x39: I8085_ICount -= 11; /* DAD SP */
M_DAD(SP);
break;
case 0x3a: I8085_ICount -= 13; /* LDAX nnnn */
I.XX.D = RDOPARG_WORD();
I.AF.B.h = RDMEM(I.XX.D);
break;
case 0x3b: I8085_ICount -= 6; /* DCX SP */
I.SP.W.l--;
break;
case 0x3c: I8085_ICount -= 4; /* INR A */
M_INR(I.AF.B.h);
break;
case 0x3d: I8085_ICount -= 4; /* DCR A */
M_DCR(I.AF.B.h);
break;
case 0x3e: I8085_ICount -= 7; /* MVI A,nn */
M_MVI(I.AF.B.h);
break;
case 0x3f: I8085_ICount -= 4; /* CMF */
I.AF.B.l = ((I.AF.B.l & ~(HF + NF)) |
((I.AF.B.l & CF) << 4)) ^ CF;
break;
case 0x40: I8085_ICount -= 4; /* MOV B,B */
/* no op */
break;
case 0x41: I8085_ICount -= 4; /* MOV B,C */
I.BC.B.h = I.BC.B.l;
break;
case 0x42: I8085_ICount -= 4; /* MOV B,D */
I.BC.B.h = I.DE.B.h;
break;
case 0x43: I8085_ICount -= 4; /* MOV B,E */
I.BC.B.h = I.DE.B.l;
break;
case 0x44: I8085_ICount -= 4; /* MOV B,H */
I.BC.B.h = I.HL.B.h;
break;
case 0x45: I8085_ICount -= 4; /* MOV B,L */
I.BC.B.h = I.HL.B.l;
break;
case 0x46: I8085_ICount -= 7; /* MOV B,M */
I.BC.B.h = RDMEM(I.HL.D);
break;
case 0x47: I8085_ICount -= 4; /* MOV B,A */
I.BC.B.h = I.AF.B.h;
break;
case 0x48: I8085_ICount -= 4; /* MOV C,B */
I.BC.B.l = I.BC.B.h;
break;
case 0x49: I8085_ICount -= 4; /* MOV C,C */
/* no op */
break;
case 0x4a: I8085_ICount -= 4; /* MOV C,D */
I.BC.B.l = I.DE.B.h;
break;
case 0x4b: I8085_ICount -= 4; /* MOV C,E */
I.BC.B.l = I.DE.B.l;
break;
case 0x4c: I8085_ICount -= 4; /* MOV C,H */
I.BC.B.l = I.HL.B.h;
break;
case 0x4d: I8085_ICount -= 4; /* MOV C,L */
I.BC.B.l = I.HL.B.l;
break;
case 0x4e: I8085_ICount -= 7; /* MOV C,M */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -