Criando um Emulador: Space Invaders no Intel 8080

Find AI Tools
No difficulty
No complicated process
Find ai tools

Criando um Emulador: Space Invaders no Intel 8080

Sumário

  1. Introdução
  2. A Nostalgia dos Jogos de Nintendo
  3. A Curiosidade por Trás dos Emuladores
  4. A Preservação da História dos Jogos
  5. O Poderoso Processador Intel 8080
  6. A Memória e os Registradores do CPU
  7. As Instruções e Códigos de Operação
  8. As Interrupções e o Controle de Dispositivos
  9. A Experiência de Criar um Emulador
  10. Conclusão

A Nostalgia dos Jogos de Nintendo

🎮 Quando eu era mais jovem, jogava muitos jogos no Nintendo original e nos consoles Super Nintendo. Essas experiências despertaram minha curiosidade natural e meu desejo por exploração, permitindo-me descobrir mundos inteiros criados a partir de simples pixels e sprites. Esses mundos proporcionavam aventuras e contavam histórias que eram escritas linha por linha na superfície brilhante de um tubo de vidro.

A Curiosidade por Trás dos Emuladores

🕹️ Com o tempo, comecei a me perguntar como os eletrônicos funcionavam e como eles transformavam um botão pressionado em um personagem se movendo para frente ou em um feitiço que lança fogo ao longe. Um dia, vi meu irmão jogando Little Nemo em um teclado e seu computador, em vez do retângulo que eu estava acostumado a ver conectado àquela caixa cinza de duas cores. Fiquei espantado ao ver um Cursor de mão ensanguentado e um menu azul vívido aparecerem enquanto ele trocava rapidamente de jogos e carregava Skate or Die. Essa foi minha primeira introdução aos emuladores.

A Preservação da História dos Jogos

🕹️ Recentemente, revivi essas curiosidades e decidi descobrir como criar meu próprio emulador. Eu queria saber como eles funcionavam para recriar o que parecia ser um sistema tão único. Ao pensar nisso, percebi o quanto eu entendia pouco sobre o funcionamento interno do hardware. Não apenas teria uma melhor compreensão de alguns dos jogos que costumava jogar quando criança, mas também teria um entendimento conceitual muito mais forte sobre como as CPUs funcionam, como os computadores funcionam e os trabalhos mais profundos da linguagem assembly e do código de máquina.

🕹️ Ultimamente, tenho também me interessado pela preservação da história desses jogos. Muitos títulos obscuros nunca foram relançados em sistemas modernos e parece que estão condenados a se deteriorar pouco a pouco em suas prisões de cartuchos, à medida que seus meios eletrônicos se degradam. A emulação dá uma nova vida a alguns desses jogos, salvando os originais e permitindo que os fãs modifiquem e reinventem alguns títulos que, de outra forma, se perderiam no tempo. Esse é um tóPico controverso que rapidamente se mistura à discussão sobre pirataria de software, na minha opinião, de maneira equivocada, mas foi Algo que me veio à mente enquanto trabalhava neste projeto.

O Poderoso Processador Intel 8080

💻 O sistema Nintendo Entertainment System (NES) parece um bom lugar para começar a fazer um emulador. Afinal, é um sistema clássico, então deve ser simples, certo? Mas a verdade é que isso não é exatamente verdade. Ao ler as referências do NES, me deparei com uma grande quantidade de descrições únicas de hardware, mapeadores de memória específicos de jogos e cronometragens muito precisas. Vamos falar sobre Space Invaders em vez disso.

🚀 Space Invaders foi lançado originalmente em fliperamas em 1978. Embora não seja tão nostálgico para mim quanto alguns dos consoles domésticos posteriores, Space Invaders tem uma história bastante rica tanto no hardware usado quanto em seu impacto na indústria de jogos e eletrônicos como um todo.

🚀 Seu criador, Tomohiro Nishikado, foi inspirado por outros jogos e mídias, como Breakout, Star Wars e A Guerra dos Mundos. Ele foi atraído pelo tema espacial ao tentar criar designs de inimigos, acabando por escolher aliens já que a editora do jogo, Taito, achou a ideia de atirar em humanos inimigos imoral.

🚀 O hardware do jogo foi baseado no Intel 8080. Esse foi o segundo microprocessador de 8 bits já criado pela Intel, que começou o desenvolvimento há 50 anos, em 1972, e foi lançado em 1974 como sucessor do primeiro microprocessador de 8 bits comercialmente disponível, o Intel 8008.

A Memória e os Registradores do CPU

💾 A memória é o espaço onde as instruções e os dados são armazenados. A menor unidade de dados é um bit, que pode representar um 0 ou um 1. Esses bits geralmente são agrupados em conjuntos de 8, chamados de bytes. Os bytes, por sua vez, podem ser agrupados em palavras, cujo tamanho varia de acordo com a arquitetura do computador.

