Índice:

6502 Minimal Computer (com Arduino MEGA) Parte 3: 7 etapas
6502 Minimal Computer (com Arduino MEGA) Parte 3: 7 etapas

Vídeo: 6502 Minimal Computer (com Arduino MEGA) Parte 3: 7 etapas

Vídeo: 6502 Minimal Computer (com Arduino MEGA) Parte 3: 7 etapas
Vídeo: 3 chip computer (breadboarded) 2024, Julho
Anonim
6502 Computador mínimo (com Arduino MEGA) Parte 3
6502 Computador mínimo (com Arduino MEGA) Parte 3

Indo ainda mais longe, agora adicionei uma trava Octal, 8 LEDs retangulares e um conjunto de resistores de 220 Ohm à placa principal. Há também um jumper entre o pino comum do array e o terra, para que os LEDs possam ser desligados. A porta 74HC00 NAND foi substituída por uma porta 78LS08 AND, a fiação para a porta também foi alterada. A porta AND significa que o 6522 agora está localizado a $ 6.000 em vez de $ E000.

Há também um pino para a conexão de um relógio externo para acionar o 6502. Com esta conexão, não há necessidade de o MEGA fornecer um sinal de relógio. O MEGA ainda monitora o que está acontecendo com o processador como antes.

Usei um pino 74HC373 de 20 para a trava porque tinha alguns. Isso estava OK quando na placa de ensaio, mas um 74HC573 é compatível com barramento e teria economizado muito fiação. O UCN5801A, que é um IC de 22 pinos, também pode ser considerado no circuito, mas a fiação será um pouco diferente.

O LED laranja único na parte superior é um indicador de energia e o vermelho na parte inferior esquerda indica quando uma gravação está ocorrendo. O último será insignificante se a placa for executada em velocidades mais altas.

O circuito modificado está acima (com o 74HC573).

Etapa 1: Programas de demonstração

Programas de Demonstração
Programas de Demonstração

Dois programas de demonstração simples estão incluídos no monitor 6502 e seu código desmontado está aqui.

Este programa carrega 1 no registro 6502 A e o armazena na trava. Em seguida, adiciona 1 ao registrador A e o armazena na trava. Em seguida, ele salta de volta para $ 1005 e o processo se repete para sempre.

* = 1000

1000 A9 01 LDA # $ 01 1002 8D 00 41 STA $ 4100 1005 69 01 ADC # $ 01 1007 8D 00 41 STA $ 4100 100A 4C 05 10 JMP $ 1005 100D.

Este programa primeiro define o DDR da porta B 6522 para a saída. Em seguida, ele armazena $ 55 (B01010101) na porta, bem como na trava. O registrador A então gira 1 passo para a direita e agora contém $ AA (B10101010). Isso é novamente armazenado na porta B e na trava. O programa salta para $ 1005 e continua para sempre.

* = 1000

1000 A9 FF LDA # $ FF 1002 8D 02 60 STA $ 6002 1005 A9 55 LDA # $ 55 1007 38 SEC 1008 8D 00 60 STA $ 6000 100B 8D 00 41 STA $ 4100 100E 6A ROR A 100F 8D 00 60 STA $ 6000 1012 8D 00 41 STA $ 4100 1015 4C 05 10 JMP $ 1005 1018. END

Os mais atentos podem notar que os LEDs coloridos estão mostrando um padrão diferente dos verdes. Isso ocorre porque o cabo comum está conectado a 5v nos coloridos e o comum nos verdes está conectado ao aterramento.

Altere esta linha de código para programa2 ou programa3.

setDataPins (programa3 [deslocamento]);

Um 6502 Assembler e Disassembler são ferramentas úteis para ajudar a codificar seus programas.

Etapa 2: Adicionando um EEPROM

Adicionando um EEPROM
Adicionando um EEPROM
Adicionando um EEPROM
Adicionando um EEPROM
Adicionando um EEPROM
Adicionando um EEPROM

