[Back to SAVESCRN SWAG index] [Back to Main SWAG index] [Original]

    {
    I couldn't find your original message, but you could use this code fragment to
    save and restore a Text-mode screen.
    }

    (* global Vars *)
    Var
       vidSeg : Word;
       oldScr : Array[0..3999] of Byte;

    Function GetVidSeg : Word;
    Var
       mode : Byte;
       seg  : Word;
    begin
         seg := 0;
         mode := Mem[0 : $449];
         if (mode = 7) then seg := $B000;
         if (mode <= 3) then seg := $B800;
         if (mode in [4..6]) or (mode > 7) then begin
            (* the Program is not in the correct Text mode *)
            Halt(1);  (* return errorlevel of 1 *)
         end;
         GetVidSeg := seg;
    end;

    (* main Program *)
    begin
         vidSeg := GetVidSeg;
         Move(Mem[vidSeg : 0], oldScr[0], SizeOf(oldScr));
         (* the above line copies 4000 Bytes starting at $B000 : 0 For mono.
            or $B800 For colour into the Array 'oldScr' *)
         ClrScr;
         WriteLn('Press ENTER to restore the screen...');
         Readln;
         Move(oldScr[0], Mem[vidSeg : 0], SizeOf(oldScr));
         (* the above line copies the Array to video memory to restore the
            old screen *)
    end.

    {
    As you can see, video memory starts at offset 0 of either of two segments.  If
    the computer is colour, Text screen memory starts at $B800 : 0000 and if the
    computer is mono/herc, it starts at $B000 : 0000.  It is 4000 Bytes long.  Why?
     Because there are 2000 Characters on the screen (80 x 25), and each Character
    gets a colour attribute (foreground, background, (non)blinking).  The top-left
    Character, at row 1, column 1, is [vidSeg] : 0, and the next Byte,[vidSeg] : 1,
    is the attribute For the Character, so the memory is laid out like this:

    (offset 0) Char, attr, Char, attr, Char, attr.......Char, attr (offset 3999)
    }

[Back to SAVESCRN SWAG index] [Back to Main SWAG index] [Original]