CHIP-8 - CHIP-8

Captura de tela do Pong implementado no CHIP-8
Telmac 1800 executando o jogo CHIP-8 Space Intercept (Joseph Weisbecker, 1978)

CHIP-8 é uma linguagem de programação interpretada , desenvolvida por Joseph Weisbecker . Ele foi inicialmente usado na VIP COSMAC e Telmac 1800 de 8 bits microcomputadores em meados da década de 1970. Os programas CHIP-8 são executados em uma máquina virtual CHIP-8 . Foi feito para permitir que os videogames fossem mais facilmente programados para esses computadores, mas o CHIP 8 ainda é utilizado hoje, devido à sua simplicidade, e consequentemente em qualquer plataforma e seu ensino de programação de números Binários.

Aproximadamente quinze anos depois que o CHIP-8 foi introduzido, intérpretes derivados apareceram para alguns modelos de calculadoras gráficas (do final dos anos 1980 em diante, esses dispositivos portáteis de muitas maneiras têm mais poder de computação do que a maioria dos microcomputadores de meados dos anos 1970 para amadores).

Uma comunidade ativa de usuários e desenvolvedores existia no final dos anos 1970, começando com o boletim informativo "VIPer" da ARESCO, cujas três primeiras edições revelaram o código de máquina por trás do interpretador CHIP-8.

Aplicativos CHIP-8

Existem vários videogames clássicos portados para o CHIP-8, como Pong , Space Invaders , Tetris e Pac-Man . Existem também aplicativos como um gerador de labirinto aleatório e o Jogo da Vida de Conway .

CHIP-8 extensões e variações

Durante as décadas de 1970 e 1980, os usuários do CHIP-8 compartilharam programas do CHIP-8, mas também mudanças e extensões para o intérprete do CHIP-8, no boletim informativo dos usuários COSMAC VIP, revista VIPER. Essas extensões incluíram CHIP-10 e Hi-Res CHIP-8, que apresentou uma resolução mais alta do que o padrão 64x32, e CHIP-8C e CHIP-8X, que estendeu os recursos de exibição monocromática para suportar cores limitadas, entre outros recursos. Essas extensões eram em sua maioria compatíveis com versões anteriores, pois eram baseadas no intérprete original, embora alguns opcodes reaproveitados raramente usassem opcodes para novas instruções.

Em 1979, a Electronics Australia publicou uma série de artigos sobre a construção de um kit de computador semelhante ao COSMAC VIP, baseado na arquitetura Motorola 6800 . Este computador, o DREAM 6800, veio com sua própria versão do CHIP-8. Um boletim informativo semelhante ao VIPER, chamado DREAMER, foi usado para compartilhar jogos CHIP-8 para este intérprete. Em 1981, a Electronics Today International (ETI) publicou uma série de artigos sobre a construção de um computador, o ETI-660, que também era muito semelhante ao VIP (e usava o mesmo microprocessador). A ETI executou colunas regulares ETI-660 e CHIP-8 gerais até 1985.

Em 1990, um interpretador CHIP-8 chamado CHIP-48 foi feito para calculadoras gráficas HP-48 para que os jogos pudessem ser programados com mais facilidade. Erik Bryntse posteriormente criou outro intérprete baseado no CHIP-48, chamado SCHIP, S-CHIP ou Super-Chip. SCHIP estendeu a linguagem CHIP-8 com uma resolução maior e vários opcodes adicionais para tornar a programação mais fácil. Se não fosse pelo desenvolvimento do intérprete CHIP-48, o CHIP-8 não seria tão conhecido hoje.

O emulador, desmontador e documentação técnica estendida de David Winter popularizou o CHIP-8 / SCHIP em muitas outras plataformas. Ele apresentou uma lista completa de opcodes e recursos não documentados e foi distribuído em muitos fóruns de amadores. Muitos emuladores usaram essas obras como ponto de partida.

