## Kurs Turbo Basica XL - odcinek #1

Drogi użytkowniku atarynki, nie mający zielonego pojęcia o programowaniu w języku assemblera, a znający choć trochę BASIC. Jeśli masz ambicję napisać wspaniały, szybki, wręcz olśniewający program, to zapewne sięgasz po najprostsze rozwiązanie. To znaczy, nie sięgasz po klawisz `OPTION` przy włączaniu komputera. ATARI BASIC! Jeśli nawet otoczysz się podręcznikami i poradnikami, jedyne co z nich wyczytasz na temat łatwości osiągania wymarzonych efektów, to: ...niestety...bardzo żmudna praca...nie pozwala...nie daje uciekać się do języka maszynowego...szybkość nie jest oszałamiająca...praktyczna przydatność pod znakiem zapytania...zbyt długo...nie można...z powodu...jeszcze jedna wada...znacznie mniejsza szybkość...niezbędna procedura maszynowa... Są to cytaty z "PORADNIKA PROGRAMISTY ATARI" W. Zientary (swoją drogą, bardzo dobrego), wynotowane z rozdziału o grafice i animacji, z kilku zaledwie stron. Na szczęście, możemy dokonać innego wyboru. Do dyspozycji mamy jeszcze kilka odmian BASIC-a - BASIC XE, MICROSOFT BASIC i napisany w 1985 roku przez Franka Ostrowskiego TURBO BASIC XL, którym zajmiemy się na łamach naszego maga. Dlaczego TURBO BASIC? Na początek mały test. Zaopatrujemy się w kartkę, coś do pisania, zegarek z sekundnikiem i nośnik z zapisanym jakimkolwiek programem, napisanym w ATARI BASIC-u. Odpalamy komputer z włączonym interpreterem BASIC-a. Wykonujemy instrukcję `? FRE(0)`. Wynik zapisujemy. Następnie prosta pętla `FOR I=0 TO 10000:NEXT I`, uruchamiamy ją i mierzymy czas wykonania, wynik również zapisujemy. Teraz, funkcją `LOAD` DOS-u wczytujemy TURBO BASIC i powtarzamy wszystkie czynności. Próbujemy też uruchomić program napisany w ATARI BASICu. Podsumowujemy wyniki, dochodzimy do wniosku, że TURBO-BASIC jest "nieco" szybszy, że pozostawia nam więcej wolnej pamięci i jest "kompatybilny" z ATARI BASIC-em. Jeśli dodać do tego, że ma o ponad 40 instrukcji więcej, a programy pisze się łatwiej, i co też nie bez znaczenia, dużo przyjemniej, to można by sądzić, że jesteśmy już prawie w niebie. Tak dobrze to jednak nie jest. Ma on też i swoje wady. Jest dużo wolniejszy od języka maszynowego, trzeba go wczytywać z urządzenia zewnętrznego, wymaga nieco większej ostrożności przy testowaniu programów, albowiem resetowanie zawieszonego komputera znacznie częściej, niż w ATARI BASIC-u, kończy się bardzo smutno. Ma też swoje chimeryczne zagrywki, kiedy poprawnie napisany program nie przejawia ochoty do pracy. Dlaczego? Jak tego uniknąć? O tym później. Jak wszystko, co nowe wymaga także nauki, pozostaje też kwestia przyzwyczajenia się do niego. Jednak używając go, szybko zapomnimy o istnieniu ATARI BASIC-a. Muszę się przyznać, że bardzo łatwo przyszło mi to napisać, bo mam 192kB RAM-u i 128kB na RAM-CARCIE. Taka konfiguracja, oraz DOS 6.1 plus PROFESSIONAL COPY jako system znacznie ułatwia korzystanie z TURBO-BASIC-a, gorąco polecam! Uruchomienie DOS-u i TURBO BASIC-a trwa około trzech sekund, a więc o niebo krócej, niż korzystając ze stacji. W jeszcze gorszej sytuacji są posiadacze magnetofonów, zwłaszcza bez jakiegokolwiek TURBO, tu stosowanie TURBO-BASIC-a do programowania staje się problematyczne.

