0% acharam este documento útil (0 voto)
8 visualizações35 páginas

Curso Z80 Assembly: Do Zero ao Embarcado

klklklklkl
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
8 visualizações35 páginas

Curso Z80 Assembly: Do Zero ao Embarcado

klklklklkl
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Curso Completo de Programação em Z80 Assembly

Do Zero ao Sistema Embarcado

Módulos 1 a 12 com Projetos Práticos

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

2 Módulo 1 — Arquitetura do Z80 e Registradores 5


2.1 Visão Geral da Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Registradores de Propósito Geral . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Registradores Principais de 8 bits . . . . . . . . . . . . . . . . . . . 5
2.2.2 Pares de Registradores de 16 bits . . . . . . . . . . . . . . . . . . . 5
2.3 Registradores Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Registrador de Flags (F) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 Instruções Básicas de Movimentação . . . . . . . . . . . . . . . . . . . . . 6
2.6 Exercı́cios Práticos - Módulo 1 . . . . . . . . . . . . . . . . . . . . . . . . . 6

3 Módulo 2 — Operações Aritméticas e Lógicas 7


3.1 Operações Aritméticas de 8 bits . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1.1 Adição e Subtração Básica . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Operações de 16 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.3 Operações Lógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.4 Exemplo Aplicado: Calculadora Simples . . . . . . . . . . . . . . . . . . . 8
3.5 Exercı́cios - Módulo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

4 Módulo 3 — Controle de Fluxo e Saltos 9


4.1 Saltos Incondicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Saltos Condicionais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3 Exemplos Práticos de Controle de Fluxo . . . . . . . . . . . . . . . . . . . 10
4.4 Sistema de Menu Interativo . . . . . . . . . . . . . . . . . . . . . . . . . . 11

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

6 Módulo 5 — Modos de Endereçamento 14


6.1 Tipos de Endereçamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.2 Exemplos Detalhados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.3 Operações com Blocos de Memória . . . . . . . . . . . . . . . . . . . . . . 14
6.4 Exemplo: Manipulação de Array . . . . . . . . . . . . . . . . . . . . . . . . 15

7 Módulo 6 — Operações com Bits 16


7.1 Instruções de Manipulação de Bits . . . . . . . . . . . . . . . . . . . . . . . 16
7.2 Exemplos Práticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
7.3 Sistema de LEDs com Máscaras de Bit . . . . . . . . . . . . . . . . . . . . 17

8 Módulo 7 — Entrada e Saı́da (I/O) 18


8.1 Instruções de I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
8.2 Sistema de Leitura de Teclado . . . . . . . . . . . . . . . . . . . . . . . . . 18
8.3 Controle de Display LCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

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

10 Módulo 9 — Técnicas de Otimização 23


10.1 Otimização de Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
10.2 Otimização de Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

11 Módulo 10 — Técnicas de Debugging 25


11.1 Métodos de Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
11.2 Sistema de Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

12 Módulo 11 — Projeto: Sistema de Monitoramento 27


12.1 Sistema Completo de Monitoramento . . . . . . . . . . . . . . . . . . . . . 27

13 Módulo 12 — Projeto Final: Controlador Industrial 29


13.1 Sistema de Controle Industrial Completo . . . . . . . . . . . . . . . . . . . 29

14 Apêndice A — Referência Rápida de Instruções 33


14.1 Instruções Mais Comuns . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
14.2 Flags Afetadas por Instruções . . . . . . . . . . . . . . . . . . . . . . . . . 34

15 Apêndice B — Exercı́cios e Soluções 34


15.1 Exercı́cios por Módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
15.1.1 Módulo 1: Registradores . . . . . . . . . . . . . . . . . . . . . . . . 34
15.1.2 Módulo 2: Aritmética . . . . . . . . . . . . . . . . . . . . . . . . . . 34
15.1.3 Módulo 3: Controle de Fluxo . . . . . . . . . . . . . . . . . . . . . 34
15.2 Soluções dos Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

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:

• Computadores domésticos: Sinclair ZX Spectrum, MSX, TRS-80

• Sistemas embarcados: Controle industrial, instrumentação médica

• Video games: Nintendo Game Boy, Sega Master System

1.2 Por que Aprender Z80 Assembly Hoje?


• Compreensão profunda de arquitetura de computadores

• Base para aprender processadores modernos

• Desenvolvimento para sistemas embarcados com restrições

• Preservação e emulação de sistemas retro

1.3 Caracterı́sticas Técnicas

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

Tabela 1: Caracterı́sticas técnicas do Z80

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

Figura 1: Diagrama da arquitetura de registradores do Z80

2.2 Registradores de Propósito Geral


2.2.1 Registradores Principais de 8 bits
• A (Acumulador): Principal registrador para operações aritméticas e lógicas

• B, C, D, E, H, L: Registradores de uso geral

2.2.2 Pares de Registradores de 16 bits

Par Uso Principal Exemplo


