Você está na página 1de 49

UEM – Faculdade de Engenharia

Departamento de Engenharia Electrotécnica


Curso de Engenharia Electrónica

Z80 - Programação Básica em Assembly


(C/o microcomputador Micamaster MAT980)

Elaborado por: Eng.Doho


Fev.Junho/2020 Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly
c/o Micamaster MAT980
Parte-1

Sumário:
A. Passos para a elaboração dum programa.
B. Estrutura (partes constituintes) de um programa em assembly.
C. Assembly básico: Directivas, instruções (mnemóncos e operandos) e outras disposições;
D. Técnicas e exemplos de programação em assembly.
Exemplos com todas as estruturas lógicas bésicas universais de controle de fluxo de
programação.
E. Exercícios-parte1.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Arquitectura e características básicas:

Mem.

I/O

Pinagem e organização interna do Z80, figuras de consulta na programação e s/interpretação, etc. Ac


Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
A - Passos para a elaboração dum programa (Análise do sistema).

1. Apresentação e reconhecimento do problema a resolver: é necessário compreender todos os


aspectos do problema e daí todos os aspectos que devem constituir sua solução (=requisitos e
especificações e funcionalidades do programa a elaborar para resolver o problema). Use texto e
digramas;

2. Projecto lógico:
a. Divida o programa em módulos que resolvem partes diferentes do problema. Tais módulos
serão as funções ou subrotinas do programa principal que por sua vez chamará às subrotinas
cada uma a seu tempo. Defina para cada subrotina a interface com o programa principal, isto
é a lista de parâmetros de entrada e a lista de retorno. Desenhe um diagrama de estrutura
(em blocos) que mostra a relação entre o programa principal e os seus subprogramas
indicando as variáveis de entrada e de saída.
Nota: Para um programa de enunciado simples só existirá um único módulo.
a. Para o programa principal e para cada uma das subrotinas, desenhe um fluxograma,
diagrama de NS, diagrama de actvidades UML, etc. Qualquer destes deve interpretar o
algoritomo para a solução da sua parte do problema. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Passos para a elaboração dum programa (cont).
3. Passagem do projecto lógico a programa:
Escolher uma linguagem de programação e escrever o programa de acordo com o projecto lógico.
Preferir linguagem de programação universal passando para assembly e finalmenete para código
máquina; escolha a ser influenciada por diversas restrições: de disponibilidade da linguagem, de
recursos (capacidade de memória) e de temporização crítica. (Usaremos o processo contrário, ou
seja começaremos pela linguagem assembly/máquina. Porquê?).
4. Conversão do programa (textual) para a forma executável: Realiza-se usando um assemblador
(p/linguagem assembly), um compilador (p/linguagem universal) ou manualmente (p/linguagem
assembly; o processo ora a ser usado. Porquê?).
5. Execução/Teste do programa no (micro) computador:
A execução do programa numa fase de teste visa verificar se ele cumpre com os requisitos e
especificações bem como com o plasmado nos fluxogramas. Errare humanun est: por isso é
frequente haver erros em muitos ou alguns poucos pontos dos passos acima.
Outro objectivo do teste do programa para além da simples correcção léxico-sintática, é a sua
reavaliação visando aumentar a eficiência ou desempenho do código, ou adicionar nele novos
requisitos saidos de observação ulterior. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
B - Estrutura (partes constituintes) de um programa em assembly.
Um programa assembly é constituido pelas seguintes partes (dispostas em colunas):
Endereços: na unidade de memória central (na zona onde está locado o programa);
Código máquina (= contéudos de tais endereços);
Rótulos (ou etiquetas);
Mnemónicos e operandos;
Comentários;
O programa pode ainda conter directivas do assemblador que o instruem para executar algum processamento
condicionado ou substituir alguma palavra por outra, etc. As directivas ou outras regras linguísticas de
assemblador variam de implementação para implementação, contudo há directivas gerais que (quase) todos
os assembladores têm (vamos examinar no âmbito do ponto C).
Ender.s Código Rótulos Mnem.+Oper. Coment.s.
ORG 4200h ;directiva ao assemblador: Endereço de armazenamento do bloco q. segue
4200 3E 1B Início: LD A, 27 ;Carrefar A c/dado imediato
4202 DD 21 00 50 LD IX, 5000H ;Carregar em IX o ender. Base
4206 DD 86 00 ADD A, (IX+0) ;Somar A com conteudo de (IX+0)
4209 DD 77 00 LD (IX+1), A ;guardar a soma em (IX+1)
420C 76 Fim: HALT ;parar/terminar execução.

Números em hexadecimal Números em decimal, binário, hexadecimal e octal; em decimal por defeito Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
C - Assembly básico do Z80: Directivas, instruções e outras disposições.
Nomes reservados: Alguns nomes são reservados como palavras-chave (keywords) e não devem ser utilizados pelo programador
para nomear variáveis, constantes ou rótulos. Estes são:
• os nomes de registos de 8 bits (A, B, C, D, E, H, L, I, R);
• os nomes de registos de 16 bits (IX, IY, SP);
• Os nomes de pares de registos (AF, BC, DE, HL, AF ', BC' DE ', HL’ ), e
• Os nomes dos estados das bandeiras/sinalizadoras (flags) ​(C, NC, Z, NZ, R, M, P, PE, PO).
• Os nomes das pseudo-operações (dependendo da sua localização):
Pseudo-ops: São comandos em forma de mnemónicos, mas não são instruções do reportório do mP, nem são rótulos, mas sim são
directivas de assemblador, que o instruem a executar certa operação, mudar de contexto (estado), ou definir significantes, etc.:
Pseudo Op Significado (veja exemplos nos programas nas páginas seguintes)
DEFB ou DB DEFINE BYTE (coloca/aloca um byte na memória, posição corrente)
DEFL DEFINE LABEL (define rótulo)
DEFM DEFINE STRING (coloca/aloca um string ascii, na posição corrente)
DEFS ou DS DEFINE STORAGE (aloca um bloco de bytes na memória, sem especificar o conteúdo)
DEFW ou DW DEFINE WORD (coloca/aloca um duplobyte na posição corrente da memória)
END END (fim do programa)
EQU EQUATE (define um significante; liga um identificador a algum valor ou a outro identificador)
ORG ORIGIN (define endereço corrente)
MACRO Inicia macro-instrução: Substitui bloco de instruções, pode ser repetidam/invocado ao longo do programa.
ENDM Indica o fim da definição da macro-instrução.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

Assemblagem por computador:

1. Software assemblador;
O software é o Z80 Macro Assembler (da “defunta” 2500 AD Software) é constituido pelos ficheiros:
• X80.exe - Z80 Macro Assembler: compila ficheiros fonte (.asm) p/ficheiros objecto (.obj).
• Link.exe – Link-editor. Converte 1 ficheiro ou ;liga 2 ou mais ficheiros e converte para ficheiro executável
num formato à escolha, designadamente: formato intel hex, formato binário
1. O processo de assemblagem e linkedição (vide o manual em [9] para pormenores quanto à linha de comando):
Assemblagem: use o X80.exe; Linkedição: use link.exe
2. Formatos dos ficheiros executáveis: Intel Hex;
3. Transferência do ficheiro executável, do PC para o Micamaster MAT980: via porta serial RS232 (para
computadores sem porta RS232, um conversor USB para UART/RS232 deverá ser usado).

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
C - Assembly básico do Z80: Directivas, instruções e outras disposições (cont).
Rótulos ou etiquetas ( labels ): Identificam posições do programa em assembly. Estas posições
correspondem a endereços na memória, sendo então referenciadas por exemplo nas instruções de
trasferência de dados, nas de transferência de controle, etc.
Um rótulo só pode iniciar com letra (os caracteres subsequentes devem ser letras, números e
underscores), deve ter o máximo de 6 letras e deve ser delimitado à direita por dois pontos (:).
Nota: como foi dito anteriormente, estes aspectos e outros acima e abaixo referidos, dependem
da implementação de assemblador, conservando mesmo assim amplas semelhanças!
Endereços, conteúdos e operandos na forma numérica, caracteres e strings:
O assemblador considera as seguintes convenções, para números e caracteres que representam
endereços e dados, encontrados no programa:
• Decimal (o caso por defeito): LD B, 57; assume os números com apenas dígitos decimais como
sendo decimais por defeito, ou com o sufixo D: LD B,57D
• Hexadecimal (deve começar com um dígito decimal e terminar com um H ou h)
Exemplos: LD HL, 5039H; ADD A, (IY + 0B3H) ;
• Octal (o número deve terminar com O ou Q; ou ainda as suas minúsculas). Exemplo 1247O;
• Binário (deve terminar com B ou b). Exemplo: 10010010B;
• ASCII (o caractere ou string deve estar entre vírgulas altas): Exemplo 'AQUI';
• Deslocamento relativo ao PC - Contador de Programa ($). Exemplo $+27H.
Para mais pormenores consulte a bibliografia recomendada, especialmente [9]. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby.
Exemplos c/todas as estruturas lógicas universais de controle.
Programa com estrutura do tipo Sequência (ie., estrutura linear):
Problema 1: Somar dois números de 8 bits cada (=> resultado pode ser 9 bits = 2 bytes)
situados nos locais 5000h e 5001h. Guardar a soma o local de nome Result (=5002h) (este
local inclui 5003h porque?) .
Nota: Enunciado (problema) é simples => Prescindimos de fazer uma divisão da tarefa
(programa) em partes (módulos) e daí tambem prescindimos de representar o programa em
um diagrama de estrutura. Início

Carregar Dado1 c/ (5000h)


Fluxograma e/ou
(diagrama de actividades UML, Carregar Dado2 c/ (5001h)
TPC1 : representar o mesmo
diagrama de NS, pesudocódigo): Soma = Dado1 + Dado2 fluxograma em pseudocódigo,
em diagrama de NS (opcional),
Guardar Soma em (Result) e em diagrama de actividades
UML (opcional).
Probl.1 - Fluxograma Fim Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Passagem do projecto lógico a programa e conversão à forma executável:
Ender. Código Rótulos Mnem.+Oper. Comentários.
ORG 4200h ;codigo inicia no ender.4200h
4200 2A 00 50 Inicio: LD HL, (5000h) ;tb pode ser ED 6B 00 50
4203 4C LD C, H
4204 26 00 LD H, 0
4206 44 LD B, H
4207 09 Fim: ADD HL, BC
4208 22 02 50 LD (5002), HL ;tb pode ser ED 63 02 50
420B 76 HALT
Probl.1 – Programa: usando soma de 16 bits

Ender Código Rótulos Mnem.+Oper. Coments.


ORG 4200h
3A 00 50 Inicio: LD A, (5000h)
LD B, A
LD A, (5001h)
ADD A,B
LD (5002h),A
LD A,0
ADC A,0
LD (5003h),A
Fim: HALT
Probl.1 – Programa: usando soma de 8 bits
TPC2 :
(1) Reescreva o programa de outras 3 formas diferentes interpretando o mesmo fluxograma da página anterior.
(2) preencha as colunas 1, 2 e 5 da 2ª tabela acima. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby (cont.).
Programa com estrutura do tipo Seleção Simples:
Problema 2: Comparar dois números de 8 bits cada, situados em locais de memória arbitrários (escolha
livremente: seja: Num1 em 5000h e Num2 em 5005h). Guardar o menor deles no local Min (seja Min o local
500Ah).
Nota: Como no caso anterior, o enunciado é simples => Prescindimos de fazer uma divisão da tarefa (programa)
em partes (módulos) e daí tambem prescindimos de representar o programa em um diagrama de estrutura.
Fluxograma e/ou (diagrama de actividades UML, diagrama de NS, pesudocódigo):

Início Fluxograma Diagrama de NS (Nassi-Shneiderman)

Carregar minimo com (Num1)


Carregar minimo com (Num1)
S Minimo < (Num2)
minimo < (Num2) N S

N minimo = (Num2) o traço significa:


Minimo = (Num2) Guardar minimo em (Min) “nada a fazer!”

Guardar minimo em (Min) TPC3: representar o mesmo fluxograma em pseudocódigo


e em diagrama de actividades UML (opcional). Ac
Fim
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Passagem do projecto lógico a
programa e conversão à forma Ender. Código Rótulos Mnem.+Oper. Comentários.
executável: ORG 4200h
Inicio: LD A,(Num2)
LD B,A ;carregar B com (Num2)
LD A,(Num1) ;minimo = (Num1)
Probl.2 - programas CP B
JP C,JaTemMin ;IF minimo < (Num2) {
O có d i go p a ra i nte r p reta r u m LD A,B ; minimo = (Num2)
fluxograma, pode ser escrito de mil JaTemMin: ;ENDIF
LD (Min),A ;Guardar minimo
e uma maneiras Fim: HALT
Num1 EQU 5000h
Num2 EQU 5005h
Min EQU 500Ah

Ender Código Rótulos Mnem.+Oper. Coments.

ORG 4200h
4200 3A 00 50 Inicio: LD A,(Num1)
TPC4 : 21 __ __ LD HL,Num2
(1) Reescreva o programa de BE CP (HL)
outras 3 formas diferentes DA __ __ JP C,JaTemMin
interpretando o mesmo 7E LD A,(HL)
fluxograma / diagrama de 32 0A 50 JaTemMin: LD (Min),A
NS da página anterior. 76 Fim: HALT
(2) Preencha as colunas Num1 EQU 5000h
vazias/incompletas nas duas Num2 EQU 5005h
tabelas . Min EQU 500Ah Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby (cont.).
Programa com estrutura do tipo Selecção Dupla (ou de dupla alternativa):
Problema 3: O salário líquido (S_Liquido) mensal em contos (conto = 1000Mt) de um trabalhador deve ser
obtido deduzindo o imposto do seu salário base ilíquido (S_Iliquido), sendo que o imposto deve ser 2 contos
para S_Iliquido inferior a 25 contos e 5 contos de contrário.
Sugestão: Escolha arbitrariamente os locais de memória para S_Liquido, S_Iliquido (sejam S_Liquido EQU
5100h; S_Iliquido EQU 510Ah; podem ser outros).
Nota: Como nos casos anteriores, o enunciado é simples => Prescindimos de fazer uma divisão da tarefa em
partes.

Início

Carregar S_Iliquido

N S_Iliquido > 25 S
TPC5: representar o mesmo
S_Liquido = S_Iliquido - 2 S_Liquido = S_Iliquido - 5 fluxograma em pseudocódigo, em
diagrama de actividades UML(opcional),
e em diagrama de NS (opcional).
Guardar S_Liquido

Probl.3 – Fluxograma
Ac
Fim
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Ender. Código Rótulos Mnem.+ Oper. Comentários.
ORG 4200h
Inicio: LD A,(S_Iliquido)
CP 25
JP NC,eh25ouSup
SUB 2
JR LiqObtido
eh25ouSup:
SUB 5
LiqObtido:
LD (S_Liquido),A
Fim: HALT

S_Liquido EQU 5100h


S_Iliquido EQU 510Ah
Probl.3 – Programa

TPC6 :
(1) Reescreva o programa de outras 3 formas diferentes, interpretando o mesmo fluxograma da
página anterior.
(2) preencha as colunas 1, 2 e 5 da tabela acima.
(3) proponha um fluxograma modificado mas logicamente equivalente ao da página anterior, e;
(4) Escreva o respectivo programa de 2 formas diferentes interpretando o mesmo fluxograma.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby (cont.).
Programa com estrutura do tipo Selecção Múltipla (ou de múltiplas altenativas):
Problema 4: Receber um byte do teclado do MAT980 sendo uma escolha/preferência do usuário: 1 a 7
correspondendo aos dias da semana de Domingo a Sábado respectivamente; Para cada escolha de 1 a
7 exibir no LCD do MAT980 o dia da semana correspondente por extenso: “Domingo”, “Segunda”, ...,
“Sabado”. Se a escolha for diferente dos números de 1 a 7, exibir a mensagem: “Escolha Errada!”. Vide
na página seguinte o fluxograma proposto, bem como o respectivo programa na pág. subsequente.

Sugestão para o programa: Ler o input do teclado do MAT980 e mostrar as mensagem no LCD do
mesmo usando a biblioteca de subrotinas descritas em [10] e [11]:

Wait_Key_Press, situado no endereço absoluto 012Ah do MAT980.


Wait_Key_Press, espera por uma tecla ser pressionada no teclado do MAT980 e então devolve no
acumulador um byte, código ascii correspondente a tecla/letra.

Disp_Msg, situado no endereço absoluto 011Eh do MAT980.


Mostra no LCD uma mensagem em string ASCII. Disp_Msg recebe como parâmetros: HL, com o
endereço do local de memória onde começa a mensagem ;
A, com a posição a partir de onde a mensagem será colocada no display. A=0 então a mensagem será
exibida a partir da posição 0 do LCD. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Início

Ler DiaP do teclado

V
Caso DiaP = 1 Msg = “Domingo”
F

V
Caso DiaP = 2 Msg = “Segunda”
F

.
.
.
TPC7: representar o
V fluxograma acima em
Caso DiaP = 7 Msg = “Sabado”
pseudocódigo, em
F diagrama de actividades
Msg = “Escolha Errada!” UML(opcional), e em
diagrama de NS (opcional).

Mostrar Msg no LCD


Probl.4 – Fluxograma Ac
Fim
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
; Seleccao Múltipla
ORG 4200h; comece aqui o armaz.de codigo Caso7: cp '7'
Probl.4 – Programa Inicio:ld HL, InputMsg jr nz, Default; case 7:
xor A ld HL, Sabado
call Disp_Msg jr EndCase ;break
call Wait_Key_Press ;A<-tecla ;Switch A{ Default: ; Default:
Caso1: cp '1'; ld HL, Errado
jr nz,Caso2; case 1: EndCase: ; }endcase
ld HL, Domingo xor A; na posicao 0 do LCD
jr EndCase ; break call Disp_Msg
Caso2: cp '2' Fim: halt
jr nz,Caso3; case 2:
ld HL, Segunda Domingo db 'Domingo',cr
jr EndCase ; break Segunda db 'Segunda',cr
Caso3: cp '3' Terca db 'Terca',cr
jr nz,Caso4; case 3: Quarta db 'Quarta',cr
ld HL,Terca Quinta db 'Quinta',cr
jr EndCase ; break Sexta db 'Sexta',cr
Caso4: cp '4' Sabado db 'Sábado',cr
jr nz,Caso5; case 4: Errado db 'Escolha Errada!',cr
ld HL,Quarta InputMsg db 'Input dia(0..7)',cr
jr EndCase ; break
Caso5: cp '5' Wait_Key_Press equ 012Ah; no MAT980
TPC8 : jr nz,Caso6; case 5: Disp_Msg equ 011Eh; no MAT980
Adicione e ld HL,Quinta cr equ 0Dh
preencha as jr EndCase ; break
Caso6: cp '6'
colunas de jr nz,Caso7; case 6:
endereços e de ld HL, Sexta
códigos. jr EndCase ;break
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby (cont.).
Programa com estrutura repetição com teste a priori (“while cond ... end”):

Problema 5:
Dados o Dividendo e o Divisor, calcular o Quociente e Resto (Modulus) da divisão (inteira) do
Dividendo pelo Divisor. Os dados são bytes que se encontram na memória em posições arbitrárias
(proponha) e os resultados dos cálculos deverão ser guardados na memória (proponha igualmente).

Solução:
Usar o método das subtrações sucessivas onde o Dividendo será Diminuendo e o Divisor será o
Subtrativo, implementadas pela estrutura de repetição com teste de condição a priori.

Para a conversão do fluxograma para programa devera usar o seguinte mapeamento dos dados na
memória:
Dividendo: 5000h
Divisor : 5002h
Quocinte: 5004h
Resto: 5006h

Nos Cálculos: A – Dividendo/Resto; B-Divisor, C-Quciente. Ac


Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Início

Ler Dividendo e Divisor

Quociente = 0

V
V Quociente++
Realiza acções Dividendo > Divisor Dividendo = Dividendo - Divisor
Condiçao (executa instruções,
chama subrotina, ...)
F

F
Resto = Dividendo
Sair
O teste de condição de
iteracção faz se em
Guardar Resto e Quociente
antecipado e há condição
em que o conteúdo do
laço nunca é executado.
Fim

TPC9: representar o fluxograma acima em diagrama de Probl.5 – Fluxograma


actividades UML, em pseudocódigo, e em diagrama de NS. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Ender. Código Rótulos Mnem.+ Oper. Comentários.
ORG 4200h
Inicio: LD IY,5000h
LD A,(IY+0)
LD B,(IY+2)
LD C,0
OutraVez: ;while (Dividendo > Divisor)
CP B
JP C, RestoObtido
SUB B Dividendo -= Divisor
INC C Quociente++
JR OutraVez ;end while
RestoObtido:
LD (IY+4),C Guardar quociente
LD (IY+6),A Guardar Resto
Fim: HALT Fim

Dividendo EQU 5000h


Divisor EQU 5002h
Quociente EQU 5004h
Resto EQU 5006h
Probl.5 – Programa
TPC10:
(⑴) Rescreva o programa de 2 maneiras diferentes
(⑵) Preencha as colunas 1 e 2.
(⑶) Rescreva o programa supondo agora que o Dividendo e Divisor são números de 16 bit.
(⑷) Resolver o seguinte problema com ciclo de teste a priori:
Encontrar o máximo e guardá-lo em 5005h, num bloco de n bytes situados a partir
do local 5010h e posteriores; n é um byte (=0 a 255) situado no local 5000h. Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
D - Técnicas e exemplos de programação em assemby (cont.).
Programa c/estrutura de repetição c/teste a posteriori (“do ... while cond” ou “repeat ... until cond” ):
Problema 6: Encontrar o máximo e guardá-lo em 5005h, num bloco de 20 bytes situados a partir do
local 5010h e posteriores; Início

Ler InicioDeBloco

Ptr = InicioDeBloco
Maximo = (Ptr) Conteúdo do ciclo é
Cont ador = 20 executado a priori,
ao menos uma vez

Realiza acções (exucuta


V
instruções, chama Maximo < (Ptr)
Maximo = (Ptr)
subrotina, ...)
F
V
condição Incrementar Ptr
Decrementar Contador
F
V Teste do ciclo é
Contador > 0 executado a posteriori
TPC11:
representar o fluxograma ao lado em F

diagrama de actividades UML, em Guardar Máximo

pseudocódigo, e em diagrama de NS. Ac


Fim
Probl.6 – Fluxograma
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
Ender. Código Rótulos Mnem.+ Oper. Comentários.
ORG 4200h
Inicio: LD HL,InicioDoBloco ;Ptr = InicioDoBloco
LD A,(HL) ;Maximo = (Ptr)
LD B,20 ;Cont = 20
;do{
ProximoN: CP (HL)
JP NC, jaMaximo ; se maximo < (Ptr) entao:
LD A,(HL) ; trocar com novo maximo
jaMaximo: INC HL ; Dec B; volta p/ProximoN se B>0
DJNZ ProximoN ;}while (B>0)

RestoObtido: LD (Maximo),A ;Guardar Maximo


Fim: HALT ;Fim

InicioDoBloco EQU 5010h


Maximo EQU 5005h
Probl.6 – Programa
TPC12:
(⑴) Preenche colunas 1 e 2.
(⑵) Rescreva o programa de 2 maneiras diferentes
(⑶) Rescreva o programa supondo agora que o Dividendo e Divisor são números de 16
bit.
(⑷) Resolver o seguinte problema com ciclo de teste a priori:
Encontrar o máximo e guardá-lo em 5005h, num bloco de n bytes situados a partir
do local 5010h e posteriores; n é um byte (=0 a 255) situado no local 5000h.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980

E - Exercícios - parte 1

1. Responda às questões pontuais colocadas em certas diapositivas.


2. Resolva os exercícios propostos (TPCs 1 a 12) em certas diapositivas.
3. Realize o estudo individual da Programação-Parte 2, seguinte.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly
c/o Micamaster MAT980
Parte-2

Sumário:
F. Tópicos de programação avançada
i. Programas complexos: Divisão em módulos (subrotinas). Chamadas a subrotinas.
ii. Entrada e saída básica. Configuração da interface c/unidades de E/S. Modos
Atendimento de dispositivos de E/S. Interrupçoes e suas rotinas de Serviço.
Temporização por hardware e por software.
iii. Exercícios-parte2

G. Referências bibliográficas
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
I. Programas complexos
Os exemplos tratados até agora versam propblemas simples. Em casos mais complexes os seguintes
procedimentos heurísticos gerais devem ou podem ser seguidos (dedicados ao Z80/MAT980):

a) Divisão do problema em partes, i.e., em módulos (programação modular), havendo a considerar:


1. Rotina principal: haverá um módulo principal acompanhado de submódulos ou subrotinas;
2. Subrotinas: Chamada a uma subrotina. Implicações e precauções;
b) Assemblagem/compilação por computador: Torna-se mandatório o uso de software de ajuda no
desenvolvimento, havendo a considerar:
1. Escolher um software assemblador. Recomenda-se o 2500 AD Software, Macro Assembler:
X80.exe - Z80 Macro Assembler: compila ficheiros fonte (*.asm) p/ficheiros objecto (*.obj).
2. Conhecer o processo de assemblagem e linkedição. Ter em conta os formatos dos ficheiros
executáveis a produzir p/o MAT980 (formato Intel Hex ). Assim, de par com o x80.exe, usar:
Link.exe – Link-editor. Converte 1 ficheiro ou; liga 2 ou mais ficheiros e os converte para
ficheiro executável num formato binário conveniente, designadamente: formato Intel hex.
3. Transferência do ficheiro executável (no formato Intel Hex ), do PC para o MAT980, via RS232.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
i- Programas complexos(cont.). Divisão em módulos :
Já havíamos visto que no projecto lógico da solução de um problema através de um programa de
computador, quando o problema é complexo é conveniente usar a abordagem modular, que c/relização
particular para o Z80, consistirá em:
1. Dividir o problema em partes e daí, o programa em módulos que resolvem tais partes diferentes do
problema. Tais módulos serão as funções ou sub-rotinas do programa principal. Este por sua vez
chamará às subrotinas cada uma a seu tempo.
2. Para cada sub-rotina definir a interface com o programa principal, isto é a lista de parâmetros de
entrada e a lista de retorno, definindo claramente os registos da CPU e/ou os locais de memória que
contêm tais parâmetros.
3. Desenhar um diagrama de estrutura (em blocos) que mostra a relação entre o programa principal e os
seus subprogramas (sub-rotinas) indicando as variáveis (os parâmetros) de entrada e de saída (retorno).
4. Para o programa principal e para cada uma das subrotinas, desenhar um fluxograma, diagrama de NS,
diagrama de actvidade UML, etc. (vide os exemplos abordados acima), qualquer destes devendo
interpretar o algoritmo para a solução da sua parte do problema (vide o problema complexo exemplo
adiante). Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
Problema Complexo Exemplo (NB:Resolvido c/sucesso, EI-Fev.Jun2013):
Pretende-se receber (no MAT980), calcular e guardar os votos e resultados eleitorais da eleição do representatnte da
Turma na AEU do DEEL. Sabe-se que há 36 votantes e 4 candidatos, incluindo o candidato especial “VotoNulo”.
Assim, o programa deverá:
1. Para cada um dos votantes, receber do teclado o voto respectivo (1, 2, 3 ou X; onde X é qualquer voto diferente
de 1, 2, ou 3, devendo ser considerado voto nulo.
2. Fazer o escrutíneo: Calcular e guardar a frequência absoluta dos votos 1,2,3,X;
3. Colocar as frequências absolutas em ordem decrescente.
4. Mostrar o vencedor: [Vencedor: C1]; isto é vencedor é o candidato 1, etc.
5. Passados 10 segundos, mostrar os candidatos em ordem de preferência decrescente :
[+Vot: C1,C3,C2,N]
Esperar por tecla ser premida. Se tecla for:
a. Enter: reiniciar o processo a partir do passo 1;
b. Qualquer seta:voltar ao passo 4 (mostrar vencedor)
c. Qualquer outra: ingnorar (é claro que não é possivel ignorar: HALT, SSTEP, BREAK. Porquê?)
Resolução: (i) Uma vez que o problema se afigura relativamente complexo, dividí-lo em módulos, desta forma; (ii)
representá-lo em diagrama de estrutura; (iii) representar os respectivos algoritmos em fluxograma ou diagrama de
NS, etc.; (iv) Escrever o programa (incluir: endereços, códigos, rótulos, mnemónicos/operandos, comentários). Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
Problema Complexo Exemplo (NB: Resolvido c/sucesso, EI-Fev.Jun2013) (cont.):
Rotina principal (ex:
Menu)

HL-topo de bloco

B-num nome do Ca ndidato


s

HL posi
HL- pt o inicial no
ato
B-num votos

A-pos
can idato

A-
- p çao
ndidat
did

tr
H

m and

me nin
r men
(1 L- to

iça
a
IY-vect r Votos por C

ns icia
-nu r_C
00 ta

de

ag l n
00 l m

vo oto s[]
, C po

sagem LCD
)

em o L
atos
ilis

um or V oto
tos s_
eg
un

B-n vect tor V

candid
do

CD
s
IX- - vec

to
or
IX- vec
HL

Receber o Calcular Ordenar Mostrar o Mostrar Esperar


vector Frequência Candidatos Vencedor resultado milisegs
Votos[] absoluta no LCD Eleitorar
m
HL- ptr mensage
A –Ascii code al no LCD
A-posiçao ninici

Wait_KeyPress Disp_Message Esperar 1 milis.(Delay) Ac


Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
i- Programas complexos(cont.). Chamada a uma subrotina. Implicações e precauções;

Para chamar explicitamente a uma subrotina usa-se a instrução call. Entretanto há


subrotinas especiais, as rotinas de serviço de interrupção as quais são chamadas
implicitamente quando há uma interrupção de hardware ou são chamadas explicitamente
com o uso das instruções RST n (interrupções de software) . Examinaremos tais instruções no
tema sobre modos de interrupção.

Chamada incondicional a uma subrotina:

CALL address;
exemplos:
CALL 421Ah;
CALL CalcularMedia;
onde address é um endereço de 16 bits ou um rótulo cujo endereço de 16 bits será
resolvido a seu tempo pelo assemblador (software ou “manual”);
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
i- Programas complexos(cont.).Chamada a uma subrotina. Implicações e precauções;
Chamada condicional a uma subrotina:
CALL cond, address;
onde cond é uma condição testadora de flag (C, NC, P, M, Z, NZ, PE, PO); e address é
um endereço de 16 bits ou um rótulo cujo endereço de 16 bits será resolvido a seu
tempo pelo assemblador (software ou “manual”);

Exemplos:
call C, CalcMinimo; chama sub-rotina, CalcMinimo sse flag de carry = 1
call PO, ProcessaImpares; ... sse flag de paridade = “parity ODD”
call Z,CalcTotal;
call P, AcumularPositivos

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

i- Programas complexos(cont.). Chamada a uma subrotina. Implicações e precauções;


Implicações
Quando se chama a uma subrotina acontece o seguinte (veja os detalhes das instruções CALL no manual):

• O Z80 salva na pilha o actual conteudo do PC (endereço da próxima instrução); este salvamento consiste na execução implicita
de PUSH PC (instrução que não existe como tal), cuja sintaxe é: dec SP; (SP)  PCH; dec SP; (SP)  PCL

• Passa para o PC o endereço contido no operando da instrução CALL; assim,

• O controle é transferido para a subrotina especificada pela CALL;

• O código da subrotina é executado, usando, como não poderia deixar de ser, os registos da CPU bem como a memória e
eventualmente as unidades de I/O;

• Como fim da subrotina, é econtrada a instrução RET; assim, esta instrução repõe o conteúdo original do PC:

• O PC salvo na pilha é restaurado; isso consiste na execução implícita de POP PC (instrução que não existe como tal), cuja sintaxe
é: PCL  (SP); inc SP; PCH  (SP); inc SP;

• Desta forma o controle é devolvido ao programa que chamou a subrotina, continuando sua execução normal.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
i- Programas complexos(cont.). Chamada a uma subrotina. Implicações e precauções;
Preacauções
Tendo em conta a lista de implicaçoes, nomeadamente, a destruição eventual dos conteúdos dos registos da CPU
incluindo especialmente o registo das flags, bem como eventualmente algum local da memória, deve-se ter
precauções de salvaguardar os registos e/ou locais de memória que o programa chamador supõe haverem sido
modificados. Excepção vai para o uso de algum registo ou local de memória como variável de retorno da subrotina
que foi chamada.
Assim devem ser observadas as precauções seguintes:
1. Antes de chamar a uma subrotina, deverá salvaguardar (p/a pilha c/ PUSHes; ou p/ os registos alternativos, c/ EX,
EXX) os valores de registos e/ou locais que se sabe (ou se supõe, por defeito) que serão transformados (sem
reposição) pela subrotina e cujos valores se pretende recuperar mais tarde. Tais casos podem ser os das variáveis
de retorno; Note-se, contudo que é sempre melhor fazer o dito salvamento/reposição nas subrotinas em si.
2. Depois de chamar a subrotina e usar convenientemente os valores de retorno, restaurar, se for necessário, os
registos/locais salvos na pilha, na ordem inversa (p/o caso da pilha);
3. Se escrever uma subrotina, as primeiríssimas instruções devem ser para salvar o rol de registos e locais a serem
usados pela subrotina. As derradeiras instruções antes do RET devem ser dedicadas à reposição dos tais
registos/locais acima salvaguardados (em ordem inversa, se for da pilha, porquê?). Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
i- Programas complexos(cont.). Chamada a uma subrotina. Implicações e precauções;
Preacauções (cont.)
Assim, o layout da subrotina deve ser:
Inicio: ; inicio da subrotina
push AF; salva o acumulador e registo das bandeiras;
push BC; supondo que B ou C ou BC vao ser usados
push pp; onde pp é par de registos
;... aqui vai o código da subrotina ou da rotina servico de interrupção
pop pp; isto é restaurar na ordem inversa pq pilha é de acesso LIFO
pop BC;
pop AF;
Fim: ret;
Este trabalho de salvamento/restauração só exclui variáveis de retorno;
Deve-se ter o cuidado de não trocar a ordem de desempilhamento das variáveis. Em particular, o número de PUSHes
feitos dentro da subrotina deve ser igual ao número de POPs. A ordem dos PUSHes e/ou POPs deve ser inversa e
exatamente igual à ordem dos pops. A falha tem consequências imprevisíveis.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii - Entrada e saida de dados no Z80:


A entrada e saída de dados para as unidades de I/O num sistema com mapeamento
directo de unidades de I/O (isto é, I/O mapped input/output) como é o caso do Z80, é
feito usando os grupos de instruções:
para entrada (leitura): IN, INI, INIR, IND, INDR;
para saida (escrita) : OUT, OUTI, OTIR, OUTD, OTDR;

Estas instruções, foram já referidas em aula anterior, no âmbito da análise dos modos
de endereçamento por transferências em bloco.
Para dispositivos genêricos, ou seja, com todas as portas com acesso directo, a leitura
ou escrita são simplemente feitas usando a sintaxe normal das instruções acima.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
ii - Entrada e saida de dados no Z80 (cont):

I/O de mapeamento directo (I/O mapped I/O) é quando A CPU comunica directamente com
as unidades de entrada/saída através de endereços específicos e usando instruções in e out
(casos do Z80, 8080, x86). De outro modo o acesso é mapeado no espaço de endereços da
memória (casos do 6502, 68xx, 68k. Nota:As famílias dos I/O mapped I/O, suportam este
modo igualmente) usando instruções de acesso à memória (LD, etc). Vide a figura.
Dad Endr Ctrl Dad Endr Ctrl
FF
FFFF
I/O I/O
00

FFFF
Mem Mem
0000
0000
I/O mapped I/O CPU Memory mapped I/O CPU
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii - Entrada e saida de dados no Z80 (cont):


Para ler a porta ou o porto de endereço 20h, basta usar:
in A, (20h); ou
in B, (20h) ou
ld C,20h seguido de
in A,(C); ..., etc.

Para escrever na porta ou no porto de endereço 20h, basta usar:


out (20h); ou
ld C,20h seguido de
out (C), A; ... etc.

Para a leitura ou escrita a uma unidade de I/O com características especiais deve-se
atender ao modo de funcionamento particular do di s po s i t i vo qu e ve m
necessariamente documentado.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii - Entrada e saida de dados no Z80 (cont).


Configuracão de interface c/dispositivos de E/S:

Tais dispositivos precisam de uma configuração para se poder fazer acesso a determinado porto de I/O. Por
exemplo existem os seguintes casos comuns:
um porta suporta geralmente o modo input quanto o modo output. Assim é necessário enviar o modo de
funcionamento ao porto de configuração a informar que se deseja que a porta x deve ser de input ou deve se de
output. O modo pode ainda ser configurado bit a bit.

Uma porta pode ser o acesso a vários dispositivos de I/O. Nesse caso deve-se enviar ao porto de configuração a
palavra de configuração conveniente para pedir o acesso ou desabilitação de determinado dispositivo.
Exemplos: PIO, CTC, CIO, SCC, i8255, etc. Este modelo de funcionamento é o mais frequente na área de
microcontroladores e sistemas embutidos.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii - Entrada e saida de dados no Z80 (cont).

Configuracão de Interface c/dispositivos de E/S:

Para exemplos deve consultar a bibliografia recomendada, em particular os items [10] e [11]. Para complementar
tais exemplos, vejamos as rotinas seguintes:
Leitura do teclado (leitura directa com software debounce) e leitura/escrita do/ao LCD (Veja o anexo
kblcd.lst)
De notar que para o caso do CIO, as portas precisam de configuração prévia para, entre outros aspectos
estabelecer a direcção de dados (vide [10] especialmente pp 48 a 51 ). Veja nos programs citados acima, exemplo
de configuração e uso dos portos do Z80 CIO.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80: Modos de atendimento às unidades de I/O


A s unidades de I/O acopladas ao sistema em tempo real (ou não) precisam de
atendimento ao longo do tempo, para a realização das suas actividades de input e ou
de output.
Há 3 modos comuns de atendimento: Programado, por polling e por interrupções:

1. Programado: quando as acções de input ou output acontecem a intervalos


regulares ou pré-determinados, sem necesssàriamente ter de consultar uma
entrada para ver se há dados disponíveis. A CPU deve usar rotinas de contagem de
tempo e o/ou o relógio do sistema para saber desencader as rotinas de serviço nas
alturas programadas;
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80: Modos de atendimento às unidades de I/O (cont.)

2. Por polling: quando as acções de input (frequentemente) ou output acontecem


em momentos não prédeterminados (de ocorrência assíncrona). No polling a CPU
tem que “viver” consultando a porta de I/O para verificar se ela está ou não
precisando de atendimento. Por isso trata-se de um modelo de atendimento
pouco eficiente no uso das capacidades da CPU e, dependendo dos casos, pouco
eficaz;
3. Por interrupções: para libertar a CPU da acção de polling que desperdiça tempo, o
dispositivo de I/O deve expressamente solicitar o atendimento justamente
quando precisar, içando ou baixando (ex: Z80) o nível de um pino da CPU
reservado para o efeito (INT e NMI para o caso do Z80). Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80: Modos de atendimento às unidades de I/O (cont.)


As interrupções são desta forma assícronas e ocorrem só quando o dispositivo de I/O
precisar, libertando a CPU para o exercício de outras actividades.

De notar que o modo programado de atendimento embora um modo síncrono, pode


também ser realizado através de interrupções, não feitas pelo dispositivo que precisa de
atendimento, mas através de um dispositivo auxiliar, contador/temporizador (tais como o
Z80 CTC ou o Z80 CIO) ou contadores “cão de guarda” ( watchdog timer ) comuns em
muitos microcontroladores, para libertar a CPU da acção de contagem do tempo.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80: Interrupções no Z80:

• Quando o Z80 aceita um pedido de interrupção pára temporariamente


o que está a fazer para o atender;
• NMI: Permite o pedido de interrupções não mascaráveis (não inibíveis)
da mais alta prioridade;

• INT: Os pedidos de interrupção neste pino serão atendidos se o


programador o permitir (com o uso da instrução EI) ou não serão (se
for usada DI).

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980
ii-E/S no Z80: Interrupções: Atendimento
O atendimento a uma interrupção é semelhante em C . instru o Execu o do programa
principal
Operando
vários aspectos à chamada a uma subrotina. C . instru o
Ao ser aceite um pedido
Operando
A principal diferença é que o programa corrente não de interrup o
suspende-se a execu o
do programa principal,
efectua uma chamada através de uma instrução CALL (continua o
que é temporariamente
do
substituído pela rotina
a qual salvaria o PC na pilha; PC que seria Ao concluir-se o
programa)
de atendimento da
atendimento da interrup o
restaurarado c/a instrução RET. interrup o retoma-se C . instru o
a execu o do Operando
O que acontece é que, de acordo com o modo de programa principal

interrupção, o Z80 salta p/um endereço pré-


Rotina de atendimento
determinado ou busca a instrução/endereço a da interrup o (termina
reti com a instru o de retorno)
executar no barramento de dados (colocado pelo
dispositivo requerente). Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80: Interrupções: Atendimento


De qualquer modo, antes deste novo SP e pilha (stack) quando é atendida uma interrupção
(Mostra-se aqui apenas o que ocorre no início da rotina;
endereço de execução ser transferido ao PC, no fim dela, ocorrerá o processo inverso ao ilustrado!)
este é salvo na pilha de modo idêntico ao da
chamada a uma subrotina. No fim da
(SP)
execução desta, marcada pela instrução
RETI ou RETN, o PC é restaurado, e dessa Indefinido PCH
Indefinido PCL (SP)
forma o programa que corria por altura da Endereços
interrupção, seguirá o seu curso normal. Indefinido decrescentes Indefinido

As implicações e precauções referidas


quanto às subrotinas, nomeadamente, o
salvamento e restauração dos registos e (Antes) (Depois)
locais de interesse, devem ser observadas
de igual maneira.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80:Pedidos de interrupção no pino NMI (vide diapositiva 3)

• O pedido de interrupção no pino NMI (activo em baixo nível) força a execução da rotina de atendimento,
transferindo o controle para o endereço 0066h; entretanto, antes da transferência de controle para o endereço
0066h, o controle do Z80 salvaguarda o actual conteúdo do PC na pilha e do flipfop IFF1 no IFF2 e limpa IFF1,
que serão restaurados no fim com a instrução RETN. Vide ciclo de atendimento do NMI [1].

• Antes de qualquer acção, a rotina de serviço de interrupção deve salvaguardar (usando instruções EXX, EX ou
PUSH) todos os registos que vai usar incluindo as flags (em AF);

• Esta rotina deverá terminar com a instrução RETN, que restaura o PC e o IFF1 para o valores que tinham
quando o pedido foi aceite. Entretanto, logo antes do RETN a rotina deve restaurar os registos que tiver salvo
(POPs na ordem inversa);

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Tópicos de Programação Avançada em Assembly c/o Micamaster980

ii-E/S no Z80:Pedidos de interrupção no pino INT (vide diapositiva 3)

• O pedido em INT é activo ao nível baixo; pode ser atendido nos modos 0, 1 ou 2 (ou ignorado se
DI tiver sido executado => IFF1 nulo) e o retorno deve ser feito com RETI.
• No modo 0, o dispositivo requerente deverá largar no barramento de dados uma instrução
qualquer, tipicamente um restart (RST n), ie, um salto para a posição da rotina de serviço na p/a
página zero. Instruções multibyte são também permitidas. Vide ciclo de atendimento INT [1].
• No modo 1 tem lugar um salto para a rotina de atendimento com início em 0038h.
• No modo 2 o endereço será dado pelo registo I (MSByte) e pelo barramento de dados (LSByte)
(o dispositivo requerente tem o ónus de colocar tal byte).

• Tal como no caso do NMI o controle do sistema salva o PC na pilha. Entretanto, as precauções de
salvamento de registos e locais vistas acima (diapo.33 e 34), devem ser seguidas escrupulosamente.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
Z80 - Programação Básica em Assembly c/o Micamaster980
iii - Exercícios - parte 2
1. Que implicações tem uma chamada a uma sub-rotina com CALL?
2. Que precauções devem ser tomadas ao fazer uma chamada a uma sub-rotina?
3. Que diferença tem a execução de uma subrotina via CALL, com a execução de uma subrotina
de serviço a uma interrupção?
4. Qual é a diferença entre interrupções via pino NMI e via pino INT?
5. Interpreta, e testa no MAT980 o problema exemplo contido em kblcd.lst.
6. Resolva o problema descrito nas diapositivas 28 e 29: (i) desenhando os fluxogramas, (ii)
passando p/programa em Assembly, e (iii) testando o código no MAT980. Nota: Recomanda-
se que o faça em colaboração c/ outros colegas, repartindo para cada um (ou p/cada grupo)
uma parte do problema, finalizando obviamente com uma agregação da solução e seus: teste,
eventuais correcções e verificação final.
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica
G - Bibliografia/Fontes
1. Zilog, Z80 Family CPU User Manual (www.zilog.com/docs/z80/um0080.pdf)
2. ED2020.AT4 - Z80 Instruction Set Summary version 2000c--z80.txt.pdf
(http://guide.ticalc.org/download/z80.txt )
3. Leventhal and Saville. Z80 Assembly Language Subroutines 1983
4. L.Leventhal, Z80 Assembly Language Programming (Chap.3). Osborne/McGrawHill
5. Rodney Zaks, Programming the Z-80 3rd Edition, SIBEX, ISBN: 0-89588-094-6
6. http://www.msxarchive.nl/pub/msx/mirrors/msx2.com/zaks/z80prg02.htm
7. http://www.z80.info
8. http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html (Endianness)
9. 2500AD Macro Assembler Language Manual (*)
10. Feedback, “MAT980 Microprocessor Applications Trainer” (*)
11. Feedback, “Introduction to Microprocessors, Micamaster 980 & 960” (*)

Nota: (*) Encontre-os no Laboratório de E.Digital do DEEL ou noutras fontes.

Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica