[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
UNIT GrStuff; { Misc Graphic Functions, Last Updated Nov 11/93 }
{ Copyright (C), Greg Estabrooks, 1993 }
INTERFACE
(***********************************************************************)
FUNCTION MonitorType :BYTE; { Determines Monitor In Use }
PROCEDURE SetVidMode( Mode :BYTE ); { Set video mode }
PROCEDURE SetPage( Page :BYTE ); { Set current screen page }
PROCEDURE BiosPutPix( Col,Page :BYTE;X,Y :WORD ); { Plot pixel at X,Y }
FUNCTION TSeng :BOOLEAN; { Determine if graph card a TSENG labs }
FUNCTION GetVideoMode :BYTE;
{ Routine to determine current video mode }
PROCEDURE Set80x30Mode;
PROCEDURE DrawBar( X1,Y1,X2,Y2 :WORD; Color :BYTE );
PROCEDURE SetColor( Color2Set, Red, Green, Blue :BYTE );
PROCEDURE GetColor( Color2Get :BYTE; VAR Red,Green,Blue :BYTE );
IMPLEMENTATION
(***********************************************************************)
FUNCTION MonitorType :BYTE; ASSEMBLER;
{ Determines Type of Monitor In Use. }
ASM
Mov AH,$1A { Function Determine Display Code }
Mov AL,0 { AL,0 = Read Code AL,1 = Set Code }
Int $10 { Call Dos }
Mov AL,BL; { Move result to proper register }
{ 0 - no Display 4 - Ega Standard Color 7 - VGA MONO }
{ 1 - MDA 5 - Ega MonoChrome 8 - VGA }
{ 2 - CGA 6 - PGA }
END;{MonitorType}
PROCEDURE SetVidMode( Mode :BYTE ); ASSEMBLER;
{ Routine to set video mode }
ASM
Mov AH,00 { Function to set mode }
Mov AL,Mode { Mode to change to }
Int $10 { Call dos }
END;{SetVidMode}
PROCEDURE SetPage( Page :BYTE ); ASSEMBLER;
{ Routine to change screen pages }
ASM
Mov AH,$05 { Function to change pages }
Mov AL,Page { Page to change to }
Int $10 { Call dos }
END;{SetPage}
PROCEDURE BiosPutPix( Col,Page :BYTE; X,Y :WORD ); ASSEMBLER;
{ Routine to plot a pixel on the screen using INT 10h. }
ASM
Mov AH,$0C { Function to plot a pixel }
Mov AL,Col { Color to make it }
Mov BH,Page; { Page to write it to }
Mov CX,X { Column to put it at }
Mov DX,Y { Row to place it }
Int $10 { call dos }
END;{BiosPutPix}
FUNCTION TSeng :BOOLEAN;
{ Routine to determine if Graphics card is a TSENG labs}
VAR
Old,New :BYTE;
BEGIN
Old := Port[$3CD]; { Save original card register value }
Port[$3CD] := $55; { change it }
New := Port[$3CD]; { read in new value }
Port[$3CD] := Old; { restore old value }
TSENG := ( New = $55 ); { if value same as what we sent (TRUE) }
END;
FUNCTION GetVideoMode :BYTE; ASSEMBLER;
{ Routine to determine current video mode }
ASM
Mov AX,$0F00 { SubFunction Return Video Info }
Int $10 { Call Dos }
END;{GetVideoMode}
PROCEDURE Set80x30Mode;
VAR CrtcReg:ARRAY[1..8] OF WORD;
Offset :WORD;
I,Data :BYTE;
BEGIN
CrtcReg[1]:=$0C11; {Vertical Display End (unprotect regs. 0-7)}
CrtcReg[2]:=$0D06; {Vertical Total}
CrtcReg[3]:=$3E07; {Overflow}
CrtcReg[4]:=$EA10; {Vertical Retrace Start}
CrtcReg[5]:=$8C11; {Vertical Retrace End (& protect regs. 0-7)}
CrtcReg[6]:=$DF12; {Vertical Display Enable End}
CrtcReg[7]:=$E715; {Start Vertical Blanking}
CrtcReg[8]:=$0616; {End Vertical Blanking}
MemW[$0040:$004C]:=8192; {Change page size in bytes}
Mem[$0040:$0084]:=29; {Change page length}
Offset:=MemW[$0040:$0063]; {Base of CRTRC}
ASM
Cli {Clear Interrupts}
END;
FOR I:=1 TO 8 DO
PortW[Offset]:=CrtcReg[i]; {Load Registers}
Data:=PORT[$03CC];
Data:=Data AND $33;
Data:=Data OR $C4;
PORT[$03c2]:=Data;
ASM
Sti {Set Interrupts}
Mov AH,12h {Select alternate printing routine}
Mov BL,20h
Int 10h
END;
END; {Of Procedure}
PROCEDURE DrawBar( X1,Y1,X2,Y2 :WORD; Color :BYTE );
{ Bar drawing routine. Specifically set up for mode }
{ 13h. Much faster than the BGI one. }
VAR
Row :WORD;
BEGIN
FOR Row := Y1 TO Y2 DO
FillChar(MEM[$A000:(320*Row)+X1],X2-X1,Color);
END;
PROCEDURE SetColor( Color2Set, Red, Green, Blue :BYTE );
{ Routine to Change the palette value of Color2Set. }
BEGIN
PORT[$3C8] := Color2Set;
PORT[$3C9] := Red;
PORT[$3C9] := Green;
PORT[$3C9] := Blue;
END;
PROCEDURE GetColor( Color2Get :BYTE; VAR Red,Green,Blue :BYTE );
{ Routine to determine the Palette value of Color2Get}
BEGIN
PORT[$3C8] := Color2Get;
Red := PORT[$3C9];
Green := PORT[$3C9];
Blue := PORT[$3C9];
END;
BEGIN
END.
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]