AF Acumulador + Flags Resultados de operações
BC Contador/Parâmetro Loops, contagens
DE Destino/Ponteiro Operações com memória
HL Ponteiro universal Endereçamento flexı́vel

2.3 Registradores Especiais


• SP (Stack Pointer): Aponta para o topo da pilha (LIFO)

• PC (Program Counter): Endereço da próxima instrução

• IX, IY: Registradores de ı́ndice para endereçamento com offset

• I: Registrador de interrupção

• R: Registrador de refresh de memória

5
2.4 Registrador de Flags (F)

Bit Flag Nome Descrição


7 S Sign 1 = resultado negativo (bit 7 = 1)
6 Z Zero 1 = resultado zero
5 - - Reservado (sempre 0)
4 H Half Carry Carry do bit 3 para 4
3 - - Reservado (sempre 0)
2 P/V Parity/Overflow Paridade ou overflow
1 N Subtract 1 = última operação foi subtração
0 C Carry Carry do bit 7

Tabela 2: Layout do registrador de flags

2.5 Instruções Básicas de Movimentação


1 ; === M O V I M E N T A O ENTRE REGISTRADORES ===
2 LD A , B ; A = B
3 LD B , C ; B = C
4 LD D , E ; D = E
5
6 ; === CARREGAMENTO DE VALORES IMEDIATOS ===
7 LD A , 10 H ; A = 0 x10 (16 decimal )
8 LD HL , 1234 H ; HL = 0 x1234
9 LD BC , 5678 H ; BC = 0 x5678
10
11 ; === ACESSO M E M R I A COM E N D E R E O DIRETO ===
12 LD (8000 H ) , A ; Mem [0 x8000 ] = A
13 LD A , (8000 H ) ; A = Mem [0 x8000 ]
14 LD (4000 H ) , HL ; Mem [0 x4000 ] = L , Mem [0 x4001 ] = H
15

16 ; === ACESSO INDIRETO VIA HL ===


17 LD HL , 9000 H ; HL aponta para 0 x9000
18 LD ( HL ) , A ; Mem [ HL ] = A
19 LD B , ( HL ) ; B = Mem [ HL ]
20 INC HL ; HL ++ ( pr ó ximo endere ç o )
21

22 ; === USO DE REGISTRADORES DE NDICE ===


23 LD IX , 8500 H ; IX = 0 x8500
24 LD ( IX +2) , A ; Mem [ IX + 2] = A
25 LD B , ( IX -1) ; B = Mem [ IX - 1]

Listing 1: Movimentação de dados entre registradores e memória

2.6 Exercı́cios Práticos - Módulo 1


1 ; E X E R C C I O 1: Configure os registradores com valores espec ı́ ficos
2 ; A = 0 xA5 , B = 0 x3C , C = 0 x1F , HL = 0 xC000
3
4 ; E X E R C C I O 2: Movimente dados entre registradores
5 ; Copie o valor de B para D , depois de D para E
6
7 ; E X E R C C I O 3: Escreva uma sequ ^
e ncia que :

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

Listing 2: Exercı́cios de fixação do módulo 1

3 Módulo 2 — Operações Aritméticas e Lógicas


3.1 Operações Aritméticas de 8 bits
3.1.1 Adição e Subtração Básica

1 ; === A D I O SIMPLES ===


2 LD A , 05 H ; A = 5
3 ADD A , 03 H ; A = 8 (5 + 3)
4 ADD A , 02 H ; A = 10 (8 + 2)
5
6 ; === A D I O COM OUTROS REGISTRADORES ===
7 LD A , 10 H
8 LD B , 20 H
9 ADD A , B ; A = 0 x30 (48 decimal )
10
11 ; === S U B T R A O ===
12 LD A , 0 AH ; A = 10
13 SUB 03 H ; A = 7 (10 - 3)
14 LD B , 02 H
15 SUB B ; A = 5 (7 - 2)
16
17 ; === A D I O COM CARRY ( ADC ) ===
18 LD A , 0 F0H
19 LD B , 10 H
20 ADD A , B ; A = 0 x00 , Carry = 1
21 LD A , 05 H
22 ADC A , 00 H ; A = 6 (5 + 0 + Carry )

Listing 3: Operações aritméticas fundamentais

3.2 Operações de 16 bits


1 ; === A D I O DE 16 BITS ===
2 LD HL , 1000 H ; HL = 4096
3 LD BC , 2000 H ; BC = 8192
4 ADD HL , BC ; HL = 0 x3000 (12288)
5
6 ; === S U B T R A O COM E M P R S T I M O ===
7 LD HL , 1000 H
8 LD BC , 2000 H

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

Listing 4: Operações aritméticas com 16 bits

3.3 Operações Lógicas


1 ; === O P E R A O AND ( M S C A R A ) ===
2 LD A , 0 FH ; 00001111
3 AND 33 H ; 00110011 AND
4 ; Resultado : 00000011 (0 x03 )
5
6 ; === O P E R A O OR ( SETAR BITS ) ===
7 LD A , 81 H ; 10000001
8 OR 06 H ; 00000110 OR
9 ; Resultado : 10000111 (0 x87 )
10
11 ; === O P E R A O XOR ( ALTERNAR BITS ) ===
12 LD A , 0 AAH ; 10101010
13 XOR 0 FFH ; 11111111 XOR
14 ; Resultado : 01010101 (0 x55 )
15
16 ; === COMPLEMENTO ( NOT ) ===
17 LD A , 0 A5H ; 10100101
18 CPL ; Inverte todos os bits
19 ; Resultado : 01011010 (0 x5A )

Listing 5: Operações lógicas bit a bit

3.4 Exemplo Aplicado: Calculadora Simples


1 ; CALCULADORA SIMPLES
2 ; Entrada : Operando1 em B , Operando2 em C , Opera ç ~
a o em A
3 ; 0= Soma , 1= Subtra ç ~
a o , 2= AND , 3= OR
4
5 CALCULADORA :
6 CP 00 H
7 JP Z , SOMAR
8 CP 01 H
9 JP Z , SUBTRAIR
10 CP 02 H
11 JP Z , OPERAR_AND
12 CP 03 H
13 JP Z , OPERAR_OR
14 RET
15
16 SOMAR :
17 LD A , B
18 ADD A , C
19 RET

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

Listing 6: Calculadora de 4 operações

3.5 Exercı́cios - Módulo 2


1. Escreva código que some 0x25 + 0x37 e armazene o resultado em (0x8000)

2. Crie uma rotina que calcule a média de dois números (A + B)/2

3. Implemente uma operação XOR que alterne os 4 bits menos significativos

4 Módulo 3 — Controle de Fluxo e Saltos


4.1 Saltos Incondicionais
1 ; === SALTO ABSOLUTO ===
2 JP 0100 H ; Salta para endere ç o 0 x0100
3 JP ( HL ) ; Salta para endere ç o em HL
4 JP ( IX ) ; Salta para endere ç o em IX
5 JP ( IY ) ; Salta para endere ç o em IY
6
7 ; === SALTO RELATIVO ===
8 JR 10 H ; Salta +16 bytes ( forward )
9 JR F0H ; Salta -16 bytes ( backward )
10 ; ( F0H em complemento de 2 = -16)
11
12 ; === CHAMADA DE SUB - ROTINA ===
13 CALL 0500 H ; Chama sub - rotina em 0 x0500
14 RET ; Retorna da sub - rotina

Listing 7: Instruções de salto incondicional

9
4.2 Saltos Condicionais

Instrução Condição Descrição


JP Z, addr Z=1 Resultado zero
JP NZ, addr Z=0 Resultado não zero
JP C, addr C=1 Carry ocorreu
JP NC, addr C=0 Sem carry
JP M, addr S=1 Resultado negativo
JP P, addr S=0 Resultado positivo/não negativo
JP PE, addr P/V=1 Paridade par/Overflow
JP PO, addr P/V=0 Paridade ı́mpar/Sem overflow
JR Z, offset Z=1 Salto relativo se zero
JR NZ, offset Z=0 Salto relativo se não zero
JR C, offset C=1 Salto relativo se carry
JR NC, offset C=0 Salto relativo se não carry

Tabela 3: Tabela completa de saltos condicionais

4.3 Exemplos Práticos de Controle de Fluxo


1 ; === ESTRUTURA IF - THEN - ELSE ===
2 ; if ( A == 10) then B =1 else B =0
3 LD A , ( VALOR )
4 CP 0 AH ; Compara A com 10
5 JR NZ , ELSE
6 LD B , 01 H ; THEN : B = 1
7 JR FIM_IF
8 ELSE :
9 LD B , 00 H ; ELSE : B = 0
10 FIM_IF :
11
12 ; === ESTRUTURA WHILE ===
13 ; while ( CONTADOR > 0)
14 LD B , 05 H ; CONTADOR = 5
15 WHILE_LOOP :
16 LD A , B
17 CP 00 H
18 JR Z , FIM_WHILE ; Sai se contador == 0
19

20 ; Corpo do loop
21 CALL PROCESSAR
22 DEC B
23 JR WHILE_LOOP
24 FIM_WHILE :
25

26 ; === ESTRUTURA FOR ===


27 ; for ( i =0; i <5; i ++)
28 LD B , 00 H ; i = 0
29 FOR_LOOP :
30 ; Corpo do loop
31 CALL PROCESSAR
32
33 INC B
34 LD A , B

10
35 CP 05 H ; i < 5?
36 JR NZ , FOR_LOOP

Listing 8: Exemplos de estruturas de controle

4.4 Sistema de Menu Interativo