Para a placa EEPROM, usei uma placa de tiras de 950 x 650 mm e pinos de encaixe macho de 19 mm para permitir que a placa limpe a que está embaixo. Esta placa se conecta à placa 6502 abaixo. O EEPROM é um ATMEL 28C256 que possui 28 pinos e contém 32k x 8 bits de memória. Isso é mais do que adequado para os pequenos programas que estão sendo usados atualmente.

Eu não fiz um diagrama de circuito para esta placa, mas é bastante simples como ela se conecta à placa 6502 abaixo. Esses chips EEPROM não são amigáveis ao barramento, então precisam ser conectados aos pinos individuais, portanto, todo o "espaguete verde e branco". Resolvi o problema de ligação na placa anterior conectando as linhas de dados na parte inferior da placa.

Os 14 pinos de endereço da EEPROM se conectam aos pinos apropriados no lado esquerdo (fios verdes) e os pinos de E / S aos pinos de dados à direita (fios brancos). O pino 27 (WE) é conectado ao pino 28 (5v), o pino 22 (OE) é conectado ao aterramento e o pino 20 (CE) é conectado a uma porta NAND. As 2 entradas da porta NAND são conectadas a A15 no placa principal. Isso significa que quando este pino fica alto, a porta NAND dá um sinal baixo para o pino CE da EEPROM que o torna ativo. Com esta configuração, significa que a EEPROM só pode ser lida pelo 6502.

Como a EEPROM reside nos primeiros 32k no mapa de memória, isso significa que $ FFFC e $ FFFD podem conter o endereço inicial do 6502 após ele ter sido reiniciado. Com o 6522 tendo seus endereços entre $ 6.000 e $ 600F e a trava está em $ 4.100, ele interrompe qualquer conflito de memória.

O vetor NMI ($ FFFA e $ FFFB) e o vetor BRK / IRQ ($ FFFE e $ FFFF) também podem ser escritos da mesma maneira.

Etapa 3: Programação da EEPROM

Programando a EEPROM
Programando a EEPROM
Programando a EEPROM
Programando a EEPROM

Para armazenar um programa na EEPROM, é necessário um programador. Fiz um de uma placa de tira, um Arduino Pro Mini, um par de 74HC595 e um soquete ZIF. Originalmente, o programador foi feito para um AT28C16 que tem menos linhas de endereço do que o AT28C256, então teve que ser modificado.

O diagrama de circuito mostra como fazer a fiação de ambos os EEPROMs. Não está claro na foto se os dois chips 595 estão de cabeça para baixo e não como mostrado no diagrama. Os pinos 1 a 7 de 595/1 se alinham com A1 a A7 da EEPROM, independentemente de qual é usado. Isso economiza 7 fios de conexão. A placa agora parece um pouco apertada e isso é porque originalmente eu usei um soquete DIL de 24 pinos que agora foi substituído por um soquete ZIF muito maior de 28 pinos.

Inclui um programa que funciona com a minha placa. O programa funcionará com qualquer Arduino e 595s em um circuito, conforme mostrado. Escolhi um Pro Mini 5v porque é compacto e barato o suficiente para deixar na configuração.

Etapa 4: Os programas EEPROM

Os programas EEPROM
Os programas EEPROM

Existem três programas simples no programador EEPROM. Para usá-los, apenas descomente a linha que deseja usar.

// Lê a porta A de 6522

// dados de byte const = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

O programa mostra um despejo de memória quando termina. A parte do programa abaixo oferece controle total sobre o que você deseja escrever ou apagar, define $ FFFC & $ FFFD e exibe o conteúdo de um determinado intervalo. Apenas descomente ou altere os parâmetros conforme necessário. Os endereços também podem ser inseridos no formato decimal.

// apagarEEPROM (422, 930, 0x41); // Use para apagar todo ou parte da EEPROM - início, fim, byte

Serial.println ("Programação EEPROM"); quantidade = program_numeric_data (0x1000); writeEEPROM (0x7ffc, 0x00); // Define $ FFFC para 6502 writeEEPROM (0x7ffd, 0x90); // Defina $ FFFD para 6502 // writeEEPROM (0x1000, 0xA9); // Grava 1 byte de dados Serial.println ("done"); Contorno da string = "Escrito" + (String) quantidade + "bytes"; Serial.println (contorno); Serial.println ("Lendo EEPROM"); printContents (0x0000, 0x112f); // Define o intervalo para exibir printContents (0x7ff0, 0x7fff); // Lê os últimos 16 bytes na EEPROM

