Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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();
        }