Moduł ”CRT”
Moduł CRT zawiera funkcje i procedury, które pozwalają sterować trybami ekranu, posługiwać się kodami znaków rozszerzonej klawiatury, kolorami i dźwiękiem. Zastosowanie tych funkcji i procedur w programie lub module wymaga deklaracji modułu CRT za pomocą konstrukcji uses.
Zainicjowanie modułu CRT (poprzez jego deklarację) powoduje skojarzenie standardowych plików tekstowych INPUT i OUTPUT z urządzeniem tekstowym CRT (implementowanych przez moduł CRT) .Jego główną funkcją, podobnie jak DOS-owskiego urządzenia CON (konsola), jest łączenie operacji klawiaturowych i ekranowych. W porównaniu jednak z konsolą, urządzenie CRT jest dużo szybsze, a ponadto zapewnia możliwość operowania kolorami i oknami. Zainicjowanie modułu CRT równoważne jest wykonaniu na plikach INPUT i OUTPUT instrukcji:
AssignCrt (INPUT, `');
Reset (INPUT);
AssignCrt (OUTPUT,'');
Reset (OUTPUT);
w celu przywrócenia plikowi INPUT i OUTPUT ich standardowych skojarzeń należy w sposób jawny dokonać skojarzenia i otwarcia, tj. zastosować instrukcje: AssignCrt (INPUT, `');
Reset (INPUT);
AssignCrt (OUTPUT,'');
Reset (OUTPUT);
Jak już wcześniej wspomniałem, zastosowanie modułu CRT daje możliwość tworzenia okien. Oknem nazywamy wydzieloną część ekranu, działającą identycznie jak ekran i pozostawiającą pozostałą część ekranu nienaruszoną. Można powiedzieć, że okno jest to ekran na ekranie. Do utworzenia okna służy procedura Window. Oknem domyślnie przyjmowanym przez system jest cały ekran.
Podczas zapisu do pliku OUTPUT (przy deklaracji modułu CRT ) lub innego pliku tekstowego skojarzonego z CRT, specjalne znaczenie posiadają cztery znaki sterujące. Są to: #7, #8, #10, #13. Znak:
#7 - powoduje wygenerowanie dźwięku brzęczka (ang. beep) z wewnętrznego głośnika;
#8 - powoduje przesunięcie kursora o jeden znak w lewo (ang. backspace ), przy czym jeżeli kursor znajduje się przy lewej krawędzi bieżącego okna, to znak ten nie spowoduje żadnego działania;
#10 - powoduje przesunięcie kursora o jeden wiersz w dół, przy czym jeżeli kursor znajduje się w wierszu przy dolnej krawędzi bieżącego okna, to nastąpi przesunięcie całej zawartości okna do góry;
#13 - powoduje przesunięcie kursora do lewej krawędzi bieżącego okna.
Podczas odczytu z pliku INPUT lub innego pliku tekstowego skojarzonego z CRT tekst wprowadzony jest wierszami. Podczas tego wprowadzenia dozwolone jest stosowanie następujących klawiszy edytorskich:
← (backspace) lub Ctrl-S - usuwa ostatnio wprowadzony znak;
Esc lub Ctrl-A - usuwa cały wiersz;
Enter - wprowadza wiersz do bufora wraz ze znakiem jego
końca (CR/LF);
Ctrl-D - powoduje powtórzenie ostatniego napisanego znaku;
Crtl-F - powoduje powtórzenie ostatniego wprowadzonego
wiersza;
Ctrl-Z - kończy wprowadzony wiersz i generuje znak końca
zbioru.
PREDEFINIOWANE IDENTYFIKATORY MODUŁU CRT
W module CRT zdefiniowane są stałe i zmienne, wykorzystywane przez standardowe funkcje i procedury tego modułu, które określają m.in. tryb ekranu, kolory, a także spełniają funkcje kontrolne, przechowują atrybuty zbiorów i współrzędne okna. Oczywiście, jak wszystkie predefiniowane stałe, typy i zmienne, mogą one być wykorzystane przez programistę w inny sposób.
Stałe trybów CRT
Stałe te wykorzystywane są przez procedurę TextMode do określenia trybu pracy ekranu i zdefiniowane są następująco:
const BW4O = 0; C040 = 1; BW8O = 2; C080 = 3; Mono = 7; Font8x8 = 256; C40 = C040; C80 = C080;
Pierwsze cztery i ostatnie dwie stałe służą do oznaczenia trybów tekstowych dostępnych na karcie CGA (IBM PC Co1or/Graphics Adapter):
BW4O - tryb czarno-biały, 40 kolumn i 25 wierszy,
C040 (C40) - tryb kolorowy, 40 kolumn i 25 wierszy,
BW80 - tryb czarno-biały, 80 kolumn i 25 wierszy,
C080 (C80) - tryb kolorowy, 80 kolumn i 25 wierszy.
Stała Mono oznacza tryb czarno-biały o 80 kolumnach i 25 wierszach, dostępny na karcie IBM PC Monochrome Adapter, a stała Font8x8 służy do oznaczania trybu kolorowego o 43 (50) wierszach dla karty EGA (VGA).
Stałe kolorów tekstu
Stałe kolorów tekstu wykorzystywane do oznaczania kolorów w procedurach TextColor i TextBackground. Ich definicja jest następująca (z prawej strony podaję polskie nazwy kolorów):
const Black = 0; - czarny
Blue = 1; - niebieski
Green = 2; - zielony
Cyan = 3; - turkusowy
Red = 4; - czerwony
Magenta = 5; - karmazynowy
Brown = 6; - brązowy
LightGray = 7; - jasnoszary
DarkGray = 8; - ciemnoszary
LightBlue = 9; - jasnoniebieski
LightGreen = 10; - jasnozielony
LightCyan = 11; - jasnoturkusowy
LightRed = 12; - jasnoczerwony
LightMagenta = 13; - jasnokarmazynowy
Yellow = 14; - ¿ó³ty
White = 15; - bia³y
Blink = 128;
Kolory posiadają wartości od 0 do 15. W tekstowych trybach kolorowych kolor pierwszoplanowy (tusz znaków) może być jednym z podanych 16 kolorów, a ko1or tła - jednym z pierwszych ośmiu kolorów. Ponadto każdy znak w danym kolorze może migotać, co można osiągnąć przez zastosowanie wyrażenia Blink + dowolny kolor.
Zmienna CheckBreak
Wartość tej zmiennej, zdefiniowanej następująco:
var CheckBreak : Boolean;
określa włączenie lub wyłączenie kontroli naciśnięcia klawiszy Ctrl-Break. Jeśli wartością zmiennej CheckBreak jest True, to naciśnięcie klawiszy CtrlBreak spowoduje przerwanie wykonywania programu z chwilą następnego wyprowadzania tekstu na ekran monitora. Gdy wartością zmiennej jest False, to naciśnięcie klawiszy Ctrl-Break nie powoduje żadnego działania. Standardowo dla zmiennej CheckBreak jest przyjmowana wartość True.
Zmienna CheckEOF
Zmienna ta służy do włączania lub wyłączania opcji generowania znaku końca zbioru po naciśnięciu klawiszy Ctrl-Z i zdefiniowana jest następująco:
var CheckEOF : Boolean;
Jeśli wartością zmiennej jest True to po naciśnięciu klawiszy Ctrl-Z podczas czytania z pliku skojarzonego z CRT zostanie wygenerowany znak końca zbioru. Gdy wartością zmiennej jest False, co przyjmowane jest standardowo, naciśnięcie wspomnianych klawiszy nie powoduje żadnego działania.
Zmienna CheckSnow
Zmienna CheckSnow służy do włączenia lub wyłączenia kontroli "śnieżenia" (interferencji) podczas zapamiętywania znaków bezpośrednio w pamięci ekranu. Zjawisko "śnieżenia" dotyczy tylko karty CGA.
Definicja zmiennej CheckSnow jest następująca:
var CheckSnow : Boolean;
Po każdym wyborze trybu kolorowego zmiennej tej przypisywana jest wartość True, oznaczająca kontrolę zjawiska "śnieżenia". Wartość zmiennej CheckSnow nie ma żadnego znaczenia, gdy wartością zmiennej DirectVideo jest False.
Zmienna DirectVideo
Definicja tej zmiennej jest następująca:
var DirectVideo : Boolean;
Gdy wartością zmiennej jest True, co przyjmowane jest standardowo, to zapisywanie do zbiorów skojarzonych z CRT będzie powodowało umieszczanie kolejnych znaków bezpośrednio w pamięci ekranu. Jeśli natomiast wartością zmiennej DirectVideo jest False, to wypisywanie wszystkich znaków na ekranie odbywa się poprzez odwołania do BIOS (skr. ang. Basic Input/Output System - Podstawowy System Wejścia/Wyjścia), co jest procesem znacznie wolniejszym.
Zmienna LastMode
Zmienna ta służy do zapamiętania bieżącego trybu CRT podczas każdej zmiany tego trybu za pomocą procedury TextMode i zdefiniowana jest następująco:
var LastMode : Word;
Zmienna LastMode jest inicjowana po uruchomieniu każdego programu.
Zmienna TextAttr
W zmiennej tej przechowywane są bieżące atrybuty wyświetlanego tekstu. Definicja zmiennej jest następująca:
var TextAttr : Byte;
Zwykle wartość tej zmiennej, tj. atrybuty tekstu, ustalane są za pomocą wywołań procedur TextCoior- i TextBackground. Możliwe jest jednak także bezpośrednie przypisanie zmiennej TextAttr odpowiedniej wartości.
Zmienne WindMin i WindMax
Zmienne te służą do przechowywania współrzędnych bieżącego okna i zdefiniowane są następująco:
var WindMin,WindMax : Word;
Wartością zmiennej WindMin są współrzędne lewego górnego narożnika okna, a zmiennej WindMax - dolnego prawego narożnika, przy czym współrzędna x (odcięta) pamiętana jest w drugim bajcie, a współrzędna y (rzędna) - w pierwszym bajcie (zmiena typu Word zajmuje dwa bajty pamięci). Wartości obu zmiennych mogą być ustalone poprzez bezpośrednie przypisanie lub wywołanie procedury Window.
FUNKCJE I PROCEDURY MODUŁU CRT
Do kojarzenia plików tekstowych z urządzeniem CRT, implementowanym przez moduł CRT, służy procedura AssignCrt, której wywołanie ma postać:
AssignCrt (zmienna-plikowa-tekstowa).
Wyboru trybu pracy ekranu dokonuje się poprzez wywołanie procedury TextMode postaci:
TextMode (tryb),
gdzie tryb oznacza wielkość typu Integer (w ogólności może to być wyrażenie). Najczęściej stosuje się tu stałe trybów CRT. Podanie wartości innej niż wartości tych stałych powoduje automatyczne przyjęcie stałej CO80, a więc przyjęcie trybu kolorowego o 80 kolumnach i 25 wierszach.
Wywołanie procedury TextMode powoduje automatycznie przyjęcie za okno całego ekranu, przypisanie predefiniowanym zmiennym DirectVideo i CheckSnow wartości True (w przypadku drugiej zmiennej przy założeniu, że wybrano tryb kolorowy pracy ekranu) oraz ustalenie atrybutu bieżącego tekstu na "normalny", co oznacza normalną jaskrawość znaków pojawiających się na ekranie (ten sam efekt można uzyskać za pomocą wywołania procedury NormVideo).
Ustalenie poprzedniego trybu pracy ekranu (po jego zmianie) otrzymuje się przez wywołanie procedury TextMode dla zmiennej LastMode. Tego typu postępowanie zwykle stosuje się po powrocie do trybu tekstowego z trybu graficznego .
Przykład:
1) Wywołanie:
TextMode (CO40);
powoduje ustalenie kolorowego trybu pracy ekranu o 40 kolumnach i 25 wierszach (CO40 jest predefiniowaną stałą). Ten sam efekt uzyska się po przez wywołanie:
TextMode (1);
lub
TextMode (C40);
2) Jeśli w programie zadeklarowano zmienną;
var tryb_początkowy : Word;
i pierwszą instrukcją programu będzie:
tryb_początkowy:=LastMode;
to - po jednej lub kilku zmianach trybu pracy ekranu - w dowolnym miejscu programu można zainicjować tryb początkowy przez wywołanie:
TextMode (tryb_początkowy);
Do ustalenia koloru znaków pojawiających się na ekranie służy procedura TextColor, której wywołanie ma postać:
TextColor (kolor),
gdzie kolor oznacza wielkość całkowitą typu Byte, przy czym najczęściej jest to stała koloru tekstu. Wywołanie procedury TextColor powoduje również przypisanie drugiej połowie bajtu zmiennej TextAttr, tj. bitom 0-3, wyspecyfikowanej wartości kolor, a jeśli wartość ta jest większa od 15, to dodatkowo przypisywana jest wartość 1 bitowi migotania, tj. bitowi 7 (w przeciwnym przypadku bit ten ma wartość 0).
Przykład 1.
1) W celu wyboru koloru czerwonego dla znaków należy zastosować instrukcję:
TextColor (Red); lub TextColor (4);
Żółty migający kolor znaków uzyskamy poprzez każde z wywołań:
TextColor (Yellow+Blink);
TextColor (14+Blink);
TextColor (Yellow+128);
TextColor (142);
TextColor (30);
Tło wyświetlanych znaków ustala się za pomocą procedury TextBackground o wywołaniu:
TextBackground (kolor),
przy czym kolor musi tu być wielkością całkowitą (typu Byte) o wartości z przedziału [0,7) (może to być jedna z ośmiu pierwszych stałych koloru). Wywołanie procedury TextBackground powoduje także przypisanie bitom 4-6 predefiniowanej zmiennej TextAttr wyspecyfikowanej wartości kolor.
Za pomocą bezparametrowej procedury NormVideo uzyskuje się z powrotem wartość predefiniowanej zmiennej TextAttr w momencie rozpoczęcia wykonywania programu. Powoduje to ustalenie takiego koloru dalszych wyświetlanych znaków i ich tła, jaki obowiązywał na początku programu (biały kolor znaków na czarnym tle).
Dwie kolejne bezparametrowe procedury, HighVideo i LowVideo, powodują zmianę wartości drugiej połowy bajtu (czterech ostatnich bitów) predefiniowanej zmiennej TextAttr. Wywołanie procedury HighVideo powoduje zmianę wartości 0-7 na 8-15, co objawia się zwiększeniem jaskrawości koloru znaku. Natomiast wywołanie procedury LowVideo zmienia wartości 8-15 na 0-7, co z kolei objawia się zmniejszeniem jaskrawości znaku.
Moduł CRT umożliwia zdefiniowanie na ekranie okna. Do tego celu służy procedura Window, której wywołanie jest następujące:
Window (xl,yl,x2,y2),
gdzie wszystkie wielkości (w ogólności mogą to być wyrażenia) powinny być typu Byte. xl i yl określają współrzędne lewego górnego narożnika okna, a x2 i y2 - prawego dolnego narożnika (obrazuje to poniższy rysunek przedstawiający ekran). W trybie ekranu 80-kolumnowym standardowo przyjmowanym oknem jest (1,1,80,25), a w trybie 40-kolumnowym - (1,1,40,25). W obu zatem przypadkach standardowym oknem jest cały ekran. Najmniejszym możliwym oknem jest okno składające się z jednej kolumny i jednego wiersza, tj. określone argumentami (1,1,1,1). Jeśli argumenty w wywołaniu procedury Window przekraczają dozwolone dla danego trybu współrzędne, tj. nie są spełnione warunki:
xl ≤ x2 , y1 ≤ y2 , x2 ≤ xmax , y2 ≤ 25 ,
gdzie xmax=40 dla trybu 40-kolumnowego i xmax=80 dla trybu 80-kolumnowego, to wywołanie jest ignorowane.
Procedura GotoXY umieszcza kursor w bieżącym oknie. Jej wywołanie ma postać:
GotoXY (x,y),
gdzie x i y oznaczają współrzędne w oknie (muszą to być wielkości typu Byte), przy czym współrzędne lewego górnego narożnika okna wynoszą (1,1).
Przykład 2.
Wykonanie instrukcji:
Window (10,10, 40,15);
GotoXY (1,1);
spowoduje usytuowanie kursora w lewym górnym narożniku zdefiniowanego okna, tj. w miejscu o bezwzględnych współrzędnych (10,10).
Informację o aktualnym położeniu kursora w oknie można uzyskać za pomocą bezparametrowych funkcji WhereX i WhereY o wartościach typu Byte. Wywołanie pierwszej z tych funkcji daje wartość współrzędnej x (odciętej), a wywołanie drugiej - współrzędnej y (rzędnej). Należy podkreślić, że obie te wartości podawane są względem bieżącego okna, a nie całego ekranu.
Bezparametrowa procedura ClrScr służy do wymazania zawartości bieżącego okna. Jeśli przed jej wywołaniem nie określono rozmiaru okna (za pomocą procedury Window), to wyczyszczona zostanie zawartość całego ekranu (z tego powodu procedurę ClrScr stosuje się często na początku programów). Po zastosowaniu procedury kolorem tła bieżącego okna będzie aktualny kolor tła.
Przykład 3.
Wykonanie instrukcji:
TextBackground (Blue); Window (10,15,30,20); ClrScr;
spowoduje wyczyszczenie na ekranie prostokąta 20x5 o współrzędnych lewego
górnego narożnika (10,15), przy czym kolorem tła całego prostokąta będzie, kolor niebieski.
Do wymazania znaków od aktualnego położenia kursora do końca bieżącego wiersza służy bezparametrowa procedura CrlEol. Pozycja kursora nie ulega przy tym zmianie.
Dwie kolejne bezparametrowe procedury, DelLine i InsLine, pozwalają odpowiednio wymazać wiersz i wstawić pusty wiersz w miejscu aktualnego położenia kursora. Podczas operacji wymazywania wiersza wszystkie następne wiersze przesuwane są o jedną pozycję do góry a na końcu dodawany jest jeden wiersz pusty o bieżącym kolorze tła. Z podobną sytuacją mamy do czynienia podczas wstawiania pustego wiersza - jego kolorem tła będzie bieżący kolor tła.
Do sprawdzenia naciśnięcia na klawiaturze dowolnego klawisza, z wyjątkiem klawiszy przesunięcia (zmiany rejestrów), takich jak Shift, Alt, NumLock itp., służy funkcja KeyPressed o wartości logicznej (typu Boolean). Jeśli klawisz zostanie naciśnięty, to funkcja ta daje wartość True. W przeciwnym przypadku wartością funkcji jest False. Jeżeli wartością funkcji jest True, to ponowne przyjęcie przez nią wartości False uzyskuje się poprzez zastosowanie funkcji ReadKey
Bezparametrowa funkcja ReadKey powoduje wczytanie z klawiatury jednego znaku, przy czym znak ten nie jest wyprowadzany na ekran. Wartość funkcji jest typu Char. Jeśli przed wywołaniem funkcji ReadKey wartością funkcji KeyPressed była wartość logiczna True, to wartością funkcji ReadKey będzie znak znajdujący się w buforze klawiatury. W przeciwnym przypadku funkcja ReadKey będzie oczekiwała na naciśnięcie klawisza.
Procedura Delay, której wywołanie ma postać:
Delay (milisekundy),
gdzie milisekundy oznaczają wielkość całkowitą typu Word (może to być wyrażenie), powoduje zatrzymanie wykonywania programu na wyspecyfikowaną liczbę milisekund. Procedura ta wykorzystywana jest głównie do chwilowego zatrzymania wyświetlanego obrazu oraz do sterowania dźwiękiem w połączeniu z procedurami Sound i NoSound.
Procedura Sound powoduje włączenie wewnętrznego głośnika. Jej wywołanie jest następujące:
Sound (częstotliwość),
gdzie częstotliwość oznacza wielkość całkowitą typu Word (może to być wyrażenie). Emitowany jest przy tym dźwięk o częstotliwości w hercach, określonej wartością wyspecyfikowanego argumentu. Dźwięk ten będzie emitowany do chwili wykonania instrukcji wywołania bezparametrowej procedury NoSound.
Częstotliwości odpowiadające nutom naturalnym w różnych oktawach podaję w poniższej tabeli. Częstotliwości półtonów otrzymuje się poprzez obliczenie pierwiastka z iloczynu dwóch sąsiednich częstotliwości naturalnych. Ponieważ częstotliwość ta musi być liczbą całkowitą, przeto należy zastosować jeszcze funkcję standardową Round. Tak więc wzór na częstotliwość półtonu jest następujący:
Round (Sqrt (częstotliwość-1*częstotliwość-2))
10