Exemple #1
0
        public MemoryAllocator()
        {
            _buffer = new byte[32 * 1024];

            var wholeBufferRegion = new BufferRegion(_buffer, regionLength: _buffer.Length, regionStart: 0);

            var(firtsFreeBlockReferenceHolder, initialFreeBlock) = wholeBufferRegion.Split(sizeof(short));

            var theOnlyFreeBlock = AllocationBlock.SetupBlock(initialFreeBlock, true);

            new FreeBlock(theOnlyFreeBlock).NextFreeBlockReference.Reset();

            _referenceToFirstFreeBlock = new MemoryReference(firtsFreeBlockReferenceHolder);
            _referenceToFirstFreeBlock.Set(theOnlyFreeBlock);
        }
        private int DrawMethod(Graphics g, MethodBody body, List <Line> lines, int x, int y, int lineOffset, int maxLines)
        {
            int addressx = x + _gutterWidth + 1;
            int codex    = addressx + _addressWidth + 1 + 6;
            int opcodex  = codex + _labelWidth / 3 + 6;
            int operandx = opcodex + _opcodeWidth;
            int refx     = 300;

            Brush codeBrush    = this.Enabled ? _instrFontBrush : _disabledFontBrush;
            Brush addressBrush = this.Enabled ? _addressFontBrush : _disabledFontBrush;

            // -- lines --
            for (int n = lineOffset; n < lines.Count; n++)
            {
                Line        line  = lines[n];
                Instruction instr = line.Instruction;

                if (body.UserTop + n == _highlightedLine)
                {
                    g.FillRectangle(SystemBrushes.GradientInactiveCaption, codex, y, this.ClientRectangle.Width - codex - 5, _lineHeight + 2);
                }

                switch (line.Type)
                {
                case LineType.Header:
                {
                    string fullName = string.Format("// {0}::{1}", body.Module.Name, body.Name);
                    g.DrawString(fullName, _font, _commentFontBrush, codex, y);
                    g.DrawLine(_commentLinePen, codex + (_charSize.Width * (fullName.Length + 1)), y + (_charSize.Height / 2.0f), this.ClientRectangle.Width - 10, y + (_charSize.Height / 2.0f));
                }
                break;

                case LineType.Footer:
                {
                }
                break;

                case LineType.Label:
                {
                    g.DrawString(instr.Label.Name + ":", _font, _labelFontBrush, codex, y, _stringFormat);
                }
                break;

                case LineType.Instruction:
                {
                    // Gutter
                    if (instr.Breakpoint != null)
                    {
                        Image icon = (instr.Breakpoint.Enabled == true) ? _breakpointOnIcon : _breakpointOffIcon;
                        g.DrawImage(icon, x + 2, y, 15, 15);
                    }
                    if ((_debugger.State != DebuggerState.Running) && (_debugger.PC == instr.Address))
                    {
                        g.DrawImage(_statementIcon, x + 3, y, 14, 15);
                    }

                    // Address
                    g.DrawString(string.Format("{0:X8}", instr.Address), _font, addressBrush, addressx + 6, y, _stringFormat);

                    // Instruction
                    int realx = operandx;
                    if (instr.Code == 0x0)
                    {
                        g.DrawString("nop", _font, _disabledFontBrush, opcodex, y, _stringFormat);
                    }
                    else
                    {
                        if (instr.Opcode == null)
                        {
                            g.DrawString("UNKNOWN", _font, codeBrush, opcodex, y, _stringFormat);
                        }
                        else
                        {
                            g.DrawString(instr.Opcode.ToString(), _font, codeBrush, opcodex, y, _stringFormat);

                            // Operands
                            for (int m = 0; m < instr.Operands.Length; m++)
                            {
                                Operand op        = instr.Operands[m];
                                string  resolved  = instr.GetResolvedOperandString(op, this.UseHex);
                                Brush   fontBrush = codeBrush;
                                switch (op.Type)
                                {
                                case OperandType.BranchTarget:
                                    fontBrush = _referenceFontBrush;
                                    break;

                                case OperandType.JumpTarget:
                                    fontBrush = _referenceFontBrush;
                                    break;
                                }
                                g.DrawString(resolved, _font, fontBrush, realx, y, _stringFormat);
                                realx += ( int )_charSize.Width * resolved.Length;

                                bool last = (m == instr.Operands.Length - 1);
                                if (last == false)
                                {
                                    g.DrawString(", ", _font, codeBrush, realx - 2, y, _stringFormat);
                                    realx += ( int )_charSize.Width * 2 - 2;
                                }
                            }
                        }
                    }

                    MemoryReference memRef = instr.Reference as MemoryReference;
                    if (memRef != null)
                    {
                        Variable var = _debugger.DebugHost.Database.FindSymbol(memRef.Address) as Variable;
                        string   name;
                        if ((var != null) && (var.Name != null))
                        {
                            name = var.Name;
                        }
                        else
                        {
                            name = memRef.Address.ToString("X8");
                        }
                        g.DrawString(name, _font, _referenceFontBrush, refx, y, _stringFormat);
                    }

                    // Annotations
                    //if( instr.Annotation != null )
                    //	g.DrawString( instr.Annotation, _font, _referenceFontBrush, realx + 10, y, _stringFormat );

                    // Comments
                    // TODO _commentFontBrush
                }
                break;
                }

                y += _lineHeight;

                maxLines--;
                if (maxLines == 0)
                {
                    break;
                }
            }

            return(y);
        }