Peanut-GB é uma biblioteca de emulador de Game Boy de cabeçalho de arquivo único baseada neste emulador de gameboy. O objetivo é criar uma biblioteca de emuladores de Game Boy (DMG) portátil e de alta velocidade que possa ser usada em qualquer plataforma que possua um compilador C99.
Este emulador é muito rápido . Tanto que pode rodar a toda velocidade no Raspberry Pi Pico! Confira BENCHMARK.md para benchmarks de Peanut-GB.
Apenas o Game Boy original (DMG) é compatível no momento, mas o trabalho preliminar foi concluído para oferecer suporte ao Game Boy Color (veja #50).
Este emulador é um trabalho em andamento e pode ser impreciso (embora passe nas instruções de CPU e nos testes de tempo de instrução do Blargg). Como tal, alguns jogos podem funcionar incorretamente ou nem funcionar. Procure um emulador alternativo se a precisão for importante.
O exemplo principal de implementação é fornecido em amendoim_sdl.c, que usa SDL2 para desenhar a tela e receber entradas. Execute cmake
ou make
na pasta ./examples/sdl2/ para compilá-lo.
Execute peanut-sdl
, que cria uma janela de zona para soltar onde você pode arrastar e soltar um arquivo ROM. Alternativamente, execute em um terminal usando peanut-sdl game.gb
, que criará automaticamente o arquivo salvo game.sav
para o jogo se nenhum for encontrado. Ou execute com peanut-sdl game.gb save.sav
para especificar um arquivo salvo.
Observação: os GIFs animados mostrados aqui são limitados a 50fps, enquanto a emulação estava rodando em ~60fps nativos. Isso ocorre porque os decodificadores GIF populares limitam o FPS máximo a 50.
Ação | Teclado | Joypad |
---|---|---|
UM | z | UM |
B | x | B |
Começar | Retornar | COMEÇAR |
Selecione | Retrocesso | VOLTAR |
D-Pad | Teclas de seta | DPAD |
Repita A | um | |
Repetir B | é | |
Velocidade normal | 1 | |
Turbo x2 (manter) | Espaço | |
Turbo X2 (alternar) | 2 | |
Turbo X3 (alternar) | 3 | |
Turbo X4 (alternar) | 4 | |
Reiniciar | R | |
Alterar paleta | p | |
Redefinir paleta | Mudança + p | |
Tela cheia | F11/f | |
Frameskip (alternar) | ó | |
Entrelaçar (Alternar) | eu | |
Despejar BMP (alternar) | b |
Os modos Frameskip e Entrelaçado estão desativados por padrão. O Frameskip alterna entre 60 FPS e 30 FPS.
Pressionar 'b' irá despejar cada quadro como um arquivo bitmap de 24 bits na pasta atual. Consulte /screencaps/README.md para obter mais informações.
Sem nenhuma ordem específica e em uma lista não exaustiva, os projetos a seguir usam Peanut-GB.
A documentação dos protótipos de funções pode ser encontrada na parte inferior de amendoim_gb.h.
A implementação front-end deve fornecer uma série de funções para a biblioteca. Essas funções são definidas ao chamar gb_init.
As seguintes funções opcionais podem ser definidas para funcionalidades adicionais.
Esta função é necessária para desenho em LCD. Defina esta função usando gb_init_lcd e habilite a funcionalidade LCD no Peanut-GB definindo ENABLE_LCD como 1 antes de incluir amendoim_gb.h. ENABLE_LCD é definido como 1 por padrão se não tiver sido definido anteriormente. Se gb_init_lcd não for chamado ou lcd_draw_line estiver definido como NULL, o desenho do LCD será desabilitado.
Os dados de pixel enviados para lcd_draw_line vêm com dados de sombra e camada. Os dois primeiros bits menos significativos são os dados de tonalidade (preto, escuro, claro, branco). Os bits 4 e 5 são dados de camada (OBJ0, OBJ1, BG), que podem ser usados para adicionar mais cores ao jogo da mesma forma que o Game Boy Color faz com os jogos Game Boy mais antigos.
Essas funções são necessárias para emulação e saída de áudio. Peanut-GB não inclui emulação de áudio, portanto uma biblioteca externa deve ser usada. Essas funções devem ser definidas e a saída de áudio deve ser habilitada definindo ENABLE_SOUND como 1 antes de incluir amendoim_gb.h.
Estas funções são necessárias para comunicação serial. Defina essas funções usando gb_init_serial. Se essas funções não estiverem definidas, a emulação agirá como se nenhum cabo de link estivesse conectado.
Essas funções são fornecidas pelo Peanut-GB.
Esta função redefine o jogo que está sendo jogado, como se o console tivesse sido desligado e ligado. gb_reset é chamado por gb_init para inicializar os registros da CPU.
Esta função retorna o tamanho do save do jogo que está sendo jogado. Esta função retorna 0 se o jogo não usar nenhum dado salvo.
Esta função executa a CPU até que um quadro completo seja renderizado no LCD.
Esta função calcula um hash do título do jogo. Este hash é calculado da mesma forma que o Game Boy Color para adicionar cor aos jogos do Game Boy.
Esta função retorna o nome do jogo.
Defina a hora do relógio de tempo real (RTC). Alguns jogos usam esses dados RTC.
Obsoleto: não use. O RTC está marcado internamente.
Execute uma imagem bootrom na reinicialização. Uma redefinição deve ser realizada após chamar gb_set_bootrom para que essas alterações tenham efeito. Isso ocorre porque gb_init chama gb_reset, mas gb_set_bootrom deve ser chamado após gb_init. O bootrom deve ser um bootrom DMG ou MGB.
Este projeto está licenciado sob a licença MIT.