タイマーの問題

***本記事にはプロモーションが含まれています。***

タイマーの問題は前から気になっているのですが、なかなか有効な方法が見つからないのです。特に、KqemuやQvm86を使うと目立つので何とかしたいのですが、メーリングリストに出てくるパッチを試してみても、よくなるどころか悪くなったりして、どうしたものかなという状態です。
やるとすると、QEMU内での時間の進め方を解析したり、WindowsやLinuxの時間の刻み方を確認することが必要な気がするのですが、結構大変そう。
その前に、シリアルポートを使えるようにできないかなと思っています。シリアルポートを使ったWindowsのリモートデバッグをやってみたいなと思います。
それが終わったら、インストールの問題とあわせて見てみようかな。予定は未定ですけど。

液晶の明るさ

***本記事にはプロモーションが含まれています。***

Intelは、ViivというブランドでPCに映像を取り込みたいそうですね。でも、自分がパソコンでテレビを見れない大きな理由が、液晶の明るさです。
最近は、300cd/m2みたいに液晶の輝度を上げた製品ばかり見かけますが、僕にとっては眩し過ぎます。店頭で、きれいに見えるからと購入したのですが、とても使えなくて売ってしまったことがあります。液晶パネルの輝度設定で最低にしても明るすぎ、コントラストをいじってもだめ。Windowsのデバイスドライバで輝度を抑えるとやっと見ていられる明るさになったのですが、プログラムをいじったりはできても、とてもテレビを見られる明るさではなくなってしまいました。それ以来、テレビとパソコンは別物だと強く思っています。
考えてみると、パソコンで液晶ディスプレイを見る距離は50cmくらいでしょうか。テレビは、3mくらい離れているでしょうから、単純計算でも1/5くらい明るさが変わらないと同じようには見えないはずなんですよね。1/5は極端かもしれないですけど。雑誌やWebで、明るくて見やすいなんてよく書かれているのをみると、それで長時間本当に作業したことがあるのかって突っ込みたくなります。僕としては、どれくらい暗く調節できるかと、そのときの見やすさがとても気になります。
ワンタッチで、テレビモードとパソコンモードを変えられるといううたい文句のパソコンもありますが、店頭で見た感じでは、パソコンモードが明るすぎてました。
昼と夜で液晶の明るさを変えられるのもいいですよね。夜はとても明るく感じます。
ディスプレイの近くに人がいるかどうかで自動的に液晶の明るさを変えてくれるようなインテリジェンスを持った液晶があったらいいなとも思います。
暗くて見やすい目に優しいディスプレイをどこか作ってくれないかな。

patchの編集

***本記事にはプロモーションが含まれています。***

.patchという拡張子のファイルをEmacs/Meadowで開くと編集できないです。なぜかなとずっと思っていたのですが、M-x toggle-read-onlyで編集できるようになったのでした。
これでpatchのごみを掃除できます。
Kqemu使っても-win2k-hackがいる場合があるんですね。やっぱりIDEの問題なのか?

USBのバイナリ

***本記事にはプロモーションが含まれています。***

USBをサポートしたバイナリを作ってみました。これも、ドキュメントが不足していて、どうやって作ったり使ったりするのかよくわからなかった。
使い方としては、ホストにフィルタードライバをインストールして、-usbオプションつきでプログラムを起動します。そして、QEMUモニターでinfo usbhostでUSBデバイスのIDを調べ、usb_add host:xxxx:yyyyします。Windows 2000ゲストならPnPで使えるようになると思います。
その他ホームページのほうに書いておきました。
Kqemuを使うと、-win2k-hackがいらなくなるということは、Windows 2000の問題もCPUの問題なんですかね。IDEの問題だとばかり思っていたんですけど。

Windows XP のインストール

***本記事にはプロモーションが含まれています。***

以前、Windows XPをインストールしようとしてうまくいかず、ずっとあきらめていました。メーリングリストでは、SP1を当てるとインストールできるとか報告があったようですが、自分のSP1aではだめでした。インストールの途中でエラーのダイアログボックスが出て、無視して継続するとインストールは終わるけれど、その後再起動を繰り返してしまって立ち上がらないという症状でした。
久しぶりに、インストールしてみたところ、なんかすんなりできてしまいました。少し調べてみると、Kqemuを使わないと、WinXPを起動できないこともわかりました。と、いうことはKqemuを使えばQEMUの以前のバージョンでもインストールできるんですかね。未確認ですが。
Qvm86を使っても起動できるようです。ということは、インストールもできるかも。ただ、Qvm86はげストのPAE(Physical Address Extensions)をサポートしていないのでWindows XP SP2は無理かもしれません。SP2になると強制的にPAEを有効にしてしまうようです。SP2を当てたインストールイメージを作らないと確かめられないけど。
Qvm86でも、違いがあるということは、うまく使うとQEMUのデバッグができるかもしれません。遅くて使えないかもしれませんが。
QEMU 0.8.0
kqemu 0.7.2
Windows XP SP1a
という環境です。

Qvm86のバイナリ

***本記事にはプロモーションが含まれています。***

久しぶりに、Qvm86のバイナリを更新しました。使ってる人どれくらいいるかわからないけど。開発が止まっているので、だんだん作るのが難しくなっています。
インターネットエクスプローラーのパッチも作りましたので、Windows 2000は、ちゃんと動くのではないかと思います。
Windows 98は、そのままでは動かないので、Qvm86をほとんど使わないようにしています。
それと、ユーザーマニュアルを更新しました。

-kernel-kqemuオプション

***本記事にはプロモーションが含まれています。***

CVSに-kernel-kqemuオプションが導入されたようです。今までのユーザーモード(ring 3)に加えて、カーネルモード(ring 0)までできるだけ、実機のCPUで実行します、とのこと。LinuxとWin2k/XPのみのサポートだそうです。
早速、CVSをとってきて、kqemu-1.3.0pre3.tar.gzをダウンロードしてきて、Windows XPホストで動かしてみました。
結果は、動かず…。メールではなんか、テストしてないみたいなこと言ってる。
あきらめて、Fedora Core 4ホストで実験。すると、Win2kゲストは、起動時間が短くなることを確認しました。IEもきびきび動いてるみたいです。
でも、他のLinuxゲストがうまく動かないみたい。なんでだろ。

日本語キーボード

***本記事にはプロモーションが含まれています。***

日本語キーボードの¥とパイプ'|'、バックスラッシュ''とアンダースコア'_'をX Windowで使えるようにするパッチを作りました。
http://www.h7.dion.ne.jp/~qemu-win/download/qemu-20060209-keyboard.patch
オプションなし、-k jaオプションありのどちらでも使えると思います。Fedora Core 4ホストで確認しています。patch -p0オプションであてられます。
もし、
Couldn't load keymap file '../pc-bios/keymaps/ja'
というエラーが出たら、keymapsをpc-bios以下にコピーしてください。
[qemu]$ cp -a keymaps ./pc-bios/
アンダースコアは、Xのキーコードが変更されたらしく、使えなくなっていました。XFree86からX.orgになったときに変更?
-k jaの方は、¥の設定がなかったことと、SDLが変なkeysymを返していました。
それにしても、Xのキーコード、SDLのキーコード、PCのスキャンコードに加えて、SDLのkeysymと複雑なのはなんとかならないのかな。

やれやれと思ったら

***本記事にはプロモーションが含まれています。***

パッチを送ってみたのですがどうやらうまくない様子。
マルチキャストのほうは、bindするときにsin_addr.s_addr=INADDR_ANYでないと関数が成功しないというものです。でも、そうすると複数のマルチキャストアドレス扱えないらしく、さてどうしようということになりました。
調べてみたけど、いい方法がないので、マルチキャストアドレスでbindが失敗したとき、INADDR_ANYを使うことにしました。
-net socket,connectの方は、もっと難しくて、非同期モードでconnectしたとき、Linux上では、EINPROGRESSなのに、Windows上ではWSAEWOULDBLOCKになってしまうというものです。
Linuxでは、EWOULDBLOCKは、EAGINと同じなためもう1度connectを実行するのですが、WindowsだとWSAEINVALIDになって、パラメータが違っていることになってしまうのです。
いろいろ調べてみたのですが、なんかいい方法がないのです。
そこで、Windows上でBSDソケットを使うことはあきらめて、イベントを使うことにしました。
WSACreateEventして、WSAEventSelectして、WSAWaitForMultibleEventsで待つのですが、サーバーがダウンしていてもFD_CONNECTのシグナルが来ていることがわかり、なんでサーバーなして接続するんだ???でした。
結局、こちらでiErrorCode[FD_CONNECT_BIT]を調べればいいことがわかり、なんとか接続の完了を調べられることがわかりました。
http://forums.belution.com/ja/vc/000/206/45s.shtml
それにしても、なんて面倒なんだか。これでいいのかな。