Микро ЭВМ "ZX Spectrum" 1969 г.

Система команд микропроцессора - команды и данные. Группы команд. Команды загрузки регистров константами. Команды копирования регистров и обмена. Команды загрузки регистров из памяти. Дополнительные команды.


ГЛАВА 5. Система команд микропроцессора Z8 0.

5.1. Команды и данные.

Теперь мы достигли стадии, когда можно обсудить команды машинного языка.

В этой книге все команды разделены на 18 групп, каждая из которых состоит из команд, имеющих много общего. Однако, прежде чем обсуждать эти команды, рассмотрим 6 классов данных, которые могут следовать за командой.

1. Однобайтовая константа (+dd).

Это число A в диапазоне 00-FFh, 0-255 десятичное. Те команды, которые требуют за собой однобайтовую константу имеют мнемоническую приставку +dd, например, LD A,+dd.

2. Двухбайтовая константа (+dddd).

Это число A в диапазоне 0000-FFFFh (десятичное 0-65535) . Те команды, которые требуют за собой двухбайтовую константу, имеют мнемоническую приставку +dddd, например, LD HL,+dddd.

3. Двухбайтовый адрес (addr).

Это число A в диапазоне 0000-FFFFh (десятичное 0-65535), т.е. число, которое используется как адрес в памяти. Те команды, которые требуют за собой двухбайтовый адрес, имеют мнемоническую приставку addr, например, JP addr.

4. Однобайтовая константа смещения (e).

Это число A в диапазоне 00-FFh, -128 - +127 десятичное. Число всегда представлено в дополнительной арифметике. Те команды, которые требуют за собой однобайтную константу смещения, имеют мнемоническую приставку e, например, JP e.

5. Однобайтовая индексирующая константа смещения (+d).

Это число A в диапазоне 00-FF (десятичное -128- +127) .

Число всегда представлено в дополнительной арифметике. Те команды, которые требуют за собой однобайтовую индексирующую константу, имеют мнемоническую приставку +d, например, LD A, (IX-d).

6. Однобайтовая индексирующая константа смещения и однобайтовая константа ( +d, +dd ).

Т.е. числа в диапазоне 00-FFh ( первое из которых рассматривается как десятичное -128 - +127, а второе - как десятичное 0-255.

Команды, требующие за собой двух байт данных, сопровождаются мнемониками +d и +dd.

5.2. Группы команд.

Существует много путей для разделения на группы сотен различных машинных команд. Однако, метод, выбранный здесь, разделяет команды на 18 функциональных групп.

После изучения команд по группам, читатель выполнит программы БЕЙСИКА из следующей главы, которые иллюстрируют эти команды.

Группа 1. Команда НЕТ ОПЕРАЦИИ.

Мнемоника Шестнадцатиричный код

NOP 00

Выполнение команды в Z8 0 требует 1.14мкс. Ни один из регистров или флагов не меняется. Команда НЕТ ОПЕРАЦИИ используется программистом для организации задержек, но чаще для удаления ненужных команд из программы.

Группа 2. Команды загрузки регистров константами.

Мнемоника Шестнадцатиричный код

LD A,+dd 3E dd

LD H,+dd 2 6 dd

LD L,+dd 2E dd

LD B,+dd 0 6 dd

LD C,+dd 0E dd

LD D,+dd 16 dd

LD E,+dd 1E dd

Каждая строка этих команд требует двух байт памяти: один для кода операции,второй для константы. Команды записывают в регистры соответствующие значения. Старые значения регистров пропадают.

Следующие команды заключают загрузку пары регистров двухбайтовыми константами:

Мнемоника Шестнадцатиричный код

LD HL,+dddd 21 dd dd

LD BC,+dddd 01 dd dd

LD DE,+dddd 11 dd dd

LD IX,+dddd DD 21 dd dd

LD IY,+dddd FD 21 dd dd

LD SP,+dddd 31 dd dd

Строка команды требует три или четыре байта памяти. Код операции занимает один или два байта памяти и два байта занимает константа.

Первый байт константы всегда загружается в младший регистр пары, т.е. L, C, E, X, Y, или P, а второй байт -- в старший регистр, т.е. H, B, D, I, или S.

Эти команды записывают в регистровые пары значения данных. Эти значения часто рассматриваются программистом как двухбайтовый адрес, но могут быть также и двухбайтовым числовым значением и двумя отдельными однобайтовыми числовыми значениями.

Группа 3. Команды копирования регистров и обмена.

В Z8 0 существует 5 9 команд, которые выполняют копирование регистров и регистровых пар. Эти команды лучше всего делить на 4 подгруппы.

Подгруппа a. Команды копирования регистр-регистр.

Следующая таблица даст коды операций команд, выполняющих копирование содержимого регистра в другой регистр

LD LD LD LD LD LD LD

A 7F 67 6F 47 4F 57 5F

H 7C 64 6C 44 4C 54 5C

L 7D 65 6D 45 4D 55 5D

B 78 60 68 40 48 50 58

C 79 61 69 41 49 51 59

D 7A 62 6A 42 4A 52 5A

E 7B 63 6B 43 4B 53 5B

Ни одна из команд, приведенных в таблице, не изменяет состояния флагов. Существует, кроме этого, 4 команды для I и A регистров.

Мнемоника Шестнадцатиричный код

LD A, I ED 57

LD A, R ED 5F

LD I, A ED 4 7

LD I, R ED 5F

Эти последние 4 команды влияют на флаг переполнения четности.

Подгруппа b. Команды копирования регистровая пара -регистровая пара.

Существуют только три команды этой подгруппы и они все копируют значения в указатель стека.

Мнемоника Шестнадцатиричный код

LD SP, HL F9

LD SP, IX DD F9

LD SP, IY FD F9

Эти команды не изменяют состояния флагов.

Заметьте, что если содержимое регистровой пары надо копировать в другую регистровую пару и эти команды не подходят, то необходимо выполнить две команды копирования регистр-регистр. Например, нет команды LD HL, DE и ее заменяют используя LD H,D и LD D,E. Или содержимое первой регистровой пары может быть сохранено в стеке и впоследствии переписано во вторую регистровую пару (см. команды стека на стр.103).

Подгруппа c. Команды EX DE, HL.

В системе команд Z80 существует только одна команда, которая позволяет обменивать содержимое регистров в пределах основного набора регистров.

Мнемоника Шестнадцатиричный код

EX DE,HL EB

Это очень полезная команда, позволяющая программисту обменивать значение в паре регистров DE с содержимым пары HL. Значения флагов не изменяется. Команда обычно используется, когда необходимо, чтобы адрес или двухбайтовая числовая константа из пары DE была записана в пару HL, но содержимое последней не было утеряно.

Подгруппа d.Команды альтернативного набора регистров

В этой группе две команды

Мнемоника Шестнадцатиричный код

EXX D9

EX AF, A'F' 0 8

Команда EXX вызывает переключение регистров H, L, B, C, D и E на регистры H', L', B', C', D', и E'.

Команда EX AF, A'F', как следует из мнемоники, переключает регистры A и F на A' и F'.

Альтернативный набор регистров часто используется для хранения адресов и данных. Помещенные в альтернативные регистры, эти значения сохраняются без искажения и могут быть легко и быстро восстановлены.

Группа 4. Команды загрузки регистров из памяти.

В систему команд Z8 0 входит много команд, позволяющих находить данные в памяти и затем загружать их в основной регистр. Все эти команды требуют, чтобы программист указал адрес или пару адресов байтов, откуда данные должны быть скопированы, и регистр ( или пару регистров ) -- получателей данных.

Команды этой группы лучше рассматривать как команды трех подгрупп в соответствии с методом адресации выбранным программистом .

Возможны три вида адресации:

a) непосредственная адресация -- действительный адрес указан в двух байтах вслед за кодом операции;

