132.10+Descrição+do+Projeto


 * Introdução > Hardware > Software > Descrição do Projeto > Problemas e Soluções > Resultados > Instalação e Uso > Conclusão > Referências **

=2.3 Descrição do Projeto=

2.3.1 Visão Geral
O objetivo é criar um console de //video game// simples, exibindo apenas as funções essenciais: processamento, entrada de comandos e saída de áudio e vídeo. O programa do jogo será embutido na memória do console (em oposição a jogos em cartuchos, por exemplo). Tanto o processador quando os geradores de áudio e vídeo serão primitivos, competindo apenas com consoles comerciais da década de 1970.



2.3.2 Processador
O processador é a parte mais importante do projeto. Ele é responsável por executar as instruções do programa do jogo, responder à entrada de comandos e controlar a saída de áudio e vídeo. O //design// do processador foi baseado no MOS Technology 6502, de 1975. Ambos são processadores de 8 //bits// (o maior número de //bits// com os quais as instruções de aritmética e lógica e os registradores trabalham) com um barramento de endereço para a RAM de 16 //bits// (podendo endereçar, no máximo, 64 //kilobytes// de memória -- no entanto, a RAM interna do FPGA possui apenas 7 //kilobytes// disponíveis, o que limita o endereçamento). Os dois também possuem três registradores de uso geral de 8 //bits// (aqui denotados A, B e C), um registrador para o contador de programa de 16 //bits// (//Program Counter// ou PC), um registrador para o ponteiro da pilha de 8 //bits// (//Stack Pointer// ou SP) e um registrador para as //flags// de resultados (//Status Register//).

O processador reconhece as seguintes instruções:


 * = **Descrição** ||= **Mnemônica da Instrução** ||= **Imm.** ||= **Zero-page** ||= **Full Mem.** ||= **Indexed Mem.** ||= **Indexed Ptr.** ||
 * = Carrega o registrador A ||= LDA ||= X ||= X ||= X ||= X ||= X ||
 * = Carrega o registrador B ||= LDB ||= X ||= X ||= X ||= X ||= X ||
 * = Carrega o registrador C ||= LDC ||= X ||= X ||= X ||=  ||=   ||
 * = Escreve o valor de A na memória ||= STA ||=  ||= X ||= X ||= X ||= X ||
 * = Escreve o valor de B na memória ||= STB ||=  ||= X ||= X ||= X ||= X ||
 * = Escreve o valor de C na memória ||= STC ||=  ||= X ||= X ||=   ||=   ||
 * = Realiza adição do registrador com o operando ||= ADD r ||= X ||=  ||= X ||=   ||=   ||
 * = Realiza função E (AND) do registrador com o operando ||= AND r ||= X ||=  ||= X ||=   ||=   ||
 * = Realiza função OU (OR) do registrador com o operando ||= ORR r ||= X ||=  ||= X ||=   ||=   ||
 * = Realiza função NEGAÇÃO (NOT) do registrador com o operando ||= NOT r ||=  ||=   ||=   ||=   ||=   ||
 * = Realiza função OU EXCLUSIVO (XOR) do registrador com o operando ||= XOR r ||= X ||=  ||= X ||=   ||=   ||
 * = Transfere o valor de A para B ||= TAB ||=  ||=   ||=   ||=   ||=   ||
 * = Transfere o valor de B para A ||= TBA ||=  ||=   ||=   ||=   ||=   ||
 * = Transfere o valor de A para C ||= TAC ||=  ||=   ||=   ||=   ||=   ||
 * = Transfere o valor de C para A ||= TCA ||=  ||=   ||=   ||=   ||=   ||
 * = Transfere o valor do registrador de flags para A ||= TPA ||=  ||=   ||=   ||=   ||=   ||
 * = Transfere o contador de frames do gerador de vídeo para A ||= TFA ||=  ||=   ||=   ||=   ||=   ||
 * = Inativa o flag de carry ||= CLC ||=  ||=   ||=   ||=   ||=   ||
 * = Insere o valor de A na pilha ||= PHA ||=  ||=   ||=   ||=   ||=   ||
 * = Recupera o valor de A da pilha ||= PLA ||=  ||=   ||=   ||=   ||=   ||
 * = Desvia o curso do programa ||= JMP ||=  ||=   ||= X ||=   ||=   ||
 * = Desvia o curso do programa e insere o valor de PC na pilha (subrotina) ||= JSR ||=  ||=   ||= X ||=   ||=   ||
 * = Recupera o valor de PC da pilha (retorno da subrotina) ||= RTS ||=  ||=   ||=   ||=   ||=   ||
 * = Desvia o curso do programa se o flag de zero está ativo ||= BEQ ||=  ||=   ||=   ||=   ||=   ||
 * = Desvia o curso do programa se o flag de zero está inativo ||= BNE ||=  ||=   ||=   ||=   ||=   ||
 * = Desvia o curso do programa se o flag de carry está ativo ||= BCS ||=  ||=   ||=   ||=   ||=   ||
 * = Desvia o curso do programa se o flag de carry está inativo ||= BCC ||=  ||=   ||=   ||=   ||=   ||
 * = Atualiza certos registradores internos do processador ||= REG ||= X ||=  ||= X ||=   ||=   ||

