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

ZX ASSEMBLER II – instrukcja

Co to jest asembler?

Najkrócej mówiąc asembler jest językiem procesora. Instrukcje procesora są reprezentowane w asemblerze przez tzw. mnemoniki, czyli kilkuliterowe nazwy, które człowiek łatwo zapamiętuje. Chodzi o to, iż faktyczne instrukcje wykonywane przez mikroprocesor są kodami binarnymi. Na przykład coś takiego:
001101011
111010110
011010111
011110101
...

Kody instrukcji umieszczane są w kolejnych komórkach pamięci, skąd mikroprocesor pobiera je, rozpoznaje operacje do wykonania i wykonuje te operacje. Kody binarne są słabo (czytaj wcale) czytelne dla ludzi. Jednakże to ludzie tworzą programy dla procesorów. Zatem zamiast stosowania niewygodnych i nieczytelnych kodów binarnych, stosują oni tzw. nazwy symboliczne. Przy odpowiedniej wprawie nazwy symboliczne są łatwe do zapamiętywania i analizowania. Każda instrukcja procesora posiada taką nazwę.

Na przykład:

LD   A,1       ; załaduj do rejestru akumulatora A liczbę 1
CALL PRINT_A   ; wywołaj procedurę pod adresem symbolicznym PRINT_A
ADD  HL,BC     ; do pary rejestrów HL dodaj zawartość pary rejestrów BC

itd.

Mnemoniki są dużo bardziej czytelne od kodów binarnych. Asembler tłumaczy mnemoniki na ich odpowiedniki binarne – to jest jego główna funkcja. Kod wynikowy z asemblera może być już bezpośrednio wykonany przez mikroprocesor. Zaletą programowania w asemblerze jest niesamowita szybkość programów. Wadą – cóż, trzeba dużo wiedzieć o samym komputerze i jego budowie.

Instrukcja dla użytkownika ZX ASSEMBLER II

obrazek
(C) ARTIC COMPUTING LTD

ZAWARTOŚĆ

WPROWADZENIE
OGÓLNY OPIS
ZACZYNAMY
ZAPIS PROGRAMÓW
EDYTOR
SKŁADNIA POLECEŃ ASEMBLERA
    ETYKIETY
    TEKST
    LICZBY
    SEPARATORY
    NIESTANDARDOWE MNEMONIKI
    KOMENTARZE
ASEMBLACJA
    BŁĄD ETYKIETY
    BŁĄD SKOKU WZGLĘDNEGO
    BŁĄD PRZESUNIĘCIA
    BŁĄD LICZBY
    BRAK PAMIĘCI
    BŁĄD STOSU
    BŁĄD SKŁADNIOWY
MONITOR
    ROZKAZY
UŻYTECZNE PROCEDURY W ASEMBLERZE
WSKAZÓWKI DLA POCZĄTKUJĄCYCH
REGUŁY
POLECANA LITERATURA
ZESTAW ROZKAZÓW MIKROPROCESORA Z80

WPROWADZENIE

Celem programu ZX ASEMBLER jest ułatwienie całego procesu programowania w kodzie maszynowym na komputerach ZX81. Udostępnia on wszechstronne i łatwe w użyciu funkcje, przy jednoczesnym zachowaniu zdumiewająco dużego obszaru pamięci RAM dostępnej dla użytkownika. Program zajmuje 7K i mieści się w górnej połowie obszaru ROM (chodzi oczywiście o VB81), zatem w żaden sposób nie wpływa na system BASIC, który pracuje tak, jakby asemblera w ogóle nie było.

OGÓLNY OPIS

W programie występują dwie główne sekcje:

  1. EDYTOR/ASEMBLER. Przy pomocy polecenia EDIT możesz wprowadzać i edytować swój kod asemblerowy, a następnie skompilować go poleceniem ASSEMBLE. EDYTOR został zaprojektowany specjalnie do wprowadzania kodu asemblerowego: używa on przewijania ekranu w górę i w dół, wyszukiwania tekstów, pozwala na wstawianie i usuwanie znaków oraz wierszy, posiada funkcję automatycznego powtarzania wszystkich klawiszy oraz system tworzenia odstępów przy etykietach i sterowania kursorem w czterech kierunkach. W wierszu może być do 31 znaków. ASEMBLER jest bardzo wszechstronny i udostępnia pełną listę mnemoników wraz z etykietami, pozwala na wprowadzanie liczb szesnastkowych i dziesiętnych oraz tekstu i komentarzy.
  2. MONITOR. Udostępnia funkcje testowania i uruchamiania twojego programu w kodzie maszynowym. Udostępnia on również kilka użytecznych podprogramów (takich jak odczyt danych z klawiatury, wyświetlanie na ekranie... itp.).

Celem tej instrukcji jest wyjaśnienie sposobów pracy z EDYTOREM/ASEMBLEREM oraz z MONITOREM jak również przekazanie wskazówek i procedur dla początkujących oraz listy zbioru instrukcji mikroprocesora Z80.

ZX ASEMBLER jest potężnym oprogramowaniem i używany poprawnie może zwiększyć niesamowicie prędkość działania twoich programów.

ZACZYNAMY

ZX ASEMBLER jest automatycznie ładowany w momencie startu emulatora VB81. Zostaje on umieszczony w górnej połowie obszaru pamięci ROM, który rozpoczyna się od adresu 2000 szesnastkowo lub 8192 dziesiętnie. Ten obszar pamięci ZX81 jest zwykle chroniony przed zapisem podczas symulacji, chociaż możesz zezwolić na takie zapisy, lecz wtedy kod programu nie będzie bezpieczny i może zostać uszkodzony. Ustaw tę opcję tylko wtedy, gdy nie planujesz korzystania ze swojego asemblera.

Aby uruchomić ten program, musisz wpisać: RAND USR 8192 – program krótko się przedstawi. Jest to TRYB ROZKAZÓW dla ASEMBLERA. Wszystkie rozkazy są uruchamiane z tego miejsca przez POJEDYNCZE NACIŚNIĘCIE KLAWISZA. Aby powrócić do systemu BASIC, wpisz dwukrotnie Q (QUIT = REZYGNACJA).

W wersji II ZX ASEMBLERA dodano funkcję zwracania adresu startowego kodu. Jeśli wywołasz asembler w sposób następujący:

LET S=USR 8129

to zmienna S będzie zawierała adres twojego kodu po asemblacji. Jeśli nie wykonasz asemblacji kodu, to w S będzie umieszczony adres startowy ZX ASEMBLERA.

ZAPIS PROGRAMÓW

Aby zapisać skończony lub niekompletny program, naciśnij dwukrotnie Q w celu powrotu do systemu BASIC. Odkryjesz wtedy program BASIC składający się z dwóch wierszy, plus to, co wcześniej wprowadziłeś.

