EPROM - generator testowego sygnału video dla monitorów VGA

Pozostałe układy mikrokontrolerów, układy peryferyjne i inne, nie mieszczące się w powyższych kategoriach.
Awatar użytkownika
gaweł
Geek
Geek
Posty: 1321
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

EPROM - generator testowego sygnału video dla monitorów VGA

Postautor: gaweł » sobota 13 maja 2017, 11:57

Generator testowego sygnału video dla monitorów VGA

Inne typowe zastosowanie EPROM.

Jest to urządzenie zbudowane na bazie płyty głównej komputera PC, które do pracy potrzebuje jedynie karty grafiki zgodnej ze standardem VGA. Do budowy została użyta płyta główna od komputerów PC z procesorem Intel 80286. Być może wielu Czytelników nie widziała czegoś takiego, więc wygląda to następująco:
vgat_01.jpg
Zastosowany tu procesor i80286 pracujący z zawrotną prędkością, bo był taktowany z generatora dającego impulsy zegarowe o częstotliwości maksymalnie kilkunastu MHz (procesor w płycie głównej na fotografii 1 jest taktowany częstotliwością 16MHz), raczej należy uznać na mało udany.
vgat_02.jpg
Był to pierwszy model w rodzinie dziadka 8086, który posiadał “ogromną” przestrzeń adresową – mógł zaadresować aż 16 megabajtów pamięci fizycznej oraz posiadał mechanizmy ochronny pamięci (czyli wykonywany aktualnie program/proces nie mógł “zajechać” w zasoby innego programu/procesu). Znane przysłowie “pierwsze śliwki robaczywki” w pełni sprawdziło się w tym przypadku. Ten model raczej należy uznać na nieudany. Jednak nie ma tego złego .... więc i80286 stanowił bazę rozwojową dla procesorów i80386, który już okazał się rozwiązaniem bardziej przemyślanym.
I80286 jest procesorem w pełni 16-bitowym (inaczej jak jego trochę kulawy dziadek i8088) i dysponuje 16-bitową szyną danych do pamięci. Pobierając kod rozkazu do wykonania, procesor odczytywał pamięć w trybie 16-bitowym. Oznacza to, że program zawarty w pamięci BIOS musi znajdować się pamięci 16-bitowej. Najczęściej stosowanym rozwiązaniem jest użycie dwóch układów 8-bitowych pamięci tylko do odczytu umieszczonej na wspólnej szynie adresowej i szyną danych przyłączonej do części młodszej oraz starszej szyny danych procesora.]
vgat_03.jpg
Aby nie pomylić “połówek programu BIOS” jedna stanowi część młodszą (LOW) oraz starszą (HIGH). Na płytach głównych jest oznaczenie jaką część należy włożyć w daną podstawkę. Innym oznaczeniem występującym jest EVEN (parzysty: odpowiadający części młodszej) oraz, ODD (nieparzysty: odpowiadający części starszej).
Wracając jednak do tematu, to potrzebna jest jedynie karta kontrolera grafiki zgodna z VGA.
vgat_04.jpg
Włączając “komputer” do pracy, procesor wykonuje program zawarty w pamięci BIOS (nasz BIOS), a jego zadaniem jest wygenerowanie obrazu zawierającego kolorowe linie pionowe, poziome (krata) oraz okrągłe dla monitora VGA. Pozwalało to na naprawę, diagnostykę i strojenie tych monitorów. Generator obrazu nie musiał ładować żadnego programu z dysku lub dyskietki. Realizował swoją funkcję natychmiast po włączeniu.
vgat_05.jpg
Jeżeli ktoś jest przekonany, że program do umieszczenia w pamięci BIOS można pisać wyłącznie w języku asemblera, to muszę zaznaczyć, że jest w błędzie. Zaprezentowany program jest napisany w języku MODULA 2. Jestem przekonany, że ten język popularnością nie przebija przykładowo języka C. Porównując go do innych, to należy stwierdzić, że łączy pewne cechy języka PASCAL i języka C. Z PASCALA dziedziczy syntaktykę, jest ona podobna (a właściwie należy uznać, że jest uproszczeniem w stosunku do języka PASCAL). Podobnie jak w języku C, nie ma wbudowanej w język obsługi wejścia/wyjścia, odpowiednie procedury są dołączane jako biblioteki użytkowe.
Pisząc taki program należy mieć na uwadze, że program będzie pracował bez systemu operacyjnego. Właściwie sam sobie jest systemem operacyjnym, czyli możliwe jest przejęcie jakiegoś przerwania na siebie i użycia go: zamiast wywołania instrukcją call, będzie wywołanie instrukcją int – dziwaczne, ale możliwe. Na programie spoczywa obowiązek odpowiedniego zainicjowania i obsługi sprzętowej istotnych zespołów z płyty głównej (kontroler przerwań, kontroler DMA, układów czasowych itp). Oznacza to również, że nie można używać interrupt'ów do DOS'a (bo go nie ma – wyłączone są przykładowo funkcje przydziału pamięci, obsługi plików), interrupt'ów do BIOS'a (bo go nie ma – wyłączone są funkcje obsługi technicznej dysków, dyskietek, klawiatury, video..) ... a nie, nie. Video będzie działać, ponieważ BIOS od kontrolera video jest. Otóż, na kartach kontrolerów video jest BIOS zawierający obsługę właśnie tej karty. Należy ją jedynie aktywować, w wyniku której BIOS obsługi video przejmie na siebie przerwanie od “smarowania po ekranie”. Do włączenia przykładowo trybu graficznego (karta startuje w trybie alfanumerycznym) można użyć przerwania (int 10hex).
Program był tworzony i testowany pod kontrolą DOS'a jako typowa aplikacja (z ograniczeniem do minimum powiązania z systemem operacyjnym – jak najmniej przerwań do systemu). Pewne funkcje są używane, bo o ile załadowanie programu do pamięci operacyjnej realizowane przez system nie ma odbicia w kodzie, to zakończenie programu (i usunięcie z pamięci) już występuje. Dodatkowo, program jest sterowalny z klawiatury (chociażby by przekazać mu polecenie zakończenia pracy).
Po “wychuchaniu” programu, należy go “odwiązać” od systemu operacyjnego i jakoś zaaplikować do EPROM'a, ale to już temat na całkiem inne rozważania :arrow: ale możliwy do poruszenia na tym forum.
Tekst programu (program napisany w języku programowania MODULA-2):

Kod: Zaznacz cały

(…)

MODULE VGARom ;

IMPORT SYSTEM ;

IMPORT Lib ;

