Desenvolvimento cruzado no MC-1000

mc1000_abertura

Meu primeiro computador¹ foi um MC-1000, um equipamento curioso e de existência efêmera lançado pela CCE na primeira metade de 1985 e descontinuado cerca de 12 meses depois. Aliás meu modelo, comprado no final de 1986, foi justamente adquirido em uma queima de estoque pois era acompanhado de 26 fitas cassete contendo jogos, pequenos aplicativos, curso de BASIC e 50 programas de exemplo.

(¹) Pois é, o MSX foi meu segundo computador, mais precisamente um HB-8000 v1.2 (o tal do “HOTBIT preto”) que ganhei na semana santa de 1988.

MC-1000 Color Computer

De forma bem sucinta é um computador equipado com Zilog Z80 e com 16KiB de memória RAM², Motorola MC6847 para produzir vídeo em até 256×192 e exibir até 9 cores e o General Instruments AY-3-8910 para cuidar da geração de três canais de áudio. Esta combinação foi bastante popular durante a primeira década de 1980 no sudeste asiático, local de onde, pelo que tudo indica, a CCE baseou seu projeto.

O BASIC é uma versão do Microsoft BASIC adaptada para ter sintaxe e comportamento parecidos com a do Applesoft BASIC (utilizado nos computadores Apple II) e que permite acesso fácil para quase todos os recursos do computador. E assim como os Apple II ele também incluía um monitor interno e acessível através do comando DEBUG (que na época eu não conseguia compreender sua funcionalidade).

Porém a a coisa mais importante a ser dita sobre o MC-1000 é que foi nele, há cerca de 30 anos, que digitei copiei meu primeiro programa! Um dos dois programas de exemplo logo no começo do manual de instruções. Este sujeito aqui:

mc1000_basic1

Que ao ser executado produzia no aparelho de televisão algo assim:

mc-1000_basic2

Assim mesmo, com direito a (simulação do) vazamento de cores do PAL-M³ que fazia  pontos pares e ímpares aparecem na tela como pseudo-cores verde e lilás! 🙂

(²) Através de uma expansão, a EM-1000, alcançava 64KiB.

(³) Efeito análogo das pseudo-cores vermelho alaranjado (tijolo?) e azul que aparece em NTSC e que foram largamente usadas pelos programadores do TRS-80 Color (outro computador que também usa o MC6847) para dar cores em um modo de vídeo monocromático.

Caixa de ferramentas

Na época programava-se diretamente em BASIC ou alimentava-se diretamente as posições de memória com opcodes de Z80 através do debugger interno. A tarefa de montagem do programa ficava por sua conta com a ajuda de uma tabela de mnemônicos, caderno e lápis mas hoje é possível utilizar um montador assembler para produzir o programa, convertê-lo e então transferir para o MC-1000 através da porta do gravador cassete.

A lista de ferramentas que podem ser utilizadas é a seguinte::

  • Atom — Não deveria indicar um editor de textos mas resolvi dar uma chance para este sujeito aqui, só é necessário instalar o pacote language-z80asm para o correto realce de sintaxe.
  • MC1000CasTools — São ferramentas escritas pelo Emerson Costa para a transferência de programas para o MC-1000 pela porta do gravador cassete. Permite converter programas (BASIC e binários) para áudio e vice-versa.
  • MESS — Como o Multi Emulator Super System emula o MC-1000 ele será usado para testar o código.
  • Pasmo — Montador assembler que utilizo no MSX e que por pura inércia uso para gerar código de qualquer coisa que tenha um Z80 dentro.

Todas rodando normalmente em versões razoavelmente atuais de Linux, Mac OS X e até Windows.

Ah sim, também é possível utilizar o SDCC e escrever código em C para rodar no MC-1000.

Carga de programas

O MC-1000 foi concebido para carregar dois formatos de arquivos da fita cassete: (i) programas em BASIC através do comando LOAD e (ii) arquivos binários pelo comando TLOAD. No caso dos programas escritos em BASIC eles são armazenados pelo comando SAVE e podem ter um um nome de até cinco caracteres. Caso o nome seja omitido o programa será executado automaticamente, comando RUN, logo após ser carregado na memória.

Os programas binários não tem nome (aliás não existe um “TSAVE” para gerá-los) e por conta de sua estrutura a área de variáveis do sistema é totalmente sobrescrita durante o carregamento — que legal! — e inviabilizando ao programa retornar normalmente ao interpretador BASIC.

Porém é possível contornar estas limitações, ela foi desenvolvida pelo Emerson Costa e consiste em gravar o programa binário em fita cassete junto de um programa em BASIC que serve exclusivamente para executá-lo. E salvando-o sem um nome ele é executado automaticamente simulando o comportamento do TLOAD em troca de um cabeçalho de 10 bytes — o “cabeçalho” para arquivos binários gasta bem mais.

Olá Mundo!

Sendo assim um “olá mundo” diretamente em assembly:

O trecho entre os rótulos mc1_TAPEHEAD e mc1_NEXTLIN correspondem ao seguinte programa em BASIC:

1 CALL 992

Para compilar o programa use:

$ pasmo -d helloWorld.asm helloWorld.bin
mc1_MSG         EQU C018
                ORG 03CB
03CB:           label mc1_TAPEHEAD
03CB:20202020   DEFB of 6 bytes
03CF:200D
03D1:D503       DEFW of 1 words
03D3:F503       DEFW of 1 words
03D5:           label mc1_TAPESTRT
03D5:DF03       DEFW of 1 words
03D7:0100       DEFW of 1 words
03D9:A2         DEFB of 1 bytes
03DA:393932     DEFB of 3 bytes
03DD:0000       DEFW of 1 words
03DF:           label mc1_NEXTLIN
03DF:0000       DEFW of 1 words
03E1:           label printMessage
03E1:21E803     LD HL, 03E8
03E4:CD18C0     CALL C018
03E7:C9         RET
03E8:           label helloWorld
03E8:4F4C4120   DEFB of 12 bytes
03EC:4D554E44
03F0:4F210D0A
03F4:00         DEFB of 1 bytes
03F5:           label mc1_TAPESTOP
03F5:           END
Emiting raw binary from 03CB to 03F4

Para convertê-lo para um arquivo de áudio e executá-lo no MESS ou mesmo eu um MC-1000 real use:

$ java Bin2Wav helloWorld.bin 
>>> Arquivo: [helloWorld.bin].
>>> Salvando para arquivo: [helloWorld.wav]
>>> Arquivo salvo.

Para testar no emulador:

$ mess mc1000 -cass helloWorld.wav -ui_active \
  -nomax -window -nofilter -resolution 640x480

Dentro do emulador digite LOAD e «Enter», depois pressione «Tab» para entrar na UI do emulador, selecione Tape Control e em seguida Play. Para sair da UI pressione novamente a tecla «Tab».

Considerações finais

Criei um repositório no GitHub para colocar tanto o programa acima como também alguns outros que escrevi, até mostrei funcionando mas que por puro esquecimento acabei não compartilhando antes.

E para conhecer um pouco mais sobre do MC-1000 visite:

  • Visite as páginas Segredos do MC-1000 do Ricardo Bittencourt (talvez a primeira página na Internet com informações detalhadas sobre a arquitetura do MC-1000) e o repositório de informações sobre o MC-1000 mantido pelo Emerson Costa (onde é possível encontrar tudo, ou quase tudo, sobre este simpático computador) e
  • Claro, ouça o episódio 50 do Retrocomputaria, o Dossiê MC-1000 (parte A e parte B)… 🙂

Até!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s