Isso é meio que inspirado no desafio Intel 8086 que também está aqui, mas achei que um desafio 6502 seria interessante também.
O desafio
Eu pensei que seria divertido ver os resultados. Este é obviamente para o lado mais avançado do espectro. O desafio é escrever seu próprio emulador de CPU 6502. Isso envolve, é claro, a compreensão do conjunto de instruções e do formato de codificação. Os recursos estão vinculados na parte inferior. O 6502 é um dos processadores mais fáceis de imitar no mundo real. Para os objetivos deste desafio, você não precisará se preocupar com o tempo do ciclo, se não quiser - mas é sempre uma vantagem a ser incluída!
NÃO COPIAR O CÓDIGO DE NINGUÉM MAIS !! Claro, você certamente pode espiar outros emuladores para ajudá-lo a entender, mas sem copiar e colar! :)
Uma vez que seu código funcione, você sempre poderá percorrer uma milha extra, se quiser, e transformá-lo em um emulador de Apple II, ou NES, C64, VIC-20 ou qualquer outro bilhão de sistemas antigos baseados em 6502 da época.
Testando seu emulador
Eu compilei um conjunto de teste 6502 ao qual encontrei o código fonte aqui: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Minha versão compilada pode ser baixada aqui: http://rubbermallet.org/AllSuiteA.zip
Carregue o binário de 48 KB no espaço de memória do emulador por US $ 4000, o que deixa 16 KB de RAM de leitura e gravação abaixo dele. Quando o teste terminar de executar, o valor no endereço $ 0210 deve ser $ FF, se sua CPU for aprovada. Você saberá que o teste está concluído quando o contador do programa (PC) atingir o endereço $ 45C0.
Outros testes também estão disponíveis aqui: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Fazendo algo mais interativo com ele
Uma vez que sua CPU funcione, você provavelmente desejará fazer algo mais divertido do que olhar para a saída de teste! Compilei uma imagem de ROM do Enhanced BASIC para o 6502. Tem 16 KB, portanto, você deve carregá-lo em $ C000 do seu espaço de memória emulado, redefinir o 6502 virtual e iniciar a execução.
Faça o download deste ZIP, que contém ehbasic.bin: http://rubbermallet.org/ehbasic.zip
A maneira como o EhBASIC lida com entrada / saída é muito simples. Quando deseja gravar um caractere no console, ele grava o byte na localização de memória $ F001. Portanto, quando o emulador vê o 6502 tentar gravar nesse local, simplesmente imprima esse valor de caractere no console com um printf ("% c", valor); ou como você quiser. (Este desafio não se limita a C, é claro)
Quando ele pesquisa um personagem que está sendo inserido no console, é bem parecido. Ele continua lendo a partir do local da memória $ F004, onde você deve ter o próximo valor de caractere ASCII do teclado aguardando para ser lido. Se não houver mais entrada para ler, ele deve retornar um valor zero.
O EhBASIC pesquisa o valor nesse local até que seja diferente de zero, o que permite saber que o byte é uma entrada válida do teclado. É por isso que, se não houver mais entrada para ler, o emulador retornará zero lá. O EhBASIC girará nele até a próxima chave válida quando estiver procurando por entrada.
Se você não limpar esse valor para zero depois de ler o último valor da chave, ele fará com que ele se repita como se você estivesse pressionando a tecla; portanto, tenha cuidado para fazer isso corretamente!
Se o seu emulador funcionar corretamente, é isso que você verá impresso no seu console quando executar a imagem da ROM:
6502 EhBASIC [C]old/[W]arm ?
Pressione C, depois pressione enter e você verá:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Os bytes livres podem ser diferentes para você, mas no meu emulador limitei a área de memória gravável a um limite de 32 KB. Você pode realmente ir até onde a ROM começa, que é a marca de 48 KB.
6502 Links de recursos da CPU
Aqui estão alguns recursos que devem fornecer informações suficientes para você trabalhar:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- este tem algumas informações muito interessantes
http://en.wikipedia.org/wiki/MOS_Technology_6502
Se você tiver dúvidas ou precisar de mais informações técnicas, não hesite em me perguntar. Há também uma enorme variedade de outras informações do 6502 na web. Google é seu amigo!
fonte
Respostas:
Pensei em ir em frente e postar minha própria implementação. É completamente destruído, mas é uma implementação completa.
fonte
Um emulador MOS 6502 em Haskell. Características incluem:
Esta é uma versão um pouco complexa de uma implementação completa (com mais recursos) que fiz para esse desafio que postarei mais tarde. Apesar do golfe, o código ainda é simples. O único recurso ausente conhecido é o modo BCD (disponível ...)
Executa o código ehBASIC:
E o código, com menos de 300 linhas no total:
fonte
Para qualquer pessoa interessada, pensei em compartilhar minha implementação do 6502 em C #. Tal como acontece com outros posts aqui, é completamente destruído, mas é uma implementação completa do recurso.
Comecei este projeto criando uma planilha de instruções quando aprendi sobre a CPU. Percebi que poderia usar esta planilha para me poupar de digitar. Transformei isso em uma tabela de arquivo de texto que o emulador carrega para ajudar a contar ciclos e facilitar a saída da desmontagem.
O projeto inteiro está disponível no Github https://github.com/amensch/e6502
fonte