1 REM
2 REM

Wiersz nr 1 zawiera kod maszynowy. Wiersz nr 2 zawiera program źródłowy w asemblerze (bądź ostrożny przy przenumerowywaniu wierszy w VB81 – numery tych dwóch pierwszych wierszy powinny pozostać niezmienione). Na tym etapie możesz życzyć sobie usunąć wg potrzeby dowolny z tych wierszy i zapisać program w zwykły sposób (zostanie on umieszczony w katalogu taśmy ustawionym w VB81). Gdy ASEMBLER jest obecny w ROM, możesz w dowolnej chwili załadować ten program z powrotem i go dokończyć lub kontynuować pracę nad nim. Jeśli nie skończyłeś jeszcze swojego programu, możesz usunąć kod wynikowy (wiersz nr 1) i zapisać jedynie kod źródłowy programu. Najlepszym rozwiązaniem jest tworzenie kopii bezpieczeństwa kodu źródłowego dla przyszłych poprawek.

EDYTOR

Gdy wywołasz EDYTOR naciskając klawisz E, zostanie wyświetlony ekran z tekstem dotąd wprowadzonym. Będziesz znajdował się albo w miejscu, gdzie byłeś ostatnio przy wyjściu z EDYTORA, albo w miejscu wystąpienia błędu przy asemblacji (zobacz na ASEMBLACJĘ). Oprócz prostego wprowadzania tekstu EDYTOR udostępnia użytkownikowi kilka funkcji. Wszystkie te funkcje otrzymujemy z naciśniętym klawiszem SHIFT.

Funkcje:

Naciśnij:

SHIFT 6, aby przesunąć kursor w dół.
SHIFT 7,
aby przesunąć kursor w górę.
SHIFT 8, aby przesunąć kursor w prawo.
SHIFT 5, aby przesunąć kursor w lewo.
SHIFT 0,
aby wymazać ostatni znak.
SHIFT 9,
aby wstawić znak na bieżącej pozycji.
SHIFT A,
aby wstawić etykietę. Przesuwa kursor do lewej krawędzi ekranu. Dzieła jedynie wtedy, gdy kursor znajduje się na 7-mej pozycji znakowej i w wierszu nie ma jeszcze etykiety.
SHIFT D
usuwa bieżący wiersz.
SHIFT E
wstawia wiersz na bieżącej pozycji kursora.
SHIFT G drukuje tekst na drukarce ZX Printer od bieżącej pozycji kursora.
SHIFT Q przerywa wyszukiwanie, przywraca wiersz oraz wychodzi z edytora. Załóżmy, iż w wierszu popełnisz błąd, SHIFT Q przywróci oryginalną postać tego wiersza.
SHIFT S szuka wystąpienia tekstu od pozycji kursora. Naciśnij SHIFT A, aby wyszukać etykietę. Jeśli obiekt nie zostanie znaleziony, to kursor pozostaje na swojej pozycji.
SHIFT T umieszcza kursor na początku tekstu

Wszystkie klawisze posiadają funkcję autopowtarzania po upływie 1 sekundy.
EDYTOR pozwala wprowadzić w wierszu maksymalnie 31 znaków. Jeśli skończy się pamięć, to powrócisz do TRYBU ROZKAZÓW, gdzie pojawi się wiadomość OUT OF MEMORY (BRAK PAMIĘCI): wiersz, który właśnie wpisywałeś, zostanie usunięty, abyś mógł powrócić do EDYTORA i zdobyć nieco miejsca. Jeśli ma być zmieniona etykieta, to SHIFT A nie przesunie kursora w lewo, zamiast tego użyj SHIFT 5.

SKŁADNIA ASEMBLERA

Po przedstawieniu się programu otrzymasz do wyboru kilka rozkazów dla monitora, lecz najpierw zbadajmy Edytor/Asembler.

Aby wejść do Edytora, wpisz E. Ekran zostanie wyczyszczony i będzie wyświetlał graficzną spację ustawioną w 7-mej kolumnie od lewej krawędzi ekranu. Teraz jesteś gotowy do wprowadzania swojego programu w asemblerze.

ETYKIETY

Asembler akceptuje etykiety zbudowane z liter i cyfr, rozpoczynające się od litery, a po nich może bezpośrednio występować:

= stała lub język asemblera lub spacja

Aby wprowadzić etykietę, wpisz SHIFT A, a kursor przesunie się do lewej krawędzi ekranu. Otrzymujemy w ten sposób efekt wcięć w wierszach asemblera, które ułatwiają ich odczytywanie.

Przykład: procedura obliczania punktów w grze

SCORE1 = 5000
       JR BEGIN       ;skocz na początek.
SCORE  DB 00,00       ;dwa bajty na punktację.
BEGIN  LD HL,(SCORE)  ;pobierz punkty.
       INC HL         ;zwiększ je
       LD (SCORE),HL  ;zapisz nowe punkty
       LD (SCORE1),HL ;zapisz kopię pod 5000 HEX
       RET

Do etykiety można odwołać się z przesunięciem od -9 do +9. Np:

       LD A,(PTR+4)
       ...
PTR    DB 1,2,3,4,5,6

Rejestr A będzie zawierał 5. Jeśli nie zostanie podane przesunięcie, to  wynosi ono 0.

  A = 1

Uwaga: Odradzamy stosowania nazw takich samych jak nazwy rejestrów, np. BC, lub poprawne liczby szesnastkowe, np. ABCD, bo albo otrzymasz wiadomość o błędzie przy skokach względnych, albo konsekwencje będą potencjalnie katastrofalne.

TEKST

