- Drukuj
- 18 May 2021
- Programowanie
- 2530 czytań
- 0 komentarzy
czyli BASIC doskonały - część 1
by Sir David
Jedną z cech odróżniających komputery szesnastobitowe od ich ośmiobitowych poprzedników był brak w ich ROMie interpretera języka BASIC. Nie wiem, co było powodem zmiany podejścia producentów do tej kwestii, bo wszystkie popularne mikrokomputery ośmiobitowe miały jakiś (lepszy lub gorszy) BASIC. Być może chodziło o uproszczenie obsługi dla mniej „technicznych“ użytkowników, na wzór konsoli do gier? Zainteresowani zawsze mogli wgrać sobie język programowania z zewnątrz. Komputery szesnastobitowe miały szybsze pamięci zewnętrzne, np. wbudowane stacje dyskietek, więc język programowania można było załadować w miarę szybko. Tyle, że to już nie to samo. Wbudowany interpreter zmuszał użytkownika do wpisywania komend z klawiatury, choćby do załadowania programu (w ZX spectrum za pomocą LOAD ””), a to już mogło stanowić impuls do zainteresowania się, jak brzmią inne komendy i jak to wszystko działa. Nie zdziwiłbym się, gdyby okazało się, że procent użytkowników np. Amigi próbujących programowania był mniejszy, niż w przypadku osób zaczynających swoją przygodę z komputerami w czasach ośmiobitowych.

Gra strategiczna "Ore Warz II", napisana w całości w BASICu.
Wbudowane interpretery języka BASIC na różnych platformach potrafiły się dość mocno różnić. Język ogólnie był ten sam, ale liczba dostępnych rozkazów, ich składnia (szczególnie w przypadku operacji taśmowo/dyskowych) i obsługa edytora już nie, co potrafiło znacząco utrudnić przesiadkę między różnymi maszynami. Chyba najbardziej specyficzny edytor miały komputery z rodziny Sinclaira. Wszystkie pozostałe posiadały edytory ekranowe, czyli pisać dało się w dowolnym miejscu ekranu, natomiast ZX Spectrum (oraz jego poprzednicy i klony) – edytor liniowy. Tu ekran jest podzielony na listing programu na górze i linię edycji na dole. Dodatkowo wpisywanie komend nie odbywa się litera po literze, a wszystkie komendy wprowadzane są w całości, po naciśnięciu jednego klawisza lub kombinacji klawiszy. Ma to na pewno swoje zalety, jak brak błędów w pisowni czy też podgląd na wszystkie dostępne komendy. Ma też wady, bo taki zestaw musiał zostać ograniczony po to, aby dało się go przypisać określonej liczbie klawiszy. Z tego powodu rozszerzenia języka, jak na przykład Betabasic, zmieniają sposób wprowadzania komend na literowy. Edytor liniowy również ma swoje wady, gdyż wprowadzanie lub edycja długich linii, zajmujących kilka wierszy, spowalnia go w bardzo znaczącym stopniu.

Gra logiczna "Slyder" została niemal w całości napisana w BASICu. Jedynym wyjątkiem jest odtwarzacz muzyki, swoją drogą bardzo dobrej.
Jeżeli chodzi o możliwości samego języka, czyli liczbę i rodzaj dostępnych komend, to z najpopularniejszej czwórki: ZX Spectrum, Commodore, Atari, Amstrad, zdecydowanie wyróżniał się ten ostatni. Dopiero SAM Coupé, który pojawił się parę lat później, potrafił mu dorównać. SAM BASIC to w rzeczywistości rozbudowany Betabasic z ZX Spectrum, z którego się wywodzi za sprawą tego samego autora. Dzięki temu przesiadka ze Spectrum na SAMa jest dziecinnie prosta – dostajemy podobny (ale znacznie lepszy!) edytor liniowy i tę samą składnię wszystkich znanych ze Spectrum komend. Ich ilość i możliwości wydają się wręcz oszałamiające i nieograniczone. W efekcie powstała spora liczba ciekawych gier i programów napisanych właśnie w SAM BASICu, a ich jakość i szybkość działania potrafi zadziwić. Według mnie to właśnie SAM BASIC jest najlepszym wyborem dla każdego, kto lubi programować w BASICu, zna już nieco ten z ZX Spectrum i chciałby spróbować czegoś więcej.