IMPORT IO ;


  TYPE
    CHGArrT             = ARRAY [ 0 .. 4095 ] OF SHORTCARD ;

  CONST
    CHGArr              = CHGArrT (
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,07EH,081H,0A5H,081H,081H,0BDH,
        000H,000H,07EH,0FFH,0DBH,0FFH,0FFH,0C3H,
        000H,000H,000H,036H,07FH,07FH,07FH,07FH,
        000H,000H,000H,008H,01CH,03EH,07FH,03EH,
        000H,000H,018H,03CH,03CH,0E7H,0E7H,0E7H,
        000H,000H,018H,03CH,07EH,0FFH,0FFH,07EH,
        000H,000H,000H,000H,000H,018H,03CH,03CH,
        0FFH,0FFH,0FFH,0FFH,0FFH,0E7H,0C3H,0C3H,
        000H,000H,000H,000H,03CH,066H,042H,042H,
        0FFH,0FFH,0FFH,0FFH,0C3H,099H,0BDH,0BDH,
        000H,000H,00FH,007H,00DH,019H,03CH,066H,
        000H,000H,03CH,066H,066H,066H,03CH,018H,
        000H,000H,03FH,033H,03FH,030H,030H,030H,
        000H,000H,07FH,063H,07FH,063H,063H,063H,
        000H,000H,018H,018H,0DBH,03CH,0E7H,03CH,
        000H,000H,040H,060H,070H,07CH,07FH,07CH,
        000H,000H,001H,003H,007H,01FH,07FH,01FH,
        000H,000H,018H,03CH,07EH,018H,018H,018H,
        000H,000H,033H,033H,033H,033H,033H,033H,
        000H,000H,07FH,0DBH,0DBH,0DBH,07BH,01BH,
        000H,03EH,063H,030H,01CH,036H,063H,063H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,018H,03CH,07EH,018H,018H,018H,
        000H,000H,018H,03CH,07EH,018H,018H,018H,
        000H,000H,018H,018H,018H,018H,018H,018H,
        000H,000H,000H,000H,00CH,006H,07FH,006H,
        000H,000H,000H,000H,018H,030H,07FH,030H,
        000H,000H,000H,000H,000H,060H,060H,060H,
        000H,000H,000H,000H,024H,066H,0FFH,066H,
        000H,000H,000H,008H,01CH,01CH,03EH,03EH,
        000H,000H,000H,07FH,07FH,03EH,03EH,01CH,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,018H,03CH,03CH,03CH,018H,018H,
        000H,063H,063H,063H,022H,000H,000H,000H,
        000H,000H,036H,036H,07FH,036H,036H,036H,
        00CH,00CH,03EH,063H,061H,060H,03EH,003H,
        000H,000H,000H,000H,061H,063H,006H,00CH,
        000H,000H,01CH,036H,036H,01CH,03BH,06EH,
        000H,030H,030H,030H,060H,000H,000H,000H,
        000H,000H,00CH,018H,030H,030H,030H,030H,
        000H,000H,018H,00CH,006H,006H,006H,006H,
        000H,000H,000H,000H,066H,03CH,0FFH,03CH,
        000H,000H,000H,018H,018H,018H,0FFH,018H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,0FFH,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,001H,003H,006H,00CH,018H,030H,
        000H,000H,03EH,063H,067H,06FH,07BH,073H,
        000H,000H,00CH,01CH,03CH,00CH,00CH,00CH,
        000H,000H,03EH,063H,003H,006H,00CH,018H,
        000H,000H,03EH,063H,003H,003H,01EH,003H,
        000H,000H,006H,00EH,01EH,036H,066H,07FH,
        000H,000H,07FH,060H,060H,060H,07EH,003H,
        000H,000H,01CH,030H,060H,060H,07EH,063H,
        000H,000H,07FH,063H,003H,006H,00CH,018H,
        000H,000H,03EH,063H,063H,063H,03EH,063H,
        000H,000H,03EH,063H,063H,063H,03FH,003H,
        000H,000H,000H,018H,018H,000H,000H,000H,
        000H,000H,000H,018H,018H,000H,000H,000H,
        000H,000H,006H,00CH,018H,030H,060H,030H,
        000H,000H,000H,000H,000H,07EH,000H,000H,
        000H,000H,060H,030H,018H,00CH,006H,00CH,
        000H,000H,03EH,063H,063H,006H,00CH,00CH,
        000H,000H,03EH,063H,063H,06FH,06FH,06FH,
        000H,000H,008H,01CH,036H,063H,063H,07FH,
        000H,000H,07EH,033H,033H,033H,03EH,033H,
        000H,000H,01EH,033H,061H,060H,060H,060H,
        000H,000H,07CH,036H,033H,033H,033H,033H,
        000H,000H,07FH,033H,031H,034H,03CH,034H,
        000H,000H,07FH,033H,031H,034H,03CH,034H,
        000H,000H,01EH,033H,061H,060H,060H,06FH,
        000H,000H,063H,063H,063H,063H,07FH,063H,
        000H,000H,03CH,018H,018H,018H,018H,018H,
        000H,000H,00FH,006H,006H,006H,006H,006H,
        000H,000H,073H,033H,036H,036H,03CH,036H,
        000H,000H,078H,030H,030H,030H,030H,030H,
        000H,000H,0C3H,0E7H,0FFH,0DBH,0C3H,0C3H,
        000H,000H,063H,073H,07BH,07FH,06FH,067H,
        000H,000H,01CH,036H,063H,063H,063H,063H,
        000H,000H,07EH,033H,033H,033H,03EH,030H,
        000H,000H,03EH,063H,063H,063H,063H,06BH,
        000H,000H,07EH,033H,033H,033H,03EH,036H,
        000H,000H,03EH,063H,063H,030H,01CH,006H,
        000H,000H,0FFH,0DBH,099H,018H,018H,018H,
        000H,000H,063H,063H,063H,063H,063H,063H,
        000H,000H,0C3H,0C3H,0C3H,0C3H,0C3H,0C3H,
        000H,000H,0C3H,0C3H,0C3H,0C3H,0DBH,0DBH,
        000H,000H,0C3H,0C3H,066H,03CH,018H,03CH,
        000H,000H,0C3H,0C3H,0C3H,066H,03CH,018H,
        000H,000H,0FFH,0C3H,086H,00CH,018H,030H,
        000H,000H,03CH,030H,030H,030H,030H,030H,
        000H,000H,040H,060H,070H,038H,01CH,00EH,
        000H,000H,03CH,00CH,00CH,00CH,00CH,00CH,
        008H,01CH,036H,063H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,00CH,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,03CH,006H,03EH,
        000H,000H,070H,030H,030H,03CH,036H,033H,
        000H,000H,000H,000H,000H,03EH,063H,060H,
        000H,000H,00EH,006H,006H,01EH,036H,066H,
        000H,000H,000H,000H,000H,03EH,063H,07FH,
        000H,000H,01CH,036H,032H,030H,07CH,030H,
        000H,000H,000H,000H,000H,03BH,066H,066H,
        000H,000H,070H,030H,030H,036H,03BH,033H,
        000H,000H,00CH,00CH,000H,01CH,00CH,00CH,
        000H,000H,006H,006H,000H,00EH,006H,006H,
        000H,000H,070H,030H,030H,033H,036H,03CH,
        000H,000H,01CH,00CH,00CH,00CH,00CH,00CH,
        000H,000H,000H,000H,000H,0E6H,0FFH,0DBH,
        000H,000H,000H,000H,000H,06EH,033H,033H,
        000H,000H,000H,000H,000H,03EH,063H,063H,
        000H,000H,000H,000H,000H,06EH,033H,033H,
        000H,000H,000H,000H,000H,03BH,066H,066H,
        000H,000H,000H,000H,000H,06EH,03BH,033H,
        000H,000H,000H,000H,000H,03EH,063H,038H,
        000H,000H,008H,018H,018H,07EH,018H,018H,
        000H,000H,000H,000H,000H,066H,066H,066H,
        000H,000H,000H,000H,000H,0C3H,0C3H,0C3H,
        000H,000H,000H,000H,000H,0C3H,0C3H,0DBH,
        000H,000H,000H,000H,000H,063H,036H,01CH,
        000H,000H,000H,000H,000H,063H,063H,063H,
        000H,000H,000H,000H,000H,07FH,066H,00CH,
        000H,000H,00EH,018H,018H,018H,070H,018H,
        000H,000H,018H,018H,018H,018H,000H,018H,
        000H,000H,070H,018H,018H,018H,00EH,018H,
        000H,000H,03BH,06EH,000H,000H,000H,000H,
        000H,000H,000H,000H,008H,01CH,036H,063H,
        000H,000H,01EH,033H,061H,060H,060H,061H,
        000H,000H,066H,066H,000H,066H,066H,066H,
        000H,006H,00CH,018H,000H,03EH,063H,07FH,
        000H,008H,01CH,036H,000H,03CH,006H,03EH,
        000H,000H,066H,066H,000H,03CH,006H,03EH,
        000H,030H,018H,00CH,000H,03CH,006H,03EH,
        000H,01CH,036H,01CH,000H,03CH,006H,03EH,
        000H,000H,000H,000H,03CH,066H,060H,066H,
        000H,008H,01CH,036H,000H,03EH,063H,07FH,
        000H,000H,066H,066H,000H,03EH,063H,07FH,
        000H,030H,018H,00CH,000H,03EH,063H,07FH,
        000H,000H,066H,066H,000H,038H,018H,018H,
        000H,018H,03CH,066H,000H,038H,018H,018H,
        000H,060H,030H,018H,000H,038H,018H,018H,
        000H,063H,063H,008H,01CH,036H,063H,063H,
        01CH,036H,01CH,000H,01CH,036H,063H,063H,
        00CH,018H,030H,000H,07FH,033H,030H,03EH,
        000H,000H,000H,000H,06EH,03BH,01BH,07EH,
        000H,000H,01FH,036H,066H,066H,07FH,066H,
        000H,008H,01CH,036H,000H,03EH,063H,063H,
        000H,000H,063H,063H,000H,03EH,063H,063H,
        000H,030H,018H,00CH,000H,03EH,063H,063H,
        000H,018H,03CH,066H,000H,066H,066H,066H,
        000H,030H,018H,00CH,000H,066H,066H,066H,
        000H,000H,063H,063H,000H,063H,063H,063H,
        000H,063H,063H,01CH,036H,063H,063H,063H,
        000H,063H,063H,000H,063H,063H,063H,063H,
        000H,018H,018H,07EH,0C3H,0C0H,0C0H,0C3H,
        000H,01CH,036H,032H,030H,078H,030H,030H,
        000H,000H,0C3H,066H,03CH,018H,0FFH,018H,
        000H,0FCH,066H,066H,07CH,062H,066H,06FH,
        000H,00EH,01BH,018H,018H,018H,07EH,018H,
        000H,000H,008H,01CH,036H,063H,063H,07FH,
        00CH,008H,01EH,033H,061H,060H,060H,060H,
        000H,000H,07FH,033H,031H,034H,03CH,034H,
        000H,000H,078H,033H,036H,03CH,038H,030H,
        00CH,008H,063H,073H,07BH,07FH,06FH,067H,
        00CH,008H,01CH,036H,063H,063H,063H,063H,
        00CH,008H,03EH,063H,063H,030H,01CH,006H,
        000H,000H,0FFH,0C3H,086H,00CH,07EH,030H,
        00CH,008H,0FFH,0C3H,086H,00CH,018H,030H,
        000H,000H,000H,000H,000H,000H,07FH,060H,
        000H,000H,000H,000H,000H,03CH,006H,03EH,
        000H,000H,000H,00CH,008H,03EH,063H,060H,
        000H,000H,000H,000H,000H,03EH,063H,07FH,
        000H,000H,01CH,00DH,00FH,00EH,01CH,03CH,
        000H,000H,000H,00CH,008H,06EH,033H,033H,
        000H,000H,000H,00CH,008H,03EH,063H,063H,
        000H,000H,000H,00CH,008H,03EH,063H,038H,
        000H,000H,00CH,00CH,000H,07FH,066H,00CH,
        000H,000H,000H,00CH,008H,07FH,066H,00CH,
        018H,018H,018H,018H,018H,018H,018H,018H,
        018H,018H,018H,018H,018H,018H,018H,0F8H,
        018H,018H,018H,018H,018H,0F8H,018H,0F8H,
        036H,036H,036H,036H,036H,036H,036H,0F6H,
        000H,000H,000H,000H,000H,000H,000H,0FEH,
        000H,000H,000H,000H,000H,0F8H,018H,0F8H,
        036H,036H,036H,036H,036H,0F6H,006H,0F6H,
        036H,036H,036H,036H,036H,036H,036H,036H,
        000H,000H,000H,000H,000H,0FEH,006H,0F6H,
        036H,036H,036H,036H,036H,0F6H,006H,0FEH,
        036H,036H,036H,036H,036H,036H,036H,0FEH,
        018H,018H,018H,018H,018H,0F8H,018H,0F8H,
        000H,000H,000H,000H,000H,000H,000H,0F8H,
        018H,018H,018H,018H,018H,018H,018H,01FH,
        018H,018H,018H,018H,018H,018H,018H,0FFH,
        000H,000H,000H,000H,000H,000H,000H,0FFH,
        018H,018H,018H,018H,018H,018H,018H,01FH,
        000H,000H,000H,000H,000H,000H,000H,0FFH,
        018H,018H,018H,018H,018H,018H,018H,0FFH,
        018H,018H,018H,018H,018H,01FH,018H,01FH,
        036H,036H,036H,036H,036H,036H,036H,037H,
        036H,036H,036H,036H,036H,037H,030H,03FH,
        000H,000H,000H,000H,000H,03FH,030H,037H,
        036H,036H,036H,036H,036H,0F7H,000H,0FFH,
        000H,000H,000H,000H,000H,0FFH,000H,0F7H,
        036H,036H,036H,036H,036H,037H,030H,037H,
        000H,000H,000H,000H,000H,0FFH,000H,0FFH,
        036H,036H,036H,036H,036H,0F7H,000H,0F7H,
        018H,018H,018H,018H,018H,0FFH,000H,0FFH,
        036H,036H,036H,036H,036H,036H,036H,0FFH,
        000H,000H,000H,000H,000H,0FFH,000H,0FFH,
        000H,000H,000H,000H,000H,000H,000H,0FFH,
        036H,036H,036H,036H,036H,036H,036H,03FH,
        018H,018H,018H,018H,018H,01FH,018H,01FH,
        000H,000H,000H,000H,000H,01FH,018H,01FH,
        000H,000H,000H,000H,000H,000H,000H,03FH,
        036H,036H,036H,036H,036H,036H,036H,0FFH,
        018H,018H,018H,018H,018H,0FFH,018H,0FFH,
        018H,018H,018H,018H,018H,018H,018H,0F8H,
        000H,000H,000H,000H,000H,000H,000H,01FH,
        0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,
        000H,000H,000H,000H,000H,000H,000H,0FFH,
        0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,
        00FH,00FH,00FH,00FH,00FH,00FH,00FH,00FH,
        0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,
        000H,000H,000H,000H,000H,03BH,06EH,06CH,
        000H,000H,000H,000H,03EH,063H,07EH,063H,
        000H,000H,07FH,063H,063H,060H,060H,060H,
        000H,000H,000H,000H,07FH,036H,036H,036H,
        000H,000H,07FH,063H,030H,018H,00CH,018H,
        000H,000H,000H,000H,000H,03FH,06CH,06CH,
        000H,000H,000H,000H,033H,033H,033H,033H,
        000H,000H,000H,000H,03BH,06EH,00CH,00CH,
        000H,000H,07EH,018H,03CH,066H,066H,066H,
        000H,000H,01CH,036H,063H,063H,07FH,063H,
        000H,000H,01CH,036H,063H,063H,063H,036H,
        000H,000H,01EH,030H,018H,00CH,03EH,066H,
        000H,000H,000H,000H,000H,07EH,0DBH,0DBH,
        000H,000H,003H,006H,07EH,0DBH,0DBH,0F3H,
        000H,000H,01CH,030H,060H,060H,07CH,060H,
        000H,000H,000H,03EH,063H,063H,063H,063H,
        000H,000H,000H,07FH,000H,000H,07FH,000H,
        000H,000H,018H,018H,018H,0FFH,018H,018H,
        000H,000H,030H,018H,00CH,006H,00CH,018H,
        000H,000H,00CH,018H,030H,060H,030H,018H,
        000H,000H,00EH,01BH,01BH,018H,018H,018H,
        018H,018H,018H,018H,018H,018H,018H,018H,
        000H,000H,018H,018H,000H,000H,0FFH,000H,
        000H,000H,000H,000H,03BH,06EH,000H,03BH,
        000H,038H,06CH,06CH,038H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,018H,018H,
        000H,000H,000H,000H,000H,000H,000H,018H,
        000H,00FH,00CH,00CH,00CH,00CH,00CH,0ECH,
        000H,0D8H,06CH,06CH,06CH,06CH,06CH,000H,
        000H,070H,0D8H,030H,060H,0C8H,0F8H,000H,
        000H,000H,000H,000H,03EH,03EH,03EH,03EH,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        099H,081H,07EH,000H,000H,000H,000H,000H,
        0E7H,0FFH,07EH,000H,000H,000H,000H,000H,
        03EH,01CH,008H,000H,000H,000H,000H,000H,
        01CH,008H,000H,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        018H,000H,000H,000H,000H,000H,000H,000H,
        0E7H,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,
        066H,03CH,000H,000H,000H,000H,000H,000H,
        099H,0C3H,0FFH,0FFH,0FFH,0FFH,000H,000H,
        066H,066H,03CH,000H,000H,000H,000H,000H,
        07EH,018H,018H,000H,000H,000H,000H,000H,
        070H,0F0H,0E0H,000H,000H,000H,000H,000H,
        067H,0E7H,0E6H,0C0H,000H,000H,000H,000H,
        0DBH,018H,018H,000H,000H,000H,000H,000H,
        070H,060H,040H,000H,000H,000H,000H,000H,
        007H,003H,001H,000H,000H,000H,000H,000H,
        07EH,03CH,018H,000H,000H,000H,000H,000H,
        000H,033H,033H,000H,000H,000H,000H,000H,
        01BH,01BH,01BH,000H,000H,000H,000H,000H,
        036H,01CH,006H,063H,03EH,000H,000H,000H,
        07FH,07FH,07FH,000H,000H,000H,000H,000H,
        07EH,03CH,018H,07EH,000H,000H,000H,000H,
        018H,018H,018H,000H,000H,000H,000H,000H,
        07EH,03CH,018H,000H,000H,000H,000H,000H,
        00CH,000H,000H,000H,000H,000H,000H,000H,
        018H,000H,000H,000H,000H,000H,000H,000H,
        07FH,000H,000H,000H,000H,000H,000H,000H,
        024H,000H,000H,000H,000H,000H,000H,000H,
        07FH,07FH,000H,000H,000H,000H,000H,000H,
        01CH,008H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,018H,018H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        07FH,036H,036H,000H,000H,000H,000H,000H,
        043H,063H,03EH,00CH,00CH,000H,000H,000H,
        018H,033H,063H,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        030H,018H,00CH,000H,000H,000H,000H,000H,
        006H,00CH,018H,000H,000H,000H,000H,000H,
        066H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,030H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,018H,018H,000H,000H,000H,000H,000H,
        060H,040H,000H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        00CH,00CH,03FH,000H,000H,000H,000H,000H,
        030H,063H,07FH,000H,000H,000H,000H,000H,
        003H,063H,03EH,000H,000H,000H,000H,000H,
        006H,006H,00FH,000H,000H,000H,000H,000H,
        003H,063H,03EH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        018H,018H,018H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        003H,006H,03CH,000H,000H,000H,000H,000H,
        018H,018H,000H,000H,000H,000H,000H,000H,
        018H,018H,030H,000H,000H,000H,000H,000H,
        018H,00CH,006H,000H,000H,000H,000H,000H,
        07EH,000H,000H,000H,000H,000H,000H,000H,
        018H,030H,060H,000H,000H,000H,000H,000H,
        000H,00CH,00CH,000H,000H,000H,000H,000H,
        06EH,060H,03EH,000H,000H,000H,000H,000H,
        063H,063H,063H,000H,000H,000H,000H,000H,
        033H,033H,07EH,000H,000H,000H,000H,000H,
        061H,033H,01EH,000H,000H,000H,000H,000H,
        033H,036H,07CH,000H,000H,000H,000H,000H,
        031H,033H,07FH,000H,000H,000H,000H,000H,
        030H,030H,078H,000H,000H,000H,000H,000H,
        063H,033H,01DH,000H,000H,000H,000H,000H,
        063H,063H,063H,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        066H,066H,03CH,000H,000H,000H,000H,000H,
        036H,033H,073H,000H,000H,000H,000H,000H,
        031H,033H,07FH,000H,000H,000H,000H,000H,
        0C3H,0C3H,0C3H,000H,000H,000H,000H,000H,
        063H,063H,063H,000H,000H,000H,000H,000H,
        063H,036H,01CH,000H,000H,000H,000H,000H,
        030H,030H,078H,000H,000H,000H,000H,000H,
        06FH,03EH,006H,007H,000H,000H,000H,000H,
        033H,033H,073H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        066H,03CH,018H,000H,000H,000H,000H,000H,
        0FFH,066H,066H,000H,000H,000H,000H,000H,
        066H,0C3H,0C3H,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        061H,0C3H,0FFH,000H,000H,000H,000H,000H,
        030H,030H,03CH,000H,000H,000H,000H,000H,
        007H,003H,001H,000H,000H,000H,000H,000H,
        00CH,00CH,03CH,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,0FFH,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        033H,033H,06EH,000H,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        030H,030H,078H,000H,000H,000H,000H,000H,
        066H,03EH,006H,066H,03CH,000H,000H,000H,
        033H,033H,073H,000H,000H,000H,000H,000H,
        00CH,00CH,01EH,000H,000H,000H,000H,000H,
        006H,006H,066H,066H,03CH,000H,000H,000H,
        036H,033H,073H,000H,000H,000H,000H,000H,
        00CH,00CH,01EH,000H,000H,000H,000H,000H,
        0DBH,0DBH,0DBH,000H,000H,000H,000H,000H,
        033H,033H,033H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        033H,03EH,030H,030H,078H,000H,000H,000H,
        066H,03EH,006H,006H,00FH,000H,000H,000H,
        030H,030H,078H,000H,000H,000H,000H,000H,
        00EH,063H,03EH,000H,000H,000H,000H,000H,
        018H,01BH,00EH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        066H,03CH,018H,000H,000H,000H,000H,000H,
        0DBH,0FFH,066H,000H,000H,000H,000H,000H,
        01CH,036H,063H,000H,000H,000H,000H,000H,
        063H,03FH,003H,006H,03CH,000H,000H,000H,
        018H,033H,07FH,000H,000H,000H,000H,000H,
        018H,018H,00EH,000H,000H,000H,000H,000H,
        018H,018H,018H,000H,000H,000H,000H,000H,
        018H,018H,070H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        063H,07FH,000H,000H,000H,000H,000H,000H,
        033H,01EH,006H,003H,03EH,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        03CH,00CH,006H,03CH,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        018H,018H,03CH,000H,000H,000H,000H,000H,
        07FH,063H,063H,000H,000H,000H,000H,000H,
        07FH,063H,063H,000H,000H,000H,000H,000H,
        030H,033H,07FH,000H,000H,000H,000H,000H,
        0D8H,0DCH,077H,000H,000H,000H,000H,000H,
        066H,066H,067H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        066H,066H,03BH,000H,000H,000H,000H,000H,
        063H,03FH,003H,006H,03CH,000H,000H,000H,
        063H,036H,01CH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        07EH,018H,018H,000H,000H,000H,000H,000H,
        030H,073H,07EH,000H,000H,000H,000H,000H,
        0FFH,018H,018H,000H,000H,000H,000H,000H,
        066H,066H,0F3H,000H,000H,000H,000H,000H,
        018H,018H,018H,0D8H,070H,000H,000H,000H,
        063H,063H,063H,006H,00CH,000H,000H,000H,
        061H,033H,01EH,000H,000H,000H,000H,000H,
        031H,033H,07FH,006H,00CH,000H,000H,000H,
        071H,033H,07FH,000H,000H,000H,000H,000H,
        063H,063H,063H,000H,000H,000H,000H,000H,
        063H,036H,01CH,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        061H,0C3H,0FFH,000H,000H,000H,000H,000H,
        061H,0C3H,0FFH,000H,000H,000H,000H,000H,
        060H,060H,000H,000H,000H,000H,000H,000H,
        066H,066H,03BH,006H,00CH,000H,000H,000H,
        060H,063H,03EH,000H,000H,000H,000H,000H,
        060H,063H,03EH,00CH,018H,000H,000H,000H,
        06CH,04CH,01EH,000H,000H,000H,000H,000H,
        033H,033H,033H,000H,000H,000H,000H,000H,
        063H,063H,03EH,000H,000H,000H,000H,000H,
        00EH,063H,03EH,000H,000H,000H,000H,000H,
        018H,033H,07FH,000H,000H,000H,000H,000H,
        018H,033H,07FH,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        036H,036H,036H,036H,036H,036H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,
        0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,000H,000H,
        0F0H,0F0H,0F0H,0F0H,0F0H,0F0H,000H,000H,
        00FH,00FH,00FH,00FH,00FH,00FH,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        06CH,06EH,03BH,000H,000H,000H,000H,000H,
        063H,07EH,060H,060H,020H,000H,000H,000H,
        060H,060H,060H,000H,000H,000H,000H,000H,
        036H,036H,036H,000H,000H,000H,000H,000H,
        030H,063H,07FH,000H,000H,000H,000H,000H,
        06CH,06CH,038H,000H,000H,000H,000H,000H,
        03EH,030H,030H,060H,000H,000H,000H,000H,
        00CH,00CH,00CH,000H,000H,000H,000H,000H,
        03CH,018H,07EH,000H,000H,000H,000H,000H,
        063H,036H,01CH,000H,000H,000H,000H,000H,
        036H,036H,077H,000H,000H,000H,000H,000H,
        066H,066H,03CH,000H,000H,000H,000H,000H,
        07EH,000H,000H,000H,000H,000H,000H,000H,
        07EH,060H,0C0H,000H,000H,000H,000H,000H,
        060H,030H,01CH,000H,000H,000H,000H,000H,
        063H,063H,063H,000H,000H,000H,000H,000H,
        000H,07FH,000H,000H,000H,000H,000H,000H,
        018H,000H,0FFH,000H,000H,000H,000H,000H,
        030H,000H,07EH,000H,000H,000H,000H,000H,
        00CH,000H,07EH,000H,000H,000H,000H,000H,
        018H,018H,018H,018H,018H,018H,000H,000H,
        0D8H,0D8H,070H,000H,000H,000H,000H,000H,
        000H,018H,018H,000H,000H,000H,000H,000H,
        06EH,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        06CH,03CH,01CH,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H,
        03EH,03EH,000H,000H,000H,000H,000H,000H,
        000H,000H,000H,000H,000H,000H,000H,000H) ;

  CONST
    dx                  = 2 ;
    dy                  = 2 ;

    VGAWidth            = 640 ;
    VGADepth            = 480 ;
    VGANumColor         = 16 ;

  TYPE
    tinyint             = [ 0 .. 7 ] ;
    bs                  = SET OF tinyint ;
    bp                  = POINTER TO bs ;

  VAR
    VGAScreen [ 0A000H : 0 ] : ARRAY [ 0 .. 0 ] OF bs ;


PROCEDURE GraphMode ;

  VAR
    r                   : SYSTEM . Registers ;

  BEGIN (* GraphMode *)
    r . AX := 12H ;
    Lib . Intr ( r , 10H ) ;
  END GraphMode ;


PROCEDURE TextMode ;

  VAR
    r                   : SYSTEM . Registers ;

  BEGIN (* TextMode *)
    r . AX := 3 ;
    Lib . Intr ( r , 10H ) ;
  END TextMode ;


PROCEDURE Plot( x,y,c : CARDINAL);

VAR
  t                     : bs ;
  p                     : CARDINAL ;
  b                     : CARDINAL ;
  s                     : CARDINAL ;

  BEGIN (* Plot *)
    IF ( x < VGAWidth ) AND ( y < VGADepth ) THEN
      b := 1 << ( 7 - ( x MOD 8 ) ) ;
      p := y * 80 + ( x DIV 8 ) ;
      SYSTEM . Out ( 3CEH , 8 ) ;
      SYSTEM . Out ( 3CFH , SHORTCARD ( b ) ) ;
      SYSTEM . Out ( 3C4H , 2 ) ;
      SYSTEM . Out ( 3C5H , 0FH ) ;
      s := 0A000H ;
      t := [ s : p bp ] ^ ;
      [ s : p bp ] ^ := bs { } ;
      SYSTEM . Out ( 3C4H , 2 ) ;
      SYSTEM . Out ( 3C5H , SHORTCARD ( c ) ) ;
      [ s : p bp ] ^ := bs { 0 .. 7 } ;
      SYSTEM . Out ( 3CEH , 8 ) ;
      SYSTEM . Out ( 3CFH , 0FFH ) ;
      SYSTEM . Out ( 3C4H , 2 ) ;
      SYSTEM . Out ( 3C5H , 0FH ) ;
    END (* IF *) ;
  END Plot ;