b) косвенная адресация -- двухбайтовый адрес уже размещен в адресной регистровой паре;

c) индексная адресация -- адрес данных должен быть вычислен путем сложения значения смещения d с основным адресом, уже содержащимся в регистровой паре IX или IY.

Подгруппа а. Команды использующие непосредственную адресацию.

Мнемоника Шестнадцатиричный код

LD A, (addr) 3A addr

LD HL, (addr) 2A addr

LD BC, (addr) ED 6B addr

LD DE, (addr) ED 4B addr

LD IX, (addr) DD 2A addr

LD IY, (addr) FD 2A addr

LD SP, (addr) ED 7B addr

Команда LD A, (addr) -- единственная в Z80, которая позволяет содержимое ячейки, заданное непосредственной адресацией загрузить в одинарный регистр.

Важно заметить, что шесть команд -- действительно двойные, т. е. команда LD BC, (addr) могла бы состоять из LD C, (add r), следующей за LD B, (addr+1).

В каждом случае содержимое адреса копируется в младший регистр, а содержимое следующего адреса -- копируется в старший.

Подгруппа b. Команды, использующие косвенную адресацию

Мнемоника Шестнадцатиричный код

LD A, (HL) 7E

LD A, (BC) 0A

LD A, (DE) 1A

LD H, (HL) 66

LD L, (HL) 6E

LD B, (HL) 46

LD C, (HL) 4E

LD D, (HL) 56

LD E, (HL) 5E

В каждом случае адрес байта данных, который должен быть скопирован, уже находится в паре регистров HL, DC или BC.

Если программист хочет выполнить команду, которой нет в этом списке, необходимо использовать взамен инструкцию, например, команда LD D, (BC) не разрешена, возможна команда LD A, (BC) и LD D,A, которая меняет содержимое регистра A. Или: LD H,B; LD L,C и LD D,(HL) которая меняет содержимое пары HL.

Подгруппа с. Команды, использующие индексную адресацию.

Команды этой подгруппы позволяют программисту загружат динарные регистры байтами данных, содержащихся в таблице, списке или наборе данных. Основной адрес содержится в соответствующей индексной паре.

Команды подгруппы:

Мнемоника Шестнадцатиричный код

LD A, (IX+d) DD 7E d

LD H, (IX+d) DD 66 d

LD L, (IX+d) DD 6E d

LD B, (IX+d) DD 46 d

LD C, (IX+d) DD 4E d

LD D, (IX+d) DD 56 d

LD E, (IX+d) DD 5E d

Для команд, использующих пару IY, надо заменить IX на IY и DD на FD. Интересно рассмотреть время, требуемое Z8 0 на выполнение команд этой группы. Самые быстрые команды -это те, которые указаны в подгруппе b. Эти команды требуют Z8 0 выбрать один байт кода операции и затем фактически байт данных. Команда LD A,(HL), например, требует только 7 тактовых циклов.

Команды подгруппы a гораздо более сложные и требуют, в зависимости от вида 16-20 тактовых циклов. Команды подгруппы c также требуют много времени - 19 тактовых циклов - индексная адресация требует вычислений.

Ни одна из команд этой группы не меняет флагов.

Группа 5. Команды записи в память содержимого регистров или констант.

Обычно команды этой группы выполняют операции, противоположные тем, которые выполняют команды группы IY.

Команды позволяют содержимое регистров переписывать в память или записывать туда константы.

Эти команды также удобнее рассматривать по трем подгруппам .

Подгруппа d. Команды непосредственной адресации.

Мнемоника Шестнадцатиричный код

LD (addr), A 32 addr

LD (addr), HL 22 addr (обычная форма)

ED 63 addr (необычная)

LD (addr), BC ED 43 addr

LD (addr), DE ED 53 addr

LD (addr), IX ED 22 addr

LD (addr), IY FD 22 addr

LD (addr), SP ED 73 addr

Приведенные команды выполняют только непосредственную адресацию, и важно заметить, что нет команд для записи в память констант. Если это необходимо, константа должна быть загружена в регистр A, или каким либо другим путем. Затем, команды типа LD (addr), HL - фактически двойные команды: LD (addr), L и LD (addr+1),H.

Команды подгруппы часто используются для сохранения адреса и значений в памяти, когда те значения рассматриваются как переменные. Например, часто используется LD (RAMTOP),HL, где RAMTOP - метка пары последних адресов в памяти. Выборка текущего значения может быть позднее выполнена командой 4 группы, например LD HL, (RAMTOP).

Подгруппа b. Команды косвенной адресации.

Команды этой подгруппы позволяют копировать содержимое регистров в память, адрес которой содержится в регистровой паре HL, BC или DE. Существует также команда записи однобайтовой константы по адресу, указанному в паре HL.

Мнемоника Шестнадцатиричный код

LD (HL), A 77

LD (BC), A 02

LD (DE), A 12

LD (HL), H 74

LD (HL), L 75

LD (HL), B 70

LD (HL), C 71

LD (HL), D 72

LD (HL), E 73

LD (HL), +dd 36 dd

Подгруппа c. Команды индексной адресации.

Мнемоника Шестнадцатиричный код

LD (IX+d), A DD 77 d

LD (IX+d), H DD 74 d

LD (IX+d), L DD 75 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), +dd DD 3 6 dd

Для команд, использующих IY - регистровую пару надо изменить IX на IY и DD на FD.

Группа 6. Команды сложения.

Эта группа - первая из четырех групп командz8 0, выполняющих арифметические и логические операции.

Команды сложения позволяют программисту прибавить (в абсолютной двоичной арифметике) заданное число к регистру, паре регистров или индексному адресу памяти.

