Curso de Assembly
Introdução
Você está em: MarMSX >> Cursos >> Assembly Z80
O usuário de MSX comum está normalmente familiarizado com a linguagem Basic. É através dessa linguagem que ele interage com o computador, e foi através dela que criou seus primeiros programas. Entretanto, o MSX não é capaz de entender a linguagem Basic diretamente. A linguagem que o processador consegue realmente entender e resolver os problemas endereçados a ele é o Assembly, também chamada de linguagem de máquina.
O Basic é uma linguagem muito próxima à linguagem natural do Homem. Uma linguagem de alto nível, como o Basic, normalmente possui as seguintes características:
- Linguagem próxima à humana.
- Nível de abstração alto (transparência para o usuário).
- Gerencia a memória, como, por exemplo, a localização do programa e memória livre.
- Gerencia criação, armazenamento e acesso de variáveis, vetores e tipos.
- Abstração da arquitetura da máquina, como o acesso à E/S e impressão na tela.
Para o MSX entender um programa em Basic, é necessário que o Basic seja "interpretado" para a linguagem de máquina. Uma linguagem de baixo nível, como a linguagem de máquina, normalmente possui as seguintes características:
- Linguagem de códigos.
- Nível de abstração baixo.
- A gerência de memória é feita pelo usuário.
- A criação, armazenamento e acesso de variáveis, vetores e tipos é feita pelo usuário.
- Necessidade de conhecimentos acerca da arquitetura da máquina para eventuais acessos a esses recursos.
Se o Basic apresenta tantas vantagens sobre o Assembly, principalmente no aspecto de transparência e facilidade de uso, para que então programar em Assembly?
A programação em Assembly possui uma série de vantagens em relação às linguagens de alto nível, como:
- Desempenho melhor na execução de programas, pois as linguagens como o Basic são interpretadas linha a linha e esse processo gasta um precioso tempo, efeito notado principalmente em programas com laços de repetição. A melhora de desempenho é notável, principalmente em arquiteturas com processamento mais lento, como no caso do MSX.
- Otimização de código, uma vez que linguagens de alto nível geram um código de máquina genérico, resultando muitas vezes em repetição de código (desperdício). Em arquiteturas com limitação de memória, como no caso do MSX, é um ganho e tanto.
- Acesso ilimitado aos recursos disponíveis da máquina, uma vez que determinados recursos podem não ter sido projetados para uma dada linguagem de auto nível, como por exemplo, o acesso a um novo hardware.
O Processador
Cada processador possui sua linguagem de máquina específica. No caso do MSX, o processador é o Z80-A da Zilog, e a sua linguagem de máquina é chamada de Assembly Z80. No caso dos PCs, os processadores atuais são baseados no processador 8086/88 da Intel e a linguagem de máquina é o Assembly 8086/88. O processador é o responsável por todos os processamentos de dados e cálculos, exceto nos computadores com co-processadores matemáticos.
A linguagem de máquina é baseada nos dois estados possíveis em eletrônica: ligado (1) e desligado (0). O estado de ligado/desligado é a menor informação possível em informática. A essa unidade chamamos de bit.
Assim, os dados são formados com base em 2 algarismos distintos. Ao sistema numérico com base igual a dois chamamos de números binários.
Os dados armazenados na memória dos computadores comuns são baseados em conjuntos de 8 bits de informação, no qual forma uma nova unidade: o byte.
Para facilitar a compreensão do código em Assembly, os números binários são convertidos para hexadecimal, sem qualquer prejuízo em sua informação.
"0" - Desligado
"1" - Ligado
10100111 - Número binário de 8 bits
A7 - Representação desse número em hexadecimal
A comunicação entre o usuário e o processador é feita através de uma seqüência de instruções enviadas ao processador pelo usuário. Cada instrução é formada por um ou mais bytes (conjunto de 8 bits).
O número de bits processado por vez depende da arquitetura do processador. O Z80, é capaz de processar 8 bits por vez. Já o 8086/88 processa 16 bits por vez. Atualmente, os processadores do PC são capazes de processar 64 bits por vez. O barramento da CPU que recebe as instruções, bem como recebe/envia dados é chamado de barramento de dados.
A capacidade de endereçamento de memória independe da capacidade de processamento por bits, pois é feito através de outro barramento, chamado de barramento de endereços. No caso do Z80, ele é capaz de endereçar 16 bits de memória. Assim, a capacidade máxima de endereçamento no MSX é de 216 = 65536 posições.
┌─────────────┐
│ │←────→ Barramento de dados
│ Processador │
│ │←────→ Barramento de endereços
└─────────────┘
Conforme visto, cada fabricante estabelece quais são os códigos utilizados para as instruções do seu processador. Dessa forma, o Z80 (MSX) tem os seus códigos, assim como o 8088 (PC) tem seus próprios códigos.
A funcionalidade das instruções é bastante semelhante. Por exemplo, a instrução do Z80 LD A,D (MSX) e a instrução do 8086/88 MOV AL,DL (PC) realizam tarefas semelhantes: passar o valor de um registrador para o outro. Entretanto, no MSX o código em hexadecimal dessa operação é "7A". Já no PC, é "88 D0".
COMPUTADOR | INSTRUÇÃO | CÓDIGO ASSEMBLY | Descrição
-----------+-----------+-----------------+-----------------------------
MSX | LD A,D | 7A | Copia o conteúdo de D em A
PC | MOV AL,DL | 88 D0 | Copia o conteúdo de DL em AL
Assim, observamos que para instruções semelhantes, cada processador possui códigos em Assembly completamente distintos.
Se enviarmos o código "88" do PC para o MSX, ele irá entender como a instrução ADC A,B, que nada tem a ver com a instrução que desejamos LD A,D! Podemos ver aí a incompatibilidade entre os processadores.
Esquemas do MSX
O esquema a seguir, apresenta a estrutura básica de um MSX [1]:
Processamento
┌─────────┐
│ ROM │
Entrada │ ↑ │ Saída
de → | CPU │ → de
Dados │ ↑↓ │ Dados
│ RAM │
└─────────┘
A entrada de dados é feita através do teclado, mouse, joysticks, modem, cassete ou disk-drive. A saída é feita para tela, impressora, cassete ou disk-drive.
O processador Z80 é apenas uma "super calculadora". Dessa forma, não é ele o responsável por desenhar de pontos na tela, emitir de sons, processar dados do teclado etc. Para tais tarefas, existem
circuitos integrados específicos, tais como o VDP (vídeo), o PSG (som) e a PPI (teclado).
Assim, para escrever na tela ou emitir um som, é necessário que haja uma certa comunicação de dados entre o processador e o CI específico. Felizmente, as sub-rotinas da ROM (BIOS) realizam essa tarefa para nós, facilitando (e muito!) o trabalho. Entretanto, o Livro Vermelho do MSX ensina como se comunicar com tais dispositivos, caso haja a necessidade de criar rotinas específicas que não estejam na ROM do MSX.
Vejamos a seguir, o esquema simplificado dos circuitos integrados de um MSX:
Como funciona este esquema de comunicação entre os CIs?
O processador recebe informações (instruções) do usuário e envia/recebe dados através de portas específicas, especificadas perlas instruções OUT (envio) e IN (recebimento).
ROM (BIOS)
Quando ligamos o micro, ele realiza uma série de operações antes de transferir o controle ao usuário. Esses procedimentos são determinados pelo fabricante, através de programas que são gravados na ROM [1].
A ROM é onde reside o sistema operacional do MSX, escrito em linguagem de máquina, no qual possui sub-rotinas prontas para o acesso a periféricos e outros recursos da máquina. Dessa forma, as sub-rotinas da ROM melhoram o nível de abstração de acesso a determinados recursos da máquina para usuário final.
As sub-rotinas da BIOS se localizam na primeira página da ROM do MSX, ou seja de &H0000 a &HBFFF.
A este tipo de ROM, responsável não só pela inicialização, como manter um sistema operacional básico para controlar o sistema, chamamos de BIOS (Basic Input/Output System).
Existem 3 tipos de informações básicas gravadas na BIOS do MSX [1]:
- O sistema de entrada e saída de informações da CPU.
- As tabelas de caracteres, das palavras reservadas e seus tokens, das mensagens de erro e de identificação do fabricante.
- O interpretador Basic.
Objetivos desse curso
São os principais objetivos desse curso:
- Ensinar a programação básica do processador Z80 (genérico para qualquer sistema).
- Ensinar o uso de algumas ferramentas para Z80.
- Ensinar como interagir com as sub-rotinas da ROM (BIOS) do MSX.
Não é objetivo desse curso a programação em cima dos CIs apresentados, bem como apresentar detalhes do hardware do MSX, tal com slots e subslots.
Para se aprofundar mais nesses assuntos, recomenda-se a leitura dos seguintes livros:
- O Livro Vermelho do MSX (The MSX Red Book).
- MSX Top Secret, do Edison Moraes.
- Aprofundando-se no MSX, do Piazzi.
Uma vez sabendo programar o Assembly Z80, fica muito mais fácil de se aprofundar nesses assuntos.
Dúvidas
- Os livros e documentos recomendados são sobre o Z80, mas o meu MSX tem o processador Z80A. E agora?
Sem problemas. A diferença entre o Z80 e o Z80A é a velocidade de processamento.
- Eu tenho um MSX 2 ou MSX 2+. Existem instruções Z80 novas?
As instruções do Z80 independem dos sistemas: MSX, TK-90, Master System, Mega Drive. Assim, se você aprender a programar o Z80, irá aprender a usar
o processador de todos os sistemas que usam o Z80!!
Você, inclusive, poderá usar um assemblador de MSX para programar um Mega Drive, porém terá que conhecer as sub-rotinas da ROM do Mega.
- Afinal, o que muda entre o MSX, MSX 2, Mega Drive, etc?
O processador é o mesmo. Porém, cada sistema tem seu próprio esquema, contendo o seus processadores de vídeo, de som, etc. Portanto, o Mega Drive não entenderá os comandos de geração de som, gráficos, etc do MSX e vice-versa. Além disso, as sub-rotinas da ROM de cada sistema são diferentes.
- O processador do MSX é o Z80-A da Zilog, de 3,58 MHz. O que significa esta velocidade?
Significa que ele realiza 3,58 milhões de ciclos de máquina por segundo e que cada ciclo de máquina gasta 1/f = 1/3,58M = 0,00000028 segundos. Um ciclo de máquina não quer dizer necessariamente o processamento de uma instrução, pois a mesma ainda é interpretada pelo microprograma (ver próximo capítulo). É o número de instruções do microprograma quem determina o número de ciclos de clock de cada instrução.
- Mas o que vem a ser ciclo de máquina?
É um ciclo no nível de microprogramação. Uma instrução em LM leva n ciclos.
Por exemplo, a instrução ADD A,B leva 4 ciclos, ou seja, 0,00000112 segundos para ser executada.
Observações
- O conceito de lógica digital é fundamental para a compreensão do Assembly.
- A melhor maneira de se aprender o Assembly é entender os conceitos apresentados, digitar os programas apresentados, observar seu funcionamento e testar mudanças.
- Recomenda-se testar os programas em Assembly em um emulador de MSX.
Na próxima seção, veremos os níveis de linguagem.
Links
IMPORTANTE: o material a seguir servirá de apoio ao curso.
Disquete virtual "curso.dsk" com Assemblador RSC II
Resumo das instruções do Z80 *
Manual completo das instruções do Z80
MSX Top Secret
* Esse documento será referenciado nas outras seções como Z80.txt. Entretanto, recomenda-se o uso do manual completo das instruções do Z80, uma vez que este documento é bem mais detalhado.
Referências:
[1] Aprofundando-se no MSX, Pierluigi Piazzi e outros, Ed. Aleph, 1987.