PROCEDURE Point ( x : CARDINAL ;
                  y : CARDINAL ) : CARDINAL ;

  VAR
    t                   : bs ;
    p                   : CARDINAL ;
    b                   : CARDINAL ;
    s                   : CARDINAL ;
    c                   : CARDINAL ;

  BEGIN (* Point *)
    IF ( x < VGAWidth ) AND ( y < VGADepth ) THEN
      b := 1 << ( 7 - ( x MOD 8 ) ) ;
      p := y * 80 + ( x DIV 8 ) ;
      s := 0A000H ;
      SYSTEM . Out ( 3CEH , 4 ) ; (* read map sel *)
      SYSTEM . Out ( 3CFH , 3 ) ;
      t := [ s : p bp ] ^ ;
      t := t * bs ( b ) ;
      c := CARDINAL ( SHORTCARD ( t ) ) ;
      SYSTEM . Out ( 3CFH , 2 ) ;
      t := [ s : p bp ] ^ ;
      t := t * bs ( b ) ;
      c := c * 2 + CARDINAL ( SHORTCARD ( t ) ) ;
      SYSTEM . Out ( 3CFH , 1 ) ;
      t := [ s : p bp ] ^ ;
      t := t * bs ( b ) ;
      c := c * 2 + CARDINAL ( SHORTCARD ( t ) ) ;
      SYSTEM . Out ( 3CFH , 0 ) ;
      t := [ s : p bp ] ^ ;
      t := t * bs ( b ) ;
      c := c * 2 + CARDINAL ( SHORTCARD ( t ) ) ;
      c := c >> ( 7 - ( x MOD 8 ) ) ;
      RETURN c ;
    ELSE
      RETURN 0 ;
    END (* IF ... ELSE *) ;
  END Point ;


