Zaurus MI-TR1のページ




since 2001.2.13
Last-modified: 2001.4.10

ザウルスでザウルスMI-TR1を散財しました。というわけで、ページも作って みました。

目次

  1. Zaurus掲示板
  2. フリーソフトのページ
  3. エミュレータのページ new
  4. MOREソフトのインストール
  5. 起動時の実行アプリ設定
  6. 開発ツール SZAB
  7. デバッガの使い方
  8. VRAMへの直接アクセス方法 new
  9. アセンブラによるプログラム

MOREソフトのインストール

TR1は標準ソフトでは使い物になりません。 MOREソフトと呼ばれる追加ソフトで様様なアプリケーションを追加できます。 というわけで、まず手始めに各種のMOREソフトをインストールしましょう。 ソフトはザウルス宝箱Proで手に入ります。

MOREソフトは*.ZACというファイル名がインストール用のパッケージになります。 これをザウルス付属の「MORE管理ツール」でインストール作業をすることで実行 可能となります。

まず、この*.ZACファイルをザウルス上に移動させるわけですが、 メディアはコンパクトフラッシュ、或いはスマートメディア+アダプタを使いましょう。 これをPCにマウントさせ、「__ZAURUS」(アンダーバー2つ)というディレクトリを作ります。 この中に*.ZACファイルをコピーするだけです。これで「MORE管理ツール」を使 えば、実行可能になります。

しかし、このままではカード上にインストールされ、本体にインストールでき ません。そこで、ファイラーを使って、*.ZACファイルを本体にコピーします。 更に問題なのが、ファイラーを本体にどうやってインストールするかですが、

  1. ファイラーの*.ZACファイルをカード上にコピー
  2. カード上にファイラーをインストール
  3. ファイラーの*.ZACファイルをカード上にコピー
  4. ファイラーを使って、*.ZACファイルを本体にコピー
  5. ファイラーをアンインストール
  6. 本体上にファイラーをインストール
という方法を取りました。もっとシンプルな方法があるかも知れませんが...

「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が立ち上がります。

開発ツール SZAB

やはり、PDA端末は自分で開発をして何ぼのものです。 というわけで、SHARP純正の開発ツール SZAC をインストールしましょう。 ここで、インストールに必要なファイルは

  1. SZAB_Trial421_200003_1.EXE
  2. SZAB_Trial421_200104_2.EXE
  3. SZAB_Trial421_doc.lzh
  4. SZAB_Trial421_pdf.lzh
です。さらに patchが、
  1. Szab43Up_full.exe
  2. tcpipv106.lzh
  3. assh.lzh
  4. update20000728.lzh
  5. lib20001110.lzh
  6. lib20010228.lzh
です。 基本的に、この順番にpatchを当てましょう(2001年3月9日現在)。

実際の開発は Add inプログラマにおくるmoreソフト作成講座 が非常に参考になると思います。

デバッガの使い方

シリアルケーブルをPCに接続するわけですが、COM1以外に接続するなら 設定変更が必要です。まず、「SZAB\Startapl\appli.rc」の中の「COM1」の文字列を 書き換えます。 また、既にプロジェクトを作成済みなら、プロジェクト内のファイルも 書き換える必要があります。そのファイルは 「プロジェクト名\アプリケーションID.rc」というファイルです。
以上で、PC側の設定は完了です。次にTR1です。 「MORE」タブの中の「MORE管理」を実行します。 そして、「機能」ボタンを押した後に、カーソルの上ボタンを押します。 そうすると、画面の下に「デバッガ1」「デバッガ2」のボタンが増えます。 ここで、「デバッガ1」を押します。そうすると、ROMモニタが起動します。

さぁ、次はデバッガの起動です。SZABからデバッガを起動すると、 ザウルスにファイルを転送を始めます。ここで、転送が始まらないと 設定ミスです。もう一度はじめからやりなおしましょう。
送信が終われば「MORE管理」を終了しておきましょう。 そして、デバッガ側から「実行」ボタンを押せばアプリが動き始めます。

デバッガを起動するときは通常のランチャー上の方が安定するみたいです。 調子が悪いときはTR1のロック解除をして、いちからやり直しましょう。 純正ソフトのランチャー上で作業しましょう。

VRAMへの直接アクセス方法 new

基本的に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をおいてもストールが発生しているのかな?

敗北履歴

2001年2月22日
シリアルケーブルCE-170TSを散財
2001年2月13日
EX1用保護フィルムシートを散財
2001年2月12日
64MBのスマートメディアを散財
2001年2月10日
ザウルスでザウルスMI-TR1を2万円で散財


日記
ホームページ

nozz@sannet.ne.jp