Czas na opis. TURBO-BASIC jest jednostronnie zgodny z ATARI BASIC-em, to znaczy, że każdy, kulturalnie napisany program w ATARI BASIC-u będzie działał w TURBO-BASIC-u. Tylko w przypadku programów zapisanych instrukcją `LIST` wystąpią kłopoty z ich odczytaniem, gdy zawierają słowa kluczowe TURBO-BASIC-a użyte jako nazwy zmiennych. Należy wtedy dokonać zmiany tych nazw. Także programy z zawartymi w nich nierelokowalnymi procedurami maszynowymi mogą źle działać, lub nawet zawiesić komputer, gdyż inny jest obszar pamięci dostępnej dla użytkownika. Takie samo zjawisko wystąpi, jeśli program odwołuje się bezpośrednio do adresów Display Listy (pamięć obrazu jest umieszczana tuż pod RAMTOP-em, a ten jest inny dla obu BASIC-ów). TURBO-BASIC pozostawia dla użytkownika obszar pamięci od adresu 13865 ($3629) do 49151 ($BFFF), przy czym w górnej jego części umieszczana jest jeszcze pamięć obrazu, Wolna pozostaje również szósta strona - 1536 ($0600) do 1791 ($06FF). Instrukcje mogą być wprowadzane w dowolnej formie (w negatywie, małymi literami). Bezpośrednio w programie można stosować liczby szesnastkowe, poprzedzone znakiem `$`. Nazwy zmiennych muszą się zaczynać od litery i dodatkowo od znaku podkreślenia. Tak, jak w ATARI BASIC-u, interpreter TURBO-BARIC-a odnajduje wiersze przeszukując program od początku. Szybkość wykonywania takiego programu zależy od jego długości i struktury. Można jednak wiersz lub procedurę oznaczyć etykietą (nazwą), wtedy adres takiego wiersza jest umieszczany w tablicy zmiennych. Odwołanie się do etykiety powoduje bezpośredni skok do wiersza lub procedury. W takim przypadku szybkość programu przestaje być zależna od jego długości i położenia w nim wykonywanych wierszy. Etykieta musi być umieszczona na początku wiersza i poprzedzona znakiem `#`. Z powodu stosowania etykiet tablica zmiennych w TURBO-BASIC-u ma wielkość 256 wpisów (ATARI BASIC - 128). Inny jest sposób pisania programów. Dzięki nowym instrukcjom i funkcjom zbędne jest korzystanie z wielu konstrukcji popularnych w ATARI BASIC-u. Dla utrzymania zgodności z ATARI BASIC-em zachowane zostały instrukcje w zasadzie już zbędne (`GOTO`, `GOSUB`, `POP`).

Oto zestawienie struktur:

ATARI BASIC |  | TURBO-BASIC
`GOTO` (`numer`) | `GO#` (`nazwa`)
`GOSUB` (`numer`) | `EXEC` (`nazwa`)
`ON` ... `GOTO` (`numery`) | `ON` ... `G0#` (`nazwy`)
`ON` ... `GOSUB` (`numery`) | `ON` ... `EXEC` (`nazwy`)
`TRAP` (`numer`) | `TRAP #`(`nazwa`)
`RESTORE` (`numer`) | `RESTORE #`(`nazwa`)
`POP :GOTO` (`numer`) | `EXIT #`(`nazwa`)
`FOR I=0 TO X:NEXT I` | `PAUSE X`
Wiersz zaznaczony etykietą: | `100 #`(`nazwa`)`:`(`instrukcje`)

Oprócz pętli `FOR`/`NEXT` oraz instrukcji warunkowej `IF`/`THEN` TURBO-BASIC posiada kilka innych rodzajów pętli i instrukcję `IF`/`ELSE`/`ENDIF`. Pozwala to na znacznie prostsze budowanie bloków programu. Oto następne zestawienie:

