Curso Z80 Assembly: Do Zero ao Embarcado
Curso Z80 Assembly: Do Zero ao Embarcado
Resumo
Este curso apresenta uma abordagem completa e prática para a programação
do microprocessador Z80 em linguagem Assembly. Desenvolvido para iniciantes, o
material guia o estudante desde os conceitos fundamentais até a criação de sistemas
embarcados completos, passando por técnicas avançadas de otimização e debugging.
Cada módulo inclui exemplos práticos, exercı́cios e projetos que simulam aplicações
reais.
Conteúdo
1 Introdução ao Curso e ao Z80 4
1.1 História e Importância do Z80 . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Por que Aprender Z80 Assembly Hoje? . . . . . . . . . . . . . . . . . . . . 4
1.3 Caracterı́sticas Técnicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1
5 Módulo 4 — Loops e Sub-rotinas 11
5.1 Loops com DJNZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
5.2 Sub-rotinas e Pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
5.3 Exemplo: Sistema de Delay . . . . . . . . . . . . . . . . . . . . . . . . . . 13
9 Módulo 8 — Interrupções 21
9.1 Tipos de Interrupções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
9.2 Sistema Completo de Interrupções . . . . . . . . . . . . . . . . . . . . . . . 21
9.3 Exemplo: Sistema de Aquisição de Dados . . . . . . . . . . . . . . . . . . . 22
2
16 Conclusão 35
16.1 Próximos Passos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
16.2 Recursos Recomendados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
16.3 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3
1 Introdução ao Curso e ao Z80
1.1 História e Importância do Z80
O Z80 é um microprocessador de 8 bits desenvolvido pela Zilog em 1976, projetado por
Federico Faggin. Tornou-se extremamente popular em sistemas como:
Caracterı́stica Valor
Bits 8
Barramento de endereços 16 bits
Memória endereçável 64 KB
Registradores principais 8 bits
Velocidade tı́pica 2-20 MHz
Instruções 158 mnemonics
Tecnologia NMOS/CMOS
4
2 Módulo 1 — Arquitetura do Z80 e Registradores
2.1 Visão Geral da Arquitetura
AF
A F
BC
Unidade Central de Processamento
B C SP
DE
D E
Núcleo StackPC
Z80 Pointer
HL
H L ProgramIXCounter
Index Register
IY X
Index Register Y
• I: Registrador de interrupção
5
2.4 Registrador de Flags (F)
6
8 ; 1. Carregue 0 x55 em A
9 ; 2. Armazene A em 0 x8000
10 ; 3. Carregue 0 xAA em A
11 ; 4. Recupere o valor original de 0 x8000 para B
12
13 ; SOLU O DO E X E R C C I O 3:
14 LD A , 55 H
15 LD (8000 H ) , A
16 LD A , 0 AAH
17 LD B , (8000 H ) ; B = 0 x55
7
9 OR A ; Limpa carry flag
10 SBC HL , BC ; HL = 0 xF000 ( -4096 em complemento de 2)
11
12 ; === INCREMENTO / DECREMENTO 16 BITS ===
13 LD HL , 0 FFFFH
14 INC HL ; HL = 0 x0000 , Z =1
15 DEC HL ; HL = 0 xFFFF , Z =0
8
20
21 SUBTRAIR :
22 LD A , B
23 SUB C
24 RET
25
26 OPERAR_AND :
27 LD A , B
28 AND C
29 RET
30
31 OPERAR_OR :
32 LD A , B
33 OR C
34 RET
35
36 ; Exemplo de uso :
37 ; LD B , 05 H
38 ; LD C , 03 H
39 ; LD A , 00 H ; Opera ç ~
a o soma
40 ; CALL CALCULADORA ; Resultado : A = 08 H
9
4.2 Saltos Condicionais
20 ; Corpo do loop
21 CALL PROCESSAR
22 DEC B
23 JR WHILE_LOOP
24 FIM_WHILE :
25
10
35 CP 05 H ; i < 5?
36 JR NZ , FOR_LOOP
11
1 ; === LOOP SIMPLES COM DJNZ ===
2 LD B , 0 AH ; 10 itera ç ~
o es
3 LOOP_SIMPLES :
4 ; Corpo do loop
5 NOP
6 NOP
7 DJNZ LOOP_SIMPLES ; B - - , salta se B != 0
8
9 ; === LOOP ANINHADO ===
10 LD B , 03 H ; Loop externo : 3 itera ç ~
o es
11 LOOP_EXTERNO :
12 LD C , 05 H ; Loop interno : 5 itera ç ~
o es
13 LOOP_INTERNO :
14 ; Processamento
15 CALL PROCESSAR_ITEM
16 DEC C
17 JR NZ , LOOP_INTERNO
18
19 DJNZ LOOP_EXTERNO
20
21 ; === CONTAGEM REGRESSIVA ===
22 LD B , 05 H
23 CONTAGEM :
24 LD A , B
25 ADD A , ’0 ’ ; Converte para ASCII
26 CALL IMPRIMIR_CHAR
27 DJNZ CONTAGEM
12
25 PUSH DE
26 PUSH HL
27
28 ; Corpo da rotina
29 CALL SUB1
30 CALL SUB2
31
32 POP HL
33 POP DE
34 POP BC
35 POP AF
36 RET
37
38 ; === TROCA DE REGISTRADORES VIA PILHA ===
39 TROCA_BC_DE :
40 PUSH BC
41 PUSH DE
42 POP BC ; BC recebe DE original
43 POP DE ; DE recebe BC original
44 RET
13
6 Módulo 5 — Modos de Endereçamento
6.1 Tipos de Endereçamento
14
8 ; === C O M P A R A O DE BLOCO COM CPIR ===
9 ; Busca valor A a partir de HL , por BC bytes
10 LD HL , BUFFER
11 LD BC , 0080 H ; 128 bytes
12 LD A , 55 H ; Valor procurado
13 CPIR ; Busca at é achar ou BC =0
14 JP Z , ENCONTRADO ; Salta se encontrou
15
16 ; === CARGA INCREMENTAL ( LDI ) ===
17 LD HL , DADOS
18 LD DE , TELA
19 LD BC , 0040 H ; 64 bytes
20 LOOP_COPIA :
21 LDI ; ( DE ) =( HL ) , HL ++ , DE ++ , BC - -
22 JP PE , LOOP_COPIA ; Continua se BC != 0
23
24 ; === PREENCHIMENTO DE M E M R I A ===
25 LD HL , AREA
26 LD DE , AREA +1
27 LD BC , 00 FFH ; 255 bytes
28 LD ( HL ) , 00 H ; Preenche primeiro com 0
29 LDIR ; Propaga para o resto
15
31 INC C
32 DJNZ SEARCH_LOOP
33 LD C , 0 FFH ; N~ a o encontrado
34 JP SEARCH_END
35 FOUND :
36 ; C cont é m a posi ç ~
ao
37 SEARCH_END :
38
39 ARRAY : DS 10 ; Reserva 10 bytes
40 TOTAL : DB 0
16
20 SLA A ; 2
21 SLA A ; 4
22 SLA A ; 8
23 RET
24
25 DIVIDIR_POR_4 :
26 SRL A ; 2
27 SRL A ; 4
28 RET
29
30 ; === R O T A E S PARA O P E R A E S CIRCULARES ===
31 R OT A C IO N A R_ E S QU E R DA :
32 RLC A ; Rota ç ~
a o circular
33 RET
34
35 ROTACIONAR_CARRY :
36 RL A ; Rota ç ~
a o atrav é s do carry
37 RET
14 ; MOSTRAR D G I T O NO DISPLAY
15 ; Entrada : A = d ı́ gito (0 -9)
16 MOSTRAR_DIGITO :
17 LD HL , LED_PATTERNS
18 LD E , A
19 LD D , 00 H
20 ADD HL , DE ; HL aponta para o padr ~
ao
21 LD A , ( HL )
22 OUT ( DISPLAY_PORT ) , A
23 RET
24
25 ; CONTROLE INDIVIDUAL DE LEDS
26 LED_ON :
27 ; Liga LED na posi ç ~
a o B (0 -7)
28 LD A , 01 H
29 LD C , B
30 LED_ON_LOOP :
31 DEC C
32 JR Z , LED_ON_END
33 SLA A ; Shift left para posi ç ~
a o correta
34 JR LED_ON_LOOP
17
35 LED_ON_END :
36 IN A , ( LED_PORT )
37 OR A ; SET bit sem instru ç ~
a o SET
38 OUT ( LED_PORT ) , A
39 RET
40
41 LED_OFF :
42 ; Desliga LED na posi ç ~a o B (0 -7)
43 LD A , 0 FEH
44 LD C , B
45 LED_OFF_LOOP :
46 DEC C
47 JR Z , LED_OFF_END
48 SRL A ; Prepara m á scara
49 JR LED_OFF_LOOP
50 LED_OFF_END :
51 IN A , ( LED_PORT )
52 AND A ; RES bit sem instru ç ~
a o RES
53 OUT ( LED_PORT ) , A
54 RET
4 LER_TECLADO :
5 LD B , 04 H ; 4 linhas
18
6 LD C , 0 FEH ; M á scara inicial ( bit 0=0)
7 LD D , 00 H ; Contador de linha
8
9 LINHA_LOOP :
10 LD A , C
11 OUT ( KEYBOARD_PORT ) , A ; Ativa linha
12
13 ; L^
e colunas
14 IN A , ( KEYBOARD_PORT )
15 AND 0 F0H ; Isola bits das colunas
16 CP 0 F0H ; Alguma tecla pressionada?
17 JR NZ , TECLA_ENCONTRADA
18
19 ; Pr ó xima linha
20 RLC C ; Rola m á scara para pr ó xima linha
21 INC D
22 DJNZ LINHA_LOOP
23
24 ; Nenhuma tecla
25 LD A , 0 FFH
26 RET
27
28 TECLA_ENCONTRADA :
29 ; Calcula c ó digo da tecla : D *4 + coluna
30 LD E , 00 H ; Contador de coluna
31 SRL A
32 SRL A
33 SRL A
34 SRL A ; Coloca colunas nos bits baixos
35
36 COLUNA_LOOP :
37 RRA ; Rota bit para carry
38 JR NC , CALCULAR_CODIGO
39 INC E
40 JR COLUNA_LOOP
41
42 CALCULAR_CODIGO :
43 LD A , D
44 SLA A
45 SLA A ; A = linha * 4
46 ADD A , E ; A = linha *4 + coluna
47 RET
19
11 CALL LCD_DELAY
12 LD A , 0 CH ; Display ON , cursor OFF
13 OUT ( LCD_CMD ) , A
14 CALL LCD_DELAY
15 LD A , 06 H ; Increment cursor
16 OUT ( LCD_CMD ) , A
17 CALL LCD_DELAY
18 LD A , 01 H ; Clear display
19 OUT ( LCD_CMD ) , A
20 CALL LCD_DELAY
21 RET
22
20
9 Módulo 8 — Interrupções
9.1 Tipos de Interrupções
10 ; ROTINA DE S E R V I O DE I N T E R R U P O ( MODO 1)
11 ORG 0038 H
12 ISR_MODE1 :
13 PUSH AF
14 PUSH BC
15 PUSH DE
16 PUSH HL
17 PUSH IX
18 PUSH IY
19
20 ; Identificar fonte da interrup ç ~ ao
21 IN A , ( INT_SOURCE_PORT )
22 BIT 0 , A
23 CALL NZ , HANDLE_TIMER_INT
24 BIT 1 , A
25 CALL NZ , H AN D L E_ K E YB O A RD _ I NT
26 BIT 2 , A
27 CALL NZ , HA NDLE_S ERIAL_ INT
28
29 POP IY
30 POP IX
31 POP HL
32 POP DE
33 POP BC
34 POP AF
35 EI
36 RETI
37
38 ; INTERRUP O N O MASCAR VEL
39 ORG 0066 H
40 NMI_HANDLER :
41 PUSH AF
21
42 ; Tratamento de emerg ^ e ncia
43 LD A , 00 H
44 OUT ( EMERGENCY_PORT ) , A
45 POP AF
46 RETN
47
48 ; MANIPULADORES E S P E C F I C O S
49 HANDLE_TIMER_INT :
50 ; Atualizar rel ó gio do sistema
51 LD HL , ( SYSTEM_TIMER )
52 INC HL
53 LD ( SYSTEM_TIMER ) , HL
54 RET
55
56 H AN D L E_ K E YB O A RD _ I NT :
57 ; Processar tecla pressionada
58 CALL LER_TECLADO
59 LD ( LAST_KEY ) , A
60 RET
61
62 HA NDLE_S ERIAL_ INT :
63 ; Processar dados seriais
64 IN A , ( SERIAL_PORT )
65 LD ( SERIAL_BUFFER ) , A
66 RET
67
68 ; V A R I V E I S DO SISTEMA
69 SYSTEM_TIMER : DW 0000 H
70 LAST_KEY : DB 00 H
71 SERIAL_BUFFER : DB 00 H
22
23 LD A , H
24 CP ( BUFFER_END >> 8) & 0 xFF
25 JR NZ , TIMER_END
26 LD A , L
27 CP BUFFER_END & 0 xFF
28 JR NZ , TIMER_END
29 ; Reset ponteiro
30 LD HL , DATA_BUFFER
31 LD ( DATA_POINTER ) , HL
32
33 TIMER_END :
34 POP HL
35 POP AF
36 RETI
37
38 ; VARI VEIS
39 DATA_POINTER : DW DATA_BUFFER
40 DATA_BUFFER : DS 256 ; Buffer de 256 amostras
41 BUFFER_END : EQU DATA_BUFFER + 256
9 ; C ó digo otimizado :
10 LD B , 10
11 LOOP2 :
12 ; processamento
13 DJNZ LOOP2
14
27 ; C ó digo otimizado :
28 LD HL , SOURCE
29 LD DE , DEST
30 LD BC , 100
23
31 LDIR
32
33 ; === O T I M I Z A O : ELIMINAR PUSH / POP D E S N E C E S S R I O S ===
34 ; C ó digo n ~
a o otimizado :
35 ROTINA1 :
36 PUSH AF
37 PUSH BC
38 PUSH DE
39 ; usa apenas A e BC
40 POP DE
41 POP BC
42 POP AF
43 RET
44
45 ; C ó digo otimizado :
46 ROTINA2 :
47 ; usa apenas A e BC - sem push / pop
48 RET
49
50 ; === O T I M I Z A O : USAR CP EM VEZ DE SUB ===
51 ; Para compara ç ~ o es onde n ~
a o precisa do resultado
52 ; C ó digo n ~
a o otimizado :
53 LD A , ( VALOR )
54 SUB 10
55 JR NZ , NAO_DEZ
56
57 ; C ó digo otimizado :
58 LD A , ( VALOR )
59 CP 10
60 JR NZ , NAO_DEZ
8 ; Use :
9 LD A , 00 H
10 LD ( VAR1 ) , A
11 LD ( VAR2 ) , A
12
13 ; === REUTILIZAR C D I G O COM SUB - ROTINAS ===
14 ; Em vez de repetir c ó digo :
15 ; Lugar 1:
16 LD A , ( INPUT1 )
17 CALL CONVERTER
18 LD ( OUTPUT1 ) , A
19
20 ; Lugar 2:
21 LD A , ( INPUT2 )
22 CALL CONVERTER
24
23 LD ( OUTPUT2 ) , A
24
25 CONVERTER :
26 ; c ó digo de convers ~
a o comum
27 RET
28
25
32 JR NZ , DUMP_LOOP
33 RET
34
35 ; === BREAKPOINTS VIA SOFTWARE ===
36 S OF T W AR E _ BR E A KP O I NT :
37 HALT ; Para a execu ç ~
ao
38 NOP ; Ponto de continua ç ~
ao
39 NOP
40 NOP
41 RET
42
43 ; === MONITOR DE PERFORMANCE ===
44 START_TIMING :
45 LD A , 00 H
46 OUT ( TIMER_START_PORT ) , A
47 RET
48
49 STOP_TIMING :
50 IN A , ( TIMER_VALUE_PORT )
51 LD ( LAST_TIME ) , A
52 RET
26
32 POP HL
33 RET
34
35 ; CONSTANTES DE EVENTOS
36 EVENT_START : EQU 01 H
37 EVENT_ERROR : EQU 02 H
38 EVENT_TIMER : EQU 03 H
39 EVENT_KEYPRESS : EQU 04 H
40
41 LOG_BUFFER : DS 256
42 LOG_BUFFER_END : EQU LOG_BUFFER + 256
43 LOG_POINTER : DW LOG_BUFFER
4 ; CONSTANTES DO SISTEMA
5 TEMP_SENSOR : EQU 10 H
6 HUMID_SENSOR : EQU 11 H
7 ALARM_RELAY : EQU 12 H
8 LCD_CMD : EQU 20 H
9 LCD_DATA : EQU 21 H
10
11 ; LIMITES
12 TEMP_MAX : EQU 50 ; 50 C
13 TEMP_MIN : EQU 10 ; 10 C
14 HUMID_MAX : EQU 80 ; 80%
15
16 MAIN_SYSTEM :
17 CALL SYSTEM_INIT
18 EI
19
20 MAIN_LOOP :
21 CALL READ_SENSORS
22 CALL UPDATE_DISPLAY
23 CALL CHECK_ALARMS
24 CALL LOG_DATA
25 CALL DELAY_1S
26 JP MAIN_LOOP
27
28 SYSTEM_INIT :
29 LD SP , 0 FFFFH
30 IM 1
31 CALL LCD_INIT
32 LD A , 00 H
33 OUT ( ALARM_RELAY ) , A ; Desliga alarme
34 RET
35
36 READ_SENSORS :
37 ; Ler temperatura
27
38 IN A , ( TEMP_SENSOR )
39 LD ( CURRENT_TEMP ) , A
40
41 ; Ler umidade
42 IN A , ( HUMID_SENSOR )
43 LD ( CURRENT_HUMID ) , A
44 RET
45
46 UPDATE_DISPLAY :
47 ; Mostrar temperatura
48 LD A , 80 H ; Linha 1 , coluna 0
49 OUT ( LCD_CMD ) , A
50 LD HL , TEMP_STR
51 CALL LCD_WRITE_STRING
52 LD A , ( CURRENT_TEMP )
53 CALL DISPLAY_NUMBER
54
55 ; Mostrar umidade
56 LD A , 0 C0H ; Linha 2 , coluna 0
57 OUT ( LCD_CMD ) , A
58 LD HL , HUMID_STR
59 CALL LCD_WRITE_STRING
60 LD A , ( CURRENT_HUMID )
61 CALL DISPLAY_NUMBER
62 RET
63
64 CHECK_ALARMS :
65 ; Verificar temperatura m á xima
66 LD A , ( CURRENT_TEMP )
67 CP TEMP_MAX
68 JR NC , TEMP_ALARM
69
70 ; Verificar temperatura m ı́ nima
71 CP TEMP_MIN
72 JR C , TEMP_ALARM
73
74 ; Verificar umidade
75 LD A , ( CURRENT_HUMID )
76 CP HUMID_MAX
77 JR NC , HUMID_ALARM
78
79 ; Desligar alarme se tudo normal
80 LD A , 00 H
81 OUT ( ALARM_RELAY ) , A
82 RET
83
84 TEMP_ALARM :
85 HUMID_ALARM :
86 LD A , 0 FFH
87 OUT ( ALARM_RELAY ) , A
88 RET
89
90 LOG_DATA :
91 ; Loggar dados a cada amostra
92 LD A , ( CURRENT_TEMP )
93 CALL LOG_EVENT
94 LD A , ( CURRENT_HUMID )
95 CALL LOG_EVENT
28
96 RET
97
98 DISPLAY_NUMBER :
99 ; Converter n ú mero para ASCII e mostrar
100 LD B , A
101 SRL A
102 SRL A
103 SRL A
104 SRL A ; D ı́ gito das dezenas
105 CALL TO_ASCII
106 CALL LCD_WRITE
107 LD A , B
108 AND 0 FH ; D ı́ gito das unidades
109 CALL TO_ASCII
110 CALL LCD_WRITE
111 RET
112
113 TO_ASCII :
114 ADD A , ’0 ’
115 RET
116
117 DELAY_1S :
118 LD B , 100
119 DELAY_1S_LOOP :
120 CALL DELAY_MS
121 DJNZ DELAY_1S_LOOP
122 RET
123
124 ; STRINGS
125 TEMP_STR : DB " Temp : C", 0
126 HUMID_STR : DB " Humid : %", 0
127
128 ; VARI VEIS
129 CURRENT_TEMP : DB 0
130 CURRENT_HUMID : DB 0
131 ALARM_STATE : DB 0
29
12 DISPLAY_OUT : EQU 37 H
13
14 ; CONSTANTES DO SISTEMA
15 SETPOINT : EQU 75 ; 75 C
16 KP : EQU 2 ; Ganho proporcional
17 KI : EQU 1 ; Ganho integral
18 KD : EQU 1 ; Ganho derivativo
19
20 MAIN_CONTROLLER :
21 CALL INIT_SYSTEM
22 EI
23
24 CONTROL_LOOP :
25 CALL READ_SENSORS
26 CALL PID_CALCULATION
27 CALL OUTPUT_CONTROL
28 CALL UPDATE_INTERFACE
29 CALL CHECK_SAFETY
30 CALL DELAY_100MS
31 JP CONTROL_LOOP
32
33 INIT_SYSTEM :
34 LD SP , 0 FF00H
35 IM 1
36 CALL INIT_DISPLAY
37 CALL INIT_MOTORS
38 LD A , 00 H
39 OUT ( HEATER_OUT ) , A
40 OUT ( VALVE_OUT ) , A
41 RET
42
43 READ_SENSORS :
44 ; Ler temperatura do processo
45 IN A , ( SENSOR1_IN )
46 LD ( PROCESS_TEMP ) , A
47
30
70 ; Termo Integral ( simplificado )
71 LD A , ( ERROR )
72 LD B , ( I_SUM )
73 ADD A , B
74 LD ( I_SUM ) , A
75 LD B , KI
76 CALL MULTIPLY_8BIT ; I = KI * sum_erro
77 LD ( I_TERM ) , A
78
79 ; Termo Derivativo ( simplificado )
80 LD A , ( LAST_ERROR )
81 LD B , A
82 LD A , ( ERROR )
83 SUB B ; delta_erro = erro - last_erro
84 LD B , KD
85 CALL MULTIPLY_8BIT ; D = KD * delta_erro
86 LD ( D_TERM ) , A
87
31
128 LD A , ( PID_OUTPUT )
129 CALL DISPLAY_OUTPUT
130 RET
131
132 CHECK_SAFETY :
133 ; Verifica ç ~
a o de condi ç ~
o es de seguran ç a
134 LD A , ( PROCESS_TEMP )
135 CP 100 ; Temperatura m á xima segura
136 JR NC , SAFETY_SHUTDOWN
137
138 LD A , ( PROCESS_PRESS )
139 CP 80 ; Press ~
a o m á xima segura
140 JR NC , SAFETY_SHUTDOWN
141 RET
142
143 SAFETY_SHUTDOWN :
144 ; Desligamento de emerg ^
e ncia
145 LD A , 00 H
146 OUT ( HEATER_OUT ) , A
147 OUT ( VALVE_OUT ) , A
148 OUT ( MOTOR1_PWM ) , A
149 OUT ( MOTOR2_PWM ) , A
150
151 ; Ativar alarme
152 LD A , 0 FFH
153 OUT ( ALARM_OUT ) , A
154 RET
155
156 MULTIPLY_8BIT :
157 ; Multiplica A * B , resultado em A
158 PUSH BC
159 PUSH DE
160 LD C , A
161 LD A , 00 H
162 LD D , B
163 MULT_LOOP :
164 ADD A , C
165 DEC D
166 JR NZ , MULT_LOOP
167 POP DE
168 POP BC
169 RET
170
171 READ_KEYPAD :
172 ; Ler teclado matricial
173 ; Retorna valor num é rico em A
174 ; Implementa ç ~
a o similar ao exemplo anterior
175 RET
176
177 D IS P L AY _ T EM P E RA T U RE :
178 ; Mostrar temperatura no display
179 RET
180
181 DISPLAY_PRESSURE :
182 ; Mostrar press ~a o no display
183 RET
184
185 DISPLAY_OUTPUT :
32
186 ; Mostrar sa ı́ da do controlador
187 RET
188
189 DELAY_100MS :
190 LD B , 100
191 DELAY_100MS_LOOP :
192 CALL DELAY_MS
193 DJNZ DELAY_100MS_LOOP
194 RET
195
196 ; V A R I V E I S DO SISTEMA PID
197 PROCESS_TEMP : DB 0
198 PROCESS_PRESS : DB 0
199 USER_SETPOINT : DB SETPOINT
200 ERROR : DB 0
201 LAST_ERROR : DB 0
202 P_TERM : DB 0
203 I_TERM : DB 0
204 D_TERM : DB 0
205 I_SUM : DB 0
206 PID_OUTPUT : DB 0
33
14.2 Flags Afetadas por Instruções
2. Faça uma rotina que troque os valores de B e C usando apenas A como temporário
34
16 Conclusão
16.1 Próximos Passos
• Prática constante: Implemente os exemplos em um emulador Z80
• Estudo de sistemas reais: Analise o código fonte de sistemas que usam Z80
35