P/ware −P/ECE hardware&software−
ようこそ、P/wareへ。こちらはAQUAPLUS(アクアプラス)の mobile equipment P/ECE(PIECE)を扱うファンページです。
 リンクはご自由に。 ご意見ご感想はこちらへ(メール時は"nashi"を抜いてください) home

information 過去の履歴 / LINK
一時期Gumbler亜種にかかっていました。申し訳ありませんが2009年末〜2010年2月あたりまでに本ページを閲覧になった方は、PCのウイルスチェックをお願いします。
カスペルスキーのオンラインスキャン
 http://www.kaspersky.co.jp/virusscanner
 http://www.nifty.com/security/vcheck/kav/kavwebscan.html

非同期シリアル通信(2010-04-23)
・内容復旧(2010-04-03)
P魂2004のバナーを追加↓(2004-08-16)
すでに公開されているプログラム/情報など(2003-06-14)
圧縮と展開1ヶ所ディレイド命令に変更、補足(2003-05-23)
平方根その2(2003-05-22)
すでに公開されているプログラム/情報など(2003-05-22)
P/ECE Official WebPage P/ECE WebRing 前へ 次へ 一覧 ランダム RING説明 P/ECEプログラミングコンテスト『P魂』 アンオフィシャルピースコンテスト『P魂』
contents
●software
非同期シリアル通信(2010-04-23)
平方根その2(2003-05-22)
平方根(2003-05-21)
圧縮と展開(2003-05-23)
距離を求めるその2(2003-05-04)
距離を求める(2003-05-02)
ランダムに画面をぬりつぶす(2003-04-27)
制御に使う(2002-03-06)
パターンを描く(2002-02-22)
変数の引渡し(2002-02-07)
重いところ探し(2002-02-06)
時間を計る(2002-02-05)
高速化その4(プログラムを内蔵RAMへ 総合編)(2002-02-03)
高速化その3(プログラムを内蔵RAMへ .pex編)(2002-01-18)
高速化その2(プログラムを内蔵RAMへ .srf編)(2002-01-18)
高速化その1(変数を内蔵RAMへ)(2002-01-18)
スタックの切り替え(2002-01-18)
高速化と最適化(2002-01-17)
P/ECEでのプログラム実行(2001-12-3)
インラインアセンブラ(2001-12-2)
アセンブラのポイント(2001-11-23)
●program / data
USBキーボード(2003-05-20)
こまっちんぐコマンチ先生・MAXIMUMオーバー殺シスギル!(2002-02-28)
やったぜFM音源、だけどちょっと携帯着メロみたい。だって2OPじゃん(2002-02-28)
集まれTVっ子!(白黒テレビか?)バージョンアップ版(2002-02-28)
ねこさんぷる(2002-02-12)
白黒テレビか?(2002-02-10)
RED FOX(2001-12-26)
●hardware
タクトスイッチ(2003-05-17)
トラップテーブル(2003-05-15)
メモリマップ(2003-05-11)
P/ECEの動作クロックが仕様に登場(2001-11-28)
携帯ゲームの重量比較(2001-11-21)
プロセッサ データシート(2001-11-17)
●etc
期間限定ページ作成(2003-04-18)
夏のイベント結果(2002-08-12)
便利なP/ECEハンドブック(2002-08-01)
いろいろ100(2002-02-23)
冬のイベント結果(2002-01-13)
冬のイベント(2001-12-29)
付属ソースを元にしたプログラムの再配布情報など(2001-12-21)
ツール・ユーティリティ公開へ(2001-12-10)
ブロックゲーム(システムVer1.12aへ)(2001-12-7)
adpcmとspriteのデータ(2001-12-6)
シンプルとスプライトのライブラリ(2001-12-5)
最新版システムアップデート(2001-12-4)
おでマル!2(2001-12-1)
P/ECE発売(2001-11-30)
P/ECE対応ソフト製作予定発表メーカー(2001-11-27)
公式掲示板稼動中(2001-11-26)
USBケーブルを買いましょう(2001-11-24)
おでマル!(2001-11-22)
いろいろ公開のP/ECE!(2001-11-22)
●link
すでに公開されているプログラム/情報など(2003-05-22)
戻る
非同期シリアル通信(2010-04-23)

 ページの更新はかなり久しぶりなのですが、あいてしまった期間にも仕事や趣味には変わらずP/ECEをつかっています。最近やった事と言えば、拡張端子に秋月の3Dセンサー(TDS01V)モジュールを接続して、センサのデータログを取ってみるなんてことをしていました。最初はパソコンにUSBで接続してログをとっていたのですが、やっぱり小さくして機器に取り付けて反応が見たい、なんてことになり拡張端子から非同期シリアル通信で基板上のPICに接続しました。
 で、シリアル通信は今までにも他の機器への接続時に使用した事のある、しまりす様のP/ECE用 拡張COMポート非同期シリアル通信ドライバを使っていたのですが、どうも送信がうまくいきません。そういえば以前に使用した時はデータ受信のみで、送信を使った事はありませんでした。ということで、パソコンに接続して送信テストをしてみると、どうも送信バイト数やタイミングによってうまく送信できない時があるみたいです。
 ソースコードを読んでみたところ、データのバッファリングと割り込み要求の処理あたりに問題がありそうな感じです。

1.データのバッファリング
 データのバッファリングはFIFOになっていて、バッファがあふれた場合には一番過去に受け取ったデータを捨てつつ、新しく来たデータを保持するようになっていました。こちらを自分がよくするパターンのバッファがあふれた場合に新しく来たデータの方を捨てる方式にしました。これは単に自分が慣れている分ささっとコードを書ける程度の意味ですが、データがバッファをあふれないならば関係ないかもしれません。

2.割り込み要求ビット処理
 P/ECE研究室さんのところに記載があるとおり、P/ECEの割り込み要求ビットはリード/ライト出来るように設定がされています。今回使用する非同期シリアル通信において、受信または送信のみを使用するのであれば問題ないのですが、送受信が発生する場合は割り込み要求ビットクリア時のプロセッサのリードモディファイライトサイクルにて、(非常にまれとは思いますが)正規に発生する割り込み要求をクリアしてしまう可能性があります。

エプソンのS1C33209のシリアルI/F割り込み要因フラグとフラグ方式のアドレス
0x0040286 シリアルI/F割り込み要因フラグレジスタ (byte)
          D0: FSERR0   SIF Ch.0受信エラー                   1:要因発生         0:要因なし
          D1: FSRX0    SIF Ch.0受信バッファフル             1:要因発生         0:要因なし
          D2: FSTX0    SIF Ch.0送信バッファエンプティ       1:要因発生         0:要因なし
          D3: FSERR1   SIF Ch.1受信エラー                   1:要因発生         0:要因なし
          D4: FSRX1    SIF Ch.1受信バッファフル             1:要因発生         0:要因なし
          D5: FSTX0    SIF Ch.1送信バッファエンプティ       1:要因発生         0:要因なし
          D6-7: reserved

0x004029f フラグセット/リセット方式選択レジスタ (byte)
          D0: RSTONLY  割り込み要因フラグリセット方式選択   1:リセットオンリー 0:RD/WR
          D1: IDMAONLY IDMAリクエストレジスタセット方式選択 1:セットオンリー   0:RD/WR
          D2: DENONLY  IDMAイネーブルレジスタセット方式選択 1:セットオンリー   0:RD/WR
          D3-7: reserved


たとえば、受信バッファフル割り込みがかかり、その割り込み終了処理時に0x0040286のbit4をクリアする訳ですが、実際には0x0040286の1バイト読み出し、bit4のクリア、0x0040286への書き込みとバスアクセスが発生します。この割り込み要因読み出し直後に送信バッファエンプティが発生した場合、プロセッサ側ではそうとは知らず直前に読み出した値のbit4をクリアした値を書き込んでしまい、他に発生した割り込み要因を消してしまうという事が発生します。
 そこで、今回は送受信の割り込みルーチンの最後、割り込み要因をクリアする時には以下のようにして対処してみました。

 割り込み禁止(割り込みレベル7へ)
 →フラグセット/リセット方式選択レジスタをリセットオンリーに設定
 →割り込み要因をクリア(ビットクリアではなく、割り込み要因をクリアするビットを1にしたデータの書き込み)
 →フラグセット/リセット方式選択レジスタをRD/WRに戻す
 →割り込みからのリターン(自動的に以前の割り込みレベルへ)

 一時的に割り込み要因フラグの方式を切り替える事について、データシートには特にダメと書かれている感じでもありません。NMI(ノンマスカブル割り込み)で割り込み要因フラグをいじっていたら問題がありますが、今のカーネルの割り込み処理を確認したところ、問題はないようです。プロセッサ内でどのように実装されていそうかを想像しても、特に問題はなさそうな気がしますし、今のところ問題も発生していませんのでとりあえずは大丈夫そうです。

 一部を変更したserial.cはこちらからダウンロード(serial.zip)してください。
 使い方等はしまりす様のP/ECE用 拡張COMポート非同期シリアル通信ドライバを参照してください。

 ところで、もともとは上記のセンサーを単三電池1個のP/ECEに接続、お手軽にセンサーのログを取る!という予定だったのです。しかし、実際に接続してみるとボード上のPICがP/ECE供給の3V電源では動作しなかったため、外部に5V電源をつけたり、レベルコンバーターをつけないといけなかったりと本末転倒な状態になりました。結局時間が足らず、外部電源付きの状態でログを取る事になってしまったのはちょっと残念でしたが、あいかわらずP/ECEはばっちり仕事をしてくれました。
戻る
平方根その2(2003-05-22)

P/ECEで整数の平方根を求めてみたのですが、結果は掛け算を利用したほうがはやいということになりました。いままで使っていた筆算の方がもうすこしなんとかならないかな、ともう少し工夫をしてみることにしました。
まずは掛け算方式のほうを1ヶ所ディレイド命令にできるところがあったので変更します。
isqr2:
	xld.w	%r13,0x8000
	ld.w	%r10,0x0

	ld.w	%r11,%r10
isqr2_loop:
	add	%r11,%r13
	mltu.h	%r11,%r11
	ld.w	%r14,%alr
	cmp	%r12,%r14
	jrult.d	isqr2_skip
	srl	%r13,1          ; delay

	ld.w	%r10,%r11
isqr2_skip:
	jrne.d	isqr2_loop
	ld.w	%r11,%r10       ; delay

	ret
これで、1ループあたり8または9クロック(ノーウェイト時)となり、平均8.5となります。更に差が広がってもう無理のような気もしてきましたが、めげずにがんばって筆算方式のほうをいじってみると・・・
isqr:
	xld.w	%r13,0x40000000
	ld.w	%r10,0x0
	ld.w	%r11,%r10
	xadd	%r12,%r12,1

	ld.w	%r14,%r11
isqr_loop:
	add	%r14,%r13
	xsrl	%r11,1
	cmp	%r14,%r12
	jruge.d	isqr_skip
	adc	%r10,%r10       ; delay
	
	sub	%r12,%r14
	add	%r11,%r13
isqr_skip:
	xsrl	%r13,2
	jrne.d	isqr_loop
	ld.w	%r14,%r11       ; delay

	ret
1ループあたり8または10クロック(ノーウェイト時)となり、平均9となりました。ほんのちょっぴりだけ掛け算方式より遅いですが、これくらいの差ならまあいいかなと思えないでもありません。(実際には16回ループするので1回あたり8クロックの差が・・・)
よく比較される日立のSHシリーズでは、乗算器を使用した直後に結果を利用すると、16ビット×16ビット=32ビットの乗算でも2クロックほど競合により停止します。ですので掛け算方式より筆算方式の方がはやくなると思います。(それでもSH4あたりからは浮動小数点ユニットが付き出したりして、sqrtも命令セットにあったりするのでそこまでいくとどうにもならないですが・・・)
エプソンのS1C33209は乗算が1クロックで終わる上に競合もなし、条件分岐もけっこうはやいとこのあたりについては有利な感じです。今回はその有利な部分がうまく働いて乗算方式の方が結果的にはやくなったかんじです。
戻る
平方根(2003-05-21)

 P/ECEで平方根を求める場合、整数でもいったん浮動小数点に変換して関数で求めることになります。これだとちょっと重いので、整数しか必要ない場合にすこしもったいないことになります。整数の平方根の求め方はいくつかあるのですが、こちらが好んで使用しているのは割り算も掛け算も必要の無い2進数の筆算を使用したものです。
 通常の10進数での筆算は、ヨッシーの算数・数学の部屋さんの平方根の筆算がわかりやすくかかれています。2進数でも同じやり方でできるので、180(2進数で10110100)を例に実際に計算して見ます。
          1         
1 ) 10 11 01 00
1 -1
10 1 11 01 00
第6、7ビットのセットが1以上なので、1をたてて1=1を引きます。
1をそのまま左に書きます。
1の下に同じ数1を書き、足し算します。

          1  1      
1 ) 10 11 01 00
1 -1
101 1 11 01 00
1 -1 01
110 10 01 00
先ほど引き算した残りの第4ビットから上の数は111となっています。
左の10に対して、(100+1)×1=101が111以下なので、
1をたてて、101を111から引きます。
次に、左の10の右に1を書いて、101とし、これにさらに1を足します。

          1  1  0   
1 ) 10 11 01 00
1 -1
101 1 11 01 00
1 -1 01
1100 10 01 00
0 -0
1100 10 01 00
先ほど引き算した残りの第2ビットから上の数は1001となっています。
左の110に対して(1100+1)×1=1101が1001より大きいので、
0をたててそのままとします。
次に、左の110の右に0を書いて1100とし、これに0を足します。

          1  1  0  1
1 ) 10 11 01 00
1 -1
101 1 11 01 00
1 -1 01
1100 10 01 00
0 -0
11001 10 01 00
1 -1 10 01
11010 10 11
先ほど引き算した残りの数が100100となっています。
左の1100に対して(11000+1)×1=11001が
100100以下なので、1をたてて11001を100100から引きます。
次に、左の1100の右に1を書いて11001とし、
これにさらに1を足します。
これで計算完了です。

 これで13(2進数で1101)が求まりました。この演算をそのままc言語で書き直すと以下のようになります。
unsigned int isqr(unsigned int s)
{
	unsigned int t=0x40000000,h=0,a=0;
	do{
		int b=h+t;
		a<<=1;
		h>>=1;
		if(s>=b){
			s-=b;
			a++;
			h+=t;
		}
	}while(t>>=2);
	return a;
}
ぱっと見わかりにくいかもしれませんが、筆算を忠実に実行したものをコンパイル時に無駄が少なくなるように演算の並び替えをしています。アセンブラでいじるとしても、ディレイド命令を使用するくらいで、このまま使用しても問題ないくらいいい感じです。 ということで、この項目はここまでで終了するはずだったのですが、ここでふとS1C33209では16ビット×16ビット=32ビット乗算が1クロックで完了するのを思い出しました。もしかして実際の数を2乗して引数と比較したほうがはやいんじゃぁ・・・と思ってコードを書いてみました。
unsigned int isqr2(unsigned int s)
{
	unsigned int r=0x8000,a=0;
	do{
		unsigned int b=a+r;
		if(s>=b*b)
			a=b;
	}while(r>>=1);
	return(a);
}
とりあえずテストのためにc言語で書いてみましたが、試すまでも無く2乗したほうがはやそうです。c言語のままでは32ビット×32ビット=64ビット乗算で5クロックとなってしまうため、1クロックの16ビット×16ビット=32ビット乗算を使用するようにアセンブラで書き直すと以下のようになります。
isqr2:
	xld.w	%r13,0x8000
	ld.w	%r10,0x0

	ld.w	%r11,%r10
