A escolha do processador do Super Nintendo é peculiar. Ao contrário de seu concorrente que incluía um 68000 completo, o chip do SNES não é uma mudança radical de seu antecessor. Recapitulando, o NES usava uma CPU 6502 modificada, um ingrediente admirado dos computadores do final dos anos 70 e início dos anos 80. Agora, para pavimentar o caminho para a nova década (os anos 90), a Nintendo optou por uma solução mais conservadora (e mais barata): o 65C816, uma extensão de 16 bits do 6502.
Modernizando o 6502
A CPU 65C816 tem sua origem da Western Design Center, especialmente de Bill Mensch, um ex-membro da equipe 6502 da MOS e, antes disso, parte da equipe 6800 da Motorola. Em 1978, um ano após deixar a MOS, Mensch fundou a Western Design Center (WDC), uma empresa de semicondutores que envia clones do MOS 6502 com melhorias atraentes (ou seja, projeto CMOS, instruções extras, correções de circuito, novos modos de endereçamento, etc.).
Um dia, a Apple procurou a WDC para projetar uma variante retrocompatível do 6502 que pudesse processar quantidades maiores de dados. Esse projeto tornou-se o 65C816 que, após alguns contratempos durante a fase de desenvolvimento, a Apple finalmente o usou em uma nova máquina chamada Apple IIGS.
Enquanto isso, a Nintendo estava desfrutando de um bom relacionamento com a Ricoh e seu conjunto de chips sob-medida para o NES. Não encontrei o documento exato que conecte a Ricoh com a WDC, mas o que posso confirmar é que, em algum momento, a WDC concordou em licenciar seus projetos do 65C816 com a Ricoh . Consequentemente, a Ricoh adaptou o projeto aos novos requisitos do Super Nintendo e o nomeou de Ricoh 5A22, fornecido exclusivamente à Nintendo.
A nova CPU
Como já apresentado, o processador principal deste console é o Ricoh 5A22, uma CPU de 16 bits.
Ao contrário do Apple IIGS, que desfrutava de retrocompatibilidade com o software Apple II, o Super Nintendo não é compatível com os jogos do NES (embora, ao olhar para a escolha do processador, haja uma leve possibilidade de que o SNES tenha sido originalmente planejado para ser compatível com jogos do NES, quem sabe).
Continuando, a CPU emprega uma velocidade de clock variável que chega até 3,58 MHz durante as operações de registro e até 1,79 MHz ao acessar os barramentos mais lentos (ou seja, a porta serial/controles).
Em resumo, o 5A22 possui as seguintes características:
- A ISA 65816: as instruções estreantes de 16 bits do 65C816. Elas são baeadas na ISA 6502, mas não implementa instruções não documentadas que alguns jogos do NES usaram .
- O tamanho das instruções pode variar entre 1 byte (8 bits) e 4 bytes (32 bits) dependendo de como os endereços de memória são referenciados (conhecidos como o "modo de endereçamento" utilizado) .
- O modo BCD está funcionando novamente (suponho que seja consequência de uma licença apropriada).
- 10 diferentes modos de operação: devido à combinação de um modo de retrocompatibilidade, o retorno do modo BCD (ausente no NES) e a capacidade de alternar entre grupos de registrados de 8 e de 16 bits , os desenvolvedores podem utilizar essa CPU com diferentes combinações de modos.
- Ao contrário das CPUs MIPS lançadas depois, não há um conjunto de instruções misto com instruções dedicadas para palavras de 8 bits e de 16 bits. Em vez disso, o mesmo conjunto de instruções será interpretado de forma diferente com base no modo ativado.
- Por razões de compatibilidade, a CPU sempre começa no modo "emulação" (6502 puro) e cabe ao programador alternar para um modo "nativo" particular para habilitar a funcionalidade de 16 bits. Observação: é curioso como a Intel ainda aplica o mesmo modus operandi em suas CPUs modernas do tipo x86.
- Registradores de 16 bits. Além disso, devido aos diferentes modos de operação, o acumulador (onde as operações aritméticas são realizadas) e o registrador de índice (usado para calcular endereços de memória) podem alternar entre modos de 8 e de 16 bits.
- Barramento interno de dados de 16 bits e barramento externo de dados de 8 bits: significa que há penalidade de desempenho ao mover valores maiores de 8 bits pela memória (a CPU gasta ciclos adicionais), especialmente considerando que a maioria das instruções tem 16 bits de tamanho. No entanto, o custo geral é relativo, já que a variante da Ricoh inclui unidades de DMA (explicado mais adiante) e o clock da CPU varia dependendo da operação.
- Espaço de endereçamento de 24 bits: permite que a CPU acesse até 16 MB de memória. Assim como o Motorola 68000, com exceção que o 65C816 obtém seus endereços de 24 bits combinando registradores extras de 8 bits (
DBRePBR) com as linhas de endereçamento originais de 16 bits do 6502 . Em geral, essa metodologia é semelhante ao uso de mapper interno.
Adições da Ricoh
O 65C816 foi uma CPU aceitável de propósitos gerais para sua década (os anos 80). No entanto, a Nintendo planejou seu console para durar durante toda a década de 90. Assim, a Ricoh teve que elevar o nível de seu jogo, se me permite o trocadilho.
Como consequência, a primeira atualização aparente foi a adição de unidades de multiplicação e divisão de 16 bits, que fornece à CPU a capacidade de realizar essas operações por hardware (o 65C816 não inclui nenhuma instrução dedicada para este tipo de operações aritméticas).
Acesso rápido à memória
A segunda adição foi duas DMA exclusivas (Direct Memory Access) que habilita a transferência de dados sem a intervenção da CPU (resultando velocidades maiores). Para que esse projeto funcione, as regiões de memória são referenciadas usando dois barramentos de endereços diferentes :
- Barramento A de 24 bits de largura controlado pela CPU: conecta o cartucho, a CPU e a WRAM.
- Barramento B de 8 bits de largura controlado pela S-PPU: conecta o cartucho, a CPU, a WRAM, a S-PPU e a CPU de áudio.
Quando uma DMA é configurada, a origem deve vir de um barramento diferente do destino.
Além disso, as duas DMA não são idênticas e fornecem funcionalidades muito distintas :
- O DMA de propósito geral realiza transferências a qualquer momento. A CPU é interrompida até que a transferência seja concluída.
- O DMA Horizontal (HDMA) realiza uma pequena transferência após cada varredura horizontal (enquanto o feixe do CRT se prepara para desenhar a próxima linha). Isso evita interromper a CPU por longos intervalos, mas as transferências são limitadas a 4 bytes por linha de varredura.
Por fim, o sistema fornece oito canais para configurar as transferências do DMA, permitindo enviar até oito transferências independentes de uma só vez.
Falha de segmentação
Este console também apresenta uma "anomalia" chamada Barramento Aberto: se houver uma instrução tentando ler de um endereço não mapeado/inválido, o último valor lido é fornecido em seu lugar (a CPU armazena esse valor em um registrador chamado Registro de Dados da Memória ou MDR, do inglês Memory Data Register) e a execução continua em um estado imprevisível.
Para comparação, o 68000 usa uma tabela de vetores para lidar com exceções, então a execução será redirecionada sempre que uma falha for detectada.