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.
bit 0 wcale nie musi oznaczać migania
http://www.ctyme.com/intr/rb-0117.htm