TURBO BASIC XL część druga
NOWE ROZKAZY
Turbo Basic XL oprócz zbioru instrukcji umożliwiających pisanie programów strukturalnie oferuje użytkownikowi kilkanaście rozkazów umożliwiających efektywniejsze wykorzystanie możliwości naszego ulubieńca. Są to:
DPOKE adres,słowo. - dwubajtowa instrukcja POKE; młodszy bajt słowa (uwaga dla początkujących:
słowo w tym wypadku nie oznacza wyrazu, np. "Ziutek" ale liczbę dwubajtowa, np. 32000) wpisywany jest do komórki adres a starszy do komórki adres + 1.
MOVE skąd,dokąd, ile - przeniesienie bloku pamięci spod adresu skąd pod adres dokąd; ile określa liczbę bajtów do przeniesienia.
- MOVE skąd,dokąd,ile - podobnie jak wyżej z tym, że bajty są przenoszone od końca; jako dokładniejsze wyjaśnienie niech posłuży przykład wykonania tej samej pracy przy użyciu Atari Basic-a:
FOR i = ile - 1 TO 0 STEP -1: POKE dokąd + 1,PEEK (skąd + 1):
NEXT i
BPUT #n,skąd,ile - umożliwia zapisanie na urządzeniu #n (musi być przedtem otwarte i określone instrukcją OPEN) bloku danych od adresu skąd i długości ile.
BGET #n,dokąd,ile - podobnie jak wyżej: wczytanie ile bajtów pod adres dokąd.
FILLTO x,y - wypełnienie obszaru; zgodne z instrukcjami Atari Basic-a: POSITION x,y : XIO 18,#16,0,0,"S:".
FCOLOR n - wybór koloru dla FILLTO (odpowiednik POKE 756,n).
PAINT x,y - wypełnienie zamkniętego obszaru kolorem wybranym ostatnią instrukcją COLOR;
w przypadku zbyt dużych obszarów do wypełnienia, ze względu na używany przez rozkaz algorytm, może się okazać, że mamy za mało wolnej pamięci do wykonania tego rozkazu - pojawi się komunikat ERROR - 2MEM
TEXT x,y,tekst - umożliwia pisanie tekstów w trybie graficznym; x,y określają pozycję górnego, lewego rogu (w punktach!); gdy tekst jest zbyt długi i wychodzi poza ekran jest po prostu przycinany w odpowiednim miejscu; w tekście może występować tylko jedno wyrażenie (nie lista z przecinkiem lub średnikiem!); Ciekawe efekty daje wykorzystanie tego rozkazu w trybie graficznym 0 - zobaczcie, co się pojawi po napisaniu (w GR.0) COLOR 128:TEXT 0,0, "Atari" i COLOR 40 : TEXT 0,0,"Atari" - zauważycie, że wartość argumentu instrukcji COLOR określa, jakim znakiem (w kodzie ATASCII) będzie wypisywany tekst.
CIRCLE x,y,rx,ry - kreśli elipsę o środku w punkcie x,y i promieniach rx, ry; w przypadku pominęcia ry kreślone będzie koło o promieniu rx.
INPUT "jakiś tekst", wartość1, wartość2,... - odpowiednik rozkazu INPUT Atari Basic-a; umożliwia oszczędzenie rozkazów PRINT;
ponadto jeżeli po tekście zamiast przecinka napiszemy średnik nie pojawi się denerwujący niektórych znak zapytania.
PAUSE n - przerywa wykonanie programu na czas n/50 sekundy.
DSOUND kanał, częstotliwość, szumy, głośność - rozkaz podobny do normalnego SOUND - umożliwia łączenie dwóch normalnych kanałów (1 i 2 lub 3 i 4) w jeden o rozszerzonym zakresie oktaw; na pojedynczym kanale możemy uzyskać 4 oktawy, na dwóch połączonych - 7 oktaw.
DSOUND - ustawia głośność wszystkich generatorów dźwięku na zero (czyli nastaje upragniona przez współdomowników CISZA).
CLOSE - zamyka wszystkie otwarte przez programistę kanały wejścia/wyjścia (oczywiście, nie ingeruje w kanał edytora)
-- - jest to specjalny rozkaz REM;
po poleceniu list na ekranie ujrzymy nie dwa a 30 znaków "-";
ciekawostką jest fakt, że rozkaz ten zajmuje jeden bajt pamięci mniej niż normalny REM bez tekstu; stosuje się go do uwypuklania pewnych części programu (patrz: program przykładowy).
DODATKOWE FUNKCJE
DPEEK(adres) - dwubajtowy PEEK; równoważny sekwencji PEEK(adres)+256*PEEK(adres+1).
INKEY$ - bardzo przydatna zmienna odczytująca znaki z bufora klawiatury; zwraca wartość naciśniętego aktualnie klawisza bądź " " (spacja), gdy żaden nie jest naciśnięty.
INSTR(A$,B$,i) - poszukuje zmiennej B$ w dłuższej (!) zmiennej A$ od pozycji i; jeżeli ją znajdzie jej pozycja zapisywana jest w A$; gdy pominiemy i przeszukiwanie odbywać się będzie od początku zmiennej B$.
UNINSTR(A$,B$,i) - podobnie jak INSTR; bity 7 i 6 pojedynczego znaku nie są rozpoznawane - umożliwia to poszukiwanie tekstu bez względu na to, czy jest pisany dużymi, czy małymi znakami; efektem ubocznym mogą być przekłamania przy szukaniu liczb lub znaków specjalnych.
ERR - numer ostatniego błędu, który wystąpił w trakcie wykonywania programu.
ERL - numer linii, w której wystąpił powyższy błąd. Dwie powyższe instrukcje powinny być używane w procedurze wywoływanej rozkazem TRAP w celu kulturalnego obsłużenia występujących błędów.
TIME - zmienna podająca czas rzeczywisty z wewnętrznego zegara RTCLOCK (komórki pamięci od 18 do 20) - jest to czas liczony od włączenia komputera; jednostką jest tutaj 1/50 sekundy.
TIME$ - specjalna zmienna tekstowa, zawierająca czas w postaci HHMMSS, gdzie HH to oczywiście godziny (od 00 do 23), MM - minuty a SS - sekundy; czas możemy ustawić przez przyporządkowanie zmiennej TIME$ odpowiedniej wartości (np. w tej chwili mógłbym napisać TIME$="213247" i pójść spać gdyby nie to, że muszę skończyć ten tekst abyś Ty, drogi Czytelniku otrzymał go we właściwym CZASIE).
FRAC(liczba) - funkcja ta zwraca część liczby dziesiętnej po przecinku (np. FRAC(11.23) da nam wartość 23).
TRUNC(liczba) - funkcja ta daje nam część całkowitą liczby.
RND - skrócona funkcja RND(0) (bez nawiasów).
RND(n) - generuje liczbę losową z przedziału <0,n).
HEX$(liczba) - zamienia liczbę całkowitą z przedziału < 0,65535 > na odpowiadającą jej liczbę szesnastkową; zwracam uwagę, że jest to funkcja przyporządkowana zmiennej tekstowej (podobnie jak wszystkie pozostałe, mające znak $ na końcu nazwy).
DEC(A$) - odwrotność HEX$ - zmienna szesnastkowa zawarta w A$ zostaje zmieniona na liczbę całkowitą; jeśli A$ jest dłuższa niż 4 znaki (czyli reprezentuje liczbę więcej niż dwubajtową) to pod uwagę brane są tylko cztery ostatnie znaki. Liczby szesnastkowe mogą być pisane bezpośrednio w programie - należy je tylko poprzedzić znakiem $ (np. $0600=$600=1536).
x1 & x2 - binarne AND (patrz: kurs asemblera).
x1 ! x2 - binarne OR (patrz: j.w.).
x1 EXOR x2 - binarne XOR (exclusive or; patrz: j.w.).
x1 DIV x2 - dzielenie bez reszty:
x1 DIV x2 = TRUNC( x1/x2 ).
x1 MOD x2 - reszta (modulo) z dzielenia: x1 MOD x2 = x1 - x2 *TRUNC( x1/x2 ).
ROZKAZY KOMUNIKACJI ZE STACJĄ DYSKÓW
DIR "D1:*.*" - ukazuje na ekranie spis zbiorów z określonego dysku (podobnie jak directory w DOS-ie); pominięcie wyrażenia w cudzysłowach spowoduje pokazanie całego katalogu dysku D1: .
RENAME"D:STARY,NOWY" - zmiana nazwy zbioru na dysku; nazwy muszą być podane w całości.
DELETE"D:NAZWA" - usuwa z dysku zbiór o podanej nazwie; podobnie jak w DOS-ie można używać znaku "*". UWAGA: Turbo Basic XL nie pyta o potwierdzenie skasowania zbioru (zbiorów)!
LOCK"D:NAZWA" - zabezpiecza zbiór NAZWA przed przypadkowym skasowaniem.
UNLOCK"D:NAZWA" - znosi ochronę zbioru.
BLOAD"D:NAZWA.OBJ" - ładuje zbiór binarny typu .OBJ w określony w tym zbiorze obszar pamięci.
BRUN"D:NAZWA.OBJ" - ładuje i uruchamia zbiór binarny (jak opcja L z DOS-u).
Oprócz opisanych przeze mnie komend i rozkazów do dyspozycji użytkownika stoją wszystkie rozkazy Atari Basic-a. Interpreter Turbo Basic-a XL znajduje się w tym samym miejscu pamięci co standardowy Basic oraz zajmuje dodatkowo pamięć RAM zakrytą przez ROM. Mimo braku rozkazów wykorzystujących w pełni możliwości ATARI XL/XE (np. techniki duszków) dzięki swojej popularności (jest to program Public Domain; występuje na kasetach i dyskach), szybkości (jest 2-3 razy szybszy od Atari Basic-a) oraz możliwości strukturalnego konstruowania programów Turbo Basic XL jest językiem godnym popularyzowania, czego nie omieszkamy czynić na naszych łamach. Tak jak i ostatnio zamieszczamy program przykładowy, ilustrujący wykorzystanie właściwości Turbo Basica XL do efektowniejszego programowania. Jest to prosta gra logiczna. Jej zasady wyjaśnia program. Jest on tak napisany, że nie wymaga chyba komentarza. Polecam jego samodzielną analizę.
W następnym odcinku poględzimy nieco o programowaniu strukturalnym ogólnie i zaprezentujemy kolejny program-przykład w Turbo Basic-u XL.
Upojnych nocy przy klawiaturze życzy
Carampuc / ASF
Ps. Specjalne podziękowania dla Jacka za wspomożenie mnie stacją dysków - dzięki!
1 ------------------------------
2 REM GRA LOGICZNA
3 REM (Turbo Basic XL)
4 REM specjalnie dla Tajemnic Atari
5 REM Napisal Carampuc z grupy ASF
6 REM Gdansk .. marzec 1991
7 ------------------------------
100 ------------------------------
110 EXEC TABLICE
120 REPEAT
130 EXEC ZMIENNE
140 EXEC LOSUJ
150 EXEC EKRAN
160 EXEC RUCH
170 EXEC SPYTAJ
180 UNTIL NOT KONIEC
190 CLS #6
200 TEXT 120,60,"GAME OVER"
210 PAUSE 30
220 END
230 ------------------------------
240 ------------------------------
1000 PROC TABLICE
1010 DIM TAB(15):REM "pole gry" o wy
miarze bok^2-1
1020 DIM T$(30):REM zmienna pomocnic
za
1030 ENDPROC
1040 ------------------------------
1100 PROC ZMIENNE
1110 BOK=4:REM dlugosc boku
1120 KL=15:REM ile klockow do przesu
wania
1130 RUCH=%0:REM ktory ruch
1140 PX=%0:PY=%0:REM pozycje (wzgled
ne) "kursora"
1150 DX=%0:DY=%0:REM przyrost wartos
ci pozycji
1160 XX=19:YY=20:REM wspol. lewego g
ornego rogu pola
1170 ENDPROC
1180 ------------------------------
1500 PROC LOSUJ
1510 REM procedura losuje poczatkowe
ustawienie klockow
1520 DIM T2(15):REM tablica pomocnic
za
1530 FOR X=%1 TO KL
1540 T2(X)=%1
1550 NEXT X
1560 FOR X=%0 TO KL-%1
1570 REPEAT
1580 LOS=TRUNC(KL*RND)+%1
1590 UNTIL T2(LOS)=%1
1600 T2(LOS)=%0
1610 TAB(X)=LOS
1620 NEXT X
1630 ENDPROC
1640 ------------------------------
2000 PROC EKRAN
2010 REM procedura przygotowuje ekra
n do gry
2020 GRAPHICS 8+16:SETCOLOR %2,%0,%0
:COLOR %1
2030 PLOT %0,%0:DRAWTO 319,%0:DRAWTO
319,150:DRAWTO %0,150:DRAWTO %0,%0
2040 PLOT %2,%2:DRAWTO 317,%2:DRAWTO
317,148:DRAWTO %2,148:DRAWTO %2,%2
2050 WX=XX-%3:WY=YY-%3:DL=97:EXEC KW
ADRAT
2060 REM narysuj plansze
2070 FOR Y=%0 TO %3
2080 DL=22
2090 FOR X=%0 TO %3
2100 WX=XX+X*(DL+1):WY=YY+Y*(DL+
1)
2110 EXEC KWADRAT
2120 WART=TAB(X+Y*4)
2130 IF WART THEN TEXT WX+4+4*(W
ART<10),WY+7,WART
2140 NEXT X
2150 NEXT Y
2160 PAINT 17,18
2170 WX=120:WY=20
2180 RESTORE #INSTR
2190 READ T$
2200 WHILE T$<>"#"
2210 TEXT WX,WY,T$
2220 WY=WY+8
2230 READ T$
2240 WEND
2250 TEXT 20,120,"RUCH:"
2260 TEXT 60,120,RUCH
2270 # INSTR
2280 DATA GRA LOGICZNA
2290 DATA Tajemnice Atari 3/91
2300 DATA
2310 DATA Twoje zadanie polega
2320 DATA na ulozeniu klockow
2330 DATA na planszy obok w kole-
2340 DATA jnosci rosnacej.
2350 DATA Sterowanie odbywa sie
2360 DATA za pomoca klawiszy
2370 DATA kursora i spacji.
2380 DATA
2390 DATA Powodzenia...
2400 DATA #
2410 ENDPROC
2420 ------------------------------
2500 PROC KWADRAT
2510 REM rysowanie kwadratu o lewym
gornym rogu w punkcie wx,wy o boku dlu
gosci dl
2520 PLOT WX,WY:DRAWTO WX+DL,WY:DRAW
TO WX+DL,WY+DL:DRAWTO WX,WY+DL:DRAWTO WX,WY
2530 ENDPROC
2540 ------------------------------
3000 PROC PRZESUN
3010 REM procedura dokunuje przesuni
ecia wskazanego klocka w wolne miejsce
3020 DX=PX+PY*4
3030 IF NOT (PY-%1<%0)
3040 IF TAB(DX-4)=%0
3050 DY=-4
3060 TAB(DX+DY)=TAB(DX)
3070 EXEC ZMIEN
3080 ENDIF
3090 ENDIF
3100 IF PY+%1<4
3110 IF TAB(DX+4)=%0
3120 DY=4
3130 TAB(DX+DY)=TAB(DX)
3140 EXEC ZMIEN
3150 ENDIF
3160 ENDIF
3170 IF NOT (PX-%1<0)
3180 IF TAB(DX-%1)=%0
3190 DY=-%1
3200 TAB(DX+DY)=TAB(DX)
3210 EXEC ZMIEN
3220 ENDIF
3230 ENDIF
3240 IF PX+%1<4
3250 IF TAB(DX+%1)=%0
3260 DY=%1
3270 TAB(DX+DY)=TAB(DX)
3280 EXEC ZMIEN
3290 ENDIF
3300 ENDIF
3310 ENDPROC
3320 ------------------------------
3500 PROC KLAWISZ
3510 REM procedura zwraca wartosc 1
lub -1 w zmiennych dx i dy w zaleznosc
i od tego, ktory klawisz byl wcisniety
3520 REM lub 0 w obu zmiennych jesli
wcisnieto spacje
3530 REPEAT
3540 GET KEY
3550 LG=(KEY=32)+(KEY=43)+(KEY=45)
+(KEY=42)+(KEY=61)
3560 UNTIL LG
3570 DX=(KEY=42)-(KEY=43)
3580 DY=(KEY=61)-(KEY=45)
3590 ENDPROC
3600 ------------------------------
4000 PROC RYSUJ
4010 REM procedura rysuje "kursor" w
polu px,py
4020 WX=XX+PX*23+%2:WY=YY+PY*23+%2:D
L=18
4030 EXEC KWADRAT
4040 ENDPROC
4050 ------------------------------
4100 PROC SPRAWDZ
4110 REM sprawdzenie, czy klocki sa
dobrze ulozone
4120 REM jezeli tak, to po wyjsciu
z procedury lg=1
4130 LG=%1
4140 FOR X=%0 TO KL-%2
4150 LG=LG*((TAB(X+%1)-TAB(X))=%1)
4160 NEXT X
4170 ENDPROC
4180 ------------------------------
5000 PROC RUCH
5010 REM sterowanie gra
5020 PX=%0:PY=%0:EXEC RYSUJ
5030 REPEAT
5040 EXEC KLAWISZ
5050 IF DY+DX
5060 COLOR %0
5070 DL=18
5080 EXEC KWADRAT
5090 COLOR %1
5100 IF (PX+DX>=%0) AND (PX+DX<4
) THEN PX=PX+DX
5110 IF (PY+DY>=%0) AND (PY+DY<4
) THEN PY=PY+DY
5120 EXEC RYSUJ
5130 ELSE
5140 IF TAB(PX+PY*4)<>%0 THEN EX
EC PRZESUN
5150 ENDIF
5160 EXEC SPRAWDZ
5170 UNTIL LG
5180 TEXT 40,130,"Koniec! Wreszcie t
ego dokonales!"
5190 ENDPROC
5200 ------------------------------
6000 PROC ZMIEN
6010 REM zmiana polozenia klocka na
planszy
6020 TAB(DX)=%0
6030 DL=23
6040 SX=XX+PX*DL+4
6050 SY=YY+PY*DL+7
6060 TEXT SX,SY," "
6070 X=PX+DY*(ABS(DY)=1)
6080 Y=PY+SGN(DY*(ABS(DY)=4))
6090 SX=XX+X*DL+4
6100 SY=YY+Y*DL+7
6110 WART=TAB(X+Y*4)
6120 TEXT SX+4*(WART<10),SY,WART
6130 RUCH=RUCH+%1
6140 TEXT 60,120,RUCH
6150 ENDPROC
6160 ------------------------------
6500 PROC SPYTAJ
6510 TEXT 30,138,"Chcesz sprobowac j
eszcze raz (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 ------------------------------
9999 LIST "D:gra2.txl"
|