Aqui está o relato de como fiz para gerar o GCC para o Motorola 68000 (o processador do Mega drive). Escolhi esse compilador porque gosto dele e pronto. Já sei utilizá-lo para a geração de programas para Linux ( e para Windows também), então me é mais familiar. Usei a mesma fonte de informações que consultei para o binutils.

É obrigatório ter o binutils compilado para 68000 instalado. Aqui, vou considerar que está instalado no diretório /opt/m68k. A instalação do novo Gcc também será nesse diretório.

A primeira coisa a fazer é obter o GNU Gcc-core. Baixei a versão 4.2.2. Ele é responsável pelo compilador básico C. A linguagem C++ e outras podem ser obtidas, embora eu acredite que só haja suporte à C para a plataforma m68k. Eu tentei habilitar a compilação para C++, mas não obtive sucesso no configure, embora talvez seja porque eu não havia baixado o Gcc-g++.
Não confirmei isso ainda.

Descompactado o arquivo gcc-core, criei uma outra pasta irmã chamada “gcc-build“. Dentro dessa pasta, executei os seguintes comandos:

$ PATH=$PATH:/opt/m68k/bin ../gcc-4.2.2/configure --prefix=/opt/m68k --enable-languages=c --target=m68k-megadrive-elf --disable-libssp --disable-libada
$ PATH=$PATH:/opt/m68k/bin make
$ su -c "make install"
Fazendo dessa forma, não obtive nenhum problema. Desativei as bibliotecas ADA e SSP porque não sei o que são, então não me servem =] Caso queira incluir outra linguagem, habilite-a a partir da opção –enable-languages. Por exemplo, se for incluir C++: –enable-languages=c,c++ . Obtendo sucesso, favor me comunicar ;) Para compilar um arquivo então, fica assim:

$ m68k-megadrive-elf-gcc -m68000 -fomit-frame-pointer -c teste.c -o teste.elf

A opção -fomit-frame-pointer serve para otimização. Há um alerta que ela pode impossibilitar depuração em certas plataformas, mas ainda não obtive problema quanto a isso. Afinal, meu depurador é o próprio emulador (generator, que compila em plataforma AMD 64-bit). O que ela faz é eliminar as instruções de passagem de argumentos em funções que não os exigem.

A opção -m68000 é repassada ao assembler, devido ao infeliz fato de ele considerar o m68020 como padrão. No specs do GCC há um campo para mudar isso. Entretanto, se eu o altero para m68000, ele simplesmente não compila. Novamente, qualquer ajuda é bem vinda ;)

Para ligação dos arquivos objetos:

$ m68k-megadrive-elf-gcc teste.elf cabecalho.elf -o final2.elf -nostdlib -dT ldscript

Ou seja, são os mesmos argumentos do GNU linker ld. Em acréscimo, há apenas a -nostdlib, para que o GCC não reclame que não há a biblioteca padrão libc para m68000.

Em uma primeira tentativa descuidada, o GCC pode emitir um aviso que não há o entry point _start. Isso deveria ser o rótulo assembly da primeira instrução do programa. Não há necessidade disso, mas para não ficar vendo esse aviso chato, digite assim no código fonte:


void main() asm("_start");



11 Responses to “GCC para Megadrive”  

  1. Olá Rodolfo!
    Procurando informações sobre o processador 68k da motorola, encontrei este seu blog, que também fala do megadrive. Também tenho interesse em sistemas antigos. Adicionei seu blog nos favoritos.

    []s!

  2. É possível programar para o Megadrive? Como? Ele tem algum modo de se obter um prompt de sistema?
    Desculpe as perguntas, é que ando lendo sobre coisas antigas (que eu adoro) tais como z-80 e 68k programming e fiquei animado.

  3. 3 aventuranolinux

    Elias, sim, é possível.

    Mas é importante que você saiba programar bem, principalmente (se em C) ponteiros. É imprescindível conhecer a arquitetura interna do Megadrive também.

    Não é o objetivo desse meu blog, então não descreverei aqui. Existem alguns sites (em inglês) que abordam esse tema… Por exemplo, o recém criado Mega Drive Research and Development Center: http://srb2town.sepwich.com/mdrdc

    Existem alguns fóruns como SpritesMind também. Procure também na Wikilivros e Wikibooks… Existem livros lá abordando isso. As linguagens que sei que há ferramentas para programar são o assembly (óbvio), C e Basic (ierrrrc).

  4. Primeiramente obrigado!

    O site é bom e tem exemplos de programas mas como coloco ele no megadrive? Como ganho um pronto de sistema (se é que existe essa possibilidade). Ou tenho que copiar o binario (de alguma forma) pra dentro do megadrive?

    Mais uma vez, peço desculpas por incomodar mas estou meio eufórico!

    Grato,

    Elias J M Torres

  5. 5 aventuranolinux

    Desculpe, não sei o que quis dizer com “pronto de sistema”.

    Quanto a colocar no Megadrive, você deveria construir e/ou comprar um cartucho e gravar o binário em sua memória. Outra possibilidade é usar emuladores com o binário formado. Lembre-se, contudo, que os emuladores não são a representam 100% real que eles pretendem ser… Mas já é um bom começo para testes.

  6. É isso ai! Você me deu a resposta! Devo gravar o executável (binário) em um cartucho. Mas como se faz isso no megadrive? Eu nunca gravei em um cartucho! É simples?
    (Ah…pronto de sistema é, por exemplo, o famoso c:\> do MS-DOS)
    Um abraço!

    Elias J M Torres

  7. Elias, não sou o dono do blog, mas acho que posso te ajudar.

    Existe à venda no mercado um tipo de cartucho regravável para o Mega Drive (e para outros consoles também). Até agora eu só encontrei em sites fora do Brasil, portanto você terá que comprá-los em dólares. Me lembro de ter visto esse mesmo produto em algum site de leilão brasileiro, mas não me lembro aonde. Aqui está um link:

    http://www.tototek.com/pio/main1/SUBMENU/PARTS/LINKS/OS/mdpro64.htm

  8. Mas depois de compilar o arquivo e gerar o binário, já está pronto para rodar no mega drive ou num emulador?

    Tipo, o binário gerado já é um rom para o mega?

  9. 9 aventuranolinux

    Estefferson,

    não. Ainda precisa convertê-lo para forma binária, já que foi gerado apenas um arquivo objeto .elf geral ao final do post (final2.elf).

    $ m68k-megadrive-elf-objcopy -O binary final2.elf enfim.bin

    Agora você terá a ROM enfim.bin para Megadrivre.

    Importante: esses passos não geram bibliotecas como o padrão ANSI C… Quer dizer que printf e malloc não existem… Nenhum função, na verdade. Você que tem que saber lidar com a arquitetura do Megadrive (vídeo, som, joystick, etc).

  10. Olá,

    Puxa, cara, agora tu me deixou triste…

    Eu tava pensando em fazer um programinha simples em c usando printf apenas para ver na tela do emulador uma frase qualquer para confirmar que deu certo…

    Mas eu vou dar uma pesquisada sobre isso e ver o que acho.

  11. Olá,

    Faz algum tempo que eu estava pesquisando sobre compiladores para o m68k e acabei baixando algumas ferramentas que encontrei nesse site:

    http://www.zophar.net/tech/genesis.html

    Tentei usar algumas, mas não consegui porque na época tava com preguiça de estudar mais. Pelo que eu pude ver, é incluido genesis.h nesses arquivos aí, mas não sei se dá para programar usando o ANSI C. Será que dá?


Leave a Reply