PC-G850V、PC-G850VS 用 SDCC版 Minesweeper ver 1.0

SDCC - Small Device C Compiler
http://sdcc.sourceforge.net/

iPadiOS 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 0
http://www16.ocn.ne.jp/~ver0/index.html
http://ver0.sakura.ne.jp/
Linux/Windows/MacOSX用ソフトウェア
SHARP PC-G850/G815/E200エミュレータ g800 version 0.9.8
http://www16.ocn.ne.jp/~ver0/pc/index.html#g800
http://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 0
http://www16.ocn.ne.jp/~ver0/index.html
http://ver0.sakura.ne.jp/
PC-G850/G815/E200用ソフトウェア
PC-G850用ライブラリ
http://www16.ocn.ne.jp/~ver0/g800/index.html#libg800
http://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

こんな簡単な式

{X_{\fs{+1}n+1}  = (a{X_{\fs{+1}n} + c) \text { mod m}

で疑似乱数を発生できるのですね!

私の理解不足か、拙作 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 FusionWindows XPSHARP 製 ‘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 なので注意してください。

RemoteKey

RemoteKey
カテゴリ/ユーティリティ
\230
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=301472359&mt=8

技術的に興味があったので購入してみました。無線 LAN 環境が必要です。(Mac に AirMac カードが内蔵されていれば、利用できます。設定方法は、下の URL の右下 ‘外出先での接続方法’ を参考にしてください。)

RemoteKey
http://hmdt.jp/remotekey/index-jp.html

iPod touch 上で RemoteKey を動作させた後、上の URL から ダウンロードし、Mac 上にインストールした RemoteKey Connect を起動します。
Devices (私の場合は iPod touch) を選んで Connect ボタンを押します。これで Mac の RemoteKey Connect で入力した文字が iPod touch の Remotekey に表示されます。
RemoteKey Connect で Mail ボタンを押せば iPod touch 上のメールが起動し、入力した文字列が本文として入力されています。RemoteKey Connect を終了するには、メニューバーの右端のアイコンからメニュー ‘Quit RemoteKey Connect’ を選択してください。

動作原理を調べてみました。間違っている記述もあると思いますが、メモとして残しておきます。

RemoteKey は Bonjour を利用して Mac と iPhone または iPod touch 間で動作します。
サンプルコード WiTap が参考になりそうです。(ソースを覗いてみましたが、私には理解するのに苦労しそうです。) WiTap は Bonjour を利用して2台の iPhone で 動作します。もちろん iPhoneiPod touch でも動作します。

WiTap
http://developer.apple.com/iphone/library/samplecode/WiTap/index.html
(iPhone Dev Center に登録していないと閲覧できません。)

私自身、iPod touch 1台しか所有していないので、WiTap を iPod touch 32GB、iPhone Simulator.app にそれぞれインストールして、両方の WiTap を実行し動作確認しました。WiTap は、カラーパッドをタップすると、もう一方の端末の WiTap のカラーパッドが点滅します。

iPod touch 上の ‘メール’、’マップ’ を起動するには NSURL、NSApplication を利用します。
‘メール’ を起動する例です。

	UIApplication *application;
NSURL *url;
url = [NSURL URLWithString:@"mailto:foo@me.com"];
application = [UIApplication sharedApplication];
[application openURL:url];

また、自分が作成したアプリケーションに Custom URL Schemes を登録して、他のアプリから起動させることもできます。動作確認には iPod touchiPhone Simulator.app 上の Safari の URL に Custom URL Schemes を含んだ URL を入力して試すと良いようです。下の例では URL は “xyzlist://Sample.koyama.jp/?test#20090221” です。

-- 起動されるアプリケーションの Info.plist (今回の例ではアプリケーション名 Sample) --
▼ Information Property List
▼ URL types
▼ Item 1                    : jp.koyama.Sample
URL identifier
▼ URL Schemes
Item 1               : xyzlist
//アプリケーション Sample を起動させるソースコード
UIApplication *application;
NSURL *url;
url = [NSURL URLWithString:@"xyzlist://Sample.koyama.jp/?test#20090221"];
application = [UIApplication sharedApplication];
[application openURL:url];

下記の URL が参考になります。(ただし、以降に出てくる Apple の URL は iPhone Dev Center に登録していないと閲覧できません。)

iPhone Application Programming Guide: Customizing Your Application’s Behavior
http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/chapter_3_section_6.html#//apple_ref/doc/uid/TP40007072-CH7-SW22
The Core Application
Customizing Your Application’s Behavior
Communicating with Other Applications

The iPhone Developer's Cookbook: Building Applications with the iPhone SDK (Developer's Library)
Erica Sadun
10 Connecting to Services
Recipe: Subscribing Application to Custom URL Schemes
P303

上の本も参考にした方が理解しやすいと思います。また、’The iPhone Developer’s Cookbook’ [ asin:0321555457 ] は、

日本語に翻訳された本 ‘iPhone デベロッパーズ クックブック’ [ asin:4797352418 ] が発売されています。

他のアプリケーションから起動されたアプリケーションは

UIApplicationDelegate Protocol Reference
http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html
Opening a URL Resource
- application:handleOpenURL:  optional method  

が呼び出され、起動します。

//   アプリケーション Sample の UIApplicationDelegate
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//   url = @"xyzlist://Sample.koyama.jp/?test#20090221"
NSString *taskName = [url query];
NSString *dateString = [url fragment];
NSLog(@"%@ %@", taskName, dateString);
}

起動されるアプリケーション (上の例では Sample) の UIApplicationDelegate に上のソースを追加し、iPhone Simulator.app の Safari で URL “xyzlist://Sample.koyama.jp/?test#20090221” で起動させると、/アプリケーション/ユーティリティ/コンソール.app の ‘ログ・データベース・クエリー/コンソールメッセージ’ で下のメッセージを見つけることができます。

09/02/21 18:49:35 Sample[3392] test 20090221

また URL を利用して渡される値は下記の URL を参考にしてください。’メール’、’マップ’ を起動する時に渡すパラメーターが、Mail、Phone、Text、 Map、YouTubeiTunes Links としてそれぞれ説明してあります。

Apple URL Scheme Reference: Introduction
https://developer.apple.com/iphone/library/featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007891
NSURL Class Reference
https://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/doc/uid/20000301-4355
RFC 1808 - Relative Uniform Resource Locators
http://tools.ietf.org/html/rfc1808

Search2chBBS

2ch の BBS から subject.txt や dat などをダウンロードして遊んでみたのですが、スレ一覧の gzip 取得がうまくいきませんでした。後、ソースが公開されている複数の ‘2ch ブラウザ’ も参考にしました。

BBS MENU for 2ch

monazilla

2ch ブラウザ開発資料

掲示板一覧の仕様 bbsmenu

PocketPC用のあらたな2chブラウザ