Interpreter języka ZX81-BASIC


Więcej wiadomości na temat języka ZX-81 BASIC i jego struktur danych znajdziesz w tym artykule.

 

Edytor programu w języku ZX-81 BASIC

 

 

W tym rozdziale opisujemy tryby pracy klawiatury komputera ZX-81 oraz kombinacje klawiszy.

 

Klawiatura ZX-81

Klawisze specjalne zebrano w poniższej tabelce:

 

Klawisz Nazwa Wyjaśnienie Odpowiednik PC
Ret NEWLINE Zatwierdzanie wprowadzonych danych Enter
Space BREAK Wstrzymuje wykonanie programu! Spacja
Shift + 0 RUBOUT Usuwa znak Backspace
Shift + 1 EDIT Edytuje bieżący wiersz programu -
Shift + 5 / 8 CURSOR Przesuwa kursor w prawo / w lewo w buforze edycji Klawisze kursora
Shift + 7 / 6 CURSOR Przesuwa kursor programu w górę / w dół na listingu Klawisze kursora
Shift + 9 GRAPHICS Przełącza kursor w tryb graficzny  G  Alt
Shift + Ret FUNCTION Przełącza kursor w tryb funkcyjny  F  Control

 

Oprócz tych typowo specjalnych klawiszy, wszystkie klawisze ZX-81 zachowują się nieco specjalnie w zależności od różnych trybów wprowadzania danych, jak pokazano poniżej

 

Kursor  K  - tryb wprowadzania poleceń języka BASIC lub numeru wiersza.

Tryb ten jest automatycznie używany na początku każdego wiersza (oraz po słowie THEN). Na początku wiersza można wprowadzić numer wiersza za pomocą klawiszy 0-9. Znaki liter są interpretowane jako słowa kluczowe języka BASIC (np. P = PRINT, G = GOTO). Niektóre polecenia muszą być wprowadzane za pomocą klawisza SHIFT (np. SHIFT + F = FAST). Wprowadzenie numeru wiersza bez polecenia powoduje usunięcie wiersza o takim numerze z programu BASIC.


Kursor  L  - tryb literowy - wprowadzanie operandów lub funkcji.

Ten tryb jest automatycznie wybierany po wprowadzeniu polecenia w trybie  K . Pozwala na wprowadzenie wyrażeń, takich jak "HELLO" lub 1234.5678. Gdy wciśnięty jest klawisz SHIFT, mogą być wprowadzane funkcje / operacje takie jak +, -, *, <=, OR, AND (np. SHIFT + W = OR). Zwróć uwagę, iż wpisanie operatora logicznego OR jako dwa znaki O i R spowoduje błąd składniowy.

 

Kursor  F  - tryb funkcyjny - wprowadzanie funkcji.

Tryb ten jest uaktywniany przez naciśnięcie kombinacji klawiszy SHIFT + ENTER z poziomu trybu  L , co umożliwia użytkownikowi wprowadzanie funkcji, takich jak L = USR, U = CHR$, których nie można wprowadzić w innym trybie bezpośrednio.

 

Kursor  G  - tryb graficzny (negatywowy tekst i grafika blokowa).

Tryb ten jest wprowadzany przez naciśnięcie klawiszy SHIFT + 9 z poziomu trybu  L , co pozwala wpisywać znaki negatywowe (łącznie ze spacją). Trzymając wciśnięty klawisz SHIFT, można wpisać wszystkie kombinacje znaków grafiki blokowej (np. SHIFT + 1 = , SHIFT+G = ).


Kursor  >  - bieżący wiersz programu.

Ten kursor nie jest częścią wiersza wprowadzania. Komputer wyświetla go na listingu programu (jeśli takowy istnieje) w górnej części ekranu. Kursor ten przesuwa się w gór lub w dół za pomocą klawiszy SHIFT + 7 / 8, co powoduje przewinięcie listingu w razie konieczności.

Kombinacja EDIT (SHIFT + 1) kopiuje bieżąco wybrany przez ten kursor wiersz programu do bufora edycyjnego (usuwając z niego poprzednią treść).

 

