|
Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie
Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2026 mgr Jerzy Wałaszek
|
| SPIS TREŚCI |
Zanim rozpoczniesz czytanie tego rozdziału:
pobierz plik instalacyjny emulatora VB81Zwykły ZX81 BASIC jest bardzo wolny. Dlatego powstały różne rozszerzenia i ulepszenia, które z jednej strony podnosiły komfort programowania, a z drugiej ulepszały sam BASIC. Poniżej przedstawiamy instrukcję do interpretera CBI. W przeciwieństwie do kompilatora (np. MCODER 2) interpreter nie tłumaczy programu na procedury w języku maszynowym, lecz odczytuje go, rozpoznaje zawarte w nim polecenia i wykonuje odpowiednie procedury w ROM lub w swoim kodzie. Dlatego ten sposób wykonywania programu nazywamy interpretacją – interpreter czyta i interpretuje polecenia języka BASIC.
Chociaż interpreter CBI zawiera wiele interesujących rozszerzeń języka ZX81 BASIC, to jednak jego zastosowanie jest ograniczone. Spowodowane to jest koniecznością załadowania samego interpretera przed załadowaniem programu napisanego w CBI. Jeśli chcesz, możesz się tym bawić. Jednak inni użytkownicy (o ile jeszcze takowi się znajdą) zapewne wolą prostszą metodę uruchamiania programów, dlatego MCODER2 wydaje się mi lepszą alternatywą.
| wersja 7.0 copyright Carlo Delhez, |
Instrukcja w języku angielskim powstała 27 września 1992 roku
obecna wersja instrukcji to 0.04 z datą
Interpreter języka ZX81 Coral Basic
był pierwotnie sprzedawany przez Terminal Software, Baarle Nassau, w Holandii. Oryginalna, holenderska instrukcja otrzymała numer
CBI jest skrótem nazwy Coral Basic Interpreter. Łączy on wydajność nowego i szybkiego edytora pseudo ekranowego z prostym i potężnym rozszerzeniem ZX81 BASIC.
CBI udostępnia ci nowy Edytor, który możesz używać w trybie wierszowym lub pseudo ekranowym. Wszystkie wady (raczej wolnego) zwykłego edytora ZX81 zniknęły, np. w wyniku samopowtarzania na wszystkich klawiszach, jednocześnie wszystkie użyteczne cechy, takie jak bezpośrednie sprawdzanie składni poleceń oraz edycja ze ściąganiem w dół wiersza programu, wciąż są dostępne! Co więcej, nowy edytor jest całkowicie nieczuły na separatory, zatem każdy maniak komputerowy może teraz z łatwością używać ZX81 bez potrzeby uczenia się funkcji poszczególnych klawiszy.
Dodatkowo ZX81 BASIC został rozszerzony o 43 nowe rozkazy, a wiele 'starych' rozkazów zostało przyspieszonych i ulepszonych. W nowym systemie mamy:
Pomimo tych wszystkich zaawansowanych funkcji CBI, rzeczywisty kod zajmuje tylko około 5K i jest umieszczany ponad RAMTOP (standardowo). CBI można stosować ze wszystkimi istniejącymi programami w ZX81 BASIC oraz w kodzie maszynowym. Programy napisane w CBI można również używać na 'normalnym' ZX81 pod warunkiem, iż nie używają one nowych rozkazów.
Standardowo kod CBI jest umieszczany ponad RAMTOP. Zanim załadujesz ten program, musisz zarezerwować miejsce na jego kod. Aby to osiągnąć, wpisz następujące rozkazy:
| POKE 16388,8 POKE 16389,107 NEW |
Teraz możesz załadować program:
| LOAD "CBI" |
Po załadowaniu, naciśnij dowolny klawisz w celu wyczyszczenia ZX81. Teraz CBI można aktywować poleceniem:
| RAND USR 27400 |
Jeśli wszystko poszło dobrze, to powinien pojawić się normalny komunikat 0/0 (jednak o jeden wiersz wyżej niż zwykle), a poniżej niego jest czarny kwadrat: kursor. CBI jest gotowy do użycia.
UWAGA 1:
Niekiedy ZX81 może przełączyć się z CBI do swojego "zwykłego" systemu
(pojawi się kursor K). Dzieje się tak np. po rozkazie NEW. W takim
wypadku CBI można uruchomić ponownie wpisując jeszcze raz
UWAGA 2:
Jeśli chcesz zresetować CBI bez wychodzenia z niego, to wpisz polecenie
UWAGA 3:
CBI jest dosyć zaawansowanym oprogramowaniem, które wciąż może zawierać błędy. Jeśli będziesz miał problemy z CBI lub odkryjesz błąd, to skontaktuj się ze mną przy pomocy adresu umieszczonego na końcu tej instrukcji.
W następnym rozdziale podsumowane są alfabetycznie wszystkie nowe rozkazy oferowane przez CBI wraz z wymaganą składnią, z krótkim wyjaśnieniem użycia oraz, tam gdzie potrzeba, z jednym lub kilkoma przykładami.
Wymagana składnia zapisywana jest przy pomocy specjalnych symboli. Oto one:
Za każdym razem gdy kursor pojawi się na ekranie, zostanie wydrukowany automatycznie numer wiersza. Numeracja rozpoczyna się od x i zwiększa się z krokiem y. Autonumeracja wierszy zostaje przerwana po wprowadzeniu pustego wiersza (tj. po naciśnięciu NEWLINE bezpośrednio za numerem wiersza) lub przy przekroczeniu 9999. AUTO pracuje również z poleceniami INPUT (można go użyć do pokazania standardowej wartości, którą może zmienić użytkownik).
Przykład:
generuje 50,60,70,...
generuje tylko 92.
Pozwala użytkownikowi włączyć/wyłączyć funkcję klawisza przerywającego (spacja). Przy wejściu w tryb edycji (np. po komunikacie błędu) przerywanie jest automatycznie włączane. Gdy klawisz przerywający jest wyłączony, to również nie można zatrzymać programu wpisując STOP jako wartość dla INPUT.
Przykład:
| 10 BREAK OFF 20 DO UNTIL INKEY$="S" 30 LOOP |
Ten program można zatrzymać tylko klawiszem "S". Uwaga: klawisz przerywający zawsze pozostaje włączony podczas wykonywania rozkazów LOAD i SAVE.
Wywołuje program maszynowy pod adresem x. CALL
zastępuje
Przykład:
CALL 2602
czyści ekran (procedura w ROM dla CLS).
Zastępuje
Przykład:
| 10 FOR K=0 TO 255 20 CHAR K 30 NEXT K |
drukuje cały zestaw znaków.
Czyści cały stos.
Przykład:
| 10 GOSUB 30 20 STOP 30 CLR STACK 40 RETURN |
Otrzymasz błąd 7/40, ponieważ CLR STACK usunął ze stosu adres powrotny.
Jako kursor będzie stosowany znak CHR$(x) w edytorze wierszowym CBI. Używaj tylko pojedynczych znaków (nie słów kluczowych lub kodów sterujących – np. NEWLINE).
Przykład:
CURSOR 131
daje kursor "połówkowy".
Udostępnia dane dla polecenia READ. W programie należy wydać przynajmniej jedno polecenie RESTORE, aby wskaźnik danych przyjął właściwą wartość.
Przykład:
| 10 RESTORE 20 READ N$ 30 READ NUMBER 40 PRINT N$;NUMBER 50 DATA ."ZX",81 |
Rozpoczyna definicję procedury o nazwie "name". Definicja musi kończyć
się poleceniem
| name{:data_list} |
a w przypadku, gdy dodano listę danych, wskaźnik danych zostanie na nią
ustawiony, aby można było odczytać parametry rozkazami
READ. Gdy podczas wykonywania programu zostanie napotkane
Przykład:
| 10 DEF PROC ENIGMA 20 READ X$ 30 FOR K=1 TO LEN X$ 40 LET X$=X$(2*K-1)+X$ 50 NEXT K 60 END PROC .X$( TO LEN X$/2) 70 ENIGMA:."DESREVER" 80 READ E$ 90 PRINT E$ |
Usuwa z programu wszystkie wiersze od numeru x do y. Wiersze x i y nie muszą być obecne w programie. DELETE można używać tylko w trybie bezpośrednim.
Przykład:
| DELETE 0 TO 9999 |
usuwa cały program.
Polecenie DO oznacza początek (warunkowej) pętli, która musi się kończyć pasującym do niej poleceniem LOOP. Istnieją trzy możliwe rodzaje pętli:
| DO ... LOOP : pętla bezwarunkowa
(nieskończona) DO UNTIL bln ... LOOP : powtarza aż do bln=prawda (1) DO WHILE bln ... LOOP : powtarza podczas gdy bln=prawda (1) |
Z każdej pętli można wyjść przed czasem przy pomocy rozkazu EXIT. Pętle
Przykład:
| 10 INPUT X 20 LET Y=X 30 DO UNTIL Y*Y=X 40 LET Y0=Y 50 LET Y=(Y+X/Y)/2 60 IF Y0=Y THEN EXIT 70 PRINT "SQR(";X;")=";Y 80 LOOP |
Podwójne pobranie z pamięci (wartość słowa), równoważne niewygodnej konstrukcji:
| LET var=PEEK x+256*PEEK (x+1) |
Przykład:
| DPEEK DF,16396 |
DF wskazuje bufor wyświetlania.
Podwójne wstawienie do pamięci (wartości słowa), równoważne niewygodnej konstrukcji:
| POKE x,y-256*INT (y/256) POKE x+1,INT (y/256) |
Przykład:
| DPOKE 32734,DF+1 |
posiada taki sam efekt jak HOME (zobacz również na przykład przy DPEEK, gdzie jest definicja DF). Liczba umieszczona w pamięci przez DPOKE może być odczytana przez DPEEK i na odwrót.
Rysuje najlepszą możliwą linię od ostatniej pozycji graficznej do pozycji (x,y). Uwaga: linia narysowana od punktu (a,b) do (c,d) nie jest taka sama jak linia od punktu (c,d) do (a,b). Do wymazywania linii narysowanej przez DRAW należy zastosować UNDRAW w tym samym kierunku.
Przykład:
| PLOT 0,0 DRAW TO 63,43 |
rysuje przekątną ekranu.
Kopiuje wartość szczytowego elementu stosu do zmiennej var. Sam stos pozostaje niezmieniony.
Przykład:
| 10 DEF PROC WHERE 20 DUP RT 30 PRINT "CALLED FROM ";RT 40 END PROC 80 WHERE |
Przekazuje wiersz x (lub, w przypadku braku wiersza x, pierwszy wiersz o numerze większym od x) do edytora. Może być używane tylko jako polecenie bezpośrednie.
Używane razem z WHEN – doczytaj dalej tam.
Oznacza koniec definicji procedury. Gdy procedura jest wykonywana i za
Oznacza koniec struktury WHEN – więcej szczegółów w opisie WHEN.
Gdy jest włączone opisywanie błędów (ERR MSGS ON), to wszystkie błędy będą krótko opisane w języku angielskim. Nieznany rodzaj błędu zostanie opisany jako "ERROR?".
Przykład:
| ERR MSGS ON |
włącza opisywanie błędów
| PLOT 100,100 ... B/0 INTEGER OUT OF RANGE |
Wymusza komunikat błędu ze znakiem CHR$(x), który powinien być drukowalny, nie sterujący i pojedynczy (czyli np. nie nazwa funkcji czy rozkazu języka ZX81 BASIC lub CBI). Uwaga – ERROR 28 nie działa.
Przykład:
| ERROR 63 ... Z/0 |
Posiada dwa różne zastosowania:
Przykład dla przypadku 2 znajdziesz w opisie rozkazu DO.
Szybka i ekonomiczna alternatywa dla
Nadaje twojemu programowi właściwy układ o profesjonalnym wyglądzie. Używaj INDENT do poprawy czytelności swojego programu, gdyż po zastosowaniu tego rozkazu struktura programu staje się dużo bardziej przejrzysta. Jeśli INDENT napotka w twoim programie błąd strukturalny, to przestanie działać. Uwaga – INDENT można używać tylko jako polecenie bezpośrednie, które czasami daje w wyniku nieokreślone (i nieistotne) komunikaty błędów.
Umieszcza w zmiennej var adres wiersza x lub, w przypadku braku wiersza x w programie, adres pierwszego wiersza o numerze większym od x. Polecenie umieszczone w tym wierszu (np. PRINT) rozpoczyna się od adresu var+4.
Przykład:
| LINE FIRST,0 |
zawsze
Oznacza koniec struktury
Przełącza pomiędzy dwoma dostępnymi trybami edycji:
Te dwa zarezerwowane słówka kluczowe CBI mogą być używane tylko w połączeniu z innymi rozkazami CBI, które wymagają "sw" jako parametru.
Przykład:
| NOSTALGIC ON BREAK OFF |
Pobiera szczytowy element ze stosu i umieszcza go w zmiennej var.
Przykład:
| 1000 DEF PROC ALTER 1010 POP CRA 1020 POP LRA 1030 IF LRA>=1E4 THEN LET LRA=1E4 1040 PUSH LRA 1050 PUSH CRA 1060 END PROC |
Ta procedura musi być wywołana tuż przed końcem innej procedury, aby upewnić się, że ta druga procedura nie wywoła błędu B w przypadku wywołania za pomocą polecenia bezpośredniego.
Można używać do blokowania poleceń CLEAR, RUN i NEW w celu ochrony programów i zmiennych przed przypadkową utratą.
Przykład:
| PROTECT ON LET AMOUNT=99.95 CLEAR |
Umieszcza liczbę x na szczycie stosu – zobacz na przykład w opisie POP.
Rozkaz READ jest ważnym narzędziem do wymiany danych pomiędzy różnymi częściami programu. Poniżej podsumowujemy trzy różne sposoby stosowania rozkazu READ. Ogólnie READ pobiera element danych z listy danych określonej bieżącą wartością wskaźnika danych. Jeśli nie można pobrać takiego elementu z listy, powstaje błąd G.
| 10 RAND PI 20 RESTORE 30 DATA 0 40 DPOKE 32732,16514 50 READ X 60 PRINT X |
Zmienia numerację wierszy programu poczynając od wiersza x w górę. Wiersz
x zostanie przenumerowany na y, a kolejne wiersze otrzymają numery z krokiem
z. Rozkaz RESEQ nie zmienia numerów wierszy za GOTO i GOSUB (renumeracja w VB81 robi to!, ale
powoduje wyjście z CBI, który należy ponownie uruchomić poleceniem
Przykład:
| RESEQ 0:100,10 |
przenumerowuje program jako 100, 110, 120, ...
Ustala pozycję wskaźnika danych na pierwszym elemencie znalezionym w wierszu x lub w wierszach następnych za x. RESTORE bez numeru wiersza szuka pierwszego elementu danych w programie. Przykład użycia znajdziesz w opisie DATA.
W przypadku
Przykład:
| TRACE 1;2000 |
czeka około 0,72 sekundy.
Działa tak jak
Te zarezerwowane słowa kluczowe CBI mogą być użyte tylko w połączeniu ze strukturą
Zapewne jest to najbardziej interesujące polecenie dla programujących w kodzie maszynowym. Rozkaz USER powoduje, iż następne rozkazy "*" zostaną przekierowane do procedury użytkownika w kodzie maszynowym, która znajduje się pod adresem x. Pozwala to użytkownikowi z łatwością rozszerzyć BASIC swoimi samodzielnie napisanymi procedurami.
To polecenie jest rozszerzeniem rozkazu IF i pozwala na warunkowe wykonanie bloku programu (zamiast tylko jednej instrukcji). Struktura bloku WHEN w programie jest następująca:
| WHEN bln DO > wiersze programu wykonywane dla bln=true ) ELSE ) > wiersze programu wykonywane dla bln=false ) |
ELSE wraz z następującymi po nim wierszami programu jest opcjonalne.
Struktury
Przykład:
| 100 INPUT L$ 110 LET V$="AEIOU*" 120 FOR N=1 TO 6 130 WHEN L$=V$(N) AND T<6 DO 140 PRINT L$;" IS A VOWEL" 150 LET N=6 160 ELSE 170 WHEN N=6 DO 180 PRINT L$;" IS A CONSONANT" 190 END WHEN 200 END WHEN |
Uwaga – rozkaz * (zobacz na polecenie USER) nie może być użyty po THEN w instrukcji warunkowej IF. Zamiast niej stosuj WHEN.
Jeśli będziesz miał pytania lub propozycje odnośnie CBI, proszę, napisz pod adres:
Carlo Delhez,
Emmastraat 3,
4651 BV Steenbergen,
Netherlands.
Internet:
tnndcarlo@cycl.phys.tue.nl (do maja 1994)
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.