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
|