SDCC - Small Device C Compiler http://sdcc.sourceforge.net/
iPad、iOS 4 に熱中している合間に Mac 上で動作する SDCC の C言語を使って、PC-G850V、PC-G850VS 用マインスイーパーを作成していました。何とか動作するようになったので、需要があるかどうかわかりませんが、下記ページで PC-G850V、PC-G850VS 用 SDCC版 Minesweeper ver 1.0 と自作のライブラリを公開します。(自作ライブラリの著作権は放棄しますので、良かったら自由に使ってください。)
PC-G850V SDCC 版 Minesweeper ver 1.0 http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html
まるひろさんの PC-G850V エミュレータを使って、拙作 SDCC 版 Minesweeper ver 1.0 実行した動画を添付しておきます。 (動画の録画には、QuickTime Player バージョン 10.0 の ‘新規画面収録’ を使用し、編集には iMovie ’09 を利用しました。)
Version 0http://www16.ocn.ne.jp/~ver0/index.htmlhttp://ver0.sakura.ne.jp/ Linux/Windows/MacOSX用ソフトウェア SHARP PC-G850/G815/E200エミュレータ g800 version 0.9.8http://www16.ocn.ne.jp/~ver0/pc/index.html#g800http://ver0.sakura.ne.jp/pc/index.html#g800
動画
http://youtube.com/watch?v=_Xf9NC514bo
公開されている SDCC 版 Minesweeper ver 1.0 はソースも含まれています。Makefile の書き方は
Pocket Game Library - INDEX http://pocketgame.web.fc2.com/ Pocket Game Library - PC-G850 GAME SDCC用ライブラリ + サンプルゲーム ギャラクシーウォール http://pocketgame.web.fc2.com/game_g.html#g04
を参考にしました。
sdcc で -mz80 を指定するとライブラリ /Developer/sdcc/share/sdcc/lib/z80/z80.lib (Mac OS X 専用パス) をリンクします。z80.lib に含まれる関数は
/Developer/sdcc/share/sdcc/lib/src/z80 $ ls README divsigned.s memmove.s mulchar.s stubs.s crt0.s divunsigned.s mod.s putchar.s crt0_rle.s fstubs.s modsigned.s shift.s divmixed.s heap.s mul.s strlen.s
/Developer/sdcc/share/sdcc/lib/src/z80/ (Mac OS X 専用パス) に関数名のファイルとして含まれています。
拙作 Minesweeper ver 1.0 を make で作成中にできる minesweeper.map を参照すればリンクされる関数名や関数の番地も分かるので PC-G850VS の機械語モニタでブレークポイント設定するのに便利です。
PC-G850VS の画面描画の仕組みについては
COSMO PATROL http://orange.kakiko.com/cosmopatrol/ 1ドットの誘惑 http://orange.kakiko.com/cosmopatrol/1dot/dot.html
で学びました。
IOCS について
SHARP PC-G850 解析資料 http://www.akiyan.com/pc-g850_technical_data
が参考になります。
Mineswepper ver 1.0 を作成中に乱数をどうやって発生させるのか、皆目見当も付かなかったのですが!たまたま、まるひろさんの
Version 0http://www16.ocn.ne.jp/~ver0/index.htmlhttp://ver0.sakura.ne.jp/ PC-G850/G815/E200用ソフトウェア PC-G850用ライブラリhttp://www16.ocn.ne.jp/~ver0/g800/index.html#libg800http://ver0.sakura.ne.jp/g800/index.html#libg800
PC-G850用ライブラリで 線形合同法を利用することを知り Wikipedia で調べました。
擬似乱数 - Wikipedia http://ja.wikipedia.org/wiki/%E7%96%91%E4%BC%BC%E4%B9%B1%E6%95%B0 Pseudorandomness - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Pseudorandom_numbers List of random number generators - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/List_of_random_number_generators
下記ページが一番理解しやすいと思います。
Linear congruential generator - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/Linear_Congruential_Generators
こんな簡単な式
で疑似乱数を発生できるのですね!
私の理解不足か、拙作 Minesweeper ver 1.0 の疑似乱数発生の周期が小さいような気がします。
SDCC - Snapshot Builds Documentation Full documentation, including HTML and PDF files; zip is for Windoze (docs) http://sdcc.sourceforge.net/snap.php#Docs sdccman.pdf
sdcc、sdasz80、sdcclib、packihx の使用方法やコマンドラインは、上記ページからダウンロードできる Zip ファイルに含まれる sdccman.pdf を参考にしました。
作成中のPC-G850用Cライブラリ - Tosikの雑記 http://d.hatena.ne.jp/tosik/20061023/1161551560
インラインアセンブラのサンプルとして上記ページも参考にしました。最近の SDCC では、文法が
誤) _asm -> 正) __asm 誤) _endasm; -> 正) __endasm;
に変更されているので注意してください。
IOCS ルーチンを C とインラインアセンブラで作成する時に
sdcc -mz80 -c --opt-code-size -o iocs.rel iocs.c iocs.c:22: warning 85: in function printchar unreferenced function argument : 'x' iocs.c:22: warning 85: in function printchar unreferenced function argument : 'y' iocs.c:22: warning 85: in function printchar unreferenced function argument : 'ascii' iocs.c:45: warning 59: function 'inkey' must return value iocs.c:45: warning 85: in function inkey unreferenced function argument : 'keycode' iocs.c:59: warning 59: function 'inkeyWait' must return value iocs.c:79: warning 85: in function vram unreferenced function argument : 'x' iocs.c:79: warning 85: in function vram unreferenced function argument : 'y' iocs.c:79: warning 85: in function vram unreferenced function argument : 'size' iocs.c:79: warning 85: in function vram unreferenced function argument : 'address'
上のような警告が表示されます。関数の引数を参照しなかったり、返り値を宣言していないためです。
警告を防ぐため
/*=====================[ iocs.c ]=====================*/ #pragma disable_warning 59 #pragma disable_warning 85 /*================================================*/
と宣言しました。
~/Minesweeper/Sources $ make sdasz80 -gl -o crt0.rel crt0.asm sdcc -mz80 -c --opt-code-size -o minesweeper.rel minesweeper.c sdasz80 -gl -o data.rel data.asm sdcc -mz80 -c --opt-code-size -o iocs.rel iocs.c sdcclib iocs.lib iocs.rel sdcc -mz80 -c --opt-code-size -o library.rel library.c sdcclib library.lib library.rel sdcc -mz80 --code-loc 0x108 --data-loc 0 --no-std-crt0 -o minesweeper.ihx crt0.rel minesweeper.rel data.rel iocs.lib library.lib -L . packihx minesweeper.ihx > minesweeper.hex packihx: read 723 lines, wrote 523: OK. ~/Minesweeper/Sources $
上のようにうまくビルドすることができました。
BASIC 版マインスイーパーと違って旗を立てたり、開いたセルに書かれている数字の数だけ、周りのセルに旗を立てて、数字の書かれたセルをスペースキーで押すと自動的に旗を立てていないセルを開くことができます。パソコン版のマインスイーパーでよくあるダブルクリック機能と同じ動作です。
SDCCの C コンパイラには、いろいろ苦労させられました。何とか動作できるものができました。
ブログとホームページ [ http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html ] にアクセス解析を設置しているのですが、ブログを検索エンジンからキーワード ‘PC-G850VS’ などで訪れる人は、私が確認した限りすべて Windows ユーザーです。
PC-G850V http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html
を訪れる人もほとんどが Windows ユーザーです。折角公開した PCG-LinkMac もあまり使われていないうようです。残念です。
私自身 VMware Fusion 上 Windows XP の SHARP 製 ‘PC-Gリンク’ で、インテルヘキサ形式ファイルの送信時にエラーが出るので ‘拙作 PCG-LinkMac’ には重宝しています。
最近の Mac だと PCG-LinkMac が正しく動作するか心配ですが!
対処方法として ’アプリケーション PCG-LinkMac’ を右クリックして ‘パッケージの内容を表示’ を選び ‘Contents/Resources/Japanese.lproj/’ フォルダの ‘Localizable.strings’ ファイル
PCG-LinkMac.app/Contents/Resources/Japanese.lproj/Localizable.strings "pcg_send_duration"="0.001"; "pcg_receive_duration" = "0.005";
上の値を変更すればうまくいくかもしれません。’Localizable.strings’ ファイルの文字コードは UTF-16 なので注意してください。