Interpretador BASIC

A aventura de criar meu próprio interpretador BASIC

Fonte do Expert 1.1 e cores do padrão CGA

Por que?

Você deve estar se perguntando algo como “por que diabos um interpretador BASIC nos dias de hoje?“. Bom já a algum tempo eu estava querendo uma maquina para ensinar os princípios da computação para minha filha, e precisa ser uma maquina resistente, para resistir a uma criança de 5 anos tem que praticamente ser um tanque de guerra, e não pode ter nada sofisticado em termos de sistema operacional, nada de Linux ou Windows porque a maquina não pode ter um sistema de arquivos montado que precise ser desligado corretamente, precisa ser algo que seja desligado simplesmente cortando o fornecimento de energia e que ligue instantaneamente caindo em um prompt de alguma linguagem simples, sem ícones sem comandos para carregar o interpretador, nada, ligou ta pronto para receber comandos. Um sistema para satisfazer esses requisitos é o bom e velho BASIC in ROM presente em quase todos os computadores pessoais dos anos 70 e 80.

Conceito

Não é emulação de um interpretador que já existe como o BASIC da Microsoft tão famoso nos velhos tempos, nada disso, é uma implementação nova feita do zero. Então não, você não vai conseguir rodar seu jogo feito em MSX diretamente no interpretador a menos que você faça os ajustes necessários, igual acontecia se você tivesse um exemplo do código escrito para uma plataforma e quisesse fazer funcionar na outra (os livros de programação dos anos 80 as vezes continham essas mudanças nas observações ou notas de rodapé)

Alem disso quero incluir alguns comandos novos, para melhorar as capacidades didáticas da implementação, por exemplo a possibilidade fazer matemática em forma de pilha como em Forth para ensinar matemática com mais facilidade.

Abordagem de testes

Na pratica estou criando dois interpretadores distintos mas que devem falar exatamente o mesmo dialeto de BASIC, um escrito em C que vai rodar na plataforma da Renesas e uma versão em Go para rodar no PC. Existem vários motivos para essa implementação dupla, por exemplo a validação do código, mas também quero aproveitar para testar algumas ideias do Go e comparar com a solução em C. Alem de poder usar todas as vantagens das ferramentas de analise estática do Go, ferramentas de teste integradas e por ai vai.

Hardware

A versão em C vai funcionar no kit de desenvolvimento da Renesas, o Renesas Synergy™ Starter Kit SK-S7G2 que é uma placa extremamente completa com tudo que eu poderia sonhar em termos de periférico, incluindo display, memória, e uma boa quantidade de periféricos. Já estou com o kit e falta apenas resolver um problema da licença de desenvolvimento que por algum motivo esta se recusando a funcionar no macOS.

A ideia é eventualmente transformar usar o mesmo microcontrolador em um pequeno SBC “Tough As Nails”, basicamente vamos tirar a prova se a fama de resistente do Renesas se sustenta quando exposto a coisas mais destrutiva da Terra, uma criança.

Desenvolvimento

Enquanto espero o problema da licença do ambiente de desenvolvimento da Renesas ser resolvido estou brincando com a versão em Go, primeiro escolhi um package de desenvolvimentos de jogos, de todos que eu testei o que mais gostei para o a tarefa foi o Ebiten até agora tem todos os recursos que eu preciso e é fácil de usar.

A primeira coisa foi simular a tela do kit da Renesas na versão para PC que foi bem rápido usando o Ebiten. Só por gosto eu resolvi usar os caracteres do MSX em uma tela de 40 colunas e caracteres 8x8 bits que cabe perfeitamente no display do kit e ainda da um toque retro bem agradável. Um amigo que havia feito um dump da memória da ROM do gradiente providenciou os bitmaps, e ainda tem muitos mais vindos do Graphos III, um programa de edição de bitmaps.

As funções para tratamento da memória de vídeo em modo texto já estão prontas e com cores e tudo, para facilitar o trabalho usei o sistema de cores do CGA que é bem simples e divertido de codificar, um pouco de manipulação de bits e pronto.

Você pode acompanhar o desenvolvimento no github, o nome do projeto é METAL

comments powered by Disqus