No entanto, o CHIP-48 mudou sutilmente a semântica de alguns opcodes, e o SCHIP continuou a usar essas novas semânticas, além de alterar outros opcodes. Muitos recursos online sobre CHIP-8 propagam essas novas semânticas, então muitos jogos CHIP-8 modernos não são compatíveis com o interpretador CHIP-8 original para o COSMAC VIP, mesmo que não usem especificamente as novas extensões SCHIP.

CHIP-8 hoje

Existe uma implementação CHIP-8 para quase todas as plataformas, bem como algumas ferramentas de desenvolvimento. Os jogos ainda estão sendo desenvolvidos e catalogados para o CHIP-8 hoje, além de jogos mais antigos ressurgindo online em arquivos digitais.

Embora o CHIP-8 e o SCHIP tenham sido comumente implementados como emuladores , uma implementação de hardware pura (escrita na linguagem Verilog ) também existe para certas placas FPGA .

Descrição da máquina virtual

Memória

O CHIP-8 foi mais comumente implementado em sistemas 4K, como o Cosmac VIP e o Telmac 1800. Essas máquinas tinham 4096 (0x1000) locais de memória, todos com 8 bits (um byte ), que é onde o termo CHIP-8 se originou . No entanto, o próprio interpretador CHIP-8 ocupa os primeiros 512 bytes do espaço de memória dessas máquinas. Por esse motivo, a maioria dos programas escritos para o sistema original começa no local de memória 512 (0x200) e não acessa nenhuma memória abaixo do local 512 (0x200). Os 256 bytes superiores (0xF00-0xFFF) são reservados para atualização da tela e os 96 bytes abaixo disso (0xEA0-0xEFF) foram reservados para a pilha de chamadas, uso interno e outras variáveis.

Em implementações CHIP-8 modernas, onde o intérprete está rodando nativamente fora do espaço de memória de 4K, não há necessidade de evitar os 512 bytes inferiores de memória (0x000-0x200), e é comum armazenar dados de fonte lá.

Registros

O CHIP-8 tem 16 registros de dados de 8 bits denominados V0 a VF. O registro VF funciona como um sinalizador para algumas instruções; portanto, deve ser evitado. Em uma operação de adição, VF é o sinalizador de transporte , enquanto na subtração, é o sinalizador "não emprestar". Na instrução de desenho, o VF é definido na colisão de pixels.

O registrador de endereço, que é denominado I, tem 12 bits de largura e é usado com vários opcodes que envolvem operações de memória.

A pilha

A pilha só é usada para armazenar endereços de retorno quando as sub-rotinas são chamadas. A versão original do RCA 1802 alocava 48 bytes para até 12 níveis de aninhamento; implementações modernas geralmente têm mais.

Cronômetros

O CHIP-8 possui dois temporizadores. Ambos fazem uma contagem regressiva de 60 hertz , até chegarem a 0.

  • Cronômetro de atraso: Este cronômetro deve ser usado para cronometrar os eventos dos jogos. Seu valor pode ser definido e lido.
  • Temporizador de som: este temporizador é usado para efeitos sonoros. Quando seu valor é diferente de zero, um som de bipe é emitido.

Entrada

A entrada é feita com um teclado hexadecimal com 16 teclas de 0 a F. As teclas '8', '4', '6' e '2' são normalmente usadas para entrada direcional. Três opcodes são usados ​​para detectar a entrada. Um pula uma instrução se uma tecla específica for pressionada, enquanto outro faz o mesmo se uma tecla específica não for pressionada. O terceiro aguarda o pressionamento de uma tecla e depois o armazena em um dos registradores de dados.

Gráficos e som

A resolução original do monitor CHIP-8 é de 64 × 32 pixels e a cor é monocromática . Os gráficos são desenhados na tela apenas desenhando sprites , que têm 8 pixels de largura e podem ter de 1 a 16 pixels de altura. Pixels Sprite são XOR 'd com pixels de tela correspondentes. Em outras palavras, os pixels do sprite configurados invertem a cor do pixel da tela correspondente, enquanto os pixels do sprite não configurados não fazem nada. O sinalizador de transporte (VF) é definido como 1 se qualquer pixel da tela for alterado de definido para não definido quando um sprite for desenhado e definido como 0 caso contrário. Isso é usado para detecção de colisão.

