ZX ASEMBLER II - instrukcja


Zanim rozpoczniesz czytanie tego rozdziału:

pobierz plik instalacyjny emulatora VB81
przeczytaj instrukcję instalacji i użytkowania emulatora VB81
 

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

(C) ARTIC COMPUTING LTD

(C) ARTIC COMPUTING LTD

CONTENTS

INTRODUCTION
GENERAL DESCRIPTION
GETTING STARTED
SAVING PROGRAMS
THE EDITOR
SYNTAX OF ASSEMBLER
    LABELS
    TEXT
    NUMBERS
    SEPARATORS
    NON STANDARD MNEMONICS
    COMMENTS
ASSEMBLING
    LABEL ERROR
    RELATIVE JUMP ERROR
    OFFSET ERROR
    NUMBER ERROR
    OUT OF MEMORY
    STACK ERROR
    SYNTAX ERROR
MONITOR
    COMMANDS
USEFUL ASSEMBLER SUBROUTINES
HINTS FOR THE BEGINNER
RULES
RECOMMENDED BOOKS
Z80 INSTRUCTION SET

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

INTRODUCTION

The aim of ZX ASSEMBLER is to simplify the whole process of machine code programming on ZX81 computers. It provides comprehensive, easy for use facilities whilst retaining a surprisingly large amount of user-available RAM. The program occupies 7K and locates itself in the upper half of ROM area, so BASIC is unaffected and works the same way as if the assembler was not present at all.

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.

GENERAL DESCRIPTION

There are two main sections to the program:

  1. The EDITOR/ASSEMBLER. You may enter and edit your assembly code with the EDITOR then assemble it with the ASSEMBLE command. The EDITOR has been designed specially for the entering of assembly code: it employs up and down screen scrolling; search for a string; allows insertion/deletion of lines/characters; auto-repeat on all Keys; label indentation system & cursor up, down, left and right. It will allow up to 31 characters per line. The ASSEMBLER is highly versatile: it provides for full mnemonic and label assembling, allows entry of numbers in hex and decimal, and it allows entry of text and comments.
  2. The MONITOR. This provides facilities test debug and run your machine-code program. It also provides a number of useful subroutines (such as Keyboard input, print on screen... etc)

This manual is intended to explain how to operate the EDITOR/ASSEMBLER and MONITOR, also giving tips and routines for beginners, and a list of Z80 instruction sets.

ZX ASSEMBLER is a powerful piece of software and used correctly could increase your programming speed and ability enormously.

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.

GETTING STARTED

ZX ASSEMBLER is automatically loaded when your VB81 starts. It is put into upper half of ROM area which begins at 2000 hex or 8192 decimal. This area of ZX81 memory is normally protected from writes during simulation, although you may permit such writes, but then the program code would not be safe and could get corrupted. Set this option only when you do not plan to use your assembler.

To run the program you must type: RAND USR 8192 - then the program will introduce itself. You are now in the COMMAND MODE of the ASSEMBLER. All commands are initiated with SINGLE KEY press from here. To return to BASIC type Q(QUIT) twice.

There is a fine feature in version 2 of ZX ASSEMBLER. If you invoke it by:

LET S=USR 8192

then S will contain the start address of your assembled code on return to BASIC. If you do not assemble the code, then S will point to ZX ASSEMBLER entry.

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

SAVING PROGRAMS

To SAVE a complete or incomplete program, press Q twice to return to BASIC. You will find a two line BASIC program, plus any other that you have entered.

1 REM
2 REM

Line 1 contains the machine code. Line 2 contains the assembly language (be careful when using renumbering feature of VB81 - the numbers for these lines should always be 1 and 2). You may wish at this point to delete either line as necessary and to SAVE the remaining program in the usual way (it will be saved to tape directory set in VB81). At any time with ASSEMBLER in ROM you may load this program back again to finish or continue your work. If you have not finished your program, you can delete the object code (line 1) and SAVE only the source code. However it is best to SAVE a backup tape containing only the source code for future amendments.

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.

