/var/log/hdk.log

2010 年 3 月上旬


01 (月)

%1 ドライブ

なぜかいろんなことが無駄に頭の中で回っていたので、 晩めしのついでに軽くドライブしてきた。 聖蹟桜ヶ丘のあたりとか、ちょっと丘になっているところ。 公園もあるみたい。

見晴らしがいいところを目指したつもりだったが、 残念ながら雨が降り出してしまって、 マンションの明かりが見える他は真っ暗であった。 まあ、でも、こういうところを走っていると、 結構頭の中真っ白でいられるので気持ちが良い。 つくばなら筑波山なんだが、あそこまで人のいないところは、 高尾とか奥多摩方面にでも行かないとないよな。 たぶん。

そういえば鹿児島は山が多いから、通学の行き帰りなんかでも、遠くの住宅街や、 高校や、海 (錦江湾) や山々が見えていたものだ。 高校の書道の先生だって、教室の窓から見える入来とかの山の陰影が、 墨の絵のようで美しいとか言っていたっけ。 関東は平野が多いし、そういう見晴らしの良くないところに住んでいるから、 たまに高いところからの景色が見たくなるのかもね。(←こじつけ)

2010/03/01 のコメントを読む・書く


02 (火)

%1 PIT

うちにある一番古い PC... すなわち ThinkPad X31 で、PIT (8254) の カウンター 2 (ビープ音に使われるやつ) を Linux からいろいろいじってみた。

#include <sys/io.h>
main () {
        unsigned mode, count;
        iopl (3);
        outb ((inb (0x61) | 3) & 0xf, 0x61);
        while (scanf ("%u %u", &mode, &count) == 2) {
                outb (0xb0 | mode << 1, 0x43);
                outb (count, 0x42);
                outb (count >> 8, 0x42);
        }
}

通常はモード 3 が使われるのだが、 モード 2 とかモード 0 にしたらどうなるか... を、 やってみたところ、それらのモードも使えるようだ。 モード 3 は H と L が同じ時間ずつ出る (偶数値の場合) が、 モード 2 だとほとんど H でカウント値が戻る時だけ L となり、 モード 0 は最初 L でカウント値が 0 になると H になりそのままカウント値が 戻らないというやつ。 なので、モード 2 だと非常に小さな音がして (L の時間が 1/1193182 秒ではね...)、 モード 0 は大きめの値を書き込むとその瞬間ポツッて音がする。

というわけなのだが、それを PCM で録音してみると、予想とは異なる結果が出る。 なぜか正と負が交互に出ているし、しかも間に 0 になっている時間がある。 モード 3 で値を大きくしても、0 になっている時間が増えるだけ。 ビープ音を耳障りじゃない音にするための後処理なのだろうか?

%2 PWM

そういえば昔ビープ音で PCM データを再生するプログラムを作ってたよなと思い、 今時の有り余る CPU パワーを使えば余裕で制御できると考え試してみたのだが、 昔のようにうまく鳴ってくれない。 もしかすると正と負が交互に出る後処理の影響か?

そもそも昔作った時は、PWM なんて言葉の意味は知らなくて、 最初はデータの値の大きさに合わせて、ビープ音のオンオフの長さを制御してみたら、 案外まともな音が聞こえたのであった。(実はまさに PWM の一種だが。) ところがさらに単純に、単にビープ音の音程を変えるポートにタイミングを 合わせてデータを流し込むというやつでも、なんとなくちゃんと聞こえていた。 それはモード 3 でやっていたのだが、なんでまともに聞こえたのかはよくわからない。

