From a3026b2aedd5b8b927dec139fcc4ba9972b7f655 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Sun, 5 Jul 2020 00:47:15 +0200 Subject: [PATCH 1/7] add Multiboot and VBE structs --- source/Cosmos.Core/Bootstrap.cs | 10 +- .../Multiboot/GetMultibootAddress.cs | 17 ++ source/Cosmos.Core/Multiboot/Multiboot.cs | 163 ++++++++++++++++++ 3 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 source/Cosmos.Core/Multiboot/GetMultibootAddress.cs create mode 100644 source/Cosmos.Core/Multiboot/Multiboot.cs diff --git a/source/Cosmos.Core/Bootstrap.cs b/source/Cosmos.Core/Bootstrap.cs index 09fd9a5e1..2d968e662 100644 --- a/source/Cosmos.Core/Bootstrap.cs +++ b/source/Cosmos.Core/Bootstrap.cs @@ -1,6 +1,8 @@ -namespace Cosmos.Core +using static Cosmos.Core.Multiboot.MultiBoot; + +namespace Cosmos.Core { - public static class Bootstrap + public unsafe static class Bootstrap { // See note in Global - these are a "hack" for now so // we dont force static init of Global, and it "pulls" these later till @@ -9,6 +11,8 @@ // Has to be static for now, ZeroFill gets called before the Init. static public readonly CPU CPU = new CPU(); + static public MemoryBlock header; + // Bootstrap is a class designed only to get the essentials done. // ie the stuff needed to "pre boot". Do only the very minimal here. // IDT, PIC, and Float @@ -32,6 +36,8 @@ */ CPU.InitFloat(); + header = new MemoryBlock(Multiboot.GetMBI.GetMBIAddress(), (uint)sizeof(Header)); + // Managed_Memory_System.ManagedMemory.Initialize(); // Managed_Memory_System.ManagedMemory.SetUpMemoryArea(); } diff --git a/source/Cosmos.Core/Multiboot/GetMultibootAddress.cs b/source/Cosmos.Core/Multiboot/GetMultibootAddress.cs new file mode 100644 index 000000000..ce7845cd6 --- /dev/null +++ b/source/Cosmos.Core/Multiboot/GetMultibootAddress.cs @@ -0,0 +1,17 @@ +using IL2CPU.API.Attribs; +using XSharp.Assembler; +using CPUx86 = XSharp.Assembler.x86; + +namespace Cosmos.Core.Multiboot +{ + public class GetMBI : AssemblerMethod + { + public override void AssembleNew(Assembler aAssembler, object aMethodInfo) + { + new CPUx86.Push { DestinationRef = ElementReference.New("MultiBootInfo_Structure"), DestinationIsIndirect = true }; + } + + [PlugMethod(Assembler = typeof(GetMBI))] + public static uint GetMBIAddress() { return 0; } + } +} diff --git a/source/Cosmos.Core/Multiboot/Multiboot.cs b/source/Cosmos.Core/Multiboot/Multiboot.cs new file mode 100644 index 000000000..59eed0026 --- /dev/null +++ b/source/Cosmos.Core/Multiboot/Multiboot.cs @@ -0,0 +1,163 @@ +/* +* PROJECT: Aura Operating System Development +* CONTENT: Multiboot struct +* PROGRAMMERS: Valentin Charbonnier +* https://www.gnu.org/software/grub/manual/multiboot/multiboot.html +* https://wiki.osdev.org/User:Omarrx024/VESA_Tutorial +* http://www.phatcode.net/res/221/files/vbe20.pdf +*/ + +using System; +using System.Runtime.InteropServices; + +namespace Cosmos.Core.Multiboot +{ + public static class MultiBoot + { + [StructLayout(LayoutKind.Explicit, Size = 88)] + public unsafe struct Header + { + [FieldOffset(0)] + public uint Flags; + [FieldOffset(4)] + public uint mem_lower; + [FieldOffset(8)] + public uint mem_upper; + [FieldOffset(12)] + public uint boot_device; + [FieldOffset(16)] + public uint cmdline; + [FieldOffset(20)] + public uint mods_count; + [FieldOffset(24)] + public uint mods_addr; + [FieldOffset(28)] + public fixed uint syms[4]; + [FieldOffset(44)] + public uint memMapLength; + [FieldOffset(48)] + public uint memMapAddress; + [FieldOffset(52)] + public uint drivesLength; + [FieldOffset(56)] + public uint drivesAddress; + [FieldOffset(60)] + public uint configTable; + [FieldOffset(68)] + public uint apmTable; + [FieldOffset(72)] + public uint vbeControlInfo; + [FieldOffset(76)] + public uint vbeModeInfo; + [FieldOffset(80)] + public uint vbeMode; + [FieldOffset(82)] + public uint vbeInterfaceSeg; + [FieldOffset(84)] + public uint vbeInterfaceOff; + [FieldOffset(86)] + public uint vbeInterfaceLength; + } + } + + public unsafe static class VBE + { + + [StructLayout(LayoutKind.Explicit, Size = 36)] + public struct ControllerInfo + { + [FieldOffset(0)] + public uint vbeSignature; + [FieldOffset(4)] + public ushort vbeVersion; + [FieldOffset(6)] + public uint oemStringPtr; + [FieldOffset(10)] + public uint capabilities; + [FieldOffset(14)] + public uint videoModePtr; + [FieldOffset(18)] + public ushort totalmemory; + [FieldOffset(20)] + + public ushort oemSoftwareRev; + [FieldOffset(24)] + public uint oemVendorNamePtr; + [FieldOffset(28)] + public uint oemProductNamePtr; + [FieldOffset(32)] + public uint oemProductRevPtr; + } + + [StructLayout(LayoutKind.Explicit, Size = 256)] + public struct ModeInfo + { + [FieldOffset(0)] + public ushort attributes; // deprecated, only bit 7 should be of interest to you, and it indicates the mode supports a linear frame buffer. + [FieldOffset(2)] + public byte window_a; // deprecated + [FieldOffset(3)] + public byte window_b; // deprecated + [FieldOffset(4)] + public ushort granularity; // deprecated; used while calculating bank numbers + [FieldOffset(6)] + public ushort window_size; + [FieldOffset(8)] + public ushort segment_a; + [FieldOffset(10)] + public ushort segment_b; + [FieldOffset(12)] + public uint win_func_ptr; // deprecated; used to switch banks from protected mode without returning to real mode + [FieldOffset(16)] + public ushort pitch; // number of bytes per horizontal line + [FieldOffset(18)] + public ushort width; // width in pixels + [FieldOffset(20)] + public ushort height; // height in pixels + [FieldOffset(22)] + public byte w_char; // unused... + [FieldOffset(23)] + public byte y_char; // ... + [FieldOffset(24)] + public byte planes; + [FieldOffset(25)] + public byte bpp; // bits per pixel in this mode + [FieldOffset(26)] + public byte banks; // deprecated; total number of banks in this mode + [FieldOffset(27)] + public byte memory_model; + [FieldOffset(28)] + public byte bank_size; // deprecated; size of a bank, almost always 64 KB but may be 16 KB... + [FieldOffset(29)] + public byte image_pages; + [FieldOffset(30)] + public byte reserved0; + [FieldOffset(31)] + public byte red_mask; + [FieldOffset(32)] + public byte red_position; + [FieldOffset(33)] + public byte green_mask; + [FieldOffset(34)] + public byte green_position; + [FieldOffset(35)] + public byte blue_mask; + [FieldOffset(36)] + public byte blue_position; + [FieldOffset(37)] + public byte reserved_mask; + [FieldOffset(38)] + public byte reserved_position; + [FieldOffset(39)] + public byte direct_color_attributes; + [FieldOffset(40)] + public uint framebuffer; // physical address of the linear frame buffer; write here to draw to the screen + [FieldOffset(44)] + public uint off_screen_mem_off; + [FieldOffset(48)] + public ushort off_screen_mem_size; // size of memory in the framebuffer but not being displayed on the screen + [FieldOffset(50)] + public fixed byte reserved1[206]; + } + } +} From f20d7f3930179063a2f031545cf0df69830cc8c6 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 04:10:20 +0200 Subject: [PATCH 2/7] move GetMBIAddress to Cosmos.Core_Asm + get pointers of VBE modeinfo and controllerinfo from multiboot --- source/Cosmos.Core/BaseIOGroups.cs | 2 +- source/Cosmos.Core/Bootstrap.cs | 14 +++++++---- source/Cosmos.Core/IOGroup/VBE.cs | 2 +- .../Cosmos.Core/{Multiboot => }/Multiboot.cs | 23 ++++++++++--------- .../Multiboot/MultibootAsm.cs} | 11 ++++----- source/Cosmos.Core_Asm/MultibootImpl.cs | 12 ++++++++++ source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs | 2 +- 7 files changed, 40 insertions(+), 26 deletions(-) rename source/Cosmos.Core/{Multiboot => }/Multiboot.cs (92%) rename source/{Cosmos.Core/Multiboot/GetMultibootAddress.cs => Cosmos.Core_Asm/Multiboot/MultibootAsm.cs} (54%) create mode 100644 source/Cosmos.Core_Asm/MultibootImpl.cs diff --git a/source/Cosmos.Core/BaseIOGroups.cs b/source/Cosmos.Core/BaseIOGroups.cs index 23b989644..d4d4ecd93 100644 --- a/source/Cosmos.Core/BaseIOGroups.cs +++ b/source/Cosmos.Core/BaseIOGroups.cs @@ -43,6 +43,6 @@ namespace Cosmos.Core { /// /// VBE. /// - public readonly IOGroup.VBE VBE = new IOGroup.VBE(); + public readonly IOGroup.VBEIOGroup VBE = new IOGroup.VBEIOGroup(); } } diff --git a/source/Cosmos.Core/Bootstrap.cs b/source/Cosmos.Core/Bootstrap.cs index 2d968e662..270d62146 100644 --- a/source/Cosmos.Core/Bootstrap.cs +++ b/source/Cosmos.Core/Bootstrap.cs @@ -1,6 +1,4 @@ -using static Cosmos.Core.Multiboot.MultiBoot; - -namespace Cosmos.Core +namespace Cosmos.Core { public unsafe static class Bootstrap { @@ -11,7 +9,10 @@ namespace Cosmos.Core // Has to be static for now, ZeroFill gets called before the Init. static public readonly CPU CPU = new CPU(); - static public MemoryBlock header; + public static Multiboot.Header* header; + + public static VBE.ModeInfo* modeinfo; + public static VBE.ControllerInfo* controllerinfo; // Bootstrap is a class designed only to get the essentials done. // ie the stuff needed to "pre boot". Do only the very minimal here. @@ -36,7 +37,10 @@ namespace Cosmos.Core */ CPU.InitFloat(); - header = new MemoryBlock(Multiboot.GetMBI.GetMBIAddress(), (uint)sizeof(Header)); + header = (Multiboot.Header*)Multiboot.GetMBIAddress(); + + modeinfo = (Core.VBE.ModeInfo*)header->vbeModeInfo; + controllerinfo = (Core.VBE.ControllerInfo*)header->vbeControlInfo; // Managed_Memory_System.ManagedMemory.Initialize(); // Managed_Memory_System.ManagedMemory.SetUpMemoryArea(); diff --git a/source/Cosmos.Core/IOGroup/VBE.cs b/source/Cosmos.Core/IOGroup/VBE.cs index 63b671ce2..17ed31685 100644 --- a/source/Cosmos.Core/IOGroup/VBE.cs +++ b/source/Cosmos.Core/IOGroup/VBE.cs @@ -10,7 +10,7 @@ namespace Cosmos.Core.IOGroup /// /// VBE class. /// - public class VBE : IOGroup + public class VBEIOGroup : IOGroup { /// /// Index IOPort. diff --git a/source/Cosmos.Core/Multiboot/Multiboot.cs b/source/Cosmos.Core/Multiboot.cs similarity index 92% rename from source/Cosmos.Core/Multiboot/Multiboot.cs rename to source/Cosmos.Core/Multiboot.cs index 59eed0026..bb61cbf04 100644 --- a/source/Cosmos.Core/Multiboot/Multiboot.cs +++ b/source/Cosmos.Core/Multiboot.cs @@ -1,19 +1,20 @@ -/* -* PROJECT: Aura Operating System Development -* CONTENT: Multiboot struct -* PROGRAMMERS: Valentin Charbonnier -* https://www.gnu.org/software/grub/manual/multiboot/multiboot.html -* https://wiki.osdev.org/User:Omarrx024/VESA_Tutorial -* http://www.phatcode.net/res/221/files/vbe20.pdf -*/ - +using IL2CPU.API.Attribs; using System; using System.Runtime.InteropServices; -namespace Cosmos.Core.Multiboot +namespace Cosmos.Core { - public static class MultiBoot + /// + /// Used for Multiboot parsing + /// + public class Multiboot { + /// + /// Get Multiboot address. Plugged. + /// + [PlugMethod(PlugRequired = true)] + public static uint GetMBIAddress() => throw null; + [StructLayout(LayoutKind.Explicit, Size = 88)] public unsafe struct Header { diff --git a/source/Cosmos.Core/Multiboot/GetMultibootAddress.cs b/source/Cosmos.Core_Asm/Multiboot/MultibootAsm.cs similarity index 54% rename from source/Cosmos.Core/Multiboot/GetMultibootAddress.cs rename to source/Cosmos.Core_Asm/Multiboot/MultibootAsm.cs index ce7845cd6..f77597cf4 100644 --- a/source/Cosmos.Core/Multiboot/GetMultibootAddress.cs +++ b/source/Cosmos.Core_Asm/Multiboot/MultibootAsm.cs @@ -1,17 +1,14 @@ -using IL2CPU.API.Attribs; -using XSharp.Assembler; +using XSharp.Assembler; +using XSharp; using CPUx86 = XSharp.Assembler.x86; -namespace Cosmos.Core.Multiboot +namespace Cosmos.Core_Asm { - public class GetMBI : AssemblerMethod + public class MultibootAsm : AssemblerMethod { public override void AssembleNew(Assembler aAssembler, object aMethodInfo) { new CPUx86.Push { DestinationRef = ElementReference.New("MultiBootInfo_Structure"), DestinationIsIndirect = true }; } - - [PlugMethod(Assembler = typeof(GetMBI))] - public static uint GetMBIAddress() { return 0; } } } diff --git a/source/Cosmos.Core_Asm/MultibootImpl.cs b/source/Cosmos.Core_Asm/MultibootImpl.cs new file mode 100644 index 000000000..d3c9226ac --- /dev/null +++ b/source/Cosmos.Core_Asm/MultibootImpl.cs @@ -0,0 +1,12 @@ +using Cosmos.Core; +using IL2CPU.API.Attribs; + +namespace Cosmos.Core_Asm +{ + [Plug(Target = typeof(Multiboot))] + public class MultibootImpl + { + [PlugMethod(Assembler = typeof(MultibootAsm))] + public static uint GetMBIAddress() => throw null; + } +} diff --git a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs index d4491d9fa..1f42a3b53 100644 --- a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs +++ b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs @@ -12,7 +12,7 @@ namespace Cosmos.HAL.Drivers public class VBEDriver { - private static readonly VBE IO = Core.Global.BaseIOGroups.VBE; + private static readonly VBEIOGroup IO = Core.Global.BaseIOGroups.VBE; ManagedMemoryBlock lastbuffer; /// From cf019fef472ea52d5342a9ea35f23d3c6f1b438f Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 05:31:17 +0200 Subject: [PATCH 3/7] check if VBE is available with multiboot --- source/Cosmos.Core/Multiboot.cs | 19 +++++++++++++++++++ .../Graphics/FullScreenCanvas.cs | 4 ++-- source/Cosmos.System2/Graphics/VBECanvas.cs | 6 ++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/source/Cosmos.Core/Multiboot.cs b/source/Cosmos.Core/Multiboot.cs index bb61cbf04..97de17c68 100644 --- a/source/Cosmos.Core/Multiboot.cs +++ b/source/Cosmos.Core/Multiboot.cs @@ -64,6 +64,25 @@ namespace Cosmos.Core public unsafe static class VBE { + static uint VBEINFO_PRESENT = (1 << 11); + + public static bool IsAvailable() + { + if ((Bootstrap.header->Flags & VBEINFO_PRESENT) == 0) + { + return false; + } + else + { + return true; + } + } + + public static ModeInfo getModeInfo() + { + return *Bootstrap.modeinfo; + } + [StructLayout(LayoutKind.Explicit, Size = 36)] public struct ControllerInfo { diff --git a/source/Cosmos.System2/Graphics/FullScreenCanvas.cs b/source/Cosmos.System2/Graphics/FullScreenCanvas.cs index 4beffad0c..2395c13d6 100644 --- a/source/Cosmos.System2/Graphics/FullScreenCanvas.cs +++ b/source/Cosmos.System2/Graphics/FullScreenCanvas.cs @@ -66,7 +66,7 @@ namespace Cosmos.System.Graphics { return new SVGAIICanvas(); } - else if (BGAExists() || PCI.GetDevice((VendorID)0x80EE, (DeviceID)0xBEEF) != null) + else if (BGAExists() || PCI.GetDevice((VendorID)0x80EE, (DeviceID)0xBEEF) != null || Core.VBE.IsAvailable()) { return new VBECanvas(); } @@ -88,7 +88,7 @@ namespace Cosmos.System.Graphics { return new SVGAIICanvas(mode); } - else if (BGAExists() || PCI.GetDevice((VendorID)0x80EE, (DeviceID)0xBEEF) != null) + else if (BGAExists() || PCI.GetDevice((VendorID)0x80EE, (DeviceID)0xBEEF) != null || Core.VBE.IsAvailable()) { return new VBECanvas(mode); } diff --git a/source/Cosmos.System2/Graphics/VBECanvas.cs b/source/Cosmos.System2/Graphics/VBECanvas.cs index a38d5a735..4bc6a5a33 100644 --- a/source/Cosmos.System2/Graphics/VBECanvas.cs +++ b/source/Cosmos.System2/Graphics/VBECanvas.cs @@ -44,6 +44,12 @@ namespace Cosmos.System.Graphics { Global.mDebugger.SendInternal($"Creating new VBEScreen() with mode {aMode.Columns}x{aMode.Rows}x{(uint)aMode.ColorDepth}"); + if (Core.VBE.IsAvailable()) + { + Core.VBE.ModeInfo ModeInfo = Core.VBE.getModeInfo(); + aMode = new Mode(ModeInfo.width, ModeInfo.height, (ColorDepth)ModeInfo.bpp); + } + ThrowIfModeIsNotValid(aMode); _VBEDriver = new VBEDriver((ushort)aMode.Columns, (ushort)aMode.Rows, (ushort)aMode.ColorDepth); From 9db7fea2729c40844e2960bb0fd0a0fdd3b59ba3 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 05:39:07 +0200 Subject: [PATCH 4/7] use linear framebuffer offset got from VBE ModeInfo --- source/Cosmos.Core/IOGroup/VBE.cs | 2 +- source/Cosmos.Core/Multiboot.cs | 5 +++++ source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs | 12 ++++++++++-- source/Cosmos.System2/Graphics/VBECanvas.cs | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/source/Cosmos.Core/IOGroup/VBE.cs b/source/Cosmos.Core/IOGroup/VBE.cs index 23c7659e3..17ed31685 100644 --- a/source/Cosmos.Core/IOGroup/VBE.cs +++ b/source/Cosmos.Core/IOGroup/VBE.cs @@ -27,7 +27,7 @@ namespace Cosmos.Core.IOGroup /// /// Frame buffer memory block. /// - public MemoryBlock LinearFrameBuffer = new MemoryBlock(0xE0000000, 1920 * 1200 * 4); + public MemoryBlock LinearFrameBuffer; //public MemoryBlock LinearFrameBuffer = new MemoryBlock(0xE0000000, 1024 * 768 * 4); } } diff --git a/source/Cosmos.Core/Multiboot.cs b/source/Cosmos.Core/Multiboot.cs index 97de17c68..99f3bc530 100644 --- a/source/Cosmos.Core/Multiboot.cs +++ b/source/Cosmos.Core/Multiboot.cs @@ -83,6 +83,11 @@ namespace Cosmos.Core return *Bootstrap.modeinfo; } + public static uint getLfbOffset() + { + return Bootstrap.modeinfo->framebuffer; + } + [StructLayout(LayoutKind.Explicit, Size = 36)] public struct ControllerInfo { diff --git a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs index 390de4fe2..9ca698538 100644 --- a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs +++ b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs @@ -77,8 +77,16 @@ namespace Cosmos.HAL.Drivers public VBEDriver(ushort xres, ushort yres, ushort bpp) { Global.mDebugger.SendInternal($"Creating VBEDriver with Mode {xres}*{yres}@{bpp}"); - //IO.LinearFrameBuffer = new MemoryBlock(0xE0000000, (uint)xres * yres * (uint)(bpp / 8)); - lastbuffer = new ManagedMemoryBlock(1920 * 1200 * 4); + if (VBE.IsAvailable() == true) + { + IO.LinearFrameBuffer = new MemoryBlock(VBE.getLfbOffset(), (uint)xres * yres * (uint)(bpp / 8)); + lastbuffer = new ManagedMemoryBlock((uint)xres * yres * (uint)(bpp / 8)); + } + else + { + IO.LinearFrameBuffer = new MemoryBlock(0xE0000000, 1920 * 1200 * 4); + lastbuffer = new ManagedMemoryBlock(1920 * 1200 * 4); + } VBESet(xres, yres, bpp); } diff --git a/source/Cosmos.System2/Graphics/VBECanvas.cs b/source/Cosmos.System2/Graphics/VBECanvas.cs index 4bc6a5a33..31dd6ca84 100644 --- a/source/Cosmos.System2/Graphics/VBECanvas.cs +++ b/source/Cosmos.System2/Graphics/VBECanvas.cs @@ -48,6 +48,7 @@ namespace Cosmos.System.Graphics { Core.VBE.ModeInfo ModeInfo = Core.VBE.getModeInfo(); aMode = new Mode(ModeInfo.width, ModeInfo.height, (ColorDepth)ModeInfo.bpp); + Global.mDebugger.SendInternal($"Detected VBE VESA with {aMode.Columns}x{aMode.Rows}x{(uint)aMode.ColorDepth}"); } ThrowIfModeIsNotValid(aMode); From b99750ab088a608871215717d2c93ea6dbcd4f82 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 06:26:16 +0200 Subject: [PATCH 5/7] add one other mode --- source/Cosmos.System2/Graphics/VBECanvas.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Cosmos.System2/Graphics/VBECanvas.cs b/source/Cosmos.System2/Graphics/VBECanvas.cs index 31dd6ca84..1cd9bc5a5 100644 --- a/source/Cosmos.System2/Graphics/VBECanvas.cs +++ b/source/Cosmos.System2/Graphics/VBECanvas.cs @@ -129,6 +129,7 @@ namespace Cosmos.System.Graphics new Mode(1024, 768, ColorDepth.ColorDepth32), /* The so called HD-Ready resolution */ new Mode(1280, 720, ColorDepth.ColorDepth32), + new Mode(1280, 768, ColorDepth.ColorDepth32), new Mode(1280, 1024, ColorDepth.ColorDepth32), /* A lot of HD-Ready screen uses this instead of 1280x720 */ new Mode(1366, 768, ColorDepth.ColorDepth32), From 1675f6bee0b7c807d3411809e377fa42ac48b50b Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 08:56:14 +0200 Subject: [PATCH 6/7] add comments --- source/Cosmos.Core/Multiboot.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/Cosmos.Core/Multiboot.cs b/source/Cosmos.Core/Multiboot.cs index 99f3bc530..db23064c5 100644 --- a/source/Cosmos.Core/Multiboot.cs +++ b/source/Cosmos.Core/Multiboot.cs @@ -9,9 +9,10 @@ namespace Cosmos.Core /// public class Multiboot { - /// + /// /// /// Get Multiboot address. Plugged. /// + /// The Multiboot Address [PlugMethod(PlugRequired = true)] public static uint GetMBIAddress() => throw null; @@ -66,6 +67,10 @@ namespace Cosmos.Core static uint VBEINFO_PRESENT = (1 << 11); + /// /// + /// Check in Multiboot if VBE is available + /// + /// True if is available, false if not public static bool IsAvailable() { if ((Bootstrap.header->Flags & VBEINFO_PRESENT) == 0) @@ -78,11 +83,18 @@ namespace Cosmos.Core } } + /// /// + /// Get VBE Modeinfo structure + /// public static ModeInfo getModeInfo() { return *Bootstrap.modeinfo; } + /// /// + /// Get the linear frame buffer address from VBE ModeInfo structure + /// + /// the offset in an uint public static uint getLfbOffset() { return Bootstrap.modeinfo->framebuffer; From 1765048eeb7c5d021a142f3a5923d9fb0cc931e5 Mon Sep 17 00:00:00 2001 From: valentinbreiz Date: Mon, 6 Jul 2020 21:10:38 +0200 Subject: [PATCH 7/7] debug message at VBEDriver creation + coding style --- source/Cosmos.Core/Multiboot.cs | 1 - source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs | 7 ++++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/Cosmos.Core/Multiboot.cs b/source/Cosmos.Core/Multiboot.cs index db23064c5..c09760707 100644 --- a/source/Cosmos.Core/Multiboot.cs +++ b/source/Cosmos.Core/Multiboot.cs @@ -116,7 +116,6 @@ namespace Cosmos.Core [FieldOffset(18)] public ushort totalmemory; [FieldOffset(20)] - public ushort oemSoftwareRev; [FieldOffset(24)] public uint oemVendorNamePtr; diff --git a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs index 9ca698538..5cb63e93d 100644 --- a/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs +++ b/source/Cosmos.HAL2/Drivers/Video/VBEDriver.cs @@ -76,18 +76,19 @@ namespace Cosmos.HAL.Drivers /// BPP (color depth). public VBEDriver(ushort xres, ushort yres, ushort bpp) { - Global.mDebugger.SendInternal($"Creating VBEDriver with Mode {xres}*{yres}@{bpp}"); - if (VBE.IsAvailable() == true) + if (VBE.IsAvailable()) { + Global.mDebugger.SendInternal($"Creating VBE VESA driver with Mode {xres}*{yres}@{bpp}"); IO.LinearFrameBuffer = new MemoryBlock(VBE.getLfbOffset(), (uint)xres * yres * (uint)(bpp / 8)); lastbuffer = new ManagedMemoryBlock((uint)xres * yres * (uint)(bpp / 8)); } else { + Global.mDebugger.SendInternal($"Creating VBE BGA driver with Mode {xres}*{yres}@{bpp}"); IO.LinearFrameBuffer = new MemoryBlock(0xE0000000, 1920 * 1200 * 4); lastbuffer = new ManagedMemoryBlock(1920 * 1200 * 4); + VBESet(xres, yres, bpp); } - VBESet(xres, yres, bpp); } ///