Tajemnice ATARI

TURBO BASIC XL
część pierwsza

    Jedną ze słabych stron komputerów Atari serii XL/XE jest niewątpliwie wbudowany interpreter języka Atari Basic. Stosunkowo wolna praca, słaby edytor, brak rozkazów wykorzystujących efektywnie możliwości graficzne i muzyczne komputera czy problemy pojawiające się przy korzystaniu z tablic i zmiennych tekstowych spowodowały, że firmy zajmujące się pisaniem oprogramowania dla Atari pokusiły się o stworzenie nowych, lepszych interpreterów języka Basic. I w ten sposób powstały Microsoft BASIC, BASIC XL i TURBO BASIC XL.

   Najbardziej rozpowszechnioną i znaną odmianą jest TURBO BASIC XL. Powstał w roku 1985 na zamówienie popularnego na zachodzie magazynu komputerowego "Happy Computer". Autorem programu jest Frank Ostrowsky. Należy zauważyć, że jest to program Public Domain. W pierwszych dwóch odcinkach cyklu przedstawimy pełny zestaw rozkazów interpretera TURBO BASIC XL wraz z programami ilustrującymi efektywne wykorzystanie tego języka. Tak więc... zaczynamy !!!

EDYTOR

   W pełni zgodny z edytorem Atari BASIC. Dodatkowo dostępnych jest kilka rozkazów ułatwiających pisanie i poprawianie programu.

LIST - przy listowaniu uwypuklone są pętle i procedury przez przesunięcie o dwie spacje. Dzięki temu programy są bardziej przejrzyste. Ponadto możliwa jest konstrukcja "LIST xxxx," pokazująca program od linii xxxx do końca.

*L- , *L+ - wyłączenie/włączenie tabulacji dla rozkazu LIST

DEL xxxx,yyyy - kasowanie programu od linii xxxx do yyyy włącznie

RENUM xxxx,yyyy,skok - przenumerowuje linie programu od linii xxxx zamieniając ją na yyyy. Następne linie mają numery zwiększone o skok. Rozkaz ten zmienia numery linii po tych instrukcjach, które je wykorzystują. Jeżeli natrafi na numer linii, której jeszcze nie ma, w odpowiednie miejsce zostanie wstawiona liczba ujemna (np. GOSUB -100). Gdy po instrukcji występuje wyrażenie w rodzaju GOSUB 1000+X*10 jest ono traktowane jako GOSUB 1000: Pozostała część pozostaje niezmieniona.

DUMP - rozkaz ten prezentuje listę zmiennych, etykiet i procedur użytych w programie. Używa się go podobnie jak LIST przy współpracy z urządzeniami zewnętrznymi.

TRACE + / TRACE - - włączenie/wyłączenie trybu śledzenia wykonywania programu. Numery aktualnie wykonywanych linii będą się ukazywać w kwadratowych nawiasach w dole ekranu. Wyłączenie trybu TRACE następuje automatycznie przy wystąpieniu błędu. Przy wywoływaniu procedury lub skoku do etykiety nie będą podawane numery linii początku procedury ani etykiety.

*B+ / *B- - włączenie/wyłączenie trybu traktowania klawisza BREAK jako zwykłego błędu, możliwego do obsługi instrukcją TRAP. Po rozkazie RUN zostaje automatycznie wykonane *B-.

INSTRUKCJE STRUKTURALNE

   W TURBO BASICu XL występują elementy programowania strukturalnego zapożyczone z języka Pascal. Dzięki nim programy stają się bardziej przejrzyste. Możliwe jest również efektywniejsze tworzenie algorytmów.

IF war: lista rozkazów 1:
ELSE: lista rozkazów 2:
ENDIF

- gdy spełniony jest warunek war wykonywana jest pierwsza lista rozkazów, w przeciwnym razie wykonywana jest druga lista rozkazów. Rozkazy te mogą być zawarte w jednym lub oddzielnych wierszach (patrz program przykładowy). Koniec wyrażenia logicznego jest oznaczany jak koniec lini logicznej (tzn. ":" lub klawisz RETURN). Również przed i po ELSE i ENDIF musi stać znak końca linii. Po ELSE nie może być numeru linii.