ATARI BASIC |  | TURBO-BASIC
pętla bez końca
    100 ...
    ...
    500 GOTO 100
    100 DO:...
    ...
    500 LOOP
pętla z warunkiem na końcu
    100 ...
    ...
    500 IF...THEN 100
    100 REPEAT:...
    ...
    500 UNTIL...
pętla z warunkiem na początku
    100 IF...THEN 510
    ...
    500 GOTO 100
    510 ...
    100 WHILE
    ...
    500 ...:WEND
    510 ...
instrukcja warunkowa z dwoma wariantami
    100 IF...THEN 300
    ...
    290 GOTO 510
    300 ...
    ...
    500 ...
    510 ...
    100 IF...
    ...
    290 ELSE
    300 ...
    ...
    500 ...:ENDIF
    510 ...
opuszczenie pętli warunkowej lub bez końca
    100 ...
    ...
    300 IF...THEN 510
    ...
    500 IF...THEN 100
    510 ...
    100 REPEAT :...
    ...
    300 IF...THEN EXIT
    ...
    500 UNTIL ...
    510 ...
opuszczenie pętli `FOR`/`NEXT` lub procedury
    100 FOR I=0 TO 100
    ...
    300 IF...THEN POP :GOTO 510
    ...
    500 NEXT I
    510 ...
    100 FOR I=0 TO 100
    ...
    300 IF...THEN EXIT
    ...
    500 NEXT I
    510 ...

To tylko niektóre przykłady możliwości TURBO-BASIC-a. Powinno się stosować struktury przeznaczone dla niego zwłaszcza tam, gdzie wymagana jest duża szybkość programu, stosowanie ich znacznie zwiększy przejrzystość programu i bardzo ułatwi pracę. Oczywiście, nic nie stoi na przeszkodzie, by stosować także instrukcje typowe dla ATARI BASICA W tym odcinku naszego kursu pozostałaby jeszcze sprawa współpracy z DOS-em. Tutaj widać znaczną różnicę - w ATARI BASIC-u można przechodzić do DOS-u w każdej chwili bez obaw o utratę programu. Przy TURBO-BASIC-u możemy o tym spokojnie zapomnieć! Przejście do DOS-u powoduje nie tylko utratę BASIC-a, ale i pisanego w nim programu! Po wykonaniu instrukcji `DOS` doczytywany jest plik DUP.SYS, który niszczy TURBO-BASIC. Są DOS-y, np. II+/D napisany przez S. Dorndorfa, które dają możliwość ponownego uruchomienia TURBO-BASIC-a, należy wykonać komendę `RUN 6000`, program jednak ulega skasowaniu. Nie polecałbym jednak stosowania tej metody, gdy uda nam się zawiesić komputer a po jego zresetowaniu zgłosi się DOS. Zdarzyło mi się kilka razy tak, że uruchomiony ponownie TURBO-BASIC działał źle, ale ujawniło się to dopiero wtedy, gdy chciałem zapisać na dysk efekty swojej pracy. Aby umożliwić użytkownikowi kontak z DOS-em TURBO-BASIC został wyposażony w kilka przydatnych instrukcji:

`BLOAD` np. `BLOAD "2FA0A9A9-AFED-450F-9CCF-BDA8D67202A2.html"` (`BL.`)
  Odczytuje z podanego urządzenia plik binarn i umieszcza go w pamięci pod adresem podany w nagłówku pliku, lecz go nie uruchamia. Odpowiada to funkcji `LOAD /N` DOS-u.
`BRUN` np. `BRUN "2FA0A9A9-AFED-450F-9CCF-BDA8D67202A2.html"` (`BR.`)
  Odczytuje z podanego urządzenia plik binarny, umieszcza go w pamięci pod adresem podanym w nagłówku i uruchamia go. Odpowiada to funkcji `LOAD` DOS-u.
`DELETE` np. `DELETE "2FA0A9A9-AFED-450F-9CCF-BDA8D67202A2.html"` (`DEL.`)
  Usuwa z dysku plik (pliki) podane jako nazwa. Odpowiada to funkcji `DELETE` lub `ERASE FILE` DOS-u.
