ザウルスでザウルスMI-TR1を散財しました。というわけで、ページも作って みました。
TR1は標準ソフトでは使い物になりません。 MOREソフトと呼ばれる追加ソフトで様様なアプリケーションを追加できます。 というわけで、まず手始めに各種のMOREソフトをインストールしましょう。 ソフトはザウルス宝箱Proで手に入ります。
MOREソフトは*.ZACというファイル名がインストール用のパッケージになります。 これをザウルス付属の「MORE管理ツール」でインストール作業をすることで実行 可能となります。
まず、この*.ZACファイルをザウルス上に移動させるわけですが、 メディアはコンパクトフラッシュ、或いはスマートメディア+アダプタを使いましょう。 これをPCにマウントさせ、「__ZAURUS」(アンダーバー2つ)というディレクトリを作ります。 この中に*.ZACファイルをコピーするだけです。これで「MORE管理ツール」を使 えば、実行可能になります。
しかし、このままではカード上にインストールされ、本体にインストールでき ません。そこで、ファイラーを使って、*.ZACファイルを本体にコピーします。 更に問題なのが、ファイラーを本体にどうやってインストールするかですが、
「MORE移動ツール」を使うのがいいという情報を頂きました。 でも、「MORE移動ツール」で「MORE移動ツール」を移動できるのだろうか...
本体側に「SYSTPREF.TXT」というファイル名で、
[SYST] Version=1.0 DefstartAp1=WDWW,255 AddAplKey=R,0x7bff,0x00,0x00,LNCH AddAplKey=R,0x7aff,0x00,0x00,WDWWという内容を置いておけば、電源キーでTwin File Managerが立ち上がります。
やはり、PDA端末は自分で開発をして何ぼのものです。 というわけで、SHARP純正の開発ツール SZAC をインストールしましょう。 ここで、インストールに必要なファイルは
実際の開発は Add inプログラマにおくるmoreソフト作成講座 が非常に参考になると思います。
シリアルケーブルをPCに接続するわけですが、COM1以外に接続するなら
設定変更が必要です。まず、「SZAB\Startapl\appli.rc」の中の「COM1」の文字列を
書き換えます。
また、既にプロジェクトを作成済みなら、プロジェクト内のファイルも
書き換える必要があります。そのファイルは
「プロジェクト名\アプリケーションID.rc」というファイルです。
以上で、PC側の設定は完了です。次にTR1です。
「MORE」タブの中の「MORE管理」を実行します。
そして、「機能」ボタンを押した後に、カーソルの上ボタンを押します。
そうすると、画面の下に「デバッガ1」「デバッガ2」のボタンが増えます。
ここで、「デバッガ1」を押します。そうすると、ROMモニタが起動します。
さぁ、次はデバッガの起動です。SZABからデバッガを起動すると、
ザウルスにファイルを転送を始めます。ここで、転送が始まらないと
設定ミスです。もう一度はじめからやりなおしましょう。
送信が終われば「MORE管理」を終了しておきましょう。
そして、デバッガ側から「実行」ボタンを押せばアプリが動き始めます。
デバッガを起動するときは通常のランチャー上の方が安定するみたいです。 調子が悪いときはTR1のロック解除をして、いちからやり直しましょう。 純正ソフトのランチャー上で作業しましょう。
基本的にVRAMはAPI経由でアクセスしなければいけませんが、 直接VRAMにアクセスすることも可能です。
USHORT *vram; EnableAccessVRAM(); vram = (USHORT*)GetVramTop();とすれば、VRAMにアクセスが可能です。 ザウルスのVRAMアドレスは固定でないので、 EnableAccessVRAMでVRAMにロックを掛けた後に GetVramTopでアドレスを取得します。 そして、 (x,y)ドットにアクセスするにはVGA機種では
*(vram + X + Y * 1024 )とします。 QVGA機種では
*(vram + X + Y * 2048 )です。 アクセスが終われば
DisableAccessVRAM();としてロックを解除します。 EnableAccessVRAMを発行しないと書き込みをしても反映されませんので 注意が必要です。
また、EnableAccessVRAM、DisableAccessVRAMには戻り値があります。
チェックする方がいいでしょう。
以上はTR1とE1上で動作確認をしました。
当然、他の機種ではVRAMのサイズが違うので
上記の方法ではアクセスできないと思います。
SHARPではAPI経由でのみ互換性を保証しているので、
直接アクセスは互換性が取れないというリスクを負います。
普通に一括転送するのであれば、直接アクセスしてもAPI経由より遅くなります。
よっぽどの理由がない限りはAPIを使いましょう。
VRAMアクセスをアセンブラで書いてみました。 もし、アセンブラ化を考えている人は参考にしてください。
extern void transOffscreen( void ) { USHORT *vramADdr; USHORT *dd , *ss; int y; int a; vramAddr = (USHORT*)GetVramTop(); EnableAccessVRAM(); ss = (USHORT*)GetPixMapAdrOffscreen( offScreen ); dd = vramAddr; a = WIDTH / 16; for ( y = HEIGHT/2 ; y ; y-- ) { Trans( (ULONG*)ss , (ULONG*)(ss+WIDTH) , (ULONG*)dd , a ); ss += WIDTH; dd += 1024*2; } DisableAccessVRAM(); }transOffscreen関数はOffscreenの内容をVRAMに転送します。 そして、この中で呼び出しているTrans関数は2ライン分を並列して転送します。 このTrans関数をC言語で書くとこのようになります。
void Trans( ULONG *s1 , ULONG *s2 , ULONG *d1 , int a ) { ULONG c1 , c2; ULONG *d2; d2 = d1 + 2048/4; do { c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; c1 = *s1++; c2 = *s2++; *d1++ = c1; *d2++ = c2; a--; } while (a); }8倍展開してます。さらにc1とc2に一旦代入しているのは パイプラインがストールしないための工夫です。 さて、これをアセンブラ化したtrans.sは以下のとおりです。
.text .align 4 .export _Trans void Trans( ULONG *s1 , ULONG *s2 , ULONG *d1 , int a ) ; r4 = USHORT *s1 ; r5 = USHORT *s2 ; r6 = USHORT *d1 ; r7 = int a _Trans: mov.w linenum,r3 add.l r6,r3 ; r3 = r6 + 2048 (ULONG *d2) loop: mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@r6 mov.l r1,@r3 mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(4,r6) mov.l r1,@(4,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(8,r6) mov.l r1,@(8,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(12,r6) mov.l r1,@(12,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(16,r6) mov.l r1,@(16,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(20,r6) mov.l r1,@(20,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(24,r6) mov.l r1,@(24,r3) mov.l @r4+,r0 mov.l @r5+,r1 mov.l r0,@(28,r6) mov.l r1,@(28,r3) add #32,r3 dt r7 ; r7-- bf/s loop ; 遅延分岐命令 add #32,r6 ; 遅延スロット rts ; 遅延分岐命令 nop ; 遅延スロット .align 4 linenum: .data.w 1024*2 .end引数はr4からr7のレジスタ渡しで、それ以上の引数があればスタックに 積まれます。今回は引数が4つなので、すべてレジスタ渡しです。 そして、関数の中で破壊していいレジスタはr8からr14を除いた レジスタです。 これを見れば分かるとおり、限りなく68000アセンブラに近いです。 「@」はC言語のポインタ「*」と同じような役割です。 あと、注意が必要なのはbf/s命令とrts命令は遅延分岐命令です。 この命令の直後にある命令は分岐した場合でも実行されます。 ここらへんがRISCの特徴です。
mov.l @r4+,r0 mov.l r0,@r6と書いた場合、r0への代入が完了しないと、次のr0を参照する命令は 実行できません。そのため、パイプラインがストールしてしまいます。 そこで、上のアセンブラやC言語のプログラムではストールしないために もう1つのライン転送のための読み込みを実行しています。 しかし、ザウルスではメモリが非常に 遅いせいか、ストールを回避しなくても大して速度差が出ません。 でも、movの直後にmovをおいてもストールが発生しているのかな?