Ready/Run

Takie sobie archiwum listingów ze starych magazynów komputerowych


Obrazki w DATA
  • Język programu: Basic
  • Platforma: Atari XE/XL
  • Kod zamieszczono w Bajtek 7/1989
  • Autor listingu: Wojciech Zientara
  • Listing nadesłał: Amarok

Stan listingu:

4
Listing gotowy - uruchamia się na emulatorze lub realnej maszynie zgodny z listingiem zamieszczonym w periodyku

Pisząc program często napotykamy na problem, jak w stosunkowo niewielkiej pamięci komputera zmieścić kilkanaście lub kilkadziesiąt rysunków. Zwykle w takich przypadkach stosuje się odczytywanie rysunku z dyskietki lub rysowanie normalnymi instrukcjami graficznymi.

Drugi z podanych sposobów jest całkiem niezłym rozwiązaniem, szczególnie przy zastosowaniu Turbo Basica, gdzie rysowanie jest stosunkowo szybkie. Dla prostych rysunków spełnia to doskonale postawione zadanie. Listing 1 (w Turbo Basicu) pokazuje przykład takiego właśnie rysunku.
Wykonywany obrazek pochodzi z mojego programu „MPZZM“. Podczas pisania tego programu pojawił się jednak poważny kłopot. Pokazaną metodą można umieścić w programie kilkanaście obrazków, ale potrzeba ich było kilkadziesiąt. Nie da się tego zrobić mając do dyspozycji 36 KB pamięci na cały program. Konieczne jest skondensowanie rysunku.
Istnieje kilka sposobów zagęszczania danych w pamięci komputera, jednak żaden z nich mi nie odpowiadał. Zamiast zagęszczać obraz postanowiłem zrobić to z rysującymi go instrukcjami. W efekcie powstała procedura GRAF i kilka procedur pomocniczych, które są przedstawione w listingu 2.
Jak to działa? Większość instrukcji graficznych Basica posiada dwa parametry. Można więc zakodować je w trzech bajtach: instrukcja i dwie współrzędne. Najoszczędniajszym sposobem zapisu bajtu w programie jest przedstawienie go w postaci odpowiedniego znaku w kodzie ATASCII. Do odczytania jego wartości można wtedy użyć funkcji ASC. Ciąg tak zakodowanych bajtów umieszcza się w instrukcji DATA.
Procedura GRAF odczytuje wskazany ciąg z DATA i kolejno dekoduje zawartą w nim informację. Pierwszy rozpoznany znak oznacza rodzaj instrukcji, a dwa następne — jej parametry. Ponieważ poszczególne operacje są określone kodami od 1, to kod ten wykorzystywany jest do wyboru odpowiedniej procedury pomocniczej przez instrukcję ON/GOSUB (wiersz 570). Realizacja procedur przebiega w pętli WHILE, aż do napotkania litery Q zamiast kodu operacji. Po każdym odczytaniu trzech pierwszych bajtów ciągu są one usuwane. Wartości kodów operacji ustaliłem następująco:
1 — PLOT
2 — DRAWTO
3 — FILLTO
4 — PAINT
5 — TEXT
6 — CIRCLE
7 — COLOR
8 — SQUARE

Wykonanie pierwszych czterech operacji przez odpowiednie procedury pomocnicze (PLT, DRW, FLT i PNT) nie wymaga komentarza. Ponieważ zawsze odczytywane są dwa parametry, to instrukcję COLOR połączyłem z FCOLOR (wiersz 660). Instrukcje TEXT i CIRCLE wymagają jednak trzech parametrów. Brakujący parametr jest odczytywany w procedurze pomocniczej. Oczywiście, konieczne jest po tym usunięcie tego znaku z ciągu. Sposób realizacji tych instrukcji można zobaczyć analizując procedury TXT i CRC (wiersze 640 i 650).
Zastosowanie takiego rozwiązania pozwala na tworzenie dodatkowych, własnych instrukcji graficznych. Przykładem jest tu procedura SQR, która rysuje prostokąt. W ciągu należy dla niej umieścić kolejno współrzędne prawego, górnego oraz lewego, dolnego narożnika. Podobnie można utworzyć procedury realizujące inne operacje.
Ponieważ ciąg z zakodowanym rysunkiem jest umieszczony w instrukcji DATA, to nie może się w nim znaleźć przecinek (kod ASCII=44). Zmusza to do omijania tej współrzędnej przy rysowaniu. Aby wyeliminować tą niedogodność zastosowałem sprawdzanie wartości parametru w wierszach 540 i 550. Jeśli parametr przekracza dozwoloną wartość (dla trybu GRAPHICS 7 jest to 160) to należy go zmniejszyć. W ten sposób zamiast przecinka (kod 44)trzeba zastosować znak o kodzie 44+160=204 (litera L w negatywie).
Teraz cały rysunek, który zajmował pięć wierszy, można zapisać w postaci jednej instrukcji DATA. Wygląd takiej instrukcji, zawierającej obrazek z pierwszego listingu, jest pokazany na listingu 3. Kolejne obrazki powinny być zapisane w wierszach numerowanych od 10 000 co 2. Trzeba ponadto pamiętać, że każdy ciąg musi się kończyć literą Q.
Jak korzystać z procedury GRAF? Proszę spojrzeć na listing 4. Na początku trzeba zadeklarować zmienną $, która służy do odczytu ciągu z DATA. Następnie ustalamy numer obrazka (wiersz 110) i ustawiamy wskaźnik odczytu przez READ na wiersz zawierający żądany obrazek (wiersz 120). Teraz pozostaje tylko wybranie trybu graficznego i właściwych kolorów oraz wywołanie procedury GRAF. Działanie całego przykładu można obejrzeć po połączeniu w jeden program listingów 2, 3 i 4.
Pokazane przykłady napisane zostały w Turbo Basicu. Nic jednak nie stoi na przeszkodzie, aoy wykorzystać je w Atari Basic. Przetłumaczenie nie powinno stanowić problemu nawet dla początkującego programisty. Ponieważ Atari Basic jast znacznie wolniejszy, to dla przyspieszenia rysowania warto przed wywołaniem GRAF wyłączyć obraz instrukcją POKE 559,0 a po jej zakończeniu ponownie włączyć przez POKE 559,34.
 

Listing pochodzi z repozytorium listingów Basic autorstwa AMAROK