Skip to content

Commit 3c8a096

Browse files
feature: VESA VBE 1.2 (#1978)
* Initial plan * Address review feedback: named constants, typo fixes, VBE 1.2 version Co-authored-by: maximilien-noal <1087524+maximilien-noal@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: maximilien-noal <1087524+maximilien-noal@users.noreply.github.com>
1 parent 3ac5052 commit 3c8a096

1 file changed

Lines changed: 213 additions & 60 deletions

File tree

  • src/Spice86.Core/Emulator/InterruptHandlers/VGA

src/Spice86.Core/Emulator/InterruptHandlers/VGA/VgaBios.cs

Lines changed: 213 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,9 @@ private enum VbeModeFlags : ushort {
115115
/// </summary>
116116
private static class VbeConstants {
117117
/// <summary>
118-
/// "The current VESA version number is 1.2."
119-
/// VBE 1.0 version number in BCD format (major.minor = 0x0100 = 1.0).
118+
/// VBE 1.2 version number in BCD format (major.minor = 0x0102 = 1.2).
120119
/// </summary>
121-
public const ushort Version10 = 0x0100;
120+
public const ushort Version12 = 0x0102;
122121

123122
/// <summary>
124123
/// "D0 = DAC is switchable (0 = DAC is fixed width, with 6-bits per primary color,
@@ -156,13 +155,101 @@ private static class VbeConstants {
156155
/// </summary>
157156
public const ushort ModeListTerminator = 0xFFFF;
158157

158+
/// <summary>
159+
/// VESA mode 100h: 640x400, 256 colors.
160+
/// </summary>
161+
public const ushort VesaMode640x400x256 = 0x100;
162+
/// <summary>
163+
/// VESA mode 101h: 640x480, 256 colors.
164+
/// </summary>
165+
public const ushort VesaMode640x480x256 = 0x101;
159166
/// <summary>
160167
/// "To date, VESA has defined a 7-bit video mode number, 6Ah, for the 800x600,
161168
/// 16-color, 4-plane graphics mode. The corresponding 15-bit mode number for this
162169
/// mode is 102h."
163170
/// VESA mode 102h: 800x600, 16 colors (4-plane planar).
164171
/// </summary>
165172
public const ushort VesaMode800x600x16 = 0x102;
173+
/// <summary>
174+
/// VESA mode 103h: 800x600, 256 colors.
175+
/// </summary>
176+
public const ushort VesaMode800x600x256 = 0x103;
177+
/// <summary>
178+
/// VESA mode 104h: 1024x768, 16 colors (4-plane planar).
179+
/// </summary>
180+
public const ushort VesaMode1024x768x16 = 0x104;
181+
/// <summary>
182+
/// VESA mode 105h: 1024x768, 256 colors.
183+
/// </summary>
184+
public const ushort VesaMode1024x768x256 = 0x105;
185+
/// <summary>
186+
/// VESA mode 106h: 1280x1024, 16 colors (4-plane planar).
187+
/// </summary>
188+
public const ushort VesaMode1280x1024x16 = 0x106;
189+
/// <summary>
190+
/// VESA mode 107h: 1280x1024, 256 colors.
191+
/// </summary>
192+
public const ushort VesaMode1280x1024x256 = 0x107;
193+
/// <summary>
194+
/// VESA mode 10Dh: 320x200, 15-bit (RGB 5:5:5).
195+
/// </summary>
196+
public const ushort VesaMode320x200x15 = 0x10D;
197+
/// <summary>
198+
/// VESA mode 10Eh: 320x200, 16-bit (RGB 5:6:5).
199+
/// </summary>
200+
public const ushort VesaMode320x200x16 = 0x10E;
201+
/// <summary>
202+
/// VESA mode 10Fh: 320x200, 24-bit.
203+
/// </summary>
204+
public const ushort VesaMode320x200x24 = 0x10F;
205+
/// <summary>
206+
/// VESA mode 110h: 640x480, 15-bit (RGB 5:5:5).
207+
/// </summary>
208+
public const ushort VesaMode640x480x15 = 0x110;
209+
/// <summary>
210+
/// VESA mode 111h: 640x480, 16-bit (RGB 5:6:5).
211+
/// </summary>
212+
public const ushort VesaMode640x480x16 = 0x111;
213+
/// <summary>
214+
/// VESA mode 112h: 640x480, 24-bit.
215+
/// </summary>
216+
public const ushort VesaMode640x480x24 = 0x112;
217+
/// <summary>
218+
/// VESA mode 113h: 800x600, 15-bit (RGB 5:5:5).
219+
/// </summary>
220+
public const ushort VesaMode800x600x15 = 0x113;
221+
/// <summary>
222+
/// VESA mode 114h: 800x600, 16-bit (RGB 5:6:5).
223+
/// </summary>
224+
public const ushort VesaMode800x600x16Bit = 0x114;
225+
/// <summary>
226+
/// VESA mode 115h: 800x600, 24-bit.
227+
/// </summary>
228+
public const ushort VesaMode800x600x24 = 0x115;
229+
/// <summary>
230+
/// VESA mode 116h: 1024x768, 15-bit (RGB 5:5:5).
231+
/// </summary>
232+
public const ushort VesaMode1024x768x15 = 0x116;
233+
/// <summary>
234+
/// VESA mode 117h: 1024x768, 16-bit (RGB 5:6:5).
235+
/// </summary>
236+
public const ushort VesaMode1024x768x16Bit = 0x117;
237+
/// <summary>
238+
/// VESA mode 118h: 1024x768, 24-bit.
239+
/// </summary>
240+
public const ushort VesaMode1024x768x24 = 0x118;
241+
/// <summary>
242+
/// VESA mode 119h: 1280x1024, 15-bit (RGB 5:5:5).
243+
/// </summary>
244+
public const ushort VesaMode1280x1024x15 = 0x119;
245+
/// <summary>
246+
/// VESA mode 11Ah: 1280x1024, 16-bit (RGB 5:6:5).
247+
/// </summary>
248+
public const ushort VesaMode1280x1024x16Bit = 0x11A;
249+
/// <summary>
250+
/// VESA mode 11Bh: 1280x1024, 24-bit.
251+
/// </summary>
252+
public const ushort VesaMode1280x1024x24 = 0x11B;
166253

167254
/// <summary>
168255
/// Internal VGA mode 6Ah corresponding to VESA mode 102h (800x600x16).
@@ -201,7 +288,7 @@ private static class VbeModeInfoConstants {
201288
/// </summary>
202289
public const byte CharWidth = 8;
203290
/// <summary>
204-
/// "The YCharSellSize...size of the character cell in pixels" = 16
291+
/// "The YCharCellSize...size of the character cell in pixels" = 16
205292
/// </summary>
206293
public const byte CharHeight = 16;
207294
/// <summary>
@@ -238,6 +325,74 @@ private static class VbeModeInfoConstants {
238325
/// "the MaskSize values for a Direct Color 5:6:5 mode would be 5, 6, 5" - green=6
239326
/// </summary>
240327
public const byte GreenMaskSize6Bit = 6;
328+
/// <summary>
329+
/// Number of planes for 4-plane planar modes (e.g. EGA/VGA 16-color).
330+
/// </summary>
331+
public const byte PlanarModePlanes = 4;
332+
/// <summary>
333+
/// Number of bits per byte, used for scanline width calculations in planar modes.
334+
/// </summary>
335+
public const byte BitsPerByte = 8;
336+
/// <summary>
337+
/// Bits per pixel for 4-color planar modes (EGA/VGA 16-color).
338+
/// </summary>
339+
public const byte BitsPerPixelPlanar4Bit = 4;
340+
/// <summary>
341+
/// Bits per pixel for 256-color packed pixel modes.
342+
/// </summary>
343+
public const byte BitsPerPixel8Bit = 8;
344+
/// <summary>
345+
/// Bits per pixel for 15-bit (RGB 5:5:5) direct color modes.
346+
/// </summary>
347+
public const byte BitsPerPixel15Bit = 15;
348+
/// <summary>
349+
/// Bits per pixel for 16-bit (RGB 5:6:5) direct color modes.
350+
/// </summary>
351+
public const byte BitsPerPixel16Bit = 16;
352+
/// <summary>
353+
/// Bits per pixel for 24-bit direct color modes.
354+
/// </summary>
355+
public const byte BitsPerPixel24Bit = 24;
356+
/// <summary>
357+
/// Bits per pixel for 32-bit direct color modes.
358+
/// </summary>
359+
public const byte BitsPerPixel32Bit = 32;
360+
/// <summary>
361+
/// Bytes per pixel for 15-bit and 16-bit direct color modes.
362+
/// </summary>
363+
public const byte BytesPerPixel16Bit = 2;
364+
/// <summary>
365+
/// Bytes per pixel for 24-bit direct color modes.
366+
/// </summary>
367+
public const byte BytesPerPixel24Bit = 3;
368+
/// <summary>
369+
/// Bytes per pixel for 32-bit direct color modes.
370+
/// </summary>
371+
public const byte BytesPerPixel32Bit = 4;
372+
/// <summary>
373+
/// Red field bit position for RGB 5:5:5 (15-bit) modes.
374+
/// </summary>
375+
public const byte RedFieldPositionRgb555 = 10;
376+
/// <summary>
377+
/// Red field bit position for RGB 5:6:5 (16-bit) modes.
378+
/// </summary>
379+
public const byte RedFieldPositionRgb565 = 11;
380+
/// <summary>
381+
/// Green field bit position for RGB 5:5:5 and RGB 5:6:5 modes.
382+
/// </summary>
383+
public const byte GreenFieldPositionRgb16 = 5;
384+
/// <summary>
385+
/// Blue field bit position for all direct color modes.
386+
/// </summary>
387+
public const byte BlueFieldPosition = 0;
388+
/// <summary>
389+
/// Red field bit position for 24-bit and 32-bit direct color modes.
390+
/// </summary>
391+
public const byte RedFieldPositionRgb24 = 16;
392+
/// <summary>
393+
/// Green field bit position for 24-bit and 32-bit direct color modes.
394+
/// </summary>
395+
public const byte GreenFieldPositionRgb24 = 8;
241396
}
242397

243398
/// <summary>
@@ -601,7 +756,7 @@ public ushort YResolution {
601756
}
602757

603758
/// <summary>
604-
/// "The XCharCellSize and YCharSellSize specify the size of the character cell in
759+
/// "The XCharCellSize and YCharCellSize specify the size of the character cell in
605760
/// pixels."
606761
/// Character cell width in pixels. Offset: 0x16, Size: 1 byte.
607762
/// </summary>
@@ -611,7 +766,7 @@ public byte XCharSize {
611766
}
612767

613768
/// <summary>
614-
/// "The XCharCellSize and YCharSellSize specify the size of the character cell in
769+
/// "The XCharCellSize and YCharCellSize specify the size of the character cell in
615770
/// pixels."
616771
/// Character cell height in pixels. Offset: 0x17, Size: 1 byte.
617772
/// </summary>
@@ -1417,9 +1572,9 @@ public void VbeGetControllerInfo() {
14171572

14181573
var vbeInfo = new VbeInfoBlock(Memory, address);
14191574

1420-
// Fill VBE Info Block (VBE 1.0)
1575+
// Fill VBE Info Block (VBE 1.2)
14211576
vbeInfo.Signature = "VESA";
1422-
vbeInfo.Version = VbeConstants.Version10;
1577+
vbeInfo.Version = VbeConstants.Version12;
14231578

14241579
// OEM String pointer - point to a location beyond the main structure
14251580
vbeInfo.OemStringOffset = (ushort)(offset + VbeConstants.OemStringOffset);
@@ -1443,7 +1598,7 @@ public void VbeGetControllerInfo() {
14431598
vbeInfo.WriteModeList(vesaModes, VbeConstants.ModeListOffset);
14441599

14451600
if (_logger.IsEnabled(LogEventLevel.Debug)) {
1446-
_logger.Debug("{ClassName} INT 10 4F00 VbeGetControllerInfo - Returning VBE 1.0 info at {Segment:X4}:{Offset:X4}",
1601+
_logger.Debug("{ClassName} INT 10 4F00 VbeGetControllerInfo - Returning VBE 1.2 info at {Segment:X4}:{Offset:X4}",
14471602
nameof(VgaBios), segment, offset);
14481603
}
14491604

@@ -1488,16 +1643,14 @@ public void VbeGetModeInfo() {
14881643

14891644
// Calculate bytes per scan line
14901645
ushort bytesPerLine;
1491-
if (bpp == 4) {
1492-
bytesPerLine = (ushort)(width / 8); // 4-bit planar
1493-
} else if (bpp == 1) {
1494-
bytesPerLine = (ushort)(width / 8);
1495-
} else if (bpp == 15 || bpp == 16) {
1496-
bytesPerLine = (ushort)(width * 2);
1497-
} else if (bpp == 24) {
1498-
bytesPerLine = (ushort)(width * 3);
1499-
} else if (bpp == 32) {
1500-
bytesPerLine = (ushort)(width * 4);
1646+
if (bpp == VbeModeInfoConstants.BitsPerPixelPlanar4Bit || bpp == 1) {
1647+
bytesPerLine = (ushort)(width / VbeModeInfoConstants.BitsPerByte);
1648+
} else if (bpp == VbeModeInfoConstants.BitsPerPixel15Bit || bpp == VbeModeInfoConstants.BitsPerPixel16Bit) {
1649+
bytesPerLine = (ushort)(width * VbeModeInfoConstants.BytesPerPixel16Bit);
1650+
} else if (bpp == VbeModeInfoConstants.BitsPerPixel24Bit) {
1651+
bytesPerLine = (ushort)(width * VbeModeInfoConstants.BytesPerPixel24Bit);
1652+
} else if (bpp == VbeModeInfoConstants.BitsPerPixel32Bit) {
1653+
bytesPerLine = (ushort)(width * VbeModeInfoConstants.BytesPerPixel32Bit);
15011654
} else {
15021655
bytesPerLine = width; // 8-bit packed pixel
15031656
}
@@ -1508,18 +1661,18 @@ public void VbeGetModeInfo() {
15081661
modeInfo.YResolution = height;
15091662
modeInfo.XCharSize = VbeModeInfoConstants.CharWidth;
15101663
modeInfo.YCharSize = VbeModeInfoConstants.CharHeight;
1511-
modeInfo.NumberOfPlanes = (byte)(bpp == 4 ? 4 : 1);
1664+
modeInfo.NumberOfPlanes = (byte)(bpp == VbeModeInfoConstants.BitsPerPixelPlanar4Bit ? VbeModeInfoConstants.PlanarModePlanes : 1);
15121665
modeInfo.BitsPerPixel = bpp;
15131666
modeInfo.NumberOfBanks = VbeModeInfoConstants.SingleBank;
15141667

15151668
// Memory model
15161669
byte memoryModel = bpp switch {
1517-
4 => VbeModeInfoConstants.MemoryModelPlanar,
1518-
8 => VbeModeInfoConstants.MemoryModelPackedPixel,
1519-
15 => VbeModeInfoConstants.MemoryModelDirectColor,
1520-
16 => VbeModeInfoConstants.MemoryModelDirectColor,
1521-
24 => VbeModeInfoConstants.MemoryModelDirectColor,
1522-
32 => VbeModeInfoConstants.MemoryModelDirectColor,
1670+
VbeModeInfoConstants.BitsPerPixelPlanar4Bit => VbeModeInfoConstants.MemoryModelPlanar,
1671+
VbeModeInfoConstants.BitsPerPixel8Bit => VbeModeInfoConstants.MemoryModelPackedPixel,
1672+
VbeModeInfoConstants.BitsPerPixel15Bit => VbeModeInfoConstants.MemoryModelDirectColor,
1673+
VbeModeInfoConstants.BitsPerPixel16Bit => VbeModeInfoConstants.MemoryModelDirectColor,
1674+
VbeModeInfoConstants.BitsPerPixel24Bit => VbeModeInfoConstants.MemoryModelDirectColor,
1675+
VbeModeInfoConstants.BitsPerPixel32Bit => VbeModeInfoConstants.MemoryModelDirectColor,
15231676
_ => VbeModeInfoConstants.MemoryModelPackedPixel
15241677
};
15251678
modeInfo.MemoryModel = memoryModel;
@@ -1528,21 +1681,21 @@ public void VbeGetModeInfo() {
15281681
modeInfo.Reserved1 = VbeModeInfoConstants.Reserved;
15291682

15301683
// Direct color fields for high-color/true-color modes
1531-
if (bpp >= 15) {
1532-
if (bpp == 15 || bpp == 16) {
1684+
if (bpp >= VbeModeInfoConstants.BitsPerPixel15Bit) {
1685+
if (bpp == VbeModeInfoConstants.BitsPerPixel15Bit || bpp == VbeModeInfoConstants.BitsPerPixel16Bit) {
15331686
modeInfo.RedMaskSize = VbeModeInfoConstants.RedGreenBlueMaskSize;
1534-
modeInfo.RedFieldPosition = (byte)(bpp == 16 ? 11 : 10);
1535-
modeInfo.GreenMaskSize = (byte)(bpp == 16 ? VbeModeInfoConstants.GreenMaskSize6Bit : VbeModeInfoConstants.RedGreenBlueMaskSize);
1536-
modeInfo.GreenFieldPosition = 5;
1687+
modeInfo.RedFieldPosition = (byte)(bpp == VbeModeInfoConstants.BitsPerPixel16Bit ? VbeModeInfoConstants.RedFieldPositionRgb565 : VbeModeInfoConstants.RedFieldPositionRgb555);
1688+
modeInfo.GreenMaskSize = (byte)(bpp == VbeModeInfoConstants.BitsPerPixel16Bit ? VbeModeInfoConstants.GreenMaskSize6Bit : VbeModeInfoConstants.RedGreenBlueMaskSize);
1689+
modeInfo.GreenFieldPosition = VbeModeInfoConstants.GreenFieldPositionRgb16;
15371690
modeInfo.BlueMaskSize = VbeModeInfoConstants.RedGreenBlueMaskSize;
1538-
modeInfo.BlueFieldPosition = 0;
1539-
} else if (bpp == 24 || bpp == 32) {
1691+
modeInfo.BlueFieldPosition = VbeModeInfoConstants.BlueFieldPosition;
1692+
} else if (bpp == VbeModeInfoConstants.BitsPerPixel24Bit || bpp == VbeModeInfoConstants.BitsPerPixel32Bit) {
15401693
modeInfo.RedMaskSize = VbeModeInfoConstants.RedGreenBlueMaskSize8;
1541-
modeInfo.RedFieldPosition = 16;
1694+
modeInfo.RedFieldPosition = VbeModeInfoConstants.RedFieldPositionRgb24;
15421695
modeInfo.GreenMaskSize = VbeModeInfoConstants.RedGreenBlueMaskSize8;
1543-
modeInfo.GreenFieldPosition = 8;
1696+
modeInfo.GreenFieldPosition = VbeModeInfoConstants.GreenFieldPositionRgb24;
15441697
modeInfo.BlueMaskSize = VbeModeInfoConstants.RedGreenBlueMaskSize8;
1545-
modeInfo.BlueFieldPosition = 0;
1698+
modeInfo.BlueFieldPosition = VbeModeInfoConstants.BlueFieldPosition;
15461699
}
15471700
}
15481701

@@ -1552,7 +1705,7 @@ public void VbeGetModeInfo() {
15521705
}
15531706

15541707
// Return success
1555-
State.AX = 0x004F;
1708+
State.AX = (ushort)VbeStatus.Success;
15561709
}
15571710

15581711
/// <inheritdoc cref="IVesaBiosExtension.VbeSetMode"/>
@@ -1601,29 +1754,29 @@ private static (ushort width, ushort height, byte bpp, bool supported) GetVesaMo
16011754
return mode switch {
16021755
// VBE 1.2 standard modes - return info for queries
16031756
// Note: Only mode 0x102 can actually be SET (has internal VGA mode support)
1604-
0x100 => (640, 400, 8, true), // 640x400x256
1605-
0x101 => (640, 480, 8, true), // 640x480x256
1606-
0x102 => (800, 600, 4, true), // 800x600x16 (planar) - CAN BE SET via mode 0x6A
1607-
0x103 => (800, 600, 8, true), // 800x600x256
1608-
0x104 => (1024, 768, 4, true), // 1024x768x16 (planar)
1609-
0x105 => (1024, 768, 8, true), // 1024x768x256
1610-
0x106 => (1280, 1024, 4, true), // 1280x1024x16 (planar)
1611-
0x107 => (1280, 1024, 8, true), // 1280x1024x256
1612-
0x10D => (320, 200, 15, true), // 320x200x15-bit
1613-
0x10E => (320, 200, 16, true), // 320x200x16-bit
1614-
0x10F => (320, 200, 24, true), // 320x200x24-bit
1615-
0x110 => (640, 480, 15, true), // 640x480x15-bit (S3 mode 0x70)
1616-
0x111 => (640, 480, 16, true), // 640x480x16-bit
1617-
0x112 => (640, 480, 24, true), // 640x480x24-bit
1618-
0x113 => (800, 600, 15, true), // 800x600x15-bit
1619-
0x114 => (800, 600, 16, true), // 800x600x16-bit
1620-
0x115 => (800, 600, 24, true), // 800x600x24-bit
1621-
0x116 => (1024, 768, 15, true), // 1024x768x15-bit
1622-
0x117 => (1024, 768, 16, true), // 1024x768x16-bit
1623-
0x118 => (1024, 768, 24, true), // 1024x768x24-bit
1624-
0x119 => (1280, 1024, 15, true), // 1280x1024x15-bit
1625-
0x11A => (1280, 1024, 16, true), // 1280x1024x16-bit
1626-
0x11B => (1280, 1024, 24, true), // 1280x1024x24-bit
1757+
VbeConstants.VesaMode640x400x256 => (640, 400, VbeModeInfoConstants.BitsPerPixel8Bit, true),
1758+
VbeConstants.VesaMode640x480x256 => (640, 480, VbeModeInfoConstants.BitsPerPixel8Bit, true),
1759+
VbeConstants.VesaMode800x600x16 => (800, 600, VbeModeInfoConstants.BitsPerPixelPlanar4Bit, true), // CAN BE SET via mode 0x6A
1760+
VbeConstants.VesaMode800x600x256 => (800, 600, VbeModeInfoConstants.BitsPerPixel8Bit, true),
1761+
VbeConstants.VesaMode1024x768x16 => (1024, 768, VbeModeInfoConstants.BitsPerPixelPlanar4Bit, true),
1762+
VbeConstants.VesaMode1024x768x256 => (1024, 768, VbeModeInfoConstants.BitsPerPixel8Bit, true),
1763+
VbeConstants.VesaMode1280x1024x16 => (1280, 1024, VbeModeInfoConstants.BitsPerPixelPlanar4Bit, true),
1764+
VbeConstants.VesaMode1280x1024x256 => (1280, 1024, VbeModeInfoConstants.BitsPerPixel8Bit, true),
1765+
VbeConstants.VesaMode320x200x15 => (320, 200, VbeModeInfoConstants.BitsPerPixel15Bit, true),
1766+
VbeConstants.VesaMode320x200x16 => (320, 200, VbeModeInfoConstants.BitsPerPixel16Bit, true),
1767+
VbeConstants.VesaMode320x200x24 => (320, 200, VbeModeInfoConstants.BitsPerPixel24Bit, true),
1768+
VbeConstants.VesaMode640x480x15 => (640, 480, VbeModeInfoConstants.BitsPerPixel15Bit, true),
1769+
VbeConstants.VesaMode640x480x16 => (640, 480, VbeModeInfoConstants.BitsPerPixel16Bit, true),
1770+
VbeConstants.VesaMode640x480x24 => (640, 480, VbeModeInfoConstants.BitsPerPixel24Bit, true),
1771+
VbeConstants.VesaMode800x600x15 => (800, 600, VbeModeInfoConstants.BitsPerPixel15Bit, true),
1772+
VbeConstants.VesaMode800x600x16Bit => (800, 600, VbeModeInfoConstants.BitsPerPixel16Bit, true),
1773+
VbeConstants.VesaMode800x600x24 => (800, 600, VbeModeInfoConstants.BitsPerPixel24Bit, true),
1774+
VbeConstants.VesaMode1024x768x15 => (1024, 768, VbeModeInfoConstants.BitsPerPixel15Bit, true),
1775+
VbeConstants.VesaMode1024x768x16Bit => (1024, 768, VbeModeInfoConstants.BitsPerPixel16Bit, true),
1776+
VbeConstants.VesaMode1024x768x24 => (1024, 768, VbeModeInfoConstants.BitsPerPixel24Bit, true),
1777+
VbeConstants.VesaMode1280x1024x15 => (1280, 1024, VbeModeInfoConstants.BitsPerPixel15Bit, true),
1778+
VbeConstants.VesaMode1280x1024x16Bit => (1280, 1024, VbeModeInfoConstants.BitsPerPixel16Bit, true),
1779+
VbeConstants.VesaMode1280x1024x24 => (1280, 1024, VbeModeInfoConstants.BitsPerPixel24Bit, true),
16271780
_ => (0, 0, 0, false)
16281781
};
16291782
}

0 commit comments

Comments
 (0)