Technical Information Database TI44D.txt - Direct Video Accessing Category :Turbo Pascal Platform :DOS Product : Description: Using Mem and MemW you may address any location on the screen and change its value. A possible use might be creating a memory mapped text editor. The following in an example of using Mem to address the text screen one byte at a time. (Exchange $B800 for $B000 if you have a monochrome screen.) program RAM2; Var j, i : integer; ch : char; begin j := 0; for i := 1 to 2048 do begin Mem[$B800:j] := $80; {Accessing video RAM Mem[$B800:j + 1] := $99 a byte at a time} j := j + 2 end; end. When accessing RAM addressing a word at a time using MemW, you must be aware of the following: 1. In text mode, when you enter a word value, it is broken down into two bytes which are placed on the screen. Consequently, word values must equal the sum of two bytes that you want sent consecutively to the screen. 2. You must first assign the low byte, then the high byte of the word. 3. You must increase the offset by two to access the next word in memory. MemArray program RAM1; Var j, i : integer; begin j := 0; for i := 1 to 2048 do begin MemW[$B800:j] := $9908; { Accessing video RAM a word at a time } j := j + 2; end; end. The following program demonstrates how to write directly to screen memory and save and restore text screens. These routines may cause snow on some monitors. There are routines in the Editor Toolbox to read and write to the screen without snow, but they are much harder to use and less intuitive than these ones. program ScreenTest; type { Row, Column } ScreenType = array [1..25, 1..80] of record Character : Char; Attribute : Byte; end; AnyString = string [80]; { Generic string type } { The attribute byte of this data structure is formatted as follows: Bits 0-3 hold the foreground color, bits 4-6 hold the background color, and bit 7 indicates whether blinking is on or off. Bit 0 1 2 3 4 5 6 7 Color Part FG FG FG FG BG BG BG BL Color Part Value 1 2 4 8 1 2 4 1 Bit Value (Decimal) 1 2 4 8 16 32 64 128 Bit Value (Hex) $01 $02 $04 $08 $10 $20 $40 $80 } var ColorScreen : ScreenType absolute $B800:0; { Use for color screen } MonoScreen : ScreenType absolute $B000:0; { Use for monochrome screen } SavedScreen : ScreenType; { Buffer to save the screen } function MakeAttribute(Foreground, Background : Byte; Blink : Boolean) : Byte; { Creates an attribute byte from a combination of foreground, background, and blinking attributes } begin MakeAttribute := Foreground + (Background shl 4) + (Ord(Blink) shl 7); end; { MakeAttribute } procedure WriteString(S : AnyString; var Screen : ScreenType; Col, Row, Attrib : Byte); { Writes a string into screen memory starting at a particular row and column, using Attrib as the color attribute. } var Counter : Byte; begin for Counter := 1 to Length(S) do begin Screen[Row, Pred(Col + Counter)].Character := S[Counter]; Screen[Row, Pred(Col + Counter)].Attribute := Attrib; end; end; { WriteString } begin SavedScreen := ColorScreen; { Save the current screen } Window(25, 5, 55, 15); { Create the new window } GotoXY(1, 1); { Move inside the new window } TextColor(Yellow); { Change the current colors } TextBackground(Red); ClrScr; { Clear the window and fill it with color } WriteString(' Press Return to continue...', ColorScreen, 25, 5, MakeAttribute(Yellow, Red, False)); { Write out prompt - note that WriteString uses the absolute row and column, not the row and column of the current window } Read; { Wait for return to be pressed } ColorScreen := SavedScreen; { Restore old screen } end. Reference: 3/30/99 3:53:27 PM
Last Modified: 01-SEP-99