community.borland.com

Article #15044: Direct Video Accessing

 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