昔の最近の出来事(2002.05)

2002/05/31

少し早めに帰着。TVを観ながら、気がつくとウトウトと寝てたり。

floppyコードの調査再開。 最後は結局、FDCのリセットが うまくゆかないというものでしたが、NGになっている直接の原因がよく 判らないという所で終ってました。もう一度、思い出しで追っかけて みました。user_reset_fdc()からWAIT()であるところの wait_til_done()を実行し、その中のfor(;;)ループの脱出に、非同期 にセットされるcommand_statusにFD_COMMAND_ERRORがセットされて ループ脱出してしまうため、結果user_reset_fdc()が失敗するという ものでした。メモリプローブ機能を少し強化して範囲内アクセスを 検出できるようにして、更に追いかけてみたところ、command_statusを セットしているのはgeneric_done()で、そのgeneric_done()は floppy_shutdown()のcont->done(0)で実行されていることが判りました。 そもそもfloppy_shutdown()は直接別の関数から呼んでいる訳では なく、fd_timeout構造体のタイムアウトハンドラとして設定されており、 reschedule_timeout()内で設定されているようです。で、結局、 どこを見てタイムアウトになっているのかまで判らず。

因みに、bochsのbiosプログラムのリセットコードは、ドライブなど の引き数をチェックして、それに対応した戻り値をセットしている だけで、実際にリセットコマンドをFDCに送っているような感じには なっていないようでした。うーむ。

2002/05/30

少し早めに帰着。

linux本体のコンパイル。make終了後、objdumpで逆アセンブルして眺めた のですが、ppcのそれと全然違いますよ(^^; という事が判りました。うーむ。

floppyコードの観察。少し思い出してきたかも。ppcsimをちょっといじる 事になりそうだったので、取りあえず今の最新をcvs commitしておく。 取りあえずリリース。御参考まで。

2002/05/29

少し早めに帰着。

i386ターゲットでlinuxコンパイルテスト。何も考えずにCygwinネイティブ gccでコンパイルしようとしたのですが、ずっこけ(^^;。binutilsから buildし直し。gcc-3.0.3でずっこけたりして、結局buildするだけで終了。 初めてmake menuconfigを使ってみたのですが(ppcの時はmake config)、 戻れるところは良いのですが、どこに何があるかが判らないので、結局 make configに戻ったりして(^^; 設定を追加する分にはmake menuconfigの 方が良いと思いましたが、削るのは脊髄反射でNを入れまくれば 良い make config の方が簡単に思いました。

コンパイルしながらbochsのbiosプログラムを眺める。 以前拾った資料と付き合わせて みると、なんとなく合っていそう。それとlinuxのfloppyコードと付き合わせ。 あぁ、すっかり忘れてしまってて、合ってるかどうかがやっぱりすぐ判らない や。

2002/05/28

少し早めに帰着。

先日読んだ記事を参考に、Linuxファイルシステムのディスクイメージ を作成してみることに。取りあえずExt2ファイルシステムの作成にmke2fsと いうプログラムが必要なようなので、 mke2fsのマニュアルから E2fsprogsのページに。ダウンロードして、makeして(コンパイル するのにちょっと手を入れた)、取りあえず目的のmke2fsはできました。 ところが、やり方ではフロッピーを使用してmke2fsでExt2ファイル システムを作成して、それをネイティブLinux上でmountしてファイルを 入れるというものでした。うーむ、ネイティブLinuxが必要では意味が 無いのですが。うーん、なんかむずかしいなぁ。以前、romfsを作成した ときの様に、あるディレクトリ以下のファイルをルートファイルシステム にしてくれるようなツールがあればそれで十分なのですが......

2002/05/27

少し早めに帰着。

Interface誌読み。Bochs なるPCエミュレータを使用してブートローダから、Linuxカーネル を起動しているのにキラリ。他、オリジナルルートファイルシステムの 構築記事を斜めに読んだり、BIOSのFD操作についての記事を読んだり。 Bochsにもオリジナルのbiosプログラムが付いているので、そちらと 合わせて読むとFD操作の方法が判るかも知れないようなそうでもないような 予感。でも眠くて死亡(ぉい。

2002/05/26

色々実験してて結局寝たのが明け方で起きたのが昼過ぎ。今日で休日は終り。

テレビを見て、飽きたら彩でお絵描きしたりしてダラダラ過ごす。 夕立の中、買い物に出かけて洗濯して一日終了。長い連休かなと思っていたけど あっという間に終了って感じ。

周防玲子風(-_-;

描いている最中に加藤あいになったり色々。
サイズを少し大きめで描いたので、実際はもう少し下の方まであるのですが、 力が入らなくなってきたので、結局512x512で収まるサイズでトリミング(^^; 因みに2000x2000だとなにやらスワップがガタガタ動いて動作速度的に いまいちでした。ちょろっと円を描く程度だったのになんで?っていう気が しなくはありませんでしたが......。 あと、サイズを大き目に変更すると、最初に思いっきりメモリを取りに 行っているのは何でしょうか?因みに、GIMPで同じく2000x2000とかやって みましたが、そのような動作は無いようだったので、彩だけの話だと 思いますが......

2002/05/25

本当に一日中寝てた。休みは明日で終りなのですが社会復帰できるのか?!

本屋に。今月のInterface誌はLinuxのブート&ルートファイルシステムに ついての記事が載っていたので参考に買ってみた。

すんません、今日、キーを受け取ったのでこれから試してみます。

2002/05/24

昼頃起床。しばらくゴロゴロしてたのですが飽きたので(ぉぃ; 先日買ってきたDVDを観ることにしました。

いきなりメモ。PS2で画面の表示比率(16:9と4:3)を変える手順。DVD再生が 始まったら、一度停止状態にして、「設定」→「画面設定」→「TVタイプ」を 変更する。DVD再生中にこの操作を行おうとしても、「TVタイプ」が変更でき ない。30分格闘したけど結局変え方が思い出せず、観終わってから判って 寂しい思いをしてみました。

まずは「人狼」。劇場で一度観たのですが、何気にもう一度見て見たくなった だけ。架空の歴史の一端を切り取ったドラマですが、どういったアニメなのかは 私なんぞが説明する間でも無いので省略。個人的に思うのは押井監督作品は出て くるキャラのしゃべりが小声で聞き取り辛いのが難点。まぁ、聞き取っても 何言ってるんだか判らないという話はありますが(^^;

観終わって出かけようとしたら激しい夕立のため取りやめ。結局、もう一本 観ることに。

「BLOW」。こちらは洋画で、麻薬王 ジョージ・ユングの半生を描いた 実話を元にしたドラマです。映画通が観るっぽい作品なのですが、白状 すると、テレ朝の番組で井筒のおっさん(<おっさん呼ばわりかよ)が、 自腹で映画を観てその評価を行うというコーナーがあって、それで 最高評価を下したというのをたまたま覚えてたから、観てみようと 思っただけ(^^;。井筒のおっさんは号泣してましたが、私はまだ歳の 重ね方が足りないせいか、そこまで感情移入はしませんでした。しかし、 恐らく観る人、観る年齢によって色んな感想を持つのではないかと 思われる作品です。
特典映像では、未公開シーンやコメンタリーなど、本当に細かい シーンにまで監督のコメントが入っているのが面白かったです。 未公開シーンでは切った理由などが細かく述べられており、 一度本編を通しで観た後でこの未公開シーンの説明を観ると、 そのシーンを挟もうとしていた部分をもう一度観たくなってしまいました。 DVDなので、音声トラックや字幕を複数持てるというメリットを最大限に 生かした特典だと思いましたが、他の作品でもここまではやらない予感が します。機会があれば是非とも。

観終わって、飯食って、眠くなって寝た。

2002/05/23

昼前起床。今日で休暇も半分終了。で、映画を観に行きました。

観たのはスパイダーマン。平日にも関わらず、入る時に列が出来ていたりして、 かなり不思議に思いました。つーか、明らかに映画を観るような格好では ないネクタイ姿のおっさんとかが居て、日本の将来に少し不安を感じました。 つーか、「仕事しやがれ!」。いや、むしろヲレもか?! テヘっ[はーと](テヘっじゃねーよ)
映画の方は素直に面白かったです。もう最近のは映像が凄過ぎて、 まばたきする暇無いもんですから目が乾く乾く。そんな感じ。

版権的にちょっとドキドキ

秋葉原の書泉に寄ったり、石丸でDVDを買ってみたり、神田の三省堂まで くるっと周ってみたりして帰着。久々に運動した気分。以前は一日中歩い てられたのに、寄る年波には勝てませんな。ゲフゲフっ(ぉ; 帰って飯食ったら眠くてそのまま寝たりして。

起きてWebぐるしたら彩の新版が出てたのでダウンロード。上のCGは それで描いてみたのこころ。マスク→レイヤー変換は修正されて ました。後、上のCGだとJPEGノイズで潰れて判りませんが、細い線が 良い感じでした。前描いたゴスロリちゃんの時はあまり判らなかった のは何故だったのやら。

2002/05/22

昼頃ふにゃふにゃと起きて(昨日と同じかよ!)散髪に出かける。しばらく 待たされている間に最近のマンガ雑誌など閲覧。連載を続けて読んでいないのも あるのですが、あまり面白げなマンガが無いのは気のせいか?

そのまま本屋によって電撃王を査収して帰着。

先日の続き。複合スプライトをなんとかしようと真面目に見直し。何故か REFデータにへんてこりんな値が入っていてSegfault。先日のエンディアンの罠に 引き続き、新たに構造体のパディングの罠が。そこを直してどうにか複合スプライトまで 出せたのですが、パレットのサポートが面倒臭いのと、左右反転が面倒臭いのとが 合わさって死亡。手間の割に得られるものが少ない気がしてきたので、 作業打ち切り。

これまでの作業を通してのメモ。

  1. XSP系関数にはvoidポインタを受けるものが多いです。これは、キャラクタ管理 で自前の構造体を使用する場合でも、構造体の先頭がXSP内で取り込まれる データ並びと同じならば解釈できるようにという配慮のようです。しかし、 パディングなどの問題を考えると、明示的な型を引き数として与える方が 良いように思いました。確認が必要ですが、例えば、

        struct XSP_DAT{
           short x ;
           short y ;
           short pat ;
           short info ;
        } ;
        struct USER_DAT{
           struct XSP_DAT xsp ;
           int left ;
           int power ;
           int etc ;
        } ship ;
    
        xsp_set_st( &ship.xsp ) ;
        

    のようにUSER_DATの先頭にXSP_DATを置くようにすれば、コンパイラの最適化 がまともならば、xsp_set_st( &ship ) と同じコードが生成されるような気が します(少なくとも自動的に最適化出来る要素は揃っているハズ)。
    データの並びを意識しなくてはならないと、例えばコンパイラがヘンなパディング を行うように改悪された場合、ライブラリの再コンパイルだけで済むものが 済まなくなる可能性が考えられます。

  2. XSP系関数は何故か戻り値無しの関数が多いのですが、問題があった場合に ライブラリの問題なのか、仕込みが足りないのか、はたまた引き数に与えたデータ にチョンボがあるのかが、調査困難っぽい予感。ライブラリのソースがあるなら 大丈夫かも知れませんが、ソース無しのDLLだけとかいった場合にはまると、 なかなか抜け出せなくなりそうな予感。

  3. パターンデータなどをファイルから読む場合はできるだけエンディアン のすげ替えができるように考える。バイナリファイルのフォーマットが エンディアンまで含めて決めてあれば最悪OK。「構造体をそのままセーブした だけ(ただしパディングは意識無し)」というパターンが、聞こえは簡単そう ですが、対応は一番厄介かも。

  4. エンディアンの影響をモロに受けるので、確信的でない場合は、ポインタの キャストのし直しは極力避ける。


こんな感じ。実際の所、異なるアーキテクチャのCPUへの移植を考えなければ、 どうでも良い所なのかも知れませんが、折角高級言語で書いてあるのならば、 さっくり持っていって幸せって感じが良いなと思いました。「UNIXという考え方」 からの引用ですが、「よいプログラムは死なず、ただ新しいハードウェアに 移植されるのみ」。実際にはそんなにうまくいかないのでしょうが、少しでも 考えてあれば、労力は最小限に収まるものかも知れません。

前に買っただけで、ほとんどやってなかった「グラディウス外伝(ベスト版)」 などで時間を潰してみたり。あう、ヘタクソ過ぎ(T_T;

調子悪くなってきました。風邪引いた気分。

2002/05/21

ふにゃふにゃと昼頃起きてダラダラと過ごす。散髪に出かけたら本日休業。 行きつけの床屋は何故かヘンなときに休みだったりする謎。

先日の敵が出ない件、ステージデータの読み込みでエンディアン問題が あったのが発覚。つーか、気づけよってレベルでした(^^;。何やら敵 らしきものが出て動いてはいるのですが、あんま攻撃が激しくない なぁなどと思ってみたり。キャラ数で60くらい(SP数ではない)が平均 で、自弾が20くらい取っているようなので確かにそれほどではないかも。

2002/05/20

明け方に宿題終了。ぴひゅ〜、臨時休暇が無ければ死んでいる所でした。 そんな感じで今週まるまる休業。

日中は眠くて死亡。

gdb内蔵MIPSシミュレータを使って遊んでみました。最初gdb-5.1をmakeして ELFの実行ファイルを生成したのですが、何故かdwarfの読み込みでエラー してしまいました。一応、ppcも同様にgdbをmakeして同じように実行した 所、こちらもやはりエラー。-gdwarfとかやると何気にちゃんと読めたので、 こういうものかと思いつつ、やっぱり怪しい気がしたのでgdb-5.2をmakeした ところ、全然問題無し(^^;。むしろ-gdwarfなどとやると余計変なことに なりましたよ。で、gdb+PSIM(ppcのgdb内蔵シミュレータのコア)では、 システムコールを使用しないプログラムでは問題なく実行することができます。 当然、Cソースコードレベルでのデバッグが可能です。ところがMIPSの方は どうもイマイチ。以下メモ。

  1. シミュレータメモリの割り当てを手動で行う必要がある。これをやらないと loadコマンドは実行できるくせにメモリがマッピングされていないと 怒られる。

  2. spだけはセットしておかなくてはならないが、関数呼び出し元で戻り アドレスの保存などを行うため、アセンブラで_start()を書いてやる 必要がある。これが無いとsp=0からマイナス方向に積むので一発目で segfaultする(これはPPCも同じかも)。

  3. 関数名にブレークポイントを設定する事はできるが、途中のコードに は設定できない。ppcの時は-g -O0でコンパイル&リンクすると、 objdump --source で元のCソースとの対応付けがきちんと行われて 逆アセンブルできますが、MIPSのそれで同じ事をやっても、元のソース との対応付けが出てこない。

  4. gdbの話ではありませんが、gcc-3.x以降をMIPSクロスコンパイルすると、 makeができないとか、makeできるCVS coしたものでも、オプティマイズ レベルを上げるとinternalエラーを かます。2.95.3では mips-tfile をクロスコンパイルできなくてエラー する。2.95系では、このmips-tfileという奴がデバッグシンボルを 加工しているらしい節がうかがえるが詳細不明。


シミュレータ自体はまぁ、動作しているような気がしなくも ありませんが、変数シンボルを参照できないものですから、結果の確認 すらままならない。あと、コンパイラがヘナヘナなのがかなりアレ。これ、 ちゃんとテストしているのでしょうか?つーか、みんなこれを使っているので しょうか? PPCのそれからいくと、歴史的にも長いのにあまりにもちゃんと していなさすぎな気がします。

2002/05/19

gdbをmakeしたりしつつ宿題。

2002/05/18

夕方起床(汗;。ほげーんと過ごす。

宿題の提出先確認の為にメールを取った所、別のメールも入って ました。つーか、受け取るのが遅くてすみませんm(_'_;m

そんな訳で実験でMIPSクロスコンパイラをbuildしてみたり。 binutilsはよさげですが、gccの方がイマイチちゃんとしてなくて、 buildに苦労してみたり。取りあえず動きそうなものがbuild できたので、newlibコンパイルまで行って(ただしsyscallが デタラメなので100%動かない事を保証(ぉぃ)、いくつか手持ちの プログラムをコンパイルしてみたり。リンクはできました。

あぁ、もう宿題を始めないと!時間的に限界! そんな訳なので、 メールの返事は少し待ってくだされ(>関係者各位)。

2002/05/17

少し早めに帰着。

色々いじってみたのですが、状況変わらず。面指定すると敵キャラ らしきものが出ましたが、ちょっと出て次が続かないって感じ。 -Wallにするとwarningが結構出ていたので、取りあえずそれらを潰して みる事にしてみました。char型の引き数を持つ関数に 32*8とか 入れている部分があったりしてますが、この辺は実害は無さそうな 予感。でも状況変わらず。うーむ、いくらエンディアンが違っている といっても、ここまでポートが難しいのは初めてかも........

眠くていつもより早めに死亡。あぁ、宿題をやらなくてはならない のに.....

2002/05/16

少し早めに帰着。

ちょこりいじりの続き。何かしら絵が出る様にはなったのですが、 どうもキャラが動いていない予感。よく調べてみるとエンディアンの罠 が(^^;

*((short *) (&player->lx))

なるコードがあったのですが、意図としてはint型の変数へのポインタを short型へのポインタにキャストして頭の2byteを得るというもので、 player->lx>>16 と同じ働きになるつもり(16bitのゲタを履いた固定小数点) のようでした。所が、ポインタを中継してキャストすると、リトルエンディアンの アーキテクチャでは下2バイトが取られる形になりますのでうまく動作しません。 そういえば、このコードを使って、リトルエンディアンのアーキテクチャか ビッグエンディアンのアーキテクチャかを判定するというものがありました。

int x = 1;
x = *(char*)&x; // 0:ビッグエンディアン/1:リトルエンディアン 

因みに参照したサイトは ここ(Programming Tips 1024)

そんな感じで少し直してみて、自機らしきものとショットらしきものが (複合スプライトが未実装の為、デタラメなキャラをひっぱってきている(^^;) 表示されるようになったのですが、一向に敵の出てくる気配がありません。 敵の移動ルーチンは呼ばれていますが(Game()内EnemyMove())、リストが 空の為、直ぐに戻ってきている模様。最初のリストをどこで生成しているのか、 敵が無くなったらどこで新しいリストを生成するのか判らず。ぐふ。

2002/05/15

本日休業(-_-;

Cygwinでもネイティブコンパイルできるようにハードウェアレジスタを 直接触っている部分をコメントアウト。xspの部分をちゃんと書いて 絵が出るようにしようとしたのですが、X68kのPCGのデータ構造を すっかり忘れてしまっててInsideX68000で調査。あぁ、こんな面倒 臭い構造でしたっけ?それよりもpcgデータを読み込んだ時点では パレットが保証されていないので、フルカラー変換できないとか。 うーむ。面倒臭くなって途中で死亡。xsp_set系関数で、画面の 外だったら戻り値が0になるというを初めて知った(^^;

ppcsimのfork()戻り値を直してテストをしていたら、予め設定した カレントプロセスID+2のブレークポイントが消えてしまうバグが発覚。 fork()でプロセスをコピーした際にプロセス構造体に含めてしまった ブレークポイント情報までコピーしてしまうのが原因でした。うーむ。

後藤弟がEE-JUMPを脱退したってのを初めて知った。

2002/05/14

少し早めに帰着。

書き換え作業。iocsやdosコール系は用事のないものを除いて空関数に 置き換え。恐らく使えないだろうと思われる音系やグラフィック系 関数はコメントアウト。最終的にxsp系だけを残す状態までで終了。

その後、とりあえずxspライブラリを空関数にしてリンク。maketblが コンパイルできなくて謎だったのですが、拡張子をmaketbl.ccにして g++コンパイラを使用すればOKでした。取りあえず、maketblだけはCygwin ネイティブでコンパイルして実行しておき、本体をppcクロスコンパイル。 リンク成功。テキスト領域を直接触っていると思われる所がある ので、プロセスサイズを16MBに変更してppcsimを再コンパイル。そして 実行。適当なところでCntl-Cで止めると、Title()内でループしている 模様。一応動作している感じ。うむ。

2002/05/13

数ヶ月ぶりに普通の時間で帰着。時間がありあまりまくり!うひょ!でも今日は ちょっと眠かったので、横になってちょっと目をつぶったら、すっかりいつもの 帰着時間(ぉい;;

何気に先日書いたppcsimの使い方を読み返していたら、wait()の説明がちょっと 嘘を含んでいたのに気づいて修正しようと思った所、ふとfork()を実行した 親プロセスへのfork()の戻り値ってどうなってるんだっけ?という事が思い出せ なくてソース確認。う、親プロセスへのfork()戻り値設定が抜けてる(^^; 運が悪いと親プロセスでもfork()の戻り値が0になって、場合によってはexec() を実行してしまい、プロセスが塗りつぶされてしまうかも。使う人はあまり いないと思いますので近日中に修正致しますm(_'_)m

何気にシューティングデモを適当なループで切ってppcsimで実行してみました。 実行後のsumコマンドの結果をちょっと加工した結果が以下。

shoot_ppc> grep '%' exec.log | sort -nr +3 | cat -n | head -10
     1  lwz          =     1477037808   20.592410 %
     2  bc           =      975735750   13.603410 %
     3  add          =      711364873    9.917632 %
     4  subfic       =      521054143    7.264378 %
     5  adde         =      500472575    6.977436 %
     6  addi         =      449131869    6.261659 %
     7  rlwinm       =      370506120    5.165483 %
     8  lwzx         =      350819015    4.891012 %
     9  cmp          =      265155471    3.696717 %
    10  xori         =      250250035    3.488910 %


使用率の高い命令ベスト10。ロードが多いのは判るとして、 ストアがベスト10に出てこなかったのが意外。画面塗り替えの為に もっと出るのかと思ったのですが......これ本当かなぁ?

ふと、X68k界で有名人である所の mitsukyさんが制作された 所の「男弾」なるシューティングゲーム(一度もやった事無いのがアレですが) のソースが公開されていたことを 思いだし、X68k依存な部分を削ってゲームコア部分をシミュレータ上で 動作させて一般的なシューティングゲームのプログラム的な特性を調べ られないかなぁと思ったり。ソースを見てみた所、音部分や画面制御、 キーボード/ジョイスティック入力を除けば、表示はXSPで全て管理されて いる感じだったので、XSPライブラリをどうにかすれば良いのかなぁと 思い、XSPライブラリの仕様を捜して眺める。うむ、XSPの細かな仕様は すっかり忘れてますよ(笑。読み直しただけで終了。あくまで測定目的 なので、XSP系関数は全部空関数にしても良いところなのかも知れませんが、 それだとXSP以外の部分の全体に対する割合がさっぱり判らない (描画がネックだとしたらそれを知る事はできない)ので、 tspをちょっといじって無理矢理ひっつけ合わせて、「全実行」 「XSP空関数で実行」の二つと、tsp自身の負荷、そしてtsp内を何らかの 仮定の元にハード化した場合の改善率などから何か判らないかしら?

2002/05/12

昼頃起床。

newlibコンパイルの手順のまとめ。configureを実行しただけでは ppcクロスmakeではMakefileに不具合が生じる問題は、結局スクリプトで 強引に書き換えてからmakeを実行するという方式にしました。恐らく 一発でOKになっていると思います。むしろ1.9.0の方はコンパイラのインストールの 状態によっては、エラーする可能性があったので、うまくコンパイルでき なかったのではなかろうかと思われます(^^;

ppcsimのリリース準備やらnewlibコンパイル手順のページの作成など しつつダラダラと過ごす。

あまりに部屋が汚いため唐突に掃除。雑誌の山を片付けたり(つっても 読まなくなったものを邪魔にならないところによけただけ(汗;)。そうして 掃除が終った後で、何気に必要な本を探したところ、どこにやったか判らなく なったり(汗;。片付けると何故かモノが無くなる世の中の不思議(<違います)。 ふだん、本は買ってきたら ちょっと読んですぐにそばの山に積んでしまいます。良く読むものについては 常に山の上の方にあり、読まなくなると新しい本が上に積まれていくため、 自動的に下の方に下がるというキャッシュ効果を利用してます。超整理法的 手法で効率よく情報を引き出している気分になっていますが、超整理法との 違いは横積みでなく縦積みになっているところで、一度下の方に降りていった 本をもう一度、山の上の方にキャッシュインするとき、山を崩してえらい目に あうというのをいつもやってたりします(汗;。ちゅうか、ちゃんと本棚に 入れて、普段から整理しとけって感じですね(^^; 因みに、 プログラミング言語C(第二版)は結局見つからずじまい.........

そんな感じでppcsim-0.84とnewlib-1.10.xベースでのppcsim用ライブラリの ページを置きました。因みに、newlibの方ですが、dirent.hを使用する プログラムでは、Cygwinのバージョンが微妙に関係したりしますが、 使わなければその限りではありません。色々試してみてください。 という事で御参考まで。

2002/05/11

昼過ぎ起床。寒かったので調子悪げ。ちょっこり出社。

うむ、やはり以前より遅くなっているようです。繰り返しになりますが、 恐らくgccの違いによるもので、newlib自身のコードの差では無い と思われます。
ppcsimでのニセshテストで、exec()システムコールエミュレーションで チョンボが発覚したり色々(汗; 修正ついでに ちょっと機能追加してみたり色々。まとまったらリリースする予定。

本屋に。何気に雑誌置き場を眺めていたら、何やらオーラを発している 雑誌が目に付きました。その名も「Gothic & Lolita Bible vol.4」! なんじゃこりゃ?と思い手に取って見てみたのですが、フリフリの服が 満載です。これをネタとして買わずに居られましょうか!?(<普通居られます)
不勉強なもので、初めて「ゴスロリ(ゴシック&ロリータの略)」なる テクニカルターム(<ちげー)を聞いたのですが、そういうファッションの ジャンルを指す言葉のようです。具体的にはビジュアル系バンドで ある所の「MALICE MIZER」とかはゴスとロリの中間といった所で、 「アダムスファミリー」はゴス、FF10だかに出てきたルルとかいうねぇさん はゴス寄り、エロゲーなんかに出てくるフリルだらけの服はロリ、 PINK HOUSEの服は(柄が派手でないので)ロリ寄りといった所。 雑誌の中に「暮らしの手帳」と題したゴスとロリの一日の生活だとか、 マナーだとかの事が書いてあるのですが、ほんまかいな?って感じの事が 真面目に書かれているのがシュールで笑えます(笑うと怒られそうですが(汗;)。 また、パーティー用お菓子で「ショコラ・ド・コルセット」 だとか「くもの巣のタルト」だとか、わざと選んだようなへんなお菓子 が紹介されていたり、ドクロのオブジェ(主にゴス用)だとか、 呪いがかかってそうなちょっと恐い感じの人形(ゴスロリ両用?)だとか も紹介されています。最後には写真の服の型紙が付いていて、自分で作ろう ってな記事もあったりと、 その筋には大満足だと思われる内容になっているようです(<その筋では ないのでよくわかっていない)。
見てて思ったのは、ゴスとロリは完全に裏と表の関係にあるように見える のですが、何故かゴスロリとして一つのジャンルにまとまっています。 相反であるが故対立とかありそうなのですが、そこはゴスロリのマナーとして 紳士淑女であるべき(いや、そう書いてありましたので(汗;)という所が効いて いるのかも知れません。因みに、 コスプレと同じでは?という感じがしなくもありませんが、あくまで ファッションであるというのが筋として通っていて、我が道を行く オリジナルである事がポイントのようです。従って、ファイティング バイパーズの「ハニーの服」はゴスロリ調だけど、「ハニー本体」は コスプレ女という定義なので、ちょっと違うって感じなのでしょうか。

そんな感じで仕入れた知識をフル活用して描いてみました。

ゴスロリファッション

一つわかった事。ゴスロリ(ロリ寄り)ファッションは描くのが大変 です(汗;;; 因みに「ゴスロリ」をキーにWeb検索すればイヤっちゅうほど 引っかかりました。

そういや、彩の0.8.0.4を使用しましたが、マスクからレイヤーへの変換で 左端が変換されないバグは直っていないようです。

2002/05/10

少し早めに帰着。

ふいにnewlibの1.10.0がリリースされていたのを思いだし、少し古くなって いるppcsim用ライブラリを更新しようとmakeを行ってみました。
ヘッダを1.9.0と比較してみるとsys/dirent.hが違っている事が発覚。 しかもCygwin-1.3.xで変更された旨がかかれており、構造体メンバが 変更になっているため、このままではニセlsが動きませんよ!(事実 動きませんでした(涙;) 他にもスタートアップの コンパイルでエラーしたり、libmのコンパイルでi386専用の チューニングライブラリをコンパイルしようとしてppc用asでエラーしたり 色々。で、取りあえずmakeはできました。一部makeのエラーを回避する ためMakefileの書き換えを行う部分があり、その辺どうやって一発OKに なるようにするべきか考える必要がありそう。

性能を比較するため、MegaPOVをライブラリリンクだけをし直す形で buildしppcsimで実行した所、遅くなってました(笑。恐らく、gcc-3.0.x 系列での実行命令量増加の影響だと思われますが、ライブラリ自体に は問題は無さそうです。もう少し時間のかかる奴を実行して寝る。

そういや彩の0.8.0.4がリリースされていましたが試せず。

2002/05/09

日付け越え。

こんな感じかな という訳で完成。次は実際の実行コード生成&実行部分の コーディングを行ってみようかと思っているのこころ。

2002/05/08

少し早めに帰着。

Cygwinアップデートをかけたらlibpngが更新されていたのですが、 インストールするとコンパイル用ヘッダがアンインストール されたりして謎。「development libraries and headers」を選んで インストールするとOKに。最近はruntimeライブラリだけインストール して終了って感じになってるのかしら?

インタープリタの続き。関数の引き数は専用スタックに積んで、 引き数の数が合わない場合は取りあえずずっこけない様にしてみる 方法でインプリメント中。ちょっとごちゃごちゃしてきたので、 一度仕様を整理した方が良いかと思っていんぐ。

2002/05/07

日付け越え前に帰着。

関数使用の仕込みの続き。どうやって引き数の数をチェックしようかと 少し悩む。C言語の様にプロトタイプを宣言するか、ボトムアップ方式で 枝葉の関数をファイルの先頭の方から順に書くかすれば、参照の 前に必ず宣言が行われるため、チェックを行う事が簡単になるのですが、 プロトタイプ宣言は面倒だし、記述に制限が付くと使うのが面倒臭く なりそうだし、ついでにボトムアップ方式は個人的に好きでないので、 全ソースを舐めた後で関数の参照チェックを行うようにする方法で 考え中。

2002/05/06

昼過ぎ起床。体調すぐれず

インタープリタで関数を使うための仕込みをしてみたり。定義されてないと 参照できないとかbuiltinキーワードとの衝突チェックの仕込みなど。

そういや、先日の ++i, i++ の話ですが、ppcクロスコンパイラで出てくる コードを見てみました。すると、-O0では

2  9

となり、-O2では

6  10

となりました(^^; 吐き出されたコードを見てみますと、-O0では

  i=1 ;
   10034:       38 00 00 01     li      r0,1
   10038:       90 1f 00 08     stw     r0,8(r31)
  j=1 ;
   1003c:       38 00 00 01     li      r0,1
   10040:       90 1f 00 0c     stw     r0,12(r31)
  i=i++ + i++ + i++ ;
   10044:       81 5f 00 08     lwz     r10,8(r31)
   10048:       81 7f 00 08     lwz     r11,8(r31)
   1004c:       7d 49 53 78     mr      r9,r10
   10050:       7d 60 5b 78     mr      r0,r11
   10054:       7d 09 02 14     add     r8,r9,r0
   10058:       81 3f 00 08     lwz     r9,8(r31)
   1005c:       7d 20 4b 78     mr      r0,r9
   10060:       7c 08 02 14     add     r0,r8,r0
   10064:       90 1f 00 08     stw     r0,8(r31)
   10068:       39 29 00 01     addi    r9,r9,1
   1006c:       91 3f 00 08     stw     r9,8(r31)
   10070:       39 6b 00 01     addi    r11,r11,1
   10074:       91 7f 00 08     stw     r11,8(r31)
   10078:       39 4a 00 01     addi    r10,r10,1
   1007c:       91 5f 00 08     stw     r10,8(r31)
  j=++j + ++j + ++j ;
   10080:       81 3f 00 0c     lwz     r9,12(r31)
   10084:       38 09 00 01     addi    r0,r9,1
   10088:       7c 0b 03 78     mr      r11,r0
   1008c:       91 7f 00 0c     stw     r11,12(r31)
   10090:       81 3f 00 0c     lwz     r9,12(r31)
   10094:       38 09 00 01     addi    r0,r9,1
   10098:       90 1f 00 0c     stw     r0,12(r31)
   1009c:       7d 6b 02 14     add     r11,r11,r0
   100a0:       81 3f 00 0c     lwz     r9,12(r31)
   100a4:       38 09 00 01     addi    r0,r9,1
   100a8:       90 1f 00 0c     stw     r0,12(r31)
   100ac:       7c 0b 02 14     add     r0,r11,r0
   100b0:       90 1f 00 0c     stw     r0,12(r31)

のようになっており、例えばi++の方では、i=i+i+iを実行した後、 i++を3セット実行して、変数iの格納領域を次々と上書きして いるようです。結果、最後に残ったi++がストアされて、答えは i=i++ になってしまっているようです(^^; でも ++j の方はなんとなく9で 合っている感じがしなくもありませんが、やっぱ違うのかしら?
一方、-O2の方ですが、こちらの方が結構謎で、

   1002c:       38 80 00 06     li      r4,6
   10030:       38 63 82 b0     addi    r3,r3,-32080
   10034:       38 a0 00 0a     li      r5,10
   10038:       90 01 00 14     stw     r0,20(r1)
   1003c:       4c c6 31 82     crclr   4*cr1+eq
   10040:       48 00 01 55     bl      10194 <printf>

となっていて、いきなり6と10を即値ロードしています。 うーむ、最適化が強力な結果と言われればそんな気もしますが、 演算過程が不明なため、そもそも結果があっているのかどうかがさっぱり 判りません(汗;
結論。代入式の右辺にインクリメント/デクリメント演算子を入れる事は 禁止。たぶん.....

2002/05/05

昼過ぎ起床。

うだうだと過ごしながら何気に先日の実験コードのサンプリングを16x16から 256x256にしてみたり。実行時間は256倍になったけど(汗; 見た目の変化は無し。 ふむ。

そんな感じでちょっとお出かけ。うひー、今日は暑いっす。「怒首領蜂大往生」 が入荷されていたのでやってみました。のっけからえらい弾の量なんです けど(汗; なんか最初から怒首領蜂の5面以降をやっているような気分なの ですが、それよりは緩いかしら?二面で全滅。うーむ。

TVを観たりCGを描いたり。

なんだか昨日から風邪気味気分が治らずヘコリ。この季節に風邪にかかると 気温が微妙なだけに、暑くて寝てられないとかもろもろの理由で治りにくい んですよね。ピンチ。

2002/05/04

昼前に起きてフェスタ68に行ってきました。
いつものごとく昼過ぎてからの到着でしたが、もうすっかりまたーり気分になって ました。これもいつもの事なのですが(^^; 村上さんとしんさんにお会いして、 色々お話をし、それからくるっと回って久々な方々とご挨拶。少し痩せてて最初 本人かどうか判らなかった潤ちゃんに、すっかりX68kから足を洗ったKOCKYさん、 たまたま隣に居た立花えりこさん、また更に太ったSaTa.氏に、商品品切れで追加 増産を行っていたただちょんさん、いつもコスプレのK-GIRLさん、みなさんお元気 そうでなによりでした。そして食事にでかけていた まさちくさんにご挨拶。 途中私が携帯の着信音を切っていてKOJIさんからまさちくさんの携帯に私宛の 電話がかかってきたりして(^^;どうも申し訳ありませんでした。
今回はセリカさんを見るのが目的でしたが、別の製品にお客さんが集まっていた ようで、近況などはお話でうかがうだけでしたが、まだ色々とありそうな 予感でした。性能の方についてはまだこれから測ってみるといった感じ。

その後、KOJIさんと合流してうろうろしながらOSの話をしたり、酒を飲みながら 彩の話をしたり。

帰ってから細い線のアンチエリアスについて少し実験コードを書いてみたのですが、 オーバーサンプリングで面積反映しても、ピクセル間のダマは発生してしまいますな(^^; 単純に輝度が1.0のピクセル一つと、輝度0.5のピクセル二つや輝度0.25ピクセル四つは 見ため的に別と考えるのが正しい模様。じゃあ正解は?と聞かれるとうーむ。

2002/05/03

昼前に起きて休出。

帰ってきた後、スターウォーズ特別編を見て力尽きて死亡。

2002/05/02

いきなり休業(汗;;;;

色々はまって、どうにかそれっぽいコード生成できるようになりました(^^;
以下のようなコードに対して(コードの内容に意味は無し)、

while( $val0<10 ){
  $val0=$val0+1 ;
  for( $val1=0,$val2=0 ; $val1<10 ; $val1=$val1+1 ){
    $val3=$val3+$val1 ;
    if( $val3>20 ) {
      break ;
    }
    $val0=$val0+2 ;
  }
}

こんな感じ

label50  :
        push val[0]       --+-- $val0<10          while_cond
        push 10             |
        lt                --+
        btrue  label52
        push val[0]       --+-- $val0=$val0+1
        push 1              |
        add                 |
        pop  val[0]       --+
        push 0            --+-- $val1=0,$val2=0   for_1st
        pop  val[1]         |
        push 0              |
        pop  val[2]       --+
label53  :
        push val[1]       --+-- $val1<10          for_2nd
        push 10             |
        lt                --+
        btrue  label54
        b   label55
label56  :
        push val[1]       --+-- $val1=$val1+1     for_3rd
        push 1              |
        add                 |
        pop  val[1]       --+
        b   label53
label54  :
        push val[3]       --+-- $val3=$val3+$val1
        push val[1]         |
        add                 |
        pop  val[3]       --+
        push val[3]       --+-- $val3>20
        push 20             |
        gt                --+
        bfalse label57
        b   label55
label57  :
        push val[0]       --+-- $val0=$val0+2
        push 2              |
        add                 |
        pop  val[0]       --+
        b   label56
label55  :
        b   label50
label52  :

breakの処理がちょっち面倒でした。continueもbreakも条件判定の始まり 位置とstatement_listの終了位置(いずれもラベル)を覚えておく必要が ありますが、break,continueの存在自体をすっかり忘れてた為、ちょっと 無理矢理実現風味な気分(^^;

2002/05/01

日付け越え前に帰着。

for文のフロー制御を考えてみました。
取りあえず「for(1st;2nd;3rd){statement_list}」を一つのfor文と 考えた場合、基本的な流れとしては、 1st→2nd→statement_list→3rdと なるのですが、bisonで構文解析した場合、パターンがマッチした時点で アクションが起こってしまうため、3rdのコードをどこかに覚えておく 機構が必要になります。それだとちょっと面倒なので、どうにかして 3rdのコードをパターンがマッチしたその場で生成してしまいたい 所です。そこで、コードは構文の順に生成するようにして、 ラベルを付けまくって無理矢理流れを繋いでしまうように考えてみました。

        ┏━━━━━┓
        ┃ 1st code ┃
        ┗━━┯━━┛
              │      
        ┏━━┷━━┓
        ┃ 2nd code ┃←──┐
        ┗━━┯━━┛      │
    ┌────┘            │
    │        ┌────┐  │
    │  ┏━━┷━━┓  ↑  │
    │  ┃ 3rd code ┃  │  │
    │  ┗━━┯━━┛  │  │
    │        └────│─┘
    ├true──┐        │
    │  ┏━━┷━━┓  │
  false ┃          ┃  │
    │  ┃statement ┃  │
    │  ┃          ┃  │
    │  ┗━━┯━━┛  │
    │        └────┘
    └────┐
              ↓          フローチャート(うわっ!(笑)

勿論、中間コードの実行性能無視です(^^; ここで 直列トークン順番を 記述していく際に、アクションを一つのトークンとして、戻り値を返す という技を知ったので使ってみました。もしやこれを使えばif文も先日 のように予め生成する方法でなくても良いのか?と思い以下のように

	| LEX_IF '(' if_cond ')'
	{
	  printf("  btrue  label%d\n",$<label>9) ; /** trueの時 labelにブランチするコードの生成 **/
	}
	 '{' statement_list '}'
	{
	  printf("label%d  :\n",$labelID) ; /** labelを置く **/
	  $<label>$=labelID++ ;
	}
	;

書いてみたのですが、結局の所、後方のトークンの戻り値を参照する事はできないため、 最初に参照している$<label>9には値が入りませんでした。でも、 bison文法的にはエラーにならないようです。ダメなんだったらエラー にしてくれても良さそうですが、それはそれとして。
そんな感じで、2nd codeの分岐の表現がうまくできなくってはまってみたり。


TOP PREV