Tajemnice ATARI

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"



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

Pixel 2001