その後、某 EO System Ver.3 のサウンド機能がまさにビープを使っていたので、 ちょいと解析し、あまり意味もわからずまねてみるなどしたような。 それはタイマー割り込み用のカウンターを標本化周波数に合わせ、 割り込み禁止状態でそのカウンターをポーリングすることによりタイミングを取る。 ビープ側はモード 0 とし、 最初にタイマー割り込み用のカウンターに設定した値が最大値になるように データを演算し (8 ビットなら data * counter / 256 みたいな)、 それを書き込む、みたいな仕組みだったと思う。 さすがに 12 年以上前のことなので記憶が曖昧だが。 まあこれも要するに PWM なのだが、 そもそも 8254 に 2.4576MHz とかの入力な時点で、11.025kHz の 256 段階すら 表現できないのは、まあ当然だったわけで、 でもこのやり方、標本化周波数が高くなるとダイナミックレンジは下がるという、 結構残念なやり方で、22.05kHz くらいの音楽とか聞けてはいたけどねぇ。

2010/03/02 のコメントを読む・書く


03 (水)

%1 また PIT

さらに遊んでみた。

カウント・ラッチについて。 読み出しの時は通常カウント・ラッチしてから読み出すのだが、 この時、カウントは止まらず、ラッチにそのときのカウント値がコピーされるだけ。 ビープ音の場合、ビープ音が止まらないことから判断できる。 カウント・ラッチのコマンド書き込み時は、モード指定や BCD 指定は無視される。

コントロールレジスターにカウント・ラッチ以外のコマンドを指定した場合、 カウント値の書き込みが終わるまで、カウンターは停止する。 ビープ音の場合、ビープ音が止まる。2 バイト書き込み時、1 バイト目だけを 書き込んですぐ読み取ってもカウント値は変化していない。

BCD について。8254 は BCD による書き込みが可能となっており、ThinkPad X31 でも 実際に使えることを確認した。BCD による書き込みで気になるのは、0 が 何になるかということ (16 進数であれば 0 は 0x10000 を意味する)、BCD として 不正な値を書き込んだ時に何が起きるのかというところ。 調べてみると 0 は 0x10000 と同じで、BCD なのでそれが 10000 の意味になる。 また不正な値を書き込んだ場合も、 その値は有効でデクリメントされるが、0 の次は 9 になる。 例えば BCD で 0x3f00 を書き込むと、 カウンターは変な値でカウントを始めるが、 出力は 0x4500 を書き込むのと同じになる。0x3fff なら 0x4665 と同じ、

BCD でカウント値を書き込んだカウンターは読み取りも BCD となる。

あとは仕様書でも読めば書いてあるだろう。

%2 給油

121 円/l。16.7km/l。

2010/03/03 のコメントを読む・書く


04 (木)

%1 JX

CPU の動作クロック 4.77MHz は、 基本周波数 14.31818MHz を 3 分周したものなのであるが、3 分周って どうやるんだろうと思っていたら、 「拡張チャネル」(ISA の拡張スロットのようなもの) の信号の 説明のところに図があった。70ns の H のあと 140ns の L という図が 描かれてあって、「デューティー比は 33%」とある。70ns は たぶん 1000/14.31818 = 69.84 のことで、 ちょっとおおざっぱすぎやしないかと思うが、 なんとなくデューティー比は 50% にするものと考えていたのが間違ってたようだ。 でももし基本周波数がデューティー比 50% であるなら、 立ち上がりと立ち下がりをうまく使えばデューティー比 50% で 3 分周できそうでは あるなぁ。

カセット機構は実際に使ったことがないので全然知らなかったが、 リファレンスを見るとタイマー 2 の出力がそのまま出ていて、 ビット 0 は 500us 周期、ビット 1 は 1ms 周期にするらしい。 つまり 1kHz から 2kHz 程度の出力なわけで、 カセットテープに確実に記録できるところを使っているものと思われる。 矩形波なので、実際はローパスフィルターを通ってちょっと変わると思うけど。 しかし、タイマー 2 の出力っていうと、 まさにビープ音のスピーカーに接続されているじゃないか。 つまり、ビープ音のゲームの音なんかは、 たぶんカセットインターフェースから比較的簡単に出力させられたんだと思われる。

IBM PCjr Pictures, Set 1

PCjr のキーボードってこんなひどかったんだな。Fn を押さないと \ が 入力できないなんて、DOS を使うには地獄じゃないかw これに比べれば JX の キーボードは極めてまともであった。

