Curso de Assembly
Introdução


  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:   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:   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:
  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]:
  Objetivos desse curso

  São os principais objetivos desse curso:   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:   Uma vez sabendo programar o Assembly Z80, fica muito mais fácil de se aprofundar nesses assuntos.


  Dúvidas
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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
  1. O conceito de lógica digital é fundamental para a compreensão do Assembly.
  2. A melhor maneira de se aprender o Assembly é entender os conceitos apresentados, digitar os programas apresentados, observar seu funcionamento e testar mudanças.
  3. 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.


<< Anterior Assembly Próxima >>


/MARMSX/CURSOS/Assembly