isqr2_loop
	add	%r11,%r13
	mltu.h	%r11,%r11
	ld.w	%r14,%alr
	cmp	%r12,%r14
	jrult	isqr2_skip
	ld.w	%r10,%r11
isqr2_skip:
	xsrl	%r13,1
	jrne.d	isqr2_loop
	ld.w	%r11,%r10	;delay

	ret
どうも掛け算や割り算が遅かったころの印象のために、こういう2乗する方法はいままで試さなかったのが敗因のようです。
戻る
USBキーボード(2003-05-20)

 P/ECEでのUSBキーボードといえばryukの薫製工房さんのP/ECE改造カーネルが有名なところです。また、最近公式掲示板でもBIOSをいじらずにUSBキーボード化等の話題も出ています。このとき、nsawaさんがBIOSをいじらないUSBキーボードのサンプルを出してらっしゃいました。おかげでお手軽にテストする環境ができたため、任意のキーを送出できるようにしてみました。

 USBキーボードサンプルバイナリとソース

 追加した関数は次のとおりです。

 任意のキー入力文字列を送出します。
  void sendkeycode(
              char *str    //送出コントロール文字列
              );
 送出コントロール文字列の内容をUSBキー入力として送出します。
 以前送出した文字列が送出中だった場合は、以前の文字列をキャンセルして新たな文字列を送出します。
 送出バッファは250バイトまでです。
 送出コントロール文字列は以下のような種類に対応しています。
 a〜z          キーボードのA〜Z
 0〜9          キーボードの0〜9
 -^@[];: ,./  キーボードの-^@[];: ,./
 \n            キーボードのEnter
 \t            キーボードのTab

 また、%で囲んだ文字列で特殊キーに対応します。
  %enter%       キーボードのenter
  %esc%         キーボードのesc
  %backspace%   キーボードのbackspace
  %tab%         キーボードのtab
  %space%       キーボードのspace
  %capslock%    キーボードのcapslock
  %f1%〜%f12%   キーボードのF1〜F12
  %printscreen% キーボードのprintscreen
  %scrolllock%  キーボードのscrolllock
  %pause%       キーボードのpause
  %insert%      キーボードのinsert
  %home%        キーボードのhome
  %pageup%      キーボードのpageup
  %delete%      キーボードのdelete
  %end%         キーボードのend
  %pagedown%    キーボードのpagedown
  %rightarrow%  カーソルキーの→
  %leftarrow%   カーソルキーの←
  %downarrow%   カーソルキーの↓
  %uparrow%     カーソルキーの↑
  %numlock%     テンキーのnumlock
  %n/%          テンキーの/
  %n*%          テンキーの*
  %n-%          テンキーの-
  %n+%          テンキーの+
  %nenter%      テンキーのEnter
  %n0%〜%n9%    テンキーの0〜9
  %n.%          テンキーの.
   
  %win+%        Windowsキーを押した状態にする
  %win-%        Windowsキーをはなした状態に戻す
  %shift+%      shiftキーを押した状態にする
  %shift-%      shiftキーをはなした状態に戻す
  %ctrl+%       ctrlキーを押した状態にする
  %ctrl-%       ctrlキーをはなした状態に戻す
  %alt+%        altキーを押した状態にする
  %alt-%        altキーをはなした状態に戻す
 注意すべき点として、%win+%、%shift+%、%ctrl+%、%alt+%等は以降ずっと該当キーを抑えたままと同じになるため、必要でなくなった時に%win-%等ではなした状態に戻すことを忘れないようにするということがあります。

 たとえば、リセットなどに使用するCtrl+Alt+Delの場合は次のようにします。

  sendkeycode("%ctrl+%%alt+%%delete%%alt-%%ctrl-%");

 今回、Ctrl、Alt、Shift、Windowsキーは左右にある2つのうちの右側だけ使用しています。最初は左側を使用していたのですが、こちらのWindows2000の環境では「半角/全角」キーとEsc、CapsLockとCtrlを入れ替えているため、左側のキーでは正しく動作しなかったためです。今時これらのキーを入れ替えている人はそんなにいないとは思うのですが、自分のためにも右側のキーを使用しています。
 とりあえず身近にあるパソコンで動作確認はしていますが、USBキーボードについてしっかり理解できているとは言えないため、もしかしたら不具合等あるかもしれません。なにかありましたらお教えいただければ幸いです。

 参考
  P/ECE改造カーネル ryukの薫製工房さん
  USBマウス、USBキーボード P/ECE研究室さん
戻る
タクトスイッチ(2003-05-17)

 P/ECEをゲームなんかで酷使していると、ボタンのクリック感がだんだんと悪くなっていきます。普段はボタンを酷使しないよう気をつけてはいるのですが、いざゲームをやりだすとついつい力が入りすぎたりしてしまいます。P/ECEのボタンについては友人が連射のしすぎで壊してしまったのを知っていたので気をつけてローテーションするなどしていました。が、ついに先週あたりからついにAボタンの反応がかなり悪くなってしまい、ゲームをするにはきつくなってしまいました。
 ちょうど他に用事があることもあって、日本橋の電気街になにか代用になるようなものを探しに行くことにしました。同じくらいの薄さのタクトスイッチなりがみつかれば、無理やりつけてしまえば何とかなりそうです。

 まずはパーツショップとして有名な共立電子にいってみました。さすがに同じくらいの厚さのタクトスイッチはなく、どうしても1mmくらい厚いものしかありませんでした。とりあえずボタン側のプラスチックを削れば入るかもしれないと思って1つだけ購入してみます。

 つぎに、もしかして・・・
 とおもってジャンクショップのデジットにいってみました。ちょっと本を立ち読みしてから横をみてみると、ジャンクLCD基板50円というのが・・・

 よくみるとどこかで見たようなタクトスイッチがついています。


どんなLCDかはわかりませんが、見た感じしっかりしたものぽいです。でも50円。


このスイッチです。

おいてあったのは店のマップでいうところの接着剤あたりのところ。ちょっと押すところのプラスチックが色違いとかありますが、クリック感は新品同様でした。これを購入して付け替えればボタンが完全復活しそうです。レジに持っていくと

「この基板の使い方なんかはわからないですが、よろしいですか?」

と聞かれて、

「はい、大丈夫です(もったいないけどタクトスイッチとった後、他は捨てるので)」

ということで50円で4つも修理部品が手に入りました。
帰宅してからスイッチをいれかえると・・・・幅も高さもばっちりです。ボタンのシルバーの印刷ははげたままですが、使った感じは新品になりました。(印刷のはげないカラーP/ECEがちょっとほしくなったりしました)
戻る
トラップテーブル(2003-05-15)

 P/ECEのメモリマップを少し前にのせたのですが、その中の割り込みトラップテーブルについては1行のみとなっていました。内容を入れちゃうとそれだけですごい行数となってしまうため、見送りしていたものです。このトラップテーブルについても実はインストール時の資料(「P/ECEの世界にようこそ」の「HARDSPEC」の「ハードウェア割り込み表」)に書いてあります。トラップテーブルのP/ECEでの用途及びアドレスが未来にわたって同じかどうかは不明ですので、注意が必要です。割り込みトラップテーブルの変更はAPI(pceVectorSetTrap)で行うように指示されていますので、基本的にトラップテーブル自体のアドレスを参照する必要があることはほとんど無いとおもいます。
 今回もアドレスを追加しただけで資料をそのままとってきてるような感じですが、アドレスから割り込みを追いかけたい時なんか(そしてそんなことはきっとほとんどない)には便利かもしれません。
番号アドレス割り込み要因IDMAP/ECEの用途(割り込みレベル)
0400リセット--
1〜3404〜40c予約--
4410ゼロ除算-ゼロ除算エラー表示
5414予約--
6418アドレス不正例外-アドレス不正例外エラー表示
741cNMI-1msタイマのカウント専用
8〜11420〜42c予約--
12430ソフトウェア例外0--
13434ソフトウェア例外1-CriticalKSEntry
14438ソフトウェア例外2--
1543cソフトウェア例外3--
16440ポート入力割り込み01-
17444ポート入力割り込み12USB INT_N(6)
18448ポート入力割り込み23赤外線受信(7)
1944cポート入力割り込み34-
20450キー入力割り込み0-スタンバイ解除(4)
21454キー入力割り込み1--
22458高速DMA Ch.0 転送終了5LCD転送
2345c高速DMA Ch.1 転送終了6サウンド再生(PWM値転送)(7/5)
24460高速DMA Ch.2 転送終了--
25464高速DMA Ch.3 転送終了--
26468インテリジェントDMA転送終了--
27〜2946c〜474予約--
3047816ビットタイマ0 コンペアB71msタイマ(6)
3147c16ビットタイマ0 コンペアA81msタイマ
32〜33480〜484予約--
3448816ビットタイマ1 コンペアB9サウンド再生(PWM)
3548c16ビットタイマ1 コンペアA10サウンド再生(PWM)
36〜37490〜494予約--
3849816ビットタイマ2 コンペアB11サウンド再生(予備)
3949c16ビットタイマ2 コンペアA12サウンド再生(予備)
40〜414a0〜4a4予約--
424a816ビットタイマ3 コンペアB13-
434ac16ビットタイマ3 コンペアA14-
44〜454b0〜4b4予約--
464b816ビットタイマ4 コンペアB15USB 6MHz
474bc16ビットタイマ4 コンペアA16USB 6MHz
48〜494c0〜4c4予約--
504c816ビットタイマ5 コンペアB17赤外線送信
514cc16ビットタイマ5 コンペアA18赤外線送信(7)
524d08ビットタイマ0 アンダーフロー19スタンバイ解除
534d48ビットタイマ1 アンダーフロー20-
544d88ビットタイマ2 アンダーフロー21-
554dc8ビットタイマ3 アンダーフロー22EXT端子用
564e0シリアル Ch.0 受信エラー--
574e4シリアル Ch.0 受信バッファフル23-
584e8シリアル Ch.0 送信バッファエンプティ24-
594ec予約--
604f0シリアル Ch.1 受信エラー-EXT端子用
614f4シリアル Ch.1 受信バッファフル25EXT端子用
624f8シリアル Ch.1 送信バッファエンプティ26EXT端子用
634fc予約--
64500A/D変換完了27K66,67電圧測定
65504計時タイマ-アラーム(4)
66〜67508〜50c予約--
68510ポート入力割り込み428-
69514ポート入力割り込み529-
70518ポート入力割り込み630-
7151cポート入力割り込み731-
戻る
圧縮と展開(2003-05-14)

 P/ECEで圧縮したデータの展開だと、基本的にはP/ECEハンドブックVol.1にのってるような方法になると思います。圧縮はppackを使用して、展開はカーネルソースの一部を取り出してくるって感じです。また、展開作業を関数化して簡単に利用できるようにしたP/ECE Tipsをてとら★ぽっとさんで公開されています。(おもてページ右のP/ECE Tipsの[1])
 この方法だと圧縮比もけっこういいのですが、若干ワークが必要だったりちょっぴりだけ速度が遅かったりします。ということでワークなしで少しはやめのものを用意してみました。
 使用するのはLZSSという方法です。基本的にP/ECE上では展開だけを考えればいいので、圧縮するのは簡単にしてしまいました。
 使い方

  圧縮 plz.lzh(c言語ソースファイルとwin32コンソール実行ファイル)
     圧縮したいファイル名がtest.bin、圧縮後の名前がtest.plzなら、
    コマンドプロンプトから plz test.bin test.plzと入力します。
     テストで展開してみる時はplz -d test.plz test.orgなどとします。
  展開(P/ECE上)
     メモリ上の圧縮データ(plz.exeで圧縮したもの)へのポインタがsrc、
    展開先へのポインタがdstの場合、この下のc言語decode()関数または
    アセンブラのdecode0サブルーチンを利用して
     decode(dst,src+8);
	とします。
  圧縮データのフォーマット
    +0 4バイト 圧縮後(自分自身)のヘッダも含めたサイズ
    +4 4バイト 展開後のサイズ
    +8 任意   圧縮データ
 以下圧縮の説明なので、不要な方はc言語のdecode()まで読み飛ばしてください。
 使用しているLZSSというのはバイト単位の展開で着目している点からの数バイトが直前にでてきた4000バイト程度の中にあれば、そこからコピーしてきます。なければ無圧縮で格納されているデータをそのまま着目している点に書き込みます。この着目点が順番にすすんでいくところからスライド辞書とも呼ばれています。現実の展開を説明すると以下のようになります。(ひょっとしたら少し下のcのソースをみたほうがはやいかも)
 最初に1バイトのフラグがあります。上位ビットから1ビットづつ使用して、以降の8つ分の展開処理に使用します。フラグが1なら圧縮データをそのまま展開データにコピーします。フラグが0なら2バイト取り出し、下位12ビットで現在の着目点から何バイト手前からコピーするかの位置、上位4ビットの数値に+3して何バイトコピーするかの数として展開しているデータのメモリのコピーします。
 実際の圧縮データのサンプルを示すと、以下のようになっています。

 ee 41 42 44 00 02 45 46 47 00 00

 eeがフラグで、ビット列にすると11101110、上位ビットからみていくので、とりあえず3ビット1がつづくことから41 42 44はそのまま展開します。次に0なので、00 02をセットで取り出し、コピー数(0x0+3=3)、位置(-0x002)となるので、展開された現在の位置から-2したところから3バイトコピーします。具体的には42 44 42となります。あとはまた3ビット1がつづいているので45 46 47をそのまま展開します。次に0がくるので00 00をセットで取り出します。実は今回の圧縮展開ではこのとき0になったら終了としています。そのため、ここで展開を打ち切ります。最終的にできるデータは以下のようになります。

 41 42 44 42 44 42 45 46 47

 この例だと元のバイト数からふえてしまっているので、圧縮の意味はないということになります。
 圧縮側のほうは・・・そのままバイト単位の比較をえんえん繰り返しているだけです。ほんとは木構造やハッシュなんかをつかって圧縮を高速化するべきなんでしょうが、現在のパソコンでP/ECEにのせるくらいの容量のファイルをこうしてそのまま比較して圧縮しても、ほとんど1秒とたたずに圧縮が完了してしまいます。今回は圧縮がメインではないということでもあり、このままとなっています。

 さて、展開のソースですが以下のようになります。
