2014年9月12日金曜日

BDS C の使い方 - MSXで使ってみる

>BDS C の使い方 - 目次

パブリックドメインの C コンパイラ、 BDS C を MSX で使ってみます。今回は画面キャプチャが容易なエミュレータを使用しましたが、実機でも同じように使用できます。
BDS C の概要は BDS C の使い方 - とりあえず使ってみる などをご覧ください。


インストール


インストールと言っても、必要なファイルをコピーするだけの簡単な作業です。
配布されている ZIPファイル (bdsc-all.zip) から、以下のファイルを MSX-DOS の起動ディスク(のルートディレクトリ)にコピーするだけです。
bdsc160\
    CC.COM           コンパイラ本体
    CC2.COM          コンパイラ本体2
    CLINC.COM        リンカ
    DEFF.CRL         標準ライブラリ
    DEFF2.CRL        標準ライブラリ2
    C.CCC            スタートアップルーチン

bdsc160\work\
    STDIO.H          標準ライブラリのヘッダファイル


Hello, world!


実際に Bドライブ に用意した hello.c をコンパイルしてみました。
cc b:hello             コンパイル(CC2は自動的に呼び出されます)
clink b:hello          リンク

コンパイルとリンクが正常に終了したら、出来上がった hello.com を実行してみます。
b:hello

"Hello, world!" と表示されたら成功です。

その時の、MSXの画面の様子はこんな感じ。

BDS C には Z80 の I/Oポートを直接アクセスする関数があるので、MSX の VDP を直接操作するプログラムを作ってみます。

/*
    BDS C でMSXのI/Oを直接操作してVDPをいじってみる
*/

#define VDP 0x98

main()
{
    char count;

    outp(VDP+1,0);           /* VRAM アドレスセット */
    outp(VDP+1,0x40);        /* VRAM アドレスセット 書き込み指示 */
    for(count=0xFF; 0!=count; count--)
    {
        outp(VDP,count);     /* VRAM 書き込み 自動インクリメント*/
    }
}

ここで使った outp() なんかの便利な関数は、マニュアルの Chapter3 で簡潔に説明されていますし、ソースコード(DEFF2A.CSM DEFF2B.CSM)も付属していますので見てみてください。英語だけれど見ればわかる程度の文章です。
BASICによくある、メモリを直接読み書きする PEEK POKE 関数や、レジスタに値をセットして指定アドレスを CALL する 関数、BDOSコール、メモリのブロック転送なんかも有って便利に使えそうです。

コンパイルして実行してみると

動きました。
動いたのですが、VDPのアクセス中に、割り込みを禁止しなければならない所でそれを行っていないので、この例では VRAMアドレスの指定がきちんと出来ていません。

というわけで、マシン語とのリンクに続きます。

>BDS C の使い方 - 目次