Palmware を開発しませう

なぜ FreeBSD で開発するの?

開発環境の整備

Palmware を開発するには、まず開発環境を整えることが必要です。 幸い FreeBSD では ports/palm 以下にツールが揃っているので、これを利用します。 おそらく必要なのは、

でしょう。 あと開発ツールではないですが、pilot-link もいれておきましょう。 Palm 本体にアプリケーションをインストールする時などに必要になると思います。

POSE を使ったデバッグの方法

PalmOSエミュレータ on Windows

POSE を使用するためにはロムイメージが必要です。 これを入手する方法は

  1. 手持ちの Palm 機から吸い出す
  2. 各サイトからデバッグロムをダウンロードする
です。 サイトからダウンロードする場合は契約が必要になるので、しょうしょうめんどうになります。 そこで今回はとりあえず自機から吸い出しを試みます。

ロムイメージを吸い出すには pilot-link にある pi-getrom というコマンドでできます。 これを実行して HotSync すればよいです。 ただしシリアルクレードルの場合 4M 吸い出すのに3時間くらいかかりましたので、時間にゆとりのあるときにやりましょう。 吸い出しが完了したら、 pilot.rom.3.5.1(TRGpro の場合)というファイルができてると思います。 これを pilot.rom という名前に変えてから、pose を起動します。 それででてきた Palm な画面上で右クリックすればメニューがでてきますので「NEW」を選び、「Device」と「ROM file」を選んでやれば、見慣れた画面が起動します(感動の一瞬)。 ちなみにデバイスには TRGpro はなかったので Vx を選んだら動きました。

web 上のマニュアルは ここ です。

が、これで PC 上でエミュレートはできますが、gdb みたいにデバッグをするには Windows じゃないとダメそうです(探しが足りないだけかもしれませんが)。 デバッグだけは Windows 上でやったほうがいいかもしれません。

ソースファイルのひな型を作る

さて、いざアプリケーションを作ろうと思っても、普通のプログラムを書くのとは形式が結構違いますし、なによりも決まりきった構造をしています。 そこで雛型を作ってくれる 私家版 pilot-templete をありがたく拝借いたします。

ソースを見る

できたソースや SDK のマニュアルを見てみると、UInt16 やら Boolean やらと謎の単語が一杯です。 これらの正体は include/PalmType.h に書いてあります。 char などを typedef してるだけですね。

Palm と普通のプログラミングの違い

Palm のプログラムでは C の標準ライブラリが使えない場合が多いです。 例えば printf() でデバッグしようと思っても、ありません。 SDKのドキュメント を参考に

static void MyPrintF(Char* s, UInt16 x, UInt16 y, Char* formatStr, ...)
{
    va_list args;
    UInt16 l;

    va_start(args, formatStr);
    StrVPrintF(s, formatStr, args);
    va_end(args);
    l = StrLen(s);
    WinDrawChars(s, l, x, y);
}
ってなのを作って使いました。 こうすると画面上に変数の値を表示できます。 また malloc() もありません。 メモリを読み書きする場合には、一旦ハンドルというものを確保して、それを使ってロックしてからアクセスするようです。 使用後はアンロックします。 少ないメモリをやりくりするためこうなったそうです。 慣れないうちは配列にアクセスする度にコアダンプしてくれました。 こういった違いはありますが、基本的にはイベントが起ったら処理をする、といった感じで普通に書いていけばいいので、プログラムをやったことがある人ならば簡単なものはすぐ作れるようになると思います。 ちゃんとドキュメントを読めば。

アイコンを作る

勉強不足のため UNXI 上で作れませんでした。 とりあえず bitmap というコマンドがあるのは分かったのですが、これで作ったアイコンは BMP と認識されませぬ。 まあ gimp を使うっちゅう手もありましたが、牛刀っぽいので、Windows のペイントツールでつくってしまいました。 無念。

お帰りになる

Yohei Terada (youhe@cherrylain.que.ne.jp)