Intel 8080/Коды команд: различия между версиями

Материал из Emuverse
мНет описания правки
(+ особенности)
 
(не показано 8 промежуточных версий 2 участников)
Строка 7: Строка 7:
!colspan=7|Группа 00
!colspan=7|Группа 00
|-
|-
|00 000 000 || 00 ||   || NOP ||   ||   ||
|00 000 000 || 00 ||   || NOP ||   ||   || 4
|-
|-
|00 001 000 || 08 ||   || ? ||   ||   ||
|00 001 000 || 08 ||   || ? ||   ||   ||
Строка 23: Строка 23:
|00 111 000 || 38 ||   || ? ||   ||   ||     
|00 111 000 || 38 ||   || ? ||   ||   ||     
|-
|-
|00 RP1 001 || &nbsp; || &nbsp; || DAD RP || HL <- HL + RP || &nbsp; || &nbsp;
|00 RP1 001 || &nbsp; || &nbsp; || DAD RP || HL <- HL + RP || C || 4
|-
|-
|00 RP0 001 || &nbsp; || DATA16 || LXI RP, DATA16 || RP <- DATA16 || &nbsp; || 3
|00 RP0 001 || &nbsp; || DATA16 || LXI RP, DATA16 || RP <- DATA16 || &nbsp; || 10
|-
|-
|00 0R0 010 || &nbsp; || &nbsp; || STAX [R], A || [R] <- A || &nbsp; || 2
|00 0R0 010 || &nbsp; || &nbsp; || STAX [R], A || [R] <- A || &nbsp; || 7
|-
|-
|00 0R1 010 || &nbsp; || &nbsp; || LDAX A, [R] || A <- [R] || &nbsp; || 2
|00 0R1 010 || &nbsp; || &nbsp; || LDAX A, [R] || A <- [R] || &nbsp; || 7
|-
|-
|00 100 010 || 22 || ADDR16 || SHLD ADDR16 || [ADDR16] <- HL || &nbsp; || 5
|00 100 010 || 22 || ADDR16 || SHLD ADDR16 || [ADDR16] <- HL || &nbsp; || 16
|-
|-
|00 101 010 || 2A || ADDR16 || LHLD ADDR16 || HL <- [ADDR16] || &nbsp; || 5  
|00 101 010 || 2A || ADDR16 || LHLD ADDR16 || HL <- [ADDR16] || &nbsp; || 16  
|-
|-
|00 110 010 || 32 || ADDR16 || STA ADDR16 || [ADDR16] <- A || &nbsp; || 4
|00 110 010 || 32 || ADDR16 || STA ADDR16 || [ADDR16] <- A || &nbsp; || 13
|-
|-
|00 111 010 || 3A || ADDR16 || LDA ADDR16 || A <- [ADDR16] || &nbsp; || 4  
|00 111 010 || 3A || ADDR16 || LDA ADDR16 || A <- [ADDR16] || &nbsp; || 13  
|-
|-
|00 RP1 011 || &nbsp; || &nbsp; || DCX RP || RP <- RP-1 || &nbsp; || &nbsp;
|00 RP1 011 || &nbsp; || &nbsp; || DCX RP || RP <- RP-1 || &nbsp; || 5
|-
|-
|00 RP0 011 || &nbsp; || &nbsp; || INX RP || RP <- RP+1 || &nbsp; || &nbsp;
|00 RP0 011 || &nbsp; || &nbsp; || INX RP || RP <- RP+1 || &nbsp; || 5
|-
|-
|00 SSS 100 || &nbsp; || &nbsp; || INR SSS || SSS <- SSS+1 || &nbsp; || &nbsp;
|00 SSS 100 || &nbsp; || &nbsp; || INR SSS || SSS <- SSS+1 || все кроме С || 5/10
|-
|-
|00 SSS 101 || &nbsp; || &nbsp; || DCR SSS || SSS <- SSS-1 || &nbsp; || &nbsp;
|00 SSS 101 || &nbsp; || &nbsp; || DCR SSS || SSS <- SSS-1 || все кроме С || 5/10
|-
|-
|00 DDD 110 || &nbsp; || DATA8 || MVI DDD, DATA8 || DDD <- DATA8 || &nbsp; || 2  
|00 DDD 110 || &nbsp; || DATA8 || MVI DDD, DATA8 || DDD <- DATA8 || &nbsp; || 7/11  
|-
|-
|00 000 111 || 07 || &nbsp; || RLG || CY+A LEFT || &nbsp; || &nbsp;
|00 000 111 || 07 || &nbsp; || RLC || CY+A LEFT || С || 4
|-
|-
|00 001 111 || 0F || &nbsp; || RRG || CY+A RIGHT || &nbsp; || &nbsp;
|00 001 111 || 0F || &nbsp; || RRC || CY+A RIGHT || С || 4
|-
|-
|00 010 111 || 17 || &nbsp; || RAL || CY+A CYCLE RIGHT || &nbsp; || &nbsp;
|00 010 111 || 17 || &nbsp; || RAL || CY+A CYCLE RIGHT || С || 4
|-
|-
|00 011 111 || 1F || &nbsp; || RAR || CY+A CYCLE LEFT || &nbsp; || &nbsp; 
|00 011 111 || 1F || &nbsp; || RAR || CY+A CYCLE LEFT || С || 4
|-
|-
|00 100 111 || 27 || &nbsp; || DAA || &nbsp; || &nbsp; || &nbsp;
|00 100 111 || 27 || &nbsp; || DAA || &nbsp; || &nbsp; || 5
|-
|-
|00 101 111 || 2F || &nbsp; || CMA || A <- NOT A || &nbsp; || &nbsp;
|00 101 111 || 2F || &nbsp; || CMA || A <- NOT A || &nbsp; || 4
|-
|-
|00 110 111 || 37 || &nbsp; || STC || CY = 1 || &nbsp; || &nbsp;
|00 110 111 || 37 || &nbsp; || STC || CY = 1 || С || 4
|-
|-
|00 111 111 || 3F || &nbsp; || CMC || CY <- NOT CY || &nbsp; || &nbsp;
|00 111 111 || 3F || &nbsp; || CMC || CY <- NOT CY || С || 4
|-
|-
!colspan=7|Группа 01
!colspan=7|Группа 01
|-
|-
|01 110 110 || 76 || &nbsp; || HLT || &nbsp; || &nbsp; ||  
|01 110 110 || 76 || &nbsp; || HLT || &nbsp; || &nbsp; || 7(?)
|-
|-
|01 DDD SSS || &nbsp; || &nbsp; || MOV DDD, SSS || DDD <- SSS || &nbsp; || 1
|01 DDD SSS || &nbsp; || &nbsp; || MOV DDD, SSS || DDD <- SSS || &nbsp; || 5/7
|-
|-
!colspan=7|Группа 10
!colspan=7|Группа 10
|-
|-
|10 000 SSS || &nbsp; || &nbsp; || ADD SSS || A <- A+SSS || &nbsp; ||  
|10 000 SSS || &nbsp; || &nbsp; || ADD SSS || A <- A+SSS || все || 4/7
|-
|-
|10 001 SSS || &nbsp; || &nbsp; || ADC SSS || A <- A+SSS+CY || &nbsp; ||  
|10 001 SSS || &nbsp; || &nbsp; || ADC SSS || A <- A+SSS+CY || все || 4/7
|-
|-
|10 010 SSS || &nbsp; || &nbsp; || SUB SSS || A <- A-SSS || &nbsp; ||  
|10 010 SSS || &nbsp; || &nbsp; || SUB SSS || A <- A-SSS || все || 4/7
|-
|-
|10 011 SSS || &nbsp; || &nbsp; || SBB SSS || A <- A-SSS-CY || &nbsp; ||  
|10 011 SSS || &nbsp; || &nbsp; || SBB SSS || A <- A-SSS-CY || все || 4/7
|-
|-
|10 100 SSS || &nbsp; || &nbsp; || ANA SSS || A <- A AND SSS || &nbsp; ||  
|10 100 SSS || &nbsp; || &nbsp; || ANA SSS || A <- A AND SSS || все || 4/7
|-
|-
|10 101 SSS || &nbsp; || &nbsp; || XRA SSS || A <- A XOR SSS || &nbsp; ||  
|10 101 SSS || &nbsp; || &nbsp; || XRA SSS || A <- A XOR SSS || все || 4/7
|-
|-
|10 110 SSS || &nbsp; || &nbsp; || ORA SSS || A <- A OR SSS || &nbsp; ||  
|10 110 SSS || &nbsp; || &nbsp; || ORA SSS || A <- A OR SSS || все || 4/7
|-
|-
|10 111 SSS || &nbsp; || &nbsp; || CMP SSS || COMPARE A, SSS || &nbsp; ||  
|10 111 SSS || &nbsp; || &nbsp; || CMP SSS || COMPARE A, SSS || все || 4/7
|-
|-
!colspan=7|Группа 11
!colspan=7|Группа 11
|-
|-
|11 XXX 000 || &nbsp; || &nbsp; || RETIF || RETURN IF XXX IS TRUE || &nbsp; ||  
|11 XXX 000 || &nbsp; || &nbsp; || RETIF || RETURN IF XXX IS TRUE || &nbsp; || 5 (10)
|-
|-
|11 RP0 001 || &nbsp; || &nbsp; || POP RP || &nbsp; || &nbsp; ||  
|11 RP0 001 || &nbsp; || &nbsp; || POP RP || &nbsp; || С(только POP PSW) || 10
|-
|-
|11 001 001 || C9 || &nbsp; || RET || &nbsp; || &nbsp; ||  
|11 001 001 || C9 || &nbsp; || RET || &nbsp; || &nbsp; || 10
|-
|-
|11 011 001 || D9 || &nbsp; || ? || &nbsp; || &nbsp; ||  
|11 011 001 || D9 || &nbsp; || ? || &nbsp; || &nbsp; ||  
|-
|-
|11 101 001 || E9 || &nbsp; || PCHL || JMP [HL] || &nbsp; ||  
|11 101 001 || E9 || &nbsp; || PCHL || JMP [HL] || &nbsp; || 5
|-
|-
|11 111 001 || F9 || &nbsp; || SPHL || SP <- HL || &nbsp; ||  
|11 111 001 || F9 || &nbsp; || SPHL || SP <- HL || &nbsp; || 5
|-
|-
|11 XXX 010 || &nbsp; || ADDR16 || JMP IF ADDR16 || JUMP IF XXX IS TRUE || &nbsp; ||  
|11 XXX 010 || &nbsp; || ADDR16 || JMP IF ADDR16 || JUMP IF XXX IS TRUE || &nbsp; || 10
|-
|-
|11 000 011 || C3 || ADDR16 || JMP ADDR16 || &nbsp; || &nbsp; ||  
|11 000 011 || C3 || ADDR16 || JMP ADDR16 || &nbsp; || &nbsp; || 10
|-
|-
|11 010 011 || D3 || PORT8 || OUT PORT8 || [PORT8] <- A || &nbsp; ||  
|11 010 011 || D3 || PORT8 || OUT PORT8 || [PORT8] <- A || &nbsp; || 10
|-
|-
|11 011 011 || DB || PORT8 || IN PORT8 || A <- [PORT8] || &nbsp; ||  
|11 011 011 || DB || PORT8 || IN PORT8 || A <- [PORT8] || &nbsp; || 10
|-
|-
|11 100 011 || E3 || &nbsp; || XTHL || [SP] <- HL || &nbsp; ||  
|11 001 011 || CB || &nbsp; || ? || &nbsp; || &nbsp; ||  
|-
|-
|11 101 011 || EB || &nbsp; || XCHG || DE <-> HL || &nbsp; ||  
|11 100 011 || E3 || &nbsp; || XTHL || [SP] <-> HL || &nbsp; || 18
|-
|-
|11 110 011 || F3 || &nbsp; || DI || INT DISABLE || &nbsp; ||  
|11 101 011 || EB || &nbsp; || XCHG || DE <-> HL || &nbsp; || 4
|-
|-
|11 111 011 || FB || &nbsp; || EI || INT ENABLE || &nbsp; ||  
|11 110 011 || F3 || &nbsp; || DI || INT DISABLE || &nbsp; || 4
|-
|-
|11 XXX 100 || &nbsp; || ADDR16 || CALLIF ADDR16 || CALL IF XXX IS TRUE || &nbsp; ||  
|11 111 011 || FB || &nbsp; || EI || INT ENABLE || &nbsp; || 4
|-
|-
|11 RP0 101 || &nbsp; || &nbsp; || PUSH RP || &nbsp; || &nbsp; ||  
|11 XXX 100 || &nbsp; || ADDR16 || CALLIF ADDR16 || CALL IF XXX IS TRUE || &nbsp; || 11(17)
|-
|-
|11 001 101 || CD || ADDR16 || CALL ADDR16 || &nbsp; || &nbsp; ||  
|11 RP0 101 || &nbsp; || &nbsp; || PUSH RP || &nbsp; || &nbsp; || 11
|-
|11 001 101 || CD || ADDR16 || CALL ADDR16 || &nbsp; || &nbsp; || 17
|-
|-
|11 011 101 || DD || &nbsp; || ? || &nbsp; || &nbsp; ||  
|11 011 101 || DD || &nbsp; || ? || &nbsp; || &nbsp; ||  
Строка 131: Строка 133:
|11 111 101 || FD || &nbsp; || ? || &nbsp; || &nbsp; ||  
|11 111 101 || FD || &nbsp; || ? || &nbsp; || &nbsp; ||  
|-
|-
|11 000 110 || C6 || DATA8 || ADI DATA8 || A <- A+DATA8 || &nbsp; ||  
|11 000 110 || C6 || DATA8 || ADI DATA8 || A <- A+DATA8 || все || 7
|-
|-
|11 001 110 || CE || DATA8 || ACI DATA8 || A <- A+DATA8+CY || &nbsp; ||  
|11 001 110 || CE || DATA8 || ACI DATA8 || A <- A+DATA8+CY || все || 7
|-
|-
|11 010 110 || D6 || DATA8 || SUI DATA8 || A <- A-DATA8 || &nbsp; ||  
|11 010 110 || D6 || DATA8 || SUI DATA8 || A <- A-DATA8 || все || 7
|-
|-
|11 011 110 || DE || DATA8 || SBI DATA8 || A <- A-DATA8-CY || &nbsp; ||  
|11 011 110 || DE || DATA8 || SBI DATA8 || A <- A-DATA8-CY || все || 7
|-
|-
|11 100 110 || E6 || DATA8 || ANI DATA8 || A <- A AND DATA8 || &nbsp; ||  
|11 100 110 || E6 || DATA8 || ANI DATA8 || A <- A AND DATA8 || все || 7
|-
|-
|11 101 110 || EE || DATA8 || XRI DATA8 || A <- A XOR DATA8 || &nbsp; ||  
|11 101 110 || EE || DATA8 || XRI DATA8 || A <- A XOR DATA8 || все || 7
|-
|-
|11 110 110 || F6 || DATA8 || ORI DATA8 || A <- A OR DATA8 || &nbsp; ||  
|11 110 110 || F6 || DATA8 || ORI DATA8 || A <- A OR DATA8 || все || 7
|-
|-
|11 111 110 || FE || DATA8 || CPI DATA8 || COMPARE A, DATA8 || &nbsp; ||  
|11 111 110 || FE || DATA8 || CPI DATA8 || COMPARE A, DATA8 || все || 7
|-
|-
|11 NNN 111 || &nbsp; || &nbsp; || RST NNN || INT NNN || &nbsp; ||  
|11 NNN 111 || &nbsp; || &nbsp; || RST NNN || INT NNN || &nbsp; || 11
|}
|}