1 ; SISTEMA DE MENU INTERATIVO
2 ; Op ç ~
o es : 1= LED ON , 2= LED OFF , 3= TOGGLE , 4= EXIT
3
4 MENU_PRINCIPAL :
5 CALL MOSTRAR_MENU
6 CALL LER_TECLADO
7 CP ’1 ’
8 JP Z , LED_ON
9 CP ’2 ’
10 JP Z , LED_OFF
11 CP ’3 ’
12 JP Z , LED_TOGGLE
13 CP ’4 ’
14 RET Z ; Sai se ’4 ’
15 JP MENU_PRINCIPAL ; Volta se op ç ~
a o inv á lida
16
17 LED_ON :
18 LD A , 0 FFH
19 OUT ( LED_PORT ) , A
20 JP MENU_PRINCIPAL
21
22 LED_OFF :
23 LD A , 00 H
24 OUT ( LED_PORT ) , A
25 JP MENU_PRINCIPAL
26
27 LED_TOGGLE :
28 IN A , ( LED_PORT )
29 CPL
30 OUT ( LED_PORT ) , A
31 JP MENU_PRINCIPAL
32
33 MOSTRAR_MENU :
34 ; C ó digo para mostrar menu no display
35 RET
36
37 LER_TECLADO :
38 ; C ó digo para ler teclado
39 RET

Listing 9: Sistema de menu com múltiplas opções

5 Módulo 4 — Loops e Sub-rotinas


5.1 Loops com DJNZ

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

Listing 10: Uso do DJNZ para loops eficientes

5.2 Sub-rotinas e Pilha


1 ; === SUB - ROTINA SIMPLES ===
2 MU LTIPLI CAR_PO R_4 :
3 SLA A ; Shift left = multiplicar por 2
4 SLA A ; Novamente = por 4
5 RET
6

7 ; === SUB - ROTINA COM P A R M E T R O S ===


8 ; Entrada : A = valor , B = multiplicador
9 ; Sa ı́ da : A = valor * multiplicador
10
11 MULTIPLICAR :
12 LD C , A ; Salva valor original
13 LD A , 00 H ; Acumulador = 0
14 LD D , B ; Contador = multiplicador
15 MULT_LOOP :
16 ADD A , C ; Soma valor original
17 DEC D
18 JR NZ , MULT_LOOP
19 RET
20
21 ; === USO DA PILHA PARA PRESERVAR REGISTRADORES ===
22 ROTINA_COMPLEXA :
23 PUSH AF
24 PUSH BC

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

Listing 11: Uso da pilha em sub-rotinas

5.3 Exemplo: Sistema de Delay


1 ; SISTEMA DE DELAY PARAMETRIZADO
2 ; Entrada : B = unidades de delay ( cada unidade 1 ms )
3
4 DELAY_MS :
5 PUSH BC
6 PUSH DE
7 DELAY_LOOP :
8 LD DE , DELAY_CONST ; Constante calibrada
9 DELAY_INNER :
10 DEC DE
11 LD A , D
12 OR E
13 JR NZ , DELAY_INNER
14 DJNZ DELAY_LOOP
15 POP DE
16 POP BC
17 RET
18
19 DELAY_CONST : EQU 0360 H ; Ajustar conforme clock
20
21 ; USO :
22 ; LD B , 100 ; 100 ms de delay
23 ; CALL DELAY_MS

Listing 12: Sistema de delay preciso

13
6 Módulo 5 — Modos de Endereçamento
6.1 Tipos de Endereçamento

Modo Sintaxe Descrição


Imediato LD A, 12H Valor direto no código
Registrador LD A, B Entre registradores
Direto LD A, (1234H) Endereço absoluto
Indireto LD A, (HL) Via registrador ponteiro
Indexado LD A, (IX+5) Base + offset
Implı́cito ADD A, B Acumulador implı́cito

Tabela 4: Modos de endereçamento do Z80

6.2 Exemplos Detalhados


1 ; === E N D E R E A M E N T O IMEDIATO ===
2 LD A , 3 CH ; A = 0 x3C
3 LD HL , 8000 H ; HL = 0 x8000
4 LD BC , 1234 H ; BC = 0 x1234
5
6 ; === E N D E R E A M E N T O DIRETO ===
7 LD (5000 H ) , A ; Mem [0 x5000 ] = A
8 LD A , (6000 H ) ; A = Mem [0 x6000 ]
9 LD (7000 H ) , HL ; Mem [0 x7000 ] = L , Mem [0 x7001 ] = H
10
11 ; === E N D E R E A M E N T O INDIRETO ( HL ) ===
12 LD HL , 9000 H
13 LD ( HL ) , 55 H ; Mem [0 x9000 ] = 0 x55
14 LD B , ( HL ) ; B = Mem [0 x9000 ]
15 INC HL ; HL = 0 x9001
16 LD ( HL ) , 0 AAH ; Mem [0 x9001 ] = 0 xAA
17
18 ; === E N D E R E A M E N T O INDEXADO ===
19 LD IX , 8500 H
20 LD ( IX +0) , 01 H ; Mem [0 x8500 ] = 1
21 LD ( IX +1) , 02 H ; Mem [0 x8501 ] = 2
22 LD A , ( IX +2) ; A = Mem [0 x8502 ]
23
24 LD IY , 8600 H
25 LD ( IY -1) , 0 FFH ; Mem [0 x85FF ] = 0 xFF

