Słowa Kluczowe ATARI BASIC

Atari BASIC to pierwszy język prawie każdego atarowca. Wśród wielu wad, posiada on też kilka zalet: jest stosunkowo łatwy do przyswojenia; na stałe zainstalowany w komputerze (przez co zawsze dostępny); posiada bardzo użyteczne funkcje (przy dłuższej pracy niezbędne): ADR, USR, PEEK oraz instrukcję POKE.

Sam z siebie BASIC nie oferuje zbyt dużych możliwości, ale używając procedurek napisanych w języku asemblera można uzyskać całkiem niezłe efekty (wprost idealne narzędzie do tworzenia "handlowych" gierek). Wystarczy tylko dodać muzykę na VBLKI, kilka przerwań DLI, parę procedurek maszynowych (np. obsługujących "okienka") i już mamy interesujący program. Oczywiście istnieją znacznie lepsze języki programowania, nadające się do pisania tego typu gier, choćby TURBO BASIC XL (niestety zajmuje pamięć pod ROM-em), ACTION! i inne.

Moje osobiste zdanie na ten temat brzmi: używaj asemblera do pisania wszelkich dem i gier (wymagających znacznej szybkości procesora), jak i profesjonalnych użytków, rzadziej skomplikowanych gier, np. ekonomicznych (jednakże musisz pamiętać, iż stworzenie takiej produkcji pochłonie dużą ilość czasu, co innego języki wyższego poziomu). W pozostałych przypadkach staraj się używać języka ACTION! lub wszelkich odmian BASIC-a, szczególnie gdy zamierzasz napisać skomplikowany program obliczeniowy, gdzie szybkość nie jest najważniejsza (chociażby renderujący odpowiednio zaprojektowaną scenę).

Nie czas ani miejsce rozwodzić się, który język jest lepszy i dlaczego, toteż powrócę do tematu. Kursy nauki Atari BASIC-a były (i są!) prowadzone w niemalże wszystkich czasopismach poświęconych 8-bitowemu Atari. Nauka (na ogół) polega najpierw na zaznajomieniu się z edytorem i sposobem wpisywania poleceń, potem ze słowami kluczowymi języka i przykładami programów. Wreszcie poprzez poznawanie, coraz trudniejszych poleceń, dochodzimy do momentu, kiedy możemy stwierdzić, iż opanowaliśmy język.

Taki sposób nauki jest jak najbardziej wskazany. Jednak często się zdarza, że nie znamy wszystkich poleceń lub też ich skrótów (czasami są bardzo przydatne) albo nie wiemy co one dokładnie robią. W takim przypadku przydałby się rzeczowy spis wszystkich instrukcji oraz funkcji BASIC-a.

Niniejszy artykuł (jak i następne z tej serii) zawiera kompletny słownik słów kluczowych BASIC-a w kolejności alfabetycznej.

OPIS SŁÓW KLUCZOWYCH ATARI BASIC

NAZWA: ABS

TOKEN: $4F (79)

SKRÓT: ABS

TYP: funkcja liczbowa

DZIAŁANIE: funkcja ta zwraca bezwzględną wartość argumentu będącego wartością liczbową. Polega to na tym, że jeżeli jako argument podamy liczbę dodatnią (np. 34), to w wyniku otrzymamy wartość argumentu, czyli w naszym przypadku liczbę 34. Natomiast dla liczb ujemnych (np. -215) wynikiem będzie wartość argumentu pomnożona przez liczbę -1, np. -215 * (-1) = 215, a dla zera wynikiem będzie zero.

PRZYKŁADY:

    5 ? :? :?
    10 INPUT LICZBA
    15 ? ABS(LICZBA)
    20 GOTO 5

Powyższy program ukazuje nam działanie funkcji ABS. W linii nr 10 program oczekuje na podanie liczby, której wartość zostanie przypisana zmiennej LICZBA. W linii 15 program wyświetla bezwzględną wartość naszej liczby. Linia 20 nakazuje skok do linii nr 5.

    10 INPUT X,Y,Z
    20 ? ABS(X^2+Y)*Z

Powyższy programik stanowi inny przykład wykorzystania funkcji ABS.


NAZWA: ADR

TOKEN: $43 (67)

SKRÓT: ADR

TYP: funkcja liczbowa

