⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i8085.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************
 *
 *      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 + -