Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

93 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

>> README in english further down.

Este projeto é minha humilde tentativa de criar um emulador de CHIP-8 em C++ seguindo O guia de Tobias Langhoff.

Quero criar um emulador de NES como meu TCC em Engenharia de Computação, e um emulador de uma máquina (virtual) mais simples como o CHIP-8 pareceu um bom estudo inicial sobre desenvolvimento de emuladores. Escolhi C++ apenas por ser a melhor linguagem de todos os tempos.

O nome JC8E vem de "Joe's CHIP-8 Emulator*" (ou "Emulador de CHIP-8 do Joe"). Joe é meu apelido, então faz sentido. Além disso, eu acho que "jota-cê-oito-ê" é um nome legal de falar (em inglês também) e parece realmente um nome de emulador. E também o "C8E" parece o Zoidberg de Futurama e eu acho isso engraçado.

Objetivo

O uso de emuladores ou simuladores como ferramenta de estudo é prática comum em diversas áreas, incluindo a área de computação. Dentre as vantagens desse tipo de software podemos citar a rápida prototipagem de software, a possibilidade do uso de ferramentas de debugging e a dispensabilidade de uma máquina física.

Apesar do grande potencial que os emuladores oferecem para o desenvolvimento de software e como ferramenta de aprendizado, frequentemente essas ferramentas são desenvolvidas tendo como público alvo profissionais experientes, culminando em sistemas com muitas configurações e interfaces complexas.

Pensando no potencial educacional do uso de emuladores como ferramenta de aprendizado para alunos de disciplinas de computação voltadas a desenvolvimento em baixo nível de abstração, como arquitetura e organização de computadores, programação em código de máquina e sistemas operacionais, surgiu o objetivo de desenvolver um emulador didático, que oferecesse ferramentas apropriadas a prototipagem e desenvolvimento em baixo nível (como debugging de memória e controle de execução), e ao mesmo tempo com uma interface intuitiva, focada nos na visualização dos processos envolvidos na execução de um programa, e não na execução em si.

Para este objetivo, o sistema escolhido como alvo de emulação foi a máquina virtual CHIP 8, com seu interpretador originalmente desenvolvido para o computador COSMAC VIP na década de 70, como uma alternativa ao código de máquina para o desenvolvimento de jogos.

A escolha do CHIP 8 foi motivada por uma série de mobivos. O fato de ser um processador antigo, com registradores de dados de 8 bits e um endereçamento máximo de 64KB, o torna uma máquina simples de entender, porém ainda completa o suficiente para se entender a base do funcionamento de qualquer computador: registradores, operações lógicas e aritméticas, fluxo de execução, comunicação com periféricos, mapeamento de memória e operações de pilha. A baixa frequência de processamento, de menos de 1kHz, também possibilita emular o sistema em máquinas com pouco poder de processamento, democratizando o uso do emulador.

Seu foco como máquina de jogos também abre espaço para estratégias de gamificação do aprendizado. Estudos apontam a eficácia da associação com jogos, ou mesmo seu desenvolvimento, como ferramenta efetiva de aprendizado. Um estudo da Universidade da California apontou a eficácia do uso de um emulador de arquitetura RISC-V, projetado como uma máquina de jogos, como ferramenta didática em cursos de graduação nas áreas de computação.

Recursos

Na versão atual, o JC8E permite emular programas desenvolvidos para o interpretador original do CHIP 8 para o COSMAC VIP, contando com: um display com resolução 64x32 pixels e resoluções de cores binária (preto e branco); controle de 16 botões digitais (etiquetados de 0 a F, em dígitos hexadecimais), 16 registradores de propósito geral de 8 bits (também etiquetados de 0 a F), 2 registradores de temporização de 8 bits (delay timer e sound timer); registradores de contagem de programa (PC) e índice (I), de 16 bits; memória RAM de 64KB, com permissão total de leitura e escrita em tempo de execução e fonte padrão escrita entre os endereços 0x50 e 0x9F na inicialização; pilha de endereços de 16 bits, definida fora da RAM; frequência de execução de instruções de 500Hz; frequência de decremento de timers de 60Hz; e compatibilidade total com o conjunto de instruções do CHIP 8.

