using IL2CPU.API.Attribs; using System; using System.Runtime.InteropServices; namespace Cosmos.Core { /// /// Used for Multiboot parsing /// public class Multiboot { /// /// /// Get Multiboot address. Plugged. /// /// The Multiboot Address [PlugMethod(PlugRequired = true)] public static uint GetMBIAddress() => throw null; [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 { 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) { return false; } else { return true; } } /// /// /// 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; } [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]; } } }