MS-DOS Player for Win32-x64が素晴らしい。 私はいまだに x86 環境なので恩恵無いかな、と思ったら、GNU make から COM 形 式の実行ファイルが呼び出せるようになった。ちょー便利。[pconv.mk] pcm := $(patsubst %.wav, %.pc8, $(wildcard *.wav)) all: $(pcm) .SUFFIXES: .pc8 .wav %.pc8: %.wav msdos pcmconv //v $< //b $@というルールを作れば$ make -f pconv.mk msdos pcmconv //v sound_bassdrum.wav //b sound_bassdrum.pc8 PCM converter PCMCONV ver1.8符号付 8bit PCM (ヘッダ無し)への変換および更新が楽に行える。 更に一歩進めば、ppz の更新が make で出来るということになり pmdppz データ を作る際の心理的障壁がひとつ取り除かれたということであるのだった。
去年は何もしなかったなぁと思っていたのだが、日記を振り返ってみると、どう やら私はゲーム機用 OS を作っていたようである。その過程でコンパイラも作っ ていたようだ。(あと麻雀を作ろうとして投げたり、思いつきで手を出しては色 々投げてもいたようだ……) 趣味プログラマが一度は作りたがるものとして OS とオレオレ言語、あとはテキ ストエディタがあげられるだろう。 OS と言語は一応達成してしまった?わけで、 となると残るはテキストエディタか。ネタとしてはバッファ構造、無限アンドゥ、 grep、置換、色分け、入力補完といったところだろうか。 GreenPad の後追いを するだけでも相当力がつきそうな気がする。 まぁテキストエディタはもう秀丸と Vim があればいいので……。 あと今年はギャラクシーポリスの年なのでこれ系のネタをやりたい気がする。 いい加減あれの移植も再開したい……。 それとそろそろ PC 向けに何かを作りたい。具体的には CD もしくは DVD 一枚 あれば起動できるゲーム環境を一から作ってみたい。現時点ではこれが有力かな。
ネンマツー。(’ω`)
と言うネタを温存していたのだが、さすがに温存しすぎたらしく、気づいたら既 にやっている方がいた。これでは今から始めても2位になってしまう。別に1位 でなくても構わない話ではありますが。(←時事ネタは風化するわよ) メガドラでオブジェクト指向プログラミング どうやら私の手抜きのせいで面倒をお掛けてしまったようで申し訳なし。 malloc その他の関数が 68020 の命令を使っているのはバグではなくて、 gcc のビルド時に --enable-multilib を指定して、かつ適切なビルドオプションを 指定しないとデフォルトのリンクライブラリが 68020 用になるという仕様に起 因していて$ wine m68k-gen-elf-gcc -dumpspecs ...snip... *multilib_defaults: m68020 m68881という風に確認できる。 ついでに multilib も確認しておくと…$ wine m68k-gen-elf-gcc -print-multi-lib .; m68000;@m68000 m5200;@m5200 m5206e;@m5206e m528x;@m528x m5307;@m5307 m5407;@m5407 mcpu32;@mcpu32 m68040;@m68040 m68060;@m68060 msoft-float;@msoft-floatと 68000 用のライブラリも用意されているので、リンクオプションで -A 68000 もしくは --architecture 68000 と指定すればそっちがリンクされるようになる はず。しかし紛らわしいので最初からそちらがリンクされるように(私の方で配 慮を)しておけよって話ですね……。 -- devkitGenesis と謳っている割にはメガドラ用の C ランタイムとリンカスクリ プトが入ってなくて、それは何故かというと非 GPL なライブラリを GPL なソフ ツに混ぜるとどうなるのか分からなかったので保留していたのだよな……。 crt0.o は自分で用意したいとずっと思っているのだけど、セキュリティコード の辺りがよく分からない。これはこういうもんだと割り切って既存のを使わせて もらっちゃうのが正解なのかな。 あとの手順としてはこんなもんだろうか。
void Copy(u32 dst, u32 src, size_t n) { char* s = (char*)src; char* d = (char*)dst; do { *dst++ = *src++; } while (--n); }が、こうなる。
Copy: move.l 12(%sp),%d0 move.l 8(%sp),%a1 move.l 4(%sp),%a0 .L2: move.b (%a1)+,(%a0)+ subq.l #1,%d0 jne .L2 rtsgcc/config/m68k/m68k.md を見ると dbra を使ってくれる局面は2種類存在する のだけど、よく分からない。つーかどんどん脱線していくな……。
オウガサイズならなんとかなりそうだけど、なぜか頭身の高いものを描く羽目に なってしまった。なんだか難しそうだ。まず腰から下を棒人間でざっと描いて、太ももの付け根と、かかとを基準とした 歩幅の位置にマークをつけた。
次にかかとを動かしてみる。
かかとと腰をラインで結んで、それを基準に膝マークをつける。
腰と膝と踵をそれぞれラインで結んだ。平行投影なので、足が一本出来れば奥の もコピペで使いまわせるはず。
実際にアニメしてみる。腰が広すぎた! 要調整だけどまぁ歩いてるようには見えるかな。
鳥足でも多脚でもなんでもござれですね! もう怖いものは無い……といいな。
go 社を会場に繰り広げられた勉強会に赴き、そこで何故か一人黙々と ARM 版 go のビルドを行ってきた。恥ずかしい話だけど、諸事情で二日寝ておらず目が血走っ ており、なんだか気を使わせてしまって申し訳ないことをした。寝ぼけたことも 多分言った。 -- (追記:下記で 5c と書いている部分と 5c に絡む解説部分は全て勘違いでした。 エラーが出るのは libcgo のみで、 5c 自体はコンパイル出来るようです) まず普通の go コンパイラ。5clibcgo のコンパイル時に、 arm.o の生成ルー ルを見つけられずにエラー終了する。 golang だけ使う分には 5g と 5l があればいいのだが、 C と連携したい場合に こま……いや困ることは無いかなぁ。5clibcgo には go と C の関数を仲介する arm.S と、スレッドを仲介する linux_arm.c が必要なのだけど、取り合えず arm.S を捏造して前者だけまかな うことにする。どちらにしても5clibcgo が使えないことは変わりないけど。 arm.S のアセンブルには x86-gcc が使われてしまうので、一筋縄ではいかない。 結局 arm-gcc -fPIC でコンパイルしたコードからバイナリを抽出して直接 .long で埋め込んでやった。バイナリサイコー。 更に linux_arm.c の中身を賄ったとして、こちらも arm-gcc でコンパイルする 必要がある(しかも ARM 版の pthread ライブラリが要るはず)と思うけどどう するんだろう?libcgo を 5c の外に出して、 5l で使うようにしないといけな い気がする。objdump で 5.out を逆アセンブルしたら r0-r3, sp, lr, pc しかレジスタを使っ ていないようだ。おかげでかなり冗長なコードになっていた。まぁ RISC のコー ドなんて冗長なものだろという伝説もある。ARM は CISC 的なにおいもするけど。 ちなみに、 5g / 5l で生成した 5.out を qemu-arm (0.11.0) で実行したら Segmentation Fault が返ってきた……。いつか beagleboard でも試してみたい ところ。 -- 次に gccgo。 gccgo のソースには Split Stacks という拡張が加えられており、goroutine の (gccgo 版の)肝になっているようなのだが、ARM 版はまだ着手されていないの で 386 版を参考に同様の変更をする必要がある。えーとどこだったかな、もう 忘れてしまった……。(diff とれば一発だけど面倒くさい) configure オプションは以下の通り。 ../gccgo/configure \ --enable-languages=c,go \ --build=i686-pc-linux-gnu \ --host=i686-pc-linux-gnu \ --target=arm-eabi \ --with-cpu=arm9tdmi \ --enable-interwork \ --enable-multilib \ --with-gcc \ --with-gnu-ld \ --with-gnu-as \ --disable-shared \ --disable-debug \ --disable-nls \ --disable-libmudflap \ --disable-libssp \ --disable-libgomp \ --disable-zlib \ --disable-libstdcxx-pch \ --prefix=$HOME/gccgo-arm 多分 libffi で詰まると思うので、3.0.9rc3 を落としてきて差し替えると吉。 で、えーと libgo の移植が済んでないのでビルドは途中で終わるよ……。 あまり関係ないけど gccgo/gcc/go/gogo.cc と、[/gco.]だけで構成されている ディレクトリがあって、なんだか面白かった。イケイケだ。 あとマスコットはかわいいと思うんだよ俺は。
xulrunner が 1.9.1 になって、いくつかの API が他のクラスに移動したため、 1.9.0 の libxul を当て込んでいる Mozilla::DOM が動かなくなりました。 具体的には nsIDOMNSHTMLElement の scrollXXX, clientXXX が nsIDOMNSElement に移動したらしい。offsetXXX だけ移動してないのはなぜと思ったら、その理由 についても件のレポートで挙がっていました。なるへそ。 んで、Mozilla::DOM::NSElement を新設して、メソッドをそちらに移動したらコ ンパイルもインストールも QueryInterface も出来るようになったので(続く) (続き)パッチを投げておきました。windows からアップしたら octet-stream になってしまった。なんか恥ずい。
MozEmbed の存在を知って以来、もうメロメロぞっこんになって色々遊んでいま したが、まぁ色々といってもスクリーンショットを撮ってただけなので全然色々 ではありませんが。 ・Xvfb を入れる デーモン化しようと思ったら、なんか ubuntu server 用の設定がどこにも見つ からなかったので見よう見まねでこしらえました。丸一日かかりました。linux 難しすぎる。xvfb.txt を /etc/init.d/ にコピー $ sudo chmod +x /etc/init.d/xvfb $ sudo update-rc.d xvfb defaults $ sudo /etc/init.d/xvfb start ※ X11::Xvfb を使うなら一連の操作は要りません。Xvfb を起動するとなんかフォント系の警告がでまくるので、apt-get でフォント が沢山入るパッケージを入れます。申し訳ありませんがパッケージ名は忘れまし た。一日で忘れました。linux 覚えづらすぎる。(追記: xfonts-base でした) ・xulrunner とかを入れる これだけ指定すればたぶん必要なものは芋づる式に色々入ります。$ sudo apt-get install pkg-config xulrunner-dev \ libgtk2-perl libgtk2.0-bin libgtk2.0-common libgtk2.0-dev足りない場合は $ apt-cache search xulrunner で出てくるものを全部入れれ ばいいです。linux 楽チンすぎる。・Mozilla::DOM を入れてから Gtk2::MozEmbed を入れる Mozilla::DOM が無くても Gtk2::MozEmbed が入ってしまうのは罠でしょ……。 Mozilla::DOM を入れる際に libxul.so が見つからない旨のエラーが出るので、 事前に以下の操作を行っておきます。$ sudo su # cat >> /etc/ld.so.conf.d/libxulcrap.conf /usr/lib/xulrunner-devel-1.9.0.14/lib ctrl-d # ldconfig (追記:ubuntu 9.10 で xulrunner-1.9.1.*/lib になったようです)つーか README に載ってるんですよこれ。README 読まなすぎる。 ※ デスクトップ版 ubuntu でこれを行うと firefox-3.5 が起動できなくなり ます。共有ライブラリを使い分ける方法があると思うんですが Linux が難し すぎて分かりませんでした。Linux が難しすぎる。 あとは CPAN で入れるだけです。sudo cpan -i Mozilla::DOM Gtk2::MozEmbed・スクロールバーを消す MDC を見ると、スクロールバーをトグルで非表示にする window.scrollbars が あるので、Mozilla::DOM::Window にも GetScrollBars がありそうな気がしま すが……無いので他の方法をとりました。my @elems = $embed-> get_nsIWebBrowser()-> GetContentDOMWindow()-> GetDocument()-> GetElementsByTagName('body'); for my $elem (@elems) { my $attr; if ($elem->HasAttribute('style')) { $attr = $elem->GetAttribute('style'); } $attr .= '; overflow: hidden;'; $elem->SetAttribute('style', $attr); }・ディレクトリを別ける 調子に乗ってあれこれ撮りまくっていたら、ファイルが多すぎてディレクトリを 閲覧するのが困難になってきました。パスを切って分散します。 先人であるところの「はてなブックマーク」の切り方を調べてみると、/a/b/c/d/e/[0-9a-z]{35}.jpgというパスになっており、どう見ても SHA-1 でした。 パスの生成に一方向ハッシュを用いると元の名前が連想できず、手動アクセスし たいときに不便です。手動アクセスをする機会なんかそんなに無い気もしますが、 今回はドメインネームを逆さに連結することにしました。この方法はいずれ破綻 しますが一時の延命には使えます。sub make_directory_path_from_url { my $url = shift; my ($domain) = $url =~ m{^.*?://(.+?)/}; my $path = join '/', reverse split(/\./, $domain); return $path; }そんなこんなでページショットが撮れるようになりました。ページショットを撮る時は ScrollTo を使って少しずつ pixbuf に流し込みまし た。 Flash でフェードインやら skip >> やらをしているサイトは、スクリーンショッ トを撮ると真っ白とか真っ黒になるのでアホかと思いました。3〜5秒以内に絵 が出てこないサイト(を作るようなデザイナー)は○○○ればいいのにと思いま した。 終わりです。
こんなマニアックなテクがあるなんて、今まで気づかなかったよ……。 とは言えウェイトが必要な実機だと、タイミングは完全にシーケンス依存なので 実用は難しそうだ。レジスタ書き換えとシーケンス実行が(音源から見て)ゼロ 時間で済んでしまうエミュプレイヤー向けのネタかな。……ネタと言っても、こ んなテクをどう活用すればいいのか全く思いつかない。単チャネルでフェーザー 効果が得られるかなぁ。 なんの話だか分からない人の方が多いと思いますが、FM音源の話です。