Команды этой группы могут быть разделены на три группы, каждая из которых содержит собственное мнемоническое имя:

a) команды ADD

b) команды INK. Специальный случай сложения, когда к числу прибавляется единица.

c) команда ADC. Значение флага переноса прибавляется к результату. Флаг переноса - это один из битов регистра флагов, и используется для сигнализации о том, было ли при выполнении последней арифметической операции двоичное переполнение регистра или байта памяти. Команды ADD и ADC меняют флаг переноса, а INK - команды не меняют - факт, имеющий иногда определенные преимущества.

Мнемоника 16-ричный код Мнемоника 16-ричный код

ADD A,+dd C6 dd ADD HL,HL 2 9

ADD A,A 87 ADD HL,BC 09

ADD A,H 84 ADD HL,DE 19

ADD A,L 85 ADD HL,SP 39

ADD A,B 80 ADD IX,IY DD 29

ADD A,C 81 ADD IX,BC DD 09

ADD A,D 82 ADD IX,DE DD 19

ADD A,E 83 ADD IX,SP DD 3 9

ADD A,(HL) 86

ADD A,(IX+d) DD 86 d

Для команд, использующих IY регистр надо поменять IX на IY и DD на FD. Команды ADD, приведенные выше, все очень просты. Команда устанавливает или сбрасывает флаг переноса в зависимости от того, было или нет двоичное переполнение влево регистра или пары регистров.

Это иллюстрируют следующие примеры: 1. регистр A=60h B=90h выполняется ADD A,B A=F0h

B=90h флаг переноса сброшен; 2 . регистр A=A3h B=7Eh выполняется ADD A,B A=26h

B=7Eh флаг переноса установлен.

Подгруппа b. Команда ADC.

Мнемоника 16-ричный код Мнемоника 16-ричный код

ADC A,+dd CE dd ADC HL,HL ED 6A

ADC A,A 3 F ADC HL,BC ED 4A

ADC A,H 8C ADC HL,DE ED 5A

ADC A,L 8D ADC HL,SP ED 7A

ADC A,B 88

ADC A,C 8 9

ADC A,D 8A

ADC A,E 8B

ADC A,(HL) 8E

ADC A,(IX+d) DD 8E d

ADC A,(IY+d) FD 8E d

Команды этой подгруппы позволяют программисту сложить два числа вместе с текущим значением флага переноса.

Все команды этой подгруппы меняют флаг переноса. Он сбрасывается, если операция ADC не дает десятичного переполнения и устанавливается, если дает.

Группа 7. Команды вычитания.

Команды вычитания позволяют программисту вычесть (в абсолютной арифметике) заданное число из ординарного регистра, пары регистров или индексного регистра памяти.

Снова команды этой группы могут быть разделены на 3 подгруппы, каждая из которых имеет свою мнемонику.

Подгруппы:

a) команды SUB:

b) команды DEC. Специальный случай вычитания, когда из числа вычитается единица;

c) команды SBC. Значение флага переноса вычитается из результата.

Все команды SUB и SBC изменяют флаг переноса в зависимости от того, требовался ли двоичный заем. Команда DEC оставляет флаг переноса без изменений.

Подгруппа a. Команды SUB.

Мнемоника Шестнадцатиричный код

SUB +dd D6 dd

SUB A 97

SUB H 94

SUB L 95

SUB B 90

SUB C 91

SUB D 92

SUB E 93

SUB (HL) 06

SUB (IX+d) DD 96 d

SUB (IY+d) FD 96 d

Замечание: мнемоника команды, хотя и пишется так, как указано выше, но SUB L подразумевает SUB A,L и т. д., поскольку все команды используют регистр A.

В Z8 0 команда SUB выполняет "истинное" абсолютное двоичное вычитание, как показано на примерах. Флаг переноса сбрасывается, если первоначальное значение регистра A больше или равно вычитаемому, и устанавливается, если меньше.

регистр A=DC регистр A=32

SUB B C флаг =0

регистр B=AA регистр B=AA

регистр A=AA регистр A=CE

SUB B C флаг =1

регистр B=DC регистр B=DC

Подгруппа b. Команды DEC.

Команды этой подгруппы позволяют вычесть 1 из содержимого восьмибитового регистра, ячейки памяти или 16-битовой пары регистров.

Во всех случаях флаг переноса не изменяется.

Мнемоника 16-ричный код Мнемоника 16-ричный код

DEC A 3D DEC HL 2B

DEC H 25 DEC BC 0B

DEC L 2D DEC DE 1B

DEC B DEC SP 3B

DEC C 0D DEC IX DD 2B

DEC D 15 DEC IY FD 2B

DEC (HL) 35

DEC (IX+d) DD 35 d

DEC (IY+d) FD 35 d

Подгруппа c. Команды SBC.

Мнемоника 16-ричный код Мнемоника 16-ричный код

SBC A,+dd DE dd SBC HL,HL ED 62

SBC A,A 9F SBC HL,BC ED 42

SBC A,H 9C SBC HL,DE ED 52

SBC A,L 9D SBC HL,SP ED 72

SBC A,B 98

SBC A,C 99

SBC A,D 9A

SBC A,E 9B

SBC A,(HL) 9E

SBC A,(IX+d) DD 9E d

SBC A,(IY+d) FD 9E d

Команда SBC выполняет "истинное" вычитание, если флаг переноса сброшен и вычитание с заемом, если флаг переноса установлен. Это может быть очень полезно, когда используются значения повышенной точности, так как заем будет участвовать в операциях. Например, 4-байтовое число, содержащееся в регистрах H', L', H, L может быть вычтено из другого числа, хранящегося в регистрах D', E', D, E следующим образом.

AND A сброс флага переноса

SBC HL,DE вычитание младшей части EXX переключение набора

SBC HL,DE вычитание старшей части EXX переключение набора

и соответствующий заем между младшей и старшей частями учитывается .

Группа 8. Команды сравнения.

Команды этой группы используются очень часто во всех программах. Они позволяют программисту сравнивать значение, находящееся в регистре А с константой, значением в регистре или области памяти.

Команда сравнения выполняет операцию вычитания без переноса, без запоминания результата вычитания и только устанавливаются флаги в регистре F. Первоначальное значение в регистре А не изменяется.

Флаг переноса устанавливается так же, как и при операции вычитания. Сравнение, которое дает равенство, сбрасывает флаг переноса, а неравенство - устанавливает.

Команды этой группы - команды "одинарного сравнения", а "блочное сравнение" рассматривается на странице 86.

Команды этой группы:

Мнемоника Шестнадцатиричный код

CP +dd EE dd

CP A BF

CP H BC

CP L BD

CP B B8

CP C B9

CP D BA

