Querendo usar ferramentas GNU para criar softwares (jogos?) em liguagem assembly e/ou C para Mega Drive, fui em busca do binutils para ter um assembler para Motorola 68000 (o processador do console).

Aqui está como eu fiz para gerar meu gas – o GNU assembler – (meus passos foram baseados na fonte Marc’s Realm):

Primeiro, obtive a versão mais nova do binutils, que no caso foi a 2.18. Então, descompactei o arquivo com “tar jxf binutils-2.18.tar.bz2″. Ele cria uma pasta chamada binutils-2.18.

Criei um diretório chamado binutils-build, onde ficará os arquivos de compilação do binutils, deixando a árvore do código fonte intacta.

De dentro desse diretório, via terminal, chamei o script configure do binutils:

$ ../binutils-2.18/configure --prefix=/opt/m68k --target=m68k-megadrive-elf --disable-libada --disable-libssp

Lembrando:

  • –prefix diz a pasta onde será instalado o programa pelo comando make install. É opcional, mas prefiro não deixar nas pastas convencionais.
  • –target indica para qual arquitetura e/ou processador as ferramentas gerarão o código.
  • O alvo (m68k-megadrive-elf) é dividido em 3 partes: X-Y-Z, sendo X o processador (família m68k), Y é o nome da plataforma (à escolha: linux, jumento, unknown, etc.), e Z é o formato do arquivo de saída (no caso, elf).
  • –disable-libada desabilita a compilação da biblioteca ADA, completamente desnecessária para o meu caso.
  • –disable-libssp inibe a compilação da biblioteca SSP, que não sei para que serve, então não preciso ;)

Após realizada a geração dos makefiles, hora de gerar os binários!

$ make

Feito isso com sucesso, basta instalar as ferramentas como super-usuário (root):

$ su -c "make install"

Lembre-se de colocar o diretório do prefix (caso tenha usado essa opção) na variável de ambiente $PATH para atalhar as coisas!

export PATH=$PATH:/opt/m68k

Inclua isso, por exemplo, no arquivo .bashrc.

Agora, terás o assembler (e outras ferramentas úteis) para m68k!

  • m68k-megadrive-elf-as: o assembler
  • m68k-megadrive-elf-objcopy: converte de elf/coff para binário
  • m68k-megadrive-elf-ld: o linker

Para gerar um arquivo binário para o Megadrive, deve fazer:

$ m68k-megadrive-elf-as -m68000 codigo.s -o codigo.elf
$ m68k-megadrive-elf-objcopy -O binary codigo.elf codigo.bin

Et voilà! Seu jogo em formato direitinho pro Megadrive e emuladores.

Inconveniente do processo: O assembler gerado é para a família m68k, isso quer dizer que variantes como 68010 e 68020 também podem ser montados. Como o Mega só usa o 68000, os programas são desnecessariamente maiores. E o pior: o 68020 é dado como padrão. Isso implica em ficar definindo toda vez que for montar que o processador é o 68000 e não o 68020. Só descobri uma forma de definir o 68000 como único processador de montagem: ao realizar o configure do binutils, definir o alvo (target) como m68000-megadrive-elf. Entretanto, isso elimina a opção -m68000 (desnecessária, agora) do assembler, o que estraga as coisas para a compilação do gcc, que mostrarei em um post futuro…

Se alguém souber como definir pro assembler o processador 68000 como padrão, agradeço.



