AnotherWorld JAMMA

De Garoa Hacker Clube
Revisão de 13h38min de 3 de agosto de 2016 por Juca (discussão | contribs)
Ir para navegação Ir para pesquisar

Esta página contém rascunhos da concepção do projeto de uma placa JAMMA para o jogo Another World. Este projeto está sendo desenvolvido ao longo de uma atividade semanal no Garoa chamada CPU do Zero. Todo o projeto será implementado como hardware livre (com os esquemáticos distribuidos sob alguma licença livre ainda a ser definida, mas provavelmente CC-BY-SA).

Relógio Central

Função: Gerar o sinal de clock para a CPU e para os circuitos de geração de vídeo
implementação: (pendente)

CPU

Unidade de Controle - Decodificador de Instrução

Função: Detectar qual instrução o processador precisa executar com base no valor do código de instrução atual
implementação: (pendente)

Sugestão:

Como o instruction set da VM é muito simples e tem opcodes com valores incrementais de 0x00 a 0x1A (mais um par de instruções especiais em 0x80 e 0x40) é possível implementar trivialmente um decoder por meio do uso de um decodificador de 5 bits para 32 linhas. Isso pode ser implementado usando 2 decoders de 4 bits para 16 linhas como o 74154.

As duas instruções especiais (que são relativas a renderização de video) podem ser decodificadas com algumas poucas portas NAND com dados vindo dos bits 6 e 7 do registrador de instrução.

Instruction Set

Segue abaixo uma listagem de todas as instruções e seus respectivos opcodes

Another World VM instruction set
0x00 movConst
0x01 mov
0x02 add
0x03 addConst
0x04 call
0x05 ret
0x06 Break / "pauseThread" Temporarily stops the executing channel and goes to the next.
0x07 jmp
0x08 Setvec "channel number", address Initialises a channel (thread) with a code address to execute
0x09 djnz Decrement variable value and Jump if Not Zero
0x0A Conditional Jump instructions
0x0B setPalette
0x0C freezeChannels" / "unfreezeChannels" / "deleteChannels Deletes, freezes or unfreezes a series of channels.
0x0D selectVideoPage
0x0E fillVideoPage
0x0F copyVideoPage
0x10 blitFramebuffer
0x11 killChannel / "killThread"
0x12 Text "text number", x, y, color Displays in the work screen the specified text for the coordinates x,y.
0x13 sub Subtract
0x14 and Boolean AND
0x15 or Boolean OR
0x16 shl Shift Left
0x17 shr Shift Right
0x18 play / "playSound" parameters: resourceId, freq, vol, channel
0x19 load / "updateMemList" bank-switching de recursos (paletas, bytecode, polígonos, etc)
0x1A song / "playMusic" parameters: resourceID, delay, pos
0x40/0x80 video renderização de polígonos

Unidade de Controle - Microcódigo

Função: Implementa o comportamento de cada instrução por meio da geração de sinais de controle que manipulam o fluxo de dados
implementação: (pendente)

Fluxo de Dados

Função: Elementos passivos que implementam os registradores internos da CPU, Pilha e memória
implementação: (pendente)

STACK

A VM possui uma pilha de 256 elementos de 16 bits cada. Pensei em implementar isso com register files, mas não achei um grande o suficiente pra isso. O Mais próximo que achei foi esse que tem 64 elementos de 40 bits cada. Mesmo assim teria que ter 4 desses, sobrariam bits não usados e não sei o quão fácil é achar desse chip. Talvez seja o caso de usar uma RAM estática, mesmo que as menores disponíveis já sejam muito maiores que o realmente necessário aqui.

Sistema de áudio

Função: Tocar 4 canais simultaneos de áudio com base em samples armazenados em ROMs
implementação: Estamos estudando a possibilidade de usar um chip MSM6295

Sistema de vídeo

Função: Gerar sinal de vídeo para os pinos do conector JAMMA com base em rotinas de rasterização dos elementos poligonais armazenados em ROMs
implementação: (pendente)

rasterização

TO-DO:

Passo 1: Esturar o algoritmo de rasterização com base no código fonte da reimplementação livre da VM.

Passo 2: Implementar uma máquina de estados equivalente

Passo 3: Estágio de saída (paleta de cores) Implementar bank-switching para alternação de paletas de cores. E projetar conversor digital-analógico para os 3 canais de cores. Precisaremos de ROMs pequenas para armazenar as paletas de cores. Placas de arcade usam ROMs OTP (one-time-programmable) como a HM-7611 usada no jogo 1984 (ver a página "COLOR MIXER" do esquemático nesse PDF)

Passo 4: Realizar em portas lógicas e montar em protoboard ou PCB e testar