terça-feira, setembro 25, 2018

C para MSX

Existem algumas boas alternativas para programar em C para o MSX, sendo as mais conhecidas:

  • Hitech-C
  • Aztech-C
  • BDS-C
  • MSX-C
  • Solid-C

Embora todas tem seus méritos e deficiências, aqui vamos focar principalmente no MSX-C, por ser o C oficial da ASCII, que já conta com uma boa biblioteca nativa para MSX 1 e MSX 2, suportando inclusive o MSX-DOS 2.

Entretanto, nem tudo são flores, o MSX-C tem algumas limitações que podem dificultar um pouco a tarefa de programar, principalmente para iniciantes. Apenas para citar um exemplo, nativamente ele suporta apenas o tipo INT (numéricamente falando), nao tendo FLOAT, LONG ou SHORT. Isto pode ser contornado usando a bibilioteca MATH, que suporta os tipos XDOUBLE e SLONG. Na prática isso significa que você não pode ter algo como:


#include <stdio.h>

int main(argc, argv)
int argc;
char *argv[];
{
    float x,y,r;
    x = 2.45;
    y = 0.75;
    a = x + y;
    printf("Resultado: %3.2f", a);

    return 0;
}

que deve ser escrito como:

#include <stdio.h>
#include <math.h>

int main(argc, argv)
int argc;
char *argv[];
{
    XDOUBLE x,y,r;
    atoxd(&x,"2.45");
    atoxd(&y,"0.75");
    xdadd(&a,&x,&y);
    printf("Resultado: %3.2f", &a);

    return 0;
}

XDOUBLE é uma estrutura de 8 bytes e SLONG uma de 4 bytes. As rotinas do MATHPACK são relativamente eficientes, não sendo muito diferentes do que temos no MSX-BASIC, bastando apenas se acostumar com um pouco de malabarismo em contas de ponto flutuante ou inteiros longos.


Perceba que no exemplo ainda temos mais um porém que dificulta um pouco o uso do MSX-C, principalmente para quem está acostumado com C relativamente mais moderno (pós ANSI). O MSX-C foi criado um pouco antes do padrão ANSI ser definido, então ele é o que chamamos de pré-ANSI. Na verdade, algumas pessoas chamam erroneamente de padrão K&R, pois os primeiros compiladores foram baseados no livro "The C Programming Language", de Brian Kernighan e Dennis Ritchie, conhecidos como K&R. Só que isto não era um padrão de fato. A padronização veio pela ANSI apenas em 1989, e as versões do MSX-C tem as seguintes datas de lançamento:

  • Versão 1.00, Outubro de 1983. Portada do CP/M e usando instruções do 8080.
  • Versão 1.10, Junho de 1987: Nativa de MSX e usando instruções do Z80.
  • Versão 1.20, Agosto de 1988: Nativa do MSX-DOS 2.0.
Apesar destes problemas, particularmente acho o MSX-C mais eficiênte para programar diretamente no MSX do que as outras versões. Não digo eficiênte no sentido de gerar código super otimizado, mas no sentido de que a programação flui bem por conta das bibliotecas. Um detalhe que percebi em meus programas é que, por exemplo, o processo de compilação é um dos mais demorados, principalmente comparado com o Hitech-C, porém o executável em si é ligeiramente mais rápido, novamente comparado com o Hitech-C.

Para finalizar, é claro que estamos falando de programar diretamente no MSX, o que é tortuoso por natureza (embora eu adore), querendo suporte para ferramentas mais modernas, você pode utilizar o SDCC (que aliás, por estes dias, recebeu um ótimo pacote de bibliotecas nativas para MSX, chamdado de FUSION-C, que pode ser baixado AQUI e inclusive acompanha um livro que pode ser adquirido na AMAZON, eu já garanti minha cópia e aguardo ansiosamente a sua chegada).

Ainda existem outros compiladores como o z88dk e o ccz80 / ccz80++, que apesar de não serem diretamente C, são muito próximas e tem bibliotecas para MSX também.

O Hitech-C poderia ser uma opção de cross compiler também, porém a versão mais recente ainda é para MS-DOS, e não está mais disponível para compra, o que gera uma camada a mais de complicação. O saudoso Adriano Cunha também usou um emulador CP/M que permitia usar o Hitech-C de CP/M no MS-DOS, mas hoje também gera uma camada de complicação desnecessária, sendo mais fácil programar diretamente no MSX.

Eu particularmente uso dois ambientes, o MSX real (um Turbo-R GT, com 4Mb de mapper externa, e uma SD/Mapper de 512Kb), uso o MSX-C 1.2, como editor uso o MED (o de MSX 2.0) e o AKID, e jogo tudo em RAMDisk para acelerar o processo de compilação. O outro ambiente é no PC, onde uso o UltraEdit com suporte de sintaxe para Z80 (M80/L80) e MSX-C, e usdo o OpenMSX montando o diretório do arquivos .C, a compilação eu faço com um script que acelera o emulado ao máximo. Em ambos os casos sempre utilizando um mínimo de MSX 2.0 com Mapper e MSX-DOS 2.0, mesmo quando o programa não necessitaria destes recursos.

O objetivo desta série de artigos é simplesmente mostrar que podemos nos divertir programando em C para MSX, já que no geral os usuários tem uma ideia de que tirando ASM e BASIC, temos apenas o Pascal, mas o C é mais eficiente do que o Pascal, permite a compilação por módulos, permite linkar com programas em ASM sem usar INCLUDE, e é uma linguagem mais próxima ao hardware.

Vou comentar sobre outros compiladores, mas no geral os artigos vão ser baseados em MSX-C principalmente e em SDCC secundáriamente.

Não sou EXPERT (sic) em MSX, em C, em BASIC ou em ASM, não confie totalmente nestes artigos, procure mais informações e experimente. Tudo que escrevo é únicamente baseado na minhas experiência e nos equiapmentos que possuo.


Nenhum comentário:

Postar um comentário