Programowanie w języku Pascal » FAQ

Podwójne buforowanie w trybie tekstowym

  • 2007-04-23 22:20
  • 1 komentarz
  • 722 odsłony
  • Oceń ten tekst jako pierwszy
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.

1 komentarz

Marooned 2007-04-23 01:55

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