ABA Games

Hello Worldまでの遠い道のり


人はなぜラピュータにJavaを載せるか

無理無茶無謀な感覚にあふれているから。(19字)

ruputer_sga でも、当初はそれほど無茶とは思ってなかったんです。 WabasoftがWabaをver1.0からGPL (いくら改変してもいいけど、ソースを必ずつけてねっていうポリシーのライセンス。ざっぱに言えば) で提供した時、「これはとりあえずなにかに移植せねば!」と 脊髄反射で考えてしまったのがことの起こりで、そのとき真っ先に思いついたのが ラピュータだったんです。Palmよりも小さくておもしろそうなデバイスって いったら、ラピュータが適任だと。しかも開発環境付き。

で、久しぶりにラピュータの情報を収集し始めたところ、 これがほとんど「死にハード」ってことが分かってきてしまった。 総本山のBBSを見ても、 「ツクモで見掛けました。これが最後の入荷みたいです。 今ゲットしないと一生手に入らないかも」とかいう感じらしい。

でも、このことは「今なら捨て値で買える」ということと 等価であるので、なにも考えずにものを買いました。 BBS情報の秋葉原のツクモで。最後の4MBモデルを\9,800-なり。 8MBはまだちょっと余っていたので、そこの新しくないもの好きの 彼、彼女は速攻ゲットで大後悔だぜ!

ラピュータとメモリと私

ちょっと話が戻ります。

ruputer_logo 実際に買う前、カタログスペックとか調べたり、アプリ開発している 人々のページを斜め読みしたりしてた頃、 開発者の方々が、「メモリが足りない」「メモリがすぐなくなる」 とさかんに嘆いているのが気になってました。そこでスペックを見てみると、 「ワークメモリ 128K」という記述が。「128Kで足りないとは贅沢な」 と思いつつ、WabaのPalm用実行ファイルのサイズをチェック。74K。

「おっけー。これならあと54Kほどをクラスヒープやオブジェクトヒープに 割り当てて問題のし」。短絡思考のわしはこの時点でものを買ってしまいました。

これが大間違い。

買ったあと開発用ドキュメントをダウンロードして、メモリマップをみて愕然。 「0x110000までは予約されています」。がびーん。 「ユーザは残りの64Kが使用可能です。アプリケーションサイズは50K程度が 限界でしょう」。

やってしまいました。結局64Kしか使えないのか。するとだな、Palm用のWabaから 計算すると、VMと基本クラスライブラリをラピュータにいれようとすると、 「メモリから溢れる」計算になるなあ。いやー、参った。これは一本取られましたな。

納得している場合ではありません。ここでへこたれていては負けなので、 ちょっと考えてみます。

Wabaは昔はこんなに大きなサイズではなかったはず。 こんだけ肥大化したのは、ファイルやらカタログやらシリアルポート やらのサポートがされてきて、Wabaが重装備になってきた頃からだ。 すると、これらのサポートをすっぱりやめてしまえば結構何とかなるのでは。 いや、なんとかなる。なんとかなることにしよう。

ゴーサインが出ました。自分で自分に。かなり不安です。

美しきソースのWaba

また話が戻ります。

get waba WabaがGPLになった時、とりあえずWabaVMソースをダウンロードしてみました。 第一印象は、「これは結構移植しやすいかも」でした。 こういう印象を持ったのは、WabaVMソースが非常に整理された形で提供されて いたためです。細かいことは以下を見てください。

私はWabaVMをラピュータに載せることが史上命題だったので、 とりあえずnmport_?.cを中心に読んで、「とりあえず必要最低限の関数を 実装するくらいならなんとかなる」と思い込んでいました。

で、いざものを手に入れてから、上で言ったメモリの問題にぶちあたったわけです。

無能VM作成

ラピュータ本体も、開発環境も、VMソースもそろいました。 あとは開発するだけ、なのですが、なにぶんメモリが足りるか不安です。 で、とりあえず、「プラットフォーム固有機能がなにもついていない無能VM」を 作ってみて、そのサイズを測ってみよう、ということにしました。

無能VMの作り方は以下の通り。nmport_?.cファイルを、 nmruputer_?.cにコピーしておきましょう。 あとwaba.cで#define RUPUTER 1とか、その辺をやっておくこと。

むちゃくちゃ不安だ。とりあえずメイク。リンクエラー。なぜ。

CodeWarrior for Ruputerの使い方を学ぼう

Ruputer総本山から、 Ruputer用のCodeWarriorがタダで落せます。 CodeWarriorがタダとは、いい時代になったものです。

