Dla utrzymania zgodności z Atari Basicem, w Turbo Basicu zachowano wiele instrukcji w zasadzie już zbędnych. Przede wszystkim GOTO, GOSUB, POP. W ich miejsce wprowadzone zostały instrukcje posługujące się etykietami, czyli inaczej nazwami. Zastąpienie numeru wiersza etykietą powoduje umieszczenie jego adresu w tablicy zmiennych. Odnalezienie go nie polega już na przeszukiwaniu całego programu, za każdym razem od początku, lecz powoduje bezpośredni "wskok" w żądane miejsce. Przestaje już być problemem długość programu i położenie w nim poszczególnych wierszy, przez co szybkość jego wykonywania jest dużo większa. Zestawienie odpowiadających sobie struktur Atari i Turbo Basica było zaprezentowane w poprzednim odcinku, teraz już czas na ich nieco dokładniejsze omówienie.
GO# (brak skrótu, bo i po co?)
Ta instrukcja wykonuje skok podobnie jak GOTO, ale adres
skoku jest podawany za pomocą etykiety, określającej położenie
wiersza, np.:
100 GO# WIERSZ
...
500 #WIERSZ:...
Wiersz nr 500 został zaznaczony etykietą WIERSZ,
do której odsyła nas instrukcja GO# w wierszu 100.
EXEC (EXE.)
Instrukcja wykonująca skok do procedury o podanej nazwie
i zapamiętująca adres powrotny, np.:
W wierszu 100 wykonywany jest skok do procedury o nazwie
PROCEDURA. Jej początek zaznaczony instrukcją PROC
znajduje się w wierszu 500. Po napotkaniu instrukcji ENDPROC
następuje powrót do zapamiętanego adresu. Program jest wykonywany
od następnej instrukcji po EXEC. (Skróty - PRO.
i ENDP.)
ON... GO#, ON... EXEC
Działanie analogiczne, jak dla ON... GOTO i ON...
GOSUB, jednak operujemy nie numerami wierszy, lecz ich
etykietami, np.:
Tutaj, podobnie jak w Atari Basicu, nie wolno używać skrótów.
TRAP #, RESTORE # (T., RES.)
Analologicznie do TRAP nr_wiersza
i RESTORE nr_wiersza, np.:
100 TRAP #BŁĄD
100 RESTORE #DANE
EXIT (EX.)
Powoduje przerwanie wykonywania pętli lub procedury i jej
opuszczenie, np.:
100 EXIT 500 ;wyjście do wiersza nr 500
100 EXIT PROCEDURA ;wyjście do procedury PROCEDURA
100 EXIT
Brak parametru instrukcji EXIT spowoduje przejście do
kolejnej instrukcji po zamykającej przerwaną pętlę lub procedurę
(NEXT, LOOP, WEND, UNTIL,
RETURN, ENDPROC).
Kolej teraz na pętle i instrukje warunkowe Turbo Basica.
DO/LOOP (LOO.)
Para instrukcji tworząca pętlę bez końca. Pomiędzy nimi można
umieścić dowolną liczbę instrukcji.
100 DO:...
... ...
500 LOOP
Pętla ta jest znacznie szybsza, niż odpowiadająca jej
konstrukcja z GOTO. Można ją opuścić jedynie przy
pomocy EXIT.
REPEAT/UNTIL (REP./UN.)
Para instrukcji tworząca pętlę z warunkiem na końcu.
Wszystkie instrukcje zawarte pomiędzy REPEAT i UNTIL
są wykonywane, dopóki warunek następujący po UNTIL jest
niespełniony (wyrażenie liczbowe po UNTIL ma wartość zero).
Spełnienie warunku spowoduje przerwanie pętli i wykonanie
instrukcji następnej po UNTIL. Warunek ten jest sprawdzany
na końcu pętli, więc instrukcje w niej zawarte muszą być
wykonane co najmiej jeden raz.
100 REPEAT:...
... ...
500 UNTIL A
lub 500 UNTIL A AND B
lub 500 UNTIL X>100 itp.
WHILE/WEND (W./WE.)
Pętla wykonująca instrukcje w niej zawarte, dopóki jest
spełniony warunek następujący po WHILE (wyrażenie liczbowe
następujące po WHILE ma wartość inną niż zero).
Niespełnienie warunku powoduje przerwanie pętli i wykonanie
instrukcji następującej po WEND. Warunek jest sprawdzany na
początku, więc instrukcje pętli mogą nie być wykonane ani razu.
IF/ELSE/ENDIF (IF./EL./END.)
Instrukcja warunkowa z dwoma wariantami Jeśli warunek po IF
nie jest spełniony, to wykonywane są instrukcje pomiędzy IF
i ELSE, jeśli warunek jest spełniony,
to wykonywane są instrukcje pomiędzy ELSE i ENDIF.
Można też pominąć ELSE. Wtedy, jeśli warunek po IF
nie jest spełniony, to wykonywane są instrukcje pomiędzy IF
i ENDIF, gdy warunek jest spełniony,
to wykonywane są instrukcje po ENDIF. Przykłady:
100 IF A=B: ? "A=B":ELSE :? "A<>B":ENDIF
100 IF X:GO# WIERSZ:ENDIF
100 IF A=B
110 ? "A=B"
120 ELSE
130 ? "A<>B"
140 ENDIF
Pozostaje jeszcze instrukcja PAUSE. Jak sama nazwa wskazuje, robi w programie pauzę. A dokładniej - stosowana jest przy wprowadzaniu do programu opóźnień, tam gdzie są nam potrzebne. Jej parametr to ilość przerwań synchronizacji pionowej obrazu, przez które program nic nie będzie robił. Jedno przerwanie to 1/50 sekundy, więc PAUSE 50 to opóźnienie jednosekundowe. (Skrót - PA.).
Wszystkie powyższe instrukcje są strukturalnymi wyrażeniami Turbo Basica, więc należałoby je stosować tam, gdzie się tylko da, unikając odpowiadających im wyrażeń Atari Basica. Tak przynajmiej można wyczytać w podręcznikach programowania. Oczywiście, nikt nie broni używania instrukcji typowych dla Atari Basica, a wręcz czasem są one znacznie wygodniejsze, niż te nowo poznane. Na przykład wyliczanie numeru wiersza dla dokonania skoku za pomocą GOTO lub GOSUB, przy użyciu etykiet jest znacznie utrudnione. Przy dajmy na to trzydziestu dziewięciu różnych wariantach dla skoku (coś takiego już mi się zdażyło) wykonanie tego za pomocą ON... GO# jest niemożliwe, a przy pomocy instrukcji IF "trochę" pracochłonne. Nie da się też całkowicie wyeliminować pętli FOR/NEXT, nawet przy opóźnieniach, mimo wygodnej w stosowaniu PAUSE. Używanie tylko etykiet w instrukcjach RESTORE i DATA bywa niewystarczające i niemożliwe jest wyłączenie instrukcji TRAP bez numeru wiersza (w tym przypadku musi mieć numer większy od 32767). Jedyne, o czym szybko zapomnimy stosując Turbo Basic, to instrukcje GOSUB/RETURN.
Poznane instrukcje pozwalają co prawda uniknąć wielu pomyłek w programie, jednak same wymagają własnych komunikatów błędów, potrzebnych w przypadku nieprawidłowego ich zastosowania. Oto one:
22 - ?NEST
program nie znalazł instrukcji WEND, ENDIF
lub NEXT (tylko po *F +, o czym
innym razem), dla zamknięcia struktury otwartej przez WHILE,
IF lub FOR.
23 - ?WHILE
program napotkał instrukcję WEND, dla której nie było
odpowiedniej instrukcji WHILE.
24 - ?REPEAT
program napotkał instrukcję UNTIL, dla której nie było
odpowiedniej instrukcji REPEAT.
25 - ?DO
program napotkał instrukcję LOOP, dla której nie było
odpowiedniej instrukcji DO.
26 - ?EXIT
instrukcja EXIT została użyta poza pętlą.
27 - XPROC
instrukcja PROC napotkana została w programie bez
wywołania przez EXEC.
28 - ?EXEC
program napotkał instrukcję ENDPROC, dla której nie
było odpowiedniej instrukcji EXEC.
29 - ?PROC
w programie nie ma nazwy procedury, która została użyta
w instrukcji EXEC.
30 - ?#
w programie nie ma nazwy wiersza, która została użyta
w instrukcji GO#, EXIT #, TRAP #
lub RESTORE #.
Pozostałe komunikaty są prawie takie same jak w Atari Basicu, w kilku przypadkach nie zgadzają się ich numery. Łatwo się jednak w tym połapać, dzięki umieszczeniu w komunikacie skrótu nazwy błędu. Następnym razem operacje na blokach (bez skalpela).