Uma saída resumida do programa está acima.

Etapa 5: Executando o 6502 a partir da EEPROM

Executando o 6502 da EEPROM
Executando o 6502 da EEPROM
Executando o 6502 da EEPROM
Executando o 6502 da EEPROM
Executando o 6502 da EEPROM
Executando o 6502 da EEPROM

A EEPROM programada agora pode ser inserida em sua placa e esta conecta-se à placa 6502 principal, que conecta-se ao MEGA. As fotos da vista lateral e superior acima mostram como tudo se encaixa.

O 6502 agora pode ler o vetor inicial de $ FFFC e $ FFFD (que é $ 9000) e então pular para o programa que está armazenado lá. O MEGA ainda está fornecendo o sinal do relógio e seu programa precisa ser alterado para fornecer apenas o sinal do relógio e monitorar o 6502. Um programa modificado é fornecido para fazer isso.

A foto em execução mostra este programa em execução.

9000 LDA # $ 00 A9 00

9002 STA $ 6003 8D 03 60 9005 LDA # $ FF A9 FF 9007 STA $ 6002 8D 02 60 900A LDA $ 6001 AD 01 60 900D STA $ 6000 8D 00 60 9010 EOR # $ FF 49 FF 9012 STA $ 4100 8D 00 41 9015 JMP $ 900A 4C 0A 90

Os interruptores são conectados à porta A e o programa exibe o valor que está lendo na porta B e no 74HC373 (que está oculto no momento). os interruptores são conectados ao aterramento e os LEDs são conectados a 5v. O EOR # $ FF corrige o problema da trava e da porta B exibindo padrões diferentes invertendo os bits antes de gravar na trava.

Etapa 6: sinal de tempo externo

Sinal de Tempo Externo
Sinal de Tempo Externo

Se um sinal de clock for aplicado ao pino na parte superior da placa, o 6502 agora pode funcionar independentemente do MEGA. Claro que também precisa de uma fonte de alimentação. Eu experimentei diferentes relógios e até mesmo executei o 6502 a 1 MHz com um oscilador de cristal. O MEGA não consegue acompanhar velocidades mais altas, por isso deve ser removido.

Eu também tentei a saída de um temporizador 555, mas não funcionou. Eu acho que pode ser porque não é uma onda quadrada? Quando conectado a uma das saídas CD4017, ele dirigiu o 6502. Eu apliquei um patch em um dos kits acima para tentar obter um sinal de clock.

Ainda estou procurando métodos diferentes para obter um sinal de clock.

Etapa 7: Conclusão

Eu mostrei como construir alguns circuitos complexos e fazer um "computador" muito simples funcionar com uma quantidade mínima de peças. É verdade que o computador não pode fazer muito no momento ou é provável que o faça no futuro.

No início dos anos 80, com meu VIC20, eu costumava imaginar a incrível máquina e não tinha a primeira ideia de como começar a montá-la. Os tempos mudaram e a tecnologia também, mas ainda é bom voltar ao básico e ter orgulho de algo que você construiu do zero.

Para desenvolver ainda mais este computador, pretendo colocar 2k de SRAM de $ 0000 a $ 2.047 e adicionar um oscilador de 1 MHz. Provavelmente adicionarei algo como um CD4040 (Contador / divisor de ondulação binária de 12 estágios) para que eu possa acessar diferentes velocidades de clock.

Pode até adicionar um display LCD para fornecer saídas de texto em vez de apenas luzes intermitentes. O programador EEPROM também precisará ser modificado para lidar com os programas maiores necessários para executar um display LCD.

Mesmo que o MEGA esteja se tornando desnecessário para a execução do 6502, ele ainda é útil para depurar o código de máquina. Como todos sabem, o código de máquina sempre contém bugs!

Recomendado: