Serwis Edukacyjny
Nauczycieli

w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Współpraca: mgr inż. Janusz Wałaszek

©2026 mgr Jerzy Wałaszek

SPIS TREŚCI

CBI BASIC – instrukcja

Zanim rozpoczniesz czytanie tego rozdziału:

pobierz plik instalacyjny emulatora VB81
przeczytaj instrukcję instalacji i użytkowania emulatora VB81
pobierz pliki CBI.P oraz CBI-DEMO.P do użytku z emulatorem VB81

Zwykł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ą.

INTERPRETER ZX81 CORAL BASIC

wersja 7.0
copyright Carlo Delhez, 1987 – 1992

Instrukcja w języku angielskim powstała 27 września 1992 roku
obecna wersja instrukcji to 0.04 z datą 92-12-08

Interpreter języka ZX81 Coral Basic był pierwotnie sprzedawany przez Terminal Software, Baarle Nassau, w Holandii. Oryginalna, holenderska instrukcja otrzymała numer ISBN 90-6883-041-4 i wydrukowano ją po raz pierwszy w październiku 1987 roku.

WPROWADZENIE

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:

  1. Kilka użytecznych narzędzi programowania, takich jak automatyczne numerowanie wierszy, usuwanie dużych bloków programu pojedynczym rozkazem, ochrona danych przed NEW, CLEARRUN, przenumerowywanie wierszy, itp.
  2. Możliwość stosowania struktur takich jak w Pascalu czy w C, co sprawia, iż polecenia takie jak GOTOGOSUB stają się zupełnie zbędne. Procedury z obustronnym przekazywaniem danych (do wymiany danych można stosować dowolną liczbę łańcuchów lub zmiennych liczbowych), pętle warunkowe (DO, LOOP, EXIT, WHILE, UNTIL), rozszerzone polecenie IF, które umożliwia warunkowe wykonywanie bloku programu oraz udostępnia również opcję ELSE.
    I oczywiście wszystkie te struktury można zagnieżdżać do woli.
  3. Efektywne przekazywanie danych dzięki rozkazom DATA, READRESTORE; łatwa obsługa stosu poprzez POP, PUSH, DUP, CLR STACK.
  4. Wygodne funkcje i polecenia dla programistów w kodzie maszynowym, takie jak DPOKE, DPEEKCALL, jak również unikalna możliwość dalszego rozszerzenia ZX81 BASIC o twoje własne procedury w kodzie maszynowym, które mogą odczytywać pożądane parametry bezpośrednio z języka BASIC.
  5. Szybsze i ulepszone możliwości graficzne.

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.

URUCHAMIANIE CBI

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 RAND USR 27400. Jeśli nie pojawi się kursor CBI, to wpisz najpierw POKE 16393,0 i spróbuj jeszcze raz. Jeśli wciąż nie będzie rezultatu, zresetuj ZX81 i przeładuj CBI.

UWAGA 2:

Jeśli chcesz zresetować CBI bez wychodzenia z niego, to wpisz polecenie POKE 16393,0. Odświeży ono wszystkie zmienne systemowe utrzymywane przez CBI.

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.

NOWE ROZKAZY

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:

AUTO x STEP y

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:

AUTO 50 STEP 10

generuje 50,60,70,...

AUTO 92 STEP 9999

generuje tylko 92.

BREAK sw

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 LOADSAVE.

CALL x

Wywołuje program maszynowy pod adresem x. CALL zastępuje RAND USR i podobne polecenia.

Przykład:

CALL 2602

czyści ekran (procedura w ROM dla CLS).

CHAR x

Zastępuje PRINT CHR$; lecz w trybie CBI automatycznie przewija ekran, gdy ten się zapełni. Dodatkowo obsługuje nowe nazwy poleceń w CBI.

Przykład:

10 FOR K=0 TO 255
20 CHAR K
30 NEXT K

drukuje cały zestaw znaków.

CLR STACK

Czyści cały stos. CLR STACK powinno być stosowane po przerwaniu podprogramu za pomocą klawisza BREAK, gdy nie chcesz wznowić wykonania. Pozwala zapobiec niechcianemu "wzrostowi stosu".

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.

CURSOR x

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".

DATA data_list

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

DEF PROC name

Rozpoczyna definicję procedury o nazwie "name". Definicja musi kończyć się poleceniem END PROC. Procedurę można wywołać 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 DEF PROC, to cały blok będzie pominięty (tj. nie zostanie wykonany). Definicje procedur można zagnieżdżać, lecz nie polecam tego rozwiązania. DEF PROC nie należy używać w trybie bezpośrednim.

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$

DELETE x TO y

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:

DELETETO 9999

usuwa cały program.

DO {[UNTIL|WHILE] bln }

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 DO...LOOP mogą być do woli zagnieżdżane.

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

DPEEK var,x

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.

DPOKE x,y

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.

DRAW TO x,y

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.

DUP var

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

EDIT x

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.

ELSE

Używane razem z  WHEN – doczytaj dalej tam.

END PROC {data_list}

Oznacza koniec definicji procedury. Gdy procedura jest wykonywana i za END PROC umieszczono data_list, to wskaźnik danych zostanie ustawiony na data_list, aby polecenie READ mogły zostać użyte do odczytu danych wyjściowych. Przykład użycia procedury z obustronną wymianą danych znajdziesz w opisie DEF PROC.

END WHEN

Oznacza koniec struktury WHEN – więcej szczegółów w opisie WHEN.

ERR MSGS sw

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

ERROR x

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

EXIT

Posiada dwa różne zastosowania:

  1. Jako polecenie bezpośrednie kończy CBI (niezbyt sensowna decyzja).
  2. W programie: wychodzi z bieżącej strukturyLOOP.

Przykład dla przypadku 2 znajdziesz w opisie rozkazu DO.

HOME

Szybka i ekonomiczna alternatywa dla PRINT AT 0,0

INDENT

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.

LINE var,x

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 FIRTS=16509, początek obszaru programów w języku ZX81 BASIC.

LOOP

Oznacza koniec struktury DO...LOOP – przykład użycia w opisie polecenia DO.

NOSTALGIC sw

Przełącza pomiędzy dwoma dostępnymi trybami edycji:

  1. NOSTALGIC ON : tryb normalny (tryb nostalgiczny).
  2. NOSTALGIC OFF : tryb CBI (edytor ekranowy Coral Basic).

ON/OFF

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

POP var

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.

PROTECT sw

Można używać do blokowania poleceń CLEAR, RUNNEW w celu ochrony programów i zmiennych przed przypadkową utratą.

Przykład:

PROTECT ON
LET
AMOUNT=99.95

CLEAR

PUSH x

Umieszcza liczbę x na szczycie stosu – zobacz na przykład w opisie POP.

READ {var|$var}

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.

  1. W połączeniu z DATARESTORE;
    Jest to najczęstsze zastosowanie – przykład znajdziesz w opisie DATA.
  2. W połączeniu z procedurami;
    Dane można przekazywać zarówno przy wywoływaniu procedury jak i przy powrocie z niej – zobacz na DEF PROCEND PROC.
  3. Za pomocą bezpośredniego odczytu lub ustawiania wskaźnika danych (o adresie 32732). Poniższy program jest przykładem tej metody:
10 RAND PI
20 RESTORE
30 DATA 0
40 DPOKE 32732,16514

50 READ X
60 PRINT X

RESEQ x:y,z

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 GOTOGOSUB (renumeracja w VB81 robi to!, ale powoduje wyjście z CBI, który należy ponownie uruchomić poleceniem RAND USR 27400), lecz biorąc pod uwagę liczne możliwości programowania strukturalnego oferowane przez CBI, nie wydaje się to być ograniczeniem (a jednak jest – uwaga od tłum.).

Przykład:

RESEQ 0:100,10

przenumerowuje program jako 100, 110, 120, ...

RESTORE {x}

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.

TRACE swv;{x}

W przypadku swv=1 program będzie śledzony podczas jego działania: przed wykonaniem kolejnych wierszy BASIC'u, w prawym górnym narożniku ekranu pojawi się numer wiersza oraz nastąpi małe opóźnienie (o długości proporcjonalnej do x). Na typowym ZX81 używaj x=2750 dla opóźnienia równego 1 sekundzie.

Przykład:

TRACE 1;2000

czeka około 0,72 sekundy.

UNDRAW TO x,y

Działa tak jak DRAW TO, lecz do rysowania punktów używa UNPLOT zamiast PLOT.

UNTIL/WHILE

Te zarezerwowane słowa kluczowe CBI mogą być użyte tylko w połączeniu ze strukturą DO...LOOP. Przykład użycia znajdziesz w opisie DO.

USER x

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.

WHEN bln DO

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
)
END WHEN

ELSE wraz z następującymi po nim wierszami programu jest opcjonalne.

Struktury WHEN...END WHEN mogą być do woli zagnieżdżane.

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)


do podrozdziału  do strony 

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: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.