Gra logiczna "Twister", to kolejna gra napisana w BASICu z muzyką odtwarzaną w kodzie maszynowym.
SAM Coupé posiada znakomitą instrukcję użytkownika („SAM Coupé Users’ Manual“), gdzie w bardzo przyjemny i przystępny sposób opisany jest między innymi jego BASIC. Dostępna jest jedynie w języku angielskim, jednak nawet osoby z podstawową znajomością tego języka powinny dać radę. Ja poznawałem SAM BASIC w czasach, gdy dopiero zaczynałem się uczyć angielskiego i mimo to szybko zacząłem pisać długie i dość zaawansowane programy. Korzystając z własnych doświadczeń, postaram się przybliżyć najciekawsze możliwości tego języka.

Jeżeli zatrzymamy działanie programu korzystającego z okien tekstowych, to listing pojawi się jedynie w bieżącym oknie.
W pierwszej części artykułu zajmiemy się edytorem. Ogólnie jest to dobrze znany ze Spectrum edytor liniowy. Piszemy na dole ekranu i po naciśnięciu RETURN polecenie wykonuje się lub jeżeli nadamy numer linii, ta przeskoczy do górnej części ekranu jako fragment programu. Podstawowa różnica jest taka, że komendy trzeba wpisywać po literce (choć jest kilka, które można wywołać w całości kombinacją klawiszy, np. naciśnięcie SYMBOL+P napisze PRINT). Dla uproszczenia i przyśpieszenia pisania, komendy zawierające spację można pisać jednym ciągiem, np. GOTO zamiast GO TO. Po wprowadzeniu linii do programu brakujące spacje zostaną dodane. Chcąc przywołać linię do edycji, należy nacisnąć klawisz EDIT (w emulatorze na PC to prawy Alt). Można przywołać od razu konkretną linię, wpisując jej numer i wtedy naciskając EDIT. Po edytowanej linii można poruszać się we wszystkich kierunkach, również góra/dół (czego nie dało się zrobić w Spectrum). Nie muszę chyba mówić, że to znacznie przyśpiesza edycję długich linii.
ZX Spectrum nie posiada chyba żadnych komend wspomagających pracę edytora. W SAMie jest ich oczywiście wiele:
AUTO – wydanie tego polecenia rozpocznie automatyczną numerację linii pisanego programu. Samo AUTO bez parametrów spowoduje rozpoczęcie numeracji z parametrami domyślnymi, czyli od linii 10 z krokiem również 10. Jeżeli istnieją już jakieś linie, to numerowanie zacznie się od numeru bieżącej linii wskazywanej przez znacznik plus 10. Dodanie jednego parametru, np. AUTO 150 rozpocznie numerację od wskazanego numeru. Dodanie dwóch parametrów, czyli np. AUTO 150,20 zmieni dodatkowo krok na 20. Chcąc zatrzymać automatyczną numerację, należy wydać jakiekolwiek polecenie bez numeru linii, np. STOP.
RENUM – zmiana numeracji linii w istniejącym programie. Analogicznie jak w AUTO, wydanie polecenia RENUM bez parametrów zmieni numerację linii w całym programie zaczynając od 10 z krokiem 10. Przy okazji uaktualnione zostaną wszystkie komendy odwołujące się do numerów linii, czyli np. GO TO, GO SUB, RUN, czy RESTORE. Komenda RENUM ma kilka możliwych parametrów i tak np. RENUM 20 TO 50 zmieni numerację tylko części programu, o numerach od 20 do 50. W dalszym ciągu zacznie od linii 10 z krokiem 10. Chcąc zmienić krok, należy użyć parametru STEP n, natomiast początek zmienia się parametrem LINE n. W pełnej postaci, ze wszystkimi możliwymi parametrami komenda może wyglądać np. tak: RENUM 20 TO 50 LINE 5 STEP 15. Należy pamiętać, że zmieniając numerację tylko części programu, nowe numery linii muszą zmieścić się w tym samym miejscu programu, co dotychczasowe. Nie można w ten sposób przenieść części programu w inne miejsce.
DELETE – usuwanie części programu. Domyślny format to przykładowo DELETE 10 TO 50 – usuwa linie od 10 do 50. Parametry można też pomijać, i tak np. DELETE TO 100 usunie wszystko od początku do linii 100, DELETE 100 TO usunie wszystko od linii 100 do końca, a DELETE TO usunie cały program. W odróżnieniu od komendy NEW, DELETE TO zachowa jednak wszystkie obecne w pamięci zmienne.
LIST – w normalnym użyciu komenda ta wyświetla kod programu. Jeżeli jest wywołana z parametrem, np. LIST 100, to wyświetla kod od wskazanej linii. Tak jest w ZX Spectrum, w SAMie można dodatkowo wpisać numer, do którego ma być wyświetlony kod, czyli np. LIST 100 TO 200 albo LIST TO 200 (od początku do linii 200). Jednak w SAMie komenda LIST ma dodatkowe zastosowanie – może być użyta do zmiany sposobu wyświetlania całego kodu programu.
LIST FORMAT 1 (albo 2) – po wydaniu komendy w tej postaci wygląd całego programu ulegnie diametralnej zmianie w ten sposób, że wszystkie polecenia w linii, które dotąd były oddzielone dwukropkiem, będą teraz widoczne w kolejnych liniach (ale bez dodatkowych numerów linii). Dwukropki oddzielające komendy nie będą wyświetlane, a pisząc nową linię, w momencie wpisania dwukropka będziemy przenoszeni do kolejnej linii. Te dwukropki w rzeczywistości tam będą, ale nie będzie ich widać. Dodatkowo wszelkie pętle (np. FOR), procedury (np. DEF PROC) czy warunki (np. IF) będą wyświetlane w ten sposób, że linie w ich „środku“ będą miały dodatkowe wcięcia z lewej strony. Parametr 1 lub 2 oznacza ilość spacji tego wcięcia. Wszystko to będzie się działo automatycznie, znacznie poprawiając czytelność programu. Chcąc przywrócić wygląd standardowy, należy wydać polecenie LIST FORMAT 0.

Fragment kodu gry "Twister" wyświetlony w formacie LIST FORMAT 0 (z lewej) i LIST FORMAT 2 (z prawej).
CSIZE szerokość, wysokość – wygląd kodu programu można też zmodyfikować zmieniając wielkość czcionek. Jak można się domyślić, powyższa komenda definiuje rozmiar znaku w punktach. Jednak wbrew oczekiwaniom nie umożliwia płynnego skalowania wielkości czcionek. Szerokość może mieć jedynie wartość 8 lub 6, ale wartość 6 ma wpływ na szerokość znaku jedynie w trybie graficznym 3, czyli o wysokiej rozdzielczości. Wysokość natomiast może mieć wartości od 6 do 32, jednak powoduje jedynie dodanie dodatkowych pustych linii pomiędzy wierszami. Wartości od 16 do 32 dodatkowo podwójne zwiększają wysokości znaku.
WINDOW lewo, prawo, góra, dół – jest ostatnią komendą, którą można zmienić wygląd edytora (choć bardziej przydatną w kodzie programu). Służy ona do utworzenia okna tekstowego o wielkości mniejszej niż cały ekran. Parametrami są tu numery skrajnych kolumn i wierszy nowego okna. Od momentu wydania tej komendy tekst może być pisany tylko w utworzonym oknie. Lewy górny róg okna ma od tej chwili współrzędne tekstowe 0,0.
Jaki ma to wpływ na edytor? Otóż wprowadzenie komendy WINDOW w trakcie pisania programu spowoduje, że listing będzie ograniczony do zdefiniowanego okna. Ponadto, jeżeli zatrzymamy działanie programu korzystającego z okien tekstowych, to listing pojawi się jedynie w bieżącym oknie, a wszystko poza nim pozostanie nietknięte. Aby przywrócić stan początkowy wystarczy wydać komendę WINDOW bez parametrów.
Okno tekstowe nie ogranicza działania instrukcji graficznych (PLOT, DRAW itd), które w dalszym ciągu operują na całym ekranie. Rozkaz CLS również czyści cały ekran, chyba że będzie wydany z parametrem różnym niż 0, wtedy wyczyści tylko okno tekstowe.
Na tym zakończę opis edytora. Na podstawie własnych doświadczeń mogę z czystym sumieniem powiedzieć, że poznawanie możliwości SAM BASICa to fascynująca przygoda dla użytkownika ZX Spectrum, do której gorąco zachęcam.
Przydatne linki:
- www.simcoupe.org – Emulator SimCoupe
- ftp.nvg.ntnu.no/pub/sam-coupe/docs/manuals/ – dokumentacja SAMa, w tym Users’ Manual
Zaloguj się , żeby móc zagłosować.