home *** CD-ROM | disk | FTP | other *** search
- UNIT VESA16U;
-
- INTERFACE
- USES GRAPH;
-
- VAR
- VESA16 : Integer; { globally available driver number }
-
- {Procedure LoadVESA;}
-
- IMPLEMENTATION
-
- CONST
- VESA16Modes: array[0..2] of Word =
- ($0102, $0104, $0106);
-
- TYPE
- VgaInfoBlock = record
- VESASignature: array[0..3] of Byte;
- VESAVersion: Word;
- OEMStringPtr: Pointer;
- Capabilities: array[0..3] of Byte;
- VideoModePtr: Pointer;
- end;
-
- { Scan the supported mode table for the highest mode this card
- will provide
- }
-
- function GetHighestCap(
- Table: Pointer; Modes: Word; Size: Integer): Integer;
- near; assembler;
- asm
- XOR AX,AX
- LES DI, Table
- @@1:
- MOV SI, Modes
- ADD SI, Size
- ADD SI, Size
- MOV BX, ES:[DI]
- CMP BX, 0FFFFH
- JE @@4
- INC DI
- INC DI
- MOV CX,Size
- @@2:
- CMP BX,[SI]
- JZ @@3
- DEC SI
- DEC SI
- LOOP @@2
- @@3:
- CMP AX,CX
- JA @@1
- MOV AX,CX
- JMP @@1
- @@4:
- end;
-
- function DetectVesa16: Integer; far; assembler;
- var
- VesaInfo: array[0..255] of Byte;
- asm
- MOV AX,SS
- MOV ES,AX
- LEA DI,VesaInfo
- MOV AX,4F00H
- INT 10H
- CMP AX,004FH
- MOV AX,grError
- JNZ @@Exit
- CMP ES:[DI].VgaInfoBlock.VESASignature.Word[0], 'EV'
- JNZ @@Exit
- CMP ES:[DI].VgaInfoBlock.VESASignature.Word[2], 'AS'
- JNZ @@Exit
- LES DI,ES:[DI].VgaInfoBlock.VideoModePtr
- PUSH ES
- PUSH DI
- MOV AX, OFFSET Vesa16Modes
- PUSH AX
- MOV AX,3
- PUSH AX
- CALL GetHighestCap
- @@Exit:
- end;
-
- Procedure VESA16DriverProc; external;
- {$L VESA16.OBJ}
-
- Procedure Abort(Msg : string);
- begin
- Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
- Halt(1);
- end;
-
- Procedure LoadVESA;
- BEGIN
- VESA16 := InstallUserDriver('VESA16', @DetectVESA16);
- If RegisterBGIdriver(@VESA16DriverProc) < 0 then
- Abort('VESA16');
- END;
-
- BEGIN
- LoadVESA;
- END.