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

MCODER II – kompilator języka ZX81 BASIC – instrukcja

Zanim rozpoczniesz czytanie tego rozdziału:

pobierz plik instalacyjny emulatora VB81
przeczytaj instrukcję instalacji i użytkowania emulatora VB81
zapoznaj się z instrukcją programowania w ZX81 BASIC
pobierz plik MCODER'a


Co to jest kompilator?

Podstawowym językiem programowania komputera ZX81 był dialekt o nazwie ZX81 BASIC. Był to tzw. język interpretowany. Mikroprocesor przy pomocy odpowiedniego programu (tzw. interpretera języka ZX81 BASIC zawartego w ROM) odczytywał kolejne wiersze programu, rozpoznawał zawarte w nich instrukcje i wykonywał odpowiednie procedury wewnątrz swojej pamięci ROM. W ZX81 proces ten nie należał do najszybszych. Istniało kilka powodów wolnej pracy programów w języku ZX81 BASIC. Najważniejsze wymieniłem poniżej:

I tutaj właśnie wkracza kompilator, czyli specjalny program, który tłumaczy kolejne wiersze programu w języku ZX81 BASIC na kod maszynowy wykonywany bezpośrednio przez mikroprocesor Z80. Kompilator dokonuje wielu optymalizacji generowanego kodu, np skoki są wykonywane pod właściwy adres – odpada problem wyszukiwania wiersza o zadanym numerze. Do zmiennych również jest dostęp poprzez adres, a nie poprzez nazwę. Obliczenia wykonuje się na liczbach całkowitych – jest to naturalna dla Z80 postać liczb, zatem działania wykonywane są bardzo szybko – dziesiątki lub nawet setki razy szybciej od działań na liczbach zmiennoprzecinkowych. W efekcie tych optymalizacji program skompilowany pracuje wielokrotnie szybciej od standardowego programu w języku ZX81 BASIC.

Nie ma róży bez kolców. Zwykle kompilator potrafi przetłumaczyć tylko niektóre konstrukcje języka ZX81 BASIC. Jest to cena, którą płacimy za wzrost szybkości pracy programu.

Instrukcja dla kompilatora MCODER II

Kompilator MCODER II dla ZX81

MCODER jest pierwszym, prawdziwym kompilatorem do użytku z ZX81. Został on napisany z dbałością o zajmowanie jak najmniejszego obszaru pamięci (nieco poniżej 4KB), aby pozostało jej jak najwięcej dla twoich programów.

Chociaż MCODER jest bardzo wyrafinowanym i wszechstronnym narzędziem, nie oczekuj od niego cudów, będziesz musiał się zaznajomić ze sposobem pracy tego kompilatora, aby uzyskać z niego jak największe korzyści.

Jak załadować MCODER'a?

MCODER zawsze musi być obecny w ZX81 zanim będziesz mógł wypróbować i wprowadzić jakikolwiek kod. Ładuje się go z taśmy przy pomocy LOAD "" (w naszym emulatorze MCODER znajduje się w katalogu instalacji VB81 i można załadować go poleceniem LOAD "MCODER2"). MCODER zawiera swoją własną procedurę testującą poprawność odczytu (nie dotyczy VB81, tylko taśmy magnetofonowej i prawdziwego ZX81) i jeśli zostanie załadowany z błędami, na ekranie pojawi się informacja o błędzie – wtedy należy załadować go jeszcze raz.

Po załadowaniu musisz pamiętać, iż MCODER wykorzystuje wiersze o numerach od 1 do 3 i nie może być usunięty.

Jak używać MCODER'a?

Używanie MCODER'a naprawdę jest bardzo prostą operacją. Przede wszystkim wprowadź program w języku BASIC, który chcesz skompilować. Ważne jest, aby program uruchomić i całkowicie przetestować przed skompilowaniem go, ponieważ w skompilowanym kodzie nie działa zatrzymywanie klawiszem spacji (ale powinno działać zatrzymywanie przyciskiem stopu w VB81). Przed napisaniem programu zaleca się mocno dokładnie przeczytać całą listę rozkazów, które MCODER potrafi kompilować i upewnić się, iż napisany program w języku ZX81 BASIC składa się tylko z nich.