PROCEDURE HLine ( x  : CARDINAL ;
                  y  : CARDINAL ;
                  x2 : CARDINAL ;
                  c  : CARDINAL ) ;

  VAR
    c1                  : CARDINAL ;
    c2                  : CARDINAL ;

  BEGIN (* HLine *)
    IF y > VGADepth - 1 THEN
      RETURN ;
    END (* IF *) ;
    IF INTEGER ( x ) >= INTEGER ( VGAWidth ) THEN
      RETURN ;
    END (* IF *) ;
    IF INTEGER ( x ) < 0 THEN
      x := 0 ;
    END (* IF *) ;
    IF x2 >= VGAWidth THEN
      x2 := VGAWidth - 1 ;
    END (* IF *) ;
    WHILE ( x MOD 8 # 0 ) AND ( x <= x2 ) DO
      Plot ( x , y , c ) ;
      INC ( x ) ;
    END (* WHILE *) ;
    WHILE ( x2 MOD 8 # 7 ) AND ( x <= x2 ) DO
      Plot ( x2 , y , c ) ;
      DEC ( x2 ) ;
    END (* WHILE *) ;
    IF INTEGER ( x ) > INTEGER ( x2 ) THEN
      RETURN ;
    END (* IF *) ;
    SYSTEM . Out ( 3CEH , 8 ) ;
    SYSTEM . Out ( 3CFH , 0FFH ) ;
    SYSTEM . Out ( 3C4H , 2 ) ;
    SYSTEM . Out ( 3C5H , 0FH ) ;
    SYSTEM . Out ( 3CEH , 5 ) ;
    SYSTEM . Out ( 3CFH , 2 ) ;
    y := y * 80 ;
    x := x DIV 8 ;
    x2 := x2 DIV 8 ;
    WHILE x <= x2 DO
      VGAScreen [ y + x ] := bs ( c ) ;
      INC ( x ) ;
    END (* WHILE *) ;
    SYSTEM . Out ( 3CEH , 5 ) ;
    SYSTEM . Out ( 3CFH , 0 ) ;
  END HLine ;


PROCEDURE Line ( x1 : CARDINAL ;
                 y1 : CARDINAL ;
                 x2 : CARDINAL ;
                 y2 : CARDINAL ;
                 c  : CARDINAL ) ;
  VAR
    dx                  : INTEGER ;
    dy                  : INTEGER ;
    e                   : INTEGER ;
    tmp                 : INTEGER ;

  BEGIN (* Line *)
    IF x1 > x2 THEN
      tmp := x1 ;
      x1 := x2 ;
      x2 := tmp ;
      tmp := y1 ;
      y1 := y2 ;
      y2 := tmp ;
    END (* IF *) ;
    dx := x2 - x1 ;
    e := 0;
    IF y1 <= y2 THEN (* case where y increases *)
      dy := ( y2 - y1 ) ;
      IF dx >= dy THEN
        LOOP
          Plot ( x1 , y1 , c ) ;
          IF x1 = x2 THEN
            EXIT ;
          END (* IF *) ;
          INC ( x1 ) ;
          INC ( e , dy ) ;
          INC ( e , dy ) ;
          IF e > dx THEN
            DEC ( e , dx ) ;
            DEC ( e , dx ) ;
            INC ( y1 ) ;
          END (* IF *) ;
        END (* LOOP *) ;
      ELSE
        LOOP
          Plot ( x1,y1,c );
          IF y1 = y2 THEN
            EXIT ;
          END (*  IF *) ;
          INC ( y1 ) ;
          INC ( e , dx ) ;
          INC ( e , dx ) ;
          IF e > dy THEN
            DEC ( e , dy ) ;
            DEC ( e , dy ) ;
            INC ( x1 ) ;
          END (* IF *) ;
        END (* LOOP *) ;
      END (* IF ... ELSE *) ;
    ELSE    (* case where y decreases *)
      dy := ( y1 - y2 ) ;
      IF dx >= dy THEN
        LOOP
          Plot ( x1 , y1 , c ) ;
          IF x1 = x2 THEN
            EXIT ;
          END (* IF *) ;
          INC ( x1 ) ;
          INC ( e , dy ) ;
          INC ( e , dy ) ;
          IF e > dx THEN
            DEC ( e , dx ) ;
            DEC ( e , dx ) ;
            DEC ( y1 ) ;
          END (* IF *) ;
        END (* LOOP *) ;
      ELSE
        LOOP
          Plot ( x1 , y1 , c ) ;
          IF y1 = y2 THEN
            EXIT ;
          END (* IF *) ;
          DEC ( y1 ) ;
          INC ( e , dx ) ;
          INC ( e , dx ) ;
          IF e > dy THEN
            DEC ( e , dy ) ;
            DEC ( e , dy ) ;
            INC ( x1 ) ;
          END (* IF *) ;
        END (* LOOP *) ;
      END (* IF ... ELSE *) ;
    END (* IF ... ELSE *) ;
  END Line ;


PROCEDURE Disc ( x0 : CARDINAL ;
                 y0 : CARDINAL ;
                 r  : CARDINAL ;
                 c  : CARDINAL ) ;

  VAR
    e                   : INTEGER ;
    x                   : CARDINAL ;
    y                   : CARDINAL ;

  BEGIN (* Disc *)
    x := r ;
    y := 0 ;
    e := 0 ;
    WHILE INTEGER ( y ) <= INTEGER ( x ) DO
      HLine ( x0 - x , y0 + y , x0 + x , c ) ;
      HLine ( x0 - x , y0 - y , x0 + x , c ) ;
      INC ( y ) ;
      INC ( e , y * dy - 1 ) ;
      IF e > INTEGER ( x ) THEN
        DEC ( x ) ;
        DEC ( e , x * dx + 1 ) ;
        HLine ( x0 - y , y0 + x , x0 + y , c ) ;
        HLine ( x0 - y , y0 - x , x0 + y , c ) ;
      END (* IF *) ;
    END (* WHILE *) ;
  END Disc ;


PROCEDURE Circle ( x0 : CARDINAL ;
                   y0 : CARDINAL ;
                   r  : CARDINAL ;
                   c  : CARDINAL ) ;

  VAR
    e                   : INTEGER ;
    x                   : CARDINAL ;
    y                   : CARDINAL ;

  BEGIN (* Circle *)
    x := r ;
    y := 0 ;
    e := 0 ;
    WHILE INTEGER ( y ) <= INTEGER ( x ) DO
      Plot ( x0 + x , y0 + y , c ) ;
      Plot ( x0 - x , y0 + y , c ) ;
      Plot ( x0 + x , y0 - y , c ) ;
      Plot ( x0 - x , y0 - y , c ) ;
      Plot ( x0 + y , y0 + x , c ) ;
      Plot ( x0 - y , y0 + x , c ) ;
      Plot ( x0 + y , y0 - x , c ) ;
      Plot ( x0 - y , y0 - x , c ) ;
      INC ( y ) ;
      INC ( e , y * dy - 1 ) ;
      IF e > INTEGER ( x ) THEN
        DEC ( x ) ;
        DEC ( e , x * dx + 1 ) ;
      END (* IF *) ;
    END (* IF *) ;
  END Circle ;


PROCEDURE Ellipse ( x0   : CARDINAL ;  (* center *)
                    y0   : CARDINAL ;  (* center *)
                    a0   : CARDINAL ;  (* semi-axes *)
                    b0   : CARDINAL ;  (* semi-axes *)
                    c    : CARDINAL ;  (* color *)
                    fill : BOOLEAN ) ; (* wether filled *)

  VAR
    x                   : CARDINAL ;
    y                   : CARDINAL ;
    a                   : LONGINT ;
    b                   : LONGINT ;
    asq                 : LONGINT ;
    asq2                : LONGINT ;
    bsq                 : LONGINT ;
    bsq2                : LONGINT ;
    d                   : LONGINT ;
    dx                  : LONGINT ;
    dy                  : LONGINT ;

  BEGIN (* Ellipse *)
    x := 0 ;
    y := b0 ;
    a := LONGINT ( a0 ) ;
    b := LONGINT ( b0 ) ;
    asq := a * a ;
    asq2 := asq * 2 ;
    bsq := b * b ;
    bsq2 := bsq * 2 ;
    d := bsq - ( asq * b ) + ( asq DIV 4 ) ;
    dx := 0 ;
    dy := asq2 * b ;
    WHILE dx < dy DO
      IF fill THEN
        HLine ( x0 - x , y0 + y , x0 + x , c ) ;
        HLine ( x0 - x , y0 - y , x0 + x , c ) ;
      ELSE
        Plot ( x0 + x , y0 + y , c ) ;
        Plot ( x0 - x , y0 + y , c ) ;
        Plot ( x0 + x , y0 - y , c ) ;
        Plot ( x0 - x , y0 - y , c ) ;
      END (* IF ... ELSE *) ;
      IF d > 0 THEN
        DEC ( y ) ;
        DEC ( dy , asq2 ) ;
        DEC ( d , dy ) ;
      END (* IF *) ;
      INC ( x ) ;
      INC ( dx , bsq2 ) ;
      INC ( d , bsq + dx ) ;
    END (* WHILE *) ;
    INC ( d , ( 3 * ( asq - bsq ) DIV 2 - ( dx + dy ) ) DIV 2 ) ;
    WHILE INTEGER ( y ) >= 0 DO
      IF fill THEN
        HLine ( x0 - x , y0 + y , x0 + x , c ) ;
        HLine ( x0 - x , y0 - y , x0 + x , c ) ;
      ELSE
        Plot ( x0 + x , y0 + y , c ) ;
        Plot ( x0 - x , y0 + y , c ) ;
        Plot ( x0 + x , y0 - y , c ) ;
        Plot ( x0 - x , y0 - y , c ) ;
      END (* IF ... ELSE *) ;
      IF d < 0 THEN
        INC ( x ) ;
        INC ( dx , bsq2 ) ;
        INC ( d , dx ) ;
      END (* IF *) ;
      DEC ( y ) ;
      DEC ( dy , asq2 ) ;
      INC ( d , asq - dy ) ;
    END (* WHILE *) ;
  END Ellipse ;


PROCEDURE Polygon ( n  : CARDINAL ;
                    px : ARRAY OF CARDINAL ;
                    py : ARRAY OF CARDINAL ;
                    c  : CARDINAL ) ;

  CONST
    MaxPts              = 20 ;

  VAR
    y                   : INTEGER ;
    miny                : INTEGER ;
    maxy                : INTEGER ;
    x0                  : INTEGER ;
    y0                  : INTEGER ;
    x1                  : INTEGER ;
    y1                  : INTEGER ;
    temp                : INTEGER ;
    i                   : INTEGER ;
    edge                : INTEGER ;
    next_edge           : INTEGER ;
    active              : INTEGER ;
    xord                : ARRAY [ 0 .. MaxPts ] OF INTEGER ;
    x                   : ARRAY [ 0 .. MaxPts ] OF CARDINAL ;
    e                   : ARRAY [ 0 .. MaxPts ] OF INTEGER ;

  PROCEDURE quicksort ( l : INTEGER ;
                        r : INTEGER ) ;

    VAR
      i                 : INTEGER ;
      j                 : INTEGER ;
      temp              : INTEGER ;
      key               : CARDINAL ;

    BEGIN (* quicksort *)
      WHILE ( l < r ) DO
        i := l ;
        j := r ;
        key := x [ xord [ j ] ] ;
        REPEAT
          WHILE ( i < j ) AND ( x [ xord [ i ] ] <= key ) DO
            i := i + 1 ;
          END (* WHILE *) ;
          WHILE ( i < j ) AND ( key <= x [ xord [ j ] ] ) DO
            j := j - 1 ;
          END (* WHILE *) ;
          IF i < j THEN
            temp := xord [ i ] ;
            xord [ i ] := xord [ j ] ;
            xord [ j ] := temp ;
          END (* IF *) ;
        UNTIL ( i >= j ) ;
        temp := xord [ i ] ;
        xord [ i ] := xord [ r ] ;
        xord [ r ] := temp ;
        IF ( i - l < r - i ) THEN
          quicksort ( l , i - 1 ) ;
          l := i + 1 ;
        ELSE
          quicksort ( i + 1 , r ) ;
          r := i - 1 ;
        END (* IF ... ELSE *) ;
      END (* WHILE *) ;
    END quicksort ;

  BEGIN (* Polygon *)
    IF n > MaxPts THEN
      n := MaxPts ;
    END (* IF *) ;
    miny := py [ 0 ] ;
    maxy := miny ;
    FOR i := 0 TO n - 1 DO
      IF INTEGER ( py [ i ] ) < miny THEN
        miny := py [ i ] ;
      END (* IF *) ;
      IF INTEGER ( py [ i ] ) > maxy THEN
        maxy := py [ i ] ;
      END (* IF *) ;
    END (* FOR *) ;
    FOR y := miny TO maxy DO
      active := - 1 ;
      FOR edge := 0 TO n - 1 DO
        IF edge = INTEGER ( n - 1 ) THEN
          next_edge := 0 ;
        ELSE
          next_edge := edge + 1 ;
        END (* IF ... ELSE *) ;
        x0 := px [ edge ] ;
        y0 := py [ edge ] ;
        x1 := px [ next_edge ] ;
        y1 := py [ next_edge ] ;
        IF y0 > y1 THEN
          temp := x0 ;
          x0 := x1 ;
          x1 := temp ;
          temp := y0 ;
          y0 := y1 ;
          y1 := temp ;
        END (* IF *) ;
        IF y = y0 THEN
          e [ edge ] := 0 ;
          x [ edge ] := x0 ;
        ELSIF ( y0 <= y ) AND ( y <= y1 ) THEN
          IF x1 >= x0 THEN (* x increases with y *)
            INC ( e [ edge ] , 2 * ( x1 - x0 ) ) ;
            WHILE e [ edge ] > INTEGER ( y1 - y0 ) DO
              DEC ( e [ edge ] , 2 * ( y1 - y0 ) ) ;
              INC ( x [ edge ] ) ;
            END (* WHILE *) ;
          ELSE (* x decreases with y *)
            INC ( e [ edge ] , 2 * ( x0 - x1 ) ) ;
            WHILE e [ edge ] > INTEGER ( y1 - y0 ) DO
              DEC ( e [ edge ] , 2 * ( y1 - y0 ) ) ;
              DEC ( x [ edge ] ) ;
            END (* WHILE *) ;
          END (* IF ... ELSE *) ;
          active := active + 1 ;
          xord [ active ] := edge ;
        END (* IF ... ELSEIF *) ;
      END (* FOR *) ;
      quicksort ( 0 , active ) ;
      i := 0 ;
      WHILE i < active DO
        HLine ( x [ xord [ i ] ] , y , x [ xord [ i + 1 ] ] , c ) ;
        i := i + 2 ;
      END (* WHILE *) ;
    END (* FOR *) ;
  END Polygon ;


  CONST
    White               = 15 ;
    Black               = 0 ;

  CONST
    WindFrX             = 55 ;  (* 135 ; *)
    WindFrY             = 155 ; (* 155 ; *)
    WindToX             = 427 ; (* 507 ; *)
    WindToY             = 327 ; (* 327 ; *)

    ColorFrameXSize     = 60 ;
    ColorFrameYSize     = 40 ;

  TYPE
    RunAttrType         = ( ResetType     ,
                            MonoType      ,
                            NoFrame       ,
                            FrameOnly     ,
                            ColorPlace    ,
                            ColPlaceCycle ,
                            LoopCycle     ) ;

  VAR
    RunAttr             : RunAttrType ;
    Color               : CARDINAL ;
    ColorXCoord         : CARDINAL ;
    ColorYCoord         : CARDINAL ;
    PlaceColor          : CARDINAL ;
    ColorRunMode        : BOOLEAN ;
    Ch                  : CHAR ;


PROCEDURE IncColor ( VAR ColorToInc : CARDINAL ) ;

  BEGIN (* IncColor *)
    IF ColorRunMode THEN
      INC ( ColorToInc ) ;
      ColorToInc := ColorToInc MOD 16 ;
      IF ColorToInc = 0 THEN
        ColorToInc := 1 ;
      END (* IF *) ;
    END (* IF *) ;
  END IncColor ;


PROCEDURE Frame ( FromX : CARDINAL ;
                  FromY : CARDINAL ;
                  ToX   : CARDINAL ;
                  ToY   : CARDINAL ;
                  Color : CARDINAL ) ;

  BEGIN (* Frame *)
    Line ( FromX , FromY + 0 , ToX , FromY + 0 , Color ) ;
    Line ( FromX , FromY + 1 , ToX , FromY + 1 , Color ) ;
    Line ( FromX , FromY + 2 , ToX , FromY + 2 , Color ) ;
    Line ( FromX , ToY - 2 , ToX , ToY - 2 , Color ) ;
    Line ( FromX , ToY - 1 , ToX , ToY - 1 , Color ) ;
    Line ( FromX , ToY - 0 , ToX , ToY - 0 , Color ) ;
    Line ( FromX + 0 , FromY , FromX + 0 , ToY , Color ) ;
    Line ( FromX + 1 , FromY , FromX + 1 , ToY , Color ) ;
    Line ( FromX + 2 , FromY , FromX + 2 , ToY , Color ) ;
    Line ( ToX - 2 , FromY , ToX - 2 , ToY , Color ) ;
    Line ( ToX - 1 , FromY , ToX - 1 , ToY , Color ) ;
    Line ( ToX - 0 , FromY , ToX - 0 , ToY , Color ) ;
  END Frame ;


PROCEDURE FillSquare ( FromX : CARDINAL ;
                       FromY : CARDINAL ;
                       ToX   : CARDINAL ;
                       ToY   : CARDINAL ;
                       Color : CARDINAL ) ;

  VAR
    Loop                : CARDINAL ;

  BEGIN (* FillSquare *)
    FOR Loop := FromY TO ToY DO
      HLine ( FromX , Loop , ToX , Color ) ;
    END (* FOR *) ;
  END FillSquare ;


PROCEDURE DrawAP ( XCoord    : CARDINAL ;
                   YCoord    : CARDINAL ;
                   BackGrCol : CARDINAL ;
                   APColor   : CARDINAL ) ;

  CONST
    APSize              = 18 ;

  TYPE
    CoordArrType        = ARRAY [ 0 .. APSize - 1 ] OF CARDINAL ;

  CONST
    FromX = CoordArrType (  0 ,  0 ,  1 ,  1 ,  0 ,  1 , 20 , 19 ,  2 ,
                            3 , 11 , 10 ,  5 ,  4 , 11 , 12 , 16 , 17 ) ;
    FromY = CoordArrType (  0 ,  0 ,  1 ,  1 , 15 , 14 ,  0 ,  1 , 12 ,
                           12 ,  3 ,  4 ,  9 , 10 ,  3 ,  3 ,  3 ,  4 ) ;
    ToX   = CoordArrType (  0 , 20 ,  1 , 19 , 20 , 19 , 20 , 19 , 11 ,
                           12 , 16 , 17 , 17 , 16 , 11 , 12 , 16 , 17 ) ;
    ToY   = CoordArrType ( 15 ,  0 , 14 ,  1 , 15 , 14 , 15 , 14 ,  3 ,
                            3 ,  3 ,  4 ,  9 , 10 , 12 , 12 , 10 ,  9 ) ;

  VAR
    Loop                : CARDINAL ;

  BEGIN (* DrawAP *)
    FillSquare ( XCoord , YCoord , XCoord + 20 , YCoord + 15 , BackGrCol ) ;
    FOR Loop := 0 TO APSize - 1 DO
      Line ( XCoord + FromX [ Loop ] , YCoord + FromY [ Loop ] ,
             XCoord + ToX [ Loop ] , YCoord + ToY [ Loop ] , APColor ) ;
    END (* FOR *) ;
  END DrawAP ;


PROCEDURE DrawText ( XCoord : CARDINAL ;
                     YCoord : CARDINAL ;
                     Color  : CARDINAL ;
                     Size   : CARDINAL ;
                     Text   : ARRAY OF CHAR ) ;

  VAR
    Loop                : CARDINAL ;
    Ch                  : CHAR ;

  PROCEDURE PlotCh ( XC    : CARDINAL ;
                     YC    : CARDINAL ;
                     Color : CARDINAL ;
                     CurCh : CHAR ) ;

    VAR
      Row                 : CARDINAL ;
      Col                 : CARDINAL ;
      Card                : CARDINAL ;
      ChCode              : CARDINAL ;
      LineLoop            : CARDINAL ;
      EndLoop             : CARDINAL ;
      Bits                : BITSET ;
      PlotXCoord          : CARDINAL ;
      PlotYCoord          : CARDINAL ;

    BEGIN (* PlotCh *)
      ChCode := ORD ( CurCh ) ;
      FOR Row := 0 TO 15 DO
        IF Row < 8 THEN
          Card := VAL ( CARDINAL , CHGArr [ ChCode * 8 + Row ] ) ;
        ELSE
          Card := VAL ( CARDINAL , CHGArr [ ( ChCode * 8 + Row - 8 ) + 2048 ] ) ;
        END (* IF ... ELSE *) ;
        Bits := BITSET ( Card ) ;
        FOR Col := 0 TO 7 DO
          IF Col IN Bits THEN
            PlotXCoord := XC + ( 7 - Col ) * Size ;
            PlotYCoord := YC + Row * Size ;
            EndLoop := Size - 1 ;
            FOR LineLoop := 0 TO EndLoop DO
              Line ( PlotXCoord , PlotYCoord + LineLoop ,
                     PlotXCoord + EndLoop , PlotYCoord + LineLoop ,
                     Color ) ;
            END (* FOR *) ;
          END (* IF *) ;
        END (* FOR *) ;
      END (* FOR *) ;
    END PlotCh ;

  BEGIN (* DrawText *)
    FOR Loop := 0 TO HIGH ( Text ) DO
      Ch := Text [ Loop ] ;
      IF Ch = 0C THEN
        RETURN ;
      END (* IF *) ;
      PlotCh ( XCoord , YCoord , Color , Ch ) ;
      XCoord := XCoord + 9 * Size ;
    END (* FOR *) ;
  END DrawText ;


PROCEDURE Window ( FromX     : CARDINAL ;
                   FromY     : CARDINAL ;
                   ToX       : CARDINAL ;
                   ToY       : CARDINAL ;
                   FrameCol  : CARDINAL ;
                   BackgrCol : CARDINAL ) ;

  BEGIN (* Window *)
    Frame ( FromX , FromY , ToX , ToY , FrameCol ) ;
    FillSquare ( FromX + 3 , FromY + 3 , ToX - 3 , ToY - 3 , BackgrCol ) ;
  END Window ;


PROCEDURE WindowStep ;

  BEGIN (* WindowStep *)
    ColorYCoord := ColorYCoord + 55 ;
  END WindowStep ;


PROCEDURE SetStartColor ( VAR Color : CARDINAL ) ;

  BEGIN (* SetStartColor *)
    IF ColorRunMode THEN
      Color := 0 ;
    ELSE
      Color := 7 ;
    END (* IF ... ELSE *) ;
  END SetStartColor ;


PROCEDURE SetColor ( VAR RealColor : CARDINAL ;
                         Color     : CARDINAL ) ;

  BEGIN (* SetColor *)
    IF ColorRunMode THEN
      RealColor := Color ;
    ELSE
      RealColor := 7 ;
    END (* IF ... ELSE *) ;
  END SetColor ;


PROCEDURE DrawPart1 ;

  VAR
    Loop                : CARDINAL ;

  BEGIN (* DrawPart1 *)
    SetStartColor ( Color ) ;
    FOR Loop := 0 TO 480 BY 20 DO
      Line ( 0 , Loop , 639 , Loop , Color ) ;
      Line ( 0 , Loop + 1 , 639 , Loop + 1 , Color ) ;
      Line ( 0 , Loop + 2 , 639 , Loop + 2 , Color ) ;
      Line ( 0 , Loop + 3 , 639 , Loop + 3 , Color ) ;
      IncColor ( Color ) ;
    END (* FOR *) ;
    SetStartColor ( Color ) ;
    FOR Loop := 0 TO 630 BY 20 DO
      Line ( Loop , 0 , Loop , 479 , Color ) ;
      Line ( Loop + 1 , 0 , Loop + 1 , 479 , Color ) ;
      Line ( Loop + 2 , 0 , Loop + 2 , 479 , Color ) ;
      Line ( Loop + 3 , 0 , Loop + 3 , 479 , Color ) ;
      IncColor ( Color ) ;
    END (* FOR *) ;
    Color := White ;
    Frame ( 0 , 0 , 639 , 479 , Color ) ;
  END DrawPart1 ;


PROCEDURE DrawPart2 ;

  VAR
    Loop                : CARDINAL ;

  BEGIN (* DrawPart2 *)
    Color := White ;
    Circle ( 239 , 239 , 220 , Color ) ;
    Circle ( 239 , 239 , 221 , Color ) ;
    Circle ( 239 , 239 , 222 , Color ) ;
    Circle ( 239 , 239 , 223 , Color ) ;
    Circle ( 239 , 239 , 224 , Color ) ;
    Circle ( 239 , 239 , 225 , Color ) ;
    Circle ( 239 , 239 , 226 , Color ) ;
    Window ( WindFrX , WindFrY , WindToX , WindToY , White , Black ) ;
    SetColor ( Color , 12 ) ;
    DrawText ( WindFrX + 80 , WindFrY + 20 , Color , 4 , 'SIGNUM' ) ;
    DrawText ( WindFrX + 60 , WindFrY + 80 , Color , 4 , 'Co. Ltd.' ) ;
    Window ( 100 , 340 , 385 , 395 , White , Black ) ;
    SetColor ( Color , 10 ) ;
    DrawText ( 120 , 350 , Color , 1 , 'Generator sygna­u wizji dla' ) ;
    DrawText ( 150 , 370 , Color , 1 , 'monitorŻw VGA / SVGA' ) ;
    Window ( 90 , 90 , 385 , 135 , White , Black ) ;
    DrawText ( 115 , 100 , Color , 2 , 'Bia­ystok 1995' ) ;
    ColorXCoord := 490 ;
    ColorYCoord := 30 ;
    FOR Loop := 0 TO 7 DO
      SetColor ( Color , Loop ) ;
      Window ( ColorXCoord , ColorYCoord , ColorXCoord + ColorFrameXSize ,
               ColorYCoord + ColorFrameYSize , White , Color ) ;
      WindowStep ;
    END (* FOR *) ;
    ColorXCoord := 560 ;
    ColorYCoord := 30 ;
    FOR Loop := 8 TO 15 DO
      SetColor ( Color , Loop ) ;
      Window ( ColorXCoord , ColorYCoord , ColorXCoord + ColorFrameXSize ,
               ColorYCoord + ColorFrameYSize , White , Color ) ;
      WindowStep ;
    END (* FOR *) ;
    SetColor ( Color , 13 ) ;
    DrawAP ( 25 , 430 , Black , Color ) ;
  END DrawPart2 ;


PROCEDURE DrawAll ;

  BEGIN (* DrawAll *)
    GraphMode ;
    DrawPart1 ;
    DrawPart2 ;
  END DrawAll ;


PROCEDURE DrawFrame ;

  BEGIN (* DrawFrame *)
    GraphMode ;
    DrawPart1 ;
  END DrawFrame ;


PROCEDURE DrawNoFrame ;

  BEGIN (* DrawNoFrame *)
    GraphMode ;
    Frame ( 0 , 0 , 639 , 479 , White ) ;
    DrawPart2 ;
  END DrawNoFrame ;


PROCEDURE DrawNextColorPlace ;

  BEGIN (* DrawNextColorPlace *)
    Window ( 80 , 40 , 560 , 440 , White , PlaceColor ) ;
    DrawText ( 150 , 150 , 15 - PlaceColor , 6 , 'SIGNUM' ) ;
    DrawText ( 120 , 250 , 15 - PlaceColor , 6 , 'Co. Ltd.' ) ;
    INC ( PlaceColor ) ;
    PlaceColor := PlaceColor MOD 16 ;
  END DrawNextColorPlace ;


PROCEDURE DrawColorPlace ;

  BEGIN (* DrawColorPlace *)
    ColorRunMode := TRUE ;
    GraphMode ;
    DrawPart1 ;
    DrawNextColorPlace ;
  END DrawColorPlace ;


BEGIN (* VGARom *)
  RunAttr := ResetType ;
  LOOP
    CASE RunAttr OF
      ResetType         :
        ColorRunMode := TRUE ;
        DrawAll ;
    | MonoType          :
        ColorRunMode := FALSE ;
        DrawAll ;
    | FrameOnly         :
        DrawFrame ;
    | NoFrame           :
        DrawNoFrame ;
    | ColorPlace        :
        PlaceColor := 0 ;
        DrawColorPlace ;
    | ColPlaceCycle     :
        DrawNextColorPlace ;
    | LoopCycle         :
        ;
    ELSE
      RunAttr := ResetType ;
    END (* CASE *) ;
    Ch := IO . RdKey ( ) ;
    CASE Ch OF
      '1'   :
        RunAttr := MonoType ;
    | '2'   :
        RunAttr := ResetType ;
    | '3'   :
        RunAttr := NoFrame ;
    | '4'   :
        RunAttr := FrameOnly ;
    | '5'   :
        RunAttr := ColorPlace ;
    | '6'   :
        IF RunAttr = ColorPlace THEN
          RunAttr := ColPlaceCycle ;
        ELSE
          IF RunAttr <> ColPlaceCycle THEN
            RunAttr := LoopCycle ;
          END (* IF *) ;
        END (* IF ... ELSE *) ;
    | 'q'   :
        EXIT ;
    ELSE
      RunAttr := LoopCycle ;
    END (* CASE *) ;
  END (* LOOP *) ;
  TextMode ;
END VGARom.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Wróć do „Inne mikroklocki, również peryferyjne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 15 gości