REPEAT: lista rozkazów: UNTIL war - ciąg rozkazów zawarty między REPEAT a UNTIL jest wykonywany do momentu spełnienia warunku war. Sprawdzenie warunku następuje na końcu pętli. Dzięki temu lista rozkazów będzie wykonana co najmniej jeden raz.

WHILE war: lista rozkazów: WEND - lista rozkazów wykonywana jest tak długo, jak warunek jest spełniony.

DO: lista rozkazów: LOOP - pętla bez końca: lista rozkazów jest wciąż powtarzana.

EXIT - opuszczenie pętli (wszystkich rodzajów). Rozkaz ten stanowi rodzaj "wyjścia awaryjnego" z pętli (jedynego przy DO...LOOP) dozwolonego w programowani strukturalnym.

PROC nazwa - początek procedury.

ENDPROC - koniec procedury.

EXEC nazwa - wywołanie procedury o danej nazwie.

   (UWAGA: w języku Pascal procedury mogą dysponować własną listą zmiennych. Niestety w TURBO BASICu XL wszystkie zmienne traktowane są jako globalne.) Procedury zajmują mniej miejsca w pamięci niż rozkazy GOSUB..RETURN i przyśpieszają działanie programu. Wykorzystanie procedur znakomicie ilustruje program przykładowy.

ON wart EXEC nazwa1,nazwa2 - odpowiednik konstrukcji ON wart GOSUB dla procedur.

#F+ - przed pierwszym obiegiem pętli FOR..NEXT nastąpi sprawdzenie, czy licznik osiągnie wartość końcową. Przykładowo: FOR I=2 TO 1: ? I:NEXT I - wartością początkową pętli jest 2 - podwyższenie licznika pętli o 1 - porównanie z wartością końcową (tu: 1) - opuszczenie pętli ponieważ warunek został spełniony Po wykonaniu *F+ zmiennej i będzie przypisana wartość początkowa 2, następnie zostanie porównana ze zmienną końcową (tu: 1). Ostatecznie pętla przeskoczy do rozkazy NEXT I i nastąpi zakończenie jej wykonywania bez wyjścia na ekran. Rozkaz *F+ zaoszczędza często specjalnej procedury wywoławczej.

#F- - powrót do normalnego trybu wykonywania pętli FOR..NEXT (lista rozkazów między FOR i NEXT będzie wykonana co najmniej raz).

#nazwa - ustawienie etykiety. Można się do niej odwoływać w taki sposób jak do numeru linii np. GOSUB #nazwa, TRAP #nazwa, RESTORE #nazwa. Wyjątkiem jest instrukcja GOTO, która przy użyciu etykiet została skrócona do GO #nazwa. Używanie etykiet i odwoływanie się do nich przy wszelkiego rodzaju skokach powoduje, że program staje się bardziej czytelny, łatwiejsza jest jego modyfikacja i poprawa.

   Pewną ciekawostką użytą w TURBO BASICU XL jest zdefiniowanie jako stałych liczb od 0 do 3 przedstawianych jako %0, %1, %2 i %3. Zastosowanie liczby zajmuje w programie 7 bajtów. Użycie powyższych stałych - 1 bajt. Program przykładowy zapisany bez pomocy opisanych stałych zajmowałby 288 bajtów więcej.

   Na koniec jeszcze tylko komunikaty błędów charakterystycznych dla TURBO BASICa XL. Przy wystąpieniu błędu oprócz jego numeru podane są też krótkie opisy. Dodatkowo generowane są nowe komunikaty błędów.

ERROR - 13 ?FOR - brak instrukcji FOR dla istniejącej NEXT.

ERROR - 15 ?DEL - brak jednego z rozkazów otwierających lub zamykających pętlę (np. GOSUB do RETURN).

ERROR - 16 ?GOSUB - brak RETURN do istniejącego GOSUB

ERROR - 22 ?NEST - tzw. zagnieżdżenie. Występuje gdy nie zostaje znaleziona instrukcja WEND z pętli WHILE, ENDIF z warunku IF lub podobne.

