5.3. Флаги признаков
Каждый из двух флаговых регистров МП Z80 содержит по шесть информационных битов,
состояние которых устанавливается в соответствии с результатом операции. Флаги S, Z, C и P/V
используются в командах условного перехода, условного вызова подпрограмм и условного
возврата из подпрограмм. Флаги Ни N непосредственно программно не анализируются. Они
используются в двоично-десятичной арифметике.
S (F7) Sign - Флаг знака
Этот Флаг предназначен для обработки чисел со знаком. Флаг устанавливается,
когда результат операции отрицателен. Т.к. бит 7 является знаковым (любое отрицательное
число содержит единицу в 7 бите), то этот флаг копирует состояние 7 бита аккумулятора.
При программировании состояние этого флага условно кодируется как P (Plus, знак
плюс, S=0) и M (Minus, знак минус, S=1).
Z (F6) Zero - Флаг нуля
Флаг Z устанавливается или обнуляется в результате выполнения следующих
команд:
1. При 8-битных арифметических и логических операциях флаг устанавливается в 1,
если результат выполнения команды равен нулю. Если результат не равен нулю, флаг Z
обнуляется.
2. При командах поиска и сравнения флаг Z устанавливается в 1. когда содержимое
ячейки памяти адресуемой регистровой парой HL, совладает с содержимым аккумулятора.
3. После выполнения команды тестирования отдельного бита во флаг Z
записывается инвертированное значение проверенного бита.
4. Если при выполнении команд INI, IND, OUTI, OUTD результат декремента (В-1)
не равен нулю, то флаг Z=0. Когда результат (В-1)=0, флаг Z устанавливается.
5. Флаг Z устанавливается в 1, когда в результате выполнения команд IN r,(C)
содержимое регистра r обнуляется.
При программировании этот флаг следует условно кодировать как Z (Zero, результат
равен нулю, Z=1) и NZ (No Zero, результат не равен нулю, Z=0)
C (F0) Carry - Флаг переноса
На состояние этого флага влияют следующие команды:
1. Команды сложения устанавливают флаг C, когда есть Перенос от бита 7 к биту 8
результата сложения однобайтных чисел, или от бита 15 к биту 16 при сложении
двухбайтных чисел. Иначе C=0.
2. Команды вычитания устанавливают флаг, если есть заём, и сбрасывают, когда его
нет.
3. Команды RLA, RRA, RL t и RR t используют флаг C как бит связи между 7 и 0
битами.
4. После выполнения команд RLCA, RLC t, SLA t флаг C копирует значение бита 7
операнда.
5. После выполнения команд RRCA, RRC t, SRA t, SRL t флаг C копирует значение
бита 0 операнда.
6. Логические команды AND s, OR s и XOR s обнуляют флаг C.
7. Команда SCF устанавливает флаг C, а команда CCF его инвертирует.
При программировании флаг кодируется как C (Carry, был перенос, C=1) и NC (No
Carry, не было переноса, С=0).
P/V (F2) Parity/Overflow - Флаг чётности/переполнения
Этот флаг имеет несколько функций:
1. При арифметических операциях над числами со знаком он действует как флаг
переполнения V. т.к. диапазон представления чисел со знаком от -128 до +127, то при
операциях над ними возможен выход результата за эти пределы - переполнение. В этом
случае флаг, устанавливается в 1, сигнализируя об ошибочности результата. Логика
установки флага V в 1 такова:
а) если был перенос из 6-го бита в 7-ой, и не было переноса из 7-го бита во флаг C.
б) не было переноса из 6-го бита в 7-ой, но есть перенос из 7-го бита во флаг C.
Примеры: |
|
|
|
1. Сложение |
+76= |
01001100 |
|
|
-114= |
10001110 |
|
C=0 |
|
11011010= |
-38 верно |
V=0 |
|
|
|
2. Сложение |
-1= |
11111111 |
|
|
-1= |
11111111 |
|
С=1 |
|
11111110= |
-2 верно |
V=0 |
|
|
|
3. Сложение |
+82= |
01010010 |
|
|
+94= |
01011110 |
|
C=0 |
|
10110000= |
-80 неверно! |
V=1 |
|
|
|
В последнем примере произошла установка флага V. Это означает, что ошибка
должна быть программно учтена при анализе результата.
2. При выполнении логических операций, команд вращения и сдвига, а также
команды IN r,(C) флаговый бит 2 действует как флаг чётности P. Он устанавливается, когда
регистр содержит четное количество единиц, и обнуляется при нечетном количестве
единиц.
3. При выполнении команд LD A,I и LD A,R флаг P/V копирует состояние триггера
прерываний IFF2, что позволяет в любое время узнать состояние процессора.
4. Во время выполнения команд поиска CPI, CPIR, CPD и CPDR, а также команд
пересылки блоков LDI, LPIR, LDD и LDDR флаг P/V=1, пока содержимое счётчика байтов
(регистр BC) отлично от нуля. Когда BC=0, флаг P/V сбрасывается.
При программировании этот флаг условно кодируется как PO (Parity Odd, нечётно,
P/V=0) и PE (Parity Even, чётно, P/V=1).
H (F4) Halfoarry - Флаг полупереноса
Команды сложения, вычитания, инкремента, декремента и сравнения 8-битных
операндов устанавливают флаг H когда был перенос из третьего бита результата в
четвертый, или был заём от четвёртого бита к третьему. Этим он указывает команде DAA
требует ли результат десятичной коррекции.
N (F1) Addition/Subtraction - Флаг сложения/вычитания
Команды сложение, инкремента и логические команды обнуляют флаг N, а команды
вычитания, декремента, сравнения и инвертирования его устанавливают.
Состояние флага N используется командой DAA. Т.к. алгоритм корректировки
результата двоично-десятичных операций различен при сложении и вычитании, этот флаг
показывает, какое именно действие происходило перед этим.
В таблице 5.2 показано как выполнение команд влияет на регистр флагов. Команды,
которые здесь не представлены, не влияют ни на один флаг.
Таблица 5.2. Флаги признаков.
|
Регистр Флагов |
|
Группа команд |
F7 |
F6 |
F5 |
F4 |
F3 |
F2 |
F1 |
F0 |
Пояснения |
|
S |
Z |
|
H |
|
P/V |
N |
С |
|
LD A,I; LD A,R |
? |
? |
X |
0 |
X |
IF |
0 |
|
P/V ^ IFF2 |
LDI; LDD |
X |
X |
X |
0 |
X |
? |
0 |
|
Если BC^0, то P/V=1 |
LDIR; LDDR |
X |
X |
X |
0 |
X |
0 |
0 |
|
Если BC=0, то P/V=0 |
CPI; CPD; CPIR; CPDR |
X |
? |
X |
X |
X |
? |
1 |
|
Если BC^0, то P/V=1 |
|
|
|
|
|
|
|
|
|
Если BC=0, то P/V=0 |
|
|
|
|
|
|
|
|
|
Если A^(HL), то Z=0 |
|
|
|
|
|
|
|
|
|
Если A=(HL), то Z=1 |
ADD s; ADC s |
? |
? |
X |
? |
X |
V |
0 |
? |
8-битовые арифметические |
SUB s; SBC s; CP s; NEG |
? |
? |
X |
? |
X |
V |
1 |
? |
команды |
AND s |
? |
? |
X |
1 |
X |
P |
0 |
0 |
Логические |
OR s; XOR s |
? |
? |
X |
0 |
X |
P |
0 |
0 |
команды |
INC t |
? |
? |
X |
? |
X |
V |
0 |
|
Только 8-битовые |
DEC t |
? |
? |
X |
? |
X |
V |
1 |
|
команды |
ADD HL,dd; ADD IX,pp; ADD IY,rr |
|
|
X |
X |
X |
|
0 |
? |
16-битовые - |
ADC HL,dd |
? |
? |
X |
X |
X |
V |
0 |
? |
арифметические |
SBC HL,dd |
? |
? |
X |
X |
X |
V |
1 |
? |
команды |
DAA |
? |
? |
X |
? |
X |
P |
|
? |
|
CPL |
|
|
X |
1 |
X |
|
1 |
|
|
CCF |
|
|
X |
X |
X |
|
0 |
? |
|
SCF |
|
|
X |
0 |
X |
|
0 |
1 |
|
RLCA; RLA; RRCA; RRA |
|
|
X |
0 |
X |
|
0 |
? |
Вращение аккумулятора |
RLC t; RRC t; RL t; RR t; SLA t; |
? |
? |
X |
0 |
X |
P |
0 |
? |
Группа команд вращения и |
SRA t; SRL t |
|
|
|
|
|
|
|
|
сдвига |
RLD;RRD |
? |
? |
X |
0 |
X |
P |
0 |
|
Перестановка тетрад |
BIT b,t |
X |
? |
X |
1 |
X |
X |
1 |
|
Z ^ инверсия sb |
IN r,(C); INF |
? |
? |
X |
? |
X |
P |
0 |
|
|
INI; IND; OUTI; OUTD |
X |
? |
X |
X |
X |
X |
1 |
|
Блочные команды |
|
|
|
|
|
|
|
|
|
ввода-вывода: |
INIR; INDR; OTIR; OTDR |
X |
1 |
X |
X |
X |
X |
1 |
|
Если B^0, то Z=0 |
|
|
|
|
|
|
|
|
|
Если В=0, то Z=1 |
5.4. Очереднос^пь выполнения по
циклам
Для обозначения действий микропроцессора в каждой машинном цикле в таблице 5.3
приняты следующие сокращения:
OCR (operation code read) - чтение кода операции;
CBR (control byte read) - чтение управляющего байта кода операции (ED, DD, FD, CB),
IOP (internal CPU-operation) - внутренние операции ЦП, выходные сигналы управления
неактивны;
MRD (memory read) - чтение байта из косвенно адресованной ячейки памяти;
MRH (memory rend, high byte) - чтение старшего байта 16-разрядного слова из косвенно
адресованной ячейки памяти;
MRL (memory read, low byte) - чтение младшего байта 16-разрядного слова из косвенно
адресованной ячейки памяти;
MWR (memory write) - запись байта в косвенно адресованную ячейку памяти;
MWH (memory write, high byte) - запись старшего байта 16-разрядиого слова в косвенно
адресованную ячейку памяти,
MWL (memory write, low byte) - запись младшего байта 16-разрядного слова в косвенно
адресованную ячейку памяти;
ORD (operand read) - чтение операнда-байта, непосредственно представленного в команде;
ORH (operand read, high byte) - чтение старшего байта 16-разрядного слова, непосредственно
представленного в команде;
ORL (operand read, Ion byte) - чтение младшего байта 16-разрядного слова, непосредственно
представленного в команде;
PRD (port read) - ввод данных из порта;
PWR (port write) - вывод данных в порт;
SRH (stack read, high byte) - чтение из стека старшего байта;
SRL (stack read, low byte) - чтение из стека младшего байта;
SWH (stack write, high byte) - запись в стек старшего байта;
SWL (ataok write, low byte) - запись в стек младшего байта;
INTA (interrupt .acknowledge) - подтверждение прерывания микропроцессором;
SPI (stack pointer increment) - инкремент указателя стека в конце цикла;
SPD (atack pointer deorement) - декремент указателя стека в конце цикла;
(n) - продолжительность цикла в периодах тактовой частоты.
Таблица 6.3. очередность выполнения по циклам
Тип команды |
Байт |
Цикл M1 |
Цикл M2 |
Цикл M3 |
Цикл M4 |
Цикл M5 |
Пояснение |
LD r1,r2 |
1 |
OCR(4) |
|
|
|
|
|
LD r,n |
2 |
OCR(4) |
ORD(3) |
|
|
|
|
LD r,(HL) |
1 |
OCR(4) |
MRD(3) |
|
|
|
|
LD (HL),r |
1 |
OCR(4) |
MWR(3) |
|
|
|
|
LD r,(ii+d) |
3 |
CBR(4); OCR(4) |
ORD(3) |
IOP(5) |
MRD(3) |
|
ii: IX или IY |
LD (ii+d),r |
3 |
CBR(4); OCR(4) |
ORD(3) |
IOP(5) |
MWR(3) |
|
|
LD (HL),n |
2 |
OCR(4) |
ORD(3) |
MWR(3) |
|
|
|
LD A,(BC); |
1 |
OCR(4) |
MRD(3) |
|
|
|
|
LD A,(DE) |
|
|
|
|
|
|
|
LD (BC),A; |
1 |
OCR(4) |
MWR(3) |
|
|
|
|
LD (DE),A |
|
|
|
|
|
|
|
LD A,(nn) |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
MRD(3) |
|
|
LD (nn),a |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
MWR(3) |
|
|
LD A,i |
2 |
CBR(4); OCR(5) |
|
|
|
|
i: I или R |
LD i,A |
2 |
CBR(4); OCR(5) |
|
|
|
|
i: I или R |
LD dd,nn |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
|
|
|
LD ii,nn |
4 |
CBR(4); OCR(4) |
ORL(3) |
ORH(3) |
|
|
ii: IX или IY |
LD HL,(nn) |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
MRL(3) |
MRH(3) |
|
LD (nn),HL |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
MWL(3) |
MWH(3) |
|
LD dd,(nn) |
4 |
CBR(4); OCR(4) |
ORL(3) |
ORH(3) |
MRL(3) |
MRH(3) |
|
LD (nn),dd |
4 |
CBR(4); OCR(4) |
ORL(3) |
ORH(3) |
MWL(3) |
MWH(3) |
|
LD ii,(nn) |
4 |
CBR(4); OCR(4) |
ORL(3) |
ORH(3) |
MRL(3) |
MRH(3) |
ii: IX или IY |
LD (nn),ii |
4 |
CBR(4); OCR(4) |
ORL(3) |
ORH(3) |
MWL(3) |
MWH(3) |
ii: IX или IY |
Тип команды |
Байт |
Цикл M1 |
Цикл M2 |
Цикл M3 |
Цикл M4 |
Цикл M5 |
Пояснение |
LD SP,HL |
1 |
OCR(6) |
|
|
|
|
|
LD SP,ii |
2 |
OCR(6) |
|
|
|
|
ii: IX или IY |
PUSH qq |
1 |
OCR(5); SPD |
SWH(3); SPD |
SWL(3) |
|
|
|
PUSH ii |
2 |
CBR(4); OCR(5); SPD |
SWH(3); SPD |
SWL(3) |
|
|
ii: IX или IY |
POP qq |
1 |
OCR(4) |
SRL(3); SPI |
SRH(3); SPI |
|
|
|
POP ii |
2 |
CBR(4); OCR(4) |
SRL(3); SPI |
SRH(3); SPI |
|
|
ii: IX или IY |
EX DE,HL |
1 |
OCR(4) |
|
|
|
|
|
EX AF,AF'; EXX |
1 |
OCR(4) |
|
|
|
|
|
EX (SP),HL |
1 |
OCR(4) |
SRL(3); SPI |
SRH(4) |
SWH(3); SPD |
SWL(5) |
|
EX (SP),ii |
1 |
CBR(4); OCR(4) |
SRL(3); SPI |
SRH(3) |
SWH(3); SPD |
SWL(5) |
ii: IX или IY |
LDI; LDD; |
2 |
CBR(4); OCR(4) |
MRD(3) |
MWR(3) |
|
|
|
CPI; CPD |
|
|
|
|
|
|
|
LDIR; LDDR; |
2 |
CBR(4); OCR(4) |
MRD(3) |
MWR(3) |
IOP(5) |
|
IOP(5) в M4 |
CPIR; CPDR |
|
|
|
|
|
|
только когда BC^0 |
ALU r |
1 |
OCR(4) |
|
|
|
|
ALU означает: |
ALU n |
2 |
OCR(4) |
ORD(3) |
|
|
|
ADD, ADC, SUB, |
ALU (HL) |
1 |
OCR(4) |
MRD(3) |
|
|
|
SEC, AND, OR, |
ALU (ii+d) |
3 |
CBR(4); OCR(4) |
ORD(3) |
IOP(5) |
MRD(3) |
|
XOR или CP |
INC r; DEC r |
1 |
OCR(4) |
|
|
|
|
|
INC (HL); |
1 |
OCR(4) |
MRD(3) |
MWR(3) |
|
|
|
DEC (HL) |
|
|
|
|
|
|
|
INC (ii+d); |
3 |
CBR(4); OCR(4) |
ORD(3) |
IOP(5) |
MRD(4) |
MWR(3) |
ii: IX или IY |
DEC (ii+d) |
|
|
|
|
|
|
|
DAA |
1 |
OCR(4) |
|
|
|
|
|
CPL |
1 |
OCR(4) |
|
|
|
|
|
NEG |
2 |
CBR(4); OCR(4) |
|
|
|
|
|
CCF; SCF |
1 |
OCR(4) |
|
|
|
|
|
NOP; HALT |
1 |
OCR(4) |
|
|
|
|
|
DI; EI |
1 |
OCR(4) |
|
|
|
|
|
IM0; IM1; IM2 |
2 |
CBR(4); OCR(4) |
|
|
|
|
|
ADD HL,dd |
1 |
OCR(4) |
IOP(4) |
IOP(3) |
|
|
|
ADC HL,dd; |
2 |
CBR(4); OCR(4) |
IOP(4) |
IOP(3) |
|
|
ADD ii,pp - это |
SBC HL,dd; |
|
|
|
|
|
|
ADD IX,pp или |
ADD ii,pp |
|
|
|
|
|
|
ADD IY,rr |
INC dd; DEC dd |
1 |
OCR(6) |
|
|
|
|
|
INC ii; DEC ii |
2 |
CBR(4); OCR(6) |
|
|
|
|
ii: IX или IY |
RLCA; RRCA; |
1 |
OCR(4) |
|
|
|
|
|
RLA; RRA |
|
|
|
|
|
|
|
ROT r |
2 |
CBR(4); OCR(4) |
|
|
|
|
ROT означает: RLC, |
ROT (HL) |
2 |
CBR(4); OCR(4) |
MRD(3) |
MWR(3) |
|
|
RL, RRC, RR, SLA, |
ROT (ii+d) |
4 |
CBR(4); CBR(4) |
ORD(3) |
OCR(5) |
MRD(4) |
MWR(3) |
SRA или SRL. |
RLD; RRD |
2 |
CBR(4); OCR(4) |
MRD(3) |
IOP(4) |
MWR(3) |
|
|
BIT b,r; |
2 |
CBR(4); OCR(4) |
|
|
|
|
|
SET b,r |
|
|
|
|
|
|
|
RES b,r |
|
|
|
|
|
|
|
BIT b,(HL) |
2 |
CBR(4); OCR(4) |
MRD(4) |
|
|
|
|
SET b,(HL) |
2 |
CBR(4); OCR(4) |
MRD(4) |
MWR(3) |
|
|
|
RES b,(HL) |
|
|
|
|
|
|
|
BIT b,(ii+d) |
4 |
CBR(4); CBR(4) |
ORD(3) |
OCR(5) |
MRD(4) |
|
|
SET b,(ii+d); |
4 |
CBR(4); CBR(4) |
ORD(3) |
OCR(5) |
MRD(4) |
MWR(3) |
ii: IX или IY |
RES b,(ii+d) |
|
|
|
|
|
|
|
JP nn; JP cc,nn |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
|
|
|
JR e |
2 |
OCR(4) |
ORD(3) |
IOP(5) |
|
|
|
JR C,e; JR Z,e; |
2 |
OCR(4) |
ORD(3) |
IOP(5) |
|
|
IOP(5) - при |
JR NC,e; JR NZ,e |
|
|
|
|
|
|
невыполнении условия |
JP (HL) |
1 |
OCR(4) |
|
|
|
|
|
JP (ii) |
2 |
CBR(4); OCR(4) |
|
|
|
|
ii: IX или IY |
DJNZ e |
2 |
OCR(5) |
ORD(3) |
IOP(5) |
|
|
IOP(5), если B^0 |
CALL nn |
3 |
OCR(4) |
ORL(3) |
ORH(4); SPD |
SWH(3); SPD |
SWL(3) |
|
CALL cc,nn |
3 |
OCR(4) |
ORL(3) |
ORH(4); SPD |
SWH(3); SPD |
SWL(3) |
cc |
CALL cc,nn |
3 |
OCR(4) |
ORL(3) |
ORH(3) |
|
|
cc не выполняется |
RET |
1 |
OCR(4) |
SRL(3); SPI |
SRH(3); SPI |
|
|
|
RET cc |
1 |
OCR(4) |
SRL(3); SPI |
SRH(3); SPI |
|
|
cc |
Тип команды |
Байт |
Цикл M1 |
Цикл M2 |
Цикл M3 |
Цикл M4 |
Цикл M5 |
Пояснение |
RET cc |
1 |
OCR(4) |
|
|
|
|
cc не выполняется |
RETI; RETN |
2 |
CBR(4); OCR(4) |
SRL(3); SPI |
SRH(3); SPI |
|
|
|
RST p |
1 |
OCR(5); SPD |
SWH(3); SPD |
SWL(3) |
|
|
|
IN A,(n) |
2 |
OCR(4) |
ORD(4) |
PRD(4) |
|
|
|
IN r,(C); INF |
2 |
CBR(4); OCR(4) |
PRD(4) |
|
|
|
|
INI; IND |
2 |
CBR(4); OCR(5) |
PRD(4) |
MWR(3) |
|
|
|
INIR; INDR |
2 |
CBR(4); OCR(5) |
PRD(4) |
MWR(3) |
IOP(5) |
|
IOP(5), если B^0 |
OUT (n),A |
2 |
OCR(4) |
ORD(4) |
PWR(4) |
|
|
|
OUT (C),r |
2 |
CBR(4); OCR(4) |
PWR(4) |
|
|
|
|
OUTI; OUTD |
2 |
CBR(4); OCR(5) |
MRD(3) |
PWR(4) |
|
|
|
OTIR; OTDR |
2 |
CBR(4); OCR(5) |
MRD(3) |
PWR(4) |
IOP(5) |
|
IOP(5), если B^0 |
Подтверждение прерывания: |
NMI |
- |
OCR(5); SPD |
SWH(3); SPD |
SWL(3) |
|
|
См. рис. 6.4 |
INT, Режим 0 |
- |
INTA(6;) SPD |
SWH(3); SPD |
SWL(3) |
|
|
При команде RST p |
|
- |
INTA(6) |
ORL(3) |
ORH(4); SPD |
SWH(3); SPD |
SWL(3) |
При команде CALL |
INT, Режим 1 |
- |
INTA(7;) SPD |
SWH(3); SPD |
SWL(3) |
|
|
RST38H |
INT, Режим 2 |
- |
INTA(7); SPD |
SWH(3); SPD |
SWL(3) |
MRL(3) |
MRH(3) |
См. рис. 6.13 |
Принятые обозначения отражают программную суть происходящих в данном цикле
действий. С точки зрения процессов на шинах все они сводятся к машинным циклам,
рассмотренным в главе 4:
OCR, CBR - цикл извлечения кода операции (рис. 4.2)
MRD, MRH, MRL, - цикл чтения из памяти (рис. 4.4)
ORD, ORH, ORL,
SRH, SRL
MWR, MWH, MWL - цикл записи в память (рис. 4.4)
SWH, SWL
PRD - цикл ввода (рис. 4.6)
PWR - цикл вывода (рис. 4.6)
INTA - цикл подтверждения маскируемого прерывания (рис 4.9).