6502/コモドール64でアセンブラ短歌を詠むために,アセンブラ環境を構築する方法を 説明します.
なおここではFreeBSDでの例を主に説明します.UbuntuやCentOSなどの GNU/Linuxディストリビューションでも,同様の手順でできるかと思います. apt-getなどでインストールできるツールを探してそれを利用するのが楽で いいでしょう.
まずは6502向けのコードを出力できるアセンブラが必要です. これにはZ80で説明した,asl/tpasm/asmxが利用できます.
GNUのbinutilsを使いたいところなのですが,どうもbinutilsは6502に対応していない ようです.なのでasl/tpasm/asmxのいずれかを利用するのが楽でよさそうです.
以下では一応,ひととおり使いかたを説明します.
アセンブルのサンプルに,以下のコードを利用します. コモドール64のROMのSTROUTというルーチン($AB1E)の機能を利用して 「Waka」と出力するものです.(松田さんに作っていただきました.謝々)
以下でアセンブルしてベタバイナリを生成できます.
% asl -cpu 6502 6502.asm -o 6502.p % p2bin -r \$-\$ 6502.p 6502.bin
以下でアセンブルしてベタバイナリを生成できます.
% tpasm -P 6502 6502.asm -o srec 6502.srec % objcopy -I srec -O binary 6502.srec 6502.bin
以下でアセンブルしてベタバイナリを生成できます.
% asmx-6502 -o 6502.srec 6502.asm % objcopy -I srec -O binary 6502.srec 6502.bin
コモドール64のエミュレータとしてviceがあります. FreeBSDのportsにもなっています.他にも frodo というのがあるようです.
viceはコモドール64のROMを利用しています. このROMはライセンスがちょっと不明瞭な気がします. なので一応,ライセンス回避のためにROMを利用せずにプログラム実行する 方法をここでは説明します.
サンプルプログラムではROMが持っているSTROUTルーチンを利用しています. これは文字列出力ルーチンですが,単にサブルーチン呼び出し命令で 0xAB1E という アドレスを呼び出すことで実現しています.
ということはこのAB1Eへのジャンプをラッチしてそれっぽい動作をすれば, ROMを利用することなくSTROUTの動作を実現することができます.
で,こんなパッチを作成してみました. AB1Eへのジャンプを検出すると渡された文字列を標準出力に出力するものです.
以下のようにパッチ当てしてビルドします.
~>% tar xvzf vice-2.4.tar.gz ~>% cd vice-2.4 ~/vice-2.4>% cat ~/kernal_stub.c >> src/6510core.c ~/vice-2.4>% ./configure ~/vice-2.4>% make x64 (or gmake x64) ※ パッチがC64以外のことを考慮していないので,x64のみ生成する ~/vice-2.4>% cd src ~/vice-2.4/src>% ls x64 x64 ~/vice-2.4/src>%
以下のようにして,ダミーのROMイメージを作成します.
必要なのはBIOSに相当するkernal,BASICインタプリタのbasic,キャラクタコードの chargenです.とりあえずすべて空のもので構いません.
~/vice-2.4/src>% dd if=/dev/zero of=kernal bs=1024 count=8 ~/vice-2.4/src>% dd if=/dev/zero of=basic bs=1024 count=8 ~/vice-2.4/src>% dd if=/dev/zero of=chargen bs=1024 count=4
作成したkernalを,以下のように修正します.
a9 00 48 a9 41 48 aa a9 4b 48 8a 48 a9 77 48 ba e8 8a a0 01 20 1e ab 28 28 28 28 28 60
以下で実行します.
~/vice-2.4/src>% ./x64 -kernal kernal -basic basic -chargen chargen -consoleいろいろログが出てわかりにくいのだけど,以下のように文字が出力されています. 「Waka」と出力されています.(大文字小文字が逆転しちゃってますが...)
77 w 41 A 4b K 41 A
これでいちおう文字列出力は確認できるのですが,ちと寂しいので キャラクタをビットマップ出力してみます.
そのためにはビットマップデータのchargenが必要なのですが,とりあえず 適当に作ってみたので,以下をダウンロードしてください. 単なるビットマップデータなので,自作することは難しくはありません.
~/vice-2.4/src>% cp ~/chargen.bin .パッチの「BITOUT」の部分を有効にします.
~/vice-2.4/src>% vi 6510core.c → #define BITOUT を有効にする ~/vice-2.4/src>% cd .. ~/vice-2.4>% gmake x64 ~/vice-2.4>% cd src ~/vice-2.4/src>%
以下のように chargen.bin を指定して実行します.
~/vice-2.4/src>% ./x64 -kernal kernal -basic basic -chargen chargen.bin -console今度は以下のように出力されるはずです.
w wwwww www wwwww ww wwwww wwwwww ww AA AAAAA A AA A AAA AAA AAAA AA KKKKKKKK KK KKK KK KKK KKK K K AA AAAAA A AA A AAA AAA AAAA AA
参考までに,viceのソースコードの解析結果を簡単に.
以下のように動作しています.
case 0x20: /* JSR $nnnn */ JSR(); break;
chargenはキャラクタの単なるビットマップなので,それっぽいものならば 割と簡単に作成できます.
私はbitmapというツールで1文字ずつxbm形式で作成し,スクリプトで結合して データ化しました.参考までに以下で配布します.無保証ですがどうぞご自由に.
以下のスクリプトが含まれています.