示例#1
0
        public override RelocationResults Relocate(Program program, Address addrLoad)
        {
            var    relocations = imgU.Relocations;
            ushort segCode     = (ushort)(addrLoad.Selector.Value + (PspSize >> 4));

            for (;;)
            {
                int relocs = (ushort)bitStm.GetByte();
                if (relocs == 0)
                {
                    break;
                }

                uint relocBase = PspSize + bitStm.GetWord() * 0x10u;
                do
                {
                    ushort relocOff = bitStm.GetWord();
                    ushort seg      = imgU.ReadLeUInt16(relocBase + relocOff);
                    seg = (ushort)(seg + segCode);

                    imgU.WriteLeUInt16(relocBase + relocOff, seg);
                    relocations.AddSegmentReference(relocBase + relocOff, seg);
                    segmentMap.AddSegment(Address.SegPtr(seg, 0), seg.ToString("X4"), AccessMode.ReadWriteExecute, 0);
                } while (--relocs != 0);
            }

            ushort pklSs = (ushort)(bitStm.GetWord() + segCode);
            ushort pklSp = (ushort)bitStm.GetWord();

            pklCs = (ushort)(bitStm.GetWord() + segCode);
            pklIp = bitStm.GetWord();

            var state = arch.CreateProcessorState();

            state.SetRegister(Registers.ds, Constant.Word16(addrLoad.Selector.Value));
            state.SetRegister(Registers.es, Constant.Word16(addrLoad.Selector.Value));
            state.SetRegister(Registers.cs, Constant.Word16(pklCs));
            state.SetRegister(Registers.ax, Constant.Word16(0));
            state.SetRegister(Registers.bx, Constant.Word16(0));
            state.SetRegister(Registers.cx, Constant.Word16(0));
            state.SetRegister(Registers.dx, Constant.Word16(0));
            state.SetRegister(Registers.bp, Constant.Word16(0));
            state.SetRegister(Registers.sp, Constant.Word16(pklSp));
            state.SetRegister(Registers.si, Constant.Word16(0));
            state.SetRegister(Registers.di, Constant.Word16(0));

            var sym = new ImageSymbol(Address.SegPtr(pklCs, pklIp))
            {
                Type           = SymbolType.Procedure,
                ProcessorState = state
            };

            return(new RelocationResults(
                       new List <ImageSymbol> {
                sym
            },
                       new SortedList <Address, ImageSymbol> {
                { sym.Address, sym }
            }));
        }
示例#2
0
        public override RelocationResults Relocate(Address addrLoad)
        {
            var    relocations = new RelocationDictionary();
            ushort segCode     = (ushort)(addrLoad.Selector + (PspSize >> 4));

            for (;;)
            {
                int relocs = (ushort)bitStm.GetByte();
                if (relocs == 0)
                {
                    break;
                }

                uint relocBase = PspSize + bitStm.GetWord() * 0x10u;
                do
                {
                    ushort relocOff = bitStm.GetWord();
                    ushort seg      = imgU.ReadLeUInt16(relocBase + relocOff);
                    seg = (ushort)(seg + segCode);

                    imgU.WriteLeUInt16(relocBase + relocOff, seg);
                    relocations.AddSegmentReference(relocBase + relocOff, seg);
                    imageMap.AddSegment(Address.SegPtr(seg, 0), seg.ToString("X4"), AccessMode.ReadWriteExecute);
                } while (--relocs != 0);
            }

            ushort pklSs = (ushort)(bitStm.GetWord() + segCode);
            ushort pklSp = (ushort)bitStm.GetWord();

            pklCs = (ushort)(bitStm.GetWord() + segCode);
            pklIp = bitStm.GetWord();

            var state = arch.CreateProcessorState();

            state.SetRegister(Registers.ds, Constant.Word16(addrLoad.Selector));
            state.SetRegister(Registers.es, Constant.Word16(addrLoad.Selector));
            state.SetRegister(Registers.cs, Constant.Word16(pklCs));
            state.SetRegister(Registers.ax, Constant.Word16(0));
            state.SetRegister(Registers.bx, Constant.Word16(0));
            state.SetRegister(Registers.cx, Constant.Word16(0));
            state.SetRegister(Registers.dx, Constant.Word16(0));
            state.SetRegister(Registers.bp, Constant.Word16(0));
            state.SetRegister(Registers.sp, Constant.Word16(pklSp));
            state.SetRegister(Registers.si, Constant.Word16(0));
            state.SetRegister(Registers.di, Constant.Word16(0));

            return(new RelocationResults(
                       new List <EntryPoint> {
                new EntryPoint(Address.SegPtr(pklCs, pklIp), state)
            },
                       relocations));
        }
示例#3
0
        public ProcessorState Relocate(Program program, Address addrLoad)
        {
            var    relocations = imgU.Relocations;
            ushort segCode     = (ushort)(addrLoad.Selector !.Value + (PspSize >> 4));

            for (;;)
            {
                int relocs = (ushort)bitStm.GetByte();
                if (relocs == 0)
                {
                    break;
                }

                uint relocBase = PspSize + bitStm.GetWord() * 0x10u;
                do
                {
                    ushort relocOff = bitStm.GetWord();
                    ushort seg      = imgU.ReadLeUInt16(relocBase + relocOff);
                    seg = (ushort)(seg + segCode);

                    imgU.WriteLeUInt16(relocBase + relocOff, seg);
                    relocations.AddSegmentReference(relocBase + relocOff, seg);
                    segmentMap.AddOverlappingSegment(seg.ToString("X4"), imgU, Address.SegPtr(seg, 0), AccessMode.ReadWriteExecute);
                } while (--relocs != 0);
            }

            ushort pklSs = (ushort)(bitStm.GetWord() + segCode);
            ushort pklSp = (ushort)bitStm.GetWord();

            pklCs = (ushort)(bitStm.GetWord() + segCode);
            pklIp = bitStm.GetWord();

            var state = arch.CreateProcessorState();

            state.SetRegister(Registers.ds, Constant.Word16(addrLoad.Selector.Value));
            state.SetRegister(Registers.es, Constant.Word16(addrLoad.Selector.Value));
            state.SetRegister(Registers.cs, Constant.Word16(pklCs));
            state.SetRegister(Registers.ax, Constant.Word16(0));
            state.SetRegister(Registers.bx, Constant.Word16(0));
            state.SetRegister(Registers.cx, Constant.Word16(0));
            state.SetRegister(Registers.dx, Constant.Word16(0));
            state.SetRegister(Registers.bp, Constant.Word16(0));
            state.SetRegister(Registers.sp, Constant.Word16(pklSp));
            state.SetRegister(Registers.si, Constant.Word16(0));
            state.SetRegister(Registers.di, Constant.Word16(0));
            return(state);
        }