quarta-feira, janeiro 11, 2017

O Microprocessador Intel 8080

Tenho um brinquedo novo para montar: um RC2014, que é um kit básico de microcomputador feito com o Z80. Pretendo fazer (sem pressa) uma série de posts sobre ele. Para começar, vou voltar ao meus tempos de faculdade e falar no Intel 8080, que é o precursor do Z80.

Foto de Konstantin Lanzet


Os Primeiros Microprocessadores

O que é um microprocessador e qual a diferença de um microcontrolador? Bem, às vezes a diferença fica meio nebulosa, mas basicamente um microprocessador costuma ter apenas o processador e um microcontrolador costuma ter também memória e interfaces de entrada e saída. Quando o 8080 foi projetado, a quantidade de transistores que se consegui colocar em um integrado era bastante limitada (o 8080 utiliza cerca de 4500 transistores) e muita funcionalidade era "empurrada" para fora do chip e implementada por CIs especializados de suporte ou por portas lógicas básicas.

Você provavelmente já ouviu falar que a Intel projetou o primeiro microprocessador comercializado, o 4004, para tentar (sem sucesso) ganhar uma concorrência para fornecimento de CI para calculadoras. O Intel 4004 era um microprocessador de 4 bits, o que obviamente era limitado para algumas aplicações. Um ano depois a Intel lançou o 8008 de 8 bits. Mais dois anos e foi lançado o 8080, uma expansão da arquitetura do 8008.

O 8080 foi o primeiro microprocessador largamente usado e se tornou bastante popular na primeira geração de microcomputadores, em parte graças ao sistema operacional CP/M-80. Quando a Intel partiu para um microprocessador de 16 bis (o 8086) uma certa compatibilidade de arquitetura com o 8080 foi um requisito, e os chips x86 atuais ainda trazem algumas marcas disto.

O Hardware de um Microcomputador com o 8080

Como dito, nesta época as coisas ainda eram meio toscas. Começando pela alimentação: o 8080 requer +5, +12 e -5 Volts!

O clock era outro problema. Não tanto a limitação a 2MHz (razoável para a época), mas a necessidade de dois sinais defasados e uma tensão da ordem de 10V. A solução? O CI 8224 da Intel. Alimentado por +5 e +12V, gera os sinais de clock a partir de um cristal.

Para ficar em 40 pinos, alguns sinais de controle foram multiplexados com a via de dados (isto é, o mesmos pinos usados para receber e enviar dados para memória e dispositivos de entrada e saída são usados para fornecer alguns sinais de controle). Além disso, o esquema de interrupções requer que o dispositivo coloque uma instrução na via de dados. O 8228 simplifica tudo isto, funcionando como um controlador da via de dados e gerando sinais de controle decodificados.

A Arquitetura do 8080

Às vezes se cria polêmica quando se fala que um processador é de "x bits". Não no caso do 8080: a unidade lógica aritmética (ALU), os registradores e as vias de dados interna e externa são de 8 bits. Se bem que algumas instruções permitem manipular pares de registradores como um registrador de 16 bits (útil para endereçar a memória, já que o 8080 tem 16 linhas de endereço permitindo até 64Kbytes de memória).

Fonte: Wikimedia Commons
Vejamos alguns pontos interessantes nesta arquitetura (falando somente dos itens acessíveis diretamente pelo programador):
  • O acumulador é sempre um dos operandos da ALU
  • Existem seis registradores de 8 bits: B, C, D, E, H e L. Como dito, algumas instruções trabalham com eles em pares BC, DE e HL
  • O par HL é tipicamente usado para endereçar a memória (H = high e L = low)
  • O program counter (PC) é o ponteiro para a próxima instrução a executar
  • O stack pointer (SP) aponta para o último byte salvo na pilha
    • A pilha pode ficar em qualquer endereço da memória e não tem tamanho fixo
    • Empilhar (PUSH) decrementa o SP e desempilhar (POP) incrementa o SP. Ou seja, a pilha cresce do endereço mais alto para o endereço mais baixo.
Após um reset, o 8080 começa a executar pelo endereço 0.

Lembrança do tempo de faculdade

O 8080 possui um conjunto de instruções bem organizado (o que certamente facilitou o seu circuito). Uma instrução pode ter de 1 a 3 bytes e a sua execução pode levar de 4 a 16 ciclos (o 8080 não possui nenhum paralelismo interno, as etapas de fetch e execução precisam ser executadas sequencialmente). O programador assembler logo aprendia uns truques (como usar XRA A ao invés de MVI A,0 para zerar o acumulador).

Muitas horas gastas em cima desta referência rápida da Siemens
Várias instruções codificam os seus operandos em 3 bits, permitindo escolher o acumulador, um dos seis registradores ou o byte apontado pelo par HL (M).

A linguagem da máquina!
Os flags são atualizados somente por algumas instruções. Por um lado isto é bom, dá para executar certas coisas sem afetar os flags. Por outro lado, às vezes é necessário executar uma instrução apenas para posicionar os flags (tipicamente um ORA A ou ANA A para testar se o valor no acumulador é zero).

5 comentários:

NoviSlot disse...

Muito interessante o KIT. Até que enfim algo não direcionado a "joguinho".

DVM - Delphi Virtual Machine disse...

Pensei que ao clicar na capa do livro, seria aberto uma página com o .PDF dele...
Estou colaborando com alguns sites e digitalizando alguns livros antigos.
Veja: https://www.datassette.org/livros/biblioteca-basica-informatica-br
O 4 e o 22 fui eu que fiz, estou com o 6 pronto para "Uppar" e mais uns 6 (dos pares) escaneados e indo para "remasterização".
Precisamos salvar e disponibilizar essas raridades que não se encontram em nenhum lugar mais.
Sou contra a pirataria de livros (vc. como autor sabe porque). Mas sou mais contra ainda a "queima de Alexandria".

Daniel Quadros disse...

Uma busca rápida pelo título com o google traz vários resultados. Por exemplo, esta versão personalizada para a Radio Shack: https://archive.org/details/8080-8085_Assembly_Language_Programming_1977_Intel

Marcelo Campos disse...

Muito bom DQ, este kit RC2014 estou "paquerando" desde que o Juca me mostrou há uns meses, só o preço dele não está pro meu bolso por hora.
E aproveitando estamos montando uma plaquinha Z80, você pode indicar um (uns?) compilador C pra ele ?

até,

Daniel Quadros disse...

Marcelo, eu ainda não comecei a mexer com o software (e vou começar com Assembly). Mas no grupo do RC2014 eles falam no Z88DK (https://sourceforge.net/projects/z88dk/). Além do compilador próprio, o Z88DK suporta o SDCC. A wiki do projeto tem alguns comparativos. A página http://www.z80.info/z80sdt.htm parece um pouco antiga, mas lista mais algumas opções.