//r// deve ser substituído pelo nome do registrador de destino. As colunas à direita indicam os modos de endereçamento suportados por cada instrução. As instruções sem modo de endereçamento indicado têm operando implícito.
 * Imm.** indica o modo imediato, onde o operando se encontra codificado na própria instrução;
 * Zero-page** indica o modo de endereço na página zero -- significa que é codificado na instrução um endereço de memória de 8 //bits//, com os //bits// mais significativos assumindo valor zero;
 * Full Mem.** indica o modo de endereço completo, de 16 //bits//;
 * Indexed Mem.** indica o modo de endereço completo, de 16 //bits//, ao qual é adicionado o valor do registrador C antes do acesso à memória;
 * Indexed Ptr.** indica o modo de endereço por ponteiro, onde é codificado na instrução o endereço de memória onde se encontra o endereço real do operando, ao qual é adicionado o valor do registrador C antes do acesso à memória.

2.3.3 Gerador de Vídeo
O gerador de vídeo é baseado em //tiles//. A tela é formada de 256 (16 x 16) //tiles// de 8 x 8 //pixels// (guardados nos endereços da RAM de 0x600 até 0x6FF -- área chamada de //nametable// --, onde cada //byte// indica o índice do //tile// e a paleta de cores usada). O gerador busca o índice do //tile// em determinado pixel, e depois busca, na lista dos //tiles// (guardados nos endereços de 0x200 até 0x5FF -- área chamada de //pattern// ou //character table//), um valor de 2 //bits// que indica a cor do pixel (indexado pela paleta do //tile//). O gerador é capaz de cores de 8 //bits// (no formato RRRGGGBB) que o processador ajusta usando a instrução REG (modificar registradores internos). A saída do gerador é dada no padrão VGA (//Video Graphics Array//), de modo a funcionar em monitores de computador e televisões.





2.3.4 Gerador de Áudio
O gerador de áudio é apenas capaz de produzir duas ondas quadradas (//square waves//), em diversas frequências e volumes, e uma onda aleatória (//noise//). A saída de áudio é de apenas 1 //bit//, conectado a um alto-falante externo. É possível modular qualquer som em apenas 1 //bit// usando //sigma-delta modulation//, e o resultado é aceitável (este processo insere frequências altíssimas no som produzido que, embora inaudíveis, podem distorcer o resultado). O processador controla a saída de áudio usando a instrução REG (modificar registradores internos).

2.3.5 Programa do Jogo
O programa do jogo será simples, apenas servindo para demonstrar as funções do projeto. Consistirá em uma tela simples, com alguns blocos e um personagem, um objeto se rebatendo pelo cenário, e uma música tocando ao fundo. Desse modo, as características do processador, do gerador de vídeo e do gerador de áudio serão demonstradas.