CP E BB

CP (HL) BE

CP (IX+d) DD BE d

CP (IY+d) FE BE d

Следующие примеры показывают использование команды СР В.

1. Регистр А = 31h CP B оставляет регистры без изменения В = 3 0h и сбрасывает флаг переноса (31 > 30).

Регистр А = 3 0h CP B оставляет регистры без изменения В = 3 0h и сбрасывает флаг переноса (3 0 = 30).

Регистр А = 01h CP B оставляет регистры без изменения В = 3 0h и устанавливает флаг переноса (1 > 30).

Группа 9. Логические команды.

В системе команд Z8 0 существуют команды AND, OR и XOR, которые применяются к регистру А и другому заданному операнду. Операции выполняются побитно и 8-битовый результат возвращается в регистр А.

Три типа логических команд будут теперь обсуждены по очереди.

Подгруппа а. Команды AND

Логическая операция "И" выполняется над двумя двоичными цифрами и результат равен 1 только, если оба тестируемых бита установлены. В противном случае результирующий бит нулевой .

Следующий пример показывает, как команда "И" выполняется над восемью отдельными битами.

двоичн. 10101010 шестнадц. АА

AND AND

11000000 C0

результат ------------------------------------

10000000 80

Команды в подгруппе следующие:

Мнемоника Шестнадцатиричный код

AND +dd E6 dd

AND A A7

AND H A4

AND L A5

AND B A0

AND C A1

AND D A2

AND E A3

AND (HL) A6

AND (IX+d) DD A6 d

AND (IY+d) FD A6 d

Командой AND возможно обрабатывать биты 0-3 регистра А. Этот процесс называется демаркированием и позволяет программисту проверять определенные биты данных. Следующий пример показывает, как это делается.

В системе Спектрум биты 0-2 системной переменной ATTR-P содержат информацию о цвете чернил. Когда цвет чернил изменяется, старое значение удаляется использованием команды AND и новый цвет вводится по команде ADD, т.е.

LD A,(ATTR-P) находится системная переменная

AND +F1 демаркируется старший цвет

AND +NEW COLOUR добавляется новый цвет

LD (ATTR-P),A сохраняется системная переменная

Подгруппа b. Команды OR

Логическая операция "ИЛИ" выполняется над двумя двоичными цифрами и результат равен 1, если одна или обе двоичные цифры установлены. В противном случае бит результата сброшен .

Следующий пример показывает, как команда OR выполняет операцию над восемью отдельными битами.

двоичн. 10101010 шестнадц. АА

OR OR

11000000 C0

результат -------------------------------------

11101010 ЕА

Команды в подгруппе следующие:

Мнемоника Шестнадцатиричный код

OR +dd F6 dd

OR A B7

OR H B4

OR L B5

OR B B0

OR C B1

OR D B2

OR E B3

OR (HL) B6

OR (IX+d) DD B6 d

OR (IY+d) FD B6 d

Подгруппа c. Команды XOR

Логическая операция "XOR" ("ИСКЛЮЧАЮЩЕЕ ИЛИ") выполняется над двумя двоичными цифрами и результат равен 1, только если одна двоичная цифра установлена. В противном случае бит результата сброшен.

Следующий пример показывает, как команда XOR выполняет операцию над восемью отдельными битами.

двоичное 10101010 шести. АА

XOR XOR

11000000 C0

результат: ----------------------------

01101010 6А

Команды этой подгруппы:

XOR +dd EE dd

XOR A AF

XOR H AC

XOR L AD

XOR B A8

XOR C A9

XOR D AA

XOR E AB

XOR (HL) AE

XOR (IX+d) DD AE d

XOR (IY+d) FD AE d

При работе команды XOR будут устанавливаться или сбрасываться до 8 битов регистра А. Это, вероятно, вначале трудно понять, но рассмотрите пример, приведенный выше еще раз; а именно:

AA XOR C0 дает 6А

В этом примере вторым операндом является байт "С0", который является байтом только из битов 6 и 7.

Поэтому эффект работы операции "XOR" заключается в переключении битов 6 и 7 первого операнда и изменении АА на 6А.

Использование команд XOR в программах на машинном коде часто является сложным, но команда XOR A, однако, часто используется как альтернатива для LD A,+00. Обе из этих команд "очищают" регистр А, но XOR A использует только один адрес, в то время, как LD A,+00 - использует два адреса.

Все команды AND, OR и XOR сбрасывают флаг переноса.

Группа 10. Команды перехода

В Z8 0 имеются 17 команд, которые позволяют программисту выполнять "переходы" внутри программы. Переход машинного кода может приравниваться к команде Бейсика "GO TO", но сравнение не должно заходить слишком далеко.

Команды этой группы лучше всего рассматривать в 8 подгруппах .

Четыре из них содержат команды, которые условно зависят от состояния одного из основных флагов и, если требуется,

флаги будут подробно рассмотрены.

Подгруппа а: команда безусловного перехода

JP addr C3 addr

Это классическая команда перехода. При выполнении команды значение addr загружается в счетчик команд и выполнение программы в машинных кодах продолжается с этого адреса.

Подгруппа b: команды перехода, использующие косвенную адресацию

Командами этой группы являются:

Мнемоника Шестнадцатиричный код

JP (HL) E9

JP (IX) DD E9

JP (IY) FD E9

Подгруппа с: команда относительного безусловного перехода

Это команда:

Мнемоника Шестнадцатиричный код

JR e I8 e

Подгруппа d: команды перехода по флагу переноса Кратко можно описать следующее правило:

1. Все команды ADD и ADC влияют на флаг переноса. Если нет "переполнения", флаг сбрасывается, если есть - флаг устанавливается .

2. Все команды SUB,SBC и CP влияют на флаг переноса. Если был двоичный заем, тогда флаг устанавливается; в противном случае - сбрасывается.

3. Все команды AND, OR и XOR сбрасывают флаг переноса.

4. Команды сдвига влияют на флаг переноса (см. стр. ).

Командами перехода по флагу переноса являются:

Мнемоника Шестнадцатиричный код

JR NC, addr D2 addr переход, если флаг

С сброшен

JR NC, e 3 0 е переход, если флаг

С сброшен

JR NC, addr DA addr переход, если флаг

С установлен

JR C, e 3 8 e переход, если флаг

С установлен

В качестве примера этих команд рассмотрите следующую программу, которая "распознает" цифры в коде ASCII.

введите регистр А хранящий код СР +3 0 код цифры "0"

JR C, error переход, если он находится

за пределами диапазона СР +3А код для ":"

JR NC, error переход, если он за пределами

диапазона

Подгруппа е: команды перехода по флагу нуля

Имеются четыре команды, которые позволяют выполнять "переход" только в том случае, если флаг нуля будет таким же, как требует команда.