DZIAŁANIE: funkcja zwraca adres pierwszego bajtu ciągu, podanego jako argument. Oznacza to, że możemy bezpośrednio ingerować w zawartość ciągu, który siedzi gdzieś w pamięci, instrukcją POKE. Jednak często wykorzystuje się tą funkcję wraz z funkcją USR, co pozwala na bardzo proste używanie relokowalnych procedurek maszynowych z poziomu BASIC-a.

PRZYKŁADY:

    10 DIM Z$(6)
    20 Z$="10=6+4"
    25 ? Z$
    30 POKE ADR(Z$)+2,62
    35 POKE ADR(Z$)+3,49
    40 ? Z$

Zadaniem umieszczonego powyżej programiku jest zmiana, za pomocą instrukcji POKE, dwóch elementów ciągu Z$. Program wyświetla ciąg przed dokonaniem zmian, jak i po nich:

    przed:   10 = 6 + 4;
    po:      10 > 1 + 4;

Poniżej ukazane są inne przykłady wykorzystania funkcji ADR:

    100 X=USR(ADR(PROCEDURA$)) 
    100 Y=ADR("MEGA-ATARIXY"):? Y

NAZWA: AND

TOKEN: $2A (42)

SKRÓT: AND

TYP: operator logiczny

DZIAŁANIE: przeprowadza operację koniunkcji dwóch argumentów liczbowych. Działanie funkcji AND można prześledzić za pomocą "tabelki prawdy":

    1 AND 1 = 1
    1 AND 0 = 0
    0 AND 1 = 0
    0 AND 0 = 0

Wynikiem tej operacji jest wartość true (prawda) wtedy i tylko wtedy, gdy oba argumenty są prawdziwe (mają wartość true). W przeciwnym przypadku wynikiem jest wartość false (nieprawda). W przypadku Atari BASIC wynikiem funkcji jest 1, gdy oba argumenty są niezerowe. Jeżeli choć jeden argument (lub też oba) ma wartość zero, wtedy wynikiem operacji jest zero.

PRZYKŁADY:

    10 INPUT A
    20 INPUT B
    30 C=(A+5 AND B)
    40 ? C

W linii nr 10 program oczekuje na wprowadzenie liczby, której wartość zostanie przypisana zmiennej A. Podobnie zachowuje się program w przypadku linii nr 20, ale tym razem podana wartość jest przypisywana zmiennej B. Następnie program sprawdza prawdziwość argumentu A zwiększonego o liczbę 5 oraz argumentu B. Wynik koniunkcji jest przypisywany zmiennej C.

A oto przykład innego programu, obrazującego działanie funkcji:

    10 INPUT A,B,C
    20 IF A>B AND B>C THEN ?"A > C":END
    30 GOTO 10

Powyższy program przedstawia sposób "działania" prawa przechodności implikacji (jeśli jedno zdanie pociąga za sobą drugie, a drugie pociąga za sobą trzecie, to z tego pierwszego zdania wynika trzecie). W naszym przypadku: jeśli liczba A jest większa od liczby B oraz liczba B jest większa od C, to wtedy A jest większa od C, co jest zresztą logiczne, np. jeżeli 33 > 22 > 8, to wtedy 33 > 8.


NAZWA: ASC

TOKEN: $40 (64)

SKRÓT: ASC

TYP: funkcja liczbowa

DZIAŁANIE: w wyniku działania funkcji zostaje zwrócony kod ATASCII pierwszego znaku ciągu będącego argumentem funkcji. Zupełnie odwrotnie do powyższej funkcji działa rozkaz CHR$.

PRZYKŁADY:

    10 DIM TEXT$(10)
    20 TEXT$="ATAROWIEC!"
    30 FOR I=1 TO 10:X=ASC(TEXT$(I))
    40 ? TEXT$(I,I),X:NEXT I

Najpierw program definiuje i wypełnia ciąg, potem pętla w liniach 30-40 wyświetla kody ATASCII poszczególnych znaków ciągu wraz z odpowiadającymi im znakami.

    10 DIM A$(4)
    20 INPUT A$
    30 B=ASC(A$)
    40 ? CHR$(B)

Zasady działania powyższego programu chyba nie trzeba tłumaczyć, dodam tylko, że funkcja CHR$ zwraca jednoelementowy ciąg, który zawiera znak określony przez kod ATASCII wartości argumentu.


NAZWA: ATN

TOKEN: $44 (68)

SKRÓT: ATN

TYP: funkcja liczbowa

DZIAŁANIE: jeżeli podamy dowolną wartość liczbową (oczywiście nie możemy tutaj zapomnieć o ograniczeniach, jakie narzuca Atari BASIC, chodzi mi o zakres używanych przez BASIC wartości liczbowych), to zostanie zwrócona wartość funkcji arcus tg podanego przez nas argumentu. Obliczenia mogą być wykonywane w radianach (co jest standardowym trybem pracy BASIC-a. W razie wcześniejszego liczenia w stopniach, obliczenia w radianach możemy przywrócić instrukcją RAD) lub w stopniach (tryb ten ustawiamy instrukcją DEG). Wynikami są liczby rzeczywiste z przedziału: - -1.57079632 - +1.57079632 (radiany); - -89.9999997 - +89.9999997 (stopnie);

PRZYKŁADY:

    10 GRAPHICS 8:COLOR 1
    20 REM *** rysuj os OX ***
    21 FOR X=0 TO 319:PLOT X,96:NEXT X
    30 REM *** rysuj wykres funkcji ***
    31 FOR X=-160 TO 159
    32 ARCTG=ATN(X):Y=ARCTG*20
    33 PLOT 160+X,96-Y:? "X=";X;"  ATN(X)="; ARCTG;"  Y=";INT(Y)
    35 NEXT X 40 END:REM *** yeah !!! ***

Jak nietrudno się domyślić, zadaniem wyżej wylistowanego programiku jest narysowanie wykresu funkcji arcus tangens. Obliczenia są wykonywane w radianach. Wartość funkcji arcus tg (której argumentem jest aktualna wartość zmiennej X) jest przypisywana zmiennej ARCTG. Ponieważ zależy nam na czytelności wykresy, mnożymy wartość zmiennej ARCTG przez 20, co daje należytą "wielkość" wykresu, dzięki czemu wykres nie jest zbyt "zlany" z linią osi OX. Linia 33 rysuje poszczególny punkt (uzyskany w wyniku obliczeń) oraz wypisuje wartości zmiennych. Pętla zawarta w liniach 31-35 wykonuje się 320 razy, co zapewnia maksymalną "długość" wykresu, czyli 320 piksli.

A oto inny przykład:

    10 DEG
    20 INPUT X
    30 ARCTG=ATN(X)
    40 ARCCTG=ATN(1/X)
    50 ? ARCTG:? ARCCTG

Powyższy program wypisuje wartość funkcji arcus tg oraz arcus ctg podanego argumentu. Wynik podawany jest w stopniach. Co prawda BASIC nie posiada procedur liczących funkcję arc ctg, ale łatwo można to nadrobić (również w przypadku funkcji arc sin i arc cos)...


NAZWA: BYE

TOKEN: $0E (14)

SKRÓT: B.

TYP: instrukcja

DZIAŁANIE: wykonanie tej instrukcji powoduje przerwanie pracy interpretera Atari BASIC oraz przejście do programu testującego ("Self Test"), a w przypadku zainstalowanego systemu QMEG następuje przejście do monitora MLM. Odpowiada to instrukcji: JMP $E471 (co moża sprawdzić za pomocą DOS-a - polecenie "M" w menu lub "RUN" w "CP"). Ostatecznie możemy w BASIC-u wykonać "manewr":

    X=USR(58481):REM *** jmp $e471 ***

Chętni mogą również spróbować:

    POKE 54017,PEEK(54017)-128:X=USR(20480)

Powoduje to włączenie programu testującego (poprzez wyzerowanie bitu 7 rejestru PORTB [$d301]), a następnie skok pod adres: $5000. Jednak tego sposobu nie polecam podczas codziennej pracy (podałem go jako ciekawostkę). Z instrukcją tą wiąże się (dziś już legendarne) powiedzenie, zwykle stosowane przy zakończeniu wypowiedzi: "Jak mawiają starzy atarowcy B.!!!"

PRZYKŁADY:

    10 BYE:REM *** SELF TEST nadchodzi ***

NAZWA: CHR$

TOKEN: $3E (62)

SKRÓT: CHR$

TYP: funkcja tekstowa

DZIAŁANIE: funkcja ta zwraca jednoelementowy ciąg, zawierający znak, którego kod ATASCII został podany jako argument. Funkcja CHR$ jest bardzo często stosowana w połączeniu z instrukcją PRINT, co pozwala, np. wyświetlić tekst zawierający cudzysłowy. Odwrotnie działa funkcja ASC. Jako argument podajemy dowolną liczbę naturalną od 0 do 255 (włącznie). Jednak BASIC dopiero zasygnalizuje błąd, jeżeli wartość argumentu będzie większa od liczby 65535 ($FFFF). Co ciekawe, funkcja działa najzupełniej poprawnie dla argumentów z przedziału 256-65535, np. jako argument podajemy liczbę 65345 (kod ATASCII znaku "A" wynosi 65, czyli 65536 - 256 + 65 = 65345) i w wyniku działania CHR$ zostanie zwrócony znak "A".

PRZYKŁADY:

    10 ? "Podaj kod ATASCII dowolnego znaku:  ";
    20 INPUT #16,Z 
    30 ? :? "Liczba ";Z;" jest kodem ATASCII  znaku: ";CHR$(Z)

Programik pyta się o kod ATASCII dowolnego znaku, po czym wyświetla znak, którego kod ATASCII wcześniej podaliśmy.

Inne przykłady:

    10 ? "Magazyn ";CHR$(34);"Barymag";CHR$(34)

Zadaniem programu jest wyświetlenie tytułu magazynu ujętego w cudzysłów.

    10 Z=ASC("HOUR"):? CHR$(Z)

Przykład działania funkcji CHR$ i ASC. W wyniku działania programu zostaje wyświetlona litera "H", czyli pierwszy znak ciągu "HOUR".


NAZWA: CLOAD

TOKEN: $35 (53)

SKRÓT: CLOA.

TYP: instrukcja

DZIAŁANIE: instrukcja CLOAD jest przydatna tylko dla użytkowników magnetofonów. Ponieważ Czytelnicy "Barymaga" są (no, chyba że, np. czytają zin u kolegi) użytkownikami stacji dysków, toteż CLOAD nie jest ważną dla nich instrukcją... CLOAD powoduje załadowanie do pamięci naszego Ataraka programu w BASIC-u. Aktualnie znajdujący się w pamięci program zostaje skasowany. Wczytywany (poprzez instrukcję CLOAD) program musiał być wcześniej zapisany tylko instrukcją CSAVE. Niestety, brakuje w ATARI BASIC polecenia CRUN, które pozwalałoby na automatyczne uruchamianie się programów po wczytaniu, a instrukcja RUN "C:" (zapis SAVE "C:") jest zbyt uciążliwa (ze względu na długie przerwy między rekordami). Kilka rozwiązań tego problemu zostało opisanych w artykule "Autostart programów" zamieszczonym w "Bajtku", nr 4/88.

PRZYKŁADY:

    10 CLOAD 

    CLOAD:REM *** ta instrukcja jest zwykle używana w trybie bezpośrednim *** 

NAZWA: CLOG

TOKEN: $4C (76)

SKRÓT: CLOG

TYP: funkcja liczbowa

DZIAŁANIE: funkcja zwraca wartość logarytmu dziesiętnego podanego argumentu. Odwrotnością funkcji logarytmicznej jest funkcja potęgowa. Argumenty muszą być większe od zera, w przeciwnym przypadku interpreter zasygnalizuje błąd (ERROR 3). Ponieważ podstawa logarytmu ma wartość równą 10, toteż w celu uzyskania innej podstawy stosuje się następujący wzór: Y = CLOG(X) / CLOG(A), gdzie A oznacza podstawę logarytmu, zaś X = A ^ Y.

PRZYKŁADY:

    10 INPUT X
    20 Y=10^X
    30 ? CLOG(Y)

Wynikiem działania programu jest wypisanie wartości zmiennej X.

    10 A=2:X=8
    20 Y=CLOG(X)/CLOG(A)
    30 ? Y

Jest to przykład użycia wzoru, pozwalającego na stosowanie dowolnej (oczywiście większej od zera oraz różnej od jednego, nie wolno także zapomnieć o ograniczeniach, jakie narzuca nam interpreter, jeśli chodzi o zakres używanych liczb) podstawy logarytmu.

Myślę, że ta skromna garstka informacji wystarczy, jak na pierwsze spotkanie. W następnym odcinku postaram się kontynuować niniejsze zagadnienie.

Na zakończenie chciałbym zachęcić wszystkich do przestudiowania przykładowych programów (nagranych na dysku z zinem). Natomiast osoby, które niniejszy artykuł zdecydowanie nudził i nie sprawiał im najmniejszych kłopotów zachęcam do jak najszybszego przerzucenia się na znacznie efektywniejszy język asemblera...

- P.W. -