15 Responses to “Gerando um assembler para SEGA Mega Drive (Genesis)”  

  1. Gostaria de dizer que fiquei muito entusiasmado com isso, imagine poder programar pro Mega num PC! Isso é muito massa!

    Qual a linguagem que o programa tem de ser escrito para poder compilar com essas feramentas? C? Assembly? Uma outra linguagem mais específica?

    Outra coisa, desculpe minha igonorância, mas que é “gas”?

    Em qual distribuição tu executaste a compilação destas ferramentas? Ouvi dizer que qualquer procedimento relativo a compilação é melhor no slackware, mas gostaria de saber se posso realizá-lo no Kurumin, isto é, sem muitas dificuldades.

  2. 2 aventuranolinux

    Estefferson:
    O GNU criou compilador C e montador (assembler) para o processador Motorolla 68000 (que é o mesmo do Megadrive).
    Dessa forma, com o GCC (compilador de C do GNU), podemos programar para o megadrive. Como também disponibilizam o GAS (GNU ASsembler) para esse chip, podemos também programar em assembly de m68k.

    Minha distribuição é o Debian, mas pode usar qualquer uma: basta instalar o GCC da sua plataforma (sim, você usa o GCC para gerar o GCC hehe). O Kurumim já vem com ele pré-instalado.

    Com isso, basta seguir os passos descritos neste post para gerar o assembler (GAS) e depois procure o outro post referente ao GCC (deve ser feito nesta ordem: não é possível gerar um compilador C para a plataforma sem um assembler para ela – no método GCC).

    Qualquer dúvida, só falar!

  3. Olá,

    Cara, deu um erro desse tipo aqui:

    make: ** [all] Erro 2

    Depois dei um make install mas na última linha tinha:

    make: ** [install] Erro 2

    Ainda com esperança de encontrar os binários fui em /opt/m68k e lá só tinha um diretório /usr/share com váriuos arquivos que aparentam serem relativos a idiomas, do tipo .mo

    O que deu errado?

  4. 4 aventuranolinux

    Estefferson,
    o script configure funcionou?

    A única saída do make foi apenas essa?

    Qual a versão utilizada do binutils?

  5. Sobre o configure, o que eu posso dizer é que foram muitas, muitas linhas de saída, assim, como o make e o make install.

    E eu utilizei a versão referida na tua postagem, usando o mesmo link de download.

    Como disse o configure, o make e o make install geraram muitas saídas, mas as linhas que aparentam dar erro, são essas duas que pude notar.

  6. 6 aventuranolinux

    Estefferson,
    mudei o tema para ver se fica melhor de ler a linha completa do comando configure. Repetirei aqui:
    $ ../binutils-2.18/configure –prefix=/opt/m68k –target=m68k-megadrive-elf –disable-libada –disable-libssp

    Não adianta executar make install, sem que o make tenha sido corretamente executado.

    E as linhas de saída mencionadas não ajudam a descobrir qual foi exatamente o erro ;) Tente mostrar umas linhas anteriores. Mas, primeiro, confira se executou o comando configure com todos os argumentos.

    Qual a sua distribuição linux?

  7. Eu uso o Kurumin 7.

    Vou executar de novo de acordo com os passos indicados e volto em breve com a resposta.

  8. Olá,

    O saída dos comandos tar, configure e make estão aqui:

    http://geocities.yahoo.com.br/darkchet2003/relatorio-m68k.htm

  9. 9 aventuranolinux

    Estefferson,
    um erro ocorre aqui:
    chmod: mudando permissões de `SRC-POTFILES-t’: Operação não permitida
    make[3]: ** [SRC-POTFILES] Erro 1

    e isso é captado desde o configure:
    chmod: changing permissions of `conf16245.sh’: Operation not permitted

    e ao, fim do configure:
    chmod: changing permissions of `./config.status’: Operation not permitted
    chmod: changing permissions of `conf17761.sh’: Operation not permitted
    config.status: creating Makefile

    Por que você não tem permissões de alterar as… permissões?

    Quando o configure conclui corretamente, vai exibir uma lista de Makefile criados em cada pasta…

    Para ter certeza de que o configure concluiu corretamente, faça o seguinte:

    $ COMANDO_CONFIGURE_LISTADO_NO_BLOG && make

    Os 2 e-comerciais && fazem com que o comando seguinte só seja executado caso o anterior tenha terminado com sucesso.

  10. Consegui cara! Bastou dar os comandos como root! Aí ele compilou redondinho, gerando os binários!

    Agora vou gerar o gcc para m68k!

    Valeu demais!

  11. 11 aventuranolinux

    Exceto para o “make install”, não seria necessário estar como root…
    Você estraiu para alguma pasta inadequada (que você não tem livre acesso)?

  12. Deve ter sido porque eu estava usando a pen drive pra compilar. Tive que usar porque estou fazendo isso num computador da biblioteca do meu curso, é um PII antigo com pouco espaço no HD, menos de 50 mb, para falar a verdade. Por causa disso tive de usar a pen drive, que tinha espaço de sobra.

  13. 13 aventuranolinux

    Sim, era por causa de ser um pendrive mesmo. Eles são convencionalmente formatados no sistema FAT, que não oferece suporte a permissões…


  1. 1 GCC para Megadrive « Aventura no Linux
  2. 2 Gerando um assembler para Z80 (Sega Master System ou Sega Megadrive) « Aventura no Linux

Leave a Reply