Флаг нуля.

Этому флагу соответствует шестой бит регистра F и в большинстве случаев он устанавливается, если результат работы равен нулю, в противном случае он сбрасывается.

Например:

6С ADD 5A дает С6 и флаг нуля сбрасывается; но

6С ADD 94 дает 00 и флаг нуля устанавливается.

Можно привести кратко следующие правила:

1. Все команды ADD, INC, ADC, SUB, DEC, SBC, CP, AND, OR и XOR, использующие одиночные регистры, и команды ADC и SBC, использующие пару регистров, установят флаг нуля, если результат равен нулю.

2. Команды сдвига, команды проверки битов и команды поиска блока влияют на флаг нуля.

3. Команды LD, за исключением LD A,I и LD A,R не влияют на флаг нуля.

Командами перехода по состоянию флага нуля являются:

Мнемоника Шестнадцатиричный код

JR NZ, addr C2 addr переход, если флаг

JR NZ, e 2 0 е нуля сброшен

JR Z, addr CА переход, если флаг

JR Z, e 28 е нуля установлен

Команды этой подгруппы широко используются, и следующий пример показывает, как распознать символы ASCII.

введите в регистр А код символа.

CP +3B Это символ ":"?

JR Z, S-colon переход, если это не так.

CP +2C Это ","?

JR NZ, else переход, если нет и

продолжение при ","

Подгруппа f: команды перехода по флагу знака

Имеются две команды, которые позволяют выполнить переход только в том случае, если флаг знака будет соответствовать условию команды.

Далее мы обсудим флаг знака.

Этому флагу соответствует седьмой бит регистра F и в большинстве случаев он представляет собой копии старшего (левого) бита результата.

Когда восьмибитное или шестнадцатибитное двоичное число представлено в виде арифметического дополнения до 2, тогда левый бит (бит 7 или 15) принимается как бит знака. Он сбрасывается для положительных чисел, и устанавливается для отрицательных .

Поэтому флаг знака может сбрасываться с помощью положительных результатов и устанавливается с помощью отрицательных .

Кратко опишем следующее правило:

1. Все команды ADD, INC, ADC, SUB, DEC, SBC, CP, AND, OR и XOR, использующие один регистр, а команды ADC и SBC, использующие два регистра, будут влиять на флаг знака, как указано выше.

2. Команды поиска блока и большинство команд сдвига также влияют на флаг знака.

3. Команды LD, за исключением LD A,I и LD A,R не изменяют флаг знака.

Командами перехода по состоянию флага знака являются: JR P, addr F2 addr переход, если результат положительный JR М, addr FА addr переход, если результат отрицательный

Команды в этой подгруппе обычно не используются. Частично потому, что требуют абсолютного адреса, с частично потому, что бит знака может считываться несколькими другими способами .

Подгруппа g: команды перехода по флагу переполнения/четности

Имеются две команды, позволяющие выполнить переход, если флаг переполнения / четности будет таким, как того требует команда.

Флаг переполнения / четности

Этому флагу соответствует второй бит регистра F и он является флагом двойного назначения. Некоторые команды используют флаг, чтобы указать на "переполнение", в то время, как другие команды используют его, чтобы хранить результат проверки на четность.

Понятие "переполнение" не относится к двоичному переполнению, а к арифметическому дополнению до 2, как показано следующими примерами.

Рассмотрим: 16-ричное 0А ADD 5C дает 66,

десятичное 10 ADD 92 дает 10, что правильно - нет переполнения. 16-ричное 6A ADD 32 дает 9С, десятичное 106 ADD 50 дает 100, что неправильно - имеется переполнение.

Переполнение может также возникнуть при вычитании, а именно:

16-ричное 83 SUB 14 дает 6F,

десятичное 125 SUB 20 дает 111, что неправильно,

т.е. имеется переполнение.

Флаг переполнение / четность устанавливается, когда имеет место переполнение.

Понятие "четности" касается числа единичных битов в заданном байте.

Это показано следующим примером.

Байт 01010101 имеет четное равенство и флаг устанавливается, но байт 00000001 имеет нечетное равенство и флаг сбрасывается.

Кратко опишем следующее правило:

1. Все команды ADD, ADC, SBC и CP, использующие одиночные регистры, а команды ADC и SBC, использующие два регистра, дают результат, который может быть проверен на переполнение .

2. Все команды AND, OR и XOR и большинство команд сдвига дают результат, который может быть проверен на четность.

3. Команда INC установит флаг, если результат будет равен 80h и команда DEC, результат равен 7Fh.

4. Различные другие команды, а именно: LD A,I и LD A,R и многие из команд обработки блоков также влияют на состояние флага переполнения / четности.

Команды перехода по флагу переполнения / четности представлены ниже.

JP PO, addr E2 addr переход, если равенство

нечетное или нет переполнения JP PE, addr EA adda переход, если равенство

четное или есть переполнение

Команды этой подгруппы используются только в тех случаях, когда невозможно использование других команд.

Группа 11. Команды DJNZ e

Одиночная команда в этой группе является одной из самых полезных и самой широко используемой в ZX80.

Это команда:

мнемоника 16-ричный код

DJNZ e 10 e

Мнемоника означает: уменьшение регистра В и переход, если флаг нуля сброшен.

Работа этой команды может быть похожа на цикл FOR-NEXT программы на Бейсике следующего вида:

FOR B=x TO 0 STEP -1: NEXT B

В этом цикле в переменную В заносится величина х. Затем, с каждым проходом цикла В уменьшается до тех пор, пока не достигнет нуля.

Команда DJNZ, e используется подобным образом. Прежде всего, программист должен определить значение переменной цикла и занести ее в регистр В. Затем идет цикл. Наконец, используется, что величина смещения подходит.

Следующий пример показывает, как эта команда должна использоваться для печати алфавита.

LD B, +1A 26 букв в алфавите (английском).

LD A, +5B "А" - первая, т.е.

SUB B 3В - 1А = 41 (шестнадцатир.)

RST 0010 печать символа

DJNZ, L0 0P "сдвиньте" для "В", "С" и т.д. аналогично

Шестнадцатиричным кодом для этого примера является 06, 1А, 3 Е, 5В, 90, D7, 10, FA где байт "3Е" является "меткой" цикла.

Автор обнаружил, что лучшие методики для вычисления правильной величины "е" в примерах коротких машинных кодов, какой приведен - это представить байт "е" величиной "FF" и затем считать в обратном направлении в 16-ричной форме до тех пор, пока не будет достигнут байт цикла. В приведенном выше

примере имеется пять шагов назад и соответствующая величина для "е" равна 16-ричному FA.

Группа 12. Команды стека

