sexta-feira, outubro 20, 2017

COSMAC Elf (1802): Funcionando na Protoboard

Hora de se divertir como se fosse 1976...


Operação Básica do COSMAC Elf

O funcionamento do Elf depende da posição das chaves LOAD e RUN, que estão (entre outras coisas) conectadas aos pinos /WAIT e /CLEAR do microprocessador 1802.

Com as duas chaves abaixadas (/WAIT em nível alto e /CLEAR em nível baixo), o processador é ressetado, zerando os registradores R0, I, N, X e P.

Se levantarmos a chave RUN (mantendo LOAD abaixada), os dois sinais estarão em nível alto e o processador sairá executando as instruções ma memória, a partir da posição apontada por R0 (P = 0 seleciona o R0 como contador de programa).

É claro que antes de começar a execução nós queremos colocar um programa na memória e aí entra o "Load Mode". Partindo das duas chaves abaixadas (para garantir R0=0), levantamos a chave LOAD. Neste modo o processador está parado, porém aceitando requisições de DMA. Ao pressionar o botão IN o conteúdo das chaves de dados é colocado na via de dados e o sinal DMA IN é pulsado. O processador comanda uma escrita na memória, no endereço indicado por R0. Em seguida ele comanda um ciclo de leitura na memória (no mesmo endereço). O nosso circuito apresenta nos LEDs o valor lido. Por último, o registrador R0 é incrementado. Desta forma podemos carregar um programa na memória: basta ir colocando os bytes nas chaves e pressionando IN, tomando o cuidado de manter a chave MP (Memory Protect) abaixada.

Para revisar o programa, colocamos para cima a chave MP. Nesta posição o sinal de escrita do processador não chega até a memória. Aí colocamos as chaves LOAD e RUN para baixo (reset) e levantamos a chave LOAD. Cada vez que pressionarmos o botão IN o processador tenta gravar o valor das chaves de dados, mas não consegue. Os LEDs apresentarão o valor que já estava na memória.

O que acontece se levantarmos as duas chaves? A execução do programa é suspensa.

Hora de Piscar o LED

Pois é, em 1976 já existia o costume de piscar LED. O programa abaixo vem do artigo da Popular Electronics de Setembro de 1976.
0000 ;               0001 
0000 ;               0002         ORG #0
0000 ;               0003     
0000 ;               0004 INICIO:
0000 7A;             0005         REQ             .. apaga o LED
0001 ;               0006 LACO1:
0001 F810;           0007         LDI #10
0003 B1;             0008         PHI R1          .. contador = 10xx
0004 ;               0009 LACO2:
0004 21;             0010         DEC R1          .. decrementa contador
0005 91;             0011         GHI R1
0006 3A04;           0012         BNZ LACO2       .. repete até contador = 00xx
0008 3100;           0013         BQ  INICIO      .. volta ao começo se LED aceso
000A 7B;             0014         SEQ             .. acende o LED
000B 3001;           0015         BR  LACO1       .. reinicia contador
000D ;               0016         
000D ;               0017         END
Nós Estamos Aqui Para Somar

Vamos fazer algo mais complicado: somar números entrados com as chaves de dados. O nosso circuito permite usar as instruções IN e OUT para ler o valor nas chaves e apresentar um valor nos LEDs. Mas para usar estas instruções precisamos de SEX!

Diferente de outros processadores, as instruções IN e OUT do 1802 usam a memória ao invés do acumulador. Qual posição de memória? A apontada por um registrador. Qual registrador? O indicado por um registrador especial de 4 bits, chamado X. Rx também é usado para indicar um operando da instrução ADD (o outro é o acumulador). O nosso programa começa com SEX 1, selecionando R1 para esta função. R0 é o contador de programa e vamos usar o byte menos significativo de R2 para armazenar temporariamente a soma.

O meu programa, que "compilei" com o assembler que eu descrevi anteriormente, ficou assim:
0000 ;               0001 
0000 ;               0002         ORG #0
0000 ;               0003     
0000 ;               0004 INICIO:
0000 E1;             0005         SEX 1           .. R1 é o índice para acessar memória
0001 F813;           0006         LDI A.0(AUX)
0003 A1;             0007         PLO R1          .. e aponta para o nossa variável
0004 F800;           0008         LDI 0           .. soma = 0
0006 ;               0009 LACO:
0006 51;             0010         STR R1          .. salva soma em AUX
0007 64;             0011         OUT 4           .. mostra nos LEDs
0008 21;             0012         DEC R1          .. OUT incrementa Rx
0009 3F09;           0013         BN4 *           .. espera apertar IN
000B A2;             0014         PLO R2          .. salva D em R2
000C 6C;             0015         INP 4           .. lê as chaves p/ AUX e D
000D 82;             0016         GLO R2          .. recoloca a soma em D
000E F4;             0017         ADD             .. soma o valor lido
000F 370F;           0018         B4  *           .. espera soltar IN
0011 3006;           0019         BR  LACO        .. repete
0013 ;               0020 
0013 00;             0021 AUX:   ,#0
0014 ;               0022 
0014 ;               0023         END
O vídeo abaixo mostra tudo isto na prática.


3 comentários:

Henrique disse...

Poderia disponibilizar a lista de componentes eletronicos que são utilizados e o diagrama do circuito ?

Daniel Quadros disse...

Está no post anterior aqui no blog.

Unknown disse...

Hello, Daniel.

A very nice write-up and execution, Sir. Thank you for sharing.

Cheerful regards, Mike, K8LH (Michigan, USA)