THE EDITOR

When you invoke the EDITOR by pressing E key, a screen of text entered so far is displayed. This will be either at the place where you last left the EDITOR or from an error during Assembling (SEE ASSEMBLING). The EDITOR provides the user with several functions apart from simply entering text. All the functions are obtained with the SHIFT Key held down

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.

Functions:

Press SHIFT  6   to move the cursor down.
SHIFT  7 to move the cursor up.
SHIFT  8 to move the cursor right.
SHIFT  5 to move the cursor left.
SHIFT  0 to RUBOUT the last character.
SHIFT  9 to INSERT a character at current position.
SHIFT  A to enter a LABEL. Moves cursor to extreme left of screen. Only works if cursor is in 7th character position and if no label is there yet.
SHIFT  D DELETES current line.
SHIFT  E INSERTS a line at current cursor position.
SHIFT  G prints text from cursor position onto ZX Printer.
SHIFT  Q QUITS from Search, Line or Editor. Suppose you make an error in a line, SHIFT Q restores a line to its original state.
SHIFT  S SEARCH for a string from cursor position. Press SHIFT A to search for a label. If not found cursor is left in the same position.
SHIFT  T moves the cursor to the top of the text.

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
 

There is an AUTO REPEAT on all keys after 1 second.

The EDITOR allows a maximum of 31 characters per line. If you run out of memory, you will return to COMMAND MODE, and an OUT OF MEMORY message will appear: the line you have just typed will have been deleted so that you can return to the EDITOR to squeeze things up! If a label is to be changed, SHIFT A won't move the cursor to the left, so use CURSOR LEFT.

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.

SYNTAX OF ASSEMBLER

Once the program has introduced itself, you have the choice of  several commands for the monitor, but we shall first examine the Editor/Assembler.

To enter the Editor you type E. The screen will clear and display a graphic space, seven characters in from the left hand side of the screen. You are now ready to enter your Assembly Language.

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.

LABELS

The Assembler will accept labels of any string of letters or numbers starting with a letter immediately followed by:

= constant or  Assembly language or space

To enter a label, type SHIFT A and the cursor will move to the extreme left hand side of the screen. This gives the effect of indenting the Assembly language and making it easier to read.

Example: Score routine

SCORE1 = 5000
       JR BEGIN       ;jump to beginning.
SCORE  DB 00,00       ;save two bytes for score.
BEGIN  LD HL,(SCORE)  ;get the contents of score.
       INC HL         ;increment it
       LD (SCORE),HL  ;store new score
       LD (SCORE1),HL ;store copy of score at 5000 HEX
       RET

A label may be accessed with an offset of -9 to +9

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

A will have te value 5. If no offset specified, assume it is zero.

A = 1

N.B. It is advisable not to use a label with the same name as a register e.g. BC or as a legal number e.g. ABCD as you will either have error message on relative jumps or potentially disastrous consequences.

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.

TEXT