Jeśli chcesz wstawić jakiś tekst do swojego programu w asemblerze, to  użyj dyrektywy DEFM/DM. Sam tekst musi być umieszczony w cudzysłowach (SHIFT P lub klawisz "VB81).

Przykład: wydruk wiadomości

       CALL PRINT
       DM "TUTAJ WPROWADZAMY TEKST"
       DB FF  ;zaznaczamy koniec tekstu

Przykład: tekst w asemblerze

       LD A,0        ;ustaw wartość początkową
CHECK  INC A         ;dodaj do niej 1
       CP "*"        ;sprawdź, czy jest *
       JR NZ CHECK   ;jeśli nie, wróć do CHECK
       CALL PRINTA   ;wydrukuj znak
       CALL PRINT    ;wydrukuj tekst
       DM " JEST ZNAKIEM *"
       DB FF

Eliminuje to potrzebę znajomości kodów znaków.

LICZBY

Asembler standardowo używa liczb szesnastkowych (o podstawie 16)

 8 bitowych od 0 do FF
16 bitowych od 000 do FFFF (musi być 3 lub 4 cyfry)

Liczby dziesiętne muszą być poprzedzone znakiem '+' lub '-'. Są one zawsze liczbami 16 bitowymi.

np. +1 jest reprezentowane jako 0001.

Asembler jest dosyć inteligentny w traktowaniu liczb tak, jak tego wymaga sytuacja – czasem jako 8 bitowe, a czasem jako 16 bitowe.

Przykład: ładowanie etykiety

TEST = +64
...
LD HL,TEST  ; 16 bit oczekiwane
LD A,TEST   ;  8 bit oczekiwane

Etykieta TEST jest traktowana w zaznaczonych miejscach odpowiednio jak liczba 16 bitowa lub 8 bitowa. Jednakże jeżeli Asembler oczekuje liczby 8 bitowej, a liczba ma wartość większą od FF lub +255, to w czasie asemblacji powstanie błąd NUMBER ERROR.

Przykład: liczby

LD HL,1    ;OK
LD A,+13   ;OK
LD A,101   ;Błąd

Jeśli chcesz umieścić w rejestrze liczbę, której nazwa jest taka sama jak nazwa rejestru, musisz poprzedzić ją cyfrą 0.

Przykład

LD A,B    ;umieszcza rejestr B w A
LD A,0B   ;umieszcza liczbę B w A

Jeśli chcesz umieścić parę liczb wewnątrz swojego kodu, użyj dyrektywy DEFB/DB dla liczb 8 bitowych i dyrektywy DEFW/DW dla liczb 16 bitowych. Każda z tych dyrektyw przyjmuje liczby rozdzielone przecinkami.

Przykłady: liczby w pamięci

TAB1  DB +15,+24,-43,0       ;liczby 8 bitowe
TAB2  DW FA99,+16333,+25872  ;liczby 16 bitowe

Aby zarezerwować miejsce w pamięci na jakikolwiek cel, powiedzmy 100 bajtów, użyj dyrektywy DEFS/DS.

Przykład:

BUF    DS 100 ;masz do swojej dyspozycji 100 bajtów

SEPARATORY

Każda instrukcja może być rozdzielana za pomocą spacji lub końca wiersza.

Spacji może być więcej niż jedna za wyjątkiem poniższych instrukcji, które należy wprowadzać dokładnie tak, jak przedstawiono poniżej:

LDA_A,I       _ oznacza jedną spację
LDA_I,A
LDA_R,A
LDA_A,R
EX_AF         ≡ EX AF,AF'
EX_DE,HL
EX_(SP),HL

NIESTANDARDOWE MNEMONIKI

Następujące mnemoniki są niestandardowe dla Z80

EX AF    ≡  EX AF,AF'
IM0 zamiast IM 0
IM1 zamiast IM 1
IM2 zamiast IM 2 

Instrukcje JPJR nie mają przecinków, np. JR NZ +7

KOMENTARZE

Komentarze należy poprzedzać średnikiem ;. Tekst za nim zostanie zignorowany przez Asembler.

ASEMBLACJA

Po wprowadzeniu swojego kodu w asemblerze jesteś gotowy do przeprowadzenia jego asemblacji. Wyjdź z edytora używając SHIFT Q.

Aby skompilować swój program, wpisz A i pojawi się napis ASSEMBLE. Teraz naciśnij NEWLINE i twój program zostanie przetłumaczony na kod maszynowy. Program wynikowy jest umieszczany pod adresem 4084 szesnastkowo lub 16516 dziesiętnie. To będzie wiersz z REM o numerze 1, gdy powrócisz do systemu BASIC. Jeśli uruchomiłeś ASEMBLER poleceniem

LET S=USR 8192

to zmienna S zawiera adres startowy twojego kodu po powrocie z Asemblera do systemu BASIC. Aby go uruchomić, wpisz

RAND USR S

Na początku swojego programu możesz użyć dyrektywy ORG n, aby utworzyć kod uruchamiany pod adresem n. Kod wciąż zostanie umieszczony przez asembler w wierszu nr 1, lecz możesz go przenieść w miejsce docelowe przy pomocy rozkazu COPY dostępnego w Asemblerze.

Jeśli zrobisz błąd, to zostanie wyświetlony odpowiedni komunikat. Wpisanie E wyświetli tekst programu na wierszu, w którym wystąpił błąd.

Możesz otrzymać poniższe komunikaty błędów:

BŁĄD ETYKIETY

  1. Niezdefiniowana etykieta.
  2. Nieprawidłowa definicja etykiety, np. rozpoczynająca się cyfrą. Jeśli źle wpiszesz mnemonik, to prawdopodobnie otrzymasz ten błąd, ponieważ asembler sądzi, że chcesz uzyskać dostęp do etykiety.

BŁĄD SKOKU WZGLĘDNEGO

Występuje przy skoku względnym poza dozwolony zasięg, tj. skok jest do adresu odległego o > +127 lub < -128 bajtów.

BŁĄD PRZESUNIĘCIA

  1. Ładowanie rejestru etykietą z przesunięciem.
    np. LD HL,(FRED +10)
        
    dozwolone tylko ± 9
  2. Użycie rejestrów indeksowych ze zbyt dużym przesunięciem.
        IX,IY > +127 lub < -128

BŁĄD LICZBY

Powstaje, gdy próbujesz użyć zbyt dużej liczby dla danej instrukcji.
np. LD A,1000

BRAK PAMIĘCI

  1. W Edytorze gdy program asemblerowy jest zbyt duży.
  2. Podczas asemblacji, gdy nie ma dosyć miejsca na kompilację programu.

BŁĄD STOSU

Na końcu wykonania gdy ze stosu pobrano lub pozostawiono na nim zbyt wiele (zobacz na następne uwagi).

BŁĄD SKŁADNI

Zgłasza wszystkie pozostałe błędy.
np. ADD A,*
Podczas pracy nad procedurami nie ma konieczności umieszczania RET na końcu twojego programu, ponieważ Asembler kończy procedurę skokiem do Monitora. Oznacza to, że jeśli występuje błąd Stosu, to system się nie zawiesi. RET na końcu twojego programu powraca do systemu BASIC. Aby uruchomić swój program maszynowy, naciśnij 'R', a pojawi się napis RUN FROM ADDR 4084 (URUCHOMIENIE SPOD ADRESU 4084 – początek procedury w kodzie maszynowym). Naciśnij NEWLINE, aby uruchomić swój kod maszynowy. Ten adres startowy można zmienić wpisując go ręcznie.
UWAGA: Jeśli został zgłoszony błąd podczas kompilacji, to program nie może zostać uruchomiony, ponieważ jest tylko częściowo skompilowany albo wcale
!

MONITOR

ZX ASEMBLER udostępnia również użyteczny Monitor, który pozwala ci testować, wyszukiwać błędy i uruchamiać twoje programy w kodzie maszynowym. Wszystkie rozkazy są dostępne po POJEDYNCZYM naciśnięciu określonego klawisza a wiele z nich może dodatkowo wymagać szesnastkowego adresu 4 cyfrowego. Aby wprowadzić ten adres, naciśnij NEWLINE. Każdy rozkaz można anulować naciskając Q przed wciśnięciem NEWLINE.

ROZKAZY

A    ASEMBLACJA programu
C   Kopiuje blok pamięci z jednego miejsca w inne
COPY BLOCK: FIRST ADDR...  Adres początku kopiowanego bloku
LAST ADDR...  Adres końca kopiowanego bloku
TO ADDR...  Adres docelowy
M   Włącza tryb edycji pamięci, w którym możesz bezpośrednio
wprowadzać kod maszynowy. Po lewej stronie ekranu biegnie
w dół kolumna 24 2-bajtowych adresów, obok których znajduje
się kolumna z zawartością każdego z tych adresów. Kursor
umieszczony w połowie kolumny wskazuje adres komórki
pamięci, którą możesz zmieniać. Aby to zrobić, wpisz liczbę
szesnastkową i naciśnij NEWLINE. Jeśli przed naciśnięciem
NEWLINE naciśniesz Q, to wprowadzenie wpisanego numeru
do komórki zostanie anulowane. Rozkazy w tym trybie są
następujące:
J   oblicza przesunięcie dla skoków względnych. Wprowadź
ostatnie dwie cyfry adresu docelowego, naciśnij NEWLINE,
a przesunięcie zostanie wprowadzone na pozycji kursora.
L przesuwa kursor w dół pamięci w sposób ciągły
(powtarzane NEWLINE)
NEWLINE przesuwa kursor w dół o pojedynczą komórkę.
O przesuwa kursor w górę w sposób ciągły (powtarzane P)
P przesuwa kursor w górę o jedną komórkę.
R powtarza wprowadzanie liczby: wpisz swoją liczbę
i naciśnij NEWLINE. Zawartość dowolnego adresu, na który
wskazuje kursor, zostanie zmieniona na ostatnio
wprowadzoną liczbę – można stosować dowolne
polecenia sterujące ruchami kursora. Przerwanie
powtarzania liczby następuje po naciśnięciu Q.
I   przeglądanie i modyfikacja rejestrów. Wyświetla pary
rejestrów BC, DE, HLAF. F jest również wyświetlany w sposób
binarny z oznaczeniem każdego znacznika (S=znak, Z=zero,
H=przeniesienie pomocnicze, O=parzystość/nadmiar,
N=ujemne lub minus, C=przeniesienie)
. Gdy uruchamiasz
program w kodzie maszynowym, to wyświetlone tu wartości
zostają umieszczone w odpowiednich rejestrach, a przy
powrocie wartości rejestrów są zapamiętywane.
Wprowadzona liczba szesnastkowa zostanie umieszczona
w rejestrze wskazywanym przez kursor. Aby wprowadzić
liczbę i przesunąć kursor, naciśnij NEWLINE.
S   SEARCH FOR... wartość 2 bajtowa, która ma zostać wyszukana
FROM ADDR... adres, od którego rozpoczną się poszukiwania.
Przeszukuje pełne 64K pamięci z wyjątkiem obszaru stosu.
Wyświetla adres pierwszego wystąpienia poszukiwanej liczby.
Jeśli naciśniesz M, nastąpi przejście bezpośrednio do trybu
edycji pamięci z kursorem ustawionym na znalezionym adresie.
Jeśli naciśniesz Q, powrócisz do trybu wprowadzania rozkazów.
Napis 'NOT FOUND' pojawia się, gdy dana liczba nie występuje
w pamięci.
R   uruchamia kod maszynowy spod adresu 4084 (16516 dziesiętnie)
lub spod adresu, który ty wprowadzisz. Powrót do monitora
wykonywany jest instrukcją skoku umieszczaną przez asembler
na końcu twojego kodu. Adres skoku jest równy 372F. Przed
uruchomieniem programu ekran jest wymazywany. Przy
powrocie do monitora czeka on na naciśnięcie dowolnego
klawisza przed wyczyszczeniem ekranu i przejściem do trybu
wprowadzania rozkazów.
V   wyświetla numer wersji oraz datę modyfikacji pakietu
ZX ASEMBLER.
UWAGA: naciśnięcie Q (lub SHIFT Q w EDYTORZE) zawsze przerywa to, co robisz w momencie, gdy asembler oczekuje na naciśnięcie jakiegoś klawisza.

UŻYTECZNE PROCEDURY W ASEMBLERZE

Poniżej przedstawiam kilka prostych procedur, których możesz używać w swoich programach asemblerowych. Ich kod jest dobrze skomentowany.
Pobierz plik taśmy: library.p zawierający te procedury do użycia z programem ZX ASEMBLER 2
INKEY     odczytuje klawiaturę ZX81 i zwraca kod naciskanego klawisza w A.
Jeśli nie jest naciskany żaden klawisz, zwraca wartość 1.
Wszystkie rejestry są zachowywane z wyjątkiem AF.
FILL   wypełnia cały ekran ZX81 kodem znaku przekazanym w A. Wszystkie
rejestry są zachowywane. Uwaga: kod powinien być poprawnym
kodem znaku ZX81, inaczej system może się zawiesić.
PRDE   wyświetla tekst umieszczony za wywołaniem tej procedury w wierszu D
i kolumnie E. Tekst powinien kończyć się kodem FF. Nie zachowuje
rejestrów HL, DEAF. Przykład:
      LD D,+10     ; wiersz 10 – liczony od 0!
      LD E,+14     ; kolumna 14 – również od 0!
      CALL PRDE    ; drukuj tekst na 10,14
      DM "HELLO"   ; tekst do wydruku
      DB FF        ; znacznik końca tekstu
      ...          ; kontynuacja programu
ATDE   oblicza adres wiersza D i kolumny E w buforze obrazowym DFILE
i zwraca go w HL. Zachowuje wszystkie rejestry.
INKEY PUSH BC ; zachowaj rejestry na stosie
      PUSH DE
      PUSH HL
      LD BC,(4025) ; załaduj kody skanowania
      LD D,C       ; sprawdź, czy jest wciśnięty klawisz
      INC D
      LD A,1       ; załóż, że nie
      JR Z INK1    ; jeśli nie, to pomiń wywołanie ROM
      CALL 07BD    ; zdekoduj kod klawisza
      LD A,(HL)    ; pobierz kod
INK1  POP HL       ; odtwórz rejestry
      POP DE
      POP BC
      RET          ; powróć z kodem w A
	
FILL  PUSH BC      ; zachowaj używane rejestry
      PUSH HL
      LD HL,(400C) ; ustaw HL na DFILE
      INC HL       ; pomiń startowy znak NEWLINE
      LD C,18      ; 24 wiersze do wypełnienia
FILL1 LD B,20      ; w każdym po 32 znaki z A
FILL2 LD (HL),A    ; wypełnij jeden wiersz
      INC HL
      DJNZ FILL2
      LD (HL),+118 ; umieść NEWLINE na kocu wiersza
      INC HL       ; przejdź do następnego wiersza
      DEC C        ; jeśli nie koniec, kontynuuj
      JR NZ FILL1  ; z resztą ekranu
      POP HL       ; odtwórz rejestry
      POP BC
      RET          ; i powróć
	
PRDE  CALL ATDE    ; oblicz pozycję DE w HL
      POP DE       ; ustaw DE na początek tekstu
PRDE1 LD A,(DE)    ; pobierz znak
      INC DE       ; następna pozycja w tekście
      CP FF        ; sprawdź znacznik końca tekstu
      JR NZ PRDE2  ; jeśli nie koniec, kontynuuj
      EX DE,HL     ; inaczej skocz tuż za znacznik
      JP (HL)      ; końca tekstu
PRDE2 LD (HL),A    ; umieść znak w DFILE
      INC HL       ; przesuń się na następną pozycję
      JR PRDE1     ; kontynuuj drukowanie
	
ATDE  PUSH BC      ; zachowaj używane rejestry
      PUSH DE
      LD H,0
      LD L,D       ; HL = D
      LD B,H
      LD C,L       ; BC =   D
      ADD HL,HL    ; HL =  2D
      ADD HL,HL    ; HL =  4D
      ADD HL,HL    ; HL =  8D
      ADD HL,HL    ; HL = 16D
      ADD HL,HL    ; HL = 32D
      ADD HL,BC    ; HL = 33D
      LD D,0       ; DE = E
      ADD HL,DE    ; HL = 33D + E
      EX DE,HL     ; DE = 33D + E
      LD HL,(400C) ; HL = DFILE
      INC HL       ; HL = DFILE+1
      ADD HL,DE    ; HL = DFILE+1+33D+E
      POP DE       ; odtwórz rejestry
      POP BC
      RET          ; powróć z adresem w HL

WSKAZÓWKI DLA POCZĄTKUJĄCYCH

NIE WPADAJ W PANIKĘ!!!

Kod maszynowy nie jest tajemniczą sztuką uprawianą przez dzieci-geniusze, w których żyłach zamiast krwi płyną elektrony, jest to po prostu inny sposób programowania komputerów, tak jak BASIC. Musisz być bardziej ostrożny niż z BASIC'em, ponieważ przy uruchamianiu kodu maszynowego nie pojawią się komunikaty błędów. Jeśli zrobisz grubą pomyłkę, to zwykle system się zawiesi. Jednakże wykorzystując Asembler i Monitor oraz przestrzegając kilku prostych reguł, wkrótce będziesz mógł pisać, testować i uruchamiać z sukcesem kod maszynowy.

REGUŁY

  1. Zachowuj swoje otoczenie. W podprogramach umieszczaj używane rejestry na stosie rozkazami PUSH. Przed powrotem odtwarzaj je ze stosu w kolejności odwrotnej do ich zapisu.

    e.g.   LD A,27    ; wpisz wartość do A
           PUSH HL    ; zapisz HL na stosie
           PUSH BC    ; zapisz BC na stosie
          CALL PRINT ; pisz znak z A        POP
    BC     ; odtwórz BC ze stosu        POP HL     ; odtwórz HL ze stosu
  2. Wszystko to, co zostało umieszczone na stosie w danym podprogramie, musi być w tym samym podprogramie zdjęte ze stosu przed wykonaniem RET.
    Załóżmy, iż FRED jest podprogramem drukującym znak.

    FRED   LD A,17    ; wpisz wartość do A
           PUSH AF    ; zapisz AF na stosie
           CALL FRED  ; drukuj znak
           RET        ; powrót?

    Ta procedura spowoduje zablokowanie komputera, ponieważ przed wykonaniem RET należy wykonać POP AF.

  3. Pamiętaj, w którym miejscu pamięci znajduje się twój stos. Nie umieszczaj swoich procedur zbyt blisko stosu, ponieważ rosnąc może on  zniszczyć część ich kodu.
  4. Skoki względne posiadają ograniczenie zasięgu w stosunku do bieżącej pozycji:
            + 127 bajtów w przód – 128 bajtów wstecz
  5. Czytaj jak najwięcej informacji na temat programowania.
  6. Umieszczaj w podprogramach tyle, ile się rozsądnie da umieścić.

POLECANA LITERATURA

W języku polskim.

W języku angielskim:
Machine
Language programming made simple for your Sinclair.
Understanding your ZX81 ROM, Melbourne House
Programming the Z80, Rodney Zaks, Sybex
Z80
Instruction Handbook, Intel

ZESTAW ROZKAZÓW MIKROPROCESORA Z80

n wartość 1 bajtowa
nn – wartość 2 bajtowa
nnLO – mniej znaczący bajt wartości 2 bajtowej
nnHI – bardziej znaczący bajt wartości 2 bajtowej
d – przesunięcie – wartość 1 bajtowa ze znakiem
Instrukcja Kod
ADC A,(HL) 8E
ADC A,(IX+d) DD 8E d
ADC A,(IY+d) FD 8E d
ADC A,A 8F
ADC A,B 88
ADC A,C 89
ADC A,D 8A
ADC A,E 8B
ADC A,H 8C
ADC A,L 8D
ADC A,n CE n
ADC HL,BC ED 4A
ADC HL,DE ED 5A
ADC HL,HL ED 6A
ADC HL,SP ED 7A
ADD A,(HL) 86
ADD A,(IX+d) DD 86 d
ADD A,(IY+d) FD 86 d
ADD A,A 87
ADD A,B 80
ADD A,C 81
ADD A,D 82
ADD A,E 83
ADD A,H 84
ADD A,L 85
ADD A,n C6 n
ADD HL,BC 09
ADD HL,DE 19
ADD HL,HL 29
ADD HL,SP 39
ADD IX,BC DD 09
ADD IX,DE DD 19
ADD IX,HL DD 29
ADD IY,BC FD 09
ADD IY,DE FD 19
ADD IY,HL FD 29
ADD IY,SP FD 39
ADD IX,SP DD 39
AND (HL) A6
AND (IX+d) DD A6 d
AND (IY+d) FD A6 d
AND A A7
AND B A0
AND C A1
AND D A2
AND E A3
AND H A4
AND L A5
AND n E6 n
BIT 0,(HL) CB 46
BIT 0,(IX+d) CB DD 46 d
BIT 0,(IY+d) CB FD 46 d
BIT 0,A CB 47
BIT 0,B CB 40
BIT 0,C CB 41
BIT 0,D CB 42
BIT 0,E CB 43
BIT 0,H CB 44
BIT 0,L CB 45
BIT 1,(HL) CB 4E
BIT 1,(IX+d) CB DD 4E d
BIT 1,(IY+d) CB FD 4E d
BIT 1,A CB 1F
BIT 1,B CB 48
BIT 1,C CB 49
BIT 1,D CB 4A
BIT 1,E CB 4B
BIT 1,H CB 4C
BIT 1,L CB 4D
BIT 2,(HL) CB 56
BIT 2,(IY+d) CB FD 56 d
BIT 2,(LY+d) CB DD 56 d
BIT 2,A CB 57
BIT 2,B CB 50
BIT 2,C CB 51
BIT 2,D CB 52
BIT 2,E CB 53
BIT 2,H CB 54
BIT 2,L CB 55
BIT 3,(HL) CB 5E
BIT 3,(IX+d) CB DD 5E d
BIT 3,(IY+d) CB FD 5E d
BIT 3,A CB 5F
BIT 3,B CB 58
BIT 3,C CB 59
BIT 3,D CB 5A
BIT 3,E CB 5B
BIT 3,H CB 5C
BIT 3,L CB 5D
BIT 4,(HL) CB 66
BIT 4,(IX+d) CB DD 66 d
BIT 4,(IY+d) CB FD 66 d
BIT 4,A CB 67
BIT 4,B CB 60
BIT 4,C CB 61
BIT 4,D CB 62
BIT 4,E CB 63
BIT 4,H CB 64
BIT 4,L CB 65
BIT 5,(HL) CB 6E
BIT 5,(IX+d) CB DD 6E d
BIT 5,(IY+d) CB FD 6E d
BIT 5,A CB 6F
BIT 5,B CB 68
BIT 5,C CB 69
BIT 5,D CB 6A
BIT 5,E CB 6B
BIT 5,H CB 6C
BIT 5,L CB 6D
BIT 6,(HL) CB 76
BIT 6,(IX+d) CB DD 76 d
BIT 6,(IY+d) CB FD 76 d
BIT 6,A CB 77
BIT 6,B CB 70
BIT 6,C CB 71
BIT 6,D CB 72
BIT 6,E CB 73
BIT 6,H CB 74
BIT 6,L CB 75
BIT 7,(HL) CB 7E
BIT 7,(IX+d) CB DD 7E d
BIT 7,(IY+d) CB FD 7E d
BIT 7,A CB 7F
BIT 7,B CB 78
BIT 7,C CB 79
BIT 7,D CB 7A
BIT 7,E CB 7B
BIT 7,H CB 7C
BIT 7,L CB 7D
CALL nn CD nnLO nnHI
CALL C nn DC nnLO nnHI
CALL M nn FC nnLO nnHI
CALL NC nn D4 nnLO nnHI
CALL NZ nn C4 nnLO nnHI
CALL P nn F4 nnLO nnHI
CALL PO nn E4 nnLO nnHI
CALL PE nn EC nnLO nnHI
CALL Z nn CC nnLO nnHI
CCF 3F
CP (HL) BE
CP (IX+d) DD BE d
CP (IY+d) FD BE d
CP A BF
CP B B8
CP C B9
CP D BA
CP E BB
CP H BC
CP L BD
CP n FE n
CPD ED A9
CPDR ED B9
CPI ED A1
CPIR ED B2
CPL 2F
DAA 27
DEC (HL) 35
DEC (IX+d) DD 35 d
DEC (IY+d) FD 35 d
DEC A 3D
DEC B 05
DEC BC 0B
DEC C 0D
DEC D 15
DEC DE 1B
DEC E 1D
DEC H 25
DEC HL 2B
DEC IX DD 2B
DEC IY FD 2B
DEC L 2D
DEC SP 3B
DI F3
DJNZ d 10 d
EI FB
EX (SP),HL E3
EX (SP),IX DD E3
EX (SP),IY FD E3
EX AF 08
EX DE,HL EB
EXX D9
HALT 76
IM0 ED 46
IM1 ED 56
IM2 ED 5E
IN A,(C) ED 78
IN A,(n) DB n
IN B,(C) ED 40
IN C,(C) ED 48
IN D,(C) ED 50
IN E,(C) ED 58
IN H,(C) ED 60
IN L,(C) ED 68
INC (HL) 34
INC (IX+d) DD 34 d
INC (IY+d) FD 34 d
INC A 3C
INC B 04
INC BC 03
INC C 0C
INC D 14
INC DE 13
INC E 1C
INC H 24
INC HL 23
INC IX DD 23
INC IY FD 23
INC L 2C
INC SP 33
IND ED AA
INDR ED BA
INI ED A2
INIR ED B2
JP (HL) E9
JP (IX) DD E9
JP (IY) FD E9
JP nn C3 nnLO nnHI
JP C nn DA nnLO nnHI
JP M nn FA nnLO nnHI
JP NC nn D2 nnLO nnHI
JP NZ nn C2 nnLO nnHI
JP P nn F2 nnLO nnHI
JP PO nn E2 nnLO nnHI
JP PE nn EA nnLO nnHI
JP Z nn CA nnLO nnHI
JR C d 38 d
JR d 18 d
JR NC d 30 d
JR NZ d 20 d
JR Z d 28 d
LD (nn),A 32 nnLO nnHI
LD (nn),BC ED 43 nnLO nnHI
LD (nn),DE ED 53 nnLO nnHI
LD (nn),HL 22 nnLO nnHI
LD (nn),HL ED 63 nnLO nnHI
LD (nn),IX DD 22 nnLO nnHI
LD (nn),IY FD 22 nnLO nnHI
LD (nn),SP ED 73 nnLO nnHI
LD (BC),A 02
LD (DE),A 12
LD (HL),A 77
LD (HL),A 77
LD (HL),B 70
LD (HL),C 71
LD (HL),D 72
LD (HL),E 73
LD (HL),H 74
LD (HL),L 75
LD (HL),n 36 n
LD (IX+d),A DD 77 d
LD (IX+d),B DD 70 d
LD (IX+d),C DD 71 d
LD (IX+d),D DD 72 d
LD (IX+d),E DD 73 d
LD (IX+d),H DD 71 d
LD (IX+d),L DD 75 d
LD (IX+d),n DD 36 d n
LD (IY+d),A FD 77 d
LD (IY+d),B FD 70 d
LD (IY+d),C FD 71 d
LD (IY+d),D FD 72 d
LD (IY+d),E FD 73 d
LD (IY+d),H FD 74 d
LD (IY+d),L FD 75 d
LD (IY+d),n FD 36 d n
LD A,(nn) 3A nnLO nnHI
LD A,(BC) 0A
LD A,(DE) 1A
LD A,(HL) 7E
LD A,(HL) 7E
LD A,(IX+d) DD 7E d
LD A,(IY+d) FD 7E d
LD A,A 7F
LD A,B 78
LD A,C 79
LD A,D 7A
LD A,E 7B
LD A,H 7C
LD A,I ED 57
LD A,L 7D
LD A,n 3E n
LD A,R ED 5F
LD B,(HL) 46
LD B,(IX+d) DD 46 d
LD B,(IY+d) FD 46 d
LD B,A 47
LD B,B 40
LD B,C 41
LD B,D 42
LD B,E 43
LD B,H 44
LD B,L 45
LD B,n 06 n
LD BC,(nn) ED 4B nnLO nnHI
LD BC,nn 01 nnLO nnHI
LD C,(HL) 4E
LD C,(IX+d) DD 4E d
LD C,(IY+d) DD 4E d
LD C,A 4F
LD C,B 48
LD C,C 49
LD C,D 4A
LD C,E 4B
LD C,H 4C
LD C,L 4D
LD C,n 0E n
LD D,(HL) 56
LD D,(IX+d) DD 56 d
LD D,(IY+d) FD 56 d
LD D,A 57
LD D,B 50
LD D,C 51
LD D,D 52
LD D,E 53
LD D,H 54
LD D,L 55
LD D,n 16 n
LD DE,(nn) ED 5B nnLO nnHI
LD DE,nn 11 nnLO nnHI
LD E,(HL) 5E
LD E,(IX+d) DD 5E d
LD E,(IY+d) FD 5E d
LD E,A 5F
LD E,B 58
LD E,C 59
LD E,D 5A
LD E,E 5B
LD E,H 5C
LD E,L 5D
LD E,n 1E n
LD H,(HL) 66
LD H,(IX+d) DD 66 d
LD H,(IY+d) FD 66 d
LD H,A 67
LD H,B 60
LD H,C 61
LD H,D 62
LD H,E 63
LD H,H 64
LD H,L 65
LD H,n 26 n
LD HL,(nn) 2A nnLO nnHI
LD HL,(nn) ED 6B nnLO nnHI
LD HL,nn 21 nnLO nnHI
LD I,A ED 47
LD IX,(nn) DD 2A nnLO nnHI
LD IX,nn DD 2A nnLO nnHI
LD IY,(nn) FD 2A nnLO nnHI
LD IY,nn FD 21 nnLO nnHI
LD L,(HL) 6E
LD L,(IX+d) DD 6E d
LD L,(IY+d) FD 6E d
LD L,A 6F
LD L,B 68
LD L,C 69
LD L,D 6A
LD L,E 6B
LD L,H 6C
LD L,L 6D
LD L,n 2E n
LD R,A ED 4F
LD SP,(nn) ED 7BnnLO nnHI
LD SP,nn 31 nnLO nnHI
LD SP,HL F9
LD SP,IX DD F9
LD SP,IY FD F9
LDD ED A8
LDDR ED B8
LDI ED A0
LDIR ED B0
NEG ED 44
NOP 00
OR (HL) B6
OR (IX+d) DD B6 d
OR (IY+d) FD B6 d
OR A B7
OR B B0
OR C B1
OR D B2
OR E B3
OR H B4
OR L B5
OR n F6 n
OTDR ED BB
OTIR ED B3
OUT (C),A ED 79
OUT (C),B ED 41
OUT (C),C ED 49
OUT (C),D ED 51
OUT (C),E ED 59
OUT (C),H ED 61
OUT (C),L ED 69
OUT (n),A D3 n
OUTD ED AB
OUTI ED A3
POP AF F1
POP BC C1
POP DE D1
POP HL E1
POP IX DD E1
POP IY FD E1
PUSH AF F5
PUSH BC C5
PUSH DE D5
PUSH HL E5
PUSH IX DD E5
PUSH IY FD E5
RES 0,(HL) CB 86
RES 0,(IX+d) DD CB d 86
RES 0,(IY+d) FD CB d 86
RES 0,A CB 87
RES 0,B CB 80
RES 0,C CB 81
RES 0,D CB 82
RES 0,E CB 83
RES 0,H CB 81
RES 0,L CB 85
RES 1,(HL) CB 8E
RES 1,(IX+d) DD CB d 8E
RES 1,(IY+d) FD CB d 8E
RES 1,A CB 8F
RES 1,B CB 88
RES 1,C CB 89
RES 1,D CB 8A
RES 1,E CB 8B
RES 1,H CB 8C
RES 1,L CB 8D
RES 2,(HL) CB 96
RES 2,(IX+d) DD CB d 96
RES 2,(IY+d) FD CB d 96
RES 2,A CB 97
RES 2,B CB 90
RES 2,C CB 91
RES 2,D CB 92
RES 2,E CB 93
RES 2,H CB 94
RES 2,L CB 95
RES 3,(HL) CB 9E
RES 3,(IX+d) DD CB d 9E
RES 3,(IY+d) FD CB d 9E
RES 3,A CB 9F
RES 3,B CB 98
RES 3,C CB 99
RES 3,D CB 9A
RES 3,E CB 9B
RES 3,H CB 9C
RES 3,L CB 9D
RES 4,(HL) CB A6
RES 4,(IX+d) DD CB d A6
RES 4,(IY+d) FD CB d A6
RES 4,A CB A7
RES 4,B CB A0
RES 4,C CB A1
RES 4,D CB A2
RES 4,E CB A3
RES 4,H CB A4
RES 4,L CB A5
RES 5,(HL) CB AE
RES 5,(IX+d) DD CB d AE
RES 5,(IY+d) FD CB d AE
RES 5,A CB AF
RES 5,B CB A8
RES 5,C CB A9
RES 5,D CB AA
RES 5,E CB AB
RES 5,H CB AC
RES 5,L CB AD
RES 6,(HL) CB B6
RES 6,(IX+d) DD CB d B6
RES 6,(IY+d) FD CB d B6
RES 6,A CB B7
RES 6,B CB B0
RES 6,C CB B1
RES 6,D CB B2
RES 6,E CB B3
RES 6,H CB B4
RES 6,L CB B5
RES 7,(HL) CB BE
RES 7,(IX+d) DD CB d BE
RES 7,(IY+d) FD CB d BE
RES 7,A CB BF
RES 7,B CB B8
RES 7,C CB B9
RES 7,D CB BA
RES 7,E CB BB
RES 7,H CB BC
RES 7,L CB BD
RET C9
RET C D8
RET M F8
RET NC D0
RET NZ C0
RET P F0
RET PE E8
RET PO E0
RET Z C8
RETI ED 4D
RETN ED 45
RL (HL) CB 16
RL (IX+d) DD CB d 16
RL (IY+d) FD CB d 16
RL A CB 17
RL B CB 10
RL C CB 11
RL D CB 12
RL E CB 13
RL H CB 14
RL L CB 15
RLA 17
RLC (HL) CB 06
RLC (IX+d) DD CB d 06
RLC (IY+d) FD CB d 06
RLC A CB 07
RLC B CB 00
RLC C CB 01
RLC D CB 02
RLC E CB 03
RLC H CB 04
RLC L CB 05
RLCA 07
RLD ED 6F
RR (HL) CB 1E
RR (IX+d) DD CB d 1E
RR (IY+d) FD CB d 1E
RR A CB 1F
RR B CB 18
RR C CB 19
RR D CB 1A
RR E CB 1B
RR H CB 1C
RR L CB 1D
RRA 1F
RRC (HL) CB 0E
RRC (IX+d) DD CB d 0E
RRC (IY+d) FD CB d 0E
RRC A CB 0F
RRC B CB 08
RRC C CB 09
RRC D CB 0A
RRC E CB 0B
RRC H CB 0C
RRC L CB 0D
RRCA 0F
RRD ED 67
RST 0 C7
RST 1,addr CF dr ad
RST 2,addr D7 dr ad
RST 3,addr DF dr ad
RST 4 E7
RST 5,addr EF dr ad
RST 6 F7
RST 7 FF
SBC A,(HL) 9E
SBC A,(IX+d) DD 9E d
SBC A,(IY+d) FD 9E d
SBC A,A 9F
SBC A,B 98
SBC A,C 99
SBC A,D 9A
SBC A,E 9B
SBC A,H 9C
SBC A,L 9D
SBC A,n DE n
SBC HL,BC ED 42
SBC HL,DE ED 52
SBC HL,HL ED 62
SBC HL,SP ED 72
SCF 37
SET 0,(HL) CB C6
SET 0,(IX+d) DD CB d C6
SET 0,(IY+d) FD CB d C6
SET 0,A CB C7
SET 0,B CB C0
SET 0,C CB C1
SET 0,D CB C2
SET 0,E CB C3
SET 0,H CB C4
SET 0,L CB C5
SET 1,(HL) CB CE
SET 1,(IX+d) DD CB d CE
SET 1,(IY+d) FD CB d CE
SET 1,A CB CF
SET 1,B CB C8
SET 1,C CB C9
SET 1,D CB CA
SET 1,E CB CB
SET 1,H CB CC
SET 1,L CB CD
SET 2,(HL) CB D6
SET 2,(IX+d) DD CB d D6
SET 2,(IY+d) FD CB d D6
SET 2,A CB D7
SET 2,B CB D0
SET 2,C CB D1
SET 2,D CB D2
SET 2,E CB D3
SET 2,H CB D4
SET 2,L CB D5
SET 3,(HL) CB DE
SET 3,(IX+d) DD CB d DE
SET 3,(IY+d) FD CB d DE
SET 3,A CB DF
SET 3,B CB D8
SET 3,C CB D9
SET 3,D CB DA
SET 3,E CB DB
SET 3,H CB DC
SET 3,L CB DD
SET 4,(HL) CB E6
SET 4,(IX+d) DD CB d E6
SET 4,(IY+d) FD CB d E6
SET 4,A CB E7
SET 4,B CB E0
SET 4,C CB E1
SET 4,D CB E2
SET 4,E CB E3
SET 4,H CB E4
SET 4,L CB E5
SET 5,(HL) CB EE
SET 5,(IX+d) DD CB d EE
SET 5,(IY+d) FD CB d EE
SET 5,A CB EF
SET 5,B CB E8
SET 5,C CB E9
SET 5,D CB EA
SET 5,E CB EB
SET 5,H CB EC
SET 5,L CB ED
SET 6,(HL) CB F6
SET 6,(IX+d) DD CB d F6
SET 6,(IY+d) FD CB d F6
SET 6,A CB F7
SET 6,B CB F0
SET 6,C CB F1
SET 6,D CB F2
SET 6,E CB F3
SET 6,H CB F4
SET 6,L CB F5
SET 7,(HL) CB FE
SET 7,(IX+d) DD CB d FE
SET 7,(IY+d) FD CB d FE
SET 7,A CB FF
SET 7,B CB F8
SET 7,C CB F9
SET 7,D CB FA
SET 7,E CB FB
SET 7,H CB FC
SET 7,L CB FD
SLA (HL) CB 26
SLA (IX+d) DD CB d 26
SLA (IY+d) FD CB d 26
SLA A CB 27
SLA B CB 20
SLA C CB 21
SLA D CB 22
SLA E CB 23
SLA H CB 24
SLA L CB 25
SLL (HL) CB 36
SLL (IX+d) DD CB d 36
SLL (IY+d) FD CB d 36
SLL A CB 37
SLL B CB 30
SLL C CB 31
SLL D CB 32
SLL E CB 33
SLL H CB 34
SLL L CB 35
SRA (HL) CB 2E
SRA (IX+d) DD CB d 2E
SRA (IY+d) FD CB d 2E
SRA A CB 2F
SRA B CB 28
SRA C CB 29
SRA D CB 2A
SRA E CB 2B
SRA H CB 2C
SRA L CB 2D
SRL (HL) CB 3E
SRL (IX+d) DD CB d 3E
SRL (IY+d) FD CB d 3E
SRL A CB 3F
SRL B CB 38
SRL C CB 39
SRL D CB 3A
SRL E CB 3B
SRL H CB 3C
SRL L CB 3D
SUB (HL) 96
SUB (IX+d) DD 96 d
SUB (IY+d) FD 96 d
SUB A 97
SUB B 90
SUB C 91
SUB D 92
SUB E 93
SUB H 94
SUB L 95
SUB n D6 n
XOR (HL) AE
XOR (IX+d) DD AC d
XOR (IY+d) FD AC d
XOR A AF
XOR B A8
XOR C A9
XOR D AA
XOR E AB
XOR H AC
XOR L AD
XOR n EE n

Kompletny opis mikroprocesora Z80 znajdziesz tutaj.


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.