void decode(unsigned char *dst,unsigned char *src)
{
    while(-1){
        int ct=8,flag=*src++;
        do{
            if(flag&0x80){
                *dst++=*src++;
            }else{
                unsigned int length,ptr=*src++;
                length=(ptr>>4)+3;
                if(!(ptr=((ptr&0xf)<<8)|(*src++)))
                    return;  /*************return**********/
                {
                    unsigned char *rp=dst-ptr;
                    do{
                        *dst++=*rp++;
                    }while(--length);
                }
            }
            flag<<=1;
        }while(--ct);
    }
}
dstに展開先メモリ、srcに圧縮データの先頭アドレスを入れます。アセンブラではやくしたバージョンは以下のとおり。2割とちょっぴりはやい模様です。
decode0:
      xld.w   %r4,0x8
      ld.ub   %r15,[%r13]+
      swap    %r15,%r15
decode0_loop0:
      adc     %r15,%r15
      xjruge  decode0_dic
      ld.ub   %r10,[%r13]+
      ld.b    [%r12]+,%r10
      xsub    %r4,%r4,1
      xjrne   decode0_loop0
      xjp     decode0
decode0_dic:
      ld.ub   %r11,[%r13]+
      ld.w    %r10,%r11
      xsrl    %r10,4
      xadd    %r14,%r10,3
      xand    %r11,%r11,0xf
      xsll    %r11,8
      ld.ub   %r10,[%r13]+
      or      %r10,%r11
      xjreq   decode0_return
      ld.w    %r11,%r12
      sub     %r11,%r10

      sub     %r14,1
decode0_diccopy:
      ld.ub   %r10,[%r11]+
      ld.b    [%r12]+,%r10
      jrne.d decode0_diccopy
      sub     %r14,1       ;delay

      xsub    %r4,%r4,1
      xjrne   decode0_loop0
      xjp     decode0
decode0_return:
      ret
 通常はppackとてとら★ぽっとさんところのTipsを利用するほうが圧縮効率もよく、整備されてていいと思います。こちらのはすばやくデータを展開しないといけないゲームなんかをつくる時なんかに利用してみるといいかもしれません。
 1ヶ所ディレイド命令にできたので修正しました。
 Yui N.さんがfpkとしても手軽に扱える便利なライブラリ(fpkarc − P/ECE の fpk 書庫ファイルを作成・展開)として公開なさっています。
 上記ソースコードについて著作権関連がかいてなかったですので、補足します。「上記plz.lzh、decode()、decode0のソースコードの著作権はp/ware/Hitode Yamatsukiが保持していますが、転載・改変・再配布・利用は自由です。便利だと思われたら積極的にご利用ください」可能なら参考にしたとurlとかを書いていただければうれしいです(2003-05-23)
戻る
メモリマップ(2003-05-11)

 P/ECEのメモリマップは、実はインストール時の資料(標準のディレクトリの場合、C:/usr/PIECE/docs/資料/info.txt)に書いてあります。ですが、すぐに見ることができるように作成してみました。version 1.18〜1.20では大体同じ感じです。未来のバージョンでメモリの使用のされかたがこのままかどうかは不明ですのでほんの少し注意が必要です。もちろん、周辺I/Oを直接使用する時なんかにはメモリマップが必要となりますが、それだとこんなのではだめで結局データシートのお世話になることになります。
通常のP/ECEのプログラミングで直接アドレス参照するのはあんまりないはずなので、デバッグの時なんかに参考にするくらいかもしれません。
000000 内蔵RAM 8KB
 000000 システムが使用
 000020 カーネルサービステーブル
 000400 割り込みトラップテーブル
 001000 ユーザが使用可能
  ↓ユーザ
  ↑スタック
002000
040000 内蔵IOメモリ
 040140 タイマ パワーコントロール シリアル A/D ポート DMA
 0402e0
 048120 バスコントローラ タイマレジスタ DMAレジスタ
 048260
 04ffff
100000 外部SRAM 256KB
 100000 ユーザエリア(アプリケーション)
140000
400000 USBコントローラ
400008
c00000 外部FLASH ROM 512KB
 c00000 リセットベクタ/ブート・ブロック(8KB)
 c02000 カーネル
 c0c000 文字フォント
 c28000 ファイル・システム
c80000
1000000
戻る
距離を求めるその2(2003-05-04)

 P/ECEで距離を求める方法をいろいろかいてみたらてとら★ぽっとさんとP/ECE研究室さんにリンクしてもらえました。nsawaさんのほうでは距離を求めるで取り上げたhypot2の16ビット制限を30ビットに拡張したバージョンを公開していただけたりしています。実は前回のを書いた後hypot2の精度をもうちょっと高くできないのかなぁと定数をさぐったりしました。ほとんど精度も向上しなかったことからお蔵入りしようと思ってたところなのですが、こうして取り上げていただいたこともありイロイロまとめて見ます。 とりあえず前回のhypot2の精度を向上できないか?ということで、値を求めてみます。といっても今はパソコンもはやくなっているので総当りで誤差の少ない値を見つけるって言う感じです。

cのソースコード / win32コンソール用バイナリ

 その結果、0.960434*|x|+0.397825*|y|にすることで、ほんのちょっぴりだけ精度が向上しました。(以前が3.961%位だったのが3.957%くらいなのでほとんど変わらない・・・)
 もう少し精度の良い計算式がないかなぁと探してみると、直線のアルゴリズム 円のアルゴリズム hypotenuseというのをみつけました。pascalにて記述されているのでcで書き換えてみると、以下のようになります。
int hypot4(int x,int y) // 誤差約1% 13bit符号付き整数まで
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    if(x<y){
        int a=x;
        x=y;y=a;
    }
    if(x==0)
        return(0);
    return(x+((y*y/x*55)>>7));
}

int hypot5(int x,int y) // 誤差約0.2% 13bit符号付き整数まで
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    if(x<y){
        int a=x;
        x=y;y=a;
    }
    if(x==0)
        return(0);
    if(y*2<x)
        return(x+((y*y/x*121)>>8));
    {
        int w=y-x/2;
        return(((143*x+62*w)>>7)+((w*w/x*7)>>5));
    }
}

int hypot6(int x,int y) // 誤差約30% 32bit符号付き
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    if(x<y)
        return(y);
    return(x);
}

int hypot7(int x,int y) // 誤差約12% 31bit符号付き
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    if(x<y){
        int a=x;
        x=y;y=a;
    }
    return(x+y/2);
}
元プログラムでは80386以上で使用できる64bit/32bitの除算を使用していたところを通常の除算にしてしまったため、引数の範囲が13bit符号付き整数までになってしまいました。きっと気に入ったらnsawaさんが書き換えてくれることでしょう(各シフトも算術シフトでなくてよかったりとか・・・)(^^;
関数の中身を見ていただけばわかるとおり、精度が向上しているものは任意の数での除算が入ってしまっています。P/ECEのプロセッサは除算が若干弱い(それでも30クロックちょっと)ため、精度と速度で天秤にかけて必要なのを選べばいい感じです。
ところで、これらの関数の誤差ってどうなっているのでしょう?フリーウェアのグラフ描画ソフトFunctionViewを利用してどうなっているか確かめてみました。
距離と誤差の関係1
hypot1 |dx|+|dy|
hypot6 |dx|
hypot7 |dx|+|dy|/2
縦軸が誤差の%、横軸が距離x、yを見た時の角度となっています。絶対値をとって、その絶対値の大きいほうをxとしているので、角度は0°〜45°となります。この間の誤差が最小になるような関数を求めることができれば、そのまま距離の近似に使用できることになります。
hypot1などは誤差は最悪なのですが、この絶対値の距離をx、yとも加算した距離というのはいろいろ利用方法があるため、誤差が大きくても必要になることがあります。
hypot6とhypot7では、ほとんど計算量がかわらない(2で割るのならシフト1回のみ)なので、このどちらかを使用するのなら通常はhypot7を使うことになると思います。

距離と誤差の関係2
hypot2 0.9604|dx|+0.3978|dy|
こちらが誤差約4%のhypot2になります。0°、22.5°、45°で若干精度が悪くなっていますが、整数で使用するならこれくらいでも十分なことが多くあります。

距離と誤差の関係3
hypot4 |dx|+(|dy|^2)/|dx|×55/128
誤差約1%のhypot4です。乗算3回、除算1回で、ここまで精度がでれば通常はほぼ問題ない感じです。45°のとき1%を少し超える誤差があります。

距離と誤差の関係4
|dx|=2|dy|の位置
hypot5a |dx|+|dy|^2/|dx|×121/256
hypot5b 143|dx|+62(|dy|−|dx|/2)/128+((|dy|−|dx|/2)^2)/|dx|×7/32
誤差約0.2%のhypot5になります。2つの近似式により、|dx|=2|dy|の手前のhypot5a、その後ろのhypot5bの両方で0.2%となっています。特にhypot5bでは乗算がかなり多くなってしまっています。hypot5を使用するのなら、ここまでの精度を必要とするかどうかというのを確かめてみてもいいかもしれません。
 nsawaさんのページで公開直後グラフ画像へのリンクがローカルファイルとなっていたのに気付き修正しました(今時こんなミスを・・・)誤差±約1%・30ビット版も公開なさってますので訪ねてみることをお勧めします。
 nsawaさんのページで公開されている30ビット版を見て、0除算が発生する可能性があったのを修正しました。hypot4,hypot5でreturn(0)している所です。この項目ではミスばっかりです。
戻る
距離を求める(2003-05-02)

 P/ECEで距離を求めようとすると、自分で関数なんかを作る必要があります。よくあるコンパイラならhypotという関数があるのですが、P/ECEのmathライブラリには無い模様です。でも、そんなに難しいものではなくて以下のようにつくることができます。
double hypot(double x,double y)
{
    return(sqrt(x*x+y*y));
}
これなら、マクロで定義しておいてもよさそうな感じです。
さて、ゲームなんかで距離を求めようとした時にdoubleでこんな風に計算しちゃうととっても遅くなってしまうので工夫をすることになります。もともと整数か固定少数での演算が多くなると思いますので、手っ取り早く計算しようとしたら以下のように・・・
int hypot1(int x,int y) // 誤差約40% 31bit符号付き整数まで
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    return(x+y);
}
距離の絶対値をそれぞれ足してしまいます。精度はあんまりよくなくてだいたい40%位の誤差がありますが、それで大丈夫な用途であればこんなのでもつかえちゃうことになります。
もうちょっと工夫をすると、次のようになります。
int hypot2(int x,int y) // 誤差約4% 16bit符号付き整数まで
{
    if(x<0) x=-x;
    if(y<0) y=-y;
    if(x<y){
        int a=x;
        x=y;y=a;
    }
    return((31470*x+13035*y)>>15);
}
距離の近似をもとめる計算式として、|x|>|y|のとき、|x|×0.9604+|y|×0.3978というものがあります。計算式はかなり昔に掲示板で教えてもらったのをメモしてあったのですが、もともとどこで書かれたものかよくわかりませんでした。結構精度よく、誤差はだいたい4%くらいです。注意点としてはx、yともに16ビットまでの数値でないと桁があふれてしまうところです。桁が必要なら掛け算している数値と左シフトの回数を調整することで誤差と引き換えに桁を増やすこともできます。
ここまでは距離をちゃんと求めていたわけですが、実際に距離の大小だけが必要な場合には
int hypot3(int x,int y) // 16bit符号付き整数まで
{
    return(x*x+y*y);
}
という感じで、平方根をとらずにいるという方法もあります。距離20以上離れているかどうかの判定をするときなんかは、上記で求まった数と400の比較で計算できることになります。
P/ECEに使用されているS1C33209というプロセッサは乗算がはやくできています。32ビットの乗算では5クロックなので、メモリのウェイトを考慮すると加算などの命令と同じくらいのはやさだと考えていいくらいです。16ビット乗算が1クロックなので、それを利用してhypot3をアセンブラでかくと
hypot3:
    mlt.h   %r12,%r12
    ld.w    %r10,%alr
    mlt.h   %r13,%r13
    ld.w    %r14,%alr
    ret.d
    add     %r10,%r14    ;delay
と、とってもちっちゃくて高速になります。必要な距離の性質がどんなものかにより、計算方法をかえてみるのもいいかもしれません。
戻る
ランダムに画面をぬりつぶす(2003-04-27)

 P/ECEでランダムな点で画面を塗りつぶすようにしようとした時、どういったやり方をするのかといわれたら・・・(以下はすべてシンプルライブラリを想定しています)
for(i=0;i<128*88;i++){
  pset(rnd(128),rnd(88),3);
}
wait(5000);
とりあえず適当に乱数で点をうってみます。残念ながら画面全部が塗られません。しかたがないので
for(i=0;i<128*88*3;i++){
  pset(rnd(128),rnd(88),3);
}
fill(0,0,127,87,3);
wait(5000);
とりあえず3倍くらい点をぬってみるとそれなりに黒くなるので、あとは塗りつぶしてごまかしてみました。目標達成はいいのですが、ちょっとあんまりなのでもう少しまっとうにつくってみると・・・
static short pat[128*88];
for(i=0;i<128*88;i++){ //塗りつぶし順番を素直に初期化して
  pat[i]=i;
}
for(i=0;i<128*88;i++){ //それを乱数で入れ替え
  p=rnd(128*88);
  a=pat[i];
  pat[i]=pat[p];
  pat[p]=a;
}
for(i=0;i<128*88;i++){ //最後にできた順番で1ドットづつ描画
  pset(pat[i]%128,pat[i]/128,3);
}
wait(5000);
最初に画面のドット数分の塗りつぶし順番配列をつくって、乱数で塗りつぶし順番の入れ替えをしています。トランプとかを混ぜてるのを想像してもらえばいいかと思います。 ただでさえ少ないP/ECEのメモリを塗りつぶし順番だけでたくさん使うなんて! というお叱りもあるかと思い、最後に以下のようなプログラムを用意してみました
a=1;
for(i=0;i<128*128;i++){
  a=( ( ( ((a&0x2000)!=0)^((a&0x0010)!=0)^((a&0x0004)!=0)^((a&0x0001)!=0) )&1)
      | (a<<1) ) & 0x3fff;
  pset(a%128,a/128,3);
}
pset(0,0,3);
wait(5000);
基本的には1つ上のプログラムと同じなのですが、塗りつぶし順番を計算式で求めています。この計算式を使用すると、計算1回ごとに1〜16383の間の数をばらばらに1回づつ求めることができます。どんな感じかというと

3 7 14 29 59 118 236 473 946 1893 3786 7572 15144 13905 11427 6470 12941 9499 2615 5231 10462 4541 9083 1783 3567 7134 14268 12153 7923 15846 15308 14232 12080 7776・・・