В большинстве программ в машинных кодах осуществляется активное использование машинного стека как программистом - в качестве места, где можно сохранить данные, так и микропроцессором - для сохранения адресов возврата.

Команды, которые образуют эту группу, можно разделить на две подгруппы для пользователя и три подгруппы для микропроцессора .

Подгруппа а: команды PUSH и POP. Эти команды позволяют программисту по PUSH сохранять два байта данных в машинном стеке, а по PP - копировать два байта из машинного стека.

Два байта данных должны копироваться в строго установленную пару регистров, но важно знать, что никакой записи не производится, которая указывала бы, к какому из двух регистров какие байты должны принадлежать.

Командами этой подгруппы являются:

Мнемоника 16-ричный код Мнемоника 16-ричный код

PUSH AP F5 POP AF F1

PUSH HL E5 POP HL E1

PUSH BC C5 POP BC C1

PUSH DE D5 POP DE D1

PUSH IX DD E5 POP IX DD E1

PUSH IY FD E5 POP IY FD E1

Подгруппа b: команды обмена

Эти команды позволяют обменять содержимое регистра и двух байт с вершины стека.

Командами этой группы являются:

Мнемоника 16-ричный код

EX (SP),HL E3

EX (SP),IX DD E3

EX (SP),IY FD E3

Подгруппа с: команды CALL Эти команды позволяют программисту обращаться к подпрограммам .

Командами этой подгруппы являются:

Мнемоника 16-ричный код

CALL adar CD adar

CALL NZ,adar C4 adar

CALL Z,adar CC adar

CALL NC,addr D4 addr

CALL C,addr DC addr

CALL PO,addr E4 addr

CALL PE,addr EC addr

CALL P,addr F4 addr

CALL M,addr FC addr

Подгруппа d: команды RET

Командами этой подгруппы являются: Мнемоника 16-ричный код

RETN CB 45

RETI CB 4D

RET C9

RET C D8

RET NC D0

RET Z C8

RET NZ C0

RET M F8

RET P F0

RET PE E8

RET PO E0

По команде RET адрес возврата из машинного стека побайтно восстанавливается в счетчике команд. При этом указатель стека дважды модифицируется в сторону увеличения.

Важно понимать, что восстановленный адрес возврата из машинного цикла не обязательно тот, что был вначале помещен туда командой CALL.

Не совсем обычно при программировании на Бейсике модифицировать стек GO SUB, но при программировании в машинных кодах это имеет место.

Следующий пример показывает, как это делается. Адрес программы выбирается из таблицы адресов и на эту программу осуществляется переход.

............регистр А содержит входное значение

LD D +00 очистка регистра

ADD A дублирование входного значения

LD E, A и пересылка в регистр

LD HL, +Table-base HL указывает на таблицу

ADD HL, DE указательна точку входа

LD D (HL) получение старшего байта адреса

INC HL

LD E (HL) получение младшего байта адреса

PUSH DE сохранение адреса в стеке

RET возврат

Подгруппа е: команды RST

Последняя подгруппа команд в этой группе содержит специальную команду RST или команду "повторный запуск".

Эти команды являются аналогичными командам CALL, но не требуют, чтобы "адрес" определялся.

Командами этой подгруппы являются:

RST 0000 C7 CALL 0000

RST 0000 CF CALL 0008

RST 0010 D7 CALL 0010

RST 0018 DF CALL 0018

RST 0020 E7 CALL 0020

RST 0028 EF CALL 0028

RST 0030 F7 CALL 0030

RST 0038 FF CALL 0038

В системе Спектрум восемь адресов "перезапуска" являются точками входа подпрограмм монитора и они будут рассмотрены в главе 7.

Группа 13. Команды сдвига

Набор команд Z8 0 имеет большее число команд для сдвига битов определенного байта. Эти команды часто очень полезны. Тем более, что все они сдвигают биты через флаг переноса, который затем может проверяться.

Сдвиг байта влево удваивает величину, записанную в этом байте, поскольку самые старшие биты не теряются. Во время сдвига байта вправо величина делится пополам.

Рисунок 5.1 показывает ряд сдвигов, которые возможны. Следующая таблица демонстрирует команды этой группы

RLC RL SLA RRC RR SRA SRL

A CB0 7 CB17 CB27 CB0F CB1F CB2F CB3F

H CB04 CB14 CB24 CB0C CB1C CB2C CB3C

L CB0 5 CB15 CB25 CB0B CB1D CB2D CB3D

B CB00 CB10 CB20 CB08 CB18 CB28 CB38

C CB01 CB11 CB21 CB0 9 CB19 CB29 CB39

D CB02 CB12 CB22 CB0A CB1A CB2A CB3A

E CB03 CB19 CB23 CB0B CB1B CB2B CB3B

(HL) CB06 CB16 CB26 CB0E CB1E CB2E CB3E

(IX+d) DDCB DDCB DDCB DDCB DDCB DDCB DDCB

d 06 d 16 d 26 d 0E d 1E d 2E d 3E

(IY+d) FDCB FDCB FDCB FDCB FDCB FDCB FDCB

d 06 d 16 d 26 d 0E d 1E d 2E d 3E

Имеется также четыре однобайтовые команды для сдвига регистра А и две специальные команды, работающие с полубайтами .

RLCA 0 7

RLA 17

RRCA 0F

RRA 1F

RRD ED 67

RLD ED 6F

Суммируя влияние команд из этой группы на основные флаги, можно сделать следующие заклинания:

1. Все команды, за исключением RLD и RRD, влияют на флаг переноса

2. Все команды, за исключением четырех команд с одиночными байтами влияют на флаги знака и переполнения / четности.

RLC & RLCA

RL & RLA

SLA

RRC & RRCA RR & RRA SRA SRL

RLD (HL)

RRD

Две специальные команды

Рис. 5.1. Различные типы сдвигов

Группа 14. Команды обработки битов

Набор команд Z80 имеет команды, которые позволяют программисту проверять, устанавливать и сбрасывать определенные биты в пределах байта, помещенного в регистр или находящегося в памяти.

Три типа команд будут рассмотрены поочередно.

Подгруппа a: команды BIT

Команды BIT позволяют программисту определять состояние определенного бита. За использованием одной из этих команд обычным является процесс проверки, например, путем использования команды JP z.

Команда BIT устанавливает флаг нуля, если исследуемый бит сброшен, и наоборот.

Подгруппа b: команды SET

Команды SET позволяют программисту устанавливать определенный бит. Ни один из флагов не изменяется.

На практике команды используются для установки битов. Но во многих случаях их использование лучше описывать как подтверждение, что определенный бит установлен. Команда SET, работающая на бите, который уже установлен, не будет иметь демонстрационного эффекта.

Подгруппа с: команды RES

