Beispiel #1
0
        public void CreateGDT()
        {
            new Comment(this, "BEGIN - Create GDT");
            var xGDT = new List <byte>();

            // Null Segment - Selector 0x00
            // Not used, but required by many emulators.
            xGDT.AddRange(new byte[8]
            {
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
            });

            // Code Segment
            mGdCode = (byte)xGDT.Count;
            xGDT.AddRange(GdtDescriptor(0x00000000, 0xFFFFFFFF, true));

            // Data Segment - Selector
            mGdData = (byte)xGDT.Count;
            xGDT.AddRange(GdtDescriptor(0x00000000, 0xFFFFFFFF, false));
            DataMembers.Add(new DataMember("_NATIVE_GDT_Contents", xGDT.ToArray()));

            XS.Comment("Tell CPU about GDT");
            var xGdtPtr = new UInt16[3];

            // Size of GDT Table - 1
            xGdtPtr[0] = (UInt16)(xGDT.Count - 1);
            DataMembers.Add(new DataMember("_NATIVE_GDT_Pointer", xGdtPtr));
            new Mov
            {
                DestinationRef          = ElementReference.New("_NATIVE_GDT_Pointer"),
                DestinationIsIndirect   = true,
                DestinationDisplacement = 2,
                SourceRef = ElementReference.New("_NATIVE_GDT_Contents")
            };
            XS.Set(XSRegisters.EAX, "_NATIVE_GDT_Pointer");
            XS.LoadGdt(XSRegisters.EAX, isIndirect: true);

            XS.Comment("Set data segments");
            XS.Set(XSRegisters.EAX, mGdData);
            XS.Set(XSRegisters.DS, XSRegisters.AX);
            XS.Set(XSRegisters.ES, XSRegisters.AX);
            XS.Set(XSRegisters.FS, XSRegisters.AX);
            XS.Set(XSRegisters.GS, XSRegisters.AX);
            XS.Set(XSRegisters.SS, XSRegisters.AX);

            XS.Comment("Force reload of code segment");
            new JumpToSegment
            {
                Segment          = mGdCode,
                DestinationLabel = "Boot_FlushCsGDT"
            };
            XS.Label("Boot_FlushCsGDT");
            new Comment(this, "END - Create GDT");
        }
Beispiel #2
0
 public override void AssembleNew(Assembler aAssembler, object aMethodInfo)
 {
     XS.ClearInterruptFlag();
     XS.Set(XSRegisters.EAX, "_NATIVE_GDT_Pointer");
     XS.LoadGdt(XSRegisters.EAX, isIndirect: true);
     XS.Set(XSRegisters.EAX, XSRegisters.CR0);
     XS.Or(XSRegisters.AL, 1);
     XS.Set(XSRegisters.CR0, XSRegisters.EAX);
     XS.JumpToSegment(0x08, "PMode");
     XS.Label("PMode");
 }