Podwójne buforowanie w trybie tekstowym

fatalbomb

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

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:

Scrn := MyScreen;

W każdej zmiennej tablicy wyższy bajt określa atrybuty, a niższy znak. Mamy zatem:

bit 0 - miganie lub najstarszy bit koloru tła

bity 1-3 - kolor tła

bity 4-7 - kolor tekstu

bity 8-15 - znak

Możemy zatem dać kod:

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:

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.

FAQ

1 komentarz

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