ERROR - 23 ?WHILE - brak WHILE do istniejącej WEND.

ERROR - 24 7REPEAT - brak REPEAT do istniejącej UNTIL.

ERROR - 25 ?DO - brak DO do istniejącej LOOP.

ERROR - 26 ?EXIT - EXIT ustawiony poza pętlą.

ERROR - 27 ?XPROC - występuje, gdy wywoływany jest rozkaz PROC. Procedury powinny być wywoływane tylko za pomocą EXEC.

ERROR - 28 ?EXEC - brak EXEC do istniejącej ENDPROC.

ERROR - 29 ?PROC - próba wywołania nieznanej procedury.

ERROR - 30 ?# - próba odwołania się do nieznanej etykiety.

I to wszystko w tym odcinku. Za miesiąc omówimy pozostałe rozkazy TURBO BASICu XL.

KONWERTER BP>OBJ
CARAMPUC/ASF

10 ------------------------------
20 REM program  KONWERTER BP>OBJ
30 REM (TURBO BASIC XL)
40 REM program zmienia obrazki formatu
     BLAZING PADDLES na dane typu OBJ
50 REM specjalnie dla TAJEMNICE ATARI 
       czlonek grupy ASF - Carampuc
60 ------------------------------
100 REM CZESC GLOWNA
110 ------------------------------
120 EXEC DEKLARACJE
130 REPEAT 
140   EXEC NAGLOWEK
150   EXEC WCZYTAJ
160   EXEC EKRAN
170   EXEC WYTNIJ
180   EXEC ADRESY
190   EXEC ZAPISZ
200   EXEC SPYTAJ
210 UNTIL NOT KONIEC
220 ? :? "Do zobaczenia..."
230 END 
240 ------------------------------
250 REM ZBIOR PROCEDUR
260 ------------------------------
1000 PROC DEKLARACJE
1010   ILE=7680+4:REM dlugosc obrazka 
plus 4 kolory
1020   DIM BUF$(ILE):REM rezerwacja pa
mieci na obrazek i kolory
1030   BUFOR=ADR(BUF$):REM adres pocza
tku bufora
1040   DIM N$(14),A$(12):REM N$-nazwa 
zbioru; A$-zmienna pomocnicza procedur
y NAZWA
1050   DIM P$(4),K$(4):REM adresy dany
ch zrodlowych (w hex)
1060   DIM T$(1):REM zmienna pomocnicz
a procedury SPYTAJ
1070   BAJT=40:REM ilosc bajtow w lini
i obrazu
1080 ENDPROC 
1090 ------------------------------
2000 PROC WCZYTAJ
2010   EXEC NAZWA
2020   ? :? "Wczytuje plik ";N$
2030   OPEN #%1,4,%0,N$
2040   BGET #%1,BUFOR,ILE
2050   CLOSE 
2060 ENDPROC 
2070 ------------------------------
2500 PROC ZAPISZ
2510   EXEC NAZWA
2520   ? :? "Zapisuje plik ";N$
2530   OPEN #%1,8,%0,N$
2540   PUT #%1,$FF:PUT #%1,$FF
2550   PUT #%1,DEC(P$(%3,4)):PUT #%1,D
EC(P$(%1,%2))
2560   PUT #%1,DEC(K$(%3,4)):PUT #%1,D
EC(K$(%1,%2))
2570   BPUT #%1,SKAD,WIELK-1
2580   CLOSE 
2590 ENDPROC 
2600 ------------------------------
3000 PROC EKRAN
3010   GRAPHICS 15+16
3020   EKRAN=DPEEK(88):REM adres pamie
ci ekranu
3030   MOVE BUFOR+ILE-4,$02C8,%1
3040   MOVE BUFOR+ILE-%3,$02C4,%3
3050   MOVE BUFOR,EKRAN,ILE
3060 ENDPROC 
3070 ------------------------------
3500 PROC ADRESY
3510   GRAPHICS %0:SETCOLOR %2,%0,%0
3520   SKAD=BUFOR+BAJT*(Y1*(Y1<=Y2)+Y2
*(Y1>Y2))
3530   WIELK=BAJT*(ABS(Y1-Y2)+%1)
3540   ? "Zaznaczono #$";HEX$(WIELK);"
 bajtow danych."
3550   INPUT "Podaj adres, pod ktory b
eda wczytywane dane: $",P$
3560   K$=HEX$(DEC(P$)+WIELK-%1)
3570   ? :? "Dane wczytaja sie w obsza
r od adresu"
3580   ? "$";P$;" do $";K$
3590   ? :? "Wartosci rejestrow koloro
w:"
3600   FOR X=%0 TO %2
3610     ? "COLPF";X;" ($02C";4+X;") =
 $";HEX$(PEEK(BUFOR+ILE-(%3-X)))
3620   NEXT X
3640   ? "COLBAK ($02C8) = $";HEX$(PEE
K(BUFOR+ILE-4))
3650 ENDPROC 
3660 ------------------------------
4000 PROC WYTNIJ
4010   MAX_X=159:MAX_Y=191
4020   Y1=%0:Y2=%0:KOL=%0
4030   REPEAT 
4040     JOY=STICK(%0)
4050     RUCH=(JOY=7)+%2*(JOY=11)+%3*(
JOY=13)+4*(JOY=14)
4060     ON RUCH EXEC LEWO,PRAWO,DOL,G
ORA
4070     KOL=(KOL+%1)&%3:COLOR KOL
4080     PLOT 0,Y1:DRAWTO MAX_X,Y1
4090     PLOT 0,Y2:DRAWTO MAX_X,Y2
4100     IF INKEY$=" "
4110       COLOR 1
4120       TEXT %0,MAX_Y-8,"Y1="
4130       TEXT %0+24,MAX_Y-8,Y1
4140       TEXT 56,MAX_Y-8,"Y2="
4150       TEXT 56+24,MAX_Y-8,Y2
4160       TEXT 112,MAX_Y-8,"dY="
4170       TEXT 112+24,MAX_Y-8,ABS(Y1-
Y2+1)
4180       GET KEY
4190       MOVE BUFOR+40*(MAX_Y-8),EKR
AN+40*(MAX_Y-8),BAJT*8
4200     ENDIF 
4210     MOVE BUFOR+BAJT*Y1,EKRAN+BAJT
*Y1,BAJT
4220     MOVE BUFOR+BAJT*Y2,EKRAN+BAJT
*Y2,BAJT
4230   UNTIL STRIG(%0)=%0
4240 ENDPROC 
4250 ------------------------------
4500 PROC DOL
4510   IF Y1<MAX_Y THEN Y1=Y1+%1
4520 ENDPROC 
4600 PROC GORA
4610   IF Y1>%0 THEN Y1=Y1-%1
4620 ENDPROC 
4700 PROC LEWO
4710   IF Y2<MAX_Y THEN Y2=Y2+%1
4720 ENDPROC 
4800 PROC PRAWO
4810   IF Y2>%0 THEN Y2=Y2-%1
4820 ENDPROC 
4830 ------------------------------
5000 PROC NAGLOWEK
5010   SETCOLOR 2,0,0:CLS 
5020   ? "KONWERTER BP>OBJ       TAJEM
NICE ATARI"
5030   ? "autor: CARAMPUC / ASF"
5040 ENDPROC 
5050 ------------------------------
6000 PROC NAZWA
6010   REPEAT 
6020     A$="":N$=""
6030     ? :INPUT "podaj nazwe obrazka
 (*=katalog dysku) >",A$
6040     IF A$="*" THEN DIR "D1:*.*"
6050   UNTIL A$<>"*"
6060   N$(1,2)="D:":N$(3,14)=A$
6070 ENDPROC 
6080 ------------------------------
6500 PROC SPYTAJ
6510   ? :? "Czy chcesz powtorzyc (t/n
) ?"
6520   REPEAT 
6530     T$=INKEY$
6540   UNTIL T$="n" OR T$="N" OR T$="t
" OR T$="T"
6550   KONIEC=(T$="t") OR (T$="T")
6560 ENDPROC 
6570 ------------------------------


Carampuc / ASF



Powrót na start | Powrót do spisu treści | Powrót na stronę główną

Pixel 2001