で、デフォルトプロジェクトを元に、main.cの代わりにwaba.cを追加して メイクすればいいかと思っていたのですが、結果は上記のリンクエラー。

数時間悩んだあげく、わかったことは「main.cを外してはいけません」 ということ。main.cを開始点にしなけきゃいけないのね。分かりませんでした。

これでばっちり。メイク。今度はアセンブラのエラー。 えーと、どうもuint32を配列の添字にしているのがお気に召さないらしい。 ラピュータはインデックス用のレジスタが24bitだってのを、 どっかでみたことがあるので、そのせいかも。24bit長のタイプなんて あったかな。分からないや。いいや、こう

//static uint32 vmStackPtr;
static uint16 vmStackPtr;
してやる。参ったか。(すげー不安)

でもとりあえず、実行形式ファイル(exfファイル)はできた。 サイズは、33Kくらい。うーむ、かなり微妙な大きさだ。 クラスファイルに使えるサイズが17Kくらい。 あ、あとラピュータネイティブの関数をちゃんとかかなきゃいけないし。 これはかなり苦しいのでは。

HelloWorld専用VM作成

苦しいので、とりあえず以下のクラスが動作するVMを目標にする。

import waba.ui.*;
import waba.fx.*;

public class MainClass extends MainWindow
{
public void onPaint(Graphics g)
  {
  g.setColor(0, 0, 0);
  g.drawText("Hello World", 0, 0);
  }
}
これが動いたら私の「勝ち」(?)ということにしよう。 HelloWorldしかできない、HelloWorld専用VMだ。使い道なし。

で、先ほどめためたな作り込みをした各ソースを書き直す必要があります。

とりあえずこんなところ。できあがったexfファイルとクラスファイルを 転送します。

実行する前に分かった。だめだこりゃ。

「ラピュータは8文字+3文字のファイルしか扱えない」のね。 「MAINCL~1.CLA」とかなっちゃって、どうしましょ。

WARPファイルからクラスファイルを読む

解決方法はある。Palm用CE用Wabaで使っている、 クラスファイルアーカイブツールWarpでできるファイルから クラスを読み取るようにすればいい。 幸い、アーカイブのデータ形式は、 warp file format に公開されている。

アーカイブには、Palm用のpdb形式と、CE用のwrp形式があるが、 Palm用はちょっと特殊な形式なので、今回はwrp形式を使うことにする。 nmwin32_b.cを参考に、nativeLoadClassを書き換える。 後は、必要なクラスファイルをWarpで固めて、これもラピュータに 転送すれば良し。オッケー。実行。

「システムエラー」
「リセットしてください」

なんでそういうことをいうかなー。

クラスファイルの縮小

いろいろ試してみた結果、どうもメモリが枯渇すると、 「システムエラー」とおっしゃるらしい。ラピュータ様は。 とうとうこのフェイズに来てしまった。 サイズの削減をします。

まず分かりやすいところで、Waba基本クラスライブラリ群のクラスを 縮小します。とりあえず、UIまわり(waba.uiパッケージ)のクラスが やたらと容量を食っているので、こいつらをどうにかする。

現状では、まともなUIなど再現するつもりもなく(そもそもマウスやタッチパネルに相当するものが ラピュータにないのだから、やるだけ無駄)、UIまわりはばっさり切ってしまう必要があります。 そこで、Buttonなどのクラスを削るとともに、これらのControlerを管理するContainerクラスを ばっさり削除、それにともなってWindowクラスなども大幅に削減します。

waba.cの縮小

あと、VM本体、つまりwaba.cを小さくする必要もあります。 簡単なサイズ削減方法として、以下のようなことをやってみました。

あまりできることはありません。とりあえずお手軽にできるところまで。

ここまでやって、ファイルサイズは以下のとおり。 waba_filer

足して47Kバイトというところか。クラスやオブジェクトヒープを考えるとかなりぎりぎり。

Hello World

この後、Cの仕様やラピュータの仕様がわからなく、かつラピュータのPC上のエミュレータが ないせいもあって、かなり苦しいデバッグ作業があったのですが、とりあえず割愛。

とりあえず出来上がったWABA.EXFとCLASSES.WRPを転送して、WABA.EXFを実行。

Hello World

やったぜ、父ちゃん! これでばっちりだ。Hello Worldって画面に出て、こんなにうれしかったのは 生まれて初めてだ。

今後

今後は考えたくない。とりあえず現状だと、HelloWorldを出すだけでメモリがかつかつという、 史上まれにみる役立たずプログラムになってしまう。なんとかもうちょっとメモリをけちらないと だめです。

なにかいい方法あるかなあ。先行きは暗いぞ!


Rerurn もどる