Строка 181: Строка 183:
* 110: POSITIVE
* 110: POSITIVE
* 111: NEGATIVE
* 111: NEGATIVE
== Размещение двухбайтовых адрессов в памяти ==
Для всех трёхбайтовых команд (CALL, JMP, STA, ...) <u>второй</u> байт команды содержит <u>младший</u> байт, <u>третий</u> байт команды - <u>старший</u> байт.
Т.е. команда LXI BC, 0x00ff будет состоять из трёх байт в такой последовательности 0x01 0xff 0x00.
== Операции со стеком ==
16 байтный регистр SP служит указателем на вершину стека.
Помещение 16 байтного значения в стек происходит следующим образом: 1. SP декрементируется; 2. <u>старший</u> байт заносится в ячейку памяти по адресу на который указывает SP; 3. SP декрементируется; 4. <u>младший</u> байт заносится в ячейку памяти по адресу SP.
Извлечение 16 байтного значения в стек происходит следующим образом: 1. из ячейки по адресу SP извлекается <u>младший</u> байт; 2. SP инкрементируется; 3. из ячейки по адресу SP извлекается <u>старший</u> байт; 4. SP инкрементируется.
== Начальное состояние процессора ==
После подачи сигнала RESET процессор обнуляет регистр PC. Все остальные регистры остаются неизменными. Если RESET происходит в начальный момент работы процессора, все регистры содержат случайные величины.
== Особенности ==
* Вычисление флага AC: [http://www.zx.pk.ru/showthread.php?t=9826 Обсуждение на форуме zx.pk.ru]


[[Категория:Intel 8080|Коды команд]]
[[Категория:Intel 8080|Коды команд]]

Текущая версия от 09:31, 31 марта 2009

Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Таблица кодов

Код2 Код16 Данные Команда Действие Флаги Такты
Группа 00
00 000 000 00   NOP     4
00 001 000 08   ?    
00 010 000 10   ?    
00 011 000 18   ?    
00 100 000 20   ? (8085: RIM) 8085: READ INT MASK    
00 101 000 28   ?      
00 110 000 30   ? (8085: SIM) 8085: SET INT MASK    
00 111 000 38   ?      
00 RP1 001     DAD RP HL <- HL + RP C 4
00 RP0 001   DATA16 LXI RP, DATA16 RP <- DATA16   10
00 0R0 010     STAX [R], A [R] <- A   7
00 0R1 010     LDAX A, [R] A <- [R]   7
00 100 010 22 ADDR16 SHLD ADDR16 [ADDR16] <- HL   16
00 101 010 2A ADDR16 LHLD ADDR16 HL <- [ADDR16]   16
00 110 010 32 ADDR16 STA ADDR16 [ADDR16] <- A   13
00 111 010 3A ADDR16 LDA ADDR16 A <- [ADDR16]   13
00 RP1 011     DCX RP RP <- RP-1   5
00 RP0 011     INX RP RP <- RP+1   5
00 SSS 100     INR SSS SSS <- SSS+1 все кроме С 5/10
00 SSS 101     DCR SSS SSS <- SSS-1 все кроме С 5/10
00 DDD 110   DATA8 MVI DDD, DATA8 DDD <- DATA8   7/11
00 000 111 07   RLC CY+A LEFT С 4
00 001 111 0F   RRC CY+A RIGHT С 4
00 010 111 17   RAL CY+A CYCLE RIGHT С 4
00 011 111 1F   RAR CY+A CYCLE LEFT С 4
00 100 111 27   DAA     5
00 101 111 2F   CMA A <- NOT A   4
00 110 111 37   STC CY = 1 С 4
00 111 111 3F   CMC CY <- NOT CY С 4
Группа 01
01 110 110 76   HLT     7(?)
01 DDD SSS     MOV DDD, SSS DDD <- SSS   5/7
Группа 10
10 000 SSS     ADD SSS A <- A+SSS все 4/7
10 001 SSS     ADC SSS A <- A+SSS+CY все 4/7
10 010 SSS     SUB SSS A <- A-SSS все 4/7
10 011 SSS     SBB SSS A <- A-SSS-CY все 4/7
10 100 SSS     ANA SSS A <- A AND SSS все 4/7
10 101 SSS     XRA SSS A <- A XOR SSS все 4/7
10 110 SSS     ORA SSS A <- A OR SSS все 4/7
10 111 SSS     CMP SSS COMPARE A, SSS все 4/7
Группа 11
11 XXX 000     RETIF RETURN IF XXX IS TRUE   5 (10)
11 RP0 001     POP RP   С(только POP PSW) 10
11 001 001 C9   RET     10
11 011 001 D9   ?    
11 101 001 E9   PCHL JMP [HL]   5
11 111 001 F9   SPHL SP <- HL   5
11 XXX 010   ADDR16 JMP IF ADDR16 JUMP IF XXX IS TRUE   10
11 000 011 C3 ADDR16 JMP ADDR16     10
11 010 011 D3 PORT8 OUT PORT8 [PORT8] <- A   10
11 011 011 DB PORT8 IN PORT8 A <- [PORT8]   10
11 001 011 CB   ?    
11 100 011 E3   XTHL [SP] <-> HL   18
11 101 011 EB   XCHG DE <-> HL   4
11 110 011 F3   DI INT DISABLE   4
11 111 011 FB   EI INT ENABLE   4
11 XXX 100   ADDR16 CALLIF ADDR16 CALL IF XXX IS TRUE   11(17)
11 RP0 101     PUSH RP     11
11 001 101 CD ADDR16 CALL ADDR16     17
11 011 101 DD   ?    
11 101 101 ED   ?    
11 111 101 FD   ?    
11 000 110 C6 DATA8 ADI DATA8 A <- A+DATA8 все 7
11 001 110 CE DATA8 ACI DATA8 A <- A+DATA8+CY все 7
11 010 110 D6 DATA8 SUI DATA8 A <- A-DATA8 все 7
11 011 110 DE DATA8 SBI DATA8 A <- A-DATA8-CY все 7
11 100 110 E6 DATA8 ANI DATA8 A <- A AND DATA8 все 7
11 101 110 EE DATA8 XRI DATA8 A <- A XOR DATA8 все 7
11 110 110 F6 DATA8 ORI DATA8 A <- A OR DATA8 все 7
11 111 110 FE DATA8 CPI DATA8 COMPARE A, DATA8 все 7
11 NNN 111     RST NNN INT NNN   11

Расшифровка сокращений

DDD, SSS
  • 000=B
  • 001=C
  • 010=D
  • 011=E
  • 100=H
  • 101=L
  • 110=М (т.е. [HL])
  • 111=A
R
  • 0=BC
  • 1=DE
RP
  • 0=BC
  • 1=DE
  • 2=HL
  • 3=SP или PSW (Status word) для PUSH/POP
XXX
  • 000: NOT ZERO
  • 001: ZERO
  • 010: NOT CARRY
  • 011: CARRY
  • 100: NOT PARITY
  • 101: PARITY
  • 110: POSITIVE
  • 111: NEGATIVE

Размещение двухбайтовых адрессов в памяти

Для всех трёхбайтовых команд (CALL, JMP, STA, ...) второй байт команды содержит младший байт, третий байт команды - старший байт. Т.е. команда LXI BC, 0x00ff будет состоять из трёх байт в такой последовательности 0x01 0xff 0x00.

Операции со стеком

16 байтный регистр SP служит указателем на вершину стека. Помещение 16 байтного значения в стек происходит следующим образом: 1. SP декрементируется; 2. старший байт заносится в ячейку памяти по адресу на который указывает SP; 3. SP декрементируется; 4. младший байт заносится в ячейку памяти по адресу SP.

Извлечение 16 байтного значения в стек происходит следующим образом: 1. из ячейки по адресу SP извлекается младший байт; 2. SP инкрементируется; 3. из ячейки по адресу SP извлекается старший байт; 4. SP инкрементируется.

Начальное состояние процессора

После подачи сигнала RESET процессор обнуляет регистр PC. Все остальные регистры остаются неизменными. Если RESET происходит в начальный момент работы процессора, все регистры содержат случайные величины.

Особенности