Mudanças entre as edições de "AnotherWorld JAMMA"
(→CPU) |
(→CPU) |
||
Linha 16: | Linha 16: | ||
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. |
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 - Another World VM ==== |
||
+ | |||
+ | Segue abaixo uma listagem de todas as instruções e seus respectivos opcodes |
||
+ | |||
+ | {| class="wikitable" |
||
+ | |+ Another World 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 |
||
+ | | '''D'''ecrement variable value and '''J'''ump if '''N'''ot '''Z'''ero |
||
+ | |- |
||
+ | | 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 === |
=== Unidade de Controle - Microcódigo === |
Edição das 13h29min de 3 de agosto de 2016
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 - Another World VM
Segue abaixo uma listagem de todas as instruções e seus respectivos opcodes
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