If you want to put some text into your assembler program then you use DEFM/DM directive. The text itself must be enclosed within speech marks (SHIFT P or normal " key in VB81).

Example: Print a message

       CALL PRINT
       DM "HERE WE ENTER TEXT"
       DB FF  ;we mark the end of text

Example:  Text in Assembly language

       LD A,0        ;get initial value
CHECK  INC A         ;add 1 to it
       CP "*"        ;check for *
       JR NZ CHECK   ;if not goto check
       CALL PRINTA   ;print character
       CALL PRINT    ;print text
       DM " IS A * SIGN"
       DB FF

Hence it is not necessary to know the character codes.

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

NUMBERS

The Assembler defaults to HEXadecimal (base 16)

  8 bit numbers 0 to FF
16 bit numbers 000 to FFFF (must be 3 or 4 digits)

Decimal numbers must also be used with a '+' or '-' sign. They will always be 16 bit numbers.

e.g. +1 is represented by 0001.

The Assembler is intelligent in many respects, in that it treats a number, wherever possible, as an 8 bit or 16 bit, including decimal, when needed.

Example: label loads

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

The label TEST is treated as a 16 bit and 8 bit number where indicated. If however the Assembler expects an 8 bit number when the number is greater than FF or +255, a NUMBER ERROR will be reported when Assembling.

Example: Numbers

       LD HL,1    ;OK
       LD A,+13   ;OK
       LD A,101   ;Error

When you wish to load a register with a number, which is also a register, you must prefix the number with a 0.

Example

       LD A,B    ;stores register B in A
       LD A,0B   ;stores number B in A

If you want to store numbers within your code then use DEFB/DB directive for 8 bit numbers and DEFW/DW directive for 16 bit numbers. Each one of these directives takes multiple numbers as parameters separated with commas.

Examples: Numbers in memory

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

To reserve some space within memory, say a 100 bytes, for any purpose, use DEFS/DS directive.

Example:

BUF    DS 100 ;100 bytes for you to use at BUF

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

SEPARATORS

Each instruction may be separated by spaces or end of line.

Spaces may be replaced by multiple spaces with the exception of the following instructions, which must be entered exactly as below.

       LDA_A,I       _ space
       LDA_I,A
       LDA_R,A
       LDA_A,R
       EX_AF        
EX AF,AF'
       EX_DE,HL
       EX_(SP),HL

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

NON STANDARD MNEMONICS

The following mnemonics are not standard Z80

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

JP and JR have NO commas, e.g. JR NZ +7

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 JP i JR nie mają przecinków, np. JR NZ +7

COMMENTS

Comments must be preceded with a semi colon ; text after this will be ignored by the Assembler.

KOMENTARZE

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

ASSEMBLING

Once you have typed in your Assembly language, you are now ready to Assemble it. Exit from the Editor using SHIFT Q.

To assemble your program, type A and ASSEMBLE will be printed. Now press NEWLINE and your program will be Assembled. The program is Assembled to start at address 4084 HEX or 16516 DECIMAL. This is REM line 1 when you return to BASIC. If you entered the ASSEMBLER by command

LET S=USR 8192

then S contains the start of your code on return to BASIC. To run it, use

RAND USR S

You may use ORG n directive at the beginning of your code to produce the code to be run at address n. The code would still be assembled into line 1, but you may move it with Assembler's COPY command to its destination.

If you make make an error, an error message will be printed. Typing E will display the text from the line at which the error occurred.

The error messages you may get are the following:

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:

LABEL ERROR

  1. Undefined label.
  2. Illegal label definition. e.g. beginning with a number. If you misspell a mnemonic, you will probably get this error as it thinks you are trying to access a label.

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.

RELATIVE JUMP ERROR

This occurs if the relative jump is out of range, i.e. the jump is > +127 or < -128 bytes.

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.

OFFSET ERROR

  1. Loading a register with a label plus an offset.
    e.g     LD HL,(FRED +10)
           
    only ± 9 allowed.
  2. Using the index registers plus an offset which is too large.
            IX,IY > +127 
    or  <-128

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

NUMBER ERROR

This error is reported when you try to use a number too large for the relevant instruction.

e.g.        LD A,1000

BŁĄD LICZBY

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

np.        LD A,1000

OUT OF MEMORY

  1. In Editor when Assembly language is too long.
  2. During Assembling when not enough room to Assemble the program.

BRAK PAMIĘCI

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

STACK ERROR

At the end of execution when too much has been taken or left on the stack. (See following notes).

BŁĄD STOSU

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

SYNTAX ERROR

Reporting all other errors.

e.g.        ADD A,*

While developing routines it is not necessary to put RET at the end of your routine, as the Assembler ends the routine with a Jump to the Monitor. This means if there is a Stack error, the system will not crush. The RET at the end of your program returns you to BASIC. To RUN your routine, press 'R' RUN FROM ADDR 4084 will be displayed. Press NEWLINE to run to your routine. The default address is 4084 (the beginning of the machine code routine). This may be changed by typing in any address.

NOTE ** If an error is reported during assembly, the program can NOT be RUN as it may be partly assembled, or not at all !

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 ASSEMBLER also provides a useful Monitor to enable you to test, de-bug and run your machine code programs, All commands are initiated with SINGLE KEY - press and many may need a 4 digit HEX address. Press NEWLINE to enter this address. Any entry may be aborted by pressing Q before NEWLINE

 

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.

COMMANDS

A   To ASSEMBLE your program
C This COPIES a block of memory from one place to another.
COPY BLOCK: FIRST ADDR... The first address of the block to be copied
LAST ADDR... The last address of the block to be copied
TO ADDR... The destination address.
M This is the MEMORY edit mode, you can enter/edit M/C directly. Down the left hand side of the screen is a column of 24 2-byte addresses, and beside these is a column of the contents of each address. The cursor half way down indicates the address of the memory location that you can change. To do this, type in a HEX number and press NEWLINE. If you press Q before NEWLINE then the entry of that number will be aborted. The commands in this mode are:
J   Calculates JUMP displacement for relative jumps: enter the last 2 digits of the destination address, press NEWLINE and the displacement will be entered  at the cursor address.
L moves cursor down continuously through memory (repeated NEWLINE)
NEWLINE moves cursor down a single step.
O moves cursor up continuously (repeated P)
P moves cursor up a single step
R REPEATS the entry of a value: enter your value then press NEWLINE. The contents of any address to which the cursor points will be changed to your value - any of the cursor movement commands can be used. To cancel REPEAT press Q.
I INSPECT and modify registers. Displays register pairs BC, DE, HL and AF. F is also displayed in binary with each flag labeled (S=sign, Z=zero, H=half carry, O=parity/overflow, N=negative or minus, C=carry). When you RUN a machine code program, the values displayed are put into the registers, and on return the values of the registers are recorded. The HEX number you enter will be put into the register to which the cursor points. To enter a number and move the cursor, press NEWLINE.
S SEARCH FOR ... 2 byte number to be searched for.
FROM ADDR... address from which to start search.
Searches through all 64K except stack. Displays address of the first occurrence of the number. If you press M, it goes strait into the Memory edit mode at that address, or Q to return to COMMAND mode. 'NOT FOUND' is displayed if the number does not occur.
R Runs a machine code routine from address 4084 (16516 decimal) or the address you enter. Return to monitor is by a jump instruction Assembled by the Assembler. The jump address is 372F. The screen is  cleared before the program is run. On return to the Monitor it waits for any Key to be pressed before clearing the screen again and returning to COMMAND mode.
V displays version number and revision date of the ZX ASSEMBLER package

NOTE. Pressing Q (or SHIFT Q in the EDITOR) will always abort what you are doing whenever the Assembler is waiting for a Key to be pressed.

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, HL i AF. 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.

USEFULL ASSEMBLER SUBROUTINES

Below there are some simple routines which you can use in your own machine code programs. The code is well commented.

Get the tape file: library.p with these routines for use with ZX ASSEMBLER 2

INKEY  reads the ZX81 keyboard and returns the pressed key code in A. If no key is being pressed then A contains 1 at return. All registers are preserved except for AF.
FILL fills the entire ZX81 screen with character code in A. All register are preserved. Note: the code should be valid ZX81 character code or the system may crush.
PRDE prints text following the call to this routine starting at D row and E column. The text should end with FF code. Does not preserve HL, DE and AF. Sample:

LD D,+10   ; row 10 - counting from 0!
LD E,+14   ; column 14 - also counting from 0!
CALL PRDE  ; print the text at 10,14
DM "HELLO" ; the text
DB FF      ; end marker
...        ; program continues

ATDE calculates the address of row D and column E position within DFILE and returns it in HL. All other registers are preserved.

 

INKEY PUSH BC        ;save used registers
      PUSH DE
      PUSH HL
      LD BC,(4025)   ;load keyboard scan codes
      LD D,C         ;check if any key is pressed
      INC D
      LD A,1         ;assume no
      JR Z INK1      ;if none then skip the ROM call
      CALL 07BD      ;decode the scan code
      LD A,(HL)      ;fetch the key code
INK1  POP HL         ;restore registers
      POP DE
      POP BC
      RET            ;and return with code in A
	
FILL  PUSH BC        ;save used registers
      PUSH HL
      LD HL,(400C)   ;point HL at DFILE
      INC HL         ;skip starting NEWLINE
      LD C,18        ;24 lines to fill
FILL1 LD B,20        ;each with 32 A characters
FILL2 LD (HL),A      ;fill one line
      INC HL
      DJNZ FILL2
      LD (HL),+118   ;put NEWLINE at the end of each line
      INC HL         ;move to the next line
      DEC C          ;if not done then continue
      JR NZ FILL1    ;with the rest of the screen
      POP HL         ;restore registers
      POP BC
      RET            ;and return
	
PRDE  CALL ATDE      ;calculate DE position in HL
      POP DE         ;point DE at the start of text
PRDE1 LD A,(DE)      ;fetch a character
      INC DE         ;move to next position in text
      CP FF          ;is it the end of text?
      JR NZ PRDE2    ;continue if not
      EX DE,HL       ;else jump just after
      JP (HL)        ;the end marker
PRDE2 LD (HL),A      ;send character to DFILE
      INC HL         ;move at the next position
      JR PRDE1       ;continue printing
	
ATDE  PUSH BC        ;save used registers
      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         ;restore registers
      POP BC
      RET            ;return with the address in HL

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, DE i AF. 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

HINTS FOR THE BEGINNER

DON'T PANIC!!!

Machine code is not a mysterious art practiced by ice-cool whizz kids with electrons coursing through their veins, it is just another means of programming like BASIC. You must be more careful than with BASIC as there are no error messages when you actually execute a program. If you make bad mistakes, the usual result is the system Crushing. However, using the Assembler an Monitor and following a few simple rules, you will soon be able to write, debug and successfully execute machine code.

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.

RULES

  1. Preserve your environment. Save all the register within Subroutines by PUSHing them on the Stack. Before Returning recover them in the opposite order to which they were SAVEd.
    e.g.   LD A,27    ;set A to a value
           PUSH HL    ;save HL
           PUSH BC    ;save BC
           CALL PRINT ;print character in A
           POP BC     ;recover BC
           POP HL     ;recover HL
  2. Everything placed on the Stack within a Subroutine, must be taken off within the same routine, or before a RET is met.
    Suppose FRED is a printing Subroutine
    FRED   LD A,17    ;set A to a value
           PUSH AF    ;save AF
           CALL FRED  ;print character
           RET        ;return?

    This routine would Crash as there should be a POP AF before the RET.
  3. Remember where your Stack is. Don't locate a machine code routine too close to the Stack, this is because the Stack may corrupt the routine when it fills up.
  4. Relative jumps have a limit from the current position
            + 127 bytes forward
            - 128 bytes backwards
  5. Read as much information as you can about programming.
  6. Put things in subroutines as much as reasonably possible.

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

RECOMMENDED BOOKS

Machine Language programming made simple for your Sinclair.

Understanding your ZX81 ROM, Melbourne House

Programming the Z80, Rodney Zaks, Sybex

Z80 Instruction Handbook, Intel

POLECANA LITERATURA

W języku polskim tylko nasz serwis edukacyjny. 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

Z80 INSTRUCTION SET

n  - single byte value
nn  - 2 byte value
nnLO  - less significant byte of 2 byte value
nnHI  - more significant byte of 2 byte value
d  - displacement - signed 1 byte value

 

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

 

    Instruction         Opcode    
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
    Instruction         Opcode    
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 LY,SP DD 39
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
LD SP,(nn) ED 7B nnLO 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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
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
    Instruction         Opcode    
SUB A 97
SUB B 90
SUB C 91
SUB D 92
SUB E 93
SUB H 94
SUB L 95
    Instruction         Opcode    
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
    Instruction         Opcode    
XOR D AA
XOR E AB
XOR H AC
XOR L AD
XOR n EE n

 

 


   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