private void EmitOpcodes() { bool end = false; ushort funcAddr = (ushort)CurrentAddress; if (funcAddr == m_DebugAddress && m_DebugDMA) { EimtMemoryDebug(true); } do { UpdateLocalOffsetBase(); SaveCurrentAddress(); CdpInstruction inst = GetInstruction((ushort)(CurrentAddress++)); try { C1802OpCodes opcode = (C1802OpCodes)inst.Hi; WriteDebug("\n1802 Opcode: " + opcode.ToString() + "(" + inst.Data.ToString("X2") + ")"); MarkLabel(); switch (opcode) { // All called routines must end with SEP pointing to R4! case C1802OpCodes.SEP: { if (inst.Low == 4) { end = true; break; } else { WriteDebug(" : Warning: code doesn't point to r4, value: " + inst.Low.ToString("X1") + "\n"); break; } } case C1802OpCodes.GLO: Emit_GLO(inst); break; case C1802OpCodes.SEX: Emit_SEX(inst); break; case C1802OpCodes.STR: Emit_STR(inst); break; case C1802OpCodes.LDA: Emit_LDA(inst); break; case C1802OpCodes.Sub15: EmitSubOpcodes15(inst); break; case C1802OpCodes.Sub0: EmitSubOpcodes0(inst); break; case C1802OpCodes.Sub7: EmitSubOpcodes7(inst); break; case C1802OpCodes.Sub3: EmitSubOpcodes3(inst); break; case C1802OpCodes.PLO: Emit_PLO(inst); break; case C1802OpCodes.INC: Emit_INC(inst); break; case C1802OpCodes.GHI: Emit_GHI(inst); break; case C1802OpCodes.PHI: Emit_PHI(inst); break; case C1802OpCodes.DEC: Emit_DEC(inst); break; default: EmitNop(); WriteDebug(" ...No Emit!"); break; } if (funcAddr == m_DebugAddress && m_DebugRegs) { EmitDumpRegsCall(); } } catch (ArgumentException) { end = true; continue; } }while (!end); if (funcAddr == m_DebugAddress && m_DebugDMA) { EimtMemoryDebug(false); } }
private static void EmitOpcodes() { bool end = false; s_Labels = new Dictionary <ushort, Label>(); ushort funcAddr = s_CurrentAddress; do { s_LocalOffset = s_LocalCount; s_LastAddress = s_CurrentAddress; CdpInstruction inst = GetInstruction(s_CurrentAddress++); try { C1802OpCodes opcode = (C1802OpCodes)inst.Hi; Console.Write("1802 Opcode: " + opcode.ToString()); Label lb = s_ILGen.DefineLabel(); s_ILGen.MarkLabel(lb); s_Labels.Add(s_LastAddress, lb); switch (opcode) { case C1802OpCodes.GLO: Emit_GLO(inst); break; case C1802OpCodes.SEX: Emit_SEX(inst); break; case C1802OpCodes.STR: Emit_STR(inst); break; case C1802OpCodes.SEP: end = true; break; case C1802OpCodes.LDA: Emit_LDA(inst); break; case C1802OpCodes.Sub15: EmitSubOpcodes15(inst); break; case C1802OpCodes.Sub0: EmitSubOpcodes0(inst); break; case C1802OpCodes.Sub7: EmitSubOpcodes7(inst); break; case C1802OpCodes.Sub3: EmitSubOpcodes3(inst); break; case C1802OpCodes.PLO: Emit_PLO(inst); break; case C1802OpCodes.INC: Emit_INC(inst); break; case C1802OpCodes.GHI: Emit_GHI(inst); break; case C1802OpCodes.PHI: Emit_PHI(inst); break; case C1802OpCodes.DEC: Emit_DEC(inst); break; default: EmitNop(); Console.Write(" ...No Emit!"); break; } Console.WriteLine(""); //if (funcAddr == 0x3f3) // EmitDumpRegsCall(); } catch (ArgumentException) { end = true; continue; } }while (!end); s_Labels.Clear(); }