BrMSX: a história do emulador

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.

Autor: Marcellus Pereira

Compartilhar
  • FelipeBZ

    “programar em assembly pra DOS é legal, programar em assembly pra Windows é pra masoquistas apenas”

    demorou, mas ele descobriu 😉

    Interessante esse texto… O cara sofreu, hein!

  • v1r3d

    Ele sofreu, mas fez a diferença e fez algo diferente, esses exemplos que eu penso em me espelhar.

  • Shomer

    Um Computador MSX! Este é um programador de verdade, nao um empilhador de classes 😀

  • Janio Sarmento

    Show de bola!

    Quem, como eu, teve um MSX de verdade, certamente criou vínculos “emocionais” com a arquitetura, tão revolucionária para a sua época.

    Adorei o artigo.


    http://www.sarmento.org
    http://www.lucrandonarede.com

    • gemc

      Engraçado como os tempos mudam.
      Pra quem não se ligou ainda, o MSX era o computador da Microsoft. Não era fabricado pela mesma, mas foi um padrão criado pela MS e aderido por algumas empresas pelo mundo afora.
      É. Naquele tempo, a Microsoft conseguia provocar “vínculos emocionais” com seus produtos.

  • Joao Lima

    Me sinto um lixo perto de uma pessoa dessas…
    Nossa ele e um genio,alem da criatividade ainda era brasileiro.

  • Bacana, cheguei a usar o BrMSX por algum tempo mas logo depois descobri a existencia do BlueMSX e fui pra ele.