でも PCjr ってメモリー 640KB まで積めたんだな。JX は 日本語フォントの ROM のアドレスの関係で 512KB が上限であった。

2010/03/04 のコメントを読む・書く


05 (金)

%1 8254

カウント・ラッチの後、 カウントを読み出す前に再びカウント・ラッチしたらどうなるか。 答えは、最初のラッチが残り、2 度目は無視される。

2 バイト読み書きについて。 コントロールレジスタへの書き込みの際に、 次に読み書きするデータは下位バイトに設定される。 その後、読み込みと書き込みがそれぞれ上位バイトになるか 下位バイトになるかは個別に管理され、 それぞれ読み込みまたは書き込みにより交互に変化する。 例えば下位バイトを読み取り後の書き込みは、下位バイトの書き込みになる。 また、カウント・ラッチではこの状態は変更されない。 例えば下位バイトを読み取り後にカウント・ラッチすると、 その次の読み取りはラッチした上位バイトの読み取りになる。

2010/03/05 のコメントを読む・書く


06 (土)

%1 どようび

ラジオを聞きながら楽しくエミュレーターの改良をする。 今日は 8253 タイマーのところを書き直した。Web に転がっていた仕様書と、 現代的な ThinkPad X31 のチップセットに含まれる 8254 ポートでの 実験結果を基に、それなりに丁寧に実装してみた。QEMU なんかを見ても、 なかなか BCD まで対応してはいないようなので、 それなりにレベルは高いつもり。(だが、BCD でカウントを設定する アプリケーションなど見たことがない。)

あと、SN76489A のエミュレーションだが、 今は MAME から持ってきたコードを適当にくっつけてあるので、 これを資料を基にまじめに一から書き直す。 これでめでたく GNU GPL ライセンス化が可能となり、Bochs から 持ってきた 8259 のエミュレーションプログラムなんかとともに配布が 可能となるわけだ。 ウマー。

%2 えいが

ラジオのアバンティに戸田恵梨香が出ていた影響で、 なんとなく「ライアーゲーム ザ・ファイナルステージ」を見に行った。 ワーナーマイカルでレイトショー。 今日公開だったらしい。

内容はよく言えばテレビドラマ版ライアーゲームの魅力がぎゅっと詰まった映画。 間に CM とか挟まないし、だらだら無駄に話が長引かない分、 濃い内容と言えるんじゃないかな。 全体的にあまり笑える話ではないので、 ところどころに小さな笑いを誘うような小ネタが仕込んであるのも良い。

悪く言えば、「ファイナルステージ」なんだからもっともっと liar が出てくる んじゃないのと言う人もいそうだとは思った。 先が読める展開でおもしろくないという人もいるかも知れない。

テレビドラマ版は中途半端に見ていたが映画も十分楽しめた。 全然見てない人には先にテレビドラマ版を見ることをおすすめする。 ゲームの内容はともかく、 ストーリーは「ファイナルステージ」にふさわしいと思うので、 テレビドラマ版を全く知らないとゲーム部分しか楽しめないだろう。

2010/03/06 のコメントを読む・書く


07 (日)

%1 誕生日 033

だからといって何か特別なことがあるわけでもないが。

ASCII の制御文字は ESC。

%2 そういえば

きのうは映画の前に The Typing of the Dead を 軽くプレイしてみたのだが、1,000 円以上の食事のレシートで 100 円分サービス って出る時気づいたよアチャー。 というのはともかく、1→2→5 でいい感じに進んでいたのだが、 やっぱ 5 は甘くなかった。

きのうの映画館は、 前に RealD 方式の 3D 映画を見たのと同じワーナーマイカルだったが、 きのうの映画はアナログフィルム上映っぽかった。 時折右上にフィルム切り替えのパンチが出て、 その後必ず映像が上下にぶれる現象が出ていたからである。 いくらアナログでもちょっといい加減すぎじゃないかと思うが、 ディジタル上映でそんなことをやっていたら、あまりにもお粗末である。

%3 にちようび

SN76489A のエミュレーション部分は、事前に調べていたこともあって、 比較的簡単に実装が完了した。 後は他の部分をちょっとずつ直しているのだが、 大きく変えたいのはビデオ部分で、HD46505 のレジスタ等を ある程度まじめに解釈して画面の位置なんかを反映するようにしたいところ。 なのだが、今の手抜き実装でも描画処理はかなりの負担になっていて、 普通に 60Hz 描画をさせると処理が間に合わないのが現状。 ある程度、軽量化のことを考えて実装しないといけない予感。

2010/03/07 のコメントを読む・書く


08 (月)

%1 久々の京王線

今日は夜に飲み会があり、遅くなってしまったので、 調布行きの最終バスからの乗り換えで京王線を使った。1 年前くらいまで 毎日使ったつくばエクスプレス (TX) の記憶は薄れてきているが、 京王線のインバーター式の電車は LED 表示板が TX のものとそっくりだし、 電動機も TX の交流車と同じ日立製ってことで、 停車直前の電気ブレーキの音なんかもそっくりなわけで、 ちょっとだけ親近感がある。

が、加速音を聞くとなんか TX とは違うような気がする。TX はもっと、 何て言うか、音の変化がスムーズだったような。 ブレーキだってかかり始めや停車はガックンと衝撃があったが、 途中の減速はコンピューター自動制御ということもあり極めて安定していた。 その代わり、モーター音は明らかに TX のほうがうるさかった。 やつは一部ポイント通過を除いて低速時の惰行をやらず、 基本的に全力で加速し多くの駅間で 120km/h に達するわけで、 騒音は相当なものだった。

まあそれはともかく、電動モーターのトルクときたら相当なものだ。 電車の場合、鉄道の特性上、加速-巡航-減速が割ときれいに分かれているので、 いいんだけど、これが電気自動車となると、アクセルペダルだけで 加速-巡航-減速を扱う (従来の自動車はアクセルペダルを離すことにより 弱めの減速を行うことができる) ので、その境目の制御がやっかいらしい。 というのをどっかで見た。 いっそのこと電車みたいに単純に、アクセルペダルは加速のみを扱い、 ブレーキペダルが減速のみを扱うってのでもいいんじゃないかとも言いたくなるが、 微妙な速度調整が重要な自動車ではそうもいかない。 実際にどんな風になるのかは電動カートにでも乗って... って、 そんなものに乗れる機会はなかなかない。 トロリーバスには乗ってみたいな。 遠いな。

2010/03/08 のコメントを読む・書く


09 (火)

%1 FreeBSD 8.0

今朝は ACPI S3 状態からの resume に失敗。 ダンプも残っておらず、原因は不明。 わずか 1 か月弱でクラッシュしてしまうのは、7.1 よりも不安定になっている証拠。

とはいえ 7.1 の時は ata のドライバーを 6.2 の時のものに 差し替えて使っていたせいで、安定していたという可能性はある。 ダンプが残っていなかったのを見ても、ata は極めて怪しい。

%2 また雪

今日は雪がかなり降ったが気温が摂氏 2 度程度までしか下がっていないため、 路面はうっすらと白いものの水浸しでぐっちょぐちょな状態。 牛乳やら食用油やら食器洗い洗剤やら米やら、 底が見えてきたので買い物に行きたかったんだけど、 車のフロントガラスは真っ白けになっていたので今日はあきらめた。

%3 Solaris

VirtualBox に久々に Solaris を入れて触ってみるなどした。 最新版のはずなのに、いろんな意味で、古い。 楽しめるのは、本物 (?) の vi や ed や sh なんかに触れるところ。 でも、この sh、何か変だぞ。

$ host
ホスト: 見つかりません。
$ 'Command not found'
コマンドが見つかりません。: 見つかりません。

何だ、このいい加減な多言語対応はw

2010/03/09 のコメントを読む・書く


Powered by Tomsoft Diary System 1.7.4

/var/log/hdk.log コメント一覧

トップ / 日記索引 / 日記 (2010 年 3 月上旬)

Hideki EIRAKU