home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
magazine
/
pctchnqs
/
1991
/
number5
/
tvtsr
/
tvscreen.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-10-27
|
6KB
|
232 lines
{ Copyright (c) 1991, TurboPower Software. All rights reserved.
These routines may be distributed freely and used within
application programs (commercial or otherwise), but they may
not be sold in unit form.}
{$S-,R-}
UNIT TvScreen;
INTERFACE
TYPE
MouseState = RECORD
BufSize : Word;
Buffer : array[1..400] of Byte;
END;
MouseStatePtr = ^MouseState;
VAR
VideoSegment : Word; {Base address of video memory}
ScreenWidth : Byte; {Width of screen}
ScreenHeight : Byte; {Height of screen}
CurrentMode : Byte; {Current video mode}
CurrentPage : Byte; {Current display page}
InTextMode : Boolean; {False if in graphics mode}
MouseInstalled : Boolean; {True if mouse is present}
PROCEDURE ReinitVideo;
FUNCTION SaveScreen(VAR Covers : Pointer) : Boolean;
PROCEDURE RestoreScreen(VAR Covers : Pointer);
PROCEDURE GetCursorState(VAR XY, Scanlines : Word);
PROCEDURE RestoreCursorState(XY, Scanlines : Word);
FUNCTION MouseStateBufferSize : Word;
PROCEDURE SaveMouseState(VAR MSP : MouseStatePtr);
PROCEDURE RestoreMouseState(VAR MSP : MouseStatePtr);
FUNCTION InitializeMouse : Boolean;
IMPLEMENTATION
CONST JunkValue = $FFFF;
PROCEDURE ReinitVideo; Assembler; {-Initializes VideoSegment.}
{Called automatically in initialization code.}
ASM
MOV AH,0Fh
INT 10h
MOV CurrentMode,AL
MOV ScreenWidth,AH
MOV CurrentPage,BH
MOV InTextMode,True
MOV ScreenHeight,25
XOR DX,DX
MOV CX,0B000h
CMP AL,7
JE @GetDisplayType
MOV CX,40h
MOV ES,CX
MOV CX,ES:[4Eh]
SHR CX,1
SHR CX,1
SHR CX,1
SHR CX,1
ADD CX,0B800h
CMP AL,3
JNA @GetDisplayType
MOV InTextMode,False
@GetDisplayType:
MOV VideoSegment,CX
MOV CX,JunkValue
MOV AX,1C00h
PUSH BP
INT 10h
POP BP
CMP AL,1Ch
JE @CheckHeight
MOV BL,32h
MOV AX,1200h
PUSH BP
INT 10h
POP BP
CMP AL,12h
JE @ExitPoint
MOV BX,0FF10h
MOV CX,JunkValue
MOV AX,1200h
PUSH BP
INT 10h
POP BP
XOR AL,AL
CMP CX,JunkValue
JE @ExitPoint
CMP BH,1
JA @ExitPoint
CMP BH,1
JE @CDegaMono
CMP CurrentMode,7
JNE @CheckHeight
JMP @ExitPoint
@CDegaMono:
CMP CurrentMode,7
JE @CheckHeight
@CheckHeight:
MOV CX,40h
MOV ES,CX
MOV CL,ES:[84h]
INC CL
MOV ScreenHeight,CL
@ExitPoint:
END;
PROCEDURE GetCursorState(VAR XY, Scanlines : Word); Assembler;
ASM
MOV BH,CurrentPage
MOV AH,3
PUSH BP
INT 10h
POP BP
LES DI,XY
MOV ES:[DI],DX
LES DI,Scanlines
MOV ES:[DI],CX
END;
PROCEDURE RestoreCursorState(XY, Scanlines : Word); Assembler;
ASM
MOV AH,1
MOV CX,Scanlines
PUSH BP
INT 10h
POP BP
MOV AH,2
MOV BH,CurrentPage
MOV DX,XY
PUSH BP
INT 10h
POP BP
END;
FUNCTION SaveScreen(VAR Covers : Pointer) : Boolean;
{-Allocate buffer space if requested and save window contents}
VAR Size : Word;
BEGIN
SaveScreen := False;
Size := Word(ScreenWidth) * ScreenHeight * 2;
IF Size > MaxAvail THEN Exit;
GetMem(Covers, Size);
IF Covers = Nil THEN Exit;
Move(Ptr(VideoSegment, 0)^, Covers^, Size);
SaveScreen := True;
END;
PROCEDURE RestoreScreen(VAR Covers : Pointer);
{-Restore screen contents and deallocate buffer space
if requested}
VAR Size : Word;
BEGIN
Size := Word(ScreenWidth) * ScreenHeight * 2;
Move(Covers^, Ptr(VideoSegment, 0)^, Size);
FreeMem(Covers, Size);
END;
FUNCTION InitializeMouse : Boolean; Assembler;
ASM
MOV AX,3533h
INT 21h
MOV AX,ES
OR BX,AX
JZ @NoMouse
XOR AX,AX
INT 33h
CMP AX,-1
JNE @NoMouse
MOV AL,1
JMP @ExitPoint
@NoMouse:
MOV AL,0
@ExitPoint:
END;
PROCEDURE MouseStatePrim(Save : Boolean; VAR Buffer); Assembler;
ASM
LES DX,Buffer
CMP Save,1
JE @Saving
MOV AX,23
JMP @MouseCall
@Saving:
MOV AX,22
@MouseCall:
INT 33h
END;
FUNCTION GetStorageSize : Word; Assembler;
ASM
XOR BX,BX
MOV AX,21
INT 33h
MOV AX,BX
END;
FUNCTION MouseStateBufferSize : Word;
VAR Size : Word;
BEGIN
IF NOT MouseInstalled THEN MouseStateBufferSize := 0
ELSE BEGIN
Size := GetStorageSize;
IF Size <> 0 THEN Inc(Size, SizeOf(Word));
MouseStateBufferSize := Size;
END;
END;
PROCEDURE SaveMouseState(VAR MSP : MouseStatePtr);
VAR Size : Word;
BEGIN
IF NOT MouseInstalled THEN Exit;
Size := MouseStateBufferSize;
IF (Size = 0) or (Size > MaxAvail) THEN Exit;
GetMem(MSP, Size);
MSP^.BufSize := Size;
MouseStatePrim(True, MSP^.Buffer);
END;
PROCEDURE RestoreMouseState(VAR MSP : MouseStatePtr);
VAR Size : Word;
BEGIN
IF NOT MouseInstalled THEN Exit;
MouseStatePrim(False, MSP^.Buffer);
FreeMem(MSP, MSP^.BufSize);
END;
BEGIN
ReinitVideo;
MouseInstalled := InitializeMouse;
END.