## Kurs TURBO-BASICA XL - odcinek #2

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.:

      	100 EXEC PROCEDURA
      	... ...
      	500 PROC PROCEDURA
      	...   ...
      	700 ENDPROC

  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.:

      	100 ON... GO# WIERSZ1,WIERSZ2,WIERSZ3
      	100 ON... EXEC PRCEDURA1,PROCEDURA2

  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).

Marek Turowski

Pobierz Turbo Basic XL 1.5 (29kB)