Conforme descrito anteriormente, um som de bipe é reproduzido quando o valor do temporizador de som é diferente de zero.

Tabela Opcode

O CHIP-8 tem 35 opcodes , todos com dois bytes de comprimento e big-endian armazenados . Os opcodes estão listados abaixo, em hexadecimal e com os seguintes símbolos:

  • NNN: endereço
  • NN: constante de 8 bits
  • N: constante de 4 bits
  • X e Y: identificador de registro de 4 bits
  • PC: Contador de programa
  • I: registrador de 16 bits (para endereço de memória) (semelhante ao apontador void);
  • VN: Uma das 16 variáveis ​​disponíveis. N pode ser 0 a F (hexadecimal);

Tem havido muitas implementações do conjunto de instruções CHIP-8 desde 1978. A seguinte especificação é baseada na especificação SUPER-CHIP de 1991 (mas sem os opcodes adicionais que fornecem funcionalidade estendida), já que é o conjunto de extensões mais comumente encontrado hoje . As notas de rodapé denotam incompatibilidades com o conjunto de instruções CHIP-8 original de 1978.

Código de operação Modelo C Pseudo Explicação
0NNN Ligar Chama a rotina de código de máquina ( RCA 1802 para COSMAC VIP) no endereço NNN. Não é necessário para a maioria dos ROMs.
00E0 Exibição disp_clear() Limpa a tela.
00EE Fluxo return; Retorna de uma sub-rotina.
1NNN Fluxo goto NNN; Salta para o endereço NNN.
2NNN Fluxo *(0xNNN)() Chama a sub-rotina em NNN.
3XNN Cond if (Vx == NN) Pula a próxima instrução se VX for igual a NN. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
4XNN Cond if (Vx != NN) Pula a próxima instrução se VX não for igual a NN. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
5XY0 Cond if (Vx == Vy) Pula a próxima instrução se VX for igual a VY. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
6XNN Const Vx = N Define VX para NN.
7XNN Const Vx += N Adiciona NN ao VX. (A bandeira de transporte não é alterada);
8XY0 Assig Vx = Vy Define VX com o valor de VY.
8XY1 BitOp Vx = Vx | Vy Define VX para VX ou VY. (Operação OR bit a bit);
8XY2 BitOp Vx = Vx & Vy Define VX para VX e VY. (Operação bit a bit AND);
8XY3 BitOp Vx = Vx ^ Vy Define VX para VX xou VY.
8XY4 Matemática Vx += Vy Adiciona VY a VX. VF é definido como 1 quando há transporte e como 0 quando não há.
8XY5 Matemática Vx -= Vy VY é subtraído de VX. VF é definido como 0 quando há um empréstimo e 1 quando não há.
8XY6 BitOp Vx >>= 1 Armazena o bit menos significativo de VX em VF e, em seguida, desloca VX para a direita em 1.
8XY7 Matemática Vx = Vy - Vx Define VX para VY menos VX. VF é definido como 0 quando há um empréstimo e 1 quando não há.
8XYE BitOp Vx <<= 1 Armazena o bit mais significativo de VX em VF e, em seguida, desloca VX para a esquerda em 1.
9XY0 Cond if (Vx != Vy) Pula a próxima instrução se VX não for igual a VY. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
ANNN MEM I = NNN Define I para o endereço NNN.
BNNN Fluxo PC = V0 + NNN Salta para o endereço NNN mais V0.
CXNN Rand Vx = rand() & NN Define VX como o resultado de um bit a bit e operação em um número aleatório (normalmente: 0 a 255) e NN.
DXYN Disp draw(Vx, Vy, N) Desenha um sprite na coordenada (VX, VY) com largura de 8 pixels e altura de N pixels. Cada linha de 8 pixels é lida como codificada por bits a partir do local de memória I; O valor I não muda após a execução desta instrução. Conforme descrito acima, VF é definido como 1 se qualquer pixel da tela for alterado de definido para não definido quando o sprite for desenhado, e para 0 se isso não acontecer
EX9E KeyOp if (key() == Vx) Pula a próxima instrução se a tecla armazenada em VX for pressionada. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
EXA1 KeyOp if (key() != Vx) Pula a próxima instrução se a tecla armazenada em VX não for pressionada. (Normalmente, a próxima instrução é um salto para pular um bloco de código);
FX07 Cronômetro Vx = get_delay() Define VX para o valor do temporizador de atraso.
FX0A KeyOp Vx = get_key() Um pressionamento de tecla é aguardado e, em seguida, armazenado no VX. (Operação de bloqueio. Todas as instruções interrompidas até o próximo evento chave);
FX15 Cronômetro delay_timer(Vx) Define o temporizador de atraso para VX.
FX18 Som sound_timer(Vx) Define o temporizador de som para VX.
FX1E MEM I += Vx Adiciona VX a I. VF não é afetado.
FX29 MEM I = sprite_addr[Vx] Define I para a localização do sprite para o personagem em VX. Os caracteres 0-F (em hexadecimal) são representados por uma fonte 4x5.
FX33 BCD
set_BCD(Vx)
*(I+0) = BCD(3);
*(I+1) = BCD(2);
*(I+2) = BCD(1);
Armazena a representação decimal codificada binária de VX, com o mais significativo dos três dígitos no endereço em I, o dígito do meio em I mais 1 e o dígito menos significativo em I mais 2. (Em outras palavras, use a representação decimal de VX, coloque o dígito das centenas na memória na localização I, o dígito das dezenas na localização I + 1 e os dígitos das unidades na localização I + 2.);
FX55 MEM reg_dump(Vx, &I) Armazena V0 a VX (incluindo VX) na memória começando no endereço I. O deslocamento de I é aumentado em 1 para cada valor escrito, mas o próprio I não é modificado.
FX65 MEM reg_load(Vx, &I) Preenche V0 a VX (incluindo VX) com valores da memória começando no endereço I. O deslocamento de I é aumentado em 1 para cada valor escrito, mas o próprio I não é modificado.

