Przewodnik po TURBO-BASIC-u XL 1.5

Operacje dyskowe

Uwaga: jeśli używamy napędu nr 1 to w specyfikacji numer napędu (oznaczony jako „n”) można pominąć. Np. zamiast „D1:nazwa, piszemy D:nazwa.

BLOAD"Dn:nazwa" – wczytuje plik binarny z napędu dyskowego o numerze n i wskazanej nazwie, ale nie uruchamia go.

BRUN"Dn:nazwa" – wczytuje plik binarny z napędu dyskowego o numerze n i wskazanej nazwie, a następnie go uruchamia.

DELETE"Dn:nazwa" – kasuje plik o wskazanej nazwie w napędzie n. 

DIR"Dn:nazwa" – odczytuje katalog dysku. W przypadku użycia tego polecenia bez parametrów (tylko DIR), TBXL przyjmuje domyślnie, że chodzi o napęd numer 1.

LOCK"Dn:nazwa" – zabezpiecza plik przed zapisem lub skasowaniem. Próba użycia tego polecenia na pliku już wcześniej zabezpieczonym nie powoduje błędu.

RENAME"Dn:stara_nazwa,nowa_nazwa" – zmienia nazwę pliku na dysku.

UNLOCK"Dn:nazwa" – odbezpiecza plik, wcześniej zabezpieczony poleceniem LOCK. Próba użycia tego polecenia na niezabezpieczonym pliku nie powoduje błędu.

Programowanie strukturalne – procedury i pętle

PROC nazwa
•••
ENDPROC

Instrukcje i linie programu zawarte pomiędzy PROC nazwa, a ENDPROC tworzą procedurę. Procedurę można przyrównać do podprogramu wywoływanego przez GOSUB i kończącego się poleceniem RETURN w Atari BASIC-u. Jednak w odróżnieniu od GOSUB procedura posiada nazwę, która może, a nawet powinna być znacząca, czyli określać co procedura robi.

EXEC nazwa – tak jak w Atari BASIC-u polecenie GOSUB nr_linii wywołuje podprogram, tak w TBXL wykonuje to EXEC nazwa, wywołując procedurę, która jest niczym innym jak podprogramem z nazwą.

ON warunek EXEC nazwa_procedury – warunkowe wywołanie procedury.  Polecenie to funkcjonuje analogicznie do ON warunek GOSUB numer_linii w Atari BASIC-u.

DO ••• LOOP –  pętla bez końca. Elementy programu zawarte pomiędzy DO a LOOP będą cały czas powtarzane. Jedynym dopuszczalnym w programowaniu strukturalnym sposobem „rozerwania” tej pętli jest polecenie EXIT.

IF warunek ••• ELSE ••• ENDIF – gdy warunek jest spełniony, wówczas wykonywana jest część programu przed ELSE i pomijana między ELSE i ENDIF. Natomiast gdy warunek nie jest spełniony, pomijana jest część programu przed ELSE, a wykonywana między ELSE i ENDIF. Słowo kluczowe ELSE może być pominięte, wówczas polecenie będzie działać podobnie jak znane z Atari BASIC-a IF THEN..., z tą różnicą, że wewnątrz takiej pętli IF-ENDIF może znajdować się dowolna ilość linii programu.

REPEAT ••• UNTIL warunek – ciąg instrukcji zawarty pomiędzy słowami kluczowymi REPEAT i UNTIL jest powtarzany tak długo, jak długo warunek pozostaje niespełniony, czyli ma wartość logiczną 0. Gdy warunek zostanie spełniony (czyli przyjmie wartość logiczną 1), nastąpi opuszczenie pętli.

WHILE warunek ••• WEND – tak długo, jak warunek będzie spełniony (czyli posiadać będzie wartość logiczną 1) pętla będzie wykonywana.

Programowanie strukturalne – etykiety

# nazwa – etykieta; nadaje bieżącej linii programu nazwę. Etykieta musi być pierwszym (lub jedynym) poleceniem w linii.

GO# nazwa – bezwarunkowy skok do linii o wskazanej nazwie – odpowiednik polecenia GOTO nr_linii w Atari BASIC-u.

ON warunek GO# nazwa – polecenie skoku warunkowego do linii o wskazanej nazwie. Odpowiednikiem w Atari BASIC-u jest polecenie ON warunek GOTO numer_linii.

RESTORE# nazwa – odpowiednik polecenia RESTORE numer_linii w Atari BASIC-u.

TRAP# nazwa – odpowiednik polecenia TRAP numer_linii w Atari BASIC-u.

Operacje na pamięci

BGET #n,adres,ilość – pobiera z kanału (o numerze n) ciąg bajtów i zapisuje go w pamięci od wskazanego adresu. Ilość określa liczbę bajtów jaka ma być pobrana i zapisana. Wcześniej należy otworzyć do odczytu blok IOCB.

BPUT #n,adres,ilość – przesyła z pamięci komputera do wybranego kanału n ciąg bajtów. Adres wskazuje miejsce w pamięci od którego ma rozpocząć się przesyłanie, a ilość informuje ile bajtów ma być przesłanych. Wcześniej należy otworzyć do zapisu blok IOCB.

DPEEK(wyrażenie) – odczytuje wartość słowa spod adresu pamięci określonego przez wyrażenie. Słowo, czyli dwa kolejne bajty odczytywane są w kolejności młodszy bajt  - starszy bajt. Efektem jest liczba całkowita z przedziału 0 ÷ 65535.

DPOKE wyrażenie1,wyrażenie2 – dwubajtowe POKE. Zapisuje w dwóch kolejnych komórkach pamięci, począwszy od adresu wskazanego przez wyrażenie1, wartość wyrażenia2. Wyrażenie1 musi mieścić się w zakresie liczb dodatnich od 0 do 65534, wyrażenie2 od 0 do 65535.

%GET #n,zmienna_liczbowa – pobiera z urządzenia zewnętrznego (stacja dysków, magnetofon) liczbę w sześciobajtowym formacie dziesiętnym (BCD) i umieszcza w zmiennej_liczbowej.

%PUT #n,wyrażenie_liczbowe – zapisuje na urządzeniu zewnętrznym wartość wyrażenia_liczbowego w sześciobajtowym formacie dziesiętnym (BCD).

MOVE adres_źródłowy,adres_docelowy,ile – kopiuje obszar pamięci zaczynający się od adresu_źródłowego w obszar zaczynający się od adresu_docelowego. Ile określa ilość przemieszczanych bajtów.

–MOVE adres_źródłowy,adres_docelowy,ile – to samo co MOVE, ale z jedną różnicą. Gdy adres_docelowy jest mniejszy niż adres_źródłowy + ile nastąpi nadpisanie danych. -MOVE przesuwa blok danych od końca, unikając w ten sposób nadpisania.

Grafika

CIRCLE X,Y,R1,R2 – rysuje okrąg lub elipsę. Parametry X i Y wyznaczają punkt środkowy rysowanego obiektu. R1 to pozioma oś elipsy, a R2 – pionowa. Parametr R2 można pominąć, wówczas domyślnie R2=R1, czyli otrzymamy okrąg.

CLS – czyści ekran w trybie GRAPHICS 0 oraz okna tekstowe w trybach graficznych, po czym ustawia kursor w górnym lewym rogu.
 
CLS#n – czyści ekran obrazu utworzony przez blok IOCB o numerze „n” (1 ÷ 7). CLS#6 kasuje zawartość ekranu utworzonego w standardowych trybach graficznych.

FCOLOR wyrażenie_liczbowe – ustala jakiego rejestru koloru używać będzie polecenie FILLTO.

FILLTO X,Y – wypełnia „czysty” obszar ekranu, w prawo od rysowanego punktu. X to pozioma pozycja na ekranie, a Y pionowa. W Atari BASIC-u odpowiednikiem FILLTO jest: POSITION X,Y:XIO 18,#6,0,0,"S:".

PAINT X,Y – wypełnia pusty obszar wewnątrz figury (lub taki obszar na zewnątrz figury). X i Y ustala punkt ekranu, odpowiednio współrzędną poziomą i pionową, od którego rozpocznie się wypełnianie.

Dźwięk

DSOUND – użyte bez parametrów zamyka wszystkie kanały dźwiękowe. Taki sam efekt uzyskuje poleceniem SOUND bez parametrów.

DSOUND głos,częstotliwość,zniekształcenia,głośność – łączy dwa generatory dźwięku POKEY-a w jeden. Głos, to numer tak utworzonego generatora dźwięku. Dopuszczalne zakresy poszczególnych parametrów to:
- głos: 0 lub 1;
- częstotliwość: 0 ÷ 65535; 
- zniekształcenia: 0 ÷ 14, tylko liczby parzyste (10 i 14 czysty dźwięk);
- głośność: 0 ÷ 15.

SOUND - patrz DSOUND.

Funkcje arytmetyczne i logiczne

%0,  %1,  %2,  %3 – są to cztery stałe liczbowe odpowiadające odpowiednio liczbom 0, 1, 2 i 3. W przeciwieństwie do liczb zmiennoprzecinkowych, które zawsze zajmują 7 bajtów pamięci, stałe liczbowe zajmują tylko 1 bajt.

DEC(wyrażenie_tekstowe) – dokonuje konwersji liczb szesnastkowych na dziesiętne.

DIV: dzielna DIV dzielnik – dzielenie bez reszty; wynikiem będzie liczba całkowita powstała po odrzuceniu reszty z dzielenia.

EXOR: a EXOR b - alternatywa wykluczająca.

FRAC(wyrażenie_liczbowe) – zwraca część ułamkową wyrażenia_liczbowego poprzez odrzucenie wartości przed przecinkiem. Zostaje jednak zachowany znak liczby, np. wynikiem FRAC(-7.75) będzie liczba -0.75.

HEX$(wyrażenie liczbowe) – dokonuje konwersji całkowitej liczby dziesiętnej na szesnastkową.

MOD: a MOD b – polecenie to realizuje dzielenie modulo według wzoru: a-b*TRUNC(a/b). 

RAND(n) – generuje całkowitą liczbę losową z przedziału:
-  0 ÷ n–1, gdy n>0;
- -n ÷ -1, gdy n<0.

RND – to samo co RND(0) w Atari BASIC-u, ale w krótszej formie.

TIME – podaje trzybajtową liczbę stanu zegara czasu rzeczywistego (RTCLOCK). Wartość ta obliczana jest według wzoru: 65536*PEEK(18)+256*PEEK(19)+PEEK(20).

TIME$ - pokazuje czas w formacie „hhmmss” (godziny-minuty-sekundy). Aby ustawić czas należy użyć sekwencji: TIME$="hhmmss", np. TIME$="163059".

TRUNC(wyrażenie_liczbowe) – zwraca część całkowitą wyrażenia_liczbowego poprzez odrzucenie części ułamkowej. Zachowuje znak liczby, np. TRUNC(-9.998) to -9.

!: a!b – alternatywa. Wynikiem jest 0 (fałsz) gdy te same bity w wyrażeniu a i b mają wartość 0. W innym przypadku = 1 (prawda). Wynik podawany jest w formacie dziesiętnym.

$aaaa – TBXL pozwala na umieszczanie w programie liczb szesnastkowych. Aby interpreter mógł je odróżnić od dziesiętnych, muszą być poprzedzone znakiem „$”, np. $AE12, $FF.

&: a&b – koniunkcja. Wynikiem jest 1 (prawda) tylko gdy te same bity w wyrażeniu a i b mają wartość 1, inaczej = 0 (fałsz). Wynik podawany jest w formacie dziesiętnym. 

Operacje tekstowe

INKEY$ - gdy zostanie naciśnięty klawisz, INKEY$ zostanie przypisany odpowiedni znak ATASCII. Nie zatrzymuje programu.

INSTR(zmienna_tekstowa1,zmienna_tekstowa2,n) – poszukuje ciągu zawartego w zmiennej_tekstowej2 (krótszej) w zmiennej_tekstowej1 (dłuższej). Parametr n określa pozycję od jakiej ma się rozpocząć przeszukiwanie zmiennej_tekstowej1. Jeżeli przeszukiwanie ma rozpocząć się od początku (n=1) parametr ten można pominąć. Po znalezieniu ciągu INSTR zwraca pozycję pierwszego jego znaku w zmiennej_tekstowej_1. Jeśli ciąg nie zostanie odnaleziony wynikiem będzie zero.

UINSTR(zmienna_tekstowa1,zmienna_tekstowa2,n) – to samo co INSTR, z jedną różnicą: bit 5 i 7 każdego znaku jest ignorowany. Umożliwia to wyszukiwanie tekstu bez względu czy został napisany literami małymi, dużymi, czy w inwersie.

TEXT X,Y,ciąg – umieszcza tekst na ekranie graficznym. X i Y to współrzędne górnego lewego rogu pierwszego znaku parametru ciąg, który może być stałą lub zmienną, tekstową lub liczbową. Wyboru koloru tekstu dokonuje się poleceniem COLOR.

Sterowanie przebiegiem programu

*B + (lub *B) - naciśnięcie BREAK wywoła błąd, który może być przechwycony przez TRAP.
 
*B – - klawisz BREAK działa normalnie - naciśnięcie zatrzymuje program.