Symbol  S  - błąd składniowy.

To właściwie nie jest kursor. Gdy zostanie wprowadzony niepoprawny wiersz programu, to pojawi się w nim symbol  S , wskazując pozycję z błędem i żądając usunięcia go przez użytkownika - błędnego wiersza nie da się wprowadzić do programu.

 

Polecenia języka BASIC

CLEAR

Wymazuje wszystkie zmienne i zwalnia zajętą przez nie pamięć.

CLS

Czyści ekran

CONT

Działa podobnie do GOTO, wznawia wykonanie programu od bieżącego wiersza lub od następnego wiersza, jeśli program został wstrzymany poleceniem STOP.

COPY

Przesyła kopię ekranu na drukarkę (jeśli jest podłączona), Kopiowane są jedynie 22 górne wiersze z pominięciem dwóch wierszy dolnych, które w ZX-81 BASIC służą do edycji danych.

DIM b(n1,...,nk)  lub  DIM b$(n1,...,nk)

Definiuje rozmiary dla tablicy. Wszystkie wartości (lub łańcuchy znakowe) w tablicy zostają ustawione na 0 (lub wypełnione spacjami w przypadku tablicy znakowej). Ostatni wymiar tablicy znakowej zawiera długość łańcucha. Na przykład, DIM A$(x,y,z) może być traktowane jako trójwymiarowa tablica znakowa lub jako dwuwymiarowa tablica łańcuchów A$(x,y), każdy o długości z znaków.

FAST

Przełącza na tryb FAST, w którym mikroprocesor skupia się jedynie na wykonywaniu programu użytkownika (około 4 razy szybciej), a ekran staje się czarny aż do zakończenia programu lub przełączenia na tryb SLOW. Ekran uaktywnia się również w okresach wykonywania poleceń PAUSE i INPUT.

FOR b=x TO y [STEP z]

Definiuje początek i zakres pętli FOR-NEXT. Standardowo STEP = 1.

GOSUB n

Zapisuje adres powrotny na stosie i wykonuje skok do wiersza programu o podanym numerze

GOTO n

Wykonuje skok do wiersza o podanym numerze. Jako numer wiersza może być zastosowana liczba, zmienna lub dowolne wyrażenie, np.  GOTO A*10+230.

IF x THEN s

Wykonuje instrukcję s jeśli x<>0. ZX-81 nie rozpoznaje konstrukcji THEN n jako skrótu dla THEN GOTO n.

INPUT v

Wymaga od użytkownika wprowadzenia wartości (lub łańcucha znaków), która zostanie przypisana do v. W trybie FAST ekran jest chwilowo uaktywniany na czas wprowadzenia danych. Program zostaje wstrzymany, jeśli pierwszym, wprowadzonym znakiem jest rozkaz STOP.

LET v=e

Przypisuje wartość wyrażenia e zmiennej v. ZX-81 nie rozumie konstrukcji v=e jako skrótu dla LET v=e. Jeśli v jest fragmentem łańcucha tekstowego, np. A$(... TO ...), to jego długość pozostaje niezmieniona. Jeśli przypisywane wyrażenie tekstowe ma mniej znaków niż wynosi rozmiar fragmentu łańcucha, to brakujące miejsce zostanie uzupełnione spacjami. Jeśli przypisywane wyrażenie jest dłuższe, to zostanie obcięte do rozmiaru fragmentu łańcucha.

LIST [n]

Wyświetla listing programu na ekranie. Standardowo rozpoczyna od pierwszego wiersza w programie. Jeśli program nie mieści się na ekranie, użyj polecenia CONT. Za rozkazem LIST można umieścić numer wiersza, od którego rozpocznie się ten listing.

LLIST [n]

Przesyła listing programu do drukarki. W tym przypadku zostaje wydrukowany cały program (od wiersza o numerze n, jeśli został podany).

LOAD f

Ładuje plik obrazu pamięci z magnetofonu kasetowego. Jeśli zostanie określona pusta nazwa pliku, np. LOAD "", to komputer załaduje pierwszy napotkany program. Podczas ładowania ekran znakowy jest wyłączony, gdy komputer zaczyna odbierać sygnał z magnetofonu kasetowego, na ekranie pojawiają się białe i czarne linie poziome. Obecny program wraz ze wszystkimi swoimi zmiennymi zostanie nadpisany programem i zmiennymi z odczytywanego pliku. Plik obrazu zawiera cały obszar pamięci od $4009 w górę do końca pamięci języka BASIC, czyli zmienne systemowe, program w języku BASIC, zawartość ekranu oraz wszystkie zmienne. Jeśli program został zapisany na taśmie poleceniem SAVE wykonywanym w czasie działania programu (czyli takim, które jest w jego kodzie), to po załadowaniu do pamięci komputera zostanie on automatycznie uruchomiony od następnego wiersza za instrukcją SAVE. Opcja ta pozwala tworzyć samo uruchamiające się programy w języku BASIC.

LPRINT

Działa podobnie do polecenia PRINT, jednakże wydruk trafia na drukarkę. Można stosować AT do określenia poziomej pozycji wydruku wewnątrz bieżąco drukowanego wiersza.

NEW

Uruchamia od nowa system BASIC. Cała pamięć aż do RAMTOP zostaje wymazana - bieżący program i wszystkie jego zmienne.

NEXT b

Uaktualnia zmienną b, która została podana we współdziałającym poleceniu FOR, i (jeśli nie osiągnięto lub nie przekroczono końcowego warunku pętli FOR-NEXT) powoduje skok do pierwszego wiersza za instrukcją FOR. W ZX-81 NEXT musi posiadać jawną zmienną.

PAUSE n

Wstrzymuje program na n/50 części sekundy (przy założeniu, że częstotliwość wyświetlania wynosi 50Hz) lub do momentu, aż użytkownik naciśnie jakiś klawisz. W czasie oczekiwania uaktywniane jest wyświetlanie obrazu, jeśli komputer pracuje w trybie FAST. Największą dozwoloną wartością dla n jest 32767. Zwróć uwagę, iż naciśnięcie klawisza SPACE zatrzyma raczej program niż wyłączy PAUSE.

PLOT m,n

Rysuje białą kropkę (4 × 4 piksele, czyli ćwiartka znaku 8 × 8 pikseli) na określonych współrzędnych przy użyciu znaków graficznych. Początek układu współrzędnych (0,0) znajduje się w lewym dolnym narożniku ekranu z pominięciem dwóch dolnych wierszy.

POKE m,n

Zapisuje bajt n pod adres m w pamięci. Obie wartości muszą być dziesiętne, ponieważ ZX-81 nie rozpoznaje liczb szesnastkowych.

PRINT ...

Wyświetla swoje argumenty (jeśli są podane) na ekranie. Możliwe argumenty, to:

  1. nic
  2. wyrażenie liczbowe, wyświetlane albo jako zwykła liczba dziesiętna (jeśli wpada w zakres 10-5 ... 1013) albo jako liczba w notacji naukowej nnEmm, co oznacza nn × 10mm, wiodące zero jest wyświetlane tylko wtedy, gdy jest pierwszą cyfrą za przecinkiem nie jest zero, np. 0.3 i .03.
  3. łańcuch znaków, znaki niezdefiniowane są wyświetlane jako pytajniki.
  4. AT m,n - przemieszcza pozycję wydruku do określonego miejsca na ekranie, 0,0 oznacza lewy górny narożnik.
  5. TAB n - przesuwa pozycję wydruku w obrębie bieżącego wiersza do podanej kolumny. Jeśli przesunięcie jest na lewo w stosunku do bieżącej pozycji wydruku, to zwiększona zostaje pozycja w pionie i następny argument jest drukowany w nowym wierszu.

Argumenty mogą być oddzielone średnikiem ";" (następny argument będzie wyświetlony bezpośrednio na bieżącej pozycji) lub przecinkiem "," (następny argument zostanie wyświetlony na pozycji TAB 0 lub TAB 16). Jeśli ostatni argument nie kończy się średnikiem lub przecinkiem, to następny wydruk rozpocznie się od nowego wiersza.

W trakcie wydruku może powstać błąd, jeśli pamięć zostanie zapełniona. Można wtedy użyć polecenia CONT, które wyczyści ekran i wznowi wykonywanie programu.

RAND [n]

Inicjalizuje ziarno generatora pseudolosowego (n = 1...65535). Gdy n = 0 (wartość standardowa) lub jest pominięte, jako ziarno zostanie wykorzystana bieżąca zawartość licznika ramek.

REM ...

Definiuje komentarz ignorowany w czasie wykonywania programu. Obszar komentarza często jest wykorzystywany do przechowywania kodu maszynowego wewnątrz programu w języku BASIC. Jednakże komentarz nie powinien zawierać znaku NEWLINE ($76), tj. instrukcji HALT ani żadnego innego kodu, który zawiera tę wartość, np. JP $4176 lub LD A,$76.

RETURN

Wykonuje powrót do wiersza za ostatnio wykonaną instrukcją GOSUB.

RUN [n]

Czyści wszystkie zmienne i wykonuje skok do wiersza o podanym numerze. Jeśli numer nie został podany, skok zostanie wykonany do pierwszego wiersza w programie.

SAVE f

Zapisuje na taśmie obszar zmiennych systemowych, program, pamięć wideo oraz zdefiniowane zmienne. Nazwa pliku f musi być tekstem o długości od 1 do 127 znaków, w którym nie mogą znaleźć się znaki negatywowe. W czasie zapisywania ekran tekstowy zostaje wyłączony, pojawiają się na nim białe i czarne linie, które przedstawiają sygnały wysyłane do magnetofonu.

Gdy polecenie SAVE zostanie wykonane z wnętrza programu, to po załadowaniu się do pamięci program automatycznie się uruchomi od następnego wiersza za poleceniem SAVE. Zwróć uwagę, iż stos adresów powrotnych GOSUB nie jest umieszczany w pliku kasetowym, zatem polecenie SAVE nie powinno być wykonywane z wnętrza podprogramu - po wczytaniu i uruchomieniu programu instrukcja RETURN nic nie znajdzie na stosie GOSUB i program się zatrzyma z błędem.

SCROLL

Przesuwa ekran tekstowy w górę, wpisując na spodzie pusty wiersz. Uwaga, pusta linia jest zupełnie pusta. W pamięci VRAM tworzy ją pojedynczy kod HALT bez jakichkolwiek spacji.

SLOW

Przełącza do trybu SLOW (około 4 razy wolniej niż w trybie FAST). Ekran jest wyświetlany, a program jest wykonywany tylko w okresach wygaszania pionowego. ZX-81 rozpoczyna pracę w trybie SLOW.

STOP

Wstrzymuje program. Użytkownik może wznowić wykonywanie programu od następnego wiersza przez wprowadzenie polecenia CONT.

UNPLOT m,n

Działa tak samo jak PLOT, tylko rysuje białą kropkę zamiast czarnej.

 

Funkcje języka BASIC

Zwróć uwagę, iż wszystkie funkcje w ZX-81 należy wprowadzać albo przy pomocy klawisza SHIFT, albo w trybie funkcyjnym. Na przykład dla słowa kluczowego INKEY$ należy wcisnąć kombinację klawiszy SHIFT + ENTER, a następnie B - próba wprowadzenie I, N, K, E, Y, $ skończy się błędem składniowym. To samo dotyczy operatorów ">=" i "**".

ABS n

Zwraca wartość bezwzględną z n.

CHR$ n

Zwraca znak o kodzie n (zamienia liczbę na jednoznakowy łańcuch tekstowy).

CODE string

Zwraca kod pierwszego znaku lub zero, jeśli łańcuch jest pusty. Przeciwieństwo CHR$.

INKEY$

Zwraca znak bieżąco naciśniętego klawisza lub pusty łańcuch znakowy, jeśli żaden klawisz nie jest naciśnięty.

LEN string

Zwraca długość łańcucha znakowego.

PEEK n

Zwraca bajt odczytany z adresu pamięci (podanego jako liczba dziesiętna - ZX-81 nie rozpoznaje liczb szesnastkowych).

RND

Zwraca liczbę pseudolosową w zakresie 0 to 0.99999...

SGN n

Zwraca znak liczby n  (-1, 0, lub +1).

STR$ n

Zwraca łańcuch znakowy zawierający zapis liczby n jako ciąg znaków.

USR n

Wywołuje program maszynowy, który jest umieszczony w pamięci pod adresem n i zwraca wartość pary rejestrów BC, gdy program maszynowy zakończy swoje działanie i odda sterowanie językowi BASIC. Adres musi być dziesiętny, gdyż ZX-81 nie rozpoznaje liczb szesnastkowych.

VAL string

Zamienia łańcuch na wartość, zatrzymuje program, jeśli napotka błąd. W łańcuchu może być dowolne wyrażenie numeryczne wraz z funkcjami i zmiennymi.
 

Funkcje zmiennoprzecinkowe

ACS n
ASN n
ATN n
COS n
EXP n  
INT n
LN n
PI
SIN n
SQR n
TAN n
 - arccos(n)
 - arcsin(n)
 - arctg(n)
 - cos(n)
 - en
 -
część całkowita z n, zaokrąglona w dół
 - ln(n) - logarytm naturalny przy podstawie e
 - 3.14159265...
 - sin(n)
 - pierwiastek kwadratowy z n
 - tg(n)

 
Operacje liczbowe

op. prio. Wyjaśnienie
a + b

6

Dodawanie
a - b 6 Odejmowanie
a * b 8 Mnożenie
a / b 8 Dzielenie
-a 9 Znak minus
a ** b 10 Potęgowanie


Operacje logiczne

Zwracają 1, jeśli wynikiem jest prawda, 0, jeśli wynikiem jest fałsz.

op. prio. Wyjaśnienie
a = b 5 Równość
a > b 5 Większe niż
a < b 5 Mniejsze niż
a <= b 5 Mniejsze bądź równe
a >= b 5 Większe bądź równe
a <> b 5 Różne


Specjalne operacje liczbowo/logiczne

op. prio. Wyjaśnienie
a OR b 2 b <> 0, zwraca 1; b= 0, zwraca a
a[$] AND b 3 b <> 0, zwraca a (lub a$); b = 0, zwraca 0 (lub "")
NOT b 4 b<> 0, zwraca 0; b = 0, zwraca 1

Priorytet indeksowania (DIM) i fragmentów łańcuchów (TO) wynosi 12. Priorytet wszystkich funkcji wynosi 12.

 

Łańcuch ( [pierwszy] TO [ostatni] )

Używane do określenia fragmentu łańcucha od pierwszego do ostatniego znaku. Standardową wartością dla początku jest 1, a dla końca ostatni znak w łańcuchu. Zatem:

    "ABCDEFGH"(3 TO 5) = "CDE"
    "ABCDEFGH"(TO 5) = "ABCDE"
    "ABCDEFGH"(3 TO) = "CDEFGH"

Może być stosowane zarówno w wyrażeniach tekstowych jak i przypisaniach. Na przykład:

    LET A$(5 TO 7) = "***"    ;zapisuje 5-ty, 6-ty i 7-my znak zmiennej A$
    LET A$ = B$(TO 4)         ;umieszcza w A$ znaki od 1 do 4 z B$

 

Kody błędów w języku BASIC

Błędy wiersza edycji

Gdy wiersz w buforze edycyjnym zawiera błąd, to komputer ZX-81 umieszcza na tej pozycji znak błędu składniowego -  S , żądając od użytkownika usunięcia tego błędu. Wiersz zawierający błędy składniowe nie zostanie umieszczony w programie.

 

Błędy w czasie wykonania programu

Jeśli błąd wystąpi w trakcie wykonywania programu w języku BASIC, to na spodzie ekranu zostanie wyświetlony następujący kod błędu:


0  Brak błędu, program zakończony normalnie z sukcesem
1  Napotkano NEXT bez FOR.
2  Niezdefiniowana zmienna
3  Indeks DIM poza zakresem. Może również dać błąd B, jeśli zostanie przekroczona wartość 16 bitowa.
4  Pamięć pełna.
5  Ekran pełny. Wpisz CONT, aby kontynuować z wyczyszczonym ekranem.
6  Przepełnienie arytmetyczne. Wartość większa od 1038.
7  Napotkano RETURN bez GOSUB.
8  Próba użycia INPUT jako rozkazu bez numeru wiersza.
9  Program wstrzymany poleceniem STOP. Można kontynuować za pomocą CONT.
A  Funkcja ze złym argumentem
B  Liczba całkowita poza zakresem.
C  Funkcja VAL nie powiodła się.
D  Program wstrzymany przez BREAK (klawisz spacji) lub napotkano STOP na początku danych wczytanych przez INPUT.
E  Nieużywane
F  Próba użycia SAVE bez nazwy pliku.


Błędy są zawsze wyświetlane jako NR BŁĘDU/NR WIERSZA, skąd możemy odczytać numer wiersza programu, w którym dany błąd wystąpił

 

Program w ZX81 BASIC i zmienne

Struktura wiersza programu w języku BASIC

Bajty Wyjaśnienie
2 Numer wiersza (starszy bajt, młodszy bajt - czyli odwrotnie niż normalnie)
2 Długość wiersza (młodszy bajt, starszy bajt)
... Długość - 1 bajtów z treścią wiersza
1 Znak NEWLINE o kodzie $76


Wewnątrz wiersza są używane następujące kody:

$00-$3F oraz $80-$BF dla normalnych i negatywowych znaków
$C0-$FF oraz $40-$42 dla słów kluczowych
$7E dla wartości - wartości są dublowane w wierszach programu, Najpierw występuje zwykły tekst, jak zostały wprowadzone przez użytkownika (podczas wykonywania programu ten zapis jest ignorowany, lecz wciąż musi tam być, lecz zawsze można go sprowadzić do "0", jeśli jest to wymagane). Następnie po kodzie $7E następuje 5 bajtów zapisu zmiennoprzecinkowego. Zatem wartość bezpośrednia zajmuje w pamięci co najmniej 7 bajtów: cyfra + %7E + 5 bajtów wartości zmiennoprzecinkowej. Istnieją pewne metody oszczędzania pamięci, takie jak: PI-PI dla 0 - 3 bajty, VAL"9" definiuje wartość 9 w czterech bajtach, itp.

 

Jednoznakowe zmienne:

Bajty Wyjaśnienie
1 $60 + znak (5 bitów)
1 Wykładnik
4 Bit znaku i mantysa

 

Wieloznakowe zmienne:

Bajty Wyjaśnienie
1 $A0 + pierwszy znak (5 bitów)
... Następne znaki (6 bitów)
1 $80 + ostatni znak (6 bitów)
1 Wykładnik
4 Bit znaku i mantysa

 

Tablica liczbowa

Bajty Wyjaśnienie
1 $80 + znak (5 bitów)
2 Całkowita długość dalszych danych
1 Liczba wymiarów
D × 2 Zakres każdego wymiaru
N × 5 Wartości

 

Zmienna pętli FOR-NEXT
 

Bajty Wyjaśnienie
1 $E0 + znak (5 bitów)
5 Bieżąca wartość
5 Końcowa wartość
5 Krok
2 Numer pierwszego wiersza pętli (starszy-młodszy bajt!)


Łańcuch znakowy

Bajty Wyjaśnienie
1 $40 + znak (5 bitów)
2 Długość łańcucha (0, jeśli pusty)
... łańcuch znaków (jeśli pusty, nic tu nie ma)


Tablica łańcuchowa

Bajty Wyjaśnienie
1 $C0 + znak (5 bitów)
2 Całkowita długość dalszych danych
1 Liczba wymiarów
D × 2 Zakres każdego wymiaru
N Znaki

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe