| Start | Super Packer | Atari Graphics Studio / AGS | Graph2Font / G2F | Mads | MadPascal |   http://madteam.atari8.info  
SKŁAD GRUPY
PRODUKCJE
scena
gry
użytki
vbxe
SPRZĘT
Sio2SD / Pajero
Sio2SD / Rocky
Stereo / Pajero
GTIA / Psychol
ANTIC + VBXE test
ARTYKUŁY
DEMO EFFECTS
LINKI
   

Marek Turowski
Kurs Turbo Basica XL (2)
Syzygy #3

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

ON... GO#, ON... EXEC
Działanie analogiczne, jak dla ON... GOTOON... 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_wierszaRESTORE 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 REPEATUNTIL 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 IFELSE, jeśli warunek jest spełniony, to wykonywane są instrukcje pomiędzy ELSEENDIF. Można też pominąć ELSE. Wtedy, jeśli warunek po IF nie jest spełniony, to wykonywane są instrukcje pomiędzy IFENDIF, 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



Zebrane produkcje z ostatnich lat dla Atari 8bit XE/XL (11 MB)
 

madteam.atari8.info © MadTeam, hosted: www.atari8.info