EXIT - natychmiastowe opuszczenie dowolnej pętli. Po napotkaniu wewnątrz pętli polecenia EXIT, jej wykonywanie zostaje natychmiast przerwane, bez względu na stan warunku pętli i zostaje wykonany skok do następnego polecenia po zamykającym pętlę.

*F + - warunek pętli FOR-NEXT sprawdzany jest na początku pętli (pętla może nie być wykonana ani razu).

*F – - warunek sprawdzany jest na końcu pętli, czyli jak w Atari BASIC-u (pętla zawsze zostanie wykonana co najmniej jeden raz).

PAUSE n – zatrzymuje wykonywanie programu na czas określony parametrem n. Jednostką jest tu 1/50 sekundy, czyli n = 50 zatrzyma program na jedną sekundę.

Edycja programu

–– - specjalna instrukcja REM. Dwa myślniki użyte zaraz po numerze linii wyświetlane są w czasie listowania programu jako ciąg 30 znaków „-”.

DEL od_nr_linii,do_nr_linii – usuwa linie programu począwszy od_nr_linii, a skończywszy na do_nr_linii.

DUMP urządzenie – wysyła na wskazane urządzenie (np. drukarkę) listę zmiennych użytych w programie. Jeśli urządzenie zostanie pominięte, lista zostanie wyświetlona na ekranie.

*L + - podczas listowania programu (patrz polecenie LIST) włącza tabulację, w efekcie linie programu objęte pętlą oraz wewnątrz procedury będą „wcięte” o dwie pozycje poziome.

*L – - wyłącza tabulację (patrz *L +).

LIST – wyświetla listing programu. Możliwe są następujące konfiguracje:
- LIST – bez parametrów wyświetla na ekranie listing całego programu.
- LIST od_nr_linii,do_nr_linii – wyświetla wybrany fragment listingu.
- LIST od_nr_linii, – wyświetla listing od_nr_linii do końca programu.
- LIST nr_linii – wyświetla linię programu o podanym numerze.

Ponadto polecenie LIST działa tak samo jak w Atari BASIC-u.

ERL – podaje numer linii, w której nastąpiło przerwanie programu, np. z powodu wystąpienia błędu.

ERR – podaje kod błędu, który wystąpił w trakcie wykonywania programu.

RENUM stary_nr,nowy_nr,skok – zmienia numery linii programu. Linii o numerze stary_nr nadaje numer wpisany do nowy_nr. Następnej linii nadaje numer nowy_nr + skok i tak dalej do końca programu.

TRACE + - włącza śledzenie wykonywania programu. Interpreter będzie pokazywał na ekranie w nawiasach kwadratowych numery linii, które są właśnie wykonywane.

TRACE – - wyłącza śledzenie (patrz TRACE +).

Usprawnienia

CLOSE użyte bez parametrów zamyka wszystkie kanały IOCB o numerach 1 ÷ 7. To znacznie krócej niż w Atari BASIC-u: FOR X=1 TO 7:CLOSE #X:NEXT X.

DIM - przeciwieństwie do Atari BASIC-a automatycznie zeruje wszystkie elementy tablic liczbowych i zmiennych tekstowych, jednak długość tych ostatnich nie ulega zmianie (początkowo 0).

GET wyrażenie_liczbowe – oczekuje na naciśnięcie klawisza, po czym przypisuje wyrażeniu_liczbowemu kod ATASCII naciśniętego klawisza.

INPUT umożliwia teraz wyświetlenie tekstu przed wprowadzaniem danych np. INPUT"Podaj nazwisko i wiek ";A$,X. Ponadto zastąpienie średnika przecinkiem eliminuje znak zapytania: INPUT" ",A. 

PUT wyrażenie_liczbowe – wysyła na ekran znak o kodzie ATASCII reprezentowany przez wyrażenie_liczbowe.

"" - podwójny cudzysłów umieszczony w ciągu tekstu wyświetlany jest jak zwykły cudzysłów, np. linia: »100 PRINT "To jest ""prawdziwy"" cytat."« zostanie wyświetlona: »To jest "prawdziwy" cytat.«. 

_ - znak podkreślenia może być używany w nazwach procedur, etykiet i zmiennych, w tym tabel np. NOWA_ZMIENNA=100.

AUTORUN.BAS
Zaraz po starcie systemu TBXL poszukuje na dysku pliku o nazwie AUTORUN.BAS. Jeżeli taki odnajdzie, wczyta go i uruchomi. Ta cecha może być bardzo użyteczna np. do automatycznego uruchamiania gier.