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
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
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
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
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]:
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).
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
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
Ler InicioDeBloco
Ptr = InicioDeBloco
Maximo = (Ptr) Conteúdo do ciclo é
Cont ador = 20 executado a priori,
ao menos uma vez
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
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):
HL-topo de bloco
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
candid
do
CD
s
IX- - vec
to
or
IX- vec
HL
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
• 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
• 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
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
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
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
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
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
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
• 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
• 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” (*)
Ac
Z80 - Programação Básica e Tópicos de Programação Avançada v2 Electrónica Digital II /2020 – Enga. Electrónica