home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pctchnqs / 1991 / number5 / tvtsr / tvscreen.pas < prev    next >
Pascal/Delphi Source File  |  1991-10-27  |  6KB  |  232 lines

  1. { Copyright (c) 1991, TurboPower Software. All rights reserved.
  2.   These routines may be distributed freely and used within 
  3.   application programs (commercial or otherwise), but they may 
  4.   not be sold in unit form.}
  5. {$S-,R-}
  6. UNIT TvScreen;
  7. INTERFACE
  8.  
  9. TYPE
  10.   MouseState = RECORD
  11.     BufSize : Word;
  12.     Buffer : array[1..400] of Byte;
  13.   END;
  14.   MouseStatePtr = ^MouseState;
  15.  
  16. VAR
  17.   VideoSegment : Word;            {Base address of video memory}
  18.   ScreenWidth : Byte;             {Width of screen}
  19.   ScreenHeight : Byte;            {Height of screen}
  20.   CurrentMode : Byte;             {Current video mode}
  21.   CurrentPage : Byte;             {Current display page}
  22.   InTextMode : Boolean;           {False if in graphics mode}
  23.   MouseInstalled : Boolean;       {True if mouse is present}
  24.  
  25. PROCEDURE ReinitVideo;
  26. FUNCTION SaveScreen(VAR Covers : Pointer) : Boolean;
  27. PROCEDURE RestoreScreen(VAR Covers : Pointer);
  28. PROCEDURE GetCursorState(VAR XY, Scanlines : Word);
  29. PROCEDURE RestoreCursorState(XY, Scanlines : Word);
  30. FUNCTION MouseStateBufferSize : Word;
  31. PROCEDURE SaveMouseState(VAR MSP : MouseStatePtr);
  32. PROCEDURE RestoreMouseState(VAR MSP : MouseStatePtr);
  33. FUNCTION InitializeMouse : Boolean;
  34.  
  35. IMPLEMENTATION
  36.  
  37. CONST JunkValue = $FFFF;
  38.  
  39. PROCEDURE ReinitVideo; Assembler; {-Initializes VideoSegment.}
  40.   {Called automatically in initialization code.}
  41. ASM
  42.       MOV     AH,0Fh
  43.       INT     10h
  44.       MOV     CurrentMode,AL
  45.       MOV     ScreenWidth,AH
  46.       MOV     CurrentPage,BH
  47.       MOV     InTextMode,True
  48.       MOV     ScreenHeight,25
  49.       XOR     DX,DX
  50.       MOV     CX,0B000h
  51.       CMP     AL,7
  52.       JE      @GetDisplayType
  53.       MOV     CX,40h
  54.       MOV     ES,CX
  55.       MOV     CX,ES:[4Eh]
  56.       SHR     CX,1
  57.       SHR     CX,1
  58.       SHR     CX,1
  59.       SHR     CX,1
  60.       ADD     CX,0B800h
  61.       CMP     AL,3
  62.       JNA     @GetDisplayType
  63.       MOV     InTextMode,False
  64. @GetDisplayType:
  65.       MOV     VideoSegment,CX
  66.       MOV     CX,JunkValue
  67.       MOV     AX,1C00h
  68.       PUSH    BP
  69.       INT     10h
  70.       POP     BP
  71.       CMP     AL,1Ch
  72.       JE      @CheckHeight
  73.       MOV     BL,32h
  74.       MOV     AX,1200h
  75.       PUSH    BP
  76.       INT     10h
  77.       POP     BP
  78.       CMP     AL,12h
  79.       JE      @ExitPoint
  80.       MOV     BX,0FF10h
  81.       MOV     CX,JunkValue
  82.       MOV     AX,1200h
  83.       PUSH    BP
  84.       INT     10h
  85.       POP     BP
  86.       XOR     AL,AL
  87.       CMP     CX,JunkValue
  88.       JE      @ExitPoint
  89.       CMP     BH,1
  90.       JA      @ExitPoint
  91.       CMP     BH,1
  92.       JE      @CDegaMono
  93.       CMP     CurrentMode,7
  94.       JNE     @CheckHeight
  95.       JMP     @ExitPoint
  96. @CDegaMono:
  97.       CMP     CurrentMode,7
  98.       JE      @CheckHeight
  99. @CheckHeight:
  100.       MOV     CX,40h
  101.       MOV     ES,CX
  102.       MOV     CL,ES:[84h]
  103.       INC     CL
  104.       MOV     ScreenHeight,CL
  105. @ExitPoint:
  106. END;
  107.  
  108. PROCEDURE GetCursorState(VAR XY, Scanlines : Word); Assembler;
  109. ASM
  110.       MOV     BH,CurrentPage
  111.       MOV     AH,3
  112.       PUSH    BP
  113.       INT     10h
  114.       POP     BP
  115.       LES     DI,XY
  116.       MOV     ES:[DI],DX
  117.       LES     DI,Scanlines
  118.       MOV     ES:[DI],CX
  119. END;
  120.  
  121. PROCEDURE RestoreCursorState(XY, Scanlines : Word); Assembler;
  122. ASM
  123.       MOV     AH,1
  124.       MOV     CX,Scanlines
  125.       PUSH    BP
  126.       INT     10h
  127.       POP     BP
  128.       MOV     AH,2
  129.       MOV     BH,CurrentPage
  130.       MOV     DX,XY
  131.       PUSH    BP
  132.       INT     10h
  133.       POP     BP
  134. END;
  135.  
  136. FUNCTION SaveScreen(VAR Covers : Pointer) : Boolean;
  137. {-Allocate buffer space if requested and save window contents}
  138. VAR Size : Word;
  139. BEGIN
  140.   SaveScreen := False;
  141.   Size := Word(ScreenWidth) * ScreenHeight * 2;
  142.   IF Size > MaxAvail THEN Exit;
  143.   GetMem(Covers, Size);
  144.   IF Covers = Nil THEN Exit;
  145.   Move(Ptr(VideoSegment, 0)^, Covers^, Size);
  146.   SaveScreen := True;
  147. END;
  148.  
  149. PROCEDURE RestoreScreen(VAR Covers : Pointer);
  150. {-Restore screen contents and deallocate buffer space 
  151.   if requested}
  152. VAR Size : Word;
  153. BEGIN
  154.   Size := Word(ScreenWidth) * ScreenHeight * 2;
  155.   Move(Covers^, Ptr(VideoSegment, 0)^, Size);
  156.   FreeMem(Covers, Size);
  157. END;
  158.  
  159. FUNCTION InitializeMouse : Boolean; Assembler;
  160. ASM
  161.       MOV     AX,3533h
  162.       INT     21h
  163.       MOV     AX,ES
  164.       OR      BX,AX
  165.       JZ      @NoMouse
  166.       XOR     AX,AX
  167.       INT     33h
  168.       CMP     AX,-1
  169.       JNE     @NoMouse
  170.       MOV     AL,1
  171.       JMP     @ExitPoint
  172. @NoMouse:
  173.       MOV     AL,0
  174. @ExitPoint:
  175. END;
  176.  
  177. PROCEDURE MouseStatePrim(Save : Boolean; VAR Buffer); Assembler;
  178. ASM
  179.       LES     DX,Buffer
  180.       CMP     Save,1
  181.       JE      @Saving
  182.       MOV     AX,23
  183.       JMP     @MouseCall
  184. @Saving:
  185.       MOV     AX,22
  186. @MouseCall:
  187.       INT     33h
  188. END;
  189.  
  190. FUNCTION GetStorageSize : Word; Assembler;
  191. ASM
  192.       XOR     BX,BX
  193.       MOV     AX,21
  194.       INT     33h
  195.       MOV     AX,BX
  196. END;
  197.  
  198. FUNCTION MouseStateBufferSize : Word;
  199. VAR Size : Word;
  200. BEGIN
  201.   IF NOT MouseInstalled THEN MouseStateBufferSize := 0
  202.   ELSE BEGIN
  203.     Size := GetStorageSize;
  204.     IF Size <> 0 THEN Inc(Size, SizeOf(Word));
  205.     MouseStateBufferSize := Size;
  206.   END;
  207. END;
  208.  
  209. PROCEDURE SaveMouseState(VAR MSP : MouseStatePtr);
  210. VAR Size : Word;
  211. BEGIN
  212.   IF NOT MouseInstalled THEN Exit;
  213.   Size := MouseStateBufferSize;
  214.   IF (Size = 0) or (Size > MaxAvail) THEN Exit;
  215.   GetMem(MSP, Size);
  216.   MSP^.BufSize := Size;
  217.   MouseStatePrim(True, MSP^.Buffer);
  218. END;
  219.  
  220. PROCEDURE RestoreMouseState(VAR MSP : MouseStatePtr);
  221. VAR Size : Word;
  222. BEGIN
  223.   IF NOT MouseInstalled THEN Exit;
  224.   MouseStatePrim(False, MSP^.Buffer);
  225.   FreeMem(MSP, MSP^.BufSize);
  226. END;
  227.  
  228. BEGIN
  229.   ReinitVideo;
  230.   MouseInstalled := InitializeMouse;
  231. END.
  232.