Listing 13: Exemplos de cada modo de endereçamento

6.3 Operações com Blocos de Memória


1 ; === COPIA DE BLOCO COM LDIR ===
2 ; Copia BC bytes de HL para DE
3 LD HL , FONTE
4 LD DE , DESTINO
5 LD BC , 0100 H ; 256 bytes
6 LDIR ; Copia at é BC =0
7

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

Listing 14: Instruções de bloco para manipulação eficiente de memória

6.4 Exemplo: Manipulação de Array


1 ; INICIALIZAR ARRAY COM VALORES
2 LD HL , ARRAY
3 LD B , 10 ; 10 elementos
4 LD A , 00 H ; Valor inicial
5 INIT_LOOP :
6 LD ( HL ) , A
7 INC HL
8 INC A
9 DJNZ INIT_LOOP
10
11 ; SOMAR ELEMENTOS DO ARRAY
12 LD HL , ARRAY
13 LD B , 10
14 LD A , 00 H ; Acumulador
15 SUM_LOOP :
16 ADD A , ( HL )
17 INC HL
18 DJNZ SUM_LOOP
19 LD ( TOTAL ) , A
20
21 ; BUSCAR VALOR NO ARRAY
22 LD HL , ARRAY
23 LD B , 10
24 LD C , 0 FFH ; Posi ç ~
a o ( -1 se n ~
a o encontrado )
25 LD D , 05 H ; Valor a buscar
26 SEARCH_LOOP :
27 LD A , ( HL )
28 CP D
29 JR Z , FOUND
30 INC HL

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

Listing 15: Operações com arrays na memória

7 Módulo 6 — Operações com Bits


7.1 Instruções de Manipulação de Bits

Instrução Descrição Flags Afetadas


BIT b, r Testa bit b do registrador r Z=1 se bit=0
SET b, r Coloca bit b em 1 Nenhuma
RES b, r Coloca bit b em 0 Nenhuma
SLA r Shift left aritmético C, Z, S, P/V
SRA r Shift right aritmético C, Z, S, P/V
SRL r Shift right lógico C, Z, S, P/V
RL r Rotate left through carry C, Z, S, P/V
RR r Rotate right through carry C, Z, S, P/V
RLC r Rotate left circular C, Z, S, P/V
RRC r Rotate right circular C, Z, S, P/V

Tabela 5: Instruções de manipulação de bits

7.2 Exemplos Práticos


1 ; === TESTE DE BITS ===
2 LD A , 0 A5H ; 10100101
3 BIT 7 , A ; Testa bit 7 (1)
4 JR NZ , BIT7_SET ; Salta se bit 7 = 1
5 BIT 0 , A ; Testa bit 0 (1)
6 JR NZ , BIT0_SET ; Salta se bit 0 = 1
7
8 ; === CONTROLE DE HARDWARE VIA BITS ===
9 ; Ligar / desligar dispositivos
10 CONTROLAR_DISPOSITIVOS :
11 IN A , ( STATUS_PORT )
12 BIT 0 , A ; Testa sensor 1
13 CALL NZ , ATIVAR_MOTOR1
14 BIT 1 , A ; Testa sensor 2
15 CALL NZ , ATIVAR_MOTOR2
16 RET
17
18 ; === SHIFTS PARA M U L T I P L I C A O / D I V I S O ===
19 MU LTIPLI CAR_PO R_8 :

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

Listing 16: Manipulação avançada de bits

7.3 Sistema de LEDs com Máscaras de Bit


1 ; TABELA DE P A D R E S PARA DISPLAY DE LEDS
2 LED_PATTERNS :
3 DB 3 FH ; 0: 00111111
4 DB 06 H ; 1: 00000110
5 DB 5 BH ; 2: 01011011
6 DB 4 FH ; 3: 01001111
7 DB 66 H ; 4: 01100110
8 DB 6 DH ; 5: 01101101
9 DB 7 DH ; 6: 01111101
10 DB 07 H ; 7: 00000111
11 DB 7 FH ; 8: 01111111
12 DB 6 FH ; 9: 01101111
13

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

Listing 17: Controle de display de LEDs via bits

8 Módulo 7 — Entrada e Saı́da (I/O)


8.1 Instruções de I/O
1 ; === ESCRITA NA PORTA ===
2 LD A , 55 H
3 OUT (01 H ) , A ; Escreve 0 x55 na porta 1
4 OUT (02 H ) , A ; Escreve 0 x55 na porta 2
5
6 ; === LEITURA DA PORTA ===
7 IN A , (01 H ) ; L^
e porta 1 para A
8 IN A , (02 H ) ; L^
e porta 2 para A
9
10 ; === ESCRITA EM PORTAS COM REGISTRADOR C ===
11 LD A , 0 FFH
12 LD C , 80 H
13 OUT ( C ) , A ; Escreve na porta em C (0 x80 )
14
15 ; === LEITURA DE PORTAS COM REGISTRADOR C ===
16 LD C , 81 H
17 IN A , ( C ) ; L^
e porta em C (0 x81 )