Além dos recursos essenciais para emulação de uma máquina CHIP 8, o emulador também permite a visualização e edição de todos os registradores em tempo de execução, visualização e edição da memória RAM, contando com uma visualização de caractéres ASCII, interface para controle de execução que permite pausar, retomar ou reiniciar a emulação, executar uma única instrução de cada vez (step) e definir breakpoints de execução, permitindo a pausa da execução em momentos definidas pelo usuário.

Arquitetura do Software

O projeto foi desenvolvido na linguagem C++, compatível com o padrão C++17, tendo como dependências principais a biblioteca SFML para interação com o sistema operacional (criação de janela, captura de eventos de teclado, contagem de tempo e controle de execução a nível de processo), e a biblioteca Dear Imgui para criação da interface gráfica, além de widgets de editor HEX e explorador de arquivos para Dear Imgui, incluídos como bibliotecas header only sem rependências adicionais.

O emulador está distribuído sob a licença Createve Commons e com código inteiramente público na plataforma Github, onde também se encontra uma documentação da estrutura de pastas e arquivos do projeto, com documentação sobre classes, métodos e outros elementos de código também estão disponíveis como comentários nos respectivos arquivos do projeto. O projeto utiliza o software CMake para gerenciamento de dependências de forma automática, e versões standalone de executáveis pré-compilados também estão disponíveis no repositório público. Todos esses tetalhes, somados ao fato de toda a pilha de software utilizada no desenvolvimento ser de código aberto e multiplataforma, contribuem para a democratização do uso do projeto como ferramenta de aprendizado de fácil uso.

Todo o projeto foi desenvolvido tendo em mente princípios de boas práticas de código, em especial a criação de testes unitários para as funcionalidades mais centrais e a separação de dependências. Do ponto de vista de estrutura de código, a execução envolve 6 classes principais dispostas em uma hierarquia de 3 camadas:

  • CPU, RAM, Controller e Display: Responsáveis pela emulação dos componentes da máquina CHIP 8. Englobam a interpretação e execução de instruções, controle dos registradores, periféricos de I/O e a comunicação entre esses elementos.
  • Emulator - Classe fachada, responsável por criar uma interface para fazer o controle de execução e o gerenciamento dos componentes da máquina. Também é responsável por controlar a temporização da execução de instruções.
  • Application - Responsável por fazer o intermédio entre o sistema operacional e o ambiente emulado. Cria a janela do sistema operacional, captura eventos de mouse e teclado, executa métodos da classe Emulator de acordo com esses eventos e renderiza toda a interface gráfica.

Interface

Instalação

Releases

Linux

A página de releases conta com executáveis standalone para sistemas Linux. Basta baixar sua versão de preferência (recomenda-se a versão estável mais recente), conceder permissão de execução ao binário "JC8E" e executar o programa.

Windows e demais sistemas operacionais

No momento, não existem executáveis pré-compilados para outros sistemas, é necessário fazer o build do projeto manualmente. Os requisitos de build estão na sessão abaixo.

Requisitos de Build

Este projeto foi desenvolvido e testado no seguinte ambiente:

  • C++ 17
  • CMake 3.28.3
  • SFML 2.6.2 (!)
  • Dear ImGui v1.91.0
  • imgui-SFML v2.6

Versões mais antigas podem ser compatíveis, mas não foram testadas. Versões mais recentes devem funcionar desde que sejam retrocompatíveis, como é o caso do padrão C++ e do CMake.

(!) Atenção: Este projeto não é compatível com versões 3.x da biblioteca SFML devido a mudanças no código da biblioteca entre as versões 2.x e 3.x. Tenha certeza de usar uma versão compatível da biblioteca se quiser compilar o código.

English

This project is my humble attempt at creating a CHIP-8 emulator in C++ following Tobias Langhoff's guide.

I want to make an NES emulator as my "Capstone Project" in Computer Engineering, so emulating a simpler (virtual) machine like the CHIP-8 seemed like a good starting point to study emulator development. I chose C++ just because it's the best language of all time.

The name JC8E comes from Joe's CHIP-8 Emulator. Joe is my nickname, so it makes sense. Besides, i thing "jay-cee-eight-ee" rolls off the tongue nicely (in portuguese too) and actually sounds like an emulator name. Also the "C8E" looks like Zoidberg from Futurama and i find that funny.

About

My attempt at creating a chip-8 emulator following Tobias V. Langhoff's guide

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages