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

{

   Very fast screen output in 80*25 mode by direct access to video memory


               ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
               º                                        º°
               º          AVONTURE CHRISTOPHE           º°
               º              AVC SOFTWARE              º°
               º     BOULEVARD EDMOND MACHTENS 157/53   º°
               º           B-1080 BRUXELLES             º°
               º              BELGIQUE                  º°
               º                                        º°
               ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ°
               °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°

}

Procedure WriteStr   (Texte : String);

Var Attribut : Word;
    Offset   : Word;
    i        : Byte;

Begin

     Attribut := ((TextAttr + (TextBack Shl 4)) shl 8);

     { The Pge variable is the current screen page -There is a function in
       interrupt 10h nammed GetActivePage- So you should code something like
       Pge := GetActivePage where GetActivePage is a function that call this
       interrupt. You can also set this variable manually so if you code
       Pge := 0 then the screen output will be made to the first screen; if
       you code Pge := 1, this output will be made to the second screen, and
       so on until 7.  Be carefull: if the active screen page is the third
       and you have code Pge := 0 then you can't see the output because
       there are made on an invisible video page. }

     offset := WhereY * 160 + WhereX Shl 1 + (Pge shl 12);

     For i:= 1 to Length (Texte) do
         Begin
            MemW[$B800:Offset] := Attribut or ord(Texte[i]);
            Inc (Offset,2);
         End;

     GotoXy (WhereX + Length(Texte), WhereY);

End;


Procedure WriteStrLn   (Texte : String);

Var Attribut : Word;
    Offset   : Word;
    i        : Byte;

Begin

     Attribut := (((TextBack Shl 4) + TextAttr) shl 8);

     { The Pge variable is the current screen page -There is a function in
       interrupt 10h nammed GetActivePage- So you should code something like
       Pge := GetActivePage where GetActivePage is a function that call this
       interrupt. You can also set this variable manually so if you code
       Pge := 0 then the screen output will be made to the first screen; if
       you code Pge := 1, this output will be made to the second screen, and
       so on until 7.  Be carefull: if the active screen page is the third
       and you have code Pge := 0 then you can't see the output because
       there are made on an invisible video page. }

     offset := WhereY * 160 + WhereX Shl 1 + (Pge shl 12);

     For i:= 1 to Length (Texte) do
         Begin
            MemW[$B800:Offset] := Attribut or ord(Texte[i]);
            Inc (Offset,2);
         End;

     GotoXy (0, WhereY+1);

End;

Procedure WriteStrXY (X, Y, TAttr, TBack : Word; Text : String);

{ Ecrit sur la page sp‚cifi‚e, le texte donn‚}

Var Offset   : Word;
    I        : Byte;
    Attr     : Word;
    AdressP  : Word Absolute $0040:$004E;{Address of the Active Screen Page}

Begin

    Offset := Y * 160 + X Shl 1 + AdressP;
    Attr := ((TAttr+(TBack Shl 4)) Shl 8);

    For I := 1 to Length (Text) Do
        Begin
           MemW[RamVideo:Offset] := Attr OR Ord(Text[I]);
           Inc (Offset,2);
        End;

End;

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