home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / grafik / gp / vesa16u.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1994-04-15  |  2.2 KB  |  105 lines

  1. UNIT VESA16U;
  2.  
  3. INTERFACE
  4. USES GRAPH;
  5.  
  6. VAR
  7.   VESA16 : Integer; { globally available driver number }
  8.  
  9. {Procedure LoadVESA;}
  10.  
  11. IMPLEMENTATION
  12.  
  13. CONST
  14.   VESA16Modes: array[0..2] of Word =
  15.     ($0102, $0104, $0106);
  16.  
  17. TYPE
  18.   VgaInfoBlock = record
  19.     VESASignature: array[0..3] of Byte;
  20.     VESAVersion: Word;
  21.     OEMStringPtr: Pointer;
  22.     Capabilities: array[0..3] of Byte;
  23.     VideoModePtr: Pointer;
  24.   end;
  25.  
  26. { Scan the supported mode table for the highest mode this card
  27.   will provide
  28. }
  29.  
  30. function GetHighestCap(
  31.                 Table: Pointer; Modes: Word; Size: Integer): Integer;
  32.   near; assembler;
  33. asm
  34.         XOR     AX,AX
  35.         LES     DI, Table
  36. @@1:
  37.         MOV     SI, Modes
  38.         ADD     SI, Size
  39.         ADD     SI, Size
  40.         MOV     BX, ES:[DI]
  41.         CMP     BX, 0FFFFH
  42.         JE      @@4
  43.         INC     DI
  44.         INC     DI
  45.         MOV     CX,Size
  46. @@2:
  47.         CMP     BX,[SI]
  48.         JZ      @@3
  49.         DEC     SI
  50.         DEC     SI
  51.         LOOP    @@2
  52. @@3:
  53.         CMP     AX,CX
  54.         JA      @@1
  55.         MOV     AX,CX
  56.         JMP     @@1
  57. @@4:
  58. end;
  59.  
  60. function DetectVesa16: Integer; far; assembler;
  61. var
  62.   VesaInfo: array[0..255] of Byte;
  63. asm
  64.         MOV     AX,SS
  65.         MOV     ES,AX
  66.         LEA     DI,VesaInfo
  67.         MOV     AX,4F00H
  68.         INT     10H
  69.         CMP     AX,004FH
  70.         MOV     AX,grError
  71.         JNZ     @@Exit
  72.         CMP     ES:[DI].VgaInfoBlock.VESASignature.Word[0], 'EV'
  73.         JNZ     @@Exit
  74.         CMP     ES:[DI].VgaInfoBlock.VESASignature.Word[2], 'AS'
  75.         JNZ     @@Exit
  76.         LES     DI,ES:[DI].VgaInfoBlock.VideoModePtr
  77.         PUSH    ES
  78.         PUSH    DI
  79.         MOV     AX, OFFSET Vesa16Modes
  80.         PUSH    AX
  81.         MOV     AX,3
  82.         PUSH    AX
  83.         CALL    GetHighestCap
  84. @@Exit:
  85. end;
  86.  
  87. Procedure VESA16DriverProc; external;
  88. {$L VESA16.OBJ}
  89.  
  90. Procedure Abort(Msg : string);
  91. begin
  92.   Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
  93.   Halt(1);
  94. end;
  95.  
  96. Procedure LoadVESA;
  97. BEGIN
  98.   VESA16 := InstallUserDriver('VESA16', @DetectVESA16);
  99.   If RegisterBGIdriver(@VESA16DriverProc) < 0 then
  100.     Abort('VESA16');
  101. END;
  102.  
  103. BEGIN
  104.   LoadVESA;
  105. END.