`DIR` lub `DIR "Dx:*.*"`, gdy dotyczy numeru stacji innego niż D1:
  Odczytuje katalog dysku. Odpowida funkcji `DIRECTORY` DOS-u.
`LOCK` np. `LOCK "2FA0A9A9-AFED-450F-9CCF-BDA8D67202A2.html"`
  Zabezpiecza plik (pliki) podane jako nazwa. Odpowiada funkcji `LOCK FILE` DOS-u.
`RENAME` np. `RBNAME "ADF8F135-1058-4D43-B2E6-59B3A684BF1E.html"` (`REN.`)
  Zmienia nazwę podanego pliku. Odpowiada funkcji `RENAME FILE` DOS-u.
`UNLOCK` np. `UNLOCK "2FA0A9A9-AFED-450F-9CCF-BDA8D67202A2.html"` (`UNL.`)
  Odbezpiecza plik (pliki) podane jako nazwa. Odpowiada funkcji `UNLOCK FILE` DOS-u.

Wszystkie nazwy podajemy na ogólnie przyjętych zasadach korzystania z DOS-u, można używać również znaków specjalnych (`*`, `?`). Należy jednak bardzo uważać na to, co się robi, gdyż nie będzie żadnych ostrzeżeń typu "ARE YOU SURE?" czy brzęczyków i w jednej chwili możemy stracić zawartość dysku. Podane instrukcje potraktowałem na razie bardzo ogólnie, dokładniej zajmiemy się nimi następnym razem. By zakończyć kwestię DOS-u trzeba jeszcze powiedzieć, że nie każdy DOS poprawnie współpracuje z TURBO-BASIC-em. Zanim zdecydujemy się na pisanie programów musimy dokładnie przetestować DOS. Jak? W następnym odcinku. Najczęstszą dolegliwością jest zła współpraca obu programów przy operacjach WE/WY. Ja osobiście wybrałem DOS II+/D v. 6.4, a później wersję na RAM-CART. Mimo kilku błędów, niezbyt uciążliwych na szczęście, jest to, nie tylko w mojej opinii, najlepszy DOS. Zajmuje mało miejsca na dysku i w pamięci, nie ma pliku DUP.SYS, ma niespotykane w innych DOS-ach możliwości (ciekawostką jest możliwość automatycznego zakładania ramdysku na komputerze bez rozszerzenia pamięci), no i co najważniejsze dla nas, to bezbłędna współpraca z TURBO-BASIC-em, jego kompilatorem, jak i biblioteką procedur.

Na zakończenie chciałbym jeszcze dodać, że jeśli coś z niniejszej lekcji jest niezrozumiałe lub nieznane, to bez obawy, wszysko się wyjaśni w następnych odcinkach. Podam wszystkie instrukcje nieznane w ATARI BASIC-u. Jak już zaznaczyłem na początku, kurs ten jest przeznaczony dla tych, którzy mają już jako takie pojęcie o programowaniu w BASIC-u, zacznie się bowiem od momentu, w którym TURBO-BASIC zaczyna się różnić od ATARI BASIC-a. Oczywiście, jeśli redakcja zostanie zasypana listami z prośbą o lekcje ABC, to równolegle poprowadzimy zajęcia od "zera". Jeszcze w kwestii formalnej - do tego, co będę starał się wam przekazać dochodziłem sam, są to moje doświadczenia. Kurs ten na pewno nie wyczerpuje wszystkich możliwości TURBO-BASICA, języka dającego tak ogromną swobodę programiście, że chyba mało kto mógłby powiedzieć, że wie wszystko, co można za jego pomocą osiągnąć. W swojej edukacji, jak i przy pisaniu tego artykułu posiłkowałem się poradnikiem "Języki Atari XL/XE" cz. l Wojciecha Zientary, wydanym przez SOETO.

Marek Turowski

Pobierz Turbo Basic XL 1.5 (29kB)