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(); }
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()); }