実はこれはM系列という擬似不規則系列の1つで、CDMAとかスペクトル拡散通信方面、論理回路とかの方面では結構有名なものです。ソフトウェアでもRAMの故障チェックとかにつかわれることがあります。
シフト1つと何ビットかのXORを組み合わせるだけでつくれるので、ハードウェアで使われることが多いのですが簡単なうえに順番に不規則な数値が取り出せるという性質があるので、覚えておくとつかえるときがあります。
そんな難しいことはかんがえなくても、こういう法則をもった擬似乱数もあるなぁってかんじでいると、ふと使えるときもあるかも。
こちらに線型M系列符号発生器の結線表として、必要なビット数のときのXORの取り出しビット位置が求められて表になっています。今回プログラムで使用したのは14ビットで「4結線タップ表」の14のところにある「2014」を使用しています。この16進の数値2014を1ビットづつ分解して、0x2000,0x0010,0x0004,0x0001としてビットを取り出しています。30ビットまで表に用意されているので、必要なビット数のものを用いればいい感じです。2ビットだけのほうがもっと簡単に求まるのですが、少しばらつきが悪くなるというのがあります。表に載ってないところでもう少しビット数の多いところになると31:40000004 63:4000000000000001とかがあります。
気をつけないといけないのは

・(ビット数−1)回目でまた最初から同じ順番でループする
・初期値として0を用いるとずっと0のまま(0は存在しない)

ということがあります。このため、プログラムでは最後に0,0のところに点をうっています。
戻る
期間限定ページ作成(2003-04-18)

 P/ECEは結構昔にRe: PIECEさんところでITRON準拠OSのMULT-iが公開されています。ソースコードもあり、RTOSの実装がどんな風になってるかの1例として手軽に見ることが出来るいい材料だと思います。
 ところでつい最近、NHK総合テレビで「プロジェクトX〜挑戦者たち〜」でトロンプロジェクトについて放送(4月16日)が行われて、その見事な構成により世の中では「これからは国産OS!」とか「TRONののった機械を買おう!」とかいう風が吹いている雰囲気です。
 超漢字を発売しているパーソナルメディアでは超漢字プリインストールノートパソコンを4月15日に発売、その見事な発売日により、放送直後に完売してしまったようです。放送日にはサイトにつながらなくなったりもして、注目の高さがわかります。
 そこで!せっかくなので再放送もあることですし期間限定で特設ページなんかを作ってみました。ネタにしたパーソナルメディアさんM・anonさんには無許可でつくっちゃったので、おこられたら消去の予定です。

 期間限定ページ

戻る
夏のイベント結果(2002-08-12)

 P/ECEのユーザが結構集りそうな東京の夏のイベント、また当方も回ってきました。
 購入したものは以下のとおりです。

 電映製作さん
 P/ECE mag.という本とP/ECEでコントロールできるROBOT ARMが展示されていました。物がうごかせるのはやっぱり面白いです。本の内容はROBOT ARMを制御しよう!、BlackWings攻略です。どの内容も丁寧に記述されていて読みやすかったです。
 サークルねじさん
 P/ECE用「乳育てRPG」は CG集&P/ECE用ゲーム「素敵フィンガー」に変更になっていました。CD1枚に両方入っているのでお徳なかんじです。RPGは次回なのかもですね。
 懐石廬さん
 縦シューティングゲーム仕立てのARE version 0.01でした。開発ツールがなかなか良い感じで、なんとか冬ころまでにまとまったものってことみたいなので、冬に期待です。
 AIWIL softさん
 OLIONforPIECE、前回買えなかったのですが、今回買うことが出来ました。元のゲームの性質上、白黒なのがちょっとつらいですがいい感じです。また、きまぐれまぎちゃん。も購入してみました。
 サークルORPHEさん
 P/ECE無料配布でぃすくがあったので、いただいてしまいました。Web上にある曲以外にも... MIDI CollectionのCD販売されていたので、いまこちらのAUDIOトラックを聞きながらテキストを入力しています。
 えとらぼさん
 pirce of P/ECE、 えとらぼさんのP/ECE改造本です。基本改造、拡張端子利用、バックライト、スマートメディアが細かな図解付で見やすくかかれていました。
 裏P/ECEハンドムック GB-P/ECEレシピ編が販売されていました。銀次郎さんの同人誌です。GB-P/ECEの作り方、要望、裏話、Tips、他です。回路は全部CADで清書してあり見やすいし、内容も多岐にわたっていて面白いです。
 本を購入するとOLYMP/ECEのCDをつけていただけました。競技の20までが先行して導入されてるというものでした
 Silicone Diverさん
 ファミレス電卓のβ版が販売されていました。単価を入れると合計の値段が出るというものです。深夜割増にも対応しています。たくさんの人で食事に行ったときの自分の分を計算するようにってことで作成されたそうです。次のバージョンでどうなるか楽しみです。
 処理落ち王国さん
 GALAXY PILOT(試食版)、全方向スクロールのシューティングゲームです。敵からの誘導ミサイルがしつこく追ってくるので結構厳しいです。何とか切り替えしつつ敵を殲滅していく感じです。完成版でいろいろなステージができてくるそうです。
 そしてもうひとつ、前回購入できなかったバルーントリップさくらです。ゆっくりスクロールしていくのにスコアはすごい速さで加算されるので、スコアが延びてうれしいです。海に近づくと謎の水龍がすぐ出てくるので、下のほうギリギリに出たカードが出てくるたびにどきどきします。
 JBA-Softさん
 いろいろなものが入ったCDを販売されていました。P/ECE用パソコン side ソフト「ぴーすへるぱー」「P/ECEコレクション」「Soft Wrap」です。「Soft Wrap」は「P/ECEこれくしょん」の情報ファイル(.pci)を作成するソフトで、先行して利用する事が出来ます。それに伴い「ぴーすへるぱー」も最新のものでした。
 GAMEOVERさん
 縦スクロールのシューティングの雀斑(体験版)です。体験版ですがかなりよくできてます。敵の種類もいろいろあり、攻撃方法も多彩なのでがんばってみるのですが、敵弾がすごく多いのでなかなか避けられず、先のほうを見る事が出来ません。今後タイプの違う自機の追加やサウンドってことなので、期待大です。
 CDの中にはもうひとつゲームが入っていて、こちらは縦スクロールのレースゲーム モナコ120%です。ブレーキはなくてギアで速度調整をして適車をよけるのですが、自車の最高速度がかなりはやいため、なかなかよけることができません。こまめにギアをかえつつ対応する感じです。
 サークルあすたろとさん
 運だけRPG?レーギ、かえるパニック☆、しゃけが販売されていました。各体験版はあすたろとさんのページで公開されていますので内容は省略します。レーギの順番に宝箱を消していくのがなぜかいい感じで、ちまちまと進んでしまいます。
 ぱずるのP/ECEさん
 新たなP/ECE本が販売されていました。中身はかいていいのかわからないので省略します。帰りの電車の中で何回か読み返してしまいました。そんなにページ数が多いわけでもないのに読み応えばっちりです。
 ちょこまかすもーきーが販売されていました。体験版は六波羅さんのすぺーすのページで公開されていますので内容は省略します。

 冬に比べてたくさんのサークルがあったので、いろいろ収穫がありました。また、実際に改造されているP/ECEが見れたり、P/ECEで動かせるものがあったりするのはとても楽しいものでした。
 今回はてとら★ぽっとさん『コミケ62カタログ・P/ECE編』のおかげで楽にチェックすることが出来たという事もありました。
 次回の冬にどうなっているか、楽しみです。
戻る
便利なP/ECEハンドブック(2002-08-01)

 P/ECEハンドブックが先月に発売となっています。すでに入手していたのですがいろいろなことがあってずっと当ページの更新が停止していました。
P/ECE HAND BOOK
 開発リファレンスはおまけについて、インタビューからテクニックまでいろいろなことが網羅されてます。また、添付CDには最新システム、ソフト200本、素材、そしてさらに開発解説の追加までと、とてももりだくさんです。
 現在は上記ページで麻雀プロジェクトが進行中です。まさにライブ感覚で、とても楽しい構成になっています。ぜひ見に行ってみましょう。
戻る
制御に使う(2002-03-06)

 P/ECEは最初から回路図まで付属しているということで、ゲームとかで遊ぶだけでなく何らかの制御とかにも使えそうです。そういうプログラムだったら徹底的に自分でいろいろいじってしまえそうです。元々のP/ECEのプログラム規約っぽいものに反した組み方でも問題ないって事で、そういったものを作る時のポイントなんかをチェックしてみました。(2002年03月06日 version 1.18カーネルで確認しています)

 1.リセット時に自動で特定プログラムが動いてほしい
 2.AppInit〜AppProc〜AppExit形式じゃなく、実行状態を握りたい
 3.自分の必要な割り込み以外を停止したい

1.リセット時に自動で特定プログラムが動いてほしい
 通常のアプリのようにプログラムを組むわけですが、最後の実行ファイルの名前を「startup.pex」とします。これで、リセット時に自分の好きなプログラムを実行できるようになります。

2.AppInit〜AppProc〜AppExit形式じゃなく、実行状態を握りたい
 通常のP/ECEアプリケーションでは、何らかの対策を行わない限りmain(...){...}の形式で記述できないわけです。ですが、今回は配布するってわけじゃないです。ということで....
void pceAppInit( void )
{
main();
}

void pceAppProc( int cnt )
{
pceAppReqExit(-1);
}

void pceAppExit( void )
{
}
という風にかいちゃえば、mainで全部実行環境をのっとっちゃえます。問題点としては、pcePadGetが使用できないのと、system menuが呼び出せなくなるっていうのがあります。パッド入力を利用するならpcePadGetDirectを使用、system menuはあきらめるって方向で行くことになりそうです。

3.自分の必要な割り込み以外を停止したい
 高速ポーリングなどが必要で、割り込みを全部停止してしまいたい時は割り込みレベルをあげちゃいましょう。c言語レベルでは、以下のようにすれば割り込みレベルを操作できるようです。
#include <s1c33cpu.h>
...
SET_IL7;
...
 同様にSET_IL0を記述することで、割り込みレベルを下げることができます。
 ただ、いつのバージョンからかP/ECEはNMI割り込みを使用するようになっているので、NMIさえも停止したい場合は以下のようにして一時停止してしまいましょう。

  *((char*)0x40170)=0x80;
  *((char*)0x40171)=0x00;

 逆に復帰する場合には以下のようにします。

  *((char*)0x40170)=0x80;
  *((char*)0x40171)=0x02;

 以上で、ソフト的には結構色々とできるんじゃないかと思います。必要ならば48MHz動作にし、割り込みを全面禁止して、内蔵RAMにコードを置いてしまえばMHzオーダーでも応答可能かもしれません。カーネルを書き換えずに行う、お手軽な内容の割には結構いい感じです。
 もちろん、カーネルを書き換えてしまえばさらにいろいろできることになります。緊急カーネルを残しても500KB以上のFLASH-ROMがあるわけですから、大抵のことはできると思います。
 すでに48MHz動作(P/ECE hackingさん)、EXT端子の使用方法(まどかのP/ECEさんの2002/02/23日記)、CMOSカメラの接続(AFFぱ研さんからLINK)、加速度センサの接続(eto Universal Laboratoryさん)など、いろいろ公開されています。内部のEXT端子にはシリアル1チャネル分として必要なものも出ていて、調歩同期式であれば1Mbpsまで結構自由に設定できるのでいろいろできそうです。
 本体改造してしまうと思えば、P/ECE研究室さんところ(ここ数日たどりつけないのですが...)のようにボタンのところをA/Dコンバータの入力(A/D入力として6チャネル使用可能)としても使用できるようです。
戻る
こまっちんぐコマンチ先生・MAXIMUMオーバー殺シスギル!(2002-02-28)

 exec_vox.lzh(464KB)代理アップロード


やったぜFM音源、だけどちょっと携帯着メロみたい。だって2OPじゃん(2002-02-28)

 exec_fmwave.lzh(19KB)代理アップロード


集まれTVっ子!(白黒テレビか?)バージョンアップ版(2002-02-28)

 exec_color13.lzh(44KB)代理アップロード


 P/ECEソフトをいきなり三つ渡されたので、とりあえずuploadします。(ひとつは以前の白黒テレビのバージョンアップ版)
 詳しくは各圧縮ファイルの中にある解説のテキストをご覧ください。
戻る
いろいろ100(2002-02-23)

 P/ECEの特別記事がのっているってことで、Cマガジンをかってきました。記事はWonderWitchとの比較からはじまって、プログラムを作成するまでが丁寧にわかりやすく書かれていて、読みやすいものでした。
 と、本の裏側をみてみると、

 カラーバージョンのP/ECEが4月に発売

 と書かれています。クリアーレッド、パールホワイト、クリアブルーの3色です。パールホワイトが結構よさそうに思えました。ところで、その発売の文字の下に

 買ったその日から100本以上のソフトで遊べる!

 とありました。ちょっぴりひっかかるものもないではないですが、発売から2ヶ月+αで100本を越えているのは大変な勢いだと思います。P/ECEソフトコンテストの1月賞も発表になり、良質なソフトがいっぱいでてきてるのは1ユーザとしてうれしい感じです。
 ところで、当サイトの「すでに公開されているプログラム/情報など」も100をこえました。意図してリンクしてないところもあったりするので、総数はさらに上をいきます。P/ECE発売から考えると「1日1ページを越える勢い」なので、びっくりするとともにすごいなぁと思うばかりです。
戻る
※弊社オフィシャルサイトもしくはユーザーサイト等からダウンロードできます。だそうです
パターンを描く(2002-02-22)

 P/ECEで絵や文字を描こうとしたとき、避けて通れないのが1ドットづつの描画です。P/ECEで一般的なのは1ドット=1バイトの仮想VRAMですので、何かを描こうとした時には結構処理が重くなってしまいます。軽減するためには....

 「ドットを描かない」

のが一番です。ドットを打たなかったら絵も文字もでない?

 「不要なドットはできる限り描かない」

です。理屈はそうなのですが、ぱっと考えたところでドットを描かないようにするためには、いろいろ面倒なことをしたりとか、作るもので表現を工夫したりとかしなくちゃいけなさそうです。普段からドットを描かないように考えながら物作るのもたいへんですし、できればそんなことしたくないです。なので、とりあえずは

 「できる限り効率的にドット描く」

というのがよさそうです。
 標準で用意されているpceLCDDrawObjectは描画時にいろいろな方法で描画できるようになっている分、若干効率が悪くなっています。そこで、mask付きの描画ということであれば、P/ECE研究室さんのところのpceLCDDrawObject高速版を利用することで簡単に効率よくドットを描くことができます。
 このような高速版を利用させていただきつつ、再描画しなくてはいけないところには描画しないなどこころがけてみるとよさそうです。
戻る
ねこさんぷる(2002-02-12)

 P/ECEを利用した白黒テレビのサンプルに自分でとった写真のネコさんを使用することにしてみました。