Listing 18: Comunicação com dispositivos externos

8.2 Sistema de Leitura de Teclado


1 ; LEITURA DE TECLADO 4 x4
2 ; Retorna tecla em A (0 - F ) ou 0 xFF se nenhuma
3

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

Listing 19: Leitura de teclado matricial

8.3 Controle de Display LCD


1 ; CONSTANTES PARA LCD
2 LCD_CMD : EQU 00 H
3 LCD_DATA : EQU 01 H
4 LCD_BUSY : EQU 02 H
5
6 ; I N I C I A L I Z A O DO LCD
7 LCD_INIT :
8 CALL LCD_DELAY
9 LD A , 38 H ; 8 - bit , 2 linhas , 5 x8
10 OUT ( LCD_CMD ) , A

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

23 ; ESCREVER CARACTERE NO LCD


24 ; Entrada : A = caractere
25 LCD_WRITE :
26 PUSH AF
27 LCD_BUSY_WAIT :
28 IN A , ( LCD_BUSY )
29 BIT 7 , A
30 JR NZ , LCD_BUSY_WAIT
31 POP AF
32 OUT ( LCD_DATA ) , A
33 RET
34

35 ; ESCREVER STRING NO LCD


36 ; Entrada : HL = ponteiro para string ( terminada em 0)
37 LCD_WRITE_STRING :
38 LD A , ( HL )
39 OR A
40 RET Z ; Fim da string
41 CALL LCD_WRITE
42 INC HL
43 JR LCD_WRITE_STRING
44
45 LCD_DELAY :
46 LD BC , 1000
47 DELAY_LOOP :
48 DEC BC
49 LD A , B
50 OR C
51 JR NZ , DELAY_LOOP
52 RET

Listing 20: Driver para display LCD alfanumérico

20
9 Módulo 8 — Interrupções
9.1 Tipos de Interrupções

Tipo Vetor Descrição


INT Modo 0 Fornecido pelo dispositivo Instrução fornecida externamente
INT Modo 1 0x0038 Vetor fixo
INT Modo 2 Tabela indireta Vetor indireto via registrador I
NMI 0x0066 Não mascarável

Tabela 6: Tipos de interrupções no Z80

9.2 Sistema Completo de Interrupções


1 ; C O N F I G U R A O INICIAL DO SISTEMA
2 INICIO :
3 LD SP , 0 FFFFH ; Inicializa stack pointer
4 IM 1 ; Modo de interrup ç ~
ao 1
5 LD A , 0 F0H
6 LD I , A ; Define p á gina alta do vetor ( modo 2)
7 EI ; Habilita interrup ç ~o es
8 JP MAIN_LOOP
9

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

Listing 21: Configuração e tratamento de interrupções

9.3 Exemplo: Sistema de Aquisição de Dados


1 ; SISTEMA DE A Q U I S I O DE DADOS
2 ; Amostra sensor a cada 10 ms via timer
3
4 MAIN_LOOP :
5 ; Processo principal
6 CALL UPDATE_DISPLAY
7 CALL CHECK_COMMANDS
8 JR MAIN_LOOP
9
10 ; INTERRUP O DE TIMER ( chamada a cada 10 ms )
11 TIMER_ISR :
12 PUSH AF
13 PUSH HL
14
15 ; Ler sensor
16 IN A , ( SENSOR_PORT )
17 LD HL , ( DATA_POINTER )
18 LD ( HL ) , A
19 INC HL
20 LD ( DATA_POINTER ) , HL
21
22 ; Verificar fim do buffer

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

Listing 22: Sistema de aquisição com interrupção de timer

10 Módulo 9 — Técnicas de Otimização


10.1 Otimização de Código
1 ; === O T I M I Z A O : USAR DJNZ EM VEZ DE DEC + JR ===
2 ; C ó digo lento :
3 LD B , 10
4 LOOP1 :
5 ; processamento
6 DEC B
7 JR NZ , LOOP1
8

9 ; C ó digo otimizado :
10 LD B , 10
11 LOOP2 :
12 ; processamento
13 DJNZ LOOP2
14

15 ; === O T I M I Z A O : USAR LDIR PARA BLOCO COPIES ===


16 ; C ó digo lento :
17 LD HL , SOURCE
18 LD DE , DEST
19 LD B , 100
20 LOOP3 :
21 LD A , ( HL )
22 LD ( DE ) , A
23 INC HL
24 INC DE
25 DJNZ LOOP3
26

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

Listing 23: Técnicas para código mais rápido e compacto

10.2 Otimização de Memória


1 ; === COLOCAR CONSTANTES FREQUENTES EM REGISTRADORES ===
2 ; Em vez de :
3 LD A , 00 H
4 LD ( VAR1 ) , A
5 LD A , 00 H
6 LD ( VAR2 ) , A
7

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

29 ; === USAR E N D E R E A M E N T O RELATIVO ===


30 ; Para saltos curtos , use JR em vez de JP
31 ; JR usa menos bytes e é mais r á pido para saltos curtos
32
33 ; === ALINHAMENTO DE DADOS PARA ACESSO R P I D O ===
34 ; Coloque vari á veis frequentemente acessadas em
35 ; endere ç os que facilitem o c á lculo
36 VARS :
37 VAR1 : DB 0
38 VAR2 : DB 0
39 VAR3 : DB 0
40 ; Todas acess ı́ veis via HL com offsets pequenos

Listing 24: Técnicas para economizar memória

11 Módulo 10 — Técnicas de Debugging


11.1 Métodos de Debugging
1 ; === PONTOS DE V E R I F I C A O ( CHECKPOINTS ) ===
2 DEBUG_CHECKPOINT :
3 LD A , CHECKPOINT_ID
4 OUT ( DEBUG_PORT ) , A
5 RET
6
7 ; === V E R I F I C A O DE SANIDADE DE REGISTRADORES ===
8 VALIDATE_REGS :
9 ; Verifica se HL est á dentro de limites
10 LD A , H
11 CP 80 H ; Endere ç o deve ser < 0 x8000?
12 JP NC , ADDRESS_ERROR
13
14 ; Verifica se contador é razo á vel
15 LD A , B
16 OR A
17 JP Z , ZERO_COUNT_ERROR
18 RET
19
20 ; === DUMP DE M E M R I A PARA DEBUG ===
21 DUMP_MEMORY :
22 ; Despeja conte ú do da mem ó ria para porta serial
23 LD HL , START_ADDR
24 LD BC , DUMP_SIZE
25 DUMP_LOOP :
26 LD A , ( HL )
27 OUT ( SERIAL_PORT ) , A
28 INC HL
29 DEC BC
30 LD A , B
31 OR C

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

Listing 25: Técnicas para encontrar e corrigir erros

11.2 Sistema de Logging


1 ; SISTEMA DE LOGGING PARA DEBUG
2 ; Registra eventos importantes durante execu ç ~
ao
3
4 LOG_EVENT :
5 ; A = c ó digo do evento
6 PUSH HL
7 PUSH DE
8 PUSH BC
9
10 LD HL , ( LOG_POINTER )
11 LD ( HL ) , A ; Armazena c ó digo
12 INC HL
13
14 ; Timestamp
15 LD A , ( SYSTEM_TIMER )
16 LD ( HL ) , A
17 INC HL
18
19 ; Verificar fim do buffer
20 LD A , H
21 CP ( LOG_BUFFER_END >> 8) & 0 xFF
22 JR NZ , LOG_DONE
23 LD A , L
24 CP LOG_BUFFER_END & 0 xFF
25 JR NZ , LOG_DONE
26 ; Buffer cheio - parar logging ou sobrescrever
27 LD HL , LOG_BUFFER
28 LOG_DONE :
29 LD ( LOG_POINTER ) , HL
30 POP BC
31 POP DE

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

Listing 26: Sistema de log para debugging

12 Módulo 11 — Projeto: Sistema de Monitoramento


12.1 Sistema Completo de Monitoramento
1 ; SISTEMA DE MONITORAMENTO DE TEMPERATURA E UMIDADE
2 ; Com display LCD , alarme e logging
3

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

Listing 27: Sistema de monitoramento com múltiplos sensores

13 Módulo 12 — Projeto Final: Controlador Indus-


trial
13.1 Sistema de Controle Industrial Completo
1 ; CONTROLADOR INDUSTRIAL Z80
2 ; Com controle PID , interface operador e comunica ç ~
ao
3
4 ; DEFINI ES DE PORTAS
5 MOTOR1_PWM : EQU 30 H
6 MOTOR2_PWM : EQU 31 H
7 SENSOR1_IN : EQU 32 H
8 SENSOR2_IN : EQU 33 H
9 VALVE_OUT : EQU 34 H
10 HEATER_OUT : EQU 35 H
11 KEYPAD_IN : EQU 36 H

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

48 ; Ler press ~ao


49 IN A , ( SENSOR2_IN )
50 LD ( PROCESS_PRESS ) , A
51
52 ; Ler setpoint do operador
53 CALL READ_KEYPAD
54 LD ( USER_SETPOINT ) , A
55 RET
56
57 PID_CALCULATION :
58 ; C á lculo do erro
59 LD A , ( USER_SETPOINT )
60 LD B , A
61 LD A , ( PROCESS_TEMP )
62 SUB B ; erro = atual - setpoint
63 LD ( ERROR ) , A
64
65 ; Termo Proporcional
66 LD B , KP
67 CALL MULTIPLY_8BIT ; P = KP * erro
68 LD ( P_TERM ) , A
69

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

88 ; Salva erro atual


89 LD A , ( ERROR )
90 LD ( LAST_ERROR ) , A
91
92 ; Soma PID
93 LD A , ( P_TERM )
94 LD B , A
95 LD A , ( I_TERM )
96 ADD A , B
97 LD B , A
98 LD A , ( D_TERM )
99 ADD A , B
100 LD ( PID_OUTPUT ) , A
101 RET
102
103 OUTPUT_CONTROL :
104 ; Aplicar sa ı́ da PID ao aquecedor
105 LD A , ( PID_OUTPUT )
106 OUT ( HEATER_OUT ) , A
107
108 ; Controle de v á lvula baseado na press ~ ao
109 LD A , ( PROCESS_PRESS )
110 CP 50 ; Press ~a o limite = 50
111 JR C , OPEN_VALVE
112 ; Fechar v á lvula se press ~
a o alta
113 LD A , 00 H
114 OUT ( VALVE_OUT ) , A
115 RET
116
117 OPEN_VALVE :
118 LD A , 0 FFH
119 OUT ( VALVE_OUT ) , A
120 RET
121
122 UPDATE_INTERFACE :
123 ; Atualizar display com valores atuais
124 LD A , ( PROCESS_TEMP )
125 CALL D IS P L AY _ T EM P E RA T U RE
126 LD A , ( PROCESS_PRESS )
127 CALL DISPLAY_PRESSURE

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

Listing 28: Controlador industrial com múltiplas funções

14 Apêndice A — Referência Rápida de Instruções


14.1 Instruções Mais Comuns

Instrução Descrição Ciclos


LD A,(HL) Carrega A de (HL) 7
LD (HL),A Armazena A em (HL) 7
ADD A,r Soma registrador 4
SUB r Subtrai registrador 4
INC r Incrementa registrador 4
DEC r Decrementa registrador 4
JP nn Salto absoluto 10
JR e Salto relativo 12
CALL nn Chama sub-rotina 17
RET Retorna 10
DJNZ e Decrementa B e salta 13/8

Tabela 7: Instruções mais comuns e seus ciclos

33
14.2 Flags Afetadas por Instruções

Instrução Flags Afetadas


ADD, ADC, SUB, SBC Todos (S,Z,H,P/V,N,C)
AND, OR, XOR S,Z,H,P/V,N,C(0)
CP S,Z,H,P/V,N,C
INC, DEC S,Z,H,P/V,N
RL, RR, RLC, RRC S,Z,H,P/V,N,C
BIT Z,H,N

Tabela 8: Flags afetadas pelas instruções

15 Apêndice B — Exercı́cios e Soluções


15.1 Exercı́cios por Módulo
15.1.1 Módulo 1: Registradores
1. Escreva código que configure: A=0x55, B=0xAA, HL=0x8000

2. Faça uma rotina que troque os valores de B e C usando apenas A como temporário

15.1.2 Módulo 2: Aritmética


1. Some 0x1234 e 0x5678, armazene o resultado em (0x9000)

2. Crie uma rotina que calcule o quadrado de um número (A × A)

15.1.3 Módulo 3: Controle de Fluxo


1. Implemente uma busca linear em um array de 10 elementos

2. Crie um menu com 3 opções usando saltos condicionais

15.2 Soluções dos Exercı́cios


1 ; Exerc ı́ cio 1 .2 : Trocar B e C usando A
2 SOLUCAO_TROCA :
3 LD A , B
4 LD B , C
5 LD C , A
6 RET
7
8 ; Exerc ı́ cio 2 .2 : Calcular quadrado
9 QUADRADO :
10 LD B , A
11 LD C , A
12 CALL MULTIPLICAR ; Usa rotina do m ó dulo 4
13 RET

Listing 29: Solução do exercı́cio de troca de registradores

34
16 Conclusão
16.1 Próximos Passos
• Prática constante: Implemente os exemplos em um emulador Z80

• Projetos pessoais: Crie seus próprios sistemas embarcados

• Estudo de sistemas reais: Analise o código fonte de sistemas que usam Z80

• Expansão para outros processadores: 6502, 8080, 8051

16.2 Recursos Recomendados


• Emuladores: MAME, FUSE (ZX Spectrum), BGB (Game Boy)

• Manuais: Z80 CPU User Manual (Zilog)

• Livros: ”Programming the Z80”de Rodnay Zaks

• Comunidades: Fóruns de retrocomputação, GitHub com projetos open source

16.3 Considerações Finais


O Z80, apesar de ter mais de 40 anos, continua sendo uma excelente ferramenta edu-
cacional para entender os fundamentos da programação em baixo nı́vel. As habilidades
adquiridas com este processador são diretamente transferı́veis para sistemas modernos e
fornecem uma base sólida para qualquer carreira em engenharia de computação, sistemas
embarcados ou desenvolvimento de software.
Lembre-se: A prática é essencial. Implemente todos os exemplos, modifique-os,
experimente e, principalmente, divirta-se no processo de aprendizado!

35

Você também pode gostar