home *** CD-ROM | disk | FTP | other *** search
- { 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.
-