ねこさん1 ねこさん2
 画面のキャプチャにはまかべひろしさんのPceCapsを使用しました。
 ねこさんぷるのP/ECE用データと設定テキストファイル(nekosamp.lzh/96KB)
 ねこさんぷるの元画像データ(neko.lzh/11.8MB)
 サンプルをみてみるだけの場合は、nekosamp.lzhのみダウンロードしてください。nekosamp.lzhを展開し、中のファイルneko.cgl又はnekomesh.cglと、白黒テレビのpal_ext.pexをP/ECEに転送、実行後Aボタンを押すとねこたちの写真をみることができます。
 さて、ファイルの作り方です。nekosamp.lzhを展開したディレクトリにnekoディレクトリを作成します。そして、その中にneko.lzhの中のbmpファイルを展開してください。最終的に以下のようなファイル構成になる予定です。

 neko/0.bmp , neko/1.bmp , .... , neko/d.bmp
 neko.cgl , neko.txt , nekomesh.cgl , nekomesh.txt

 ここで、コマンドプロンプトを起動、neko.txtファイルがあるディレクトリに移動します。その上で白黒テレビのcvcgl.exeを以下のように起動します。(cvcgl.exeはパスのとおったところに置くか、neko.txtと同じディレクトリにコピーしてください)

 cvcgl neko.txt

 コマンドプロンプトで上記のように入力し、Enterキーを押します。時間をかけて圧縮が行われた後に、neko.cglファイルが出来上がります。
 neko.txtおよびnekomesh.txtがそれぞれ圧縮ファイルの設定指示ファイルとなります。neko.txtとnekomesh.txtの違いは、白黒減色時に絵にメッシュをかけることにあります。グラデーションなどがかかっている部分に効力を発揮するようです。
 以下のようなところが共通の内容です。

 ・nekoディレクトリからbmpファイルを読み出す(#dir neko)
 ・使っている色付近だけを強調して、くっきり見せます(#adjust_on)
 ・絵の全体を128x88に変換します(#area 100)
 ・絵1枚を2秒(120/60秒)で表示します(#save neko(mesh).cgl 120 pics)

 今回のような写真の場合、メッシュあり・なしでそれほど見た目が変わりません。その割に圧縮率が悪くなっていますから、データをみてからあり・なしを指定する方がいいようです。
戻る
白黒テレビか?(2002-02-10)

 P/ECEをいろいろいじりまわしていると、周りの友人もP/ECEをいじるようになりました。で、友人の一人が

 「集まれTVっ子!(白黒テレビか?)」

 っていうヘンなソフトを作ってきました。本人はWebページを持っていないので代理でアップロードします。
 pal_ext.lzh(圧縮ツール、P/ECE実行ファイル、説明)のダウンロード
 データの作り方などは、pal_ext.lzh内のreadme.txtに記述されていますので、そちらをご参照ください。
戻る
高速化と最適化(2002-01-17)

 P/ECEにかぎらず、世の中にプログラムがある限りコードを良くするためにいろいろやるなんてことはよくあります。ところが、P/ECEのような携帯機器については微妙に「高速化」と「最適化」の意味合いがかわってくるような感じがします。
 まず最適化。簡単には付属コンパイラの最適化オプションをつければいい感じです。ですが、すでにO2という普通ならこんなもんだろうっていう最適化オプションがサンプルの「HelloWorld」でさえ指定されています。もう手の出しようがありません。実はO3ということもできるのですが、これは「可能ならインライン展開する」という面を含んでいて、プログラムが肥大化する原因になってしまいます。キャッシュRAMをもたないP/ECEではインライン展開はそれなりに有効なのですが、それ以上に「容量」が大切です。あとはアルゴリズムでより良くなるような方向で書き換えたり、コード面で「展開コードが小さくなるような最適化」をかけることになります。
 次に高速化。簡単な方法があって、P/ECEのプロセッサにはキャッシュはないですが内部RAMというものがあります。こちらによく使うワークなりプログラムを転送してしまえば、それはもう凄まじい高速化が期待できます。

 内部RAM3倍段

 っていってもいいかもしれません。
 こうしてみるとゲームなんかではプログラムが高速にぶん回れば「よりいろいろできる!」なんてことになったりするわけですが、ちょっとお待ちください。

 世にある最近のプロセッサやデバイスは、動作1エッジあたりに電気を食うと見てまちがいない

のです。1エッジなんていうとわかりにくいかもですね。1クロックと考えてもらったらいいと思います。ですから、AthronとかPentiumなんかでもMaxで動きつづければ「電球にも負けない」電力を消費しますが、効率的に停止して使用すれば冷えびえ〜って感じです。
 P/ECEのプロセッサでも内部RAMにもっていけば、3倍で動作するかもしれませんが、プロセッサ消費電力がまんま3倍になるかもしれないのです。

 変化しないところは書き換えない(結果的に最適化になります)
 表示が変化してないならLCDTransしない(ついでに4ms近くオトクです)
 入力に変化がなくて反応しなくていいときは速やかにAppProcからReturn(音がなってなかったら寝てくれます)

 こんな風な感じで最適化することにより、限りある電池パワーを有効に使っていきたいものです。
 内蔵RAMは消費電力がふえそうといっているものの、外部RAM上で間に合っているプログラムの一番良く使うところを内蔵RAMに転送し、すみやかにpceAppProcから抜ける分には「外部バスが動かない分ちょっといい感じ」になることも期待されます。要は使いようってことですね。
 無論、ゲームのように「どうしても表現したいモノ」があるときは電池を気にせずがんがん突き進むという方向性もアリでしょう。
戻る
スタックの切り替え(2002-01-18)

 P/ECEのスタックはデフォルトで内蔵RAMに指定されています。ですが、最初のアップデート時にスタックサイズの変更が可能になったようです。ダウンロードページに書いてあるのですから、どういった感じになっているのか調べてみました。
 カーネルのrunapp.cとライブラリのcstart.cによると、グローバルシンボル_stacklenが0以外でかつ、アプリケーションバージョンが新しい場合にはスタックをヒープから自動的にとるようになっているようです。
 では実際にどうするかというと、こんな風にリンク時のオプションを指定すればいいようです。(変更箇所はmakefile内です)

 LDFLAGS = -g -ls -lm +defsym _stacklen=0x1000

 この場合では0x1000バイトをヒープから確保し、スタックにするということになります。こうすることによって任意のスタックサイズでプログラムを作成することが可能になるようです。必要であれば全メモリの半分をスタックに指定し、再帰まみれのいかしたプログラムも可能になるって感じです。ただし、スタックを外部RAMに持っていくということはいろいろな事も変化します。

 内蔵RAMより外部RAMは遅い
  32ビット書き込みが2回のメモリアクセスになる
  1回のメモリアクセスあたりの速度がかなり違う
 関数呼び出しなどで遅くなる
 割り込みルーチンはすべてその遅さに引っ張られる

 内蔵RAMのスタックは4KBということもあり少ないわけです。なので、スタックぎりぎりで恐々プログラムを組んでいたという場合には安心になれるかもということです。
戻る
高速化その1(変数を内蔵RAMへ)(2002-01-18)

 P/ECEで高速化といえば、内蔵RAMの有効利用。
 どこからどこまでユーザがつかっていいのかを確認してみると、/usr/piece/docs/資料/の中にinfo.txtというのがありました。この中にメモリマップがかかれています。なんか「フラッシュ 1MB」とか書かれていますが、見なかったことにします。アドレスではc00000〜c80000の$80000なんですから。
 肝心の内蔵RAMは000000〜002000となっています。このうち前半4KBはシステムが使用、残りの4KBがユーザとスタックで奪い合いって事みたいです。
 スタックの切り替えで書いたとおり、内蔵RAMをスタックで使用しないようにすることさえ可能なので、うまくすればかなりのことができそうです。
 まずは変数のアドレス変更。リンカで指定することにより簡単に内蔵RAMに移せるようになっています。サンプルの/usr/piece/app/hello/を元にして変数を内蔵RAMに持っていくことにすると以下のような感じになります。(変更箇所はmakefile内です)

 LDFLAGS = -g -ls -lm +bssblock FRAMB {hello.o} +addr 0x1000 {FRAMB}

 ここで、すぐさま変更して実行しては「いけません」。hello.cはメモリを使っていないように見えて表示バッファという大きな荷物をかかえています。上記変更だけして実行したりするとどこかのおばかさんみたいにvbuffを0でフィルしているつもりで「スタックとカーネルワークの大破壊」をすることになります。ここは慎重に(変更箇所はhello.c内です)

 unsigned char vbuff[128*88];
   ↓
 unsigned char *vbuff;

pceLCDSetBufferする前に

 vbuff=pceHeapAlloc(128*88);

って感じにします。これで大丈夫。makeして実行してみます。
どうですか?爆速になりましたか?はやすぎて差がわかりにくいかもしれませんね。
念のために本当に内蔵RAMに変数が移動しているか見てみましょう。こういうときはhello.map(マップファイル)とhello.sym(シンボルファイル)を見れば一目瞭然です。

hello.map
Bss Section mapping
Address Vaddress Size File ID Attr
00001000 -------- 00000008 hello.o 2 REL
ということで、無事にhello.c部分のbss領域が内蔵RAMに移動しているようです。

hello.sym
vbuff hello.o bss global 00001000
draw hello.o bss local 00001004
シンボルファイルで変数のアドレスを確認しても、それぞれ1000と1004に移動していました。きちんと内蔵RAMに移動しているようです。
今回はhello.cのbssサイズが00000008バイトということで、スタックとぶつかりあうことは「かろうじてなかった」わけですが、いつもこううまく事が運ぶとは限りません。こういうクリティカルな事をする場合には実行前に必ず

 マップファイルを見て、きちんと考えてたサイズに収まっているか

を確認するようにしましょう。
戻る
高速化その2(プログラムを内蔵RAMへ .srf編)(2002-01-18)

 P/ECEの高速化第2弾(第2段ではありません)として、さらなる内蔵RAMの有効利用をしてみます。
 プログラム自体を内蔵RAMにもっていけば、これまたさらに高速になりそうな感じです。サンプルの/usr/piece/app/hello/を元にしてプログラムを内蔵RAMに持っていくことにすると、以下のような感じになります。(変更箇所はmakefile内です)

 LDFLAGS = -g -ls -lm +codeblock FRAMC {hello.o} +addr 0x1000 {FRAMC}

 一応高速化その1(変数を内蔵RAMへ)と同じくマップファイルをチェックしておきましょう。今回は0xa8ということで大丈夫そうです。実行!
 どうですか?爆速になりましたか?さらにはやすぎて差がわかりにくいかもしれませんね。
 念のために本当に内蔵RAMに変数が移動しているか見てみましょう。またもやhello.map(マップファイル)とhello.sym(シンボルファイル)を見てみます。

hello.map
Code Section mapping
Address Vaddress Size File ID Attr
00000000 -------- 00000000 C:\usr\PIECE\lib\pceapi.lib:stacklen.o 1 ABS
00001000 -------- 00000088 hello.o 0 REL
ということで、無事にhello.c部分のcode領域が内蔵RAMに移動しているようです。

hello.sym
__LC0 hello.o code local 00001000
pceAppInit hello.o code global 0000100e
pceAppProc hello.o code global 0000106c
pceAppExit hello.o code global 00001084
シンボルファイルでもプログラムがすべて内蔵RAMに移動しているのが確認できます。え?__LC0はなに?これは"Hello, World\n"という文字列です。今回のような参照されるだけの文字列はcodeセクションに入るようです。
 PCからUSB経由で.srfファイルを実行する場合には、このようにして簡単に内蔵RAMを使用したプログラムが作成できるようです。
戻る
高速化その3(プログラムを内蔵RAMへ .pex編)(2002-01-18)

 P/ECEの内蔵RAMを利用してプログラムを実行できたのはいいですが、これをpexファイルにして実行しようとすると問題があります。ppackではなぜかうまく圧縮できたように見えますが、hello.pexファイルをP/ECEに転送して実行してみると....

 !! TRAP
 Call address 0

って出てしまいます。どうも1000と100000といったように、離れたところに分断されたようなsrfファイルはうまく圧縮できないようです。それではどうしたらいいかというと、リンカの「仮想codeセクション」という機能を使用すればいいようです。この機能を使用すると「指定のcodeセクションを、指定のアドレスから配置して実行できるようにシンボルアドレスを解決してリンク」してくれるようになります。もともとROMに書き込まれたプログラムをRAMに転送して実行させる場合の機構ですが、今回の場合にもぴったり使えます。
 今回はhello.cのpceAppProcに内蔵RAMへいってもらいましょう。

 hello.cからpceAppProc関数を切り取り、draw変数定義部のstaticを削除

 hello2.cを以下の内容で作成
    #include <piece.h>
extern unsigned char draw;
void pceAppProc( int cnt )
{
if ( draw ) {
pceLCDTrans();
draw = 0;
}
}
 makefileの以下の行を書き換え

  LDFLAGS = -g -ls -lm +codeblock FRAMC {hello2.o} +addr 0x1000 {FRAMC}
  OBJS = hello.o hello2.o

 では、make→run!とりあえずきちんと動作したでしょうか?
hello.map
00001000 -------- 00000018 hello2.o 0 REL
hello.sym
pceAppProc hello2.o code global 00001000
 上記のような感じになっていたらとりあえずここまではOKです。さあ、仮想codeセクションを利用してみましょう。

 makefileの以下の行を書き換え

  LDFLAGS = -g -ls -lm +codeblock FRAMC {hello2.o} +addr 0x1000 {@FRAMC}

 hello.cの先頭に以下のマクロを定義(pcekn.hに定義してあったものの流用)
    /*
高速RAMへのコードのコピー
*/
#define FRAMCOPY(dstsect,srcsect)\
{\
extern unsigned long __START_##dstsect[];\
extern unsigned long __START_##srcsect[];\
extern unsigned long __SIZEOF_##srcsect[];\
memcpy(\
&__START_##dstsect,\
&__START_##srcsect,\
(unsigned)&__SIZEOF_##srcsect\
);\
}
 hello.cのpceAppInitに以下の行追加

  FRAMCOPY(V_FRAMC,hello2_code);

 修正ができたらmakeしてみましょう。このときにマップファイルを見てみると、以下のようになっています。
hello.map
Code Section mapping
Address Vaddress Size File ID Attr
00000000 -------- 00000000 C:\usr\PIECE\lib\pceapi.lib:stacklen.o 1 ABS
00100000 -------- 0000009c C:\usr\PIECE\lib\cstart.o 0 REL
0010009c -------- 00000084 hello.o 0 REL
00100120 00001000 00000018 hello2.o 0 REL
 hello2のコードセクションは10009cから実際のコード、アドレスとしては001000としてマッピングされているということがわかります。
 では、実行してみましょう。まずはhello.srfからの確認です。これで動作を確かめることができれば、make pexとして実行ファイルを作成してみましょう。

ppack -e hello.srf -ohello.pex -nHelloWorld
 100000-100137
 100138-10032b
100000 - 100280

 上記のように表示されれば、同じようにできていると思います。P/ECE上に転送して実行してみましょう。
 どうですか?実行できましたか?
 ポイントとしては以下のような感じでしょうか。

 addrで指定する名前に「@」をつけると「仮想codeセクションとなる」
 マップファイルではVaddressとして表示されるアドレスに注目
 FRAMCOPYマクロのパラメータ
  第1パラメータ:リンク時の名前の手前に「V_」をつける
  第2パラメータ:ファイル名の後ろに「_code」をつける

 これで、内蔵RAMをコードで使用しつつ、.pexファイルを作ることができました。
戻る
高速化その4(プログラムを内蔵RAMへ 総合編)(2002-02-03)

 P/ECEの内蔵RAMを利用した高速化についてのまとめをしてみましょう。P/ECEの高速化をするまえにコンテンツ書きの高速化をせよ?ものぐさにはできることとできないことがあるようです。
 リンク時の指定により、簡単に内蔵RAMへプログラムや変数を引越しできたわけです。が、すべてをひっくるめて移動する場合にはどうすればいいでしょうか?
 高速化その1(変数を内蔵RAMへ)高速化その3(プログラムを内蔵RAMへ)のあわせ技を使用しようとした場合には、以下のような指定となります。(変更箇所はmakefile内です)

  LDFLAGS = -g -ls -lm +codeblock FRAMC {hello2.o} +bssblock FRAMB {hello.o} +addr 0x1000 {@FRAMC FRAMB}

 これで、内蔵RAMにhello2.c分のプログラムが仮想codeセクションへ、hello.o分の変数がその直後へ配置されたかと思います。マップファイルで確認してみてください。
 ここまでくればもうおわかりかと思いますが、高速化が必要な変数およびプログラムだけをべつに抜き出してさえおけば、最後にドンと内蔵RAMに追い出すことで高速化がはかれるというものです。もちろん、スタックは自分で明示的に変更しなければ元々内蔵RAMにあるわけですから、スタックを使用する局所変数をうまく利用することで高速化を狙うこともできます。また、そういう組み方をしていればコンパイラがレジスタ割付をしてくれるかもしれません。
 ゲームなんかでどうしても速度不足になったとき。そして、自分だけ使えればいいっていう高速ポーリングが必要な用途(?)なんかの時は、割り込み禁止にして内蔵RAMでぶんまわってしまえば、かなり高速に応答できることでしょう。
 普段は本道である「電池にもやさしい」最適化による高速化、そして不足した場合に内蔵RAMを使用した高速化、と使い分けるようにしていきたいですね。
 ここまで書いてから白状しますが、このあたりの事はすでにカーネルでバンバンおこなわれていて、当方もその指定を参考にしつつ実行してみたものです。
 カーネルではこれ以外にも内蔵RAMを共有セクション化して、必要なときに必要なプログラムを転送するようになっているようです。このような更なる内蔵RAMの有効利用に関してはカーネルのリンク指定ファイル(/usr/piece/sysdev/pcekn/pcekn.cm)や、その関連ソース群を参考にしてみてください。
 あ、ひとつ注意点を忘れていました。こうしてリンク時の指定をどんどん増やしていくと、いつしかコマンドラインの長さ制限に引っかかる可能性があります。ですから適度なところでリンクファイル指定にした方がいいかもしれません。

  参考文献
   ヘッダファイル(/usr/piece/sysdev/pcekn/pcekn.h)
   リンク指定ファイル(/usr/piece/sysdev/pcekn/pcekn.cm)
戻る
時間を計る(2002-02-05)

 P/ECEには時計機能がついていますが、P/wareのもってるP/ECEは時計があってる事がかなりマレです。USB接続の時には電池抜いててもいいってことで外していて、持ち歩こうと引き抜いたときに「あっ」と思うことがしばしば。USB接続の時は電池がなくても動くうえに、電池がないとさらに軽くてらくちんなのでついついやっちゃいます。
 P/ECEには上記のような時計機能以外に「超高精度カウント値」を取得できるAPIが用意されています。μS単位の時間をはかれるということなので、いろいろな処理の時間をはかってみるのによさそうです。APIマニュアルには注意が3つくらいありますが、実際に計測する時に問題になりそうなのは注意3「約 65秒 で1周します」位のような感じです。
 hoge関数の処理時間を計測しようとすれば以下のような感じでしょうか。
    unsigned long st,ed,time;
st=pceTimerGetPrecisionCount();
hoge();
ed=pceTimerGetPrecisionCount();
time=pceTimerAdjustPrecisionCount(st,ed);
pceFontPrintf("hoge time:%d uS\n",time);
 じっくり時間を計測したいところ周辺でpceTimerGetPrecisionCountの値を取得しまくって、後でごっそりpceTimerAdjustPrecisionCountでポイント間の時間を取得すればよさそうです。
 もちろん計測中もいくつか割り込みは動いています。なにもせず上記のような計測をおこなえば、計測中に割り込みがかかった分の時間、のびることになります。曲をならしていれば、その曲の重さの分の時間が追加されるって感じです。ですので、割り込みの時間を除いたプログラム部分の時間を計測するには、割り込み禁止にする必要があるようです。ただ、カーネルのtimer.cによると時間計測用の割り込みだけは割り込み禁止時にも止まらないようなので、約0.2%の誤差が残るようです。
戻る
重いところ探し(2002-02-06)

 P/ECE上で動くプログラムというと、基本はパッド/ボタン入力→処理→液晶に表示って感じです。ゲームなんかだとついつい楽しみつつ、いろいろなことをしちゃいがちです。そうしてだんだんと動作が重くなっていきます。

 重い軽いも味のうち

 とも言えるのですが(自動バランス調整と言い切るひともいします)、ほったらかしにしていると最初から重くてレスポンスの悪い状態になったりしかねません。
 プログラムが動作する機械によって特性はかわりますが、こういう場合処理時間は「70%を使うほんの一部のプログラム」と「30%をつかう残りプログラム全部」という配分になってることが多いです。極端なものだと95%を使うほんの一部となったりすることもあります。全部がそうとはいえませんが、こういう場合は「どこがその一部か」を見つけることが肝要です。プロファイラのようなものがある環境もあったりしますが、ないものを望んでみてもはじまりません。P/ECEでプログラム作成する場合は1人で組むことがほとんどだと思います。ですので、重そうなところは把握してることが多いと思います。この辺かな?というところで時間を計ってみるのも有効な手段でしょう。
 システム側の表示が重いなぁとか思ったときにはP/ECE研究室さんところを訪れてみましょう。pceLCDDrawObjectの高速化されたバージョンなどを作成されている他、表示に関連する情報などいろいろ調査なさっています。困ったとき、とても楽になるかもしれません。
戻る
変数の引渡し(2002-02-07)

 P/ECEのc言語の関数はインラインアセンブラで書いたようなレジスタ割り付けにて命令展開が行われます。引数渡し用は4レジスタということなので、4パラメータまでなら結構いいかんじでコードが作成されるって感じです。普段プログラム作成時には気にせず、何十回〜何百回呼ばれるような関数ではちょっぴり気にしておけば少しいいかもです。
 cコンパイラでの引数の渡し方は「Cコンパイラパッケージのマニュアル」に詳しく書いてありますが、重要そうなところは以下のとおりです。

 ・引数は4ワードまでがレジスタに、超える分がスタックに格納されます
 ・4バイト以下の型の引数はデータ型にかかわらずワード(4バイト)単位になります
  char,shortは符号拡張、unsigned char,unsigned shortはゼロ拡張します
  doubleは2つのレジスタを使用します
 ・ポインタは1ワードなので、1レジスタを使用します
 ・構造体データは必ずスタックを使用します
 ・構造体へのポインタの場合は1レジスタを使用します

 また、レジスタ割り当ての法則から、以下のようなところに気をつかって変数を使用するといい感じです。

 ・関数を呼び出さない関数は10個の変数位だとスタックを使わない
 ・関数を呼び出す事がある関数は関数呼び出し時に保存する必要がある変数が4個だとスタックを使わない

 実際には結構賢く最適化がおこなわれるようで、少しくらいは大丈夫そうです。
 普段、関数は4パラメータ、構造体はポインタで、位に気をかければ十分で、c言語レベルで最適化を行いたい場合には上記のことを少しだけ思い出すようにするといい感じになるかもです。
戻る
RED FOX(2001-12-26)

 P/ECEについてとりあげつつ、何もアプリがない状態が続いている当ページです。なにかないかなぁと見回してみると、昨日1箱購入した赤いきつね(特売で1つ78円)を発見。数あるカップ麺のなかでも最高の品質を誇る、かの逸品のためにタイマを作ることに決定しました。なにげにつぶれた「関西」印があるのは、当方が関西に住んでいるためです。関東の方はがんばって絵をかきかえてください。
REDFOX
画面のキャプチャにはまかべひろしさんのPceCapsを使用しました。
減色処理には平手さんのMPBMakerを使用しました。
ファイル転送にはnsawaさんのmini ISDを使用しました。
実行には剣もとあきさんのポケットの中の妹「P/ECEなつみ」を使用しました。
便利なツールを作成なさっている方々に感謝いたします。

 ところで時間がはかれるのはいいのですが、P/ECEを重しにしてP/ECEが熱でおかしくなったり、ダシの海に沈んだとしても当方は一切関知しませんので、よろしくお願いします。また、正しく動作することを期待して作成しておりますが、使用する事により生じる、いかなる損害(途中で電池が切れて麺がのびすぎたとか)に関してもP/wareは一切責任を負いませんので、こちらの方もよろしくお願いします。
 redfox.lzhのダウンロード
 使用方法は、Aボタンでタイマスタート。カウント中にAボタンでタイマを停止します。スタートボタンを押すと、いつでもランチャに戻ることができます。
 ソースコードは自由にしていただいて結構です。が、使う人に迷惑になるものにすることや食欲がなくなるものにするのはご勘弁ください。私はあとカップヌードル版があるとうれしいです。
 5分ちょうどからピピピとなるようになっているため、約3秒分余分に麺がふやける可能性があります。
戻る
付属ソースを元にしたプログラムの再配布情報など

 P/ECEオフィシャルウェブサイトのP/ECE Informationで、付属ソースの扱いなどについて発表がありました。要約すると以下のような感じです。
(正確にはP/ECE Information ページを参照してください)

 ・カーネル、ライブラリ、アプリケーションのソースファイルは再配布可能
 ・アクアプラスが著作権を所有、ただしP/ECE用としてなら自由にしていい
 ・配布時にアクアプラスの許可は不要
 ・改変したもので不具合があった時、アクアプラスに迷惑がかからないようにする

 と、非常にゆるやかなものです。簡単に言ってP/ECE用だったら「おでまる〜〜版」とかいって服や音楽のデータを全部自分で作り直せば、アプリとして配布も可能ってことみたいですね。
 ほかにはダウンロードページに待機時の電力消費の削減、省電力モードの追加が行われたシステム、ミニゲーム『おじょ魔女ミニ』(おもしろいのですが、先のほうではやすぎて目が回ります)、画面キャプチャツールなどが用意されていました。
戻る
adpcmとspriteのデータ

 P/ECEの最新システムで対応されたADPCM再生とスプライトライブラリなのですが、データをどうやって作るのかがマニュアルに書いてありませんでした。
 ですが、P/ECE BMPコンバータとP/ECE PCMコンバータのツールのほうは既に対応版が中にはいっているようです。P/ECE BMPコンバータについてはすでに解説がP/ECE工房さんの「スプライトの使い方」にかいてあります。
 P/ECE PCMコンバータの方はいままでとほとんど使い方は同じで、ADPCM形式にチェックするだけのようです。ADPCM形式で作成する場合は元のWAVEファイルが16KHz16ビット固定のようなので、いままで8ビット形式で作成されてた方は、素材の方からやり直す必要があるかもです。ぱっと聞いてみたところでは8ビットのデータを16ビットに単純に引き伸ばしてやるだけでもADPCMであるためかそんなに変化はなさそうです。
戻る
シンプルとスプライトのライブラリ

 P/ECEの最新システムがアップデートされたことにともない、ライブラリが追加されています。大きなものではスプライトライブラリとシンプルライブラリ。ともに特徴は

 スプライトライブラリ

  バックグラウンド面2面(キャラクタ単位)とスプライトの表示をする
  だいたいパレットのないワンダースワンあたり?
  ハードウェアじゃないので、ちょい遅い?

 シンプルライブラリ

  簡単にアプリケーションがつくれる(そのかわりAPIがつかえない)
  画面転送を自分で明示しなくていい
  smainで実行制御をにぎってる感じでつくれる

 てなかんじです。シンプルライブラリで簡単にアプリが作れそうなのはいいのですが、その分機能が制限されているってところです。
 すでにP/ECE工房さんにて、スプライトライブラリとシンプルライブラリの解説が!あまりにすばやい対応と、中身の充実ってところから、P/ECE工房さんをみにいくことをお勧めします。
戻る
最新版システムアップデート

 P/ECEの最新システムがアップデートされていました。ダウンロードページから落とせるようになっています。
 変更点にかいてあるところで大きそうなところは以下のとおりです

 タンクバトルのフルセット
 おでかけマルチの修正
 スプライト機能ライブラリ
 Simpleライブラリ
 サンプルの充実
 BIOS機能の強化
 ツール類の更新

 まずおでマルをバックアップしてから、当方でもアップデートして試してみます。
戻る
P/ECEでのプログラム実行

 P/ECEでのプログラムの実行には2通りあるようです。

 1.hogehoge.srfを(win)isdで転送して実行
 2.hogehoge.pexを(win)isdでP/ECEに書き込んでからP/ECE上で実行

 1.の時でも瞬間でプログラム転送→実行ができるのは、さすがUSB経由といったところです。このときP/ECEはプログラムをS−RAMに転送するようで、デバッグの時はこちらでやるとFLASHもいたまず、プロンプトからrunと打ち込むだけでいいので大変らくちんです。当方はいつもエディタにmuleをつかっているので、エディタ上のコマンドでmake <enter> run <enter>とするだけですべて出来ます。マウスに手をのばさずにすむ開発は大変便利です。(そのかわり、おでマルが実行ターゲットを奪う...)
 2.の時は、make pexで実行ファイルを作成するわけですが、容量の計算があいません。これはどうもhogehoge.pexを作成する時にファイルを圧縮しているようです。pcm波形などがほとんどだと縮まることはありませんが、純粋なコードやデータが多い場合は結構縮まるようです。メインプログラムに配列などでデータを組み込んでおけば自分で圧縮する必要がないため、とても便利です。
 こういう仕組みであれば、ほとんどフラッシュに書くことはないため、10万回の制限まではかなり耐えそうです。
戻る
インラインアセンブラ

 P/ECEのcコンパイラはgccですが、付属しているインラインアセンブラにはgccの拡張のようなものはないようです。cで使用されるレジスタは以下のとおりです。

  r0-r3 関数内で破壊不可(pushで保存すれば使用可能)
  r4-r7 関数内で破壊可能
  r8  グローバルポインタ(絶対破壊不可、いつも0がはいってるみたい)
  r9  ext33で使用するスクラッチレジスタ(ext33の展開わかってれば使えそう)
  r10  戻り値用で破壊可能
  r11  戻り値用highで破壊可能
  r12-r15 引数渡し用で破壊可能

 こうしてみると結構なレジスタが使用できることがわかります。とくにr15が普通のレジスタであるって言うのは新鮮です。そのかわりにr8やr9が奪われちゃっていますが、これはしかたないかな、って感じです。
 もともとのgcc拡張が使えるなら、安心してmirror等の命令が使えますが、今のところは以下のようにしたら使えそうです。ほんとならアセンブラソースで分けた方がいいんでしょうが、とりあえず簡単に試す分にはいいかもです。

int mirror(int num){
  asm(" mirror %r10,%12");
}

戻る
アセンブラのポイント

 P/ECEのプロセッサはEPSON製のS1C33209というRISCです。(公式ページより
 EPSONからダウンロードしたデータシートから、気が付いたところは以下のようなものでした。ぱっとみたところ非常にshににていると感じました。div0/div1なんかがあるところもそう思う一因です。div/mac等を見ていると、長いクロックの命令がないようにとの配慮が感じられます。一番長くなりそうなのはpushn/popnみたいですね。

  普通とサイズの呼び方がちがいます
   4byte - (.w)word
   2byte - (.h)harf ward
   1byte - (.b)byte
  キャリーを含んだローテートがありません
  ポストインクリメントだけでプリデクリメントがありません
  直前の命令によるストールが少なくできています
   EPSONでは、インターロックと呼ぶようです。
   メモリからデータを汎用レジスタに転送するロード命令のディスティネーションレジスタを直後の
   命令で演算に使用する場合に1サイクル遅延するようです。これ以外にはインターロックが存在し
   ないのですから、優秀だと思います。
  ディレイスロットにメモリアクセス命令をいれられません
  テーブルを引くためのアドレッシングがありません。ext+ldで定数なら可能のようです
  掛け算がとてもはやく実行できます
  ext命令による値の拡張ができます
  mirror/swap等の、特色のある命令があります(詳細はP/ECE一口メモさんへ)

戻る
おでマル!

 P/ECEの初回添付ソフトの1つ、おでかけマルチ。
 公式ページがいちんばんいろいろ書いてあるかと思ったら、公式からリンクされている流通卸業者の株式会社ヴューズさんところの方がチラシなどたくさんあってわかりやすく出来ています。
 販促素材のポップを見てみると以下のような文字があります。

 ・こころ、見つける旅に出よう。
 ・汗だ 涙だ おでかけだ。

 いったいどんなゲームなのか気になるところです。
 また、ここには画面写真などもあるのですが、このゲームの名前がでていました。その名も

 「おでマル」!

 マルチについて詳しくは知らないですが、とりあえず響きは気にいりました。

 ただいま公式ページにおでマルのソースコードが添付されているとの記述が更新されていました。
戻る
おでマル!2

 P/ECEの初回添付ソフトのおでかけマルチ。ついに発売されておでかけしてみると、何か操作できるわけでも無し....いったいこれの何が?ってかんじでした。
 他の仕事などしながらおでかけさせていると、??へんなもの??とか拾えるようで、これをパソコン側で鑑定するようです。ふむふむ、こうしてアイテム増やしたりしてのんびりやるゲームなのかな?って感じで軽視していました。
 ところが!

 着々と増えていくアイテム!
 世界各国のメイドロボとのバトル!

 すでに、どんな作業をするときでも横でおでかけさせっぱなしという状態になってしまいました。これは危険です。

 他のメインの作業(仕事なり、ゲームなり)やってるあいだにできる「ながらゲーム」だったのです!

 今となっては開発ターゲットのはずがおでかけ帰還まで待つ始末....「??」がフキダシに出たらパソコンで即鑑定、と超危険ソフトです。
 このままでは開発用P/ECEとおでまるようP/ECEが必要なのかもしれません。
戻る
プロセッサ データシート

 P/ECEのプロセッサデータシートはEPSONの以下のところにあります。
  32-bitマイクロコンピュータ
  コアCPUマニュアル
  cコンパイラ/アセンブラ 開発環境マニュアル
  テクニカルマニュアル
戻る
P/ECEの動作クロックが仕様に登場

 P/ECEのプロセッサのクロックが仕様に登場しました。

 24MHzです

 発売まで後少しです。
戻る
携帯ゲームの重量比較

 P/ECEがどのくらいの重さなのか、比較しつつ想像してみました。
 ゲームボーイ系は電池が2本になる分、さらに重量が増します。
ポケットステーション 約30g
ビジュアルメモリ 約45g
P/ECE 約67g(電池含まず)
ワンダースワン 約93g(電池含まず)
ワンダースワンカラー 約95g(電池含まず)
ゲームボーイポケット 約125g(電池含まず)
ゲームボーイカラー 約138g(電池含まず)
ゲームボーイライト 約140g(電池含まず)
ゲームボーイアドバンス 約140g(電池含まず)
ゲームボーイ 約220g(電池含まず)
戻る
いろいろ公開のP/ECE!

 P/ECEのオフィシャルページのFAQにて、発売時にどのようなものが公開されるかが記述されていました。

 ・「おでかけマルチ」「BlackWings」のソースコード
 ・ソフトウェア、ハード資料に関しての全て
 ・各使用チップのデータシート(収録許可のあるもの)
 ・ツールのC言語環境は、ANSI C準拠+専用ライブラリ

戻る
USBケーブルを買いましょう

 P/ECE公式ページを見ていると、「ご注意」がありました。

  当製品にはUSBケーブルが付属していません。製品をご利
  用いただく上でUSBケーブル(Aオス→Bオス)は必要不可欠
  ですので、ご注意くださいませ。

 当方は発売日の深夜販売で購入しようと思っていました。(深夜販売店舗は主に別の目的で開いてるようです。珍しいかもしれませんが、私はP/ECEのみ購入予定です)
 深夜販売では予約品のみの販売になることが多いですので、その時に購入できない可能性が大です。今までUSB関連で購入したものといえば...

 ・トロHUB
 ・マイクロソフトのInteliMouseOptical

 大変です。トロHUBだけではP/ECEを使うことが出来ません!
 深夜販売で購入予定でかつ、USBケーブルをもっていない方は今のうちにケーブルを買っておきましょう。
戻る
公式掲示板稼動中

 P/ECEのオフィシャルページにて、フリートーク掲示板が稼動し始めました。
 書き込みを見回してみると期待の高さが感じられます。
 「ハード資料に関して」もすべて公開するということからか、ハード系の方が目立つような気がします。たしかに、世の中のマイコンボードなんかに比べると開発環境付き、USB接続ということですから、それだけでお得感はあるかもです。さらに!おでかけマルチ、BlackWingsっていう添付アプリなんかもあるわけです。
 コンテンツ/ソフトウェア/ハードウェア全面から盛り上がるプラットホームになってほしいと思います。
戻る
P/ECE対応ソフト製作予定発表メーカー

 P/ECEのリンクコーナーにP/ECE対応ソフト製作予定のメーカーおよび雑誌社のリンクが追加されていっています。現時点では以下のとおりです。(各社リンクに対するポリシーが違ったりするので、リンクコーナーからどうぞ)

 ・アールフォース エンターテインメント
 ・EMU
 ・CIRCUS
 ・ソフトハウス キャラ
 ・林組
 ・BLACK RAINBOW
 ・minori
 ・maple

 P/ECE関連記事掲載・連載予定誌
 ・E-LOGIN
 ・コンプティーク
 ・パソコンパラダイス
 ・メガストア
 ・Cマガジン
 ・TECH Win(enban.net)
 ・マイコンBASICマガジン

 その他
 ・アキバ系.com
 ・ヴューズ

 P/ECEに参入予定というあたり「本当に何かを作ってきそうなところ」となんだと思います。アプリや記事を待つことにしましょう。
戻る
P/ECE発売

 ついにP/ECEが発売されました。開けてみたところとても軽く、ちいさいってところです。添付CDの中には本当に回路図・資料・BIOS/おでマル/Blackwingsのソースファイルなどが入っていました。
 ずっといじっていますので、詳しく書くのはもう少し後になりそうです。
 そうおもっていたら、すでに内容についてすでにP/ECE工房さんにて、PIECE開発環境のディレクトリの構成などが記述されていました。
戻る
ツール・ユーティリティ公開へ

 P/ECEの公式サイトにツールとユーティリティが用意されました。

 カーネルアップデートツール
 ppack ファイルが存在しない時にエラーを表示
 pcc33 行末\文字対応

 どれも、掲示板にて話題となっていたものの対処です。特に、カーネルアップデートのツールはステータスなどが詳細に出ているので、大変わかりやすくなりました。
戻る
ブロックゲーム(システムVer1.12aへ)

 P/ECEの公式サイトにシステム差分がアップロードされました。

 PieceSystem Ver1.12a

 今回はブロックゲームがついていました。ちょっぴり息抜きにいい感じです。曲がいいせいかずっと聞いちゃうってのが問題です。
 プログラム作成者用としてはMMLプレイヤー(これは見つかりませんでした)、WinIsdの更新、といったところです。Picketについても対応がされていました。
 また、ユーザ側へのリンク対応として、WebRingが始まったようです。当方でも仮申請してみました。
戻る
冬のイベント(2001-12-29)

 P/ECEのユーザが結構集まりそうな東京の冬のイベント、当方も本日から行く予定です。
 P/wareはまかべひろしさんのP/ECE本とみゃん☆みゃん☆ふぁくとりぃ☆さんのUSBホストシステム展示と本(うう、お昼から行くと売り切れかなぁ)がとっても気になっています。Webを見回ってみるとP/ECE用ソフトもいくつか出品があるようなので、こちらにも期待しています。
 他にも自分では見つけられなかった気になるサークルさんがDINNAさん作成の「コミケマスター」のcsvファイルに記述されていました。こちらのほうも様子を見に行ってみようと思っています。いいアプリと情報をありがとうございます。

 また、東京へ遠征しますので今年はこれが最後の更新になるかもです。(冬のイベントについての項目が2001年最後の更新って...)
 念のため、みなさま良いお年を
戻る
冬のイベント結果(2002-01-13)

 P/ECEのユーザが結構集まりそうな東京の冬のイベント、当方もいろいろ回ってきました。
 まかべひろしさんところにお邪魔しに行くと、P/ECE本をとりおきしていただいてただけでなくプレゼントしてもらってしまいました。P/wareはREDFOX作っただけなのでなんとなく恐縮しつつ本をいただきました。中にはすでにたくさんのP/ECE対応ソフトが画面写真付で解説してあり、紙メディアの見易さと、構成のよさから楽しく読むことができました。
 みゃん☆みゃん☆ふぁくとりぃ☆さんのUSBホストシステムの本はすでに売り切れちゃってました。ですが、展示がおこなわれてたので、マウスでぐりぐりキャラを動かしたり、キーボードで文字入力をさせてもらえたりしました。やっぱり何か別のデバイスがつながってて、自分でいじってその入力が画面に反映されるのを見るのは楽しかったです。このUSBホストコントローラ自体の作成や入手はちょっとむつかしいとのことでした。本の内容はPDF形式で配布していただけるそうで、楽しみに待つことにしました。
 P/ECE用ソフトもいくつか出品されてて、こちらが訪れたときにまだ売り切れてなかったものは購入してきました。
 発売して1ヶ月たらずにもかかわらず、ちょこちょこP/ECEもってるひとをみかけることができた東京遠征でした。
戻る
LINK/公開されているプログラム/情報など

 P/ECE関連のプログラムや情報がかなりたくさん公開されています。
 てとら★ぽっとさんところではP/ECE関連の最新情報をすばやく発見する事が出来ます。
 ぱずるのP/ECEさんところのレビューは画面イメージもあり、とても見やすくまとまっています。
 P/ECE Web Indexさんところでは、いろいろなアプリなどがジャンル別にすぐ見つけられてとても便利です。
 P/wareでは基本的にリンクフリーを宣言していただけてるところと、公式掲示板から辿り着ける所を中心にしています。が、最近はリンクの更新が遅れつつあるので、上記のサイトを参考にP/ECE情報めぐりをしたほうが新鮮な情報で楽しくすごすことができると思います。
 2002年2月から、WebRing及びバナーのあるところでリンク禁止と明記されていないところの追加を行うようにしました。もし問題があればご指摘ください。

わかりやすいサンプルコードと情報!
  P/ECE工房さん
キャプチャソフトとインストーラ、15パズル、リバーシなど。その他たくさん!
 ぱずるのP/ECEさん
WonderWitchとの比較、プログラミング Tips、チェッカーなど
 わんだらぁ亭さん
Puzzle Paradise あずろじっく大王
 すかい らぶさん
UnDocumented PIECE と 画像、音楽、音声の機能を使ったサンプル
 P/ECEful wordsさん
ベクトルスキャン風味のシューティングゲーム
 六波羅さんのスペースさん
ビジュアル時計、画像ファイル変換など
 でぃば〜じょんさん
簡易タスクシステムなど
 Kの工場さん
P/ECE PGD+PID+PSP プラグイン、Ragnarok ツール(roSpy-P/ECE)など
 六本木WEBページさん
disassembler、Memory Dumper!
 -- Rizm & Dance --(MMR2nd)さん
分解写真、クレイドルなど
 銀次郎のパーソナルページさん
USBホストシステムなど
 みゃん☆みゃん☆ふぁくとりぃ☆さん
デバッグ文字表示、ライブラリ
 ほわいと・ぺーぱーさん
たくさんのゲーム!
 AnotherT/PIECEさん
開発を支援するソフトぴーすへるぱー
 まるしす研究室さん
PIECE統合開発環境 PieceStudio
 ディクレさんのPIECEの部屋さん
世界時計、コミケマスター、PBASICなど
 ワンP/ECEくらぶさん
初めてのP/ECE(仮)! 中華娘と遊ぼう!! 、PocketTuner、Black or Light!など
 和歌月堂さん
簡易ISD、細胞分裂アオミドロン!、シンプルアタックスなど
 P/ECE研究室さん
ぽけっとりばーし
 魔女っ娘 大作戦 !! さん
おとうさんスクリーンセーバー、インストーラー、ぷちれー、MIDI->P/ECE用MMLコンバータ など
 あずねっとさん
ねずみ、CLIMBER、CLIMBER2
 MooN SIDEさん
Snake
 Give PIECE A Chanceさん
BattleSample コマンドラインからのシステム更新 など
 P/ECEのページさん
瀕死のP/ECEを救え! ピアノ曲!ドビュッシー アラベスク第1番
 P/ECEラボラトリさん
神経衰弱、カレンダー、テキストビュワー
 HIDE-AB's HomePage"未だ混沌"さん
PIECEなつみ!おるすばん時計、ブロックくずし、DARK BLADE、スターファイター、幼女玩MAX
 ぱんつ工房さん
くるんくる、今日の運勢、はんてーな、よむやも、よこぎろ
 そのうちなんとかさん
-E S C A P E-、POCKET RHYTHM PXR-101、P/ECEをUSBマウス、キーパッドに
 ryukの薫製工房さん
P/ECE用「電卓」
 KYU's Technologyさん
WIERD(ワイヤーフレームもどきの横画面縦シュー)
 59番街の部屋さん
Piso 〜アクア日記〜(仮)(サイドビュー型横スクロールアクション)
 AXENetさん
ラインアート・テキストリーダーなど【情報元Kの工場さん】
 ひとでのほProjectさん
MM音楽館など【情報元Kの工場さん】
 まどかのP/ECEさん
優樹君時計、うるう年調査、数当てゲーム【情報元ぱずるのP/ECEさんの掲示板】
 Fox Tail Official P/ECE Libraryさん
トランスシューティング、Re: W32/Badtrance、男子ピンポンダッシュ、Speed Barricade【情報元Kの工場さん】
 ABAGamesさん
はたあげ うにょ、フラッシュ 暗算!、ぽちぽち モールス信号!、はらへり マグちゃんタイマー、ばにやま じゃんぷ、まりも つぶし、まんどら ゴラァ、サイコロ【情報元Kの工場さん】
 新KI〜NOのぺ〜じさん
ポケットカレンダー、星を撃て!【情報元Kの工場さん】
 NLNC++さん
Remcon 赤外線TVリモコン【情報元Kの工場さん】
 STEAR homepageさん
P/ece雑感など
 平松 明夫のホームページさん
interground、盆栽君、P/山水、ignite、spout
 駄研さん
字戦乃欠片(現在は見えません)
 刻の扉 -chrono gate-さん
Nazo、PowerShout、P/ECE研究所
 ゆうぐれハウスさん
P/ECEのFlashROMを増やそう
 GRIF's web Page.さん
スコップ青葉、ハルカ伝説 ハト新生、コミックハッピー!、スコップ水月 OLYMP/ECE版、犯罪撲滅Gメン 間薬寺麺、るんらら♪、ハルカ伝説 -Air-【情報元Kの工場さん】
 HARUKAのHP+さん
時刻表閲覧アプリ【情報元WWDevN+さん】
 Mori's Roomさん
ハード面からの解説、48MHz動作について
 P/ECE hackingさん
地雷撤去ゲーム、P/SHELL
 無作為主義空間さん
メニュー改、ライフゲーム、P/ECE Watcher
 P/ECE wakufactory worksさん
P/ECEのプログラムの更新情報リンク集
 P/ECE Web Indexさん
ソフトリンク、PIECEって何?
 takadeko on the WEB / PIECE CENTERさん
P/ECE入門!、最新ニュース
 げーむくりえいた になってみない?さん
P/ECEで学ぶ、C言語超入門
 猫瀬総合研究所さん
ミュージックプレーヤ、MML関連の詳しいTips、ねこたうん、fpkTool
 May the P/ECE be with ...さん
QXエディタ用キーワードファイル、MUCC標準出力化改造版、入力テストプログラム
 +n P/ECE developmentさん
PIECEレビュー、ソフトウェアリンク集
 もば屋本舗さん
P/ECE Developers Mailing List、みにしゅー。、すとっぷうぉっち
 Let's be fool : P/ECEさん
牛丼道!、P/ECE VISUALNOVEL SYSTEM、はじめてのP/ECE
 てとら★ぽっとさん
TsunamiMobile for P/ECE!
 元気猫ホームページさん
AlarmClock、かこいい駅すぷれす、ChordWorrier【情報元WWDevN+さん】
 かこいい書店さん
スレッド使用のリバーシゲーム【情報元WWDevN+さん】
 progonさんの公式掲示板の書き込み
P/ECE用パターンエディタ、3D-MAZE、蝿タタキ、ただの電卓【情報元WWDevN+さん】
 K.C.C. neg's pageさん
水動
 ほたる狩りさん
コ○ムスのクローンゲーム【情報元Kの工場さん】
 名前は開発中のものです。さん
-REVOKE world-、P/ECEで C言語
 Nanashi-softさん
加速度センサ/SmartMediaの接続
 eto Universal Laboratoryさん
MYAOsoftなP/ECE講座、MirrorRing[DFSW]
 MYAOsoftさん
コミケマスターヘルパー
 天職遊民電脳かわらばんさん
俺と埼玉!、MI.ZU.KI.RI.S、SYNC−R
 NISHISAITAMA PROJECTさん
PIECE用データライブラリ(音楽データ)
 爆竹オンラインさん
PMD Player/BGMシーケンス・データ
 ORPHEのホームページさん
Quick System Menu
 Favorite Squareさん
Mad Pursuer -追跡者-、Piano Code Viewer、Guitar Code Viewer
 野ねずみ工房さん
即売会の歩き方、PieceEditor「PE」
 Kドライブさん
「P/ECE」を使った、製作者、競技者全員参加型のオリンピック
 OLYMP/ECE IN JAPAN 2002さん
おにぎり
 PNさん
P/ECE Builder、回転拡縮表示、SpriteEditor、TEdit
 TAKA SOFT開発室さん
連射測定、かわら割り、7階調モンジュロウ、Vana時計
 ページの断片[P/ECEコーナー]さん
gunman、Hen、Saturn、CIRCUIT、Hen2
 へっぽこさん
MULT-i(ITRON 準拠の RTOS)
 Re: PIECEさん
P/ECE メトロノーム(ダウンロードできないみたいです)
 山櫻堂本舗(さんのうどうほんぽ) さん
MAG-MG4フォーマットなど
 部長、今年も千尋を見に行ってきますさん
みちるのさんすう(情報のみ確認可能です)
 while(1);さん
かむかむこかみん
 てきてきさん
【 Memory(メモリー) 】、【しゃけ】体験版、【かえるパニック☆】体験版、【平安京】、【レーギ】体験版
 サークルあすたろとさん
hunny's Screen Saver
 ハニワ帝国さん
子守唄』zzz.pex
 CarnivalSoftさん
CATCH & RELEASE、三択の嵐、Gravity Winder、かるきゅれ〜しょん for P/ECE
 虚空堂本店Neoさん
Qulipp for P/ECE、Sokoban for P/ECE
 P.R.ism Entertainmentさん
P/ECEプログラマ初心者相談用掲示板
 P/ECEプログラマ初心者相談室さん
かがやけ☆ラッキースター!(女神工房)
 小さな小さな喫茶店さん
2分間シューティング・NIM2
 SSまみれさん
コミュニケーションソフトProfPiece
 ProfPiece Webさん
ねこぴら
 Sunday Parkさん
un・heeded die.
 茜牛乳。さん
P/ECE Bitmap Converter for Console、GANO-Shell for P/ECE
 がのやさん
Quick Watcher
 shu's pageさん
栄養balance、檻棺 -オリカン-
 BAG HAUSさん
バルーントリップさくら、GALAXY PILOT(紹介のみ)
 処理落ち王国さん
OLIONforPIECE、きまぐれまぎちゃん。(紹介のみ)
 AIWIL softさん
P/ECE HAND BOOK、麻雀プロジェクト
 P/ECE Hand Bookさん
RO電卓forP/ECE
 RO電卓forP/ECEさん
らすと1
 ついんのページさん
ムシタタキ
 dA Present'sさん
TIDE for P/ECE
 ぱっぱかぱ〜む さん
Piece開発用パターンエディタ PieceMaker
 Oh!X WEBさん
テキスト(バイナリ)エディタ、P/ECEお役立ち関数シリーズ
 GENGE’S ROOMさん
ひかる☆2択、ざくろいじり
 - Nilspanker -さん
さるテト(仮)
 P/ECE POWERさん
Y O K E + 、素材
 カレーライスゲノムさん
WIREROBO体験版とともにP/ECE版がダウンロード可能
 ねぴあわ〜るどさん
P/ECEでリモコン
 リブルラブル研究所さん
P/ECEリンク集
 dnoz : nozaki directory projectさん
P/ECEのソースを読む。heap管理
 RubyColor.orgさん
ダイビングコンピュータを作る
 KON's HOMEさん
P/ECE用8x8ドットフォント【情報元てとら★ぽっとさん】
 ミサト技研さん
時計アプリ、HG 形式への圧縮ツールと P/ECE 用の展開ライブラリ、PieceBMPConverter のコマンドライン版 + α、D-Pixed 用アドイン、P/ECE アプリ用 ユーティリティ関数【情報元てとら★ぽっとさん】
 - プログラマーのひと -(16bit)さん
アニスタ限定野川さくらオリジナルゲーム付きP/ECE【情報元てとら★ぽっとさん】
 アニスタ.TVさん
P/ECE 用ガベージコレクター【情報元てとら★ぽっとさん】
  K.Sasada's Home Page さん
KbMedia Player用pmd再生プラグイン、Delphi用pieceif.dllユニット【情報元てとら★ぽっとさん】
 Autch.netさん
mvm - milli virtual machine(Java仮想マシン)【情報元てとら★ぽっとさん】
 woさん
P/ECEによるゲームプログラミング講座(2002度新入生への配布誌)
 大阪大学コンピュータクラブ(OUCC)さん
絵なしdnmlビューア(2001年12月の日記)
 Adas' Linux ゲームプログラムさん
RINPUT - for P/ECE P/ECEにRuputerっぽい入力方式を提供するツール
 The specifications.さん
P/ECE用日本語エディタ「PEdit」
 波多利朗のFunky Goodsさん
RYUセル表示 for P/ECE
 ぴぴぴ☆'sほーむぺーじさん
Tiny伺か for P/ECE【情報元てとら★ぽっとさん】
 MZKのほーむぺーじさん
alphabet、bound
 あおやぎのさいとさん

P/ECEソフトウェア・コンテスト
 オフィシャルページ12月賞発表(全応募作品ダウンロード含む)
 オフィシャルページ1月賞発表(全応募作品ダウンロード含む)
 オフィシャルページ本選 発表(全応募作品ダウンロード含む)
P/ECEメガストア杯結果
 オフィシャルページ(作者へのリンクページ含む)
 メガストア(各賞のDOWNLOAD含む)
アンオフィシャルピースコンテスト「P魂」(ぴーこん) 募集締め切り/審査中
  アンオフィシャルピースコンテスト『P魂』
戻る
更新の履歴
非同期シリアル通信(2010-04-23)
・内容復旧(2010-04-03)
P魂2004のバナーを追加(2004-08-16)
すでに公開されているプログラム/情報など(2003-06-14)
圧縮と展開1ヶ所ディレイド命令に変更、補足(2003-05-23)
平方根その2(2003-05-22)
すでに公開されているプログラム/情報など(2003-05-22)
平方根(2003-05-21)
すでに公開されているプログラム/情報など(2003-05-20)
USBキーボード(2003-05-20)
タクトスイッチ(2003-05-17)
トラップテーブル(2003-05-15)
すでに公開されているプログラム/情報など(2003-05-15)
圧縮と展開(2003-05-14)
メモリマップ(2003-05-11)
すでに公開されているプログラム/情報など(2003-05-07)
距離を求めるその2バグ修正(2003-05-06)
距離を求めるその2(2003-05-04)
距離を求める(2003-05-02)
・てとら★ぽっとさん11万ヒット到達おめでとうございます!
すでに公開されているプログラム/情報など(2003-04-30)
すでに公開されているプログラム/情報など(2003-04-29)
すでに公開されているプログラム/情報など(2003-04-28)
ランダムに画面をぬりつぶす(2003-04-27)
すでに公開されているプログラム/情報など(2003-04-26)
関西再放送完了により通常営業に(2003-04-24)
すでに公開されているプログラム/情報など(2003-04-24)
期間限定ページ作成(2003-04-18)
すでに公開されているプログラム/情報など(2003-04-13)
・アンオフィシャルピースコンテストのバナー追加(2003-04-11)
・引越ししました。(2003-04-09)
すでに公開されているプログラム/情報など(2002-08-13)
夏のイベント結果(2002-08-12)
すでに公開されているプログラム/情報など(2002-08-08)
便利なP/ECEハンドブック(2002-08-01)
すでに公開されているプログラム/情報など(2002-04-07)
すでに公開されているプログラム/情報など(2002-03-07)
制御に使う(2002-03-06)
こまっちんぐコマンチ先生・MAXIMUMオーバー殺シスギル!(2002-02-28)
やったぜFM音源、だけどちょっと携帯着メロみたい。だって2OPじゃん(2002-02-28)
集まれTVっ子!(白黒テレビか?)バージョンアップ版(2002-02-28)
いろいろ100(2002-02-23)
すでに公開されているプログラム/情報など(2002-02-23)
パターンを描く(2002-02-22)
すでに公開されているプログラム/情報など(2002-02-21)
ねこさんぷる(2002-02-12)
白黒テレビか?(2002-02-10)
すでに公開されているプログラム/情報など(2002-02-08)
変数の引渡し(2002-02-07)
すでに公開されているプログラム/情報など(2002-02-07)
重いところ探し(2002-02-06)
すでに公開されているプログラム/情報など(2002-02-06)
時間を計る(2002-02-05)
すでに公開されているプログラム/情報など(2002-02-04)
P/ECE対応ソフト製作予定発表メーカー(2002-02-03)
すでに公開されているプログラム/情報など(2002-02-03)
高速化その4(プログラムを内蔵RAMへ 総合編)(2002-02-03)
高速化その3(プログラムを内蔵RAMへ .pex編)(2002-01-18)
高速化その2(プログラムを内蔵RAMへ .srf編)(2002-01-18)
すでに公開されているプログラム/情報など(2002-01-18)
高速化その1(変数を内蔵RAMへ)(2002-01-18)
スタックの切り替え(2002-01-18)
高速化と最適化(2002-01-17)
すでに公開されているプログラム/情報など(2002-01-15)
すでに公開されているプログラム/情報など(2002-01-14)
冬のイベント結果(2002-01-13)
冬のイベント(2001-12-29)
すでに公開されているプログラム/情報など(2001-12-28)
すでに公開されているプログラム/情報など(2001-12-27)
RED FOX(2001-12-26)
すでに公開されているプログラム/情報など(2001-12-25)
すでに公開されているプログラム/情報など(2001-12-23)
付属ソースを元にしたプログラムの再配布情報など(2001-12-21)
すでに公開されているプログラム/情報など(2001-12-20)
すでに公開されているプログラム/情報など(2001-12-19)
すでに公開されているプログラム/情報など(2001-12-18)
すでに公開されているプログラム/情報など(2001-12-17)
ツール・ユーティリティ公開へ(2001-12-10)
ブロックゲーム(システムVer1.12aへ)(2001-12-7)
adpcmとspriteのデータ(2001-12-6)
シンプルとスプライトのライブラリ(2001-12-5)
最新版システムアップデート(2001-12-4)
P/ECEでのプログラム実行(2001-12-3)
インラインアセンブラ(2001-12-2)
おでマル!2(2001-12-1)
すでに公開されているプログラム/情報など(2001-12-1)
P/ECE発売(2001-11-30)
あと数時間で発売(2001-11-29)
P/ECEの動作クロックが仕様に登場(2001-11-28)
P/ECE関連記事掲載・連載予定誌追加(2001-11-28)
P/ECE対応ソフト製作予定発表メーカー(2001-11-27)
公式掲示板稼動中(2001-11-26)
USBケーブルを買いましょう(2001-11-24)
アセンブラのポイントに少し追加(2001-11-23)
P/ECE工房さん、P/ECE一口メモさんをリンク追加(2001-11-23)
いろいろ公開のP/ECE!(2001-11-22)
おでマル!(2001-11-22)
・htmlのまずいところ修正(2001-11-21)
携帯ゲームの重量比較(2001-11-21)
大家さんへのリンク/メールアドレス記述(2001-11-19)
アセンブラのポイント(2001-11-17)
プロセッサ データシート(2001-11-17)
・誕生(2001-11-17)
戻る