Gdy jesteś zadowolony z działania swojego programu, możesz przystąpić do jego kompilacji przy pomocy polecenia LET L = USR 17300. Wtedy rozkazy zawarte w wierszach programu będą przesuwały się w górę ekranu w trakcie ich kompilacji. Jeśli MCODER natrafi na rozkaz, którego nie potrafi skompilować, wtedy powróci do systemu BASIC wyświetlając w negatywie literkę S w pobliżu błędnego rozkazu.

Możliwe błędy dotyczą:
  1. Użycia nieprawidłowych nazw zmiennych.
  2. Stosowania GOTO zmienna lub GOSUB zmienna, co nie jest dozwolone
  3. Niedozwolonego polecenia, takiego jak SAVE lub DIM A$(10)

Jeśli zostanie zgłoszony błąd, powinieneś go poprawić i skompilować program ponownie.

Na końcu kompilacji zakończonej sukcesem zobaczysz trzy rzeczy:

i) położenie końca kodu MCODER'a

ii) rozkaz niezbędny do uruchomienia twojego skompilowanego programu

iii) pytanie, czy chcesz uruchomić natychmiast skompilowany program (odpowiedz Y dla tak lub N dla nie).

Czy mogę skompilować program w basicu, który już mam na taśmie?

TAK – po prostu załaduj najpierw MCODER'a, a następnie załaduj swój program, który chcesz skompilować. Zastosowanie LET L = USR 32462 po załadowaniu twojego własnego programu umieści MCODER'a na odpowiednim miejscu w pamięci. Teraz możesz postępować tak, jak opisano powyżej.

Podkreślamy raz jeszcze, iż prawdopodobnie twój program będzie wymagał istotnych zmian, ponieważ jest mało prawdopodobne, aby był napisany w postaci dogodnej dla MCODER'a.

Które rozkazy skompiluje MCODER?

Uwaga: nazwy zmiennych mogą zawierać jedynie litery A-Z oraz cyfry 0-9. Działania arytmetyczne są ograniczone do czterech podstawowych operacji + – * /.

AND operator logiczny I dozwolony tylko w poleceniu IF

ABS jak w BASIC'u

CHR$ jak w BASIC'u

CLS jak w BASIC'u

CLEAR jak w BASIC'u

CODE jak w BASIC'u

COPY jak w BASIC'u

DIM A(V) w MCODER'ze dozwolone są tylko jednowymiarowe tablice oraz w czasie działania programu musi być dostępne co najmniej 2*V bajtów wolnej pamięci. W trakcie wykonania nie są sprawdzane zakresy indeksów, zatem upewnij się, iż twój program działa pod zwykłym ZX81 BASIC. Jeśli zdefiniujesz ponownie tablicę, to zostanie utworzona jej nowa wersja bez skasowania starej. Oznacza to, iż wielokrotne tworzenie tej samej tablicy doprowadzi do zapełnienia pamięci i błędu 4 (brak pamięci) przy przydzielaniu pamięci dla nowej tablicy lub łańcucha znakowego. Przestrzeń dla tablic i łańcuchów rozciąga się od STKEND do 256 bajtów poniżej RAMTOP. Przy ponownym uruchomieniu programu skompilowanego MCODER'em kasowane są wszystkie tablice, łańcuchy oraz zmienne, a zajmowana przez nie pamięć jest ponownie dostępna. Nie ma tablic z łańcuchami znaków.

FAST jak w BASIC'u z tą różnicą, iż MCODER nie powraca do trybu SLOW przy zapełnieniu ekranu, podczas INPUT lub podczas PAUSE.

FOR X = V TO U – zmienna X jest zwiększana z krokiem 1 od V do U. NEXT X kończy pętlę.
Uwaga
: (U – V) musi być mniejsze od 32767.

GOSUB N wywołuje wiersz N jako podprogram. Jeśli wiersz N nie istnieje, to idzie do następnego wiersza za N. Uwaga: N musi być dodatnią stałą całkowitą.

GOTO N wykonuje bezwarunkowy skok do wiersza N. Reszta jak dla GOSUB.

