Komunikaty Basic’a o błędach

BAD DATA ERROR
Problem: Z otwartego zbioru wczytano daną łańcuchową, gdy program spodziewał się danej numerycznej.
Reakcja: Upewnij się, czy dane wprowadzono z separatorami pomiędzy elementami.

BAD SUBSCRIPT
Problem: Program próbuje odwołać się do elementu tablicy, którego numer leży poza zakresem zdefiniowanym w DIM.
Reakcja: Upewnij się, czy właściwie zdeklarowałeś tablice. W modzie bezpośrednim wydrukuj ZAWSZE indeksy.

BREAK
Problem: Program zatrzymał się, ponieważ wcisnąłeś klawisz STOP (RUN/STOP).
Reakcja: Użyj polecenia CONT w celu kontynuowania programu.

CAN’T CONTINUE
Problem: Polecenie CONT nie pracuje, bo: program nie był jeszcze uruchomiony albo: wystąpił błąd lub też: linia programu była edytowana.
Reakcja: Prawdopodobnie naniosłeś poprawki; uruchom program od nowa.

DEVICE NOT PRESENT
Problem: Zadane urządzenie WE/WY nie jest osiągalne dla instrukcji OPEN, CLOSE, CMD, PRINT#, INPUT#, GET#.
Reakcja: Sprawdź, czy używane urządzenie jest włączone, oraz czy używasz właściwie instrukcji OPEN.

DIVISION BY ZERO
Problem: Dzielenie przez zero jest niedopuszczalne w arytmetyce.
Reakcja: Każ wydrukować podejrzane zmienne, aby określić, która ma wartość 0.

EXTRA IGNORED
Problem: Wpisano zbyt wiele elementów w odpowiedzi na instrukcję INPUT. Tylko kilka pierwszych zostało zaakceptowanych.
Reakcja: Sprawdź znaki przestankowe.

FILE NOT FOUND
Problem: Nie ma zbioru o podanej nazwie.
Reakcja: Sprawdź, czy używasz właściwego dysku lub taśmy, oraz czy nazwa zbioru została wpisana bez błędu; zwróć szczególną uwagę na duże i małe litery i odstępy.

FILE NOT OPEN
Problem: Zbiór użyty w instrukcji OPEN, CLOSE, CMD, PRINT#, INPUT#, GET# musi zostać najpierw otwarty.
Reakcja: Otwórz zbiór. Sprawdź, czy używasz właściwego numeru zbioru.

FILE OPEN
Problem: Usiłowano otworzyć zbiór używając numeru zbioru otwartego wcześniej.
Reakcja: Zamknij poprzedni zbiór lub użyj innego numeru.

FORMULA TOO COMPLEX
Problem: Wyrażenie tekstowe powinno zostać podzielone co najmniej na dwie części, aby komputer mógł je obrabiać albo wyrażenie ma zbyt wiele nawiasów.
Reakcja: Użyj mniejszych łańcuchów. Zmniejsz liczbę nawiasów.

ILLEGAL DEVICE NUMBER
Problem: Pojawia się, jeśli usiłujesz nieprawidłowo użyć urządzenia (np. załadować [LOAD] program z klawiatury, ekranu lub RS-232).
Reakcja: Użyj właściwego numeru urządzenia.

ILLEGAL DIRECT
Problem: Instrukcja INPUT może być używana tylko wewnątrz programu, a nie w modzie bezpośrednim.
Reakcja: Użyj innego polecenia.

ILLEGAL QUANTITY
Problem: Wartość argumentu używanego w funkcji lub instrukcji leży poza dopuszczalnymi granicami.
Reakcja: Użyj trybu bezpośredniego w celu określenia wartości zmiennych w danej chwili. Popraw ujemne indeksy. Sprawdź, czy wymiary są dostatecznie duże.

LOAD
Problem: Są kłopoty z programem na dyskietce lub taśmie.
Reakcja: Załaduj powtórnie.

MISSING FILE NAME
Problem: Ładowanie (lub zapisywanie) z portu szeregowego wymaga podania nazwy zbioru.
Reakcja: Podaj nazwę zbioru.

NEXT WITHOUT FOR
Problem: Spowodowany przez nieprawidłowe zagnieżdżenie pętli lub użycie różnych zmiennych indeksowych w instrukcjach FOR i NEXT.
Reakcja: Sprawdź, czy pętla ma punkt początkowy.

NOT INPUT FILE
Problem: Próbowano dokonać operacji INPUT do zbioru, który był określony jako wejściowy.
Reakcja: Popraw drugi adres w instrukcji OPEN.

NOT OUTPUT FILE
Problem: Próbowano dokonać operacji PRINT do zbioru, który był określony jako wejściowy.
Reakcja: Popraw drugi adres w instrukcji OPEN.

OUT OF DATA
Problem: Wykonano instrukcję READ, kiedy w instrukcji DATA nie było już nie wczytanych danych.
Reakcja: Sprawdź, czy nie opuściłeś danych; dodaj więcej, jeśli potrzeba.

OUT OF MEMORY
Problem: Zabrakło pamięci do pomieszczenia programu lub zmiennych. Może także nastąpić, gdy zagnieżdżono zbyt wiele pętli, lub wywołań GOSUB.
Reakcja: Zmiejsz ilość pętli lub instrukcji GOSUB działających jednocześnie. Używaj zmiennych indeksowych powtórnie tam gdzie jest to możliwe, aby uniknąć wielu nie zakończonych pętli. Wyczyść pamięć używając funkcji FREE(X).

OVERFLOV
Problem: Wynik obliczeń przekroczył dopuszczalny zakres – liczbę 1.70141884E+38.
Reakcja: Spradź poszczególne kroki rachunków.

REDIM’D ARRAY
Problem: Tablica może być deklarowana tylko raz w programie. Jeśli tablica jest użyta przed jej zadeklarowaniem, to automatycznie zadeklarowany zostanie wymiar 10. Każda następna deklaracja spowoduje wtedy błąd.
Reakcja: Umieszczaj instrukcje DIM przed pierwszym odwołaniem do tablicy i nie powtarzaj deklaracji.

REDO FROM START
Problem: Znaki alfanumeryczne zostały wpisane podczas instrukcji INPUT tam, gdzie powinna być podana liczba. Wystarczy wprowadzić dane powtórnie, a program sam podejmie dalsze działanie.
Reakcja: Podaj właściwe dane dla instrukcji INPUT.

RETURN WITHOUT GOSUB
Problem: Napotkano instrukcję RETURN, podczas gdy nie było odwołania GOSUB do procedury.
Reakcja: Sprawdź, czy program kończy się (END) zanim trafi na procedurę umieszczoną na końcu programu.

STRING TOO LONG
Problem: Łańcuch może mieć co najwyżej 255 znaków.
Reakcja: Pilnuj, aby łańcuchy nie miały więcej niż 255 znaków, a wprowadzone przy pomocy instrukcji INPUT 80 znaków.

?SYNTAX ERROR
Problem: Instrukcja jest nierozpoznawalna dla Commodore 64C. Brakujące lub nadmiarowe nawiasy, literówki w słowach kluczowych.
Reakcja: Sprawdź pisownię słów kluczowych i składnię instrukcji.

TYPE MISMATCH
Problem: Ten błąd pojawia się, kiedy liczba użyta zostanie zamiast tekstu lub na odwrót.
Reakcja: Sprawdź, czy znaki $ zostały umieszczone tam gdzie być powinny.

UNDEF’D FUNCTION
Problem: Wywołana została funkcja użytkownika, która nigdy nie została zdefiniowana przy użyciu DEF FN.
Reakcja: Zdefiniuj funkcję przy użyciu DEF FN.

UNDEF’D STATEMENT
Problem: Próbowano wykonać instrukcję GOTO, GOSUB lub RUN do linii, której nie ma w programie.
Reakcja: Sprawdź, czy linia programu istnieje.

VERIFY
Problem: Programy na dyskietce lub taśmie i w pamięci są różne.
Reakcja: Zapisz program jeszcze raz, używając innej nazwy.

Uwaga:
Typowym błędem jest wpisanie linii o długości 41 lub więcej znaków, nie wciśnięcie RETURN i napisanie następnej linii. Wciśnięcie RETURN potraktuje teraz obie linie jako jedną. Aby odnaleźć ten błąd należy wylistować program na ekranie i naciskając RETURN w kolejnych liniach programu. Patrz uważnie jak kursor przeskakuje do następnej linii programu (nie: ekranu). Linia, którą opuści, jest dołączona do linii powyżej. Przepisz tę linię na nowo.

Polecenia Basic’a cz. 3

RESTORE – Ustawia wskaźnik instrukcji DATA na początek danych.

RESTORE [numer linii]
W BASICu istnieje wewnętrzny wskaźnik do następnego elementu w instrukcji DATA, który będzie czytany przy pomocy READ. Kiedy polecenie RESTORE jest wykonywane w programie, to wskaźnik ten jest ustawiany tak, aby wskazywał pierwszy element DATA. Pozwala to na powtórne wczytanie danych. Jeśli po RESTORE podany został numer linii, to spowoduje to ustawienie wskaźnika na początek danych znajdujących się w pierwszej instrukcji DATA począwszy od podanego numeru linii.

PRZYKŁADY:
10 FOR I =1 TO 3
20 READ X
30 SUMA=X+SUMA
40 NEXT
50 RESTORE
60 GOT010
70 DATA 10,20,30

W przykładzie tym dane z linii 70 wczytywane są do zmiennej X przy pomocy READ. Kiedy wszystkie liczby zostaną przeczytane (w trzech cyklach pętli), to RESTORE zeruje wskaźnik w celu ponownego czytania danych z linii 70.

10 READ A,B,C
20 DATA 100,500,750
30 READ X,Y,Z
40 DATA 36,24,38
50 RESTORE
60 READ S,P,Q
70 RESTORE 30
80 READ D,E,F

W tym przykładzie instrukcja RESTORE ustawia wskaźnik na początek danych w linii 20. W ten sposób READ w linii 60 może przeczytać dane 100,500,750. RESTORE 30 ustawia wskaźnik na najbliższą instrukcję DATA po linii 30; w tym przypadku na początek danych w instrukcji DATA w linii 40. W ten sposób linia 80 wczyta liczby 36,24 i 38.

RETURN – Powrót z procedury.

RETURN
Instrukcja ta występuje zawsze w parze z instrukcją GOSUB. Kiedy program natrafia na instrukcję RETURN, to skacze do instrukcji znajdującej się bezpośrednio po instrukcji GOSUB. Jeśli jednak taka instrukcja nie była poprzednio wykonana, to wystąpi błąd RETURN WITHOUT GOSUB ERROR (powrót bez GOSUB) i program zatrzyma się. Wszystkie podprogramy muszą kończyć się instrukcją RETURN.

PRZYKŁAD:
10 PRINT „SKOCZ DO PODPROGRAMU”
20 GOSUB 100
30 PRINT „Z POWROTEM W PROGRAMIE”
90 STOP
100 PRINT „PODPROGRAM 100”
110 RETURN

W programie tym następuje wywołanie (w linii 20) podprogramu w linii 100, który drukuje informację „PODPROGRAM 100” i powraca do linii 30 programu.

RUN – Uruchamia program w BASICu.

RUN [numer linii]
Instrukcja RUN uruchamia program wpisany uprzednio do pamięci komputera, lub załadowany do niej przy pomocy instrukcji LOAD. Zanim nastąpi uruchomienie programu, RUN kasuje wszystkie zmienne, zeruje wskaźniki DATA, czyści (ale nie domyka) kanały I/0 (WE/WY) i odtwarza standardowe kanały I/0. Jeśli po instrukcji RUN następuje numer linii, to wykonywanie programu rozpocznie się w tej właśnie linii.

PRZYKŁAD:
RUN Rozpocznie wykonywanie programu od początku.
RUN 100 Rozpocznie wykonywanie w linii 100.

SAVE – Zapisz program na taśmie lub dysku.

SAVE [„nazwa zbioru”] [,numer urządzenia] [znak EOF]
Polecenie to powoduje przepisanie programu z pamięci komputera na nośnik magnetyczny. Jeśli podasz samo słowo SAVE i wciśniesz klawisz RETURN, to komputer przyjmie, że urządzeniem wyjściowym jest taśma. Komputer nie ma sposobu na sprawdzanie, czy w miejscu zapisywania programu nie zostało coś uprzednio nagrane, więc upewnij się przed nagrywaniem, czy taśma jest wolna. Jeśli po SAVE podamy nazwę zbioru (w formie ciągu znaków lub zmiennej tekstowej), to COMMODORE nada tę nazwę zbiorowi na taśmie. Jeśli po nazwie i przecinku podany zostanie numer urządzenia, to program zostanie wysłany na to urządzenie. Urządzenie numer 1 oznacza taśmę kasetową, numer 8 stację dyskietek. W przypadku taśmy kasetowej na końcu instrukcji może być podany także tzw. drugi adres. Jeśli ma on wartość zero, to wykonana zostanie normalna instrukcja SAVE. Jeśli liczba ta wynosi 1, to COMMODORE 64 zapisze w nagłówku adres startowy programu, w celu późniejszego utycia go w instrukcji LOAD. Jeśli liczba ta wynosi 2, to na końcu programu zapisany zostanie znak EOF (End Of Tape – koniec taśmy). Jeśli liczba ta wynosi 3, to zapisany zostanie adres startowy i znak końca taśmy (EOF). Jeśli w trakcie ładowania programu komputer odczyta ten znacznik, to wyświetlony zostanie komunikat FILE NOT FOUND ERROR (nie znaleziono programu).

PRZYKŁADY:
SAVE Zapisuje program na taśmę.
SAVE „PROGRAM” Zapisuje program na taśmie i nadaje mu nazwę „PROGRAM”.
SAVE A$,8 Zapisuje program na dysk nadając mu nazwę zawartą w zmiennej A$.
SAVE „PROGRAM”,8 Zapisuje program na dysk, nadając mu nazwę „PROGRAM”.
SAVE „PROGRAM”,1,2 Zapisuje program na taśmę, umieszcza znak EOF za programem.

STOP – Zatrzymuje program.

STOP
Instrukcja ta wstrzymuje wykonywanie programu. Informacja BREAK IN LINE xxx (przerwano w linii xxx pojawi się na ekranie, gdzie xxx oznacza numer linii zawierającej instrukcję STOP. Program może zostać uruchomiony ponownie od następnej linii przy utyciu instrukcji CONT, jeśli polecenie to użyte zostanie przed wprowadzeniem jakichkolwiek zmian w treści programu. Instrukcja STOP jest często używana w „odpluskwianiu” programu (poszukiwaniu błędów).

SYS – Wywołuje i wykonuje podprogram w języku maszynowym zaczynającym się od podanego adresu.

SYS
Polecenie to powoduje wywołanie podprogramu rozpoczynającego się od podanego adresu. Adres może być z zakresu 0 do 65635. W komórce o podanym adresie musi zaczynać się program w języku maszynowym.

PRZYKŁAD:
SYS 40960 – Wywołuje i wykonuje program maszynowy od adresu 40960.

VERIFY – Porównuje program w pamięci z programem umieszczonym na taśmie lub dysku.

VERIFY „nazwa zbioru”[,numer urządzenia][,flaga relokacji]
Instrukcja ta powoduje, że COMMODORE 64 porówna program znajdujący się na taśmie z programem już zapisanym na taśmie lub dysku, w celu sprawdzenia jego poprawnego zapisania. Polecenie to jest również użyteczne w celu ustawienia taśmy za ostatnim programem. Komputer czyni to informując użytkownika, że program nie zgadza się. Taśma będzie jednak ustawiona właściwie w celu bezpiecznego nagrania następnego programu. Instrukcja VERIFY podana bez dodatkowych argumentów spowoduje porównanie najbliższego programu na taśmie, niezależnie od jego nazwy, z programem w pamięci. Podanie nazwy programu w cudzysłowiu, lub podanie nazwy zmiennej tekstowej spowoduje uprzednie odszukanie na taśmie właściwego programu. Podanie numeru urządzenia po nazwie zbioru spowoduje porównanie zbioru z wybranego urządzenia (1 – taśmy, 8 – dyskietki). Flaga relokacji jest ta sama co w instrukcji LOAD. Porównuje program od adresu pamięci, od którego był on zapisany na taśmie.

PRZYKŁADY:
VERIFY Weryfikuje najbliższy program na taśmie.
VERIFY „PROG” Odszukuje program „PROG” na taśmie i porównuje go z pamięcią.
VERIFY „PROG”,8,1 Odszukuje program „PROG” na dysku i porównuje go z pamięcią.

WAIT – Zatrzymuje program do czasu spełnienia określonego warunku przez dane.

WAIT < adres > , < maska-1 > [, < maska-2 > ]
Instrukcja WAIT zawiesza wykonanie programu do czasu, aż określona przez adres komórka pamięci nie będzie zawierała zadanej wartości (układu bitów). Innymi słowy, WAIT powoduje oczekiwanie na wystąpienie pewnego zjawiska zewnętrznego. Odbywa się to przy pomocy monitorowania stanu bitów rejestrów I/0 (Wejście/Wyjście). Dane używane w instrukcji WAIT mogą mieć wartości 0-65535 dla adresu i 0-255 dla masek. W większości programów polecenie to nie powinno być używane. Powoduje ono zawieszanie wykonywania programu do czasu, aż układ bitów w wybranym miejscu pamięci nie zmieni się w pożądany sposób. Może być to użyteczne przy pewnych operacjach I/O. Instrukcja WAIT pobiera zawartość komórki pamięci i wykonuje logiczną operację AND (i) z maską-1. Jeśli podana jest maska-2, to wykonywana jest instrukcja XOR (wyłącznie lub) z maską-2. Innymi słowy maska-1 filtruje wszystkie bity, które nie mają być testowane. Jeśli jakiś bit w masce-1 wynosi 0, to odpowiadający mu bit w wyniku ma zawsze wartość zero. Maska-2 odwraca wszystkie bity, zatem oba stany bitu mogą być testowane. Każdy bit, który testujemy ze względu na wartość zero musi mieć ustawiony (równy 1) odpowiedni bit maski-2. Jeśli odpowiednie bity operandów maski-1 i maski-2 różnią się, to operacja wyłącznego LUB daje rezultat 1. Jeśli odpowiednie bity mają tę samą wartość, to rezultat wynosi 0. Przy pomocy WAIT można wejść w pętlę nieskończoną, z której można wyjść jedynie przez wciśnięcie RUN/STOP i RESTORE. Pierwszy z poniższych przykładów oczekuje na wciśnięcie klawisza w magnetofonie. Drugi program oczekuje, na zderzenie „duszka” z ramką ekranu.

PRZYKŁADY:
WAIT 1,32,32
WAIT , ,

Polecenia Basic’a cz. 2

INPUT# – Wprowadza dane z kanału I/O (we/wy) do zmiennych tekstowych lub numerycznych.

INPUT# ,
Instrukcja ta działa podobnie do INPUT, ale pobiera dane z otwartego wcześniej kanału, zwykle z dyskietki lub kasetki, zamiast z klawiatury. Znaki zachęty nie są używane. Instrukcja ta może być wykonywana tylko z programu.

PRZYKŁAD:
10 OPEN 2,8,2
20 INPUT#2,A$,C,D$

Instrukcja INPUT w linii 20 pobiera dane z kanału dyskowego nr 2 (został on otwarty w linii 10) i przypisuje je zmiennym A$, C i D$.

LET – Przypisuje wartość zmiennej programowej.

[LET] =
Słowo LET (pozwól) jest rzadko używane w programach, ponieważ nie jest konieczne (było dawniej). Za każdym razem, kiedy wartość zmiennej ulega modyfikacji, LET jest stosowane automatycznie. Nazwa zmiennej, której przypisana jest wartość znajduje się po lewej stronie znaku równości. Liczba, łańcuch tekstowy, lub wyrażenie umieszcza się po stronie prawej. Przy pomocy jednej instrukcji LET możesz przypisać tylko jedną wartość.

PRZYKŁAD:
10 LET A=5 (Przypisz wartość zmiennej liczbowej A)
20 B=6 (Przypisz wartość 6 zmiennej liczbowej B)
30 C=A*B+3 (Przypisz zmiennej C wartość wynikającą z obliczenia 5*6+3)
40 D$=”HALO” (Przypisz łańcuch „HALO” zmiennej łańcuchowej D$)

LIST – Wyświetlanie na ekranie treści programu BASICowego znajdującego się aktualnie w pamięci.

LIST [pierwsza linia] [-ostatnia linia]
Polecenie LIST („LISTUJ”) powoduje wyświetlenie programu BASICowego znajdującego się w pamięci komputera (wpisanego albo załadowanego z dyskietek lub kasetek). Kiedy polecenie LIST użyte jest samodzielnie (bez dalszych liczb), to COMMODORE 64 wyświetli na ekranie treść całego programu. Proces wyświetlania może być spowolniony poprzez naciśnięcie klawisza CTRL, lub przerwany przez naciśnięcie klawisza RUN/STOP. Jeśli po LIST podany jest numer linii, to COMMODORE wyświetli tylko tę linię. Jeśli po numerze linii dopiszesz myślnik, to COMMODORE wyświetli linie programu począwszy od podanej linii do końca. Podobnie, jeśli podasz po słowie LIST myślnik i numer linii, to wyświetlone zostaną linie od początku do podanego numeru. I na koniec, jeśli podasz polecenie LIST z dwiema liczbami oddzielonymi myślnikiem, to wyświetlony zostanie fragment programu pomiędzy tymi liniami. Używając tych różnych sposobów korzystania z polecenia LIST możesz w wygodny sposób przeglądać dowolne fragmenty programu i przywoływać je na ekran w celu modyfikacji. Polecenie LIST może być użyte także w programie, ale wykonywanie programu zostanie zawieszone po jego wykonaniu.

PRZYKŁADY:
LIST listuje cały program.
LIST 10 wyświetla linię 10.
LIST 100- listuje program od linii 100 do końca.
LIST -100 listuje program od początku do linii 100.
LIST 10-200 wyświetla na ekranie linie o numerach od 10 do 200 (włącznie).

LOAD – Ładuje program z urządzenia zewnętrznego takiego jak stacja dyskietek lub kasetek.

LOAD „nazwa zbioru” [,numer urządzenia][flaga relokacji]
To polecenie używane jest do wczytania programu zapamiętanego na dysku lub kasetce. Nazwa zbioru oznacza nazwę programu, o długości max. 16 znaków, umieszczoną w cudzysłowiu. Nazwa zbioru musi zostać uzupełniona przecinkiem (poza cudzysłowem) i numerem urządzenia na którym program jest przechowywany (dysk lub taśma). Jeśli numer zostanie pominięty, to komputer przyjmie wartość 1 oznaczającą kasetki (magnetofon DATASSETTE). Flaga relokacji (0 lub 1) określa, w które miejsce pamięci palety załadować program. Flaga relokacji równa 0 oznacza ładowanie programu od początku pola programów BASICu. Flaga 1 oznacza, że program ma być załadowany w to miejsce pamięci, z którego został pobrany do przechowania (instrukcja SAVE). Wartość 0 jest przyjmowana przez komputer automatycznie. Flaga 1 jest używana przy ładowaniu programów napisanych w języku maszynowym. Najczęściej używanym w instrukcji LOAD urządzeniem jest stacja dyskietek. Jest to urządzenie o numerze 8. Jeśli w instrukcji LOAD nie zostanie podane argumenty, to 64 C przyjmie, że chcesz załadować program z taśmy kasetowej i napisze: „PRESS PLAY ON TAPE” (Naciśnij klawisz PLAY magnetofonu). Kiedy naciśniesz PLAY, komputer rozpocznie przeszukiwanie taśmy. Kiedy znajdzie na niej program, to napisze komunikat FOUND „nazwa zbioru”, gdzie „nazwa zbioru” oznacza nazwę pierwszego napotkanego na taśmie zbioru. Naciśnij wtedy klawisz COMMODORE (C=) lub odstępnik, a program zostanie załadowany do pamięci. Jeśli nie naciśniesz żadnego klawisza, to po ok.10 sekundach komputer sam rozpocznie ładowanie programu. Kiedy program zostanie załadowany, to możesz go uruchomić (RUN), przejrzeć (LIST) lub poprawić.

PRZYKŁADY:
LOAD Ładuje pierwszy program z taśmy.
LOAD „HELLO” Szuka na taśmie i ładuje jeśli znajdzie program o nazwie „HELLO”.
LOAD A$,8 Ładuje z dysku program, z którego nazwa jest zapamiętana w zmiennej A$.
LOAD „HELLO”,8 Szuka na dysku i ładuje jeśli znajdzie program o nazwie „HELLO”.
LOAD „MACHLANG”,8,1 Ładuje z dysku program w języku maszynowym w miejsce, z którego był on wysłany na dysk.

Polecenie LOAD może być użyte wewnątrz programu w celu załadowania a następnie uruchomienia innego programu. Mówimy wtedy, że programy tworzą łańcuszek.

NEW – Skasuj program oraz zmienne w pamięci komputera.

NEW
Polecenie to kasuje całkowicie program w pamięci. Polecenie NEW wywołuje automatycznie funkcje CLR (czyszczeni ekranu), odtwarza standardowe kanały I/O (WE/WY), zeruje wskaźniki instrukcji DATA, wskaźnik stosu oraz wskaźniki zmiennych. Jeśli program nie został zapamiętany na taśmie lub dyskietce, to przepadnie bezpowrotnie po użyciu polecenia NEW. Bądź ostrożny z używaniem tego polecenia. NEW może być takie użyte w programie BASICowym. Wykonanie tego polecenia spowoduje jednak natychmiastowe skasowanie i zatrzymanie programu.

ON – Skocz warunkowo do wybranej linii programu, lub wywołaj podprogram, w zależności od wartości wyrażenia.

ON wyrażenie linia#1 [,linia#2,…]
Po słowie ON (W PRZYPADKU) następuje wyrażenie matematyczne, potem jedno ze słów GOTO albo GOSUB, a następnie lista numerów linii oddzielonych przecinkami. Jeśli część całkowita wyrażenia wynosi 1, to program przystąpi do wykonania pierwszej linii. Jeśli rezultat wynosi 2, to wykonana zostanie druga linia itd. Jeśli rezultat wynosi 0, lub jest większy nit liczba numerów linii na liście, to program wykona linie następującą bezpośrednio po instrukcji ON. Jeśli rezultat jest ujemny, pojawi się błąd ILLEGAL QUANTITY ERROR (nieprawidłowa wartość).

PRZYKŁADY:
10 INPUTX:IFX<0THEN 10
20 ON X GOTO 30,40,50,60 Jeśli X = 1, to ON powoduje skok do pierwszej linii na liście, czyli 30. Jeśli X=2, to ON powoduje skok do drugiej linii na liście, czyli 40.itd.

25 STOP
30 PRINT”X=1″
40 PRINT „X=2”
50 PRINT „X=3”
60 PRINT „X=4” Jeśli X=0 lub X > 4 to program skończy się w linii 25 (STOP).

OPEN – Otwórz kanał logiczny.

OPEN , , [,drugi adres] < [;”nazwa zbioru, typ zbioru, tryb”] I [,łańcuch cmd] >
Instrukcja OPEN pozwala komputerowi na dostęp do takich urządzeń jak stacja dyskietek, magnetofon, drukarka czy nawet ekran komputera C64. Po słowie OPEN umieszczony musi być numer zbioru, do którego odwołują się wszystkie pozostałe instrukcje wejścia wyjścia BASICu (takie jak PRINT#, itp.). Liczba ta moce być z zakresu 0 do 255, ale w większości przypadków należy używać liczb z zakresu 1 do 127. Liczby większe od 127 mają specjalne przeznaczenie. Druga liczba zwana numerem urządzenia podawana jest po numerze zbioru. Urządzenie nr 0 to klawiatura komputera, 1 to magnetofon, 2 oznacza kanał RS-232, 3 to ekran COMMODORE 64 C, 4 – 7 zarezerwowane są zwykle dla drukarek, a 8 -11 dla stacji dyskietek. Warto zwykle używać tych samych liczb dla numeru zbioru i numeru urządzenia, ponieważ łatwiej jest wtedy zapamiętać, który jest który. Poprawne numery urządzeń muszą mieścić się w granicach od 0 do 30, przy czym numery od 4 do 30 zarezerwowane są dla urządzeń szeregowych. Po numerze urządzenia można podać trzeci parametr nazywany drugim adresem. W przypadku kasetek może on wynosić 0 w przypadku czytania, 1 w przypadku pisania i 2 w celu zapisania na końcu taśmy symbolu END-0F-TAPE (koniec taśmy). W przypadku dyskietek drugi adres określa numer kanału. Więcej informacji o kanałach dysku i ich numerach znajdziesz w podręczniku obsługi stacji dyskietek. W przypadku drukarki drugi adres służy do wybrania pewnych programowych funkcji. W instrukcji OPEN można także podać po drugim adresie nazwę zbioru dyskowego lub kasetowego lub łańcuch znaków. Ten ostatni stanowi dodatkową komendę dla stacji dyskowej/kasetowej. Jeśli nazwa zbioru jest wyszczególniona, to typ zbioru i tryb odnoszą się tylko do zbiorów dyskowych. Jako typów zbiorów można używać PROGRAM, SEQUENTIAL, RELATIVE i USER; jako trybów: READ i WRITE.

PRZYKŁADY:
10 OPEN 3,3 Otwiera ekran jako zbiór numer 3.
20 OPEN 1,0 Otwiera klawiaturę jako zbiór 1.
30 OPEN 1,1,0 „DOT” Otwiera kasetki w celu czytania, jako zbiór nr 1, podając „DOT” jako nazwę zbioru.
OPEN 4,4 Otwiera drukarkę jako zbiór numer 4.
OPEN 15,8,15 Otwiera kanał poleceń w dysku jako zbiór 15, używając drugiego adresu 15. Drugi adres równy 15 oznacza kanał poleceń/błędów stacji dysków.

5 OPEN 8,8,12,”ZB-TESTOWY,SEQ,WRITE” – Otwiera na dysku, w celu zapisania, zbiór sekwencyjny o nazwie ZB-TESTOWY, jako zbiór nr 8, z drugim adresem równym 12. Zobacz także polecenia CLOSE, CMD, GET#, INPUT# i PRINT# oraz zmienną systemową ST.

POKE – Zmienna zawartość wybranej komórki pamięci.

POKE ,
Polecenie POKE pozwala na zmienienie wartości dowolnego bajtu spośród 64 K pamięci RAM COMMODORE 64 C. Pozwala tym samym na zmianę zawartości wielu rejestrów I/0 (WE/WY). Po słowie POKE należy podać zawsze dwa parametry. Pierwszy określa adres w pamięci i może przyjmować wartości z zakresu 0 do 65535. Drugi parametr może mieć wartość od 0 do 255 i zastąpi wartość znajdującą się dotychczas pod wybranym adresem. umieszczona w pamięci określa układ bitów w danej komórce.

PRZYKŁAD:
10 POKE 53280,1 – Zmienia kolor ramki ekranu

PRINT – Wyświetla na ekranie.

PRINT [lista]
Polecenie PRINT jest podstawowym narzędziem wprowadzania danych w BASICu. Chociaż jest to pierwsza instrukcja, którą poznaje uczący się BASICu, to posiada on bardzo wiele różnych wariantów. Po słowie PRINT mogą występować następujące elementy listy:

Znaki wewnątrz cudzysłowu („tekst”)
Nazwy zmiennych A,B,A$ B$
Funkcje SIN (23), ABS (X)
Wyrażenia 2+2, A*X, C=D
Znaki przystankowe ; ,

Znaki w cudzysłowu zwane są również wyrażeniami dosłownymi, ponieważ będą wydrukowane dokładnie w takiej formie w jakiej podane są w instrukcji PRINT. Nazwa zmiennej powoduje wydrukowanie aktualnej zawartości (zarówno liczbowej jak i tekstowej). Podobnie nazwa funkcji powoduje wydrukowanie jej wartości. Znaki przystankowe służą zorganizowaniu formatu wydruku na ekranie. Przecinek oddziela kolejne drukowane elementy o 10 spacji. Średnik w przypadku wydruku liczbowego powoduje dodanie jednej spacji przed liczbą (która zawiera albo znak minus albo spację w jego miejscu). W przypadku wydruku tekstowego średnik nie dodaje żadnych spacji w wydruku. Oba znaki przystankowe mogą zostać użyte na końcu listy, co spowoduje, że następna instrukcja PRINT będzie działała jako kontynuacja bieżącej.

PRZYKŁADY: WYNIK:
10 PRINT „HELLO” HELLO
20 A$=”WY”:PRINT”HEJ”:A$ HEJ WY
30 A=4:B=2:PRINTA+B 6
40 J=41:PRINT J;:PRINT J-1 41 40
50 PRINT A;B;:D=A+B:PRINT D;A-B 4 2 6 2

Zobacz także instrukcje POS, SPC i TAB

PRINT# – Zapisz dane do zbioru.

PRINT# , [lista]
Po instrukcji PRINT# podaje się numer odnoszący się do kanału poprzednio otwartego. Następnie pisze się przecinek oraz listę elementów, które mają zostać wysłane do kanału wyjściowego. Na liście mogą znajdować się łańcuchy tekstowe, liczby, zmienne tekstowe i liczbowe. Przecinek i średnik działają w ten sam sposób jak w przypadku instrukcji PRINT.
Niektóre urządzenia mogą nie funkcjonować z funkcjami SPS i TAB.

PRZYKŁADY:
10 OPEN 4,4
20 PRINT#4,”HEJ WY”,A$,B$ – Wysyła informację „HEJ WY” i dwie zmienne tekstowe na drukarkę.

10 OPEN 1,8,2
20 PRINT#2,A,B$,C,D – Wysyła zmienne A,B$,C i D do zbioru dyskowego nr 2. UWAGA: Po poleceniu CMD instrukcja PRINT# powinna być używana samodzielnie przez zamknięciem zbioru w celu spowodowania odłączenia się urządzenia (na przykład zamknięcie kanału drukarki). Na przykład:

10 OPEN 4,4
20 CMD4
30 PRINT#4, „NAPISZ SŁOWA”
40 PRINT#4
50 CLOSE 4

READ – Czyta dane z instrukcji DATA i wprowadza je do pamięci zmiennych.

READ
Instrukcja ta powoduje wczytanie danych umieszczonych w instrukcji DATA i umieszczanie w pamięci zmiennych. Lista zmiennych może składać się z ciągów i liczb. Uważaj, aby nie wczytywać łańcuchów, kiedy instrukcja READ oczekuje liczb i na odwrót. Spowoduje to błąd: MISMATCH ERROR (konflikt typów).Dane w instrukcji DATA czytane są w sposób sekwencyjny. Każda instrukcja READ może wczytać jeden lub więcej elementów. Każda zmienna na liście READ wymaga elementu danych. Jeśli ich zabraknie, to pojawi się błąd END OF DATA ERROR (koniec danych). Zobacz też instrukcję DATA. W programie można powtórnie wczytywać te same dane, korzystając z instrukcji RESTORE, która ustawia wskaźnik instrukcji DATA na początek danych. Dzięki temu dane mogą zostać powtórnie wczytane. Zobacz polecenie RESTORE.

PRZYKŁADY:
10 READ A,B,C
20 DATA 3,4,5 – Wczytuje wartości trzech zmiennych numerycznych

10 READ A$,B$,C$
20 DATA JANEK,ADAM,KAROL – Wczytuje wartości trzech zmiennych tekstowych

10 READ A,B$,C
20 DATA 1200,ANNA,343 – Wczytuje (i wprowadza do pamięci komputera) liczbę, ciąg znaków i drugą liczbę.

REM – Oznacza komentarz lub uwagi umieszczone w treści programu.

REM
Instrukcja REM (REMark – uwaga, komentarz) służy każdemu, kto czyta treść programu. REM może wyjaśnić działanie fragmentów programu, dostarczyć informacji o autorze itp.. Polecenia REM nie mają wpływu na funkcjonowanie programu. Zajmują jednak miejsce w pamięci komputera. Nic, co znajduje się po prawej stronie instrukcji REM, nie jest interpretowane przez BASIC. (Uwaga. Polecenie LIST potraktuje jednak symbole graficzne umieszczone w REM jako skrótowe kody instrukcji). Dlatego też po instrukcji REM nie można wstawić żadnych instrukcji dla programu (nawet po dwukropku).

PRZYKŁAD:
10 NEXT X:REM TA LINIA ZAWIESZA X.
20 REM TO WSZYSTKO TO KOMENARZ:A=A=B:PRINT A

Polecenia Basic’a cz. 1

CLOSE – Zamknij zbiór logiczny.

close
Instrukcja ta zamyka zbiory użyte przez instrukcję OPEN. Liczba lub zmienna występująca po słowie CLOSE oznaczają numer zbioru, który ma być zamknięty. PRZYKŁAD:

Przykład:
close 2 – zbiór o numerze logicznym 2 zostaje zamknięty.

CLR – Wyczyść zmienne programowe.

clr
Instrukcja ta przywraca początkowy stan kanałom I/O (wejścia/wyjścia), opróżnia (ale nie zamyka) kanały I/O, zeruje wskaźnik instrukcji DATA oraz wskaźniki zmiennych, ale pozostawia program nietknięty. Polecenie to jest wykonywane automatycznie po użyciu RUN i NEW.

CMD – Wybiera nowe urządzenie dla dotychczasowego wyjścia ekranowego.

cmd
Polecenie to powoduje skierowanie danych wysyłanych normalnie na ekran (poleceniem PRINT, LIST itp. ale nie POKE) do wybranego urządzenia takiego jak drukarka lub zbiór dyskowy. Urządzenie lub zbiór musi najpierw zostać otwarte przy pomocy OPEN. Po literach CMD musi znajdować się liczba lub zmienna liczbowa odnosząca się do zbioru. Lista może być dowolnym ciągiem znaków alfanumerycznych lub zmienną łańcuchową; jest ona przesyłana do wybranego urządzenia. Polecenie to jest użyteczne np. do drukowania nagłówków nad listingami programów.

Przykład:
open 1,4 – otwiera urządzenie #4, czyli drukarkę
cmd 1 – całe normalne wyjście z komputera zostaje skierowane na drukarkę
list – listing programu zostaje przesłany na drukarkę, a nie na ekran – także słowo READY.
close 1 – zamyka zbiór.

CMD – Wybiera nowe urządzenie dla dotychczasowego wyjścia ekranowego.

cmd
Polecenie to powoduje skierowanie danych wysyłanych normalnie na ekran (poleceniem PRINT, LIST itp. ale nie POKE) do wybranego urządzenia takiego jak drukarka lub zbiór dyskowy. Urządzenie lub zbiór musi najpierw zostać otwarte przy pomocy OPEN. Po literach CMD musi znajdować się liczba lub zmienna liczbowa odnosząca się do zbioru. Lista może być dowolnym ciągiem znaków alfanumerycznych lub zmienną łańcuchową; jest ona przesyłana do wybranego urządzenia.
Polecenie to jest użyteczne np. do drukowania nagłówków nad listingami programów.

Przykład:
open 1,4 – otwiera urządzenie #4, czyli drukarkę
cmd 1 – całe normalne wyjście z komputera zostaje skierowane na drukarkę
list – listing programu zostaje przesłany na drukarkę, a nie na ekran – także słowo READY.
close 1 – zamyka zbiór.

DATA – Deklaruje wartości danych używanych przez program.

data
Instrukcja ta zawiera listę danych, które zostaną wprowadzone do pamięci komputera przy pomocy instrukcji READ. Składniki listy mogą być wartościami liczbowymi lub wyrażeniami tekstowymi i muszą być oddzielone przecinkami. Dane tekstowe nie muszą być umieszczane w cudzysłowiu, chyba że zawierają jeden z następujących znaków: spację, średnik lub przecinek. Jeśli pomiędzy dwoma przecinkami nie ma nic, to komputer przyjmuje w to miejsce wartość numeryczną zero lub ciąg pusty. Zobacz też definicję instrukcji RESTORE, która pozwala komputerowi na powtórne czytanie danych.

DATA 100,200,ALA,”HALLO, MAMO”,3,14,ABC123

DEF FN – Określa funkcję zdefiniowaną przez użytkownika.

def fn (zmienna) = wyrażenie
Instrukcja ta pozwala użytkownikowi na zdefiniowanie pewnej operacji arytmetycznej jako funkcji. W przypadku długich formuł, używanych często w programie użycie funkcji może oszczędzić naprawdę dużo cennego miejsca w pamięci. Nazwa nadawana funkcji rozpoczyna się od liter FN, po których znajduje się nazwa alfanumeryczna zaczynająca się od litery. Najpierw definiujemy funkcję używając instrukcji DEF z podaną nazwą funkcji. Po nazwie umieszczona jest para nawiasów () zawierająca dowolnie dobraną nazwę zmiennej (nazwa ta nie koliduje z nazwami nazw zmiennych używanych w programie). W poniższym przykładzie jest to X. Następnie umieszczony jest znak równości a za nim formuła podlegająca definiowaniu. Funkcja może być obliczona po zastąpieniu X-a dowolną wartością, korzystając z formatu podanego w linii 20 przykładu:

10 DEF FNA(X)=12*(34.75-X/.3)+X
20 PRINT FNA(7)

Liczba 7 zostanie wstawiona w każde miejsce, w którym definicji funkcji DEF występuje X. W tym przypadku rezultat brzmi: 144.

DIM – Deklaruje liczbę elementów w tablicy (wymiar tablicy).

dim (indeksy) <,zmienna (indeksy)>…
Przed pierwszym użyciem tablic zmiennych program musi zadeklarować ich rozmiary przy użyciu DIM (DIMension oznacza wymiar), chyba że używane tablice mają mieć wymiar mniejszy niż 11. Po instrukcji DIM podaje się nazwę tablicy będącą dowolną dopuszczalną nazwą zmiennej. Następnie podaje się w nawiasie liczbę elementów tablicy w każdym z jej wymiarów, ale należy mieć na względzie ilość pamięci zajmowanej przez tablice. Przy dużych tablicach może łatwo zabraknąć pamięci. A oto jak można obliczyć ilość pamięci niezbędną do przechowania tablicy:

5 bajtów na nazwę tablicy
2 bajty na każdy z wymiarów
2 bajty / element tablicy liczb całkowitych
5 bajtów / element tablicy liczb rzeczywistych
3 bajty / element dla zmiennych tekstowych
1 bajt dla każdego znaku w elemencie tekstowym tablicy

Tablice całkowite potrzebują 2/5 miejsca zajmowanego przez tablice zmiennoprzecinkowe (na przykład: DIM A% (100) wymaga 209 bajtów, a DIM A (100) wymaga już 512 bajtów). W instrukcji DIM można zdefiniować wymiary wielu tablic, oddzielając ich nazwy przecinkami. Jeśli program trafi na powtórną deklarację tablicy, to wyświetli komunikat „Re’dimed array error” (powtórna deklaracja tablicy). Do praktycznych zasad należy umieszczanie deklaracji na początku programu.

PRZYKŁAD:
10 DIM A$ (40), B7 (15), CC% (4,4,4)

Powoduje zdeklarowanie trzech tablic A$, B7 i CC%, które mają odpowiednio 41, 16 i 125 elementów.

END – Określa koniec programu.

end
Kiedy program natrafi na instrukcję END zatrzymuje wykonywanie PROGRAMU. Instrukcja CONT może być użyta w celu ponownego uruchomienia programu od instrukcji znajdującej się po END (jeśli taka istnieje). END nie jest instrukcją niezbędną do zatrzymania programu.

FOR/TO/STEP/NEXT – Określa strukturę pętli w programie.

for = ; TO ; NEXT
Instrukcja FOR…NEXT powoduje, że fragment programu zawarty pomiędzy tymi instrukcjami powtarzany jest wielokrotnie. Jest to użyteczne jeśli musimy coś zliczać, lub jakaś czynność musi być wykonana wielokrotnie (na przykład drukowanie). Instrukcja ta powoduje powtarzalne wykonywanie rozkazów zawartych pomiędzy FOR i NEXT w zależności od wartości początkowej i końcowej. Wartość początkowa i końcowa są to skrajne wartości zmiennej indeksowej pętli. Zmienna indeksowa jest zmniejszana lub zwiększana w trakcie kolejnych cykli pętli. Logiczne działanie pętli FOR/NEXT przedstawia się następująco. Najpierw zmienna indeksowa otrzymuje wartość początkową. Kiedy program osiąga linię programu zawierającą instrukcję NEXT, to dodaje on do zmiennej indeksowej wartość kroku (STEP, zwykle wynosi on 1), a następnie sprawdza, czy wartość zmiennej indeksowej nie jest większa od wartości końcowej. Jeśli zmienna indeksowa jest mniejsza bądź równa wartości końcowej, to program przeskakuje do instrukcji znajdującej się bezpośrednio po instrukcji FOR. Jeśli wartość indeksu jest większa nit wartość końcowa, to program przystępuje do wykonywania instrukcji znajdującej się bezpośrednio po poleceniu NEXT. Przeciwnie do powyższego dzieje się, jeśli krok pętli jest ujemny.

PRZYKŁAD:
10 FOR L=1 TO 10
20 PRINT L
30 N EXT L
40 PRINT „ZROBIONE! L = „L

Program ten wypisze liczby od 1 do 10, a za nimi komunikat ZROBIONE! L=11. Po wartości końcowej pętli w instrukcji moce się takie znajdować słowo STEP i dodatkowa wartość liczbowa. W tym przypadku, w chwili napotkania NEXT, do zmiennej indeksowej dodawana jest (zamiast jedynki) liczba znajdująca się po słowie STEP. Pozwala to na zliczanie ułamkami i przyrostami innymi niż jeden. Użytkownik moce zagnieżdżać pętle, tzn. umieszczać jedne w drugich. Należy pamiętać o tym, że pętla, która rozpoczyna się jako pierwsza musi kończyć się jako ostatnia. Polecenie NEXT bez podanej zmiennej oznacza koniec ostatnio otwartej pętli.

PRZYKŁAD:
10 FOR L=1 TO 100
20 FOR A=5 TO 11 STEP .5
30 NEXT A
40 NEXT L

Pętla FOR…NEXT w liniach 20 i 30 jest pętlą zagnieżdżoną wewnątrz pętli 10-40. Użycie kroku STEP równego 0.5 pokazuje, te indeksy zmiennoprzecinkowe są w pętli dopuszczalne. GET – Odczytaj jeden znak z klawiatury, nie czekając na wciśnięcie klawisza. GET lista zmiennych Instrukcja GET służy do pobierania pojedynczych znaków z klawiatury. W chwili napotkania GET, do pamięci przesyłany zostaje jeden wpisany na klawiaturze znak. Jeśli nie był wpisany żaden znak, to zwrócony zostanie łańcuch pusty, a program wykonywać się będzie dalej bez oczekiwania na wciskanie klawisza. Nie ma w tym przypadku potrzeby wciskania klawisza RETURN. Po słowie GET podana jest lista zmiennych numerycznych lub tekstowych. Jeśli instrukcja GET ma wczytać wartość liczbową, a zostanie wciśnięty klawisz inny nit liczbowy, to program zatrzyma się i pojawi się komunikat o błędzie. Instrukcja GET może być także umieszczona w pętli sprawdzającej zerowy rezultat jej wołania. Instrukcja GET moce być wykonywana tylko w programie, w przeciwnym razie pojawi się błąd ILLEGAL DIRECT ERROR (nielegalne użycie bezpośrednie).

PRZYKŁAD:
10 GETA$:IF A$< >”A” THEN 10 (Linia ta powoduje oczekiwanie na wciśnięcie A)
20 GET B,C,D (Pobiera zmienne liczbowe B,C,D nie czekając na przyciśnięcie klawiszy)

GET# – Pobierz dane wejściowe z urządzenia wejściowego.

get# ,
Instrukcja ta wprowadza po jednym znaku z uprzednio otwartego zbioru. W przypadku klawiatury działa ona tak samo jak GET. Instrukcja GET# mole być używana tylko w programie.

PRZYKŁAD:
10 GET#1,A$

W przykładzie tym pobrany zostaje jeden znak ze zbioru 1 i przypisany zmiennej A$. Zakładamy, te zbiór 1 został uprzednio otwarty. Zobacz instrukcję OPEN.

GOSUB – Zawołaj podprogram rozpoczynający się w podanej linii.

GOSUB
Instrukcja ta jest podobna do instrukcji GOTO, ponieważ nakazuje komputerowi skok do wybranej linii programu.

Polecenie GOSUB musi jednak natrafić w końcu na polecenie RETURN. Kiedy program trafi na RETURN, to skacze z powrotem do instrukcji znajdującej się bezpośrednio po instrukcji GOSUB. Miejsce docelowe skoku GOSUB nazywa się podprogramem. Podprogramy są bardzo użyteczne, jeśli jakieś zadanie powinno być powtórzone wielokrotnie w programie. Zamiast kopiowania fragmentów programu możemy wtedy napisać procedurę i użyć polecenia GOSUB we właściwych miejscach programu. Porównaj opis polecenia RETURN.

PRZYKŁAD:
20 GOSUB 800


800 PRINT”JESTEM TU”:RETURN

Przykład ten wywołuje podprogram zaczynający się w linii 800 i wykonuje go. Wszystkie podprogramy muszą kończyć się instrukcją RETURN.

GOTO – Przekazuje wykonywanie programu do wybranej linii programu.

GOTO
Po instrukcji GOTO napotkanej w programie komputer wykonuje instrukcję określoną przez numer linii w instrukcji GOTO. Użyta w trybie bezpośrednim powoduje uruchomienie programu począwszy od podanej linii programu, nie kasując jednak zmiennych kanałów dyskowych itp.

PRZYKŁAD:
10 PRlNT”COMMODORE”
20 GOTO 10

GOTO w linii 20 nakazuje komputerowi nieskończone powtarzanie linii 10, aż do naciśnięcia RUN/STOP.

GOTO 100 – Rozpoczyna program od linii o numerze 100, nie kasując obszaru pamięci zmiennych.

IF/THEN – Oblicza wyrażenie warunkowe i wykonuje dalszy program w zależności od uzyskanego rezultatu.

IF THEN
Instrukcja IF…THEN (JEŚLI…TO) wylicza wyrażenie w BASICu i podejmuje jedno z dwóch możliwych działań w zależności od wyniku wartości wyrażenia. Jeśli wyrażenie jest prawdziwe, to wykonywane jest zadanie umieszczone po słowie THEN. Jeśli wyrażenie jest fałszywe, to program podejmuje działanie od linii następującej bezpośrednio po linii zawierającej IF. Cała linia IF…THEN musi zawierać się w 80 znakach (dwie linie ekranowe). Instrukcja IF…THEN może przyjmować dwie dodatkowe formy:

IF THEN
lub:
IF GOTO

Obie te formy przekazują wykonywanie programu do wyszczególnionej linii programu, jeśli wyrażenie jest prawdziwe. W przeciwnym razie kontrola programu przekazywana jest do linii znajdującej się zaraz za instrukcją IF. Rozważ poniższy przykład:

50 IF X > 10 THEN PRINT „OK”

Linia ta sprawdza najpierw wartość X. Jeśli X jest większe od 10, to wykonywana jest instrukcja po THEN (PRINT „OK”), jeśli X jest mniejsze lub równe 10, to program wykona następną linię programu.

PRZYKŁAD:
10 IFX=10 THEN 100
20 PRINT „X NIE ROWNE 10”
99 STOP
100 PRINT „X ROWNE 10”

Program ten oblicza wartość X. Jeśli X jest równe. 10, to program skacze do linii 100 i drukuje informację X RÓWNE 10. Jeśli X jest różne od 10 to wykonuje linię 20 i pisze: X NIE RÓWNE 10. Następnie program staje.

INPUT – Pobiera ciąg znaków lub liczbę z klawiatury i oczekuje przyciśnięcia RETURN.

INPUT <„znaki zachęty”>,
Instrukcja INPUT (WPROWADŹ) prosi użytkownika o wprowadzenie danych do aktywnego programu i przypisuje wprowadzane dane zmiennym z listy. Po napotkaniu INPUT program zatrzymuje się, drukuje znak zapytania (?) na ekranie i oczekuje aż użytkownik wprowadzi dane i naciśnie RETURN. Po słowie INPUT następuje ciąg znaków zachęty oraz zmienna lub lista zmiennych oddzielonych przecinkami. Informacja umieszczona w zachęcie informuje użytkownika o informacjach jakie powinien wprowadzić. Jeśli zachęta jest podana w instrukcji, to musi być oddzielona średnikiem od listy zmiennych. Jeśli wprowadza się więcej niż jedną daną, to należy oddzielać je przecinkami. Jeśli wprowadzonych zostanie zbyt mało danych, to komputer prosi o resztę wyświetlając dwa znaki zapytania(??). Jeśli zamiast wprowadzania danych naciśnięty zostanie klawisz RETURN, to poprzednia wartość zmiennej nie ulegnie zmianie. Instrukcja INPUT może być używana tylko w programie.

PRZYKŁAD:
10 INPUT”WPISZ LICZBE”;A
20 INPUT „ORAZ SWOJE IMIE”;A$
30 INPUT A$ „,TY NAPISALES LICZBE”;A

Oxford is Basic cz. 2

Spotykamy się już po raz drugi z tym frapującym językiem programowania. Po opublikowaniu pierwszej części mego artykułu, otrzymałem i do dziś otrzymuje Wasze pytania z nim związane. Udzielając odpowiedzi listownie, wprawdzie rozwiązałem większość palących problemów – jednak pozostał pewien niedosyt.

Większość z was zwracała się do mnie z pytaniem: o przebieg procesu kompilacji własnych programów lub możliwości czy raczej ograniczeń jakie posiada ten język programowania. Nie zawracając kijem Wisły postaram się naświetlić kilka kwestii z nim związanych tj. z Oxford Pascal’em.

 

KOMPILACJA WŁASNYCH PROGRAMÓW

Wbrew pozorom nie jest to walka z wiatrakami… Wystarczy zmienić tylko tok myślenia. Niestety kompilator był pisany przez ludzi, dla których zawiłości obsługi C-64 były obce. Pisali oni ten program jakby pod siebie i co jest z tym związane, reszta użytkowników zawsze miała z nim pewne problemy. Na początek należy wspomnieć, iż istnieją dwie wersje tego świetnego kompilatora :
– dla posiadaczy magnetofonów
– oraz posiadaczy stacji dysków (tylko tą będziemy się tu zajmować)

Różnica pomiędzy nimi jest dość istotna. Ci pierwsi dostali do swych rąk dobre narzędzie programistyczne, jednak z pewnymi ograniczeniami w jego użytkowaniu. Drudzy mając tzw. Full wersję nie umieli jej do końca wykorzystać… Koło się zamknęło. Poza tym wersja dyskowa jest dużą rzadkością pośród użytkowników Commodore 64. Niestety, winę ponosi za to mizerna jakość naszych „pirackich dystrybutorów”, wśród których królował skopany dysk z tym programem.

Obecnie dzięki ożywieniu na scenie emulacji Commodore 64, pojawia się przed wami możliwość pobrania tego kompilatora w pełnej nieuszkodzonej wersji – plik Oxford Pascal.zip oraz dodatek do niego plik: Polgraph.zip (szczegóły w dalszej części artykułu). Niech nie zrazi Was, język w jakim napisano przykładowe programy tj. niemiecki. Gdyż moja kopia jest „przemycona” z tego kraju i poza tymi drobnymi niedogodnościami jest w pełni sprawna i funkcjonalna. Teraz wyłożę jeszcze kilka zasad, których przestrzeganie pozwoli uchronić was przed niepotrzebnym stresem i rozczarowaniami :

– do pracy wymagane jest posiadanie dwóch dyskietek – to znaczy mam tu na myśli jednej z samym programem kompilatora i drugiej z naszym programem w pascalu.

– program wymaga aby dyskietki były odbezpieczone przed zapisem (dotyczy to w szczególności dysku z naszym programem).

– w trakcie obecności kompilatora w pamięci, nie mogą być obecne żadne moduły rozszerzające np. Action Replay. Przed załadowaniem programu Oxford Pascal, należy je zdeaktywować (sprawdź w instrukcji twego modułu).

– praca ze stacją dysków odbywa się w Normalu (standardowo nie obsługuje żadnych dopalaczy typu Burst itp.) i TYLKO z urządzeniem numer 8 (pierwsza stacja dysków).

– jakikolwiek błąd dyskowy przerywa kompilację – należy więc sprawdzić nośnik, przed jego użyciem np. programem Dist Tester, lub innym o podobnych możliwościach.

Przebieg procesu kompilacji możemy w skrócie zobrazować jak poniżej (są to tylko moje sugestie, bo wszystko zależy od Was):

Powiększ 1. Piszemy własny program.
2. Kompilujemy go w trybie edycji – polecenie R lub L.
3. Nagrywamy na dysk – polecenie PUT:nasz_program.
4. Uruchamiamy tryb dyskowy – komenda DISK (załaduje się kompilator – po wydaniu tej komendy w stacji MUSI znajdować się dysk z kompilatorem).
5. Kompilujemy nasz pozbawiony błędów program – polecenie COMP nasz_program.
6. Kompilator zażąda od nas włożenia dysku z naszym programem i dokona jego kompilacji do zbioru wynikowego (ten z końcówką .OBJ).
7. Konsolidacja do zbioru wykonywalnego EXE (z końcówką .PRG) – za pomocą polecenia LOCATE:program=nasz_program.

PowiększNie muszę chyba dodawać, że w miejsce „nasz_program” itp. Wstawiamy właściwe nazwy plików z napisanym przez nas programem. Przyjrzyjcie się też zdjęciom dołączonym do artykułu.

STRUKTURA PROGRAMU W JĘZYKU PASCAL

Niestety temat ten jest tylko zasygnalizowany, ale w niedalekiej przyszłości zajmiemy się i samym programowaniem w Pascal’u. Wykorzystamy wszystką zdobytą do tej pory wiedzę do napisania aplikacji w tym języku – to już wkrótce… Piszcie jeżeli ten temat Was zainteresował – być może poruszymy zagadnienie programowania w Pascalu na PC, pod kątem wykorzystania tego na C-64 (w Delphi rzecz jasna – bo nie będziemy pisać pod Dos’em 🙂

Program w Pascalu składa się z kilku stałych elementów, i tak możemy w nim wyróżnić (przeanalizuj przykładowe programy na dysku z kompilatorem):

– nagłówek programu
– deklaracje etykiet
– deklaracje typów
– deklaracje stałych
– deklaracje zmiennych
– deklaracje procedur i funkcji
– blok wykonywalny pomiędzy instrukcjami Begin… End.

DODATKI: PAKIET POLGRAPH

W osobnym pliku znajduje się pakiet procedur graficznych POLGRAPH autorstwa Mariusza Ferdyna. Ów dodatek ukazał się drukiem w miesięczniku Bajtek 12/92r. Zamieszczona wersja pochodzi z tego artykułu i jest udostępniona przez jednego z naszych czytelników – któremu zgodnie z obietnicą serdecznie dziękuje za jej udostępnienie w wersji plikowej.

PowiększNa dysku z kompilatorem, dodatkowo zamieściłem program SEQ-VIEWER do podglądania zawartości plików SEQ (uruchamiamy program i klawiszem F5 – dla Action Replay przeglądamy pliki SEQ – trzymając spację).

Pakiet procedur POLGRAPH należy włączyć do swojego programu w części deklaracji procedur – po szczegóły odsyłam do zamieszczonego przykładu z pliku demonstracyjnego.

Poniżej przedstawię opis procedur wchodzących w skład pakietu:

PM(mem, a1, a2, a3, a4, a5, a6)
Procedura ta wpisuje 6 bajtów w określony obszar pamięci – jest wykorzystywana przez procedurę INIT.
Mem – obszar, w który wstawia się 6 kolejnych bajtów
a1,a2… – wartości sześciu kolejnych bajtów

INIT
Procedura ta przepisuje kod maszynowy procedury PLOT2 mieszczący się w pamięci w obszarze $CC00-$CC84. Przed wykorzystaniem innych procedur z pakietu POLGRAPH należy wcześniej bezwzględnie przywołać tą procedurę.

PLOT2(x, y, pflag)
Procedura w zależności od zmiennej PFLAG, gasi lub zapala punkt w grafice wysokiej rozdzielczości.
x – współrzędna pozioma z zakresu 0 – 319
y – współrzędna pionowa z zakresu 0 – 199
pflag = 1 zapala punkt, = 0 gasi punkt

HIRES2(a, b)
Procedura włącza i czyści ekran grafiki wysokiej rozdzielczości.
a – kolor podkładu (background)
b – kolor atramentu (pen)

LINE(x1, y1, x2, y2, pflag)
Procedura kreśli lub wymazuje linie na ekranie wysokiej rozdzielczości.
x1, y1 – współrzędne punktu początkowego
x2, y2 – współrzędne punktu końcowego
pflag =1 kreśli, = 0 wymazuje

CIRCLE(x0, y0, r ,pflag)
Procedura kreśli lub wymazuje okrąg.
x0, y0 – współrzędne środka okręgu
pflag =1 kreśli, = 0 wymazuje

BOX(x0, y0, x1, y1, pflag)
Procedura wymazuje lub rysuje prostokąt.
x0, y0 – współrzędne górnego lewego rogu
x1, y1 – współrzędne dolnego prawego rogu
pflag =1 kreśli, = 0 wymazuje

Niestety Oxford Pascal nie pozwala na tworzenie własnych procedur bibliotecznych, tak więc przy wykorzystaniu procedur z zamieszczonego pakietu w swoich programach należy włączyć ten pakiet do kodu źródłowego własnego programu.

Oxford is Basic cz. 1

Oxford Pascal nie jest programem najnowszym, ale bardzo popularnym. Niestety posiada pewne wady jak np. brak wbudowanej ‚pomocy’, czy konieczność numerowania linii programu – choć tylko ze względów czysto pomocniczych. Nie mniej można w nim pracować korzystając z dwóch trybów:

– kompilator znajduje się cały czas w pamięci (uwalnia nas to od żonglowania dyskietkami)
– kompilator jest dogrywany z dysku (nie limituje to długości edytowanego programu)

W pierwszym przypadku sam proces kompilacji jest naprawdę szybki, choć sam program musi zmieścić się w okrojonej pamięci. Natomiast gdy pracujemy w drugim trybie (dyskowym), zyskujemy cenne miejsce kosztem szybkości – ale gra jest warta świeczki 🙂 gdyż możliwość edytowania całego programu jest nam czasami niezbędna.

Tyle tytułem wstępu, pora abyśmy przyjrzeli się temu co oferuje nam Oxford Pascal. Jak już wspomniałem na wstępie, oferuje dwa tryby pracy. Długość programu zależy od trybu i może wahać się nawet od kilkudziesięciu do 6 tysięcy linii kodu! Co to oznacza nie sposób nawet powiedzieć w paru zdaniach – jednym słowem COOL 🙂 Pracując w trybie dyskowym (kompilator jest dogrywany) dostajemy do rąk potężne narzędzie programistyczne, gdyż dzięki dogrywaniu (linkowaniu) możemy kompilować BIBLIOTEKI! Wystarczy umieścić deklarację #nazwa i kompilator dołączy do programu głównego dodatkowe moduły. Możemy tworzyć zbiory „wykonywalne” i wiele innych rzeczy… Mówiąc szczerze to jak dla mnie „starego” c64maniaca – anyway stąd moja xyvka, ten Pascal to 8 cud świata. Wracając jednak do tematu, słowa kluczowe pokrywają się ze standardem w 100% i są wzbogacone o szereg nowych właściwości. Nazwy zmiennych są ograniczone niestety do zaledwie 8 znaków, ale za to rodem z assemblera dostajemy „podkreślanie” czyli c= + @, które zastępuje spacje. Nie ma znaczenia też czy użyjemy dużych lub małych liter, gdyż kompilator ich nie rozróżnia.

W odróżnieniu od standardu, tu musimy numerować linie. Jednak nie ma to znaczenia dla kompilatora – ta numeracja ma nam tylko ułatwić listowanie i poprawianie „odpluskwianie” programu. Pracując pod kontrolą edytora zyskujemy poniższe komendy:

AUTO numer-_linii
Uruchamia lub zatrzymuje automatyczną numerację wpisywanych linii programu.

LIST lub LIST numer_linii
Znaczenie oraz użycie, analogicznie jak dla interpretera Basica. Wciśnięcie dowolnego klawisza wstrzyma proces listowania do momentu wciśnięcia kolejnego.

UPPER i LOWER
Odpowiednio „podnosi” i „opuszcza” jak klawisz shift podczas pisania, wysokość wszystkich znaków na ekranie.

BASIC
Opuszczenie programu i powrót do Basica.

NEW
Kasuje program z pamięci edytora.

DISK
Uruchamia tryb dyskowy.

RESIDENT
Powoduje przejście do trybu pierwszego – czyli załadowanie do pamięci KOMPILATORA.

NUMBER pierwsza_linia , ostatnia_linia , skok
Przenumerowuje linie programu.

FIND „słowo” lub FIND „słowo” , pierwsza_linia – ostatnia_linia
Znajduje i wyświetla poszukiwany łańcuch znaków w treści programu.

CHANGE „stare_słowo / nowe_słowo” , numer_linii (NIEPRZETESTOWANE!)
Zastąpi pierwszy ciąg znaków drugim (działa podobnie do find), parametr numeru jest opcjonalny.

DELETE lub DELETE pierwsza_linia – ostatnia_linia
Kasuje linie programu z pamięci, w pierwszym przypadku działa jak NEW.

PUT:nazwa
Zapisuje na dysku aktualnie edytowany program (Uwaga po komendzie jak i po dwukropku nie może być spacji!).

GET:nazwa
Wczytuje z dysku do pamięci program o podanej nazwie (stary zostanie skasowany).

RUN lub R
Tylko podczas pracy w pierwszym trybie! Kompiluje do pamięci i uruchamia aktualnie wpisany lub wgrany program. Nie może on zawierać błędów, gdyż proces kompilacji zostanie wstrzymany stosownym komunikatem o błędzie.

L
Podobnie jak R, tylko z tą różnicą że program nie zostanie uruchomiony a jedynie wystowany podczas kompilacji na ekran.

P
J/w lecz z wydrukiem na drukarce.

COMP parametr
Tylko tryb dyskowy. Spowoduje kompilacje programu zapisanego wcześniej na dysku. Jako pierwszy wkładamy dysk z kompilatorem! Parametr może przybrać postać:
1 – wyświetlenie treści programu i błędów na ekranie
p – j/w lecz na drukarce
n – kompilacja bez tworzenia zbioru wynikowego (z końcówką .OBJ)
c – kompilacja z optymalizacją kodu wynikowego

EX nazwa
Tylko tryb dyskowy. Powoduje wczytanie i uruchomienie zbioru z końcówką .OBJ (czyli po kompilacji). Jako pierwszy wkładamy dysk systemowy.

HEX liczba_dziesiętna
Poda jej odpowiednik w systemie szesnastkowym (słowo).

DECIMAL liczba_szesnastkowa
Poda jej odpowiednik w systemie dziesiętnym (nie stawiamy $ przed liczbą!)

DUMP
Wydruk treści programu na drukarce.

COLD
Zimny start komputera.

LINK:nazwa1,nazwa2…
Złącza ze sobą programy już skompilowane (te z końcówką .OBJ). Użyte zmienne muszą być globalne oraz zakłada się, że pierwszy program jest docelowym.

Dołączanie programu do kompilacji w treści programu, uzyskamy za pomocą komendy #nazwa Co oznacza, że w momencie napotkania tej instrukcji kompilator dogra potrzebne dane i skompiluje je jako całość.

LOCATE:wynik=nazwa_programu
Spowoduje utworzenie programu wykonywalnego z programu skompilowanego (z końcówką .OBJ). Nazwa – oznacza program w Pascalu, a wynik – nazwę dla programu wykonywalnego.

CHAIN nazwa_programu
Spowoduje wstrzymanie wykonywania programu i załadowanie oraz uruchomienie podanego programu.

Dodatkowo pracując w trybie bezpośrednim (edycyjnym) możemy wspierać się następującymi instrukcjami języka Basic: PRINT, OPEN, CLOSE, CMD, POKE, PEEK, SYS, FOR TO STEP, LET, LOAD, FRE 0 oraz zmienne zegara TI i TI$.

W Oxford Pascalu dodano kilka dodatkowych usprawnień (rozszerzeń) i tak: dopuszcza się deklaracje liczb 16-wych poprzedzając je znakiem $ (dolara) np. CONST LICZBA:=$FCE2
Oraz funkcje:

PEEK (X:INTEGER) :0..255 analogicznie do PEEK czyli D:=PEEK(1024)

POKE (X:INTEGER ; Y:0..255) analogicznie do POKE np. POKE ($2E00,$4C)

VDU (X,Y:INTEGER ; C:CHAR) wyświetli w zadanych współrzędnych x/y (dla ekranu tekstowego) znaku np. VDU (5,12,’A’)

GETKEY:CHAR czyta klawiaturę, np. GETKEY=CHR (0) czeka na wciśnięcie dowolnego klawisza.

PAGE czyści ekran

RESTORE (TRUE) lub RESTORE (FALSE) / (NIEPRZETESTOWANE!)
Powoduje odpowiednio włączenie i wyłączenie klawisza RESTORE.

RENDOM:0..255 / (NIEPRZETESTOWANE!)
Spowoduje wygenerowanie liczby pseudolosowej z zakresu 0..255

SETTIME (GG,MM,SS)
Ustawia wewnętrzny zegar na dany czas (zmienna TI$).

INSTRUKCJE MUZYCZNE

ENVEL V,A,D,S,R
Ustawia dane dla obwiedni danego kanału SID, gdzie:
V – numer kanału 1-3
A – narastanie 0-15
D – zanikanie 0-15
S – wybrzmienie 0-15
R – opadanie 0-15

VOICE V,F,W,D
Odgrywa dźwięk zadeklarowany wcześniej przez ENVEL, gdzie:
V – numer kanału 1-3
F – częstotliwość 0-65535 (bazowe f=0.059604645 razy wartość)
W – typ obwiedni 0-3 (trójkąt, piła, prostokąt, szum)
D – czas trwania 0-65535

VOLUME (x)
Wzmocnienie dźwięku 0-15.

INSTRUKCJE GRAFICZNE W TRYBIE TEKSTOWYM

BORDER (c)
Ustala kolor ramki.

SCREEN (c)
Ustala kolor ekranu.

PEN (c)
Ustala kolor dla tekstu.

INSTRUKCJE GRAFICZNE W TRYBIE GRAFICZNYM

PAPER (c)
Ustala kolor tła.

INK (c)
Ustala kolor rysowania.

HIRES 1 lub HIRES 0
Włącza lub wyłącza tryb grafiki wysokiej rozdzielczości.

P:=EXAMINE (X,Y)
Testuje czy punkt jest zapalony P=1, czy zgaszony P=0.

PLOT (TRYB,X,Y,X1,Y1)
Stawia punkt (kreśli linię) o zadanych współrzędnych w zadanym trybie i tak:
0 – to tryb kasowania
1 – skasowanie ekranu graficznego
2 – rysowana jest linia
3 – kasowana jest linia
4 – wypełniany jest obszar wokół punktu
5 – kasowany jest obszar wokół punktu

WINDOW (numer_linii)
Dzieli ekran na tryb graficzny i tekstowy od zadanej wysokości (25 to cały ekran).

KILL
W trybie edytora jest równoważna instrukcji HIRES 0 w programie.

Uwaga: wszystkie wymienione wartości są liczbami stałymi. Odpowiednio X 0..255 i Y 0..200 oraz C 0..15.

MANIPULACJA BITAMI

Zaimplementowano znane z innych języków instrukcje logiczne, działające na 16-bitowych słowach ANDB, ORB, XORB, NOTB. Dodatkowo otrzymujemy przesunięcia logiczne:

SHL (X,Y)
Przesunięcie bitów X o Y pozycji w lewo np. SHL (4,4) = 40

SHR (X,Y)
J/w lecz w prawo. Podanie SHL (X,-Y) jest równoznaczne z instrukcją SHR (X,Y).

Robbo – jak to działa?

Czy pamiętasz może z C64 taką grę, jak Robbo? Nie? Nie?! Robbo to świetna (jedna z najlepszych) gier logiczno – zręcznościowych, z niesamowitą muzyką i niezłą oprawą graficzną! Grę wydało L.K Avalon w 1993 roku, a autorem jest Sebastian Nowak. Pomysł nie był jednak niczym nowym – istniała wersja tej gry na ATARI (nawiasem pisząc, jest ona lepsza niż wersja C64, ale nie o tym…). Gra składa się z 76 plansz. Poruszamy się małym robocikiem, którego zadaniem jest zebranie odpowiedniej liczby śrubek a następnie przedostanie się do wehikułu. Przeszkadzają mu w tym różne stwory, lasery, itd… No, ale nie ma sensu się rozpisywać, najlepiej samemu to zobaczyć – gra Robbo jest tutaj!

Gramy!
Uruchom Robbo. Na samym początku znajdziesz opis, mówiący na czym gra polega. Obowiązkowo trzeba przejść kilka plansz! Już? No dobrze, poczekam jeszcze chwilkę… 🙂 Ogólnie rzecz biorąc, plansze w Robbo wersji Commodore są trudniejsze niż te z Atari. Może zdarzyć się tak, że w końcu zabraknie nam „żyć” albo naboi, nie będziemy mogli poradzić sobie z przejściem jakiejś planszy. Co zrobić, jeżeli utkniemy gdzieś w grze? Mówi się, że prawdziwy gracz nie oszukuje, nie używa kodów ani cheatów. Ale jeżeli tak w celach naukowo-dydaktycznych…? 🙂

Jak żyć wiecznie?
…albo strzelać w nieskończoność? 🙂 Opiszę tu mój sposób na sprawienie, aby w Robbo mieć dowolną ilość „żyć” albo naboi. Idea jest następująca: w emulatorze Vice mamy możliwość zapisania całej pamięci. Zapisujemy więc stan pamięci na samym początku pierwszej planszy (np. w pliku first.txt). Zbieramy nabój. Mamy więc 8 żyć i 9 naboi, zgoda? Teraz tracimy życie (można np. strzelić w bombę – najlepeij wymyśl swój własny sposób na stracenie jednego ludzika 🙂 Mamy już tylko 7 żyć. Zbierz nabój i wystrzel jeden. Mamy więc 7 żyć i 8 naboi. Teraz zrób zapis całej pamięci (np. w pliku second.txt). Wykorzystując dowolny program potrafiący porównywać dwa pliki, szukamy miejsca, w którym się różnią – takich miejsc będzie wiele, ale nas interesują tylko te, gdzie znajdują się informacje o ilości żyć i naboi.

Po kolei: zrób dwa wyżej wymienione pliki (Alt-M wchodzisz do monitora a potem komenda save „first.txt” 0 FFFF zapisujesz całą pamięć do pliku) Teraz porównujemy pliki – ja korzystałem z programiku Compare Files. Programik jest pod DOS, wiec w trybie MS-DOS przechodzimy do katalogu, gdzie jest program oraz nasze zapisy pamięci i wpisujemy: cmpfiles first.txt second.txt. Miejsca, w których pliki się różnią, są podświetlone. Przeglądamy je po kolei. Mamy szczęście – już na samym początku znajdujemy miejsca, o które nam chodzi! Ilustruje to poniższy rysunek:

 

Jak widać, informacja o ilości żyć jest przechowywana w komórce pamięci $A6, ilość naboi w $A5. Prawie. Ze względu na sposób zapisu pamięci do pliku w VICE od tych adresów należy odjąć $02. Czyli ilość żyć jest zapisana w $A4, ilość naboi w $A3. Podczas gry możesz wprowadzić tam dowolne wartości rozkazem monitora, np. >A4 02 (czyli dwa życia). Wprowadzone wartości nie wyświetlają się od razu na ekranie – w naszym przykładzie nowa ilość żyć pojawi się dopiero po straceniu jednego, ale cały czas jest „widziana” przez grę.

Uwaga! W tym rejonie pamięci znajdują się też inne ciekawe informacje np. komórka $A7 zawiera informację o ilości śrubek, którą należy zebrać!

Jak szybko możesz przejść planszę?
Czasem plansza jest bardzo trudna, prawie nie do przejścia. Brakuje Ci tylko jednej śrubki, ale nie można się do niej dostać. Co robić? Mój pomysł: zmienić ilość koniecznych do zebrania  śrubek na zero i gnać do wehikułu 🙂 Wystarczy komenda >$A7 00 (patrz wyżej). To najlepszy sposób, aby opuścić planszę bez zbierania śrubek.

A co jeśli nie można dojść do wehikułu? Proste – trzeba sprawić, żeby wehikuł przyszedł do nas! 🙂 Poniższy tekst jest właśnie o tym, jak edytować planszę w grze Robbo. Będąc w monitorze przejrzyj (m 800) pamięć od adresu $800 i dalej. Co widać? Dużo siódemek ($37) zer, i parę innych znaków w kolejnych obszarach pamięci. Jak dla mnie to dane o każdej planszy (o ich wyglądzie, jakie przedmioty się na nich znajdują) Siódemki to nic innego jak ściany, zera to wolne miejsca. Ze względu na sposób wyświetlania danych w Vice nie wygląda to na planszę (VICE wyświetla 12 znaków w rzędzie, a plansza ma 16 znaków w rzędzie) ale nią jest. Zobacz to:

plansza wyświetlana
w VICE (12×43)

rzeczywisty wygląd
planszy (16×32)

777777777777
77777…….
..&….77..6
……&..9.7
7…..(…&&
&&&77…….
…….77<..
………..7
777777:77777
77777…….
7……77…
….7.(….7
7…….7…
…77….;..
7…>..77…
….7……7
7…….7…
…77…….
.&77777777&7
7777777….7
7….&..&…
7..77&…&.&
….7..77777
777777777.>7
7……7….
…77.9….7
…….77…
$..7..;….7
7……7….
…77……7
…….77!!!
!!!7…….7
7……7….
…77…..77
7……77…
..7(7……7
7…..7:7…
…77.(…..
…….77…
………..7
7………..
;..777777777
77777777

7777777777777777
7………&….7
7..6……&..9.7
7…..(…&&&&&7
7…………..7
7<………….7
777777:777777777
7…….7……7
7…….7.(….7
7…….7……7
7….;..7…>..7
7…….7……7
7…….7……7
7……..&777777
77&77777777….7
7….&..&…7..7
7&…&.&….7..7
7777777777777.>7
7……7…….7
7.9….7…….7
7…$..7..;….7
7……7…….7
7……7…….7
7!!!!!!7…….7
7……7…….7
7…..777……7
7…..7(7……7
7…..7:7……7
7.(…………7
7…………..7
7………..;..7
7777777777777777

Plansze (wszystkie 76) znajdują się kolejno w blokach po $200 komórek począwszy od $900. Jeśli zmienisz te obszary, to zmienisz inne plansze, ale nie tą aktualnie wyświetlaną na ekranie. Dlaczego? Plansza, w którą aktualnie grasz znajduje się w pamięci od $C000. Przy przejściu na kolejny poziom odpowiednia plansza jest ładowana z pamięci właśnie w ten obszar. Zmiany tutaj będą widoczne również na ekranie. Skąd wiadomo, jakie wartości wstawiać? Obserwacja. Zobacz na pierwszej planszy (lub innej) jakim rzeczom na ekranie odpowiadają jakie kody. Przykład: $3B to bomba, $3D klucz, $3C naboje… i jak już wcześniej było widać $37 to ściana.

To jak szybko przejść planszę? Ustaw ilość śrubek na zero (patrz wyżej) i umieść wehikuł obok robocika.  Wehikuł umieścimy na pierwszej planszy w drugim rzędzie i trzeciej kolumnie rozkazem >C012 24. Drugi rząd, czyli $C000 + $10 (bo każdy rząd dzieli się na 16 kolumn; $10 = 16) + $02 (trzecia kolumna, bo $C010 to 1 kolumna drugiego rzędu) = $C012; $24 to kod wehikułu. Uff… gotowe 🙂  I to właściwie podstawowe niezbędne informacje na temat manipulowania planszą. Zachęcam do samodzielnego próbowania.

Podsumowanie.
Wiesz już jak regulować ilość żyć i naboi, wiesz jak edytować plansze w grze Robbo. Nic nie stoi na przeszkodzie, abyś stworzył swoje planety dla robocika! Niestety, ręczne edytowanie pamięci jest bardzo żmudne. Znając sposób konstrukcji planszy możesz ją edytować chociażby w Notatniku (ale nie do końca). Jeśli ktoś jest zainteresowany tą naprawdę świetną grą – proszę o kontakt. Powstaje właśnie wersja Robbo dla Windows ulepszony pod względem grafiki oraz edytor/konwerter do plansz z C64.

Ciekawostka.
Przeglądając pamięć w $B700 natrafiamy na tekst: „NO I CZEGO TUTAJ SZUKASZ??????? I TAK NIC NIE ZNAJDZIESZ !!!!!!„. Myślę, że powyższy tekst pokazał, że jednak coś można w pamięci znaleźć… i zmienić!

Komendy monitora.
> [adres] [wartość] – wstawia do komórki pamięci o podanym adresie daną wartość
m [adres] – wyświetla zawartość pamięci począwszy od komórki o danym adresie

Ripowanie i odgrywanie SIDów

Na początek troszkę podstawowych informacji. Sidek prawie zawsze zbudowany jest tak, że ma w sobie już „wbudowaną” procedurę odgrywającą. Naszym zadaniem jest tylko odpowiednie jej zainicjowanie i „podsycanie” :). Najpierw może parę słów o „ramce”, bo jest to najważniejsza sprawa i czesto niezrozumiała.

C64 tworzy grafikę rysując linie od lewego górnego rogu do prawego dolnego – czemu o tym mówię? Bo możemy sobie to w bardzo prosty sposób sprawdzić i użyć jako bardzo dokładnego „zegara”. Służy do tego rejestr $d012, w którym znajdziemy numer aktualnie rysowanej linii. Łatwo możemy sprawdzić, o czym mówię: W Turbo Assemblerze wpisujemy coś takiego:

            *=$1000
lda #$60
Loop1 Cmp $d012
Bne Loop1
Inc $d021
Lda #$80
Loop2 Cmp $d012
Bne Loop2
Jmp $1000

To bardzo prosty programik, który czeka na linię $60 (szesnastkowo!), po czym zmienia kolor ramki, czeka na linię $80 i przywraca kolor ramki. Ten przykładzik pokazuje nam wizualnie, czym jest „ramka”. A do czego nam to potrzebne? Aby odegrać naszą muzyczkę, potrzebujemy wywołać funkcję „play” 1 raz w ciągu całej ramki. Pomijam tu muzyczki robione kilka razy na ramkę, ale to temat na następny artykuł. A więc wygląda to mniej więcej tak:

                --------
Lda #$60
Loop1 Cmp $d012
Bne loop1
Jsr play
--------

To malutki wycinek kodu odgrywającego naszą muzykę. Jak widzimy, czekamy na ramkę $60, a następnie skaczemy do play. Jeśli umieścimy to w pętli – nasz programik będzie skakał sobie za każdym razem, gdy rysowana będzie linia $60 do procedury play. OK, to tyle o ramkach. Temat będę kontynuował w innych artykułach, o ile będzie zainteresowanie.

Ripowanie SID-ów jest tematem obszernym jak morze, ale postaram się Wam go przybliżyć i napisać tak, by każdy z Was był w stanie „wyrypać” i odegrać prostego sid-a.

Najważniejszą sprawą jest zlokalizowanie muzyczki. Nie jest to zadanie łatwe, ponieważ nie ma jakiegoś standardu ulokowania sid-a. Niektórzy powiedzą: „przecież muzyczki są pod $1000”, zgodzę się, ale nie zawsze tak bywa. Często trzeba będzie przekopać całą pamięć, a szczególnie, kiedy szukamy muzyczki w grach. Dodać muszę, że umiejętność zlokalizowania muzyki przychodzi z doświadczeniem, czasem patrząc na rzędy znaczków, używając monitora w trybie ASCII, wiemy że ten właśnie ekran to część zaka. Może wyda się to teraz niezrozumiałe, ale sami zobaczycie – z czasem intuicyjnie znajdziecie to, czego szukacie. Przeszukując pamięć w trybie ASCII napotkamy rząd znaków, które wygladają mniej więcej tak:

	/258;?CGKOTY^djpw

Wiem, że może wydać się to dziwne, ale zawsze, gdy występuje taki lub podobny ciąg znaków, mamy do czynienia z muzyką. Pamiętam, że zawsze szukałem tego magicznego CGKOTY :). Te nowoczesne muzyczki zaczynają się przeważnie od pełnych adresów, np. $1000, $8000 itp., więc jeśli napotkamy ciąg znaków „CGKOTY” np. pod adresem $1600, możemy być na 80% procent pewni, że sid-ek jest pod $1000. Przejdźmy do odgrywania muzyki. Aby odegrać sid-ka, nie trzeba być mistrzem w programowaniu, ale należy znać chociaż podstawy. Aby nasz sid grał, należy go najpierw zainicjować, robi się to przy pomocy instrukcji lda i jsr. Wytłumaczę na przykładzie:

Muzyczkę mamy pod adresem $1000, więc prawdopodobnie procedura „init” będzie właśnie pod adresem $1000. Jeśli mamy tylko 1 subsong, sprawa jest prosta. Ładujemy do akumulatora wartość #$00 i skaczemy do adresu $1000. W przykładzie wygląda to tak:

    sei        ;włączenie przerwań.
lda #$00 ;załadowanie 0 do akumulatora
jsr $1000 ;skok do init

Po czymś takim mamy przygotowany układ SID do odgrywania muzyki. Zapytacie – czemu #$00? Więc jeśli w muzyczce mamy kilka subsongów, np. jest to parę muzyczek z gry, wartość #$00 ustawia nam pierwszą muzyczke, wartość #$01 drugą, itd. Jesteśmy już przygotowani do odegrania, czas na odtworzenie. A więc gramy:

gramy:   lda #$60  ;linia na ekranie
ramka: cmp $d012 ;porównanie, czy
właśnie ta linia wyświetlona?
bne ramka ;jeśli nie, sprawdzamy dalej
jsr $1003 ;play
jmp gramy

To najprostsza z możliwych procedura odgrywająca. Zapytacie czemu $1003? I tu zaczynają się schody. Jest tyle różnych formatów muzycznych i każdy z nich ma inaczej ulokowaną procedurę play. Lecz tu nie musimy dużo szukać, ponieważ nie mamy zbyt dużego wyboru w przypadku muzyczki spod adresu $1000. Mamy kilka możliwości, pamiętać należy, że muzyczka w assemblerze wygląda tak:

$1000  jsr $1xxx  ;init
$1003 jsr $1xxx ;tu może byc play
$1006 jsr $1xxx ;a może jednak tu?
$1009 jsr $1xxx ;chyba nie tutaj, ale kto wie?
rts ;lub coś w tym stylu :-)

Jak widzimy, nie ma dużego pola manewru. Trzeba próbować, któryś z „jsr-ów” będzie na pewno dobry, a wtedy usłyszymy naszą piękną muzyczkę. Życzę udanych eksperymentów.

Ciekawe zastosowanie przerwań NMI

Komputer Commodore 64 wyposażony jest w dwa porty wejścia/wyjścia oznaczone CIA1 i CIA2. Są to dwa identyczne układy. Linia przerwań CIA1 podpięta jest do linii IRQ procesora, a linia przerwań CIA2 dołączona jest do linii NMI. Przerwanie NMI (niemaskowalne) ma wyższy priorytet od IRQ. Żądanie przerwania NMI zostanie zawsze wykonane. Przerwanie NMI generowane jest najczęściej po wciśnięciu klawisza RESTORE. Poniżej prosty przykład procedury NMI reagującej na ten klawisz.

Prezentuję także pełne źródła do odczytu pod emulatorem bądź oryginalnym C64 – plik znajduje się tutaj (D64).

Drobna uwaga do oznaczeń w kodzie:
{ oznacza znak ‚mniejsze od’ – <, natomiast } oznacza ‚większe od’ – >

lda #{my_nmi	; wpisanie adresu
sta $318 ; przerwania NMI
lda #}my_nmi ; wskazującego
sta $319 ; na naszą procedurę
rts

my_nmi inc $d020 ; to się ma wykonać po wciśnięciu RESTORE
jmp $fe47 ; kontynuacja procedury NMI

Efektem działania powyższego programu będzie zmiana koloru ramki przy każdym wciśnięciu klawisza RESTORE.
Głównym zastosowaniem przerwań IRQ jest cykliczne wywoływanie jakiejś procedury. Kernal używa przerwań IRQ np. do odczytu klawiatury. Standardowo przerwanie IRQ wywoływane jest 60 razy na sekundę. Ponieważ układy CIA1 i CIA2 są identyczne, tego drugiego także można użyć do cyklicznego wywoływania jakiejś procedurki.
Poniżej zamieszczam prosty przykład:

 

lda #{my_nmi	; wpisanie adresu
sta $318 ; przerwania NMI
lda #}my_nmi ; wskazującego
sta $319 ; na naszą procedurę

lda #$ff ; ustawienie timera
sta $dd04 ; młodszy bajt
sta $dd05 ; starszy bajt

lda #%00000001 ; wystartowanie timera, odlicznie ciągłe
sta $dd0e

lda #$81 ; timer będzie generował przerwanie
sta $dd0d
rts

my_nmi pha ; zapamiętanie rejestrów na stosie
txa
pha
tya
pha

jsr my_proc ; wywołanie naszej procedury

lda #$81 ; ustawienie portu
jmp $fe4e ; kontynuacja procedury NMI (w ROMie)

my_proc inc $d020 ; nasza prcedura
rts

Nie możemy, tak jak w poprzednim przypadku, kontynuować procedurę w ROMie pod adresem $fe47, gdyż KERNAL wpisuje w rejestr $dd0d wartość $7f, co spowodowałoby jednorazowe wykonanie naszej procedury. Z tego powodu „wskakujemy” pod adres $fe4e.

Na koniec tego artykułu zamieszczam listing programu, którego zadaniem będzie wyświetlenie w okienku zawartości pamięci naszego komodorka. Aktywacja okienka odbywa się po wciśnięciu kombinacji klawiszy C=+Control. Klawiszami kursora zmieniamy adres o 1 lub 8 bajtów, klawiszami } i { zmieniamy adres o 64 bajty. Program nie jest w 100% przetestowany. Jak widać napisanie go zajęło mi 6 godzin, w tym przerwa na wizytę u teściów ;-).

 

;*****************************************
;* NMI Wglądownica *
;* *
;* (w) by Janusz Dąbrowski (jad64@wp.pl) *
;* *
;* ver 0.01b started 30-01-2002 17:52 *
;* ver 0.01b finished 30-01-2002 23:47 *
;*****************************************
!zn NmiWgl
!ct pet
!to "nmi_wgl.prg"

;************************************
;* CONSTS *
;************************************
winScrAdr = $401
winWid = 18
winHgt = 14

cntr = $02 ;(1)
hiLite = $02 ;(1)
bufPtr = $FB ;(2)
memPtr = $FB ;(2)
scrPtr = $FD ;(2)

;************************************
;* CODE *
;************************************
*=$801

; BASIC header
!word $80B,2002
!text $9E,"2061"
!byte 0,0,0

; Inicjalizacja
lda #myNmi
sta $319

lda #$FF
sta $DD04
sta $DD05

lda #%00000001
sta $DD0E

lda #$81
sta $DD0D

lda #14
jmp $FFD2

;************************************
;* Procedura NMI *
;************************************
myNmi=*
pha
txa
pha
tya
pha

lda wglActive
bne mn3

lda $28D
cmp #$06
bne mn3

cli
sta wglActive
jsr Wgladownica
lda #0
sta wglActive

mn3 lda #$81
jmp $FE4E

;************************************
;* Wglądownica - program *
;************************************
Wgladownica=*
jsr winOpen

; hex dump
dl0 lda #<(winScrAdr+41)
sta scrPtr
lda #>(winScrAdr+41)
sta scrPtr+1

ldx #0
dl1 ldy #0
dl2 lda #$00
cpx crsrPtr
bne *+4
lda #$80
sta hiLite
mPtr lda $1C0,x
inx
jsr hexDisp
cpy #16
bcc dl2

jsr scrNewLine
cpx #64
bcc dl1

; hex adres
jsr scrNewLine

ldy #0
sty hiLite

clc
lda mPtr+1
adc crsrPtr
sta decBuf
sta memPtr
tax
lda mPtr+2
adc #0
sta decBuf+1
sta memPtr+1
jsr hexDisp
txa
jsr hexDisp

; dziesiętny adres
jsr decConv
ldy #10
lda decBuf+4
jsr hexDisp
lda decBuf+3
jsr hexDisp
lda decBuf+2
jsr hexDisp

; ascii dump
jsr scrNewLine
jsr scrNewLine

ldy #15
dla lda (memPtr),y
jsr asc2scr
sta (scrPtr),y
dey
bpl dla

; sprawdzenie klawiatury
jsr $FFE4
beq dl0
cmp #95
bne dl3
jmp winClose

dl3 ldx #5
dl4 cmp keyTable,x
beq dl5
dex
bpl dl4
jmp dl0

dl5 txa
asl
tax
lda procTable,x
sta pAdr+1
lda procTable+1,x
sta pAdr+2
pAdr jsr *
jmp dl0

;************************************
;* Kursor w dół *
;************************************
csrDown=*
lda crsrPtr
cmp #56
bcs cd1

adc #8
sta crsrPtr
rts

cd1 clc
lda mPtr+1
adc #8
sta mPtr+1
bcc *+5
inc mPtr+2
rts

;************************************
;* Kursor w prawo *
;************************************
csrRight=*
lda crsrPtr
cmp #63
bcs cr1

inc crsrPtr
rts

cr1 inc mPtr+1
bne *+5
inc mPtr+2
rts

;************************************
;* Kursor w górę *
;************************************
csrUp=*
lda crsrPtr
cmp #8
bcs cu1

sec
lda mPtr+1
sbc #8
sta mPtr+1
bcs *+5
inc mPtr+2
rts

cu1 sbc #8
sta crsrPtr
rts

;************************************
;* Kursor w lewo *
;************************************
csrLeft=*
lda crsrPtr
bne cl1

lda mPtr+1
bne *+5
dec mPtr+2
dec mPtr+1
rts

cl1 dec crsrPtr
rts

;************************************
;* Strona do góry *
;************************************
pageUp=*
sec
lda mPtr+1
sbc #64
sta mPtr+1
bcs *+5
dec mPtr+2
rts

;************************************
;* Strona w dół *
;************************************
pageDown=*
clc
lda mPtr+1
adc #64
sta mPtr+1
bcc *+5
inc mPtr+2
rts

;************************************
;* Wyświetl liczbę hex *
;************************************
hexDisp=*
pha
lsr
lsr
lsr
lsr
jsr nibDisp
pla

;************************************
;* Wyświetl nibble hex *
;************************************
nibDisp=*
and #$0F
sed
cmp #10
adc #"0"
cld
ora hiLite
sta (scrPtr), y
iny
rts

;************************************
;* Konwersja na dziesiętne *
;************************************
decConv=*
lda #0
sta decBuf+2
sta decBuf+3
sta decBuf+4

ldx #16
sed
dc1 asl decBuf
rol decBuf+1
lda decBuf+2
adc decBuf+2
sta decBuf+2
lda decBuf+3
adc decBuf+3
sta decBuf+3
rol decBuf+4
dex
bne dc1
cld
rts

;************************************
;* Otwarcie okna *
;************************************
winOpen=*
lda #winBuf
sta bufPtr+1
lda #winScrAdr
sta scrPtr+1

; ekran pod oknem do bufora
ldx #winHgt
wo1 ldy #0
wo2 lda (scrPtr),y
sta (bufPtr),y
iny
cpy #winWid
bcc wo2

jsr scrNewLine
clc
lda bufPtr
adc #winWid
sta bufPtr
bcc *+4
inc bufPtr+1

dex
bne wo1

; rysowanie ramki
lda #winScrAdr
sta scrPtr+1

ldx #0
jsr winDrawLine
ldx #3
lda #winHgt-2
sta cntr
wo3 jsr winDrawLine
dec cntr
bne wo3
ldx #6
; jmp winDrawLine

;************************************
;* Rysowanie linii okna *
;************************************
winDrawLine=*
ldy #0
lda frameDef,x
sta (scrPtr),y

lda frameDef+1,x
wd1 iny
sta (scrPtr),y
cpy #winWid-2
bcc wd1

lda frameDef+2,x
iny
sta (scrPtr),y
; jmp scrNewLine

;************************************
;* Obliczenie adresu nowej linii *
;************************************
scrNewLine=*
clc
lda scrPtr
adc #40
sta scrPtr
bcc *+4
inc scrPtr+1
rts

;************************************
;* Zamknięcie okna *
;************************************
winClose=*
lda #winBuf
sta bufPtr+1
lda #winScrAdr
sta scrPtr+1

; odtworzenie ekranu po oknem
ldx #winHgt
wc1 ldy #0
wc2 lda (bufPtr),y
sta (scrPtr),y
iny
cpy #winWid
bcc wc2

jsr scrNewLine
clc
lda bufPtr
adc #winWid
sta bufPtr
bcc *+4
inc bufPtr+1

dex
bne wc1
rts

;************************************
;* Konwersja ASCII na kod ekranowy *
;************************************
asc2scr=*
ora #$00
bmi g80
cmp #$20
bcs g20
ora #$80
rts
g20 cmp #$60
bcc l60
and #$DF
rts
l60 and #$3F
rts

g80 and #$7F
cmp #$7F
bne *+4
lda #$5E
cmp #$20
bcs gA0
ora #$80
gA0 ora #$40
rts

;************************************
;* DATA *
;************************************
wglActive !byte 0
crsrPtr !byte 0
decBuf !fill 5

keyTable !byte 17,29,145,157,44,46

procTable !word csrDown,csrRight,csrUp
!word csrLeft,pageUp,pageDown

frameDef !byte $70,$40,$6e
!byte $5d,$20,$5d
!byte $6d,$40,$7d
winBuf=*

!eof

Znaki zarezerwowane dla Basic’a

Słowa i symbole zarezerwowane
W tej części podajemy zestaw zarezerwowanych słów i symboli użytych w celu stworzenia języka BASIC. Słowa te i symbole nie mogą być używane w programach BASICowych w celach innych niż jako składniki języka. Jedynym wyjątkiem jest używanie tych słów w cudzysłowiu w instrukcji PRINT.

Zarezerwowane słowa systemowe (kluczowe)

ABS

FN

LIST

READ

STR$

AND

FOR

LOAD

REM

SYS

ASC

FRE

LOG

RESTORE

TAB

ATN

GET

MID$

RETURN

TAN

CHR$

GET#

NEW

RIGHT$

THEN

CLOSE

GOSUB

NEXT

RND

TI

CLR

GO

NOT

RUN

TIME

CMD

GOTO

ON

SAVE

TIME$

CONT

IF

OPEN

SGN

TI$

COS

INPUT

OR

SIN

TO

DATA

INPUT#

PEEK

SPC

USR

DEF

INT

POKE

SQR

VAL

DIM

LEFT$

POS

ST

VERIFY

END

LEN

PRINT

STEP

WAIT

EXP

LET

PRINT#

STOP

 

Zarezerwowane symbole systemowe
Następujące znaki są zarezerwowanymi symbolami systemowymi:

 

  • + znak plus dodawanie arytmetyczne, łączenie ciągów

  • – znak minus odejmowanie arytmetyczne, liczby ujemne, ujemny wykładnik

  • * gwiazdka mnożenie arytmetyczne

  • / slasz dzielenie arytmetyczne

  • ^ strzałka do góry potęgowanie arytmetyczne

  • spacja oddziela słowa kluczowe i nazwy zmiennych

  • = znak równości przypisanie wartości; testowanie relacji

  • < mniejsze testowanie relacji

  • > większe testowanie relacji

  • , przecinek listy w instrukcjach WE/WY, poleceniach, funkcjach

  • . kropka dziesiętna w liczbach zmiennoprzecinkowych

  • ; średnik formatowanie wyjścia w listach zmiennych

  • : dwukropek rozdziela wielokrotne instrukcje w liniach programu

  • ” ” cudzysłów zamyka łańcuchy alfanumeryczne

  • ? pytajnik skrót instrukcji PRINT

  • ( lewy nawias wyliczanie wyrażeń i funkcje

  • ) prawy nawias wyliczanie wyrażeń i funkcje

  • % procent deklaracje zmiennych całkowitych

  • # numer poprzedza numer logiczny zbioru w instrukcjach WE/WY

  • $ znak dolara deklaruje nazwę zmiennej tekstowej

  • c Pi deklaruje stałą liczbową 3.14159256