Podwójne buforowanie w trybie tekstowym

fatalbomb

Kiedy chcemy zrobić podwójne buforowanie w trybie tekstowym, musimy zadeklarować pewne zmienne:<BR>

type TScreen = Array [1..25, 1..80] of Word;
var Scrn: TScreen absolute $B800:0000;
    MyScreen: TScreen;

Teraz nie modyfikujemy zawartości ekranu. Zmieniamy to, co mamy w MyScreen, a po rysowaniu piszemy: <BR>

Scrn := MyScreen;

W każdej zmiennej tablicy wyższy bajt określa atrybuty, a niższy znak. Mamy zatem:<BR>
bit 0 - miganie lub najstarszy bit koloru tła<BR>
bity 1-3 - kolor tła<Br>
bity 4-7 - kolor tekstu<BR>
bity 8-15 - znak<BR>

Możemy zatem dać kod:<BR>

procedure WriteChar (X,Y:Byte Attr:Byte; Ch:Char);
begin
 MyScreen [Y,X] := Attr shl 8 + Ord (Ch);
end;

Na koniec jeszcze możemy zautomatyzować rysowanie ekranu. Program będzie automatycznie rysował ekran co 18.2 sekundy:<BR>

uses Dos;
var OldInt1Ch:Procedure;
...
procedure DrawScreen; interrupt;
begin
 Scrn := myScreen;
end;
...
begin
 GetIntVec ($1C, @OldInt1Ch);
 SetIntVec ($1C, @DrawScreen);
 ...
 ...
 SetIntVec ($1C, @OldInt1Ch);
end.

Ustawiamy wektor przerwania zegara czasu rzeczywistego (1Ch) na naszą procedurę, uprzednio zapisawszy poprzedni. Na koniec musimy przywrócić stare odwołanie, w przeciwnym razie po wyjściu z programu komputer się powiesi. Słowo kluczowe interrupt też jest konieczne, bez niego też mogą dziać się dziwne rzeczy, a jest to błąd trudny do wykrycia.

1 komentarz

bit 0 wcale nie musi oznaczać migania
http://www.ctyme.com/intr/rb-0117.htm