11
TVesaModeInfoBlock = Packed Record
12
{Mandatory information for all VBE revisions}
13
ModeAttributes : Word; {mode attributes}
14
WinAAttributes : Byte; {window A attributes}
15
WinBAttributes : Byte; {window B attributes}
16
WinGranularity : Word; {window granularity}
17
WinSize : Word; {window size}
18
WinASegment : Word; {window A start segment}
19
WinBSegment : Word; {window B start segment}
20
WinFuncPtr : DWord; {real mode pointer to window function}
21
BytesPerScanLine : Word; {bytes per scan line}
23
{Mandatory information for VBE 1.2 and above}
24
XResolution : Word; {horizontal resolution in pixels or characters}
25
YResolution : Word; {vertical resolution in pixels or characters}
26
XCharSize : Byte; {character cell width in pixels}
27
YCharSize : Byte; {character cell height in pixels}
28
NumberOfPlanes : Byte; {number of memory planes}
29
BitsPerPixel : Byte; {bits per pixel}
30
NumberOfBanks : Byte; {number of banks}
31
MemoryModel : Byte; {memory model type}
32
BankSize : Byte; {bank size in KB}
33
NumberOfImagePages : Byte; {number of images}
34
Reserved : Byte;{=1} {reserved for page function}
36
{Direct color fields (required for direct/6 and YUV/7 memory models)}
37
RedMaskSize : Byte; {size of direct color red mask in bits}
38
RedFieldPosition : Byte; {bit position of lsb of red mask}
39
GreenMaskSize : Byte; {size of direct color green mask in bits}
40
GreenFieldPosition : Byte; {bit position of lsb of green mask}
41
BlueMaskSize : Byte; {size of direct color blue mask in bits}
42
BlueFieldPosition : Byte; {bit position of lsb of blue mask}
43
RsvdMaskSize : Byte; {size of direct color reserved mask in bits}
44
RsvdFieldPosition : Byte; {bit position of lsb of reserved mask}
45
DirectColorModeInfo : Byte; {direct color mode attributes}
47
{Mandatory information for VBE 2.0 and above}
48
PhysBasePtr : DWord; {physical address for flat memory frame buffer}
49
Reserved2 : DWord;{=0} {Reserved - always set to 0}
50
Reserved3 : Word;{=0} {Reserved - always set to 0}
52
{Mandatory information for VBE 3.0 and above}
53
LinBytesPerScanLine : Word; {bytes per scan line for linear modes}
54
BnkNumberOfImagePages : Byte; {number of images for banked modes}
55
LinNumberOfImagePages : Byte; {number of images for linear modes}
56
LinRedMaskSize : Byte; {size of direct color red mask (linear modes)}
57
LinRedFieldPosition : Byte; {bit position of lsb of red mask (linear modes)}
58
LinGreenMaskSize : Byte; {size of direct color green mask (linear modes)}
59
LinGreenFieldPosition : Byte; {bit position of lsb of green mask (linear modes)}
60
LinBlueMaskSize : Byte; {size of direct color blue mask (linear modes)}
61
LinBlueFieldPosition : Byte; {bit position of lsb of blue mask (linear modes)}
62
LinRsvdMaskSize : Byte; {size of direct color reserved mask (linear modes)}
63
LinRsvdFieldPosition : Byte; {bit position of lsb of reserved mask (linear modes)}
64
MaxPixelClock : DWord; {maximum pixel clock (in Hz) for graphics mode}
66
Reserved4 : Array[1..189] Of Byte; {remainder of ModeInfoBlock}
68
PModeInfo = ^TModeInfo;
71
VesaModeInfo : TVesaModeInfoBlock;
80
Function SetVESAMode(M : Integer) : Boolean;
81
Procedure RestoreTextMode;
82
Procedure WriteToVideoMemory(Src : Pointer; Dest : DWord; Size : DWord);
83
Procedure SetPalette(Palette : Pointer; First, Num : Integer);
84
Procedure GetPalette(Palette : Pointer; First, Num : Integer);
85
Function MakeMask(MaskSize, FieldPosition : Integer) : DWord;
93
TVBEInfoBlock = Packed Record
95
VBESignature : DWord; {'VESA'}
97
OemStringPtr : DWord; {VbeFarPtr to OEM String}
98
Capabilities : DWord; {Capabilities of graphics controller}
99
VideoModePtr : DWord; {VbeFarPtr to VideoModeList}
101
TotalMemory : Word; {Number of 64kb memory blocks}
103
OemSoftwareRev : Word; {VBE implementation Software revision}
104
OemVendorNamePtr : DWord; {VbeFarPtr to Vendor Name String}
105
OemProductNamePtr : DWord; {VbeFarPtr to Product Name String}
106
OemProductRevPtr : DWord; {VbeFarPtr to Product Revision String}
107
Reserved : Array[1..222] Of Byte; {Reserved for VBE implementation scratch area}
108
OemData : Array[1..256] Of Char; {Data Area for OEM Strings}
112
VBEInfoBlock : TVBEInfoBlock;
114
EightBitDACSupported : Boolean;
116
SnowyRAMDAC : Boolean;
117
StereoSignalingSupport : Boolean;
118
StereoSignalingVesaEVC : Boolean;
120
OEMVendorName : String;
121
OEMProductName : String;
122
OEMProductRev : String;
123
OEMSoftwareRev : Integer;
124
CurrentMode : Integer;
128
RealModePaletteSel : Word;
129
RealModePaletteSeg : Word;
130
SetPaletteHW : Boolean;
131
PaletteDACbits : Integer;
133
ReadWindow, WriteWindow : Integer;
134
ReadWindowStart, WriteWindowStart : Integer;
135
ReadWindowAddress, WriteWindowAddress : Integer;
136
WindowGranularity : DWord;
137
WindowSize, WindowSizeG : DWord;
141
RealRegs : TRealRegs;
145
Procedure StandardMode(ModeNumber : DWord; Var ModeInfo : TVesaModeInfoBlock);
180
ModeAttributes := ModeAttributes Or 2;
301
ModeAttributes := ModeAttributes And $FFFD;
303
// NumberOfImagePages := 0;{...}
307
Function bcd(q : Integer) : Integer;
311
If ((q And $F) < 10) And ((q Shr 4) < 10) Then
312
bcd := (q And $F) + (q Shr 4) * 10
317
Procedure DisposeRealModePalette;
320
If RealModePaletteSel = 0 Then
322
global_dos_free(RealModePaletteSel);
323
RealModePaletteSel := 0;
324
RealModePaletteSeg := 0;
327
Procedure AllocateRealModePalette;
333
DisposeRealModePalette;
334
Addr := global_dos_alloc(256*4);
335
RealModePaletteSeg := Addr Shr 16;
336
RealModePaletteSel := Addr And $FFFF;
339
Procedure SetPalette2(Palette : Pointer; Num : Integer); Assembler;
348
movzx edi, word [RealModePaletteSeg]
351
{ mov edx, 03F3F3F3Fh}
357
shr eax, 2 {convert 8->6bit}
367
Procedure SetPalette3(Palette : Pointer; Num : Integer); Assembler;
376
movzx edi, word [RealModePaletteSeg]
379
{ mov edx, 07F7F7F7Fh}
385
shr eax, 1 {convert 8->7bit}
395
Procedure SetPaletteHW6(Palette : Pointer; First, Num : Integer);
403
p := PDWord(Palette);
404
outportb($3C8, First);
407
c := (p^ Shr 2) And $3F3F3F;
408
outportb($3C9, c Shr 16);
409
outportb($3C9, c Shr 8);
417
Procedure SetPaletteHW7(Palette : Pointer; First, Num : Integer);
425
p := PDWord(Palette);
426
outportb($3C8, First);
429
c := (p^ Shr 1) And $7F7F7F;
430
outportb($3C9, c Shr 16);
431
outportb($3C9, c Shr 8);
439
Procedure SetPaletteHW8(Palette : Pointer; First, Num : Integer);
446
p := PDWord(Palette);
447
outportb($3C8, First);
450
outportb($3C9, p^ Shr 16);
451
outportb($3C9, p^ Shr 8);
459
Procedure SetPalette(Palette : Pointer; First, Num : Integer);
464
Case PaletteDACbits Of
465
8 : SetPaletteHW8(Palette, First, Num);
466
7 : SetPaletteHW7(Palette, First, Num);
467
6 : SetPaletteHW6(Palette, First, Num);
472
If PaletteDACbits = 8 Then
473
dosmemput(RealModePaletteSeg, 0, Palette^, Num * 4) {8bits}
475
If PaletteDACbits = 7 Then
476
SetPalette3(Palette, Num) {7bits}
478
SetPalette2(Palette, Num); {6bits}
479
RealRegs.ax := $4F09;
482
RealRegs.dx := First;
483
RealRegs.es := RealModePaletteSeg;
485
realintr($10, RealRegs);
489
Procedure GetPalette(Palette : Pointer; First, Num : Integer);
492
RealRegs.ax := $4F09;
495
RealRegs.dx := First;
496
RealRegs.es := RealModePaletteSeg;
498
realintr($10, RealRegs);
502
Procedure SwitchTo8bitDAC;
505
RealRegs.ax := $4F08;
508
realintr($10, RealRegs);
509
PaletteDACbits := RealRegs.bh;
510
If PaletteDACbits < 6 Then
514
Function MakeMask(MaskSize, FieldPosition : Integer) : DWord;
521
Mask := 1 Shl FieldPosition;
522
For I := 2 To MaskSize Do
523
Mask := Mask Or (Mask Shl 1);
527
Function GetRMString(SegOfs : DWord) : String;
541
Ofs := SegOfs And $FFFF;
542
Seg := SegOfs Shr 16;
544
dosmemget(Seg, Ofs, C, 1);
560
Procedure SetWriteWindowStart(WinPos : DWord);
563
RealRegs.ax := $4F05;
564
RealRegs.bx := WriteWindow;
565
RealRegs.dx := WinPos;
566
realintr($10, RealRegs);
569
Procedure WriteToVideoMemory(Src : Pointer; Dest : DWord; Size : DWord);
576
WW := Dest Div WindowGranularity;
577
Dest := Dest Mod WindowGranularity;
578
{ Writeln(WindowSize);}
582
SetWriteWindowStart(WW);
583
ToDo := WindowSize - Dest;
590
add edi, WriteWindowAddress
603
End ['EAX', 'ECX', 'ESI', 'EDI'];
605
Inc(WW, WindowSizeG);
613
Procedure WinAttrib(q : Integer);
616
If (q And 1) <> 0 Then
619
Write(' not_supported');
620
If (q And 2) <> 0 Then
622
If (q And 4) <> 0 Then
631
PModesList = ^TModesList;
633
ModeInfo : TModeInfo;
638
First, Last, Run, Tmp : PModesList;
659
AddrSeg, AddrSel : Word;
660
VesaModeInfo : TVesaModeInfoBlock;
661
ScanStart, ScanEnd : Integer;
664
hasReadWindow, hasWriteWindow : Boolean;
670
Addr := global_dos_alloc(512);
671
AddrSeg := Addr Shr 16;
672
AddrSel := Addr And $FFFF;
674
{ ScanEnd := $7FFF;} {VBE 1.0+ ??}
675
{ ScanEnd := $3FFF;} {VBE 1.2+ ??}
676
ScanEnd := $7FF; {VBE 3.0+}
678
Writeln('scanning modes $', HexStr(ScanStart, 4), '..$', HexStr(ScanEnd, 4));
680
For I := ScanStart To ScanEnd Do
682
FillChar(VesaModeInfo, SizeOf(VesaModeInfo), 0);
683
dosmemput(AddrSeg, 0, VesaModeInfo, SizeOf(VesaModeInfo));
684
RealRegs.ax := $4F01; {return VBE mode information}
686
RealRegs.es := AddrSeg;
688
realintr($10, RealRegs);
689
dosmemget(AddrSeg, 0, VesaModeInfo, SizeOf(VesaModeInfo));
693
If ((VesaModeInfo.ModeAttributes And 1) <> 0) Or
694
(VesaModeInfo.BytesPerScanLine <> 0) Then
696
Writeln('ModeNumber: $', HexStr(I, 4));
697
Write('ModeAttributes:');
698
If (VesaModeInfo.ModeAttributes And 1) <> 0 Then
701
Write(' not_supported');
702
If (VesaModeInfo.ModeAttributes And 2) <> 0 Then
705
Write(' reserved_is_zero(noresolutioninfo_for_vbe1.1-)');
706
If (VesaModeInfo.ModeAttributes And 4) <> 0 Then
710
If (VesaModeInfo.ModeAttributes And 8) <> 0 Then
713
Write(' monochrome');
714
If (VesaModeInfo.ModeAttributes And 16) <> 0 Then
718
If (VesaModeInfo.ModeAttributes And 32) <> 0 Then
722
If (VesaModeInfo.ModeAttributes And 64) <> 0 Then
726
If (VesaModeInfo.ModeAttributes And 128) <> 0 Then
730
If (VesaModeInfo.ModeAttributes And 256) <> 0 Then
731
Write(' DoubleScanMode_is_available')
734
If (VesaModeInfo.ModeAttributes And 512) <> 0 Then
735
Write(' InterlacedMode_is_available')
738
If (VesaModeInfo.ModeAttributes And 1024) <> 0 Then
739
Write(' TripleBuffering')
742
If (VesaModeInfo.ModeAttributes And 2048) <> 0 Then
743
Write(' StereoscopicDisplaySupport')
746
If (VesaModeInfo.ModeAttributes And 4096) <> 0 Then
747
Write(' DualDisplayStartAddressSupport')
752
Write('WinAAtributes:');
753
WinAttrib(VesaModeInfo.WinAAttributes);
754
Write('WinBAttributes:');
755
WinAttrib(VesaModeInfo.WinBAttributes);
756
Writeln('WinGranularity: ', VesaModeInfo.WinGranularity, ' KB');
757
Writeln('WinSize: ', VesaModeInfo.WinSize, ' KB');
758
Writeln('WinASegment: $', HexStr(VesaModeInfo.WinASegment, 4));
759
Writeln('WinBSegment: $', HexStr(VesaModeInfo.WinBSegment, 4));
760
Writeln('WinFuncPtr: ', HexStr(VesaModeInfo.WinFuncPtr Shr 16, 4), ':', HexStr(VesaModeInfo.WinFuncPtr And $FFFF, 4));
761
Writeln('BytesPerScanLine: ', VesaModeInfo.BytesPerScanLine);
763
Writeln('XResolution: ', VesaModeInfo.XResolution);
764
Writeln('YResolution: ', VesaModeInfo.YResolution);
765
Writeln('XCharSize: ', VesaModeInfo.XCharSize);
766
Writeln('YCharSize: ', VesaModeInfo.YCharSize);
767
Writeln('NumberOfPlanes: ', VesaModeInfo.NumberOfPlanes);
768
Writeln('BitsPerPixel: ', VesaModeInfo.BitsPerPixel);
769
Writeln('NumberOfBanks: ', VesaModeInfo.NumberOfBanks);
770
Write('MemoryModel: ');
771
Case VesaModeInfo.MemoryModel Of
772
0 : Write('Text mode');
773
1 : Write('CGA graphics');
774
2 : Write('Hercules graphics');
776
4 : Write('Packed pixel');
777
5 : Write('Non-chain 4, 256 color');
778
6 : Write('Direct Color');
780
8..15 : Write('Reserved, to be defined by VESA');
782
Write('To be defined by OEM');
784
Writeln('/', VesaModeInfo.MemoryModel);
785
Writeln('BankSize: ', VesaModeInfo.BankSize, ' KB');
786
Writeln('NumberOfImagePages: ', VesaModeInfo.NumberOfImagePages);
787
Writeln('Reserved(=1): ', VesaModeInfo.Reserved);
788
Writeln('RedMaskSize: ', VesaModeInfo.RedMaskSize);
789
Writeln('RedFieldPosition: ', VesaModeInfo.RedFieldPosition);
790
Writeln('GreenMaskSize: ', VesaModeInfo.GreenMaskSize);
791
Writeln('GreenFieldPosition: ', VesaModeInfo.GreenFieldPosition);
792
Writeln('BlueMaskSize: ', VesaModeInfo.BlueMaskSize);
793
Writeln('BlueFieldPosition: ', VesaModeInfo.BlueFieldPosition);
794
Writeln('RsvdMaskSize: ', VesaModeInfo.RsvdMaskSize);
795
Writeln('RsvdFieldPosition: ', VesaModeInfo.RsvdFieldPosition);
796
Write('DirectColorModeInfo:');
797
If (VesaModeInfo.DirectColorModeInfo And 1) <> 0 Then
798
Write(' Color_ramp_is_programmable')
800
Write(' Color_ramp_is_fixed');
801
If (VesaModeInfo.DirectColorModeInfo And 2) <> 0 Then
802
Write(' Rsvd_bits_usable_by_app')
804
Write(' Rsvd_bits_reserved');
807
Writeln('PhysBasePtr: $', HexStr(VesaModeInfo.PhysBasePtr, 8));
808
Writeln('Reserved2(=0): ', VesaModeInfo.Reserved2);
809
Writeln('Reserved3(=0): ', VesaModeInfo.Reserved3);
812
{ Write(VesaModeInfo.XResolution, 'x', VesaModeInfo.YResolution, 'x',
813
VesaModeInfo.BitsPerPixel, '-', VesaModeInfo.MemoryModel,
814
'R', VesaModeInfo.RedMaskSize, ':', VesaModeInfo.RedFieldPosition,
815
'G', VesaModeInfo.GreenMaskSize, ':', VesaModeInfo.GreenFieldPosition,
816
'B', VesaModeInfo.BlueMaskSize, ':', VesaModeInfo.BlueFieldPosition,
817
'A', VesaModeInfo.RsvdMaskSize, ':', VesaModeInfo.RsvdFieldPosition, ' ');}
822
If (VesaModeInfo.ModeAttributes And 1) <> 0 Then
824
If (VesaModeInfo.ModeAttributes And 2) = 0 Then
826
If VBEInfoBlock.VBEVersion >= $0102 Then
829
StandardMode(I, VesaModeInfo);
831
ModeAttr := (VesaModeInfo.ModeAttributes And $C0) Shr 6;
835
If IsModeOk And ((ModeAttr = 0) Or (ModeAttr = 2)) Then
836
Begin {check windowed}
837
hasReadWindow := False;
838
hasWriteWindow := False;
839
If (VesaModeInfo.WinAAttributes And $01) <> 0 Then
841
If (VesaModeInfo.WinAAttributes And $02) <> 0 Then
842
hasReadWindow := True;
843
If (VesaModeInfo.WinAAttributes And $04) <> 0 Then
844
hasWriteWindow := True;
846
If (VesaModeInfo.WinBAttributes And $01) <> 0 Then
848
If (VesaModeInfo.WinBAttributes And $02) <> 0 Then
849
hasReadWindow := True;
850
If (VesaModeInfo.WinBAttributes And $04) <> 0 Then
851
hasWriteWindow := True;
853
If (Not hasReadWindow) Or (Not hasWriteWindow) Then
856
If IsModeOk And ((ModeAttr = 2) Or (ModeAttr = 3)) Then
863
// Write(HexStr(I, 4), ' ');
866
Last^.ModeInfo.ModeNumber := I;
867
Last^.ModeInfo.VesaModeInfo := VesaModeInfo;
871
global_dos_free(AddrSel);
872
If ModeInfo <> Nil Then
874
If NrOfModes <> -1 Then
875
ModeInfo := GetMem((NrOfModes + 1) * SizeOf(TModeInfo))
879
For I := 0 To NrOfModes Do
881
ModeInfo[I] := Run^.ModeInfo;
891
Procedure GetVBEInfo;
900
Addr := global_dos_alloc(512);
901
AddrSeg := Addr Shr 16;
902
AddrSel := Addr And $FFFF;
903
VBEInfoBlock.VBESignature := $32454256; {'VBE2'}
904
dosmemput(AddrSeg, 0, VBEInfoBlock, 4);
905
RealRegs.ax := $4F00;
906
RealRegs.es := AddrSeg;
908
realintr($10, RealRegs);
909
VBEPresent := RealRegs.al = $4F;
912
dosmemget(AddrSeg, 0, VBEInfoBlock, SizeOf(VBEInfoBlock));
913
{todo: check for 'VESA' id string}
914
VideoMemory := VBEInfoBlock.TotalMemory * 64;
915
EightBitDACSupported := (VBEInfoBlock.Capabilities And 1) <> 0;
916
nonVGA := (VBEInfoBlock.Capabilities And 2) <> 0;
917
SnowyRAMDAC := (VBEInfoBlock.Capabilities And 4) <> 0;
918
StereoSignalingSupport := (VBEInfoBlock.Capabilities And 8) <> 0;
919
StereoSignalingVesaEVC := (VBEInfoBlock.Capabilities And 16) <> 0;
920
OEMString := GetRMString(VBEInfoBlock.OemStringPtr);
921
If VBEInfoBlock.VBEVersion >= $0200 Then
923
OEMVendorName := GetRMString(VBEInfoBlock.OemVendorNamePtr);
924
OEMProductName := GetRMString(VBEInfoBlock.OemProductNamePtr);
925
OEMProductRev := GetRMString(VBEInfoBlock.OemProductRevPtr);
926
OEMSoftwareRev := VBEInfoBlock.OemSoftwareRev;
931
OEMProductName := '';
933
OEMSoftwareRev := -1;
936
global_dos_free(AddrSel);
941
Writeln('VBEVersion: ', bcd(VBEInfoBlock.VBEVersion Shr 8), '.', bcd(VBEInfoBlock.VBEVersion And $FF));
942
Writeln('VideoMemory: ', VideoMemory, ' KB');
943
Writeln('EightBitDACSupported: ', EightBitDACSupported);
944
Writeln('nonVGA: ', nonVGA);
945
Writeln('SnowyRAMDAC: ', SnowyRAMDAC);
946
Writeln('StereoSignalingSupport: ', StereoSignalingSupport);
947
If StereoSignalingSupport Then
948
If StereoSignalingVesaEVC Then
949
Writeln('Stereo signaling supported via VESA EVC connector')
951
Writeln('Stereo signaling supported via external VESA stereo connector');
952
If OEMString <> '' Then
953
Writeln('OEMString: ', OEMString);
954
If OEMVendorName <> '' Then
955
Writeln('OEMVendorName: ', OEMVendorName);
956
If OEMProductName <> '' Then
957
Writeln('OEMProductName: ', OEMProductName);
958
If OEMProductRev <> '' Then
959
Writeln('OEMProductRev: ', OEMProductRev);
960
If OEMSoftwareRev <> -1 Then
961
Writeln('OEMSoftwareRev: ', bcd(OEMSoftwareRev Shr 8), '.', bcd(OEMSoftwareRev And $FF));
962
Write('VideoModeList:');
963
tmp := (VBEInfoBlock.VideoModePtr Shr 16) * 16 + (VBEInfoBlock.VideoModePtr And $FFFF);
964
While MemW[tmp] <> $FFFF Do
966
Write(' $', HexStr(MemW[tmp], 4));
975
Function SetVESAMode(M : Integer) : Boolean;
980
lReadWindow, lWriteWindow : Integer;
981
lReadWindowStart, lWriteWindowStart : Integer;
982
lReadWindowAddress, lWriteWindowAddress : Integer;
983
lWindowGranularity : DWord;
984
lWindowSize, lWindowSizeG : DWord;
987
SetVESAMode := False;
988
DisposeRealModePalette;
989
ModeAttr := (ModeInfo[M].VesaModeInfo.ModeAttributes And $C0) Shr 6;
991
0 : lLFBUsed := False; {windowed frame buffer only}
992
2 : lLFBUsed := UseLFB; {both windowed and linear}
993
3 : lLFBUsed := True; {linear frame buffer only}
997
With ModeInfo[M].VesaModeInfo Do
1001
If (WinAAttributes And $01) <> 0 Then
1003
If (WinAAttributes And $02) <> 0 Then
1005
If (WinAAttributes And $04) <> 0 Then
1008
If (lReadWindow = -1) Or (lWriteWindow = -1) Then
1009
If (WinBAttributes And $01) <> 0 Then
1011
If (lReadWindow = -1) And ((WinBAttributes And $02) <> 0) Then
1013
If (lWriteWindow = -1) And ((WinBAttributes And $04) <> 0) Then
1018
0 : lReadWindowAddress := WinASegment Shl 4;
1019
1 : lReadWindowAddress := WinBSegment Shl 4;
1021
Case lWriteWindow Of
1023
0 : lWriteWindowAddress := WinASegment Shl 4;
1024
1 : lWriteWindowAddress := WinBSegment Shl 4;
1026
lWindowGranularity := WinGranularity * 1024;
1027
lWindowSize := WinSize * 1024;
1028
lWindowSizeG := lWindowSize Div lWindowGranularity;
1029
lWindowSize := lWindowSizeG * lWindowGranularity;
1036
RealRegs.ax := $4F02;
1038
RealRegs.bx := ModeInfo[M].ModeNumber Or $4000
1040
RealRegs.bx := ModeInfo[M].ModeNumber;
1041
realintr($10, RealRegs);
1042
PaletteDACbits := 6;
1043
With ModeInfo[M].VesaModeInfo Do
1045
If (BitsPerPixel = 8) And (MemoryModel = 4{packed pixel}) Then
1047
SetPaletteHW := True;
1048
If (VBEInfoBlock.VBEVersion >= $200) And
1049
((ModeAttributes And 32) <> 0) Then {if nonVGA, use func9 to set palette}
1050
SetPaletteHW := False;
1052
If EightBitDACSupported Then
1055
If Not SetPaletteHW Then
1056
AllocateRealModePalette;
1060
LFBUsed := lLFBUsed;
1061
ReadWindow := lReadWindow;
1062
WriteWindow := lWriteWindow;
1063
ReadWindowStart := lReadWindowStart;
1064
WriteWindowStart := lWriteWindowStart;
1065
ReadWindowAddress := lReadWindowAddress;
1066
WriteWindowAddress := lWriteWindowAddress;
1067
WindowGranularity := lWindowGranularity;
1068
WindowSize := lWindowSize;
1069
WindowSizeG := lWindowSizeG;
1071
SetVESAMode := True;
1074
Procedure RestoreTextMode;
1077
DisposeRealModePalette;
1078
RealRegs.ax := $0003;
1079
realintr($10, RealRegs);
1085
If Not VESAInit Then
1097
UseLFB := {True}False;
1099
RealModePaletteSel := 0;
1100
RealModePaletteSeg := 0;
1107
DisposeRealModePalette;