IF V op U THEN – gdzie op jest jednym z operatorów AND, OR, <>, =, <=, >= lub >, <.
Uwaga: V i U nie mogą różnić się o więcej niż 32767. AND i OR nie może być stosowane w operacjach łańcuchowych.

INKEY$ jak w BASIC'u

INPUT a lub A$ jak w BASIC'u. Dla liczb a dozwolony jest wiodący minus. Dla łańcuchów maksymalna długość wynosi 31 znaków. Brak trybu graficznego.

INT dodane w celu ułatwienia testowania programów w języku BASIC.

LEN A$ jak w BASIC'u z tym wyjątkiem, iż A$ nie może być poddana slicingowi

LET jak w BASIC'u

LPRINT jak w BASIC'u

NEW jak w BASIC'u

NEXT Zobacz opis FOR – NEXT

OR – operator logiczny LUB dozwolony tylko w poleceniach IF.

PAUSE V wstrzymuje wykonywanie programu na V/50 części sekundy w trybie SLOW. Nie przechodzi z trybu FAST do SLOW jak w Sinclair BASIC. Nie występuje mrugnięcie obrazu przy rozpoczęciu i zakończeniu PAUSE. V musi być dodatnie i mniejsze od 32768. Naciśnięcie SHIFT+EDIT (SHIFT+1PC) powoduje powrót do BASIC'a, dowolny inny klawisz powoduje wykonanie następnego polecenia.

PEEK jak w BASIC'u

PLOT jak w BASIC'u

POKE jak w BASIC'u

PRINT jak w BASIC'u

RAND jak w BASIC'u

REM ignorowane jak zwykle z wyjątkiem "REM?", które sprawdza, czy naciśnięto klawisze SHIFT+EDIT (SHIFT+1PC), a jeśli tak, to powraca do BASIC'az błędem D. Przydaje się to przy wychodzeniu z pętli nieskończonych (w VB81 mamy przycisk zatrzymywania programu).

RETURN powraca z podprogramu rozpoczętego przez GOSUB. Upewnij się, iż twoje instrukcje GOSUB zgadzają się z instrukcjami RETURN, ponieważ nie jest to sprawdzane.

