Microcomputador Z80 by Arne



Nesse artigo eu quero mostrar meu último projeto de final de semana (Setembro/2021) Nossa... lembrei daquela música dos Titãs que diz "A melhor banda de todos os tempos da última semana...". Bom, seja como for trata-se de um microcomputador Z80, similar aos que existiram durante a década de 1980 e 1990 como:

  • Nestor publicado na Revista Nova Eletrônica (com a parte I na edição de Fevereiro de 1984);
  • OSK-1500 – da Occidental Schools;
  • CEDM-80 MicroProfessor – Curso de Eletrônica Digital e Microprocessadores.

Estes pequenos microcomputadores também foram utilizados, na época, em muitos cursos como Técnico em Eletrônica, Processamento de Dados, Engenharia Eletrônica/Computação e outros como base no treinamento com a CPU Z80.

O "núcleo" do meu pequeno microcomputador Z80 é uma placa que eu montei no início da década de 1990 e usei para consolidar o meu aprendizado a respeito do microprocessador Z80.


Eu posso inclusive afirmar que essa placa foi minha porta de entrada para o mundo dos microprocessadores e também microcontroladores. Em breve pretendo mostrar uma outra placa, montada também no início da década de 1990 com o microcontrolador 8031, mas isso é uma outra história.

Eu vou detalhar agora os itens presentes no meu pequeno microcomputador:

  • Microprocessador Z80 operando com clock de 3.575611MHz;
  • EEPROM AT28C64 com 8 kbytes;
  • RAM 6116 com 2kbytes (expansível até 8k)
  • 24 pinos de I/O com PPI8255;
  • Comunicação serial RS-232 com CI 8250;
  • Teclado matricial de 30 teclas;
  • 6 Displays de 7 segmentos para endereços e dados;
  • Funções pré-programadas para facilitar o uso dos recursos presentes.


Como funciona

Internamente na ROM existe um programa monitor que eu desenvolvi utilizando Linguagem Assembly Z80. O objetivo desse pequeno programa é permitir a inserção de um outro programa (que eu chamo programa do usuário) na RAM, para que este possa ser posteriormente executado pela CPU Z80.

Temos na placa um display dividido em duas partes: uma para endereços com 4 displays de 7 segmentos e outra para dados com 2 displays também de 7 segmentos. Iniciamos o processo de inserção apontando para o endereço desejado que necessariamente deve ser 8000H (esse é o endereço inicial da RAM no meu projeto). Claro que é possível utilizar outro qualquer a partir de 8000H, mas é preciso colocar em 8000H um comando “jump” para o novo endereço inicial escolhido. Em seguida, coloca-se o “dado” que nada mais é que o código objeto de um mnemônico ou um dado a ser tratado pela CPU.

Obs.: Não é necessário realizar uma compilação para se obter o código objeto do programa, já que muitos manuais do microprocessador Z80 trazem uma listagem com cada um dos mnemônicos com seus respectivos códigos objeto. Era assim que fazíamos antigamente (mas eu sinceramente não recomendo mais esse tipo de uso, a não ser que você queira tentar criar um programa como fazíamos naquela época - bem raiz mesmo!)

Por exemplo:

Digamos que você queira entrar com: LD A,00H ;carrega A com zero!

Mnemônico → LD A,00H → carregue A com 00H

Código objeto de LD A,nn → 3E (presente nos manuais,livros, etc)

00H será o dado.

Então em 8000H teremos 3EH e em 8001H teremos 00H e assim sucessivamente.


Chamadas permitidas no programa monitor

Para facilitar o uso desse pequeno microcomputador eu deixei algumas subrotinas prontas no programa monitor e que permitem o uso dos periféricos conectados a CPU como:

  • PPI8255 (pinos de I/O) – PORTA e PORTC configurados como entrada e PORTB como saída:
    • Ler o estado dos pinos do PORTA ou C;
    • Alterar o estado dos pinos do PORTB;
  • 8279 – controle de teclado e displays:
    • escrever o conteúdo de A (0 a F) em qualquer display ou ainda o conteúdo de A (0 a FFH) nos displays 5 e 6;
    • escrever “zeros” em todos os displays (limpeza);
    • verificar se uma tecla foi pressionada e realizar a sua captura;
  • 8250 – USART 
    • enviar um byte via RS232;
    • receber um byte via RS232.
  • Funções de espera ocupada para:
    • 50us;

    • 1ms;
    • 5ms;
    • 10ms;
    • 25ms;
    • 50ms;
    • 500ms;

Isso facilita muito, já que o programa do usuário não precisa configurar novamente todos os periféricos para uso e/ou ter funções para temporizações.

Como exemplo de operação, vamos simular a entrada de um programa que permita contar de 0 a 255 (00H a FFH) e apresente o resultado do contador no display e também nos LEDs conectados ao PORTB do 8255. Para que a visualização fique confortável, vamos atrasar cada nova apresentação do contador em 500ms.


Endereço Mnemônico (Assembly Z80) Código objeto
8000           CALL WRZERODISP CD 8406
8003           LD A,00H 3E 00
8005 LOOP: CALL WRB8255A CD A401
8008           CALL WRAINDISP5_6 CD 8F05
800B           CALL _500MS CD 4307
800E           INC A 3C
800F           JP LOOP C3 0580
8012           HALT 76


Para entrar com o programa, basta apontar para o endereço inicial 8000H e digitar o byte “CD”, em seguida incrementamos o endereço em “1” e digitamos o byte “84”, incrementamos mais uma vez o endereço e digitamos “06” e assim sucessivamente até chegarmos ao endereço 8012H com o byte “76”.

Com o programa na memória, basta executar o mesmo (tecla "GO" no canto superior esquerdo). E isso pode ser visto no vídeo que preparei e inseri no Youtube. Veja abaixo!


Em breve pretendo trazer mais informações a respeito desse projeto.


Sorte e sucesso a todos!!!



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.