Meio Bit » Arquivo » Hardware » BrMSX: a história do emulador

BrMSX: a história do emulador

16 anos atrás

180px-Brmsx.logoPara os fãs do sistema MSX, um marco inesquecível foi o lançamento do BrMSX: um emulador completamente escrito em assembly e muito superior ao fMSX disponível na época (até eu dei minha microscópica contribuição, verificando algumas temporizações com os osciloscópios da faculdade).

Seu autor, o brilhante Ricardo Bittencourt escreveu sobre os dez anos de sua criação na lista MSX-rb, contando detalhes "fudebas" e o eventual abandono do desenvolvimento. Para todos que gostam de programação, é uma ótima leitura.

Provavelmente ninguém lembrou, mas dia 27 de setembro passado o BrMSX fez 10 anos de idade. Hooray pro BrMSX !

Passados 10 anos, acho que agora é tempo de abrir o baú e contar a histórias secretas do BrMSX. Por exemplo, uma delas é a história da tela de boot do 2+.

Naquela época, ninguém achava que existia emulador de 2+. Mas isso não era verdade, o fMSX emulava parcialmente algumas features na versão unix. O problema é que ele não emulava a tela de boot, então ninguém realmente levava a sério.

Quando eu coloquei a emulação de screen 12 e 10, eu previ que iria acontecer o mesmo comigo, caso eu não emulasse o boot. E, de fato, o boot não funcionava no BrMSX também.

O segredo do boot é que o MSX 2+ tem um registro secreto que controla a tela de boot. Na época, o único brasileiro que sabia da existência desse registro era o Ademir, e ele não contava pra ninguém, porque era um dos segredos comerciais dele. Só os kits CIEL tinham o registro funcionando direitinho.

Isso me deixou numa posição delicada. Se eu fizesse o release sem o boot, o povo não iria levar a sério; e consertar o boot seria muito difícil, já que eu não sabia do tal registro, e, por isso, não entendia porque o boot não funcionava.

Pra sair dessa, eu apelei. Se não ia por bem, ia por mal, hehe. A minha solução foi ignorar o boot original da bios e refazer a animação de boot do zero. Se vocês pegarem a rom que vem no BrMSX e fizerem um diff com a rom do CIEL, vão ver que o finalzinho da subrom tem um monte de diferenças, esse aí é o código que eu adicionei pra fazer o boot funcionar na raça 🙂

Mais ou menos nessa época, eu fiz o erro que matou o BrMSX. Vocês lembram que o BrMSX é feito todo em assembly, e dada a magnitude do projeto, iria ser impossível trabalhar nele se ele não fosse muito bem estruturado. Ele é todo comentado por dentro, e todo modular também, aliás foi isso que me permitiu transformar o BrMSX em BrSMS em apenas uma tarde. Não sei se vocês sabem, mas o BrMSX foi eleito melhor software criado por aluno da USP em 99, e um dos critérios do júri foi justamente a modularidade do código, eles ficaram impressionados em como um troço daquele tamanho, todo em assembly, era tão legível por dentro.

Pois bem, isso era só parcialmente verdade. O BrMSX teve um projeto muito sólido, de fato, mas apenas dentro do escopo inicial. Ele foi feito para ser um emulador operado por linha de comando, todo o código que envolvia GUI foi marretado posteriormente.

O problema era que todos os sites de emulação diziam que o BrMSX era "quase perfeito", a única coisa que faltava nele era uma GUI. Aí eu pensei, saco, lá vou eu ter que enfiar uma GUI num negócio que não foi planejado pra suportar GUI.

Acabei colocando a GUI, e o efeito psicológico foi o esperado. A GUI era uma droga, mas agora todo mundo falava que o BrMSX era perfeito, porque tinha GUI. Na verdade, ninguém usava aquele lixo, estava lá só pra marcar presença mesmo. E no final foi isso que detonou o projeto.

Na época que eu coloquei as features de MSX 2+, eu deixei passar um ponteiro perdido, que crashava o emulador caso você tentasse ligar a GUI em modo 2+. Isso foi por volta da versão 203. Mas, como ninguém usava aquela coisa, ninguém percebeu esse erro. Eu só recebi o bug report dele quando estava na versão 206. Quando eu percebi que o bug tinha sido introduzido três versões atrás, e era dentro da GUI, a única parte ilegível do código, bateu o desânimo.

Debugar aquele código ruim estava fora de questão, a única maneira era voltar no CVS três versões pra trás e reimplementar as features das versões novas. Isso iria tomar mais ou menos um mês, e nem seria tarefa difícil, só meio chata. O problema é que a essa altura eu achei que não valia a pena. Estava claro pra mim que o DOS como plataforma não tinha muito tempo de vida, se fosse pra investir um mês da minha vida em código chato, era melhor jogar fora aquela GUI de uma vez e portar pra windows.

E de fato eu comecei a fazer isso. Mas aí me veio a constatação fatídica: programar em assembly pra DOS é legal, programar em assembly pra Windows é pra masoquistas apenas. Os compiladores da época não eram a coisa mais intuitiva do mundo, e tinha um monte de truques que eu usava no código de DOS que simplesmente não funcionavam em windows. Por exemplo, o x86 tem só 7 registradores de uso geral, o que é extremamente limitante. No DOS, quando batia o desespero, eu ainda tinha uma alternativa: desligar as interrupções e usar o stack pointer pra fazer aritmética. Isso era usado extensivamente no código do PSG, e foi por isso que nenhuma versão do BrMSX para windows tinha som, já que no windows você não pode desligar as interrupções.

Depois de bater a cabeça várias vezes, eu percebi que o BlueMSX tinha uma interface boa, e melhor, tinha um programador que gostava de fazer GUI. Aí eu decidi que era a hora de pular do barco e me juntar à equipe do BlueMSX, assim eu poderia fazer só as partes que eu gostava, e a parte pentelha da interface ficava por conta do Vik.  Hoje em dia, acho que quase ninguém usa o BrMSX pra emular de fato, os poucos que ainda usam, o fazem pra usar o debugger. Ainda assim, fico feliz por ter tido uma receptividade tão boa naquela época.

___________________________________________________________________

* Reprodução permitida ao Meio Bit pelo autor.

relacionados


Comentários