Notas

Referências

Leitura adicional

  • "RCA COSMAC VIP CDP18S711 Instruction Manual," RCA Solid State Division, Somerville, NJ 08776, fevereiro de 1978. Parte VIP-311. pp. 13–18, 35–37.
  • Revista BYTE , dezembro de 1978 , pp. 108–122. "An Easy Programming System", de Joseph Weisbecker . Descreve o CHIP-8 com um exemplo específico de um foguete e um jogo de galeria de tiro de OVNIs.
  • Arquivo do site Chip8.com dedicado ao CHIP-8 e sistemas relacionados. Mantém a coleção mais completa de programas CHIP-8 da rede.
  • Dominando o CHIP-8 , uma referência precisa ao conjunto de instruções CHIP-8 original
  • Emulador CHIP-8 de David Winter , utilitários e jogos.
  • BytePusher Uma máquina virtual minimalista inspirada no CHIP-8.
  • Grupo RCA COSMAC no Yahoo , com scans autorizados da revista VIPER.
  • OChip8 Um emulador CHIP-8 em um navegador
  • Dream 6800 O popular microcomputador Dream 6800 apresentado na Electronics Australia em 1979 rodava o CHIP-8.
  • FPGA SuperChip Uma implementação Verilog da especificação SCHIP.
  • Octo é um CHIP-8 IDE online, sistema de desenvolvimento, compilador / montador e emulador, com uma linguagem de script proprietária
  • Referência Técnica do Chip-8 da Cowgod (CHIP-48 / SCHIP)
  • Referência de extensões de Matt Mikolay CHIP-8
  • CHIP-8.com CHIP-8 Classic Computer Manual