Esempio n. 1
0
    public void GetDataSource(Register register, VirtualMemory memory, ref int returnVal, Error error)
    {
        switch (mode)
        {
        case CPUMode.RegisterOnly:
        case CPUMode.RegisterToMemory:
        case CPUMode.RegisterToRegister:
            switch (destRegister)
            {
            case RegisterIndex.ax:
                returnVal = register.ax;
                break;

            case RegisterIndex.bx:
                returnVal = register.bx;
                break;

            case RegisterIndex.cx:
                returnVal = register.cx;
                break;

            case RegisterIndex.dx:
                returnVal = register.dx;
                break;

            case RegisterIndex.si:
                returnVal = register.si;
                break;

            case RegisterIndex.di:
                returnVal = register.di;
                break;

            case RegisterIndex.bp:
                returnVal = register.bp;
                break;

            case RegisterIndex.sp:
                returnVal = register.sp;
                break;

            case RegisterIndex.ip:
                returnVal = register.ip;
                break;

            default:
                error.cpuError = CPUError.NotDefinedRegisterError;
                break;
            }
            break;

        case CPUMode.MemoryToRegister:
        case CPUMode.MemoryToMemory:
        case CPUMode.MemoryOnly:
            if (isSourceMemoryIndexIsRegister || isDestMemoryIndexIsRegister)
            {
                switch (sourceRegister)
                {
                case RegisterIndex.ax:
                    sourceMemoryIndex = register.ax;
                    break;

                case RegisterIndex.bx:
                    sourceMemoryIndex = register.bx;
                    break;

                case RegisterIndex.cx:
                    sourceMemoryIndex = register.cx;
                    break;

                case RegisterIndex.dx:
                    sourceMemoryIndex = register.dx;
                    break;

                case RegisterIndex.si:
                    sourceMemoryIndex = register.si;
                    break;

                case RegisterIndex.di:
                    sourceMemoryIndex = register.di;
                    break;

                case RegisterIndex.bp:
                    sourceMemoryIndex = register.bp;
                    break;

                case RegisterIndex.sp:
                    sourceMemoryIndex = register.sp;
                    break;

                case RegisterIndex.ip:
                    sourceMemoryIndex = register.ip;
                    break;

                default:
                    error.cpuError = CPUError.NotDefinedRegisterError;
                    break;
                }
            }

            returnVal = memory.GetData(sourceMemoryIndex, error);
            break;

        case CPUMode.NumberToMemory:
        case CPUMode.NumberToRegister:
        case CPUMode.NumberOnly:
            returnVal = value;
            break;

        default:
            returnVal      = -1;
            error.cpuError = CPUError.NotDefinedRegisterError;
            break;
        }
    }
Esempio n. 2
0
    public void InstructionPerClock()
    {
        int source = 1, dest = 1, result = 1;

        if (machineCodes == null)
        {
            Debug.Log("CPU Error");
            error.cpuError = CPUError.NotDefinedMachineCode;
            return;
        }

        if (machineCodes.Count <= register.ip)
        {
            Debug.Log("CPU Error");
            error.cpuError = CPUError.IndexOutOfRangeFromInstructions;
            isRun          = false;
            return;
        }

        //fetch Machine Code
        currentCode  = machineCodes[register.ip];
        register.ip += 1;

        Debug.Log("-----------------------");
        Debug.Log("Instruction:" + currentCode.instruction + " Mode:" + currentCode.mode);
        Debug.Log("AX:" + register.ax + " BX:" + register.bx);
        Debug.Log("SP:" + register.sp + " IP:" + register.ip);

        //decoding the instructions and execute
        switch (currentCode.instruction)
        {
        case Instructions.MOV:
            GetDataSource(ref source);
            SetData(source);
            break;

        case Instructions.PUSH:
            memory.SetData(register.sp, currentCode.value, error);
            register.sp += 1;
            break;

        case Instructions.POP:
            result = memory.GetData(register.sp, error);
            SetData(result);
            register.sp--;
            break;

        case Instructions.INC:
            GetDataDest(ref source);
            result = source + 1;
            SetData(result);
            break;

        case Instructions.DEC:
            GetDataDest(ref source);
            result = source - 1;
            SetData(result);
            break;

        case Instructions.ADD:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source + dest;
            SetData(result);
            break;

        case Instructions.SUB:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            source = -source;
            result = source + dest;
            SetData(result);
            break;

        case Instructions.MUL:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source * dest;
            SetData(result);
            break;

        case Instructions.XOR:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source ^ dest;
            SetData(result);
            break;

        case Instructions.OR:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source | dest;
            SetData(result);
            break;

        case Instructions.AND:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source & dest;
            SetData(result);
            break;

        case Instructions.SAL:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source << dest;
            SetData(result);
            break;

        case Instructions.SAR:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source >> dest;
            SetData(result);
            break;

        case Instructions.CMP:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            source = -source;
            result = source + dest;
            break;

        case Instructions.TEST:
            GetDataSource(ref source);
            GetDataDest(ref dest);
            result = source & dest;
            break;

        case Instructions.JMP:
            GetDataSource(ref result);
            register.ip = result;
            break;

        case Instructions.JE:
            if (register.zf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JNE:
            if (!register.zf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JS:
            if (register.sf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JNS:
            if (!register.sf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JG:
            if (!(register.sf ^ register.of) & !register.zf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JGE:
            if (!(register.sf ^ register.of))
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JL:
            if (register.sf ^ register.of)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.JLE:
            if ((register.sf ^ register.of) | register.zf)
            {
                GetDataSource(ref result);
                register.ip = result;
            }
            break;

        case Instructions.END:
            isRun = false;
            break;

        default:
            error.cpuError = CPUError.NotDefinedMachineCode;
            isRun          = false;
            break;
        }

        register.SetCarryFlag(result, dest, source);
    }
Esempio n. 3
0
 public int AccessMemory(int index)
 {
     return(memory.GetData(index, error));
 }