\ref{sec:c-inst-corelib}節でCC65はインストールした状態のままでも 6502-COREのプログラミングを行えると記載しました。
ここではその例を示します。
インストールしただけのCC65では、6502-COREの構成、特に入出力機能が不明なため、例えばコンソールへの文字入出力関数などをあらかじめ用意することができません。入出力機能が実現できなければ、プログラムを動かすことができないので、一般的にはプログラミングができないということになります。
CC65のコンパイルオプションに、使用する機種依存のライブラリを指定する-tというものがあります。例えばAPPLE II用にコンパイルするのであれば、-t apple2、vic20用にコンパイルするのであれば、-t vic20の様に指定します。
このオプションで使用できる機種に none があります。このnoneは具体的な機種がわからない(具体的な機種に対応していない)ことを示します。この機種を指定すると、ライブラリとして具体的には none.lib がリンクされて実行形式が作成されます。
CC65にあらかじめ登録されていない 6502-COREのプログラムを作成する場合には、この none.lib をリンクするために-t none を指定すればよいことになります。
この状態では6502-CORE固有の入出力ルーチンがないので問題ですが、自分で追加してやればいいことになります。ACIA等をアクセスする処理を書いてもいいのですが、せっかくモニタの入出力ルーチン(図?)があるので、それを使用してみましょう。
「echox.c」にキーボードからの入力をそのまま画面に出力するエコープログラムを示します。
3,4行目にそれぞれ1文字の入出力関数を定義しています。見慣れない書き方かもしれませんが、関数名にアドレスを代入して、そのアドレスの処理を呼び出せるようにしたものです。指定したアドレスは、モニタで公開している1文字入出力関数のアドレスです。
モニタの1文字入出力関数は、6502の Aレジスタで文字の入出力を行っており、CC65のC言語の関数の呼び出し規約もそのようになっているので、機能が対応するモニタルーチンのアドレスだけを指定してやれば利用できます。
#define CTRLC 0x03
void (*wexit)() = (void *)0xFF83 ;
char (*conin)(void) = (void *)0xFF98 ;
char (*conoutlf)(char) = (void *)0xFF8F ;
void main (void)
{
char c ;
while (1) {
c = conin() ;
if (c == CTRLC)
wexit() ;
conoutlf(c) ;
}
}
echox.c
下記のバッチファイルで、cc65none echoxの様に実行すれば、実行ファイルのSレコードファイルが生成されます。
PATH=C:\XENESIS\6502\CC65\bin;C:\XENESIS\SREC
cl65 -t none --cpu 65C02 -O %1.c -o %1.bin none.lib
srec_cat %1.bin -binary -offset 0x1000 -o %1%.SR
copy %1.SR + STARTVEC.SREC %1.SREC
DEL %1.SR %1.bin
バッチファイル:cc65none.bat
\ref{sec:corelib-reconstruct}節で行う 6502-CORE用のライブラリの再構築は、none.lib に不足する 6502-CORE固有の入出力関数を追加する作業になります。