DEFINITION MODULE Screen; (********************************************************) (* *) (* Low-level screen functions *) (* *) (* Programmer: P. Moylan *) (* Last edited: 31 January 1995 *) (* Status: Working *) (* *) (********************************************************) (************************************************************************) (* *) (* WARNING WARNING WARNING *) (* *) (* The operations performed by this module are among the rare examples *) (* where a programming error can cause physical damage to the *) (* hardware. Do NOT attempt to modify anything in this module unless *) (* you have a detailed understanding of how the video adaptors work. *) (* In particular, beware of putting inappropriate values into the *) (* registers of the 6845 video controller. *) (* *) (* It is normal for the screen picture to "bloom" or "bounce" after *) (* a mode change (e.g. changing from a text mode to a graphics mode). *) (* Some monitors are worse than others for this, but all should *) (* regain synchronism after a second or so. A bright dot at the *) (* centre of the screen or a "tearing" effect are NOT normal; if the *) (* screen display goes crazy you should turn off the monitor and/or *) (* reset the computer immediately, since it probably means that the *) (* software is not compatible with your hardware. *) (* *) (* The procedures in this module are for the use of other library *) (* modules such as Graphics and Windows. They should not normally *) (* be called directly from applications programs. *) (* *) (* DISCLAIMER: This software is supplied "as is" with no warranty as *) (* to its compatibility with your hardware. It has been tested on a *) (* small sample of computers, but because of the wide variety of *) (* video adaptors on the market it is impossible to be certain that *) (* it will work correctly on all hardware configurations. *) (* *) (************************************************************************) CONST HercGraphics = 128+7; TYPE (* This is a list of all the adaptors this module can recognise. *) (* Note: the value "SVGA" means that we've found more modes beyond *) (* the standard VGA set (e.g. because we've found a VESA driver), *) (* but we haven't made a more specific hardware identification. *) VideoAdaptorType = (MDA, Hercules, CGA, EGA, VGA, SVGA, ATI, S3, Trident); (* A record type for storing mode properties. *) ModeInfoType = RECORD MaxX, MaxY, MaxColour, LastCharRow: CARDINAL; BitsPerPixel, BytesPerRow, FramesPerScreen: CARDINAL; Planar, MultiBank, TextMode: BOOLEAN; END (*RECORD*); (************************************************************************) PROCEDURE VideoKind (): VideoAdaptorType; (* Returns the display adaptor type. This is a best guess, and it *) (* is possible that some adaptor types will be misclassified. *) (* In the present version, most SVGA adaptors will be reported as *) (* VGA or SVGA rather than something more specific; and no *) (* distinction is drawn between the "ordinary" Hercules adaptor and *) (* the Hercules Plus or Hercules InColor. *) PROCEDURE VESAdriverPresent (): BOOLEAN; (* Returns TRUE iff a VESA driver was detected. *) PROCEDURE Supported (mode: CARDINAL): BOOLEAN; (* Returns TRUE iff the specified mode is a mode supported *) (* by the hardware and by this module. *) PROCEDURE SetVideoMode (newmode: CARDINAL; ClearScreen: BOOLEAN): BOOLEAN; (* Sets the video mode. The mode numbers are as defined in the *) (* BIOS, plus HercGraphics to denote the Hercules graphics mode, *) (* plus whatever the VESA BIOS (if present) will support. *) (* For VESA modes, GetModeInfo should subsequently be called to *) (* ensure that bank switching functions are correctly set up. *) (* Returns TRUE iff the mode change was successful. *) (* Warning: the option ClearScreen=FALSE sometimes produces some *) (* strange effects, apparently because of some aspect of the BIOS *) (* that I don't yet understand. *) PROCEDURE GetModeInfo (mode: CARDINAL; VAR (*OUT*) result: ModeInfoType); (* Returns information about the given mode. If the information *) (* is not available, the parameter values are left unchanged. *) (* Deliberate side-effect: for a VESA mode, this procedure also *) (* initialises the bank switching. *) PROCEDURE RestoreOriginalMode; (* Sets the video mode back to what it was before this program ran. *) PROCEDURE SelectReadBank (bank: CARDINAL); (* Switches to a new bank of screen memory for reading. Should be *) (* used only with the adaptors which support the high-resolution *) (* modes using bank switching. *) PROCEDURE SelectWriteBank (bank: CARDINAL); (* Switches to a new bank of screen memory for writing. Should be *) (* used only with the adaptors which support the high-resolution *) (* modes using bank switching. *) PROCEDURE GetAddresses (VAR (*OUT*) ScreenSegment, IObase: CARDINAL); (* Returns the segment of the screen memory and the port number *) (* of the video controller. (Note that these could be different *) (* for different modes.) *) PROCEDURE WaitForVerticalRetrace; (* Busy wait until we reach the vertical retrace period. *) (* Warning: I wrote this quickly for one specific application, and *) (* haven't gotten around to checking it for the general case. *) END Screen.