Команды RES позволяют программисту сбрасывать определенный бит. Ни один из флагов не изменяется.

Команды из этих трех подгрупп приведены в следующей таблице .

BIT 47 4F 57 5F 67 6F 77 7F

RES 87 BF 97 9F A7 AF B7 BF

B* * SET C7 CF D7 DF E7 EF E7 FF

BIT 44 4C 54 5C 64 6C 74 7C

RES 84 8C 94 9C A4 AC B4 BC

B** SET C4 CC D4 DC E4 EC E4 FC

BIT 45 4D 55 5D 65 6D 55 5D

RES 85 8D 95 9D A5 AD B5 BD

B** SET C5 CD D5 DD E5 ED F5 FD

BIT 40 48 50 58 60 68 00 08

RES 80 88 90 98 A0 A8 B0 B8

CB** SET C0 C8 D0 D8 E0 E8 F0 F8

C BIT..41 49 51 59 61 69 11 19

RES 81 89 91 99 A1 A9 B1 B9

CB** SET C1 C9 D1 D9 E1 E9 F1 F9

D BIT 42 4A 52 5A 62 6A 22 2A

RES 82 8A 92 9A A2 AA B2 BA

CB** SET C2 CA D2 DA E2 EA F2 FA

F BIT 43 4B 53 5B 63 6B 33 3B

RES 83 8B 93 9B A3 AB B3 BB

CB** SET C3 CB D3 DB E3 EB F3 FB

(HJ) BIT 46 4E 56 5E 66 6E 66 6E

RES 86 8E 96 9E A6 AE 86 BE

CB** SET C6 CE D6 DE E6 EE F6 FE

Замечание: для команд, использующих индексные регистры, см. приложение.

Группа 15. Команды обработки блока

Имеется восемь команд блока обработки в Z8 0. Эти команды очень интересны и полезны. Они позволяют программисту перемещать блок данных из одной области памяти в другую, или искать область памяти.

Чтобы перемещать блок данных, базовый адрес должен помещаться в пару регистров HL, и число байтов в блоке - в пару регистров BC.

Для того, чтобы искать область первого присутствия в памяти определенной величины, базовый адрес может опять быть в паре регистров HL, число байтов области поиска - в паре регистров BC, а регистр А должен содержать искомую величину.

Команды подгруппы:

AUTOMATIC

LDIR ED B0

LDDR ED B8

CPIR ED B1

CPDR ED B9

NON - AUTOMATIC

LDI ED A0

LDD ED A8

CPI ED A1

CPD ED A9

Как можно увидеть из вышеприведенной таблицы, имеется как автоматические, так и неавтоматические команды. Автоматические команды более простые и более полезные.

Автоматическая команда будет выполнять свою задачу без другой команды, составленной программистом. Когда команда LDIR выполняется микропроцессором, тогда блок данных перемещается. Отсюда следует, что выполнение автоматической команды может длиться разное время. Это время зависит от количества байтов, которые будут перемещаться.

Однако, неавтоматическая команда передает только по одному байту и требует, чтобы программист использовал команду поочередно, если блок данных перемещается или находится в стадии поиска. Время неавтоматической команды поэтому определенное .

Неавтоматическая команда представляет собой команду "обработки блока", при выполнении которой адреса источника, получателя и счетчика приращения уменьшаются или увеличиваются микропроцессором.

Каждая команда этой группы будет обсуждаться по очереди.

LDIR

Это самая распространенная команда из 8 команд этой группы.

Команда LDIR будет перемещать данные, адрес источника которых содержится в паре регистров H, в область памяти с адреса, находящегося в паре регистров DE с числом байтов, определенных в паре регистров BC.

При работе одиночный байт перемещается из (HL) в (DE).

Величина в паре регистров ВС затем уменьшается, а величины в парах HL и DE увеличиваются.

Если "счетчик" в регистре ВС еще не достиг нуля, будет пересылаться следующий байт данных. Этот процесс продолжается пока "счетчик" не достигнет нуля, но заметьте, что в этот момент регистры HL и DE достигают значения адресов после блока.

Флаг переполнения / четности сбрасывается этой командой.

LDDR

Эта команда является такой же, как команда LDIR, за исключением того, что после пересылки каждого байта, значения в парах регистров HL и DE уменьшаются. Поэтому команда требует, чтобы "базовый адрес" блока соответствовал последнему адресу блока. Место назначения информации также должно относиться к последнему адресу области.

CPIR

Эта команда просматривает определенную область памяти для поиска первого появления образца. Регистр HL должен содержать базовый адрес, а ВС - число байтов для исследования, регистр А - образец.

При работе байт из (HL) сравнивается с байтом (А). Если они не совпали, ВС уменьшается, а HL увеличивается и сравниваются следующие. Так до тех пор, пока не совпадут байты, либо пока ВС не обнулится. Если байты совпали, флаг нуля устанавливается, флаг знака сбрасывается, а регистр HL указывает адрес выбранного байта. Величина в ВС указывает, как далеко от конца блока определено совпадение.

Если байт не был найден, регистр ВС=0, флаги нуля, знака и переполнения / четности сбрасываются.

CPDR

Работа этой команды похожа на CPIR, но блок данных просматривается снизу вверх.

Далее рассматриваются неавтоматический команды.

LDI

Выполнение этой команды перемещает одиночный байт данных их адреса в регистровой паре HL по адресу, указанному в регистровой паре DE. Величина в ВС уменьшается. Флаг переполнения / четности устанавливается до тех пор, пока регистровая пара ВС не станет равна 0. Значения в регистровых парах DT и HL уменьшаются.

Это сделано для программиста, который решил либо перемещать, либо не перемещать байты данных. Программист, вероятно, проверит байт, который надо перемещать и затем уже осуществит его перемещение.

LDD

Как LDI, за исключением того, что величины в HL и DE уменьшаются.

CPI

Выполнение этой команды приведет к тому, что байт, определенный по паре HL, копируется в микропроцессор и сохраняется там до тех пор, пока величина в HL увеличивается, а в ВС - уменьшается. Сохраненный байт затем сравнивается с байтом в регистре А.

Если они совпали, флаг нуля устанавливается, иначе -сбрасывается.

Флаги знака и переполнения / четности сбрасываются до тех пор, пока ВС не станет равным нулю, при ВС=0 он останавливается .

CPD

Эта команда подобна CPI за исключением того, что регистровая пара HL уменьшается.

Группа 16. Команды ввода/вывода

В Z8 0 имеется исчерпывающий набор команд, позволяющий программисту получать данные от внешнего устройства (IN) или выдавать данные на периферию (OUT).

Имеются простые, неавтоматические и автоматические команды в этой группе, хотя в Спектрум используется только простые команды. Во всех случаях данные, передающиеся через IN или OUT представляют форму 8-битовых байтов. По команде IN Z8 0 принимает байты данных с шины данных и копирует их в определенный регистр. Во время выполнения команды IN контрольная линия IORQ активна, также как и RD.

По команде OUT, МП передает данные с определенного регистра на шину данных, откуда они поступают на периферийное устройство. Во время работы команда OUT линии IORQ и WR будут активна.

В дополнение в состоянии RD, WR и IORQ периферийное устройство будет активизироваться с использование адреса, помещенного на адресной шине во время выполнения либо IN, либо OUT команды (по требованию). Этот адрес опознает адрес порта и в Z8 0 представляет собой 16-разрядный адрес. В небольшом микрокомпьютере, таком, как Спектрум, обычно используют всего несколько из 65536 возможных адресов портов, позволяя периферийному устройству идентифицироваться состоянием определенной линии адреса.

Принтер Спектрум выбирается линией А2. Командами этой группы являются:

IN A, (+dd) DB dd A A dd

IN A, (C) ED 78 A B C

IN H, (C) ED 60 H B C

IN L, (C) ED 68 L B C

IN B, (C) ED 40 R B C

IN C, (C) ED 48 C B C

IN D, (C) ED 50 B B C

IN E, (C) ED 58 E B C

OUT (+dd).A D3 dd A B dd

OUT (C),A ED 79 A B C

OUT (C),H ED 61 H B C

OUT (C),L ED 69 L B C

OUT (C),B ED 41 B B C

OUT (C),C ED 49 C B C

OUT (C),D ED 51 D B C

OUT (C),E ED 59 E B C

Неавтоматическими и автоматическими командами являются:

INI ED A2 увеличение; неавтоматическая

INIR ED B2 увеличение; автоматическая

IND ED AA уменьшение; неавтоматическая

INDR ED BA уменьшение; автоматическая

OUTI ED A3 увеличение; неавтоматическая

OTIR ED B3 увеличение; автоматическая

OUTD ED AB уменьшение; неавтоматическая

OTDR ED BB уменьшение; автоматическая

Группа 17. Команды прерывания

Имеется 7 команд в Z8 0, которые позволяют программисту прервать систему Z80.

Командами этой группы являются:

EI FB

DI F3

IM0 ED 46 IM1 ED 56 IM2 ED 5E RETI ED 4D RETN ED 45

Каждая из этих команд будет рассмотрена поочередно.

EI

При включении Z80, система маскируемых прерываний не может прерывать Z8 0. Эта ситуация существует до тех пор, пока прерывания не будут разрешены по команде EI.

В Спектрум система маскируемых и немаскируемых прерываний используется для отсчета реального времени и опроса клавиатуры и эти прерывания синхронизируются частотой 50 гц.

DI

В любом месте программы программист может запретить прерывания по команде DI, которая не позволяет микропроцессору принимать сигналы с линии INT.

В Спектрум маскируемые прерывания невозможны во время выполнения команд SAVE, VERITY, MERGE.

IM 0

Имеется три режима прерываний режим 0 выбирается автоматически микропроцессором при выключении или по команде IM 0. Этот режим позволяет периферийным устройствам обмениваться информацией с микропроцессором, программа перезапуска которого должна следить за приемом маскируемого прерывания на линии INT. Этот режим в Спектрум не используется.

IM 1

Режим прерывания 1 выполняется по команде IM1, и он используется в Спектрум. При использовании 16К монитора необходимо включить IM1 в начало программы.

В этом режиме перезапуск с адреса 0 03 8h будет всегда выбираться при приеме сигнала по линии INT, длительность которого соответствует возможности обработки системы маскируемых прерываний. В Спектрум программа в машинных кодах с 0 03 8 корректирует данные, полученные в реальном времени и опрашивает клавиатуру.

IM 2

Режим прерывания 2 не используется в Спектрум, но является самым мощным из трех режимов. В нем периферийное устройство может указывать микропроцессору, какая из 128 различных программ должна обрабатывать маскируемое прерывание. Содержимое регистра I и байта, который поступает на внешнее устройство, используются вместе, чтобы образовать 16-разрядный адрес, который затем используется для выбора "таблицы векторов", которая прежде размещается в памяти.

RETI

Это специальная команда возврата для использования с программой обработки маскируемых прерываний. По этой команде происходит возврат с сохранением маскируемого прерывания, принятого ранее.

RETN

Эта команда подобна RETI, но она применима в конце программы маскируемых прерываний.

Группа 18. Дополнительные команды Имеется 6 команд, которые рассматриваются далее, а именно:

CPL 2F CCF 3 F

NEG ED 14 HALT 76

SCF 3 7 DAA 2 7

Каждая из них будет рассмотрена по очереди.

CPL

Представляет собой простую команду ,которая инвертирует регистр А ,т.е. устанавливает сброшенный бит и сбрасывает установленный. Это называется дополнением до единицы. Основные флаги не изменяются.

NEG

Это команда дополнения до 2 содержимого регистра А, т.е. инвертирование с увеличением. Команда NEG влияет на основные флаги. Флаги знака и нуля зависят от результатов. Флаг переноса будет установлен ,если регистр А первоначально был нулевой, в противном случае он сбрасывается и флаг переполнения/четности устанавливается, если в начале в регистре А было 16-ричное 80, в противном случае сбрасывается .

SCF

Установка флага переноса.

CCF

Сброс флага переноса.

HALT

Это специальная команда, заставляющая микропроцессор останавливать выполнение команд, пока не возникает прерывание . В ^ектрум единственными прерываниями могут быть маскируемые. Следовательно, при поступлении прерываний, команда HALT заканчивается следующим сигналом маскируемого прерывания. Команда PAUSE использует это, чтобы отсчитывать по 1/5 0 секунды.

DAA

Это команда десятичной переупаковки регистра А. В двоично-десятичной арифметике (BCD)-десятичные цифры представлены двоичными тетрадами 0000-1001, а тетрады 1010-1111 не используются. Поэтому: байт 0000 0000 представляет число 0 байт 0011 1001 представляет число 39.

Эта команда превращает байты в двоично-десятичную систему (BCD). Флаги нуля и знака зависят от результата, а флаг переполнения/четности устанавливается. Флаг переноса зависит от того, было ли переполнение или заем при операции BCD.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - Реклама и объявления ...
Творчество - О новинках в Черном вороне-2.
Приветы - Поздравляю Сергея Окрокова с 14 - летием !
Gates - информация о гейтах Гродненской сети (Gate Grodno C_NET <> Minsk ZxNET).
Увеличение памяти под код в EvoSDK - как расширить область памяти кода до очень больших объёмов.

В этот день...   21 ноября