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 enteder 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:   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 compuadores 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.

  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 procesamento 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.

  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 outros 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". Isto significa dizer, que se enviarmos a instrução de código 88 ao MSX, ele irá enterder 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.


  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 circutos 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 realizam essa tarefa para nós, facilitando o trabalho. Entretanto, o Livro Vermelho do MSX ensina como se comunicar com tais dispositivos, sem a necessidade das sub-rotinas da ROM.

  Vejamos a seguir, o esquema simplificado dos circuitos integrados de um MSX:



  Mas como funciona este esquema de comunicação entre os CIs?
  O processador recebe informações (instruções) do usuário, envia e 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. Essas rotinas se localizam na primeira página da ROM, 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?
    Sabemos que o período é o inverso da freqüencia. Assim, podemos concluir que ele realiza 3,58 milhões de ciclos de máquina por segundo e que cada ciclo de máquina gasta 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 L.M. 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.

  curso.dsk+Assemblador RSC II
  Simulador Z80, para PC
  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 datalhado.

  Referência

  [1] Aprofundando-se no MSX, Pierluigi Piazzi e outros, Ed. Aleph, 1987.


CURSOS/ASSEMBLY/AULA1