💾 No caso do nosso computador de 8 bits, geralmente trabalhamos com um único byte de cada vez e eles atuam como a menor unidade de memória que o computador pode acessar e manipular diretamente. Isso também significa que veremos valores entre 0 e 255, ou 0 a FF em hexadecimal, com bastante frequência.

💾 Os registradores do CPU são pequenos pedaços de memória aos quais o CPU tem acesso para realizar cálculos. Para o Intel 8080, existem 7 registradores de 8 bits e 2 registradores de 16 bits. No entanto, os registradores de 8 bits geralmente podem trabalhar juntos como registradores de 16 bits. Os números armazenados nesses registradores podem ser adicionados, subtraídos, armazenados ou carregados da memória ou de endereços de memória especificados, e podem ser manipulados de maneira semelhante.

💾 Todos esses comportamentos e operações são definidos dentro das instruções do CPU. As instruções são escritas como números que codificam um tipo específico de operação e, portanto, são chamadas de códigos de operação (opcodes). Existem 72 desses comandos, cada um cobrindo uma função geral dentro das categorias de transferência de dados, aritmética, ramificação, pilha, E/S e controle de máquina.

As Instruções e Códigos de Operação

🔢 Cada instrução tem um número específico de ciclos de relógio do CPU que precisam ser executados antes que o comando seja concluído. O Intel 8080 possui uma velocidade de clock de 2 MHz, o que significa que ele pode processar 2 milhões desses ciclos por segundo. Isso também significa que o tempo necessário para executar uma instrução, em segundos, é a duração do ciclo dessa instrução dividido pela velocidade do clock. Embora isso provavelmente esteja mais na casa dos microssegundos ou até mesmo nos nanossegundos do que nos segundos regulares, você pode pesquisar por códigos de operação do Intel 8080 e encontrar tabelas listando cada instrução e seu ciclo de duração.

🔢 Por exemplo, uma no operation instruction (nop), que não faz nada, requer 4 ciclos de clock para ser executada. Isso significa que é necessário um quarto de ciclo de clock para executar cada instrução do nop. Outro exemplo é o comando de salto (jump), que requer 10 ciclos de clock e lê um total de 3 bytes de ROM, incluindo o próprio byte do opcode. Esse comando pega os dois bytes seguintes após o opcode, os combina para criar um endereço de memória de 16 bits e coloca esse endereço de memória no program counter (PC), que lerá o byte nesse local como o próximo comando.

As Interrupções e o Controle de Dispositivos

🔄 Em vez de reagir a algo, o que acontece se um conjunto de instruções precisa ser executado em resposta a alguma coisa? Nesse caso, usaremos uma interrupção (interrupt), que geralmente força o computador a jogar tudo na pilha e trabalhar na tarefa que está pedindo sua atenção imediata.

🔄 Mais especificamente no hardware, há um pino de interrupção que se conecta a um dispositivo que responde a algum sinal, sensor ou outra coisa. Não importa exatamente o que é especificamente, o dispositivo puxará o pino para baixo (pull low) quando quiser chamar a atenção do processador. Em resposta, o processador enviará um sinal de reconhecimento (acknowledge) e INTA, puxando o pino para baixo (pull low).

🔄 Agora que o CPU e o dispositivo estão prontos, o dispositivo enviará um comando ao CPU através de seus 8 pinos de dados. Isso pode ser qualquer comando, mas quase sempre é um comando de reinício (restart). Existem 8 comandos de reinício (restart) que levam o programa para um local específico de reinicialização (restart vector).

🔄 Reinício 0 é o endereço 0, reinício 1 é o endereço 8, reinício 2 é o endereço hex 10 etc, até reinício 7, que é o endereço 38.

🔄 No caso do Space Invaders, existem duas interrupções que estavam conectadas ao circuito de leitura de varredura (scanline) de um monitor CRT. Tudo o que precisamos fazer é dizer ao programa que quando terminarmos de desenhar a linha média de pixels da tela, devemos acionar uma interrupção que chame o reinício 1 e, quando terminarmos de desenhar a tela inteira, devemos chamar o reinício 2. Essencialmente, isso aciona duas sub-rotinas que desenham a parte inferior e a parte superior da tela, respectivamente. Não queremos que elas sejam executadas antes de o programa estar pronto para isso, então o CPU tem um bit de habilitação de interrupção (INT E) que é definido ou redefinido pelas instruções de habilitar interrupção (enable interrupt) e desabilitar interrupção (disable interrupt), respectivamente. Se o bit de habilitação de interrupção for redefinido para zero, toda a lógica correspondente é desativada e nenhuma interrupção pode ser registrada no CPU.

Are you spending too much time looking for ai tools?
App rating
4.9
AI Tools
100k+
Trusted Users
5000+
WHY YOU SHOULD CHOOSE TOOLIFY

TOOLIFY is the best ai tool source.