RND zwraca liczbę pseudolosową pomiędzy 0 a 32767 (NIE jest takie samo jak w BASIC'u). Aby w BASIC'u otrzymać ten sam efekt, użyj USR 16550.

SCROLL jak w BASIC'u

SGN jak w BASIC'u

SLOW jak w BASIC'u

SQR pierwiastek całkowity

STOP – jeśli MCODER napotka w programie polecenie STOP, to zatrzyma w tym miejscu kompilację. Jeśli chcesz mieć STOP w środku swojego programu, to  polecenie LET L=USR 3292 da w wyniku błąd 9  i zatrzyma program.

Łańcuchy. Standardowo łańcuchy posiadają długość 32 znaków. Jeśli przekroczysz maksymalną długość łańcucha, to będziesz zapisywał poza nim to,  co tam akurat się znajdzie (albo inny łańcuch albo tablicę). Zaglądnij do punktu "Dalsze cechy MCODER'a". Slicing na łańcuchach nie może przybierać postaci A$( TO M) lub A$(M TO ). Nie są dostępne tablice łańcuchów.

UNPLOT jak w BASIC'u

USR jak w BASIC'u

Ulepszone przewijanie tekstu

W Sinclair BASIC'u, gdy drukowany tekst osiągnie spód ekranu, generowany jest błąd 5. W MCODER'ze, gdy wydruk tekstu osiągnie ten punkt, pojawi się znak ? w negatywie na spodzie ekranu po lewej stronie. Naciśnięcie CONT powoduje CLS i program wykonuje się dalej (przytrzymując palec na klawiszu CONT powodujesz, iż proces ten powtarza się w nieskończoność). Naciśnięcie SHIFT+EDIT (SHIFT+1 w PC) zatrzymuje program, klawisz D (SLOW) powoduje przewijanie treści ekranu z szybkością jednego wiersza na sekundę, naciśnięcie Z (COPY) tworzy kopię ekranu na drukarce ZX Printer. Dowolny inny klawisz od  opisanych powoduje przewijanie ekranu w górę, gdy klawisz jest wciśnięty i zatrzymanie przewijania, gdy klawisz zostanie zwolniony. Klawisze te można  dowolnie wybierać przy każdym wyświetleniu znaku "?".

DO ZAPAMIĘTANIA

Przy wykonywaniu skompilowanego programu MCODER zawsze musi być obecny, ponieważ zawiera on procedury wykorzystywane w czasie działania programu oraz procedury arytmetyczne. Jeśli masz zamiar mieszać program w BASIC'u z programem skompilowanym, to nie powinieneś używać rozkazu SCROLL, ponieważ niszczy on  regularność bufora obrazu, którą wymaga MCODER.

Dalsze cechy MCODER'a

Możesz określić miejsce umieszczenia kodu tworzonego przez MCODER, jeśli wejdziesz poleceniem: RAND USR 17287. Wtedy MCODER wyświetli zapytanie CODE, na które powinieneś odpowiedzieć wprowadzając adres, pod którym ma zostać umieszczony skompilowany kod. Aby poznać rozmiar kodu, skompiluj go pod adres 0. Istnieje również kilka innych użytecznych adresów. W twoim programie POKE 16417,N powoduje przewinięcie ekranu N razy bez wyświetlania znaku "?". Na końcu pod adresem 16417 znów znajdzie się zero. Adresy 16507 i 16508 zawierają obecną standardową długość łańcuchów (zwykle 32), którą można zmienić   za pomocą POKE. Wartość ta jest resetowana przy starcie programu. Adresy 16536 i 16537 są używane do zapobiegania przewijania wierszy u góry ekranu. Wartość przechowywana tam powinna być równa n*33, gdzie n
określa liczbę wierszy pozostawianych w spokoju. Adres 16535 określa automatyczne przewijanie wierszy podczas kompilacji. Jeśli zostanie tu wstawione zero, to kompilator będzie czekał, jak opisano powyżej w punkcie dotyczącym przewijania ekranu. Naciśnięcie klawisza spowoduje wyświetlenie wygenerowanego kodu.

Możesz potrzebować kilka części skompilowanego kodu. Osiąga się to przy pomocy następującej procedury:

  1. Skompiluj pierwszą część. Otrzymasz adres wejścia X. Teraz wpisz polecenie POKE X-6,1, które zmieni wiersz 2 w wiersz 1.
  2. Skompiluj część 2. Dostaniesz nowy punkt wejścia Y. RAND USR X wciąż działa i pozwala wejść do pierwszej części kodu a RAND USR Y daje dostęp do drugiej. Operację można powtarzać tyle razy, na ile pozwala rozmiar dostępnej pamięci. (UWAGA: użytkownicy z komputerami o pamięci większej niż 16KB – pod żadnym pozorem nie wolno dopuścić, aby jakakolwiek z części skompilowanego przez MCODER kodu przekroczyła granicę 32K).
  3. Jeśli chcesz mieć swój własny kod maszynowy, umieść go w instrukcji REM w wierszu nr 1. Pierwszy dostępny bajt będzie się znajdował pod adresem 20498. Twój skompilowany kod teraz nie będzie pod adresem 20500, lecz pod tym, który otrzymasz po kompilacji.

Program w języku BASIC można szybko usunąć z pamięci wykorzystując polecenie RAND USR 17281.

Przykład szybkości skompilowanego przez MCODER'a kodu

Wprowadź następujący, krótki program i skompiluj go:

100 FOR A=1 TO 50 
200 FOR B=1 TO 30 
300 PLOT A,B
400 NEXT
500 NEXT
600 STOP

Gdy program zostanie skompilowany, porównaj prędkość kodu skompilowanego z prędkością programu w języku BASIC, a naocznie zobaczysz korzyści ze stosowania MCODER'a.

MCODER II Copyright 1983 D.C. Threlfall

MCODER II

ZX81

(c) P.S.S. 1983

452, Stoney Stanton Road,
Coventry
CV6 5DG.
Telefon (0203) 667556


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.