コード例 #1
0
ファイル: Cpu.cs プロジェクト: JLF8086/VirtualMachineEmulator
        public void ExecuteCommand(Word word)
        {
            string command = word.Value.Substring(0, 2);
            string operand = "";
            if (word.Value.Length != 3)
            {
                operand = word.Value.Substring(2, word.Value.Length - 2);
            }

            switch (command)
            {
                case "AD":
                    {
                        this.AX = this.AX + this.CX;
                        break;
                    }
                case "SU":
                    {
                        this.AX = this.AX - this.CX;
                        break;
                    }
                case "CM":
                    {
                        if (this.AX > this.CX)
                            this.SF = 0;
                        if (this.AX < this.CX)
                            this.SF = 2;
                        if (Word.HexToInt(this.AX.Value) == Word.HexToInt(this.CX.Value))
                            this.SF = 1;
                        break;
                    }
                case "SA":
                    {
                        this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value = this.AX.Value;
                        break;
                    }
                case "LA":
                    {
                        this.AX.Value = this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value;
                        break;
                    }
                case "SC":
                    {
                        this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value = this.CX.Value;
                        break;
                    }
                case "LC":
                    {
                        this.CX.Value = this.memory[Convert.ToInt32(operand[0].ToString(), 16), Convert.ToInt32(operand[1].ToString(), 16)].Value;
                        break;
                    }
                case "JM":
                    {
                        this.PC = Convert.ToInt16(operand, 16);
                        break;
                    }
                case "JE":
                    {
                        if (this.SF == 1)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "JN":
                    {
                        if (this.SF != 1)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "JA":
                    {
                        if (this.SF == 0)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "JB":
                    {
                        if (this.SF == 2)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "JG":
                    {
                        if (this.SF == 0 || this.SF == 1)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "JL":
                    {
                        if (this.SF == 1 || this.SF == 2)
                            this.PC = Convert.ToInt16(operand, 16);
                        else this.PC++;
                        break;
                    }
                case "GD": //TO DO: everything
                    {
                        //memory.Write(operand);
                        memory.Write(operand, vm.Io.Buffer);
                        vm.Io.Flush();
                        break;
                    }
                case "PD":
                    {
                        string buf = string.Empty;
                        int block = Word.HexToInt(operand[0].ToString());
                        for (int i = 0; i < memory.WordCount; i++)
                        {
                            if (memory[block, i].Value != "----")
                                buf += memory[block, i].Value;
                        }
                        vm.Io.Buffer = buf;
                        vm.Io.WriteBuffer();
                        vm.Io.Flush();
                        break;
                    }
                case "--":
                    {
                        break;
                    }
                case "$E":
                    {

                        break;
                    }
                default:
                    {
                        throw new ArgumentException("Unknown command: " + word.Value);
                    }
            }
        }