コード例 #1
0
 public InstructionFactory()
 {
     _opCodeDecoder    = new OpCodeDecoder();
     _immediateDecoder = new ImmediateDecoder();
     _jumpDecoder      = new JumpDecoder();
     _regimmDecoder    = new RegimmDecoder();
     _registerDecoder  = new RegisterDecoder();
     _mMIDecoder       = new MMIDecoder();
     _cOP0Decoder      = new COP0Decoder();
     _fPUDecoder       = new FPUDecoder();
     _cACHEDecoder     = new CACHEDecoder();
 }
コード例 #2
0
        public void Decode()
        {
            OpCodeDecoder decoder = new OpCodeDecoder();

            this.DisplayState(this.state);

            do
            {
                //Console.WriteLine("Enter to execute next instruction...");
                //Console.ReadLine();

                Console.WriteLine($"Addr\t${this.state.PC:X4} (#{this.state.PC})");

                this.state.FetchOpCode();

                Console.WriteLine($"OpCode\t${this.state.OpCode:X4}");

                Console.WriteLine($"%{this.state.OpCode.ToBinary()}");

                OpCode opcode = decoder.Decode(this.state);

                if (opcode is Invalid)
                {
                    throw new Exception("invalid opcode");
                }

                if (!this.disassembly.ContainsKey(opcode.Address))
                {
                    this.disassembly.Add(opcode.Address, opcode);
                }

                this.DisplayOpCode(opcode);

                this.DisplayState(this.state);
            } while (this.running);

            StringBuilder builder = new StringBuilder();

            for (uint addr = 0x0000; addr < 0xFFFF; addr++)
            {
                builder.Append($"${addr:X4}");
                if (this.disassembly.ContainsKey(addr))
                {
                    builder.Append($"\t{this.disassembly[addr].Assembly}");
                }

                builder.AppendLine();
            }

            File.WriteAllText("output.asm", builder.ToString());
        }