/var/log/hdk.log

2022 年 10 月

prev, this, next


01 (土)

%1 どようび

晴れ。 のんびり。

坂本冬美オフィシャルサイト / 冬美便り

27 日のところ、「川口信用金庫様の貸切り」ってあった! 火曜日の午前中というのがそれだったんだ。 30 日、休演日の更新のところにはもちろん農業協同組合の名前も...w そしてそれが 6 公演って書いてあるなぁ。 なるほど。

舞台の公演っていうのはこうして毎日のように同じ公演を繰り返していくことなんだな。 まぁ、同じといってもライブだから、毎日見ていればちょっとずつ違うところもあるのかも知れないけど。 歌まであって、体調管理などとてつもなく大変だろうなぁ。 39 公演ある、明日の午前が終わったらやっと 1/3 が完了だ、みたいなことを言っていたし。

%2 例のプログラム

MS-DOS のビルドに使っている自作プリプロセッサの改良。 MASM がメモリー不足で落ちてしまう問題への対処だが、やっていることは以下だ:

  1. 1 回目のソースコード読み込みで、STRUCEQU (=) の定義シンボル名をかき集める
  2. 2 回目の読み込みで、1 回目で見つけたシンボル名が出てきたら必要マークを付ける
  3. 3 回目は、必要マークが付いていないシンボルの定義行をコメントアウトしながら、入力をすべて (INCLUDE の先のファイルを含め) 標準出力にコピーする

で。 STRUC は構造体の一部でも使われていたら全部が必要になる。 EQU は行単位で良い。 いずれも右辺が別の定義を参照している場合がある。 これを管理するのに、ひとつの配列に、開始フラグ、シンボル名定義、関係する単語の記録 (0 個以上複数)、終了フラグの順で繰り返し並べて、それぞれ長さを持っていて、開始・終了を構造体の定義の開始と終了に結びつけていた。 開始フラグとシンボル名定義は一応まとめていたけど、おおざっぱにそういう構造であった。 んでどうなったかというと、上の手順にあるように 2 回目も 3 回目もシンボル名による探索があるため、この配列を先頭からずーっとたどってシンボル名定義をピックアップし名前を比較する、というのを繰り返しており、特にこのプログラムは普通の MASM が認識するようなキーワード、命令等を一切持っていないために、命令もシンボル名かも知れないとして常に探索していたから、それはもうとんでもない回数の比較が行われていたものと思われる。 それでも Linux KVM を使ってハードウェア仮想化のもと CPU の機能をゴリゴリ使って動かすとほんの 2, 3 秒で終わるため、まぁいいか、ってところだったが、ちょっとでもエミュレーションが挟まるととてつもなく遅くなっていた。

対策としてはデータ構造を見直すしかないな、ってことで見直した。 この配列構造はもともと、定義行をとっておいて使うところがあったら出すというプログラムをこしらえていた時の名残である。 定義行をまるまるとっておけるようにしていたが、最終的に 3 pass 方式にしたためその機能そのものが消滅した形になっていた。 で、やっぱりハッシュテーブルかなと。 DOS プログラムなのでハッシュ値は 8 ビットと小さめにしたが、同じハッシュ値を持つ名前の単方向リストにつなぐようにして、すべての名前はそのリスト要素へのポインターとして扱う。 その要素からシンボル定義の情報へのポインターを持ち、その情報の中に必要フラグと関係する単語の記録の単方向リストにつなぐ。 あと、構造体対応について少し悩んだが、circular linked list っていうのかな、末尾と先頭が結びついている単方向リストを使うことにした。 というのは、構造体の要素が出てきたときに構造体全体に必要フラグを立てたいわけで、どの要素であっても同じ方法で全体をたどれるのは circular linked list かなと。 関係する単語の記録は名前に対応するハッシュへのポインターをつなぐだけのリストだ。

そんな感じでデータ構造が決まったら後は書くだけだ。 リストといっても malloc を使うわけではなく、同じような配列を先頭から割り当てていくだけの malloc もどきみたいなことをするだけ。 解放はしないし。 使う側から書いて、ささっと書けて、あとは作る側、ってなって少し使う側の見直しが入ったが、できた。 最初まったく動かないバグをつぶしたら中途半端に動くようになって、なんだなんだと思ったらハッシュ値計算の際に大文字小文字を区別するミスをしていた。 それをなおしたら動いて、なんかめっちゃくちゃ速い。 なんだこれ。 いろいろ細かいチューニングをしてもずっと 10 秒前後でうろうろしていたのが、一気に 0.3 秒になった。 そんなに変わるか? まぁ、リストの探索が 1/256 になったなら指数関数的に速くなって... ってのはあるだろうけど、ハッシュ関数もいい加減な実装だからそんな理想通りにはいかないはず。

しかも、関係する単語の記録もハッシュに名前だけは入れるようにしたのがきいて、必要フラグを立てる処理がめっちゃシンプルになった。 今までその必要フラグを立てる処理でもまた全探索をしていたんだ... それも、絶対にシンボル名定義に出てこない DB DW みたいなのも探索していたんだからとてもアレだ。 それが、ハッシュにポインターで直接つながっているからもうその処理での探索そのものが不要になった。 DB DW みたいなのも、ポインターをたどればシンボル定義無しって一瞬でわかるからとても効率がいい。

GitHub - hdk1983/HIDOS

一応コードは GitHub に反映した。 速くなったのは本当にすごくて、最近書いていたうさんくさい機械語解釈実行プログラム (doscomm という名前で入れてある) を使っているのに、なぜか Linux KVM の MS-DOS 環境より速く全ビルドが完了するのである。 しかも make -j の並列実行もできる。 つよい。 MS-DOS 環境より速いのは、メモリー制約が厳しい MS-DOS 側のファイルシステムの効率が悪いとか、Linux 側のチューニングがすごくてシステムコールが鬼速いとか、勝手な想像をしているけど、それにしたって機械語直接実行より速いもんかね?

メモリー消費量もポインターで増えるかと思ったが文字列を何度も入れないのがきいて減っている。 よほど小さなプログラムだと多い場合もあるが、今まで 10k バイトを超えるような消費があったものでは確実に小さくなるようだ。

DOSBox でも結構速くなっていい感じ。 libx86emu の環境についてもまぁ前よりは速いかも知れないが、やっぱりこれはあまり実用的なスピードでは動いてくれない。

Windows についてはちょっと試してみたら Windows Subsystem for Linux (WSL) では 32 ビットバイナリが動かないらしい。 MinGW でビルドする Win32 バイナリについてはいいんだが、バイナリファイル絡みでいろいろと引っ掛かったので手直ししておいた。 オブジェクトファイルがテキストモードで開かれて化けるはわかるんだが、標準出力のリダイレクトがテキストモードだと改行コードの CR が消されて LF だけになるのは納得がいかないw WSL のシェルからリダイレクトしたせいなのかも知れない。 本当は Windows でよくある MinGW とシェルなんかのセット、なんだっけ、あれを入れたら WSL なしで動かせそうな気がするけど、面倒でそこまで試していない。 Linux ほど高速に動いてはくれなかったし...

2022/10/01 のコメントを読む・書く


02 (日)

%1 レンタルカート

スポーツカート耐久レース。 御殿場。 2 時間耐久レース 2 回。 最初がテクニカルコースで次がハイスピードコース。 4 人チームから参加。 完全にドライコンディション。

2 時間 2 回は 5 月にもあったパターン。 今回も同じようにテクニカルコースで自分のタイムが悪かった。 18 位、だったかな? いや、上位勢の失格があって 16 位だったか。 前回の表彰台でハンデがついており、ドライブスルーがついていてピット回数も多くてまぁ、難しかったのは確か。 2 時間レースでピット回数が多いと、終盤近くにピットが大混雑な傾向... ちょっと見直して 2 回目はピット消化を少し早めにすませてそこはうまくいったんだけど、結果は 19 位だったか。 これでハンデが消えて最終戦を楽しくたたかえるという狙い。

何度か危うく接触しそうな時もあったが何とかよけられた。 慣れていなさそうな人が目の前でスピン、まぁそれは仕方ないかなと思うけど、1 台のスピンをきっかけにさらに 2 台ぐらいがくるくるっといった時はええーって思ったw 数メートル離れていたので何とかなった。 少なくともそのうちの 1 台はその前に自分を追い抜いていった速い車で、その後にもう一度追い抜かれたw

%2 行き帰り

バイクの割引のやつを使ってバイクで高速で! 行きはよかった。 朝の山中湖はちょっと寒かったがある程度防寒着も着ていったので何とかなった。

帰りは... 渋滞情報が出ていたのでとりあえず谷村 PA までいって夕食をとり、のんびりしながら渋滞情報をチェック。 やたらこんでいるらしく Google Maps は一般道をいけと。 まぁバイクの割引のやつもあるし、混雑も解消方向だろ? と思ってそのまま高速をいってみた。 ら、談合坂近辺大渋滞。 あまりにとろとろでつらい。 上野原を過ぎると少しスムーズになり、表示上の 11km 45 分よりは速そうな気配。 藤野・相模湖を過ぎるとさらにスムーズになり、小仏トンネルのいつもの渋滞で、トンネルを抜けたらまぁまぁ回復、と。 谷村 PA から自宅まで 2 時間以上かかったか。 疲れた。

2022/10/02 のコメントを読む・書く


03 (月)

%1 げつようび

晴れ。 筋肉痛!

きのうの渋滞がきつかったなw Google Maps が言う都留から山道ルートは車で一度通っただけであり、決断できなかった。 勾配のきついところで転倒でもしたら、面倒なことになるし。 後から考えれば大月で降りて国道 20 号を通っても中央道よりは早かったかも知れない。 そっちなら前にバイクで通ったことがあるし、険しい山道ではないし、そうしてもよかったなと思えるぐらいには渋滞がひどかった。 談合坂のスマート IC から降りる手もなくはなかったが、SA の入口は長い待ち行列であり、もし使うならバイクだからとこそこそ隙間を通らせてもらうしかなかったな。 (バイク用の駐車スペースが用意されている場所では、四輪との駐車場の競合がないのでけんかにはならないだろう。)

%2 きのうの

きのうの F1 シンガポール GP。 予選も決勝も濡れた路面で始まりだんだん乾いていくパターン。 もともと荒れ気味な市街地コースなのに、濡れているとさらに荒れそうだなと思ったが、予選については案外スムーズな進行だった。 フェルスタッペンが最後アタックをやめたのは燃料残量の関係かなと思ったら正解だった。

決勝はというと、予選とはうってかわって荒れまくり。 周がラティフィに巻き込まれてリタイア、はまぁラティフィだから... (こんなことばっかやっているとラティフィ本当に来年はないぞ) アルボンが壁にささり、復帰はできたが大きなウィングを現場に残し... フェルスタッペンはドライタイヤにかえて間もない頃にめちゃくちゃオーバーテイクしそうな感じになっていたが、この路面だとやばいぞと思っていたら派手にタイヤスモークをあげてコースアウトし、タイヤを壊してしまいピットイン。 それから、タイヤをかえていなかったハミルトンが壁にささり、復帰はできたがウィングを破損し順位を落とした。 そして角田が壁にささりリタイア。 という一連の間にアルピーヌの 2 台は PU トラブルっぽい感じでリタイア。

W シリーズもあったとのことで今日見てみたが、こちらは野田が初っぱなリタイア。 審議の表示が出たのでインシデントだったみたいだな。 それから、圧倒的な差をつけてポイントリーダーのチャドウィックがここでチャンピオンを確定できるかどうかというところ、なんとオーバーテイクに失敗して壁にささり、初の (!?) リタイア。

やっぱり、市街地コースの中でもシンガポールは特に荒れるなぁ。 ネルソンピケ Jr のクラッシュゲートの際も、本人の暴露があるまで特に疑われなかったのはそういうコースだからだよな。

とまぁそれはともかくとして、DAZN が未だに視聴できているのが謎過ぎる。 povo のトッピング買ったの 8 月末だぞ...

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


04 (火)

%1 かようび

晴れ。 ちょっと暑い日。 昼からエアコン。

%2 HIDOS

読み方は Hi, DOS なのか、ヒドスなのか、... 一応前者ということにしておこう。

さて独自仮想マシンで動かしているやつに media check の実装を入れた。 実装をというかデバイス仕様も変わってしまうが他にこんな仮想マシン仕様を使っている人もいないだろうから変え放題だw んで fstat で更新日時を見て変わっていたら media changed の扱いにする。 これが強力で、普段はバッファーがきいてシステムコールがおさえられていても、外から mtools でファイルを書き込めば media changed でちゃんとそのファイルが見える。 便利!

という実験のためバッファーを増やして試していたが、バッファーを増やしてもビルドが顕著に速くなるわけではないんだな。 あの命令解釈方式が速いのは、なんなんだろうな...

で。 SORT.EXE が動かなかった謎を解いた。 EXE ファイルのヘッダーに maximum allocation というフィールドがあり、ここに入ったメモリー容量 (パラグラフ) 分は DOS がアロケートを試みた上で起動してくれるらしい。 最大とある通り、それより少なくてもとにかく限界まで確保と。 それでそこのデフォルトがなんと 65535。 COM プログラムと同じ、最大容量を割り当てて起動するんだな。

んでこれを 0 にしたらいいのかというと、0 にすると LINK の /HIGH オプション相当、メモリーの最上位に読み込まれるという意味。 それはそれで SORT.EXE は動かなかった。 最上位って、PCjr みたいに VRAM 共用メモリーがあるとこわいやつだなw

任意の数字にするにはリンカーにそういうオプションがあるはずだと思って探したら、DOS 3.x の頃のリンカーにはあったみたいなんだが、この MS-DOS 2.0 のソースコード付属の LINK.EXE V2.00 にはないみたいだ。 どうしようもないなと思って、そのフィールドに好きな値を設定する DOS 用のツールをアセンブリ言語で作った。 チェックサムも修正するまじめな仕様だ。 あっ、MZ をチェックしなかったな? まぁいいか。

これで 1 と設定したら SORT.EXE は無事に動くようになり、FreeDOS での変なエラーのトラブルも解消した。 いぇーい。

あとはちょっと PC 用 IO.SYS に細かな問題がありそうなので何とかしたい。 特にディスクまわり、PCjr のディスクなんか FAT ID FDH でヘッド数 2 って書いてある (実際には片面) ウザイ仕様だw JX で片面フォーマットだと F8H でヘッド数 1 でこれは MSX なんかでも使われた仕様のようだ。 そのへんどう扱うのが正解なのかさっぱりわからんが、なおしたいね。

あとリロケータブル IO.SYS というアホなことを思いついている。 JX に読ませるにはだいぶ上のアドレスにしないといけないが、他の PC 互換機ではかなり下のアドレスでいけるのが一般的。 アドレスが違うだけで BIOS レベルでは JX も変わらない互換性があり、リロケータブルにすれば共通化できそう。 そういえば J-3100 なんかの日本語仕様はメモリーの最低アドレスはどうなっていたんだろうな? AX ってのもあったんだっけ。

2022/10/04 のコメントを読む・書く


05 (水)

%1 すいようび

涼しい日。 雨。

そういえば 4 回目ワクチン接種の予約が始まっていたみたいだ。 今回の接種券は早々に (高齢者と同じタイミングで) 届いており、何か月も経っているから忘れかけていた。 近隣のクリニックにでもしようかと思ったが、自治体のサイトを見ると予約開始がもう少し先らしい。 都の大規模接種会場があるみたいなのでそっちで立川の会場で予約してみた。 大手町よりは近いな。

%2 PCjr

PCjr は片面ドライブでなく、両面だけど 40 トラック/面、な仕様だったみたい。 それがよくわからなくて、JX は確かに INT 13H が拡張されていて、ドライブ指定にビット 6 をセットすると 80 トラック/面な仕様だよとある。 が、これがどうも、40 トラックだとシークの時にシリンダー番号を倍にする、というだけのものらしい。 それならそれで、じゃあ英文モードはシリンダー番号が倍になっているのねー、って思うところだけど、自分はエミュレーターを作ったので、シリンダー番号が倍なら image file のサイズが妙なことになっているはずなのだ... あっ、いや、そうか! わかったぞ!

記憶を掘り起こすと、DOS を起動する時、たいてい結構なシークが発生する。 それは、後から CONFIG.SYS や AUTOEXEC.BAT を作成するためだろうと思う。 一通りファイルを書き込んだ後で作成するから、どうしてもディスクの後ろのほうになってしまうんだ。 特に編集時に EDLIN を使えばバックアップファイルが作成されるから、せっかく前のほうにあっても、ちょっと編集しただけで後ろに移ってしまうだろう。 で、その音からして英文モードのほうが距離が近いってことはなさそうだ。 とするとやはり 40 トラック/面な仕様、つまりシリンダー番号を倍にしてシークしていたはずだ。

んで自分のエミュレーターがどうして動いているのかと言うと、シークを完全に無視しているから。 フロッピーディスクはフォーマットの際に各セクターにシリンダー、ヘッダー、セクター番号の情報が書き込まれているはずであり、そのために読み取りコマンドにもその値を指定して、ドライブはそれを見つけてそこから読み込むみたいなことをしているはず。 んで、そっちは倍にされない、というか倍にしたらシリンダー番号が食い違ってしまう。 つまり 40 トラックの例えばシリンダー 5 を読み込むという時は、シークはシリンダー 10 にして、読み取りコマンドはシリンダー 5 で出す。 80 トラックフォーマットのディスクに対してそういうアクセスをすると、いくら待ってもシリンダー 10 のセクターしか出てこないから、セクターが見つからないエラーになるんじゃないかな。 あえてシリンダー 10 をシリンダー 5 でフォーマットすれば読めるだろうけど。 (ほとんどコマンドが生で見えていた PC-98 の BIOS はともかく、IBM の BIOS でもフォーマットの際に渡すデータはチェックされない仕様なので、変なフォーマットもできたはず。) 自分のエミュレーターはシークを無視して、読み書きコマンドのほうのシリンダー番号をあてにしてシークもしている、まるで超高速回転のディスクの 1 シリンダーにすべてのセクターが埋まっているかのような挙動をするため、シークコマンドがどうなろうと正常に動いてしまうんだ...

それと、IBM PC 系では一般に 512 バイト/セクターとされていて、それ以外は扱えないかのように思われているが、実際に PCjr 用のゲームで 1024 バイト/セクターを使っているものが存在した。 どうやって扱うかと言えば、ディスク BIOS の仕様で INT 1EH の割り込みベクターにパラメーターを並べておくというのがあり、そのパラメーターにセクターサイズがあるので、おそらくそれを使っていたんだろうと思う。 JX/PCjr は DMA がないのでアレだが、DMA がある機種で DMA を使う場合は確か事前に DMA に転送サイズを設定する必要があり、その計算は 512 固定ではなく、そのセクターサイズベースで行われていたんだろう。 PC DOS を起動したらシーク音が高くなっていたのも、理由は知らないが IBMBIO.COM がそのパラメーターにあるシーク速度を変えていたんだろうな。 後の 3 モードドライブがその方法でセクターサイズを指定することで PC-98 の 360rpm のフロッピーディスクを扱えたのかは知らないが、実は 2DD も IBM は 300rpm で PC-98 は 360rpm だったらしいのに普通にアクセスできていたので、2HD でもできていたのかも知れない?

2022/10/05 のコメントを読む・書く


06 (木)

%1 もくようび

雨。 寒い日。 マジで寒い日。 気象庁アメダスの府中のデータで、最高気温が 01:2114.2 度なの、さすがにスポーツの日を前にしてそれはちょっと...

%2 JX

自作エミュレーターのおかげで今更ながらいろいろわかった。 ディスケットの 40 トラック仕様だが、どうやら JX の英文モードでも、ドライブ指定のビット 6 が 80 トラック用に使えるみたいなんだけど、PCjr は 40 トラック仕様なので、ビット 6 はクリアされた状態で起動している。 んで、PC DOS 3.20 であってもビット 6 をセットすることはないようなので、英文モードで 720KiB フォーマットは使えない。 おそらく、ルートディレクトリエントリの一部ぐらいは見えるが、ファイルにアクセスすればセクターが見つからないエラーになっていたのではないか。 (実機の挙動はそこまで記憶にない。)

コピーツールっていうのがあって、プログラムは PC 用と PCjr 用と JX 用にわかれていたみたいだが、よく見ると JX 用はたぶん公式でなく、PCjr 用の改造版だ。 何が違うかって、メッセージを書き換えてある他は、セクター数が違うだけみたいだ。 なるほどね! PCjr では 40 トラック仕様のドライブで、シーク時にシリンダー番号を倍にすることもなかったんだな。 それ用のコピーツールの 40 (実際は 41) って書いてあるところを 80 に書き換えたら JX で動くって狙いだ。 コピーツールだしおそらくディスク BIOS は使っていないだろうから、単に増やしたら動くってわけだ。 はー! やったことないけど、PCjr 版を使ったらディスクの半分しかコピーされないということになっていたに違いない。 PC 版は DMA を使うのだろうか、QEMU では残念ながらエラーが出てしまった。

JX は一部輸出モデルがあったそうで、PCjr 互換機 (改良版) みたいな感じで売られていたようだが、それは 40 トラック仕様だったみたい。 だけどドライブをわざわざハードウェア的に 40 トラック仕様に置き換えていたとは思えないから、ディスク BIOS に日本語版 JX 仕様を持ち込んであったのではないだろうか? つまり、80 トラック使えないのかよだめだなー、って感じで売られていたのを、実はデバイスドライバーを書けば 80 トラック使える、って状態になっていたんだろうと思う。 今みたいに自作 IO.SYS ってわけにはいかないけど、自分でいちからデバイスドライバーを書くのは当時も合法であるw

自分のエミュレーターのフロッピーディスクコントローラーのエミュレーションはかなりいい加減なんだが、なぜかセクターが見つかりませんエラーがちゃんと BIOS に認識されなくて、なんでかなと思ったら、セクターが見つかりません→即座にタイムアウト割り込み、としていたのがまずかったようだ。 タイムアウト割り込みは longjmp 的な別ルートをたどるらしく、エラーコードが使われずにタイムアウトとして返されていたみたいだ。 タイムアウトはタイムアウトなんだからタイムアウトの時だけ使うべきか? ただ ready でないステータスにしてひたすらタイムアウトを待つ、みたいな実装がないからおかしいのか。 いやまぁ、何から何までおかしいんだけどw

2022/10/06 のコメントを読む・書く


07 (金)

%1 きんようび

雨。 マジで寒い日。

テレビでやってた映画『アダムス・ファミリー 2』(原題: Addams Family Values)。 1993 年のアメリカ映画。 前作から続いて不思議な家族の物語、そこにベビーシッターがやってくる。 アマンダという子供がフルハウスのステファニーっぽく見えるけど、役者はもう少し年上の別人である。 あとホームアローンの母親役の人が出ているように見えたけど... キャストにないな。 これも別人か。 あと夏休みの子供達のキャンプの描写、これ作者か脚本か監督かわからないけど絶対いい印象もっていなさそうw

%2 エミュレーター

自作 JX エミュレーターを改造して seek コマンドを解釈してズレをチェックする実装を追加して、セクターが見つからないエラーもちゃんと処理して、タイムアウト (watchdog) もそれっぽくして、書き込み禁止の動作確認をしたらうまくいかなくなっていて、ウーン。 書き込み禁止はタイムアウトなのか。

まぁでもこういじっていると楽しくて、シーク音を追加してみたくなってくる。 JX のドライブのシーク音は、後ろのほうにシークすると低くなり、シリンダー 0 に向かってシークすると高くなる傾向があったと記憶している。 つまりヘッドが動く軸のヘッドからディスクの外側に向かう側が振動していた? まぁ、よくわからないw 回転スピードもあわせて待ち時間もシミュレーションできるはず...

INT 1EH のパラメーター情報を見ると、step rate が 2ms, 4ms, 6ms, などとなっているな。 これが 1 シリンダー分のシークに要する時間だろうか。 んでギャップのところは 2AH とフォーマット用が 50H ってなっているがどういう意味なんだ...

そうそう、PCjr の某ゲームは 1024 バイト/セクターで 5 セクター/トラックなフォーマットを一部トラックに使用している。 つまり通常フォーマットより容量が多い。 2DD は 512 バイト/セクターで 10 セクター/トラックは確かできなかったはずで、1024 バイト/セクターにしたらギャップが減って足りるんかな。 そういえば、2DD のディスケットは未フォーマット状態で 1MB って書いてあったよな。 たぶん 1MiB って意味なんだろうけど、あれが実際に書き込める容量? 80 セクターだとして 1 トラックあたり 6553.6 バイト? あるいは、1MB だとしたら 6250 バイト?

PC-98 の BIOS は seek と read を別々で発行できたんだったな。 なので 40 トラック/面のフォーマットにも対応できるんだ。 あと read ID ってコマンドもあったんだっけ。 コピーツールはこれを使っていたのかな。 IBM の BIOS だとそういうコマンドを発行する機能がないから直接コントローラーにアクセスしていたんだろうけど。

2022/10/07 のコメントを読む・書く


08 (土)

%1 どようび

晴れ。 朝はまだ寒かったが昼は少しは暖かくなった。

トイレにおいてある時計・温度計の電池を交換した。 すると先々週の土曜日の日付で 15 時前ぐらいから再開された。 まさか、電池が切れたのがこの時か? なんでわざわざ記憶しているんだろうw そのまま放置しておいたら、6 時間後ぐらいに見た時には電波を受信して同期されていた。

SARS-CoV-2 オミクロン株対応 2 価ワクチン (BA.1) のモデルナを接種してもらった。 東京都が設置している立川の大規模接種会場で。 おととい予約、今日接種。 公共交通機関で来てくださいとなっていて、調べると、最寄り駅が多摩モノレールの立川南駅。 そして、そこから 1 駅の柴崎体育館駅の高架下に無料の駐輪場があり、125cc 以下の二輪車も OK であることが判明。 そんなわけでその駅までスクーターで向かい、そこから 1 駅モノレール... には乗らず、徒歩で向かった。 大手町の自衛隊の会場とは少し勝手が違うが、小さめの規模でプレハブが建てられていた。 こぢんまりとしているため歩く距離も短いし、駐輪場は無料だし (?)、いい感じだ。 15 分間の待機終了時刻が 11:11。

後は帰って昼飯を食べてゴロゴロ昼寝をしていたら接種部位が痛くなっていた。 ふむふむ。 それで F1 日本 GP の予選の時間だなと思いながらもう 10 分ほど寝てしまい、5 分ぐらい過ぎたところから予選を DAZN で観戦。 今日は鈴鹿も晴れていたのだが、明日は雨予報が出ているみたいだ。

熱は出ているんだかどうだかよくわからない。 頭痛もあるようなないような。 腕の痛みははっきりしている。 まぁ、今までのワクチン接種からして、ここから 1 日ぐらいはいろんな症状が出ても不思議はない。

povo2.0 は通信障害の返金はなくてあれなんだけど、なぜか 1 か月以上 DAZN 視聴できているからまぁいいやw

%2 テレビ番組

今季はいろいろ見たい番組が多いことがわかってきた。 名探偵コナンは今季だけでなくなんとなくいつも見ているが、他に:

かな、とりあえず。 全部見逃し配信で見るんだけど、たくさんあると見損ねることもありそうだな。 特に異世界おじさんは途中まで進んでいたのが最初からやり直しだから、まぁいいやと思っているうちに見ていない話まで突入しそう。

2022/10/08 のコメントを読む・書く


09 (日)

%1 にちようび

午後? 夕方? ぐらいから雨。

今回の SARS-CoV-2 ワクチン 4 回目の副反応はかなり控えめだ。 解熱剤も飲んでいないのに、体温を測る気にもならないぐらい熱っぽさはなかったし (微熱ぐらいはあったかも)、少しだるいかな、とか、微妙に頭痛っぽいかな、ぐらいの感覚も、今日の 22 時ぐらいにはすっきりしている感覚に変わっていた。 接種部位はまだちょっと痛いけどね。 モデルナを続けて 4 回だったからなのか、2 価ワクチンのおかげなのかはわからないけど、きっと従来株の分はこれまでの 3 回でよく学習できていて、新たな BA.1 の分はそこまで強烈な症状にならなかったんじゃないか、ということにしておこう。 ファイザーのほうはわからないが、モデルナは確か 3 回目から量も少ないはずだし、副反応の観点ではいろいろとありがたいものになっているのかも知れない。 知らんけど。

F1 日本 GP。 DAZN の実況解説陣も今回は現地入りのよう。 懸念されていた通り雨になり、スタートはしたが数周で赤旗中断になり、そこから長かった。 2 時間ぐらい? の中断の後に再開し、深溝の雨用タイヤから、わずか数周で浅溝への履き替え... これはあと 10 分ぐらいは早く再開できていたのでは? って言いたくもなるね。 混乱の中フェルスタッペンの圧勝でチャンピオンも決まった。 周回数足りないからポイントが半分で足りないんじゃないかという話を実況でしていたけど、実は赤旗中断のまま終了した時の話だったらしくて、ちゃんと完走したので普通にポイントがついたらしい。 去年のスパで赤旗が長く続いてほんの数周だったのにポイント半分ついたっていうのが問題になり、ルール改訂がされたんだけど、その時にそうなってしまったらしい。 実況のサッシャ、よく放送時間内に気づいたな。 ずーっと、違うんじゃないか、と言っていたんだけど、言いながらレギュレーションをいろいろ見直していたようで、急に、からくりがわかったかも知れない、と言い出して、レギュレーションの該当部分の英文を読み上げ、実際その通りだった。 中断の間にベッテルか誰かが話していたドイツ語も翻訳するし (同じドイツ人だし)、英語の同時通訳もなかなか上手だし、本当にパワフルな実況である。

%2 MS-DOS

ふと思いついた。 MS-DOS on MS-DOS が実現できるのではないか? IO.SYS 部分を EXE ファイルとして再配置して読み込ませ、プロセスに割り当てられたメモリーをそのまま上の MS-DOS の全体のメモリーとして使い、様々なデバイスは下にいる MS-DOS を呼び出す、っていう。

思い立ったが吉日、さっそく実装を始めた。 MSDOS.SYS は面倒だから直接ファイルをオープンして読み込む形に。 ディスクは下のドライブをそのまま使うかイメージファイルを使うか、引数で選べるように。 イメージファイルの機能があれば、新しいバージョンの DOS や Windows (32 ビット) 上で、FAT12 のドライブなんてねーよ! って環境でも使えて便利 (?) だろう。

例によってデバッグに苦労したが何とかプロンプトは拝めるようになった。 まだ適当に作ったのでいろいろ不足しており、割り込み 0 (0 除算エラー) のベクターの待避をしていないとか、割り込み 30H の割り込みベクターに位置にある CP/M 互換のためのジャンプ命令 (!) の待避をしていないとかね。 あと CLOCK は下の MS-DOS の CLOCK を開いてそのまま返すように作ったつもりが、なんか読めていない。 ウーン???

っていうか普通に CLOCK を開いて読むプログラムを動かしても挙動がおかしいぞ? まだまだ調べることがありそうだ...

2022/10/09 のコメントを読む・書く


10 (月)

%1 スポーツの日

雨は朝にはあがっていた感じ。

テレビドラマ『孤独のグルメ』Season 8, もう第 10 話だったのか。 (←よくわかっていない) まぁ単体で見られるのでいいか。 いや最新は Season 10 か。 古いのの再放送をしているのか。 ま、いいか。

テレビアニメ『異世界おじさん』も復習がてら第 1 話を。 あらためてみるとアレだな、日本の精霊を呼ぶ? ようなところは日本語でやっていて、本人の魔法絡み (ポケットとか記憶再生とか) はあちゃら語でやっているのかな。 製作の人達は感染症の関係だったので大変なんだろうけど、見る側としては話題になった後で改めて最初から放送してくれるというのはうれしい部分もある。 (話題になった頃には何話も進んでいて途中から見る気はしない、って作品は多数ある。)

連休最終日だなと思ってバイクの給油をかねて夜コストコに行った。 コストコは狙い通りすいていた。 だいぶ湿度が高め。 ややもやっていたし、高架下の信号待ちで上から水が降ってきて濡れて車体が少し濡れてしまったのが、走っても全然乾かなかった。

%2 DOS on DOS

CLOCK が読めなかった謎の鍵は、cooked mode と raw mode にあった。 デフォルトの cooked mode では、途中に仲介が入り 1 バイト単位の入力となってしまいうまく動かない。 Raw mode にすれば直接デバイスドライバーまでおりてくるので動く。 へぇ。

で、でだ。 いろいろ手直しをして、割り込みベクターの待避も一通り入れて、終了のためのデバイスドライバーも入れて、いろいろ動作確認もして、かなりいい感じになったところで、実機から今は仮想マシンに移してある古い Windows 2000 環境を引っ張り出した。 それで試してみると、なんと CLOCK が存在しない? 調べたら DOS 2.x の時は確かに CLOCK だったが、後に CLOCK$ という名前に変更されていたらしい。 そういえばそういう話あったっけ。 あったようななかったような。

それで Windows で CLOCK$ へのアクセスを試みたら、「デバイスの要求が違います」ってエラーが... はぁぁ? そもそも raw をセットする時に EOF がセットされているのも妙なんだよな。 EOF をクリアしたらそのエラーは出ないが読めないし、他にもいろいろ試してみたんだけど解消しないので、CLOCK デバイスの直接使用は諦めた。 代わりに DOS のシステムコールで日時の読み書きをして、CLOCK デバイスのデータ形式との変換を行う。 日付と時刻が別々のシステムコールなので、読み取りは日付を読んで、時刻を読んで、もう一度日付を読んで、最初の日付と一致していなかったら時刻の読み取りをやり直すという実装。 書き込みは時刻を 00:00:00.00 にしてから日付を書き込み、それから時刻を書き込む。 CLOCK デバイスでだけ 1980-01-01 からの日数が登場するため、計算が面倒だが、できた。 2100 年を突破できるように書いたけど、よく考えたら突破する必要ないな?

もうひとつ、Windows の DOS 環境では AH=6 INT 21H の文字出力は通常と経路が違うらしく、水平タブが展開されず記号になってしまう。 CON を raw mode に設定しても同様で、AH=6 は raw mode なのか。 しかし DOS 2.x の IO.SYS を書いている限りは、IO.SYS の CON デバイスドライバーから raw mode かどうかを知る方法はないように思うのだが? って、試したら PC DOS もそういう挙動しているよ。 どういうこっちゃ。 まぁいいや。 この文字出力を使うと、cooked で水平タブを出した時の桁も合わなくなることがわかったので、文字出力はすべて write システムコールにかえた。 (水平タブがズレるのは PC DOS も同じ。) 実は DOSBox だと raw mode に設定した CON からの読み取りがエコーバックされてしまうバグがあるようで、入力は逆に AH=6/AH=7 INT 21H を使うように修正し、ひとまず完成。

ところで、せっかく仮想マシンを引っ張り出したので、Windows の DOS 環境での MS-DOS ビルドも試みた。 予想通り、何も問題なし。 (仮想マシンだからかも知れないが) 速いし。 すばらしい。

2022/10/10 のコメントを読む・書く


11 (火)

%1 かようび

約 3 週間ぶりに午前中出社。 こないだの「坂本冬美特別公演 中村雅俊特別出演」で頂いたおみやげがあったので職場においてきた。 文明堂のカステラとバウムクーヘン。

明治座『坂本冬美特別公演 中村雅俊特別出演』ダイジェスト舞台映像 - YouTube

こんなの出ていた。 見に行った人はこのダイジェストで何となく思い出せていいと思う。 しかしこうして映像で見ると思ったより老けて見えるな... 2 階席からだとちょっと遠いからか若く見えた。

%2 DOS

きのう見つけた水平タブの謎は解けた気がする。

水平タブの展開をするかどうかが、CARPOS というカーソルのカラム位置管理とも連動している。

勘違いの一つめは PC-98 の MS-DOS から始まった。 最初は独自の IO.SYS がまだできていなくて、PC-98 用の MS-DOS の MSDOS.SYS と COMMAND.COM を差し替えて試すところから始まった。 自分が実装していた MSDOS.SYS は水平タブを展開しなかったものの、PC-98 の MS-DOS の IO.SYS は水平タブを展開するから、一見ふつうに表示されたが、CARPOS の設定ができていなかったため、タブを入れてからバックスペースを押すと、その手前のプロンプトまで消されるという事態になった。

で、それを見て IO.SYS の実装を始めたので、深く考えずに IO.SYS 側に水平タブの解釈を実装した。 CARPOS は IO.SYS 側からは触れないので、MSDOS.SYS 側で適当に想像で計算するように作った。

この時に何か既存の DOS の動作を調べることをしたと思うんだけど、DOSBox は行編集モードでタブを表示するくせに消す時は 1 文字単位といういい加減な実装で、他の DOS では DEBUG コマンドの - が消えないから正しい動作... で、INT 29H や ROM BIOS による文字出力等と合わせて行編集を試した時に、行頭に 1 文字出して行編集、で、水平タブを消してもその 1 文字が消えないから、DOS が正しいカーソル位置を把握している、と勘違いしたんだろう。 実際は、水平タブの展開を DOS 側でやっているから、先頭に 1 文字 raw 出力をした上でタブを入力すると、1 桁右にズレた位置に合わせられていることがわかった。 PC-98 版も同様で、普通に使っていたら MSDOS.SYS がスペースに置き換えているから、IO.SYS が水平タブの展開をするかどうかは関係ないわけだ。

で、cooked mode の CON への出力は、ファイル書き込みルーチンの中から OUT というサブルーチンが呼び出され、OUT が公開されていない部分だったため自分で実装したやつで、正しくはそこで CARPOS の更新と水平タブの展開をして RAWOUT に渡す形になりそう。 RAWOUTRAWOUT で標準出力が CON なら INT 29H を使うかデバイスドライバーを呼び出すし、リダイレクトされていたらそちらを使用する。 が、ファイル書き込みの処理から来ているなら CON への書き込みであるのはすでにわかっているので、必ず CON 側の処理になる。 それに対して AH=2 と AH=9 の文字出力にも OUT を使用していると考えられる。 これらは、リダイレクトされていたら水平タブを展開後にファイルに書き込むことになる。 おかしくない? と思ったが、実際に AH=2 で水平タブを出力するプログラムを作ってリダイレクトで試してみると、Windows や既存の MS-DOS でも水平タブがスペースに展開されたファイルが作られるので、間違いなさそうである。

Windows の DEBUG コマンドで raw mode に切り替え後に命令の区切りのタブが記号で見えてしまうというのがあったが、これは Windows の DEBUG コマンドの実装が違うだけなようだ。 Windows 上でも、DOS 2.x の DEBUG コマンドを使えばその現象は起きない。 コードは見なかったが、DOS 2.x のものはおそらく AH=2 か AH=9 による出力を使っていて、Windows のものは AH=40H による出力をしているのではないか? DEBUG コマンドは地味にいろいろとバージョンがある:

他に、確か NEC 版の MS-DOS 6.2 に付属の DEBUG コマンドは、なんと SETVER を入れないと DOS バージョンエラーで動かないバージョンであったw MS-DOS 5.0 付属と同等か?

2022/10/11 のコメントを読む・書く


12 (水)

%1 休暇

WITH ME カートレに参加。 潮来で KT。 もしかして 2 年前の 12 月以来だったか?? 何しろ前回来た時に東関東道の 110km/h 区間があったかどうかの記憶が怪しいんだよなw 早朝 4 時台に出て給油を済ませてコンビニにも寄って高井戸から首都高、東関東道の PA まで突っ走り休憩、それでのんびりいったつもりが 7 時過ぎ (ゲートオープン 7:30) という... 今回何とか潮来のインターチェンジからの道順を覚えられた。

午前中の走行でベストタイムは 37.9 秒ほど、午後は乗りやすいマシンから絞り出して偶然 37.3 秒あたりが出た。 午前は時々間隔を開けるための休憩ラップを挟みつつで体のつらさはそうでもなかったが、午後の後半は休憩ラップでも首がきつかった。 やっぱりスポーツカートと比べても明らかにきついなぁ、レーシングカートは。 コースの特性もあるとは思うけど。

たまたま、先日のレンタルカート耐久レースにも来ていた、いつも上位にいらっしゃる速いチームの方が、今日潮来で午前中だけ別の (WITH ME でない) グループで走行をされていることがわかって、少し話をして、観察もさせてもらった。 なんで午前中だけか? 午後に潮来の近くでお仕事があって、遠くてあまり来ることないしちょうどいい機会だからと午前中にカート走行を入れたんだそうで... つまり午後からお仕事... パワフル!! 3 人 3 台並んでハイペースで走行を重ねているのを見るのはなかなかおもしろい。 たまに雨がぱらつくこともあったため時々滑っていたものの、基本的には非常にスムーズに走行していた。 最終シケインに向かう短いストレートはアウト側まで出ていたが、最終コーナーは真ん中ぐらいで立ち上がる感じだったな。

帰りの車の中で信号待ちの間に後ろの荷物に手を伸ばしたら、体がピキッとなって焦ったw 神経痛は何とかごまかしているが、やはり潮来でレーシングカートに乗ると体がきついなw まだ筋肉痛になっていない筋肉痛っぽさはあるんだけど、よほど意識して姿勢を保っていないと神経痛が顔を出しそうな感じになっている。

首都高の渋滞を避けようとして都心環状線逆回りに入り、そこから中央道方面に向かったものの外苑で渋滞最後尾に追いついたので、外苑で降りた。 高井戸まで 40 分はちょっとひどい渋滞のように思ったので。 下もまぁ渋滞はしていたんだが、道も間違えたし... 外苑降りてから右に出て左折帯、までは悪くない選択のようだったが、その突き当たりを右に出て国道 20 号のトンネルに向かったから新宿駅近くの渋滞があった。 地図を見ると、あの突き当たりを左折してちょろっといって首都高くぐって右折、とやると千駄ヶ谷方面に出られたんじゃなかろうか。 そうすると初台までもう少しスムーズに出られたかも知れない。 とはいえ上が渋滞していたら下も渋滞するのはよくあることで、どれが速かったかは...

%2 鈴鹿の話

なんと参加者に今年の F1 日本 GP を現地観戦に行った人がいらっしゃったのでチラッと話をしてみたところ、レース再開タイミング、現地組的には適切な感じだったらしい。 というのは、15 分後のレース再開のアナウンスがあった時点で雨は降り続いており、えっ、再開するんだ、もしかして雨が上がるというデータがあるのかな、と、そんな感じだったみたいだ。 んで実際に再開の時には雨が上がった、と。 確かに、実況でも雨が上がりましたねと言ってはいたが、さすがにその雨の降り方の肌感覚までは想像できなかったな。

%3 MS-DOS の話

自分が実装したやつは Ctrl-C のチェックがおかしくて、出力をなおしたら出力の Ctrl-C チェックがなくなってしまっている。 それに、入力についても Ctrl-C が入力になってしまうケースがある。 Non-destructive read をして、入力ありになったとしても、それが Ctrl-C の場合があるから、もう一度 Ctrl-C かどうかのチェックをしないといけないみたいだ。

で、出力のほうは、stat は 4 文字ごとにチェックする、みたいなコメントが書かれた謎の変数があって、その変数はどこからも参照されていない。 もしかすると 1 文字ごとのチェックではないのかも知れない。 そこのところ、実は古い 2.00 の MSDOS.SYS のバイナリが MS-DOS のソースコードと一緒に含まれているので、それで挙動を確認できそうな気がする。 すでに自作デバイスドライバーを入れて一応は動く IO.SYS を手にしているわけで、DOS 上で動く IO.SYS まで作ってしまったし、それに手を加えて実際の MSDOS.SYS で non-destructive read がどのタイミングで行われるのかを調べてみると良さそう。

というわけで調べてみると、確かに出力 4 文字ごとにチェックしているみたいだ。 へぇ。 AH=2 の出力でも 4 文字ごとになるから、どこかにカウントを保持しているのか? そんな変数あったっけ?? それともあの 1 バイト変数のどこか違うビットを書き換えて利用しているのか?

2022/10/12 のコメントを読む・書く


13 (木)

%1 きのうの給油

157 円/l。 燃費計算 16.7km/l。 燃費表示 16.7km/l。

%2 もくようび

曇り時々雨。

筋肉痛!!! 首まわりががっつり筋肉痛! やっぱりレーシングカートは違うね! 今回 10 分かける 6 回だから、走行時間だけなら、5 時間を 4 人で走りきるスポーツカート耐久レースのほうが長い。 1 周の長さが 1.5 倍ぐらい違うけど、それよりもパワーとタイヤの違いだろうな。

DAZN の Wednesday F1 Time の F1 日本 GP 振り返りは長めの 57 分。 3 時間レースはなんとモナコもそうだったらしい。 で、モナコのチェッカーフラッグは間違えて時間切れの 1 周後に出てしまっていたらしい。 へぇー! モナコは周回数が 75% を超えていたのでポイント数の混乱はなかったし、周回数のミスは誰も気にしていなかったんだな。

W シリーズは予算の問題があって残り 2 レースが開催できない状況らしい。 そうするとシンガポールで今季初クラッシュしたチャドウィックがそのまま 3 度目チャンピオンか。 ほぇー。

テレビドラマ『祈りのカルテ』第 1 話。 研修医の話、主人公の最初は精神科、みたいな、そんな感じ。

%3 MS-DOS

出力の Ctrl-C チェック、これ cooked mode の CON への出力でもきくので、OUT ルーチンでやるべきなんだな。 なんか参考になりはしないかと v1.25 のほうのコードを見たら、OUT の実装があった。 BIOS とガッツリ密接にくっつくスタイルだったようでそこは v2.0 とは大きく違っているが、水平タブの展開や CARPOS の更新もあるし、その処理を見てみると US-ASCII の制御文字 (0〜31 と 127) は全部特別扱いの範囲でどれも 1 文字進みはしないようだ。 実際試したらそうだった。 言われてみればベルだってカーソルは進まないよな。 PC DOS では IBM の固有の記号類が出るコードもあるけど (顔の絵とか矢印とか、JX だと罫線とか)、実際それも 1 文字にカウントされていないみたい。 へぇー!

ってわけで OUT の実装の見直し... そうだ、印刷機能もあるんだ。 Ctrl-P でプリンターに同時出力するやつ、あれも OUT でやるようだ。 忘れていた。 Ctrl-C については v1.25 は毎回チェックのようだった。 v2.0 は CHARCO 変数を参照して何とかする... わざわざ 2 進数で初期化されているため、何かビット単位で使うフィールドになっていると推測。 それで、適当に上位 4 ビットと下位 4 ビットにわけ、上位 4 ビットを 1 引いて、マイナスになったら下位 4 ビットを上位 4 ビットに移して Ctrl-C チェックをする、っていう処理を実装した。 4 回ごと固定なら 00010001b をローテートしたり、256/4 を足したり引いたりしてキャリーフラグを見て処理する手もあるんだけど、回数を 5 回とか 7 回とか任意に変える意図があったのかな? それでも回数を表すなら自分なら 2 進数では書かないと思うが... ま、他のコードから参照されていないんだから、どう実装しようが影響はないはずである。

プリンター同時出力と Ctrl-C チェックの関係は、バイナリの MSDOS.SYS の挙動を調べたところでは特に変わらず、別のプリンター出力のシステムコールを使用した場合は毎回チェックになっていた。 ので、そうなるように実装した。 AUX を含む共通ルーチンで毎回 Ctrl-C チェックをするように作ったが、Ctrl-P のプリンター同時出力の処理は Ctrl-C チェックをしないよう、その共通ルーチンを使わない形で実装した。

さてビルドした PC 用 DOS は自分の JX エミュレーターで日本語モードでも英文モードでも起動するようになっているので (例の seek コマンド無視を活用すれば英文モードでも 720KiB フォーマットで起動可能)、ふと思いついて、v1.25 のほうにバイナリで入っている BASICA.COM を実行してみたら英文モード (PCjr 互換) では BASIC が起動したよ! DOS のファイルは扱えるけど CHDIR が使えない BASIC だ! PCjr は最初から DOS 2.x だけど、ROM BASIC は PC とも互換性があったのかな。 日本語モードでは仕様が違うらしく BASIC は起動しなかった。

2022/10/13 のコメントを読む・書く


14 (金)

%1 きんようび

晴れ時々曇りみたいな天気だったのかと思っていたが、夜買い物に出かけたら道路は濡れていた。

テレビでやってた映画『るろうに剣心 最終章 The Final』。 2021 年の邦画。 映画館で見た映画。

%2 DOS

PC ではカーソルキーやファンクションキーが BASIC で言うところの CHR$(0,72) 的な感じで NUL とキーコードそのものというふうに展開されるしくみがあり、MS-DOS のソースコードでは IBM とか IBMVER とかみたいな定義が真にされているとそっちのスタイル、自分でビルドしたやつは MSVER にしたからこれは NEC 版 MS-DOS と同様に VT52? 互換のエスケープシーケンスになっていて、そのため IO.SYS にキーコード変換を実装した。 ところがアプリケーションがその IBM 方式を期待しているところがあり、切り替えられると便利だな? ってことで切り替え機能を実装した。 ついでに少し入力ルーチンを整理して。

で、確認したら動かない。 F3 全然きかない。 おかしいな? と思ったらきのうの修正でちょっとやらかしていたことがわかったw まずそれを修正して、それからその切り替え機能を追加だ。 うまくいった。

うさんくさい DOS on DOS も割といろんな環境でよく動いてくれる。 ただ 8088 エミュレーションだと文字表示がむちゃくちゃ遅い。 それもそうか。 せっかくの INT 29H も、割り込みベクターを入れ替えてシステムコールなんだからな。 というわけで、標準出力が special の時だけは割り込みベクターの入れ替え無しに直接元の INT 29H を呼び出すハックを作った。 INT 29H ってのはシステムが使う fast path なので、さらにシステムコールを使うことはできない。 となればシステムが別物に化けていても問題ないだろう、ということで。 知らんけど。

2022/10/14 のコメントを読む・書く


15 (土)

%1 どようび

朝は曇り、午後は晴れた。

前々から考えていたネタ、大型特殊の運転免許取得に挑戦してみることにしたw 30 代最後だしな!w 調布の自動車学校で大型特殊教習があることがわかったので、これなら行きやすいと思いさっそく申し込み。 なんと身分証明書が運転免許証の他にもうひとついるって、へぇ? それから、大型特殊教習は都度予約でなく、最初に空いている日程を伝えて、自動車学校側で全部割り振るんだそうで。 へぇ。 まぁ、 6 時間 しかないから、本当にそれで大丈夫なの? と思うくらいあっという間になりそうである。 ちょっとこんでいて 1 か月ぐらい先になりますよー、と言われていたが、いざ埋まったのを見ると再来週に一気にやる作戦じゃないかw 例によって適性検査もあり、今日が空いていたのでそれにして、受けたらその場で数分のうちに検査結果が出てきた。 へぇぇ。

なお調布自動車学校、以前は国道沿いにあったのが移転したんだそうだ。 元ボウリング場と言われて、あああ、ってなった。 これじゃん。 前にこの国体の時にボウリング場に来ていて、今見ると何かこのへん変わったっぽいよなと思ってはいたが、まさかボウリング場が自動車学校に化けていたとは。

そうそう、例によって視力検査の装置は左右の像がズレてしまって重ねられなくて、裸眼ではパスできなかった。 めがねをかけてもズレていたが、矯正により片目でも両目視力をクリアできてしまう。 二輪免許の時は教習中のみ眼鏡等で、免許併記の際は試験場次第という話がすんなり通ったけど、なぜか今回は時間が掛かった。 けどまぁ結局そうなった。 ま、40 歳も目の前まで来ているんだから、そろそろ試験場でも裸眼でパスできなくなっていても不思議はないんだがw

調布自動車学校は普通二種の教習もやっているそうだが、AT 限定の料金が書かれていて、MT はお問い合わせくださいとなっている。 まぁ、教習車は普通一種用があるから、できないことはないけどね、ってところなんだろうな。 普通二種も一括予約って書いてあったのでチラッと聞いてみたら、主に企業様 (おそらくタクシー会社) 向けで、一般の人であっても、1 週間で一気にみたいなやり方をするんだそうだ。 へぇぇぇ。

大型特殊の 6 時間教習も短いなと思うが、限定解除シリーズだと、車の AT 限定解除で 4 時間、バイクの小型限定解除にいたってはなんと 3 時間らしい... うひゃー。 普通二輪の AT 限定と小型限定 (小型は MT OK) の組み合わせの限定解除も 3 時間らしいが、そんな人いるんか?w

%2 MS-DOS と PCjr

自前ビルドの MS-DOS を PCjr に対応させようとしてごちゃごちゃやっていた。 きっと大丈夫だろうとは思うんだが、実機が手元にないので本当に動くのかはわからないw PCjr 対応としては基本的にはディスクフォーマットの話で、JX の FORMAT コマンドに /8 /4 /1 というスイッチがあって、それらの組み合わせ 8 パターンは media ID の F8H〜FFH に対応していることを今更ながら知った。 うち /4 は PCjr 互換の (倍トラックでない) フォーマットのオプションだ。

じゃあ PCjr の PC DOS の FORMAT コマンドには /4 以外は指定できるはず、っていうことで調べると確かにできたのだけど、/8 をつけた時かな、ブートセクターのパラメーターブロックがなんと空っぽ (00) になってしまうことを知った。 FAT の先頭の media ID をあてにするしかない。 へぇぇ。

でまぁ、そのへんを作ったなら JX でも PCjr ディスクのアクセスができるようにしたいよね、と思って適当に対応した。 DL=40H で起動してきていれば JX, media ID を見れば倍トラックは FCH 未満だから、FCH 以上だったら 40H のビットをクリアする。 欲を出してブートもできるようにしようと思って、ブートセクター内と IO.SYS 内のファイル読み込みルーチンでも 40H の一時クリアを実装した。 うまくいっていれば、360KiB フォーマットにはなるが同じディスクから英文モードでも日本語モードでも起動できるようになっているはず...

なお JX の英文モード BIOS はやはり DL=40H での INT 13H ディスクアクセスはエラーになってしまうようだ。 AH=0 だと通るが AH=2 は通らない。 ハードウェアが違うので seek コマンドの部分だけは書き換えてあるはずだが、PCjr との互換性重視で、機能拡張をしようとは考えなかったのかも知れない。

2022/10/15 のコメントを読む・書く


16 (日)

%1 にちようび

晴れ。 のんびり。

古いフロッピーディスクドライブを発掘した。 ケーブルが同時に出てくることを期待したが、出てこなかった。 ウーン。 捨てちゃったかな。 2009 年に手放したマザーボード GA-7DXC と一緒に使っていたドライブだしな。 Sun Microsystems Ultra 20 Workstation のマザーボードに FDD のヘッダーがあり、ケーブルさえあればつなげられる、と思ったが、電源も見当たらないのでその変換ケーブルも必要か。 フロッピーディスクはいくつか古いデバイス付属のディスクが出てきたが、シャッターを開いてみるとディスクの状態が怪しい。 シャッターがあるので 5.25 インチほどひどくはならないものの、さすがに 20 年の時はなかなかに厳しい。 ダイソーで買った 2 枚 2 色のフロッピーディスクも出てきて、こっちは見た目はきれいだった。

この前見つけ損ねた、『孤独のグルメ』Season 10 の第 1 話と第 2 話を見つけたので見た。 よしの食堂 (大衆食堂)、CABE (インドネシア料理)。

%2 MS-DOS

たまたま自分が実装したルーチンの挙動が間違っていることを発見した。 PC DOS のコマンドラインで Esc キーを押すと、入力内容を取り消して (今入力中のものを捨てて) やり直す、というのがあり、画面には \ が出て改行されるのだが、この時に本来であれば改行後最初の桁位置まで (プロンプトの桁数分の) スペースが入れられる、という挙動なはずのところ、8 桁スペースが出る状態となっていた。 TAB って名前のくせに、指定個数のスペースを出すってルーチンを書かなきゃいけなかったらしい。 なおしたらいい感じになった。

で、その桁数管理が CARPOS なのだ。 水平タブの桁位置にも使うけど、水平タブだけなら下位 3 ビットさえあれば事足りる。 プロンプトは 8 桁を超えることもあるから、CARPOS が大事なのだ。 (なお 256 桁表示すると 0 に戻ってくる。)

それから、IO.SYS を relocatable にした! 最初、デバイスドライバー部分のセグメントさえ書き直せばいいのではと考え、どうせならと思ってデバイスドライバーのテーブルを実行時に生成するコードを書いたが、それを書いてから、RE_INIT の存在を思い出した。 これは、MSDOS.SYS の準備ができて、システムコールが使えるようになった状態で、CONFIG.SYS の処理に移る前に呼び出される IO.SYS のルーチンで、想像では、PC-98 の KEY.TBL とか、JX の $USR16.FNT とかの読み込みはそのへんで行われるのではないかと思っている。 あっ、IBMIBMJAPVER が真になっていると使われないので、JX 版はそのへん書き換えてあるんだろうけどね。 まぁそれで、それが FAR CALL なので、やっぱり relocatable にしておかないとだめなのだ。

というわけで EXE ファイルにして、ヘッダーの relocation table を見てアドレスを補正するプログラムを書いた。 JX なら 200H, 他なら 80H のセグメントアドレスに IO.SYS のデバイスドライバー部分が来るようにする。 デバイスドライバー部分が予定と違うアドレスにあったら転送するというのは前に実装してあったから、そこはそのままで OK。 いろいろ動作確認して、良い感じだった。

あとは実機も試したいなと、フロッピーディスクドライブは今は使えないが、El Torito ブータブル CD なら簡単に試せる。 CD-RW に書き込み、ThinkPad X201 に USB 光学ドライブをつないで試すと、何事もなく動いた。 あまりに何事もなくておもしろみがないw ディレクトリの中の DIR が 1 行ずつ seek していて遅かったが、これは BUFFERS を指定したら解決した。 なるほど。 まぁそもそも光学メディアなのでフロッピーディスクドライブに比べたらずいぶんと速い。 あとこの ThinkPad には以前インストールした FreeDOS が残っていたので、そこでのビルドと DOS on DOS による起動も試した。 これも何事もなくておもしろみがないw

なお ThinkPad で BASIC.COM は DOS 2.x 上でも動かなかった。 元 IBM とはいえさすがに ROM BASIC は残っていないらしいw

%3 PC DOS

PC の ROM BIOS のデータ領域がセグメント 40H にあるというのは有名な話だが、じゃあその長さは? というとよくわからなくて、メモリーダンプを見ると 50H にはもうファイルシステムの一部みたいなのが見えていて、使われているようにも見える。 が、IBMBIO.COM は通常は 70H にあるようだ。 50H はルートディレクトリエントリの一部が壊れて見えていて、どうも起動時に何か使ったあとのよう。

んで調べると 50H には用途があるらしく、特に BASIC が使う部分があるようだ。 確かに PCjr BASIC を起動すると一部にいろいろ書き込まれる。 あと INT 1EH のベクターもここに設定されるんだと。 確かに PC DOS 上だと 0H:522H に設定されている。 JX の日本語 DOS でも 0H:522H は同じみたいだが、日本語 BASIC が使う場所は違うようだ。 へぇ。

自分の実装は 80H からにしたが、60H からの 512 バイトはディスク BIOS の DMA 制約の回避用のバッファーにしている。 DMA 判定を入れてあって、メモリーが 64KiB 以下か、DMA の制約がなさそうな環境であれば使わない仕掛け。 JX は DMA 無しなので 1E0H からを使うことはないが、そこは BIOS が使用する。 PCjr も DMA 無しなので 60H からは誰も使わない。 その 512 バイトを詰めてもいいんだが、面倒なのでやらないことにしたw エミュレーターも、デバイスレベルでなく BIOS レベルでのエミュレーションであれば、制約がないものがあるかも知れない。 DOSBox なんかがそうかなと思って試してみたら、違って、なんと PCjr モードにしても DMA 制約があるようだw

PC DOS はというと、DEBUG コマンドでわざと DMA 境界あたりにディスクのセクターを読み込ませてから、メモリーの検索をしてみると、IBMBIO.COM の後ろ? なのかな? 何か中途半端な位置に読み込んだデータが現れる。 PCjr エミュレーションだと違うっぽいな。 同じアドレスを何かの作業用バッファーに使っているようではあるが、境界をまたいでアクセスしても変化しない。

2022/10/16 のコメントを読む・書く


17 (月)

%1 げつようび

曇り時々雨。

テレビアニメ『うる星やつら』。 1 話。 GYAO! で配信。 初代アニメ作品は生まれる前から幼稚園入園前ぐらいの放送であり、再放送でも見たことがなく、今作が初めてになる。 絵は今風だが高橋留美子っぽさが出ている。 いきなりのどたばた鬼ごっこで主人公と彼女と宇宙人の三角関係がはじまった。

%2 DOS

きのう何の問題もないなんて書いておきながら、今日になったらバグが見つかっているんだからいい加減なものだw 遅い 8088 向けにいろいろと改良を施していたら、性能改善効果はほとんどないのに、別のところで挙動が変で、バグを入れていたことが発覚した。 DMA 判定をぶっ壊していた。 やり直してみると DOSBox はやはり PCjr 指定でなくても DMA 境界は存在しなかった。 そうだよねそうだよね... DOSBox は確か BIOS レベルで途中すっ飛ばしているはずだからな。 Bochs や QEMU みたいな ROM BIOS すらなく、特別な方法でエミュレーターを呼び出すだけになっているはずなので。

んで不思議なのは文字表示が遅い。 IBM の日本語 DOS と比べて明らかに遅い。 CON まわりを速くしてはみたが、そもそも CON は出力時は INT 29H という fast path が使われるのでここまで来ない。 Ctrl-C の入力チェックのほうは使われるから一応は効果あるだろうと思ったが、計測できるほどの差はなかった。 MSDOS.SYS だけバイナリの 2.00 と差し替えても遅いから、自分の IO.SYS 実装の問題なのかなぁ。 まぁ、2.00 のバイナリのほうが若干速いので自分の IO.ASM の実装のまずさもあるのだろう。 IO.SYS は、INT 29H が INT 10H を使う時に BX 指定なしになっているのかな、と思ったけど試しても大差はない。 わからん...

さて、DOS ってやつは Ctrl-C がうまく反応してくれないことがあったような気がする。 Ctrl+Break とか STOP キーとかのほうがきく、ってのは BASIC のほうだったかなー、そのへんはもう記憶があやふやである。 しかし Ctrl-C がうまく反応しない場合がある理屈は今は理解できる。 文字表示の際に Ctrl-C のチェックは行われるが、これは CON の入力バッファーの先頭 1 バイトを非破壊読み込み (non-destructive read) することで行われている。 つまり... うっかり他のキーを押してしまうと、入力バッファーの先頭にその文字が入ってしまうので、それが入力されるまでは Ctrl-C は処理されなくなる、という残念仕様なのである。

とにかく DOS はシンプルで、速い、みたいな感覚が (後の Windows 95 などが遅かったために) あるが、この構造を見ても速くはないことがわかる。 自作仮想マシン版でわかったように、MS-DOS はデバイスからの割り込みがまったくない環境でも動かせる。 そのためにキー入力待ちも Ctrl-C チェックも何もかもがポーリングで、ディスクアクセスだって (たいていの機種では DMA が使われていたが) ポーリングでやっても問題ないのである。 逆に言えば文字出力中も Ctrl-C チェックに CPU を使うし、ディスクアクセス中に他の仕事ができない仕様なのだ。 バックグラウンドで処理をするのは、せいぜいメーカーが各機種に合わせて作ったプリントスプーラーがあった程度だ。

2022/10/17 のコメントを読む・書く


18 (火)

%1 かようび

夜ちょっと雨が降ったっぽい。 さむい。

第 8 波来始めたか? そりゃー来るよね、だって学級閉鎖やら何やらで盛り上がっていたのが 7 月あたりでしょ、もう 3 か月経ったから、自然感染の人の免疫には期待できなくなってきた頃だ。 12 月に入ったぐらいに落ち着いてくれるといいけど、そうならないと厳しい冬になりそうだな。

%2 MS-DOS

我ながら笑えるぐらい日々バグを作り込んでいる。 仕事じゃないし何か大事なデータを失うわけでもないのでいろいろと雑だw 今日は AUX を試したら動かなくなっていて、おかしいなと見直したらきのう CON を速くした時にぶっ壊していたことがわかった。 ついでだから AUX も速いほうのエントリーポイントに差し替えた。 ついでだから PRN も見たらこれは最初から動かなかったw これ実は参考にした SKELIO.ASM がすでに間違っているのである。 PRN_WRT は CALL されるサブルーチンではないので RET 命令で終わってはだめである。 で、DOS on DOS 用の実装と独自仮想マシンの実装は共通ルーチンにしたので動くようになっているが、PC 用は ROM BIOS を使うあたりが SKELIO.ASM と似ていたのでそのままになっていた。

それと出力ルーチンの最適化を施した。 もっともよく使われるであろう AH=2 のシステムコールができるだけ分岐無しで出力ルーチンにたどり着けるよう配置を変えた。 他に AUX や PRN のシステムコールも CALL RET より JMP のほうがバイト数が減るからいいかなと。 いろいろやってから日本語 DOS との文字表示比較をしたら変わらないぐらいになっているなぁ! 細かく調べていないけど、どれかの修正がきいたらしい。

まぁサイズを無視するなら AH=2 は OUT とは別に同じような出力ルーチンをもうけたほうが都合が良いと思われる。 システムコールは dispatcher がいろいろレジスターの保存をしてくれているみたいなので、結構壊してもいいレジスターが多いんだが、OUT は壊さないようにしているからだ。 それでも PUSH POP が 2, 3 ペアいらない程度なんだけど。 Ctrl-P の印刷処理まであるのでふたつ実装を入れるとだいぶ大きくなるのはなる。

子供の頃に某デバイスドライバーのリバースエンジニアリングか何かで覚えたテクニックは、割り込みフックの戻り番地を ljmpw 命令の機械語の後ろに直接書き込むというやつだ。 これは便利なのでよく使っていた。 その後中学生ぐらいになってから、マシン語ゲームグラフィックスという本に載っていたプログラムが思い切り機械語動的書き換えをしているのに度肝を抜かれたが、結局それにインスパイアされる形で今回の IO.SYS 実装でもいろいろ怪しげなコードを使っている。 まぁ派手に命令を書き換えるのではなくて、アキュームレーターに対して immediate と比較する TEST 命令の機械語に置き換えて処理をスキップさせるとか、単に 1 バイト・2 バイト先への JMP 命令 (2 バイト) を書くのはもったいないから TEST 命令の機械語 (1 バイト) をおいておくとかそういう。 TEST ってのは便利で、レジスターは壊さないし、キャリーフラグは確実にクリアされるし... でもこう機械語の長さが手に取るように想像できてしまうのは昔エミュレーターを作ったからなんだよなw ここはアキュームレーターを使ったほうが短い、ここはどっちでも変わらない、ここは MOV の代わりに XCHG を使ったほうが短い、ここはレジスターを用いたアドレッシングにしたほうが短い、的な...

2022/10/18 のコメントを読む・書く


19 (水)

%1 すいようび

晴れ。

今朝はさすがに寒くて頻尿に... 4 時、6 時、8 時、10 時、11 時ぐらいな勢いでトイレに行っていた。 「洗えるどこでもカーペット」を引っ張り出していすに敷いてその上で仕事。 ベッドには N ウォーム敷きパッドを 4 か月ぶりに復活させたので今夜は大丈夫だろう...

%2 MS-DOS

次は PC-98 版 IO.SYS を実装してみようかな。 とはいっても市販バージョンみたいな INT DCH などは実装せず、最低限の CON AUX PRN CLOCK とフロッピーディスクのアクセスに対応するだけのをね。 フロッピーディスクは HD/DD 対応が必須だろうからちょっとよく知らないので調べないといけない。 まぁテキスト VRAM も、昔は直接アクセスするプログラムを書いていたもんだが、もう忘却の彼方なので調べ直しだな。 IBM PC の CGA/EGA なんかは構造がシンプル過ぎてほとんど覚えてしまっているけど (それでも白黒のほうは覚えていないが)、JX (日本語モード) やら PC-98 やらは 2 バイト文字をどうするかで属性フィールドか何かがごちゃごちゃしていて、文字コードが Shift_JIS (JX) とか JIS X 0208 (PC-98) とかだったのは覚えているけど、細かいところはもう忘れてしまった。

DMA 制約が PC-98 で偶数バイト単位ってなかったっけ? と思ってテクニカルデータブックを探して見てみたがそんなことは書いていなさそうだった。 64KiB 境界があるのは IBM PC と同じなので、IBM PC でやったのと同じような実装が使えるはずだ。

%3 バス

先日からニュースでバス横転事故が報道されており、その現場の小山町ってのは富士スピードウェイや、何度も参加しているカートレースが開催されるサーキットがある町でもあり、気になってしまうが、場所は富士山五合目からおりる道なんだそうでそっち側は自分は走ったことはない。 バスに関しては基礎知識としてドラムブレーキ、エアブレーキ、排気ブレーキ、リターダー、ホイールパーク、フィンガーシフトなどいろいろあってその辺の知識が自分ら素人以上にまったく足りていない突っ込みどころ満載な意見も見られる。 自分が借りたことがある 2t アルミバンなんか、中型 8t 限定免許で運転できるけど、当然のように 2 速発進で、排気ブレーキもついていた。

ベーパーロック現象、ブレーキを動かすブレーキフルードの温度があがり気泡が入るというその現象は、エアブレーキでは空気で動かしているのでおこりえない。 まぁエアブレーキとフルードを組み合わせている車種があるみたいなのはそうなんだけど、それもフルードはペダルの近くにあるはずなんだ (路線バスで見たことがある気がする)。 乗用車やバイクのようにフルードで直接ブレーキを駆動するのでなく、その先にエアがある以上は、ブレーキを使いすぎてフルードに気泡が入るほど温度があがるというのは考えにくいのではないかと思っている。

エアがあるのはバスに乗車しているだけで音で伝わってくる。 運転手がブレーキペダルを踏み込むと圧縮空気がタンクから送り込まれ、離すと送り込まれた空気が外部に放出されるから、離す時に空気の音が外に聞こえる。 ホイールパーク (駐車ブレーキ) は逆で、かけると空気が放出され、解除すると空気が送り込まれる。 空気圧が不足すると自動的にかかる仕掛け。 圧縮空気は圧縮機で作られていて、一定圧より下がるとゴゴゴゴと音をたてて圧縮を始め (タイヤの空気入れみたいなものの大がかりなバージョン)、一定圧に達するとプシューッみたいな音がして作動が止まる。 電車と同じような感じだけど、バスの圧縮機は電動モーターでなくエンジンの回転を使って動いていると思う。

タイヤ痕というのもブレーキによるものだけでなく、ステアリングを前輪のグリップ以上に動かして曲がりきれずに残るケースだってあるのだ (今回のは知らないけど)。 今日のところはブレーキ過熱の痕跡の報道も出てきているが、それにしたってトラブルでブレーキを引きずって過熱ということもあるので、それだけで運転手のせいとはとても言えない。 スキーバスの事故の時を思えば、あんな険しい道でブレーキを失って死者 1 名は極めて最小限の被害におさえられていると言えそうで、今後の調査を待つだけ。

2022/10/19 のコメントを読む・書く


20 (木)

%1 もくようび

晴れ。 昼に弁当を買いに外に出た時はそこそこ温かかった。

ベッドの敷きパッドを N クールから N ウォームに切り替えたのは正解! 5 時間半ぐらいトイレに行かずに寝られた。

そういえば先日のカート練習の際に来ていた人で、自分と同じような寒がりの人と、寒くても暑くても大丈夫という人 (いずれも男性) がいた。 寒がりの人は、飛行機に乗る時に夏だけどフリースを着たと言うから本当に似たようなものだ。 自分も先月そうしていた。 どっちでも大丈夫という人は、別にぎんぎんに冷房が効いた部屋でも耐えられるし、夏場の箱車のサーキット走行 (エアコン切って走るからクソ暑い) でも耐えられるそうで、なんともうらやましい体質である。 汗をよくかくせいかなと言っていたけど、汗は自分もよくかくんだよね、暑いと... 逆に、冷えた時に冷えたままなんだよな...

%2 ラジオ

今月はラジオ番組の再編成があって、一部残念な感じになった。 まず月曜〜木曜の 16:00〜16:30 の J-WAVE だ。 先月まで音楽が流れる時間になっていたのでそれにしていたんだけど (その前の GOOD NEIGHBORS を聞いている時もあるし)、なんか変な番組が始まってしまったので良いチャネルがなくて困っている。

それから金曜 13:30〜の InterFM。 TOKI CHIC RADIO が消滅、西川貴教の声が聞こえてくるようになった。 土岐麻子の番組は地味によかったので、完全消滅は残念。 そしてその後の、きゃりーぱみゅぱみゅの なんとかぱんぱんラジオが、月曜の夜遅い時間帯に移動した。 これは聞けないことはないが昼間じゃないと聞くのを忘れてしまうな。 お笑い芸人さんとの 2 人の謎のかけあいがおもしろかったんだが。 川谷絵音の約 30 分我慢してくれませんか、というのは一番いらない番組だったが、なぜか月曜 19 時台に移動して生き残ったらしい... どうして...

んでそのへんが移動したので金曜 13:00 以降のチャネル選択に困る。 NACK5 で小林克也の声を聞く選択肢もなくはないが、確か何かおたよりを読んでいる時間が長いんだよな、そのへんの時間帯に。 まぁ、金曜は 16:00 になると InterFM の POWER OF MUSIC があるのでそれまで 2 時間ほどパソコンで適当に音楽を流すということになるんだけど。 月曜〜木曜の 16:00〜16:30 は微妙に時間も短くて悩ましいところだ。

なお時々ラジオの入りが悪い日があってどうしたもんかと思っていたが、アンテナの、壁からミニコンポまでを結ぶ配線を少しずらして、スチールラックにかけたプラスチックハンガーに引っ掛けるようにして少し金属から離す感じにしたら、よくなった気がする。 スチールラックのせいで何かノイズを拾っていた可能性はありそう。

2022/10/20 のコメントを読む・書く


21 (金)

%1 きんようび

晴れ。

都の大規模接種会場、最近は金曜土曜がこんでいるらしいという情報を見かけて、立川の空き情報を見たら、BA.4-5 対応のファイザーワクチンは確かに土曜日がいっぱいになっていた。 BA.1 モデルナは普通に空いていた。 自分の時は BA.1 のモデルナ・ファイザーだったがどちらも余裕で空いていたけど、BA.4-5 を待っていた人が多いのだろうか? まぁ、年末のやばやばシーズンに向けて接種が進むなら悪い話ではない。

テレビドラマ『祈りのカルテ』第 2 話。 外科。 病院に出入りする保険屋さん。 ボロアパート。 内視鏡手術から開腹手術に変更。 研修医が患者のカルテを見直して何か大事なことを発見するストーリーのようだ。

テレビでやってた映画『るろうに剣心 最終章 The Beginning』。 2021 年の邦画。 映画館で見た映画。 敵は女に見せつけようとしてとどめを刺さずに引っ張ったのか何なのか、結局やられているのがアレなんだが、あんなに引っ張った割に抜刀斎の反撃は一発なのがうけるw

%2 PC-98

IO.SYS を作るのに必要そうな知識を昔見たのと同じシリーズの本から探した。 シリアル通信にしてもディスク入出力にしても、一手間面倒くさいのが PC-98 の BIOS だ。 いや、一手間どころではないかも知れない... ディスクはブートドライブの情報を得るのも 584H 番地のメモリーから得るしかないのかな。 もうちょっとどうにかならなかったんだろうかと思う仕様が多い。

グラフィックスに関しては意外と豪華で、LIO や MS-DOS のグラフィックスドライバーもある。 BIOS だけでも点を打つ以上のことができるのは IBM のビデオ BIOS より優秀だ。 GDC を作って気合いが入ったのかも知れないが、テキストが文字出力すらないのに比べて豪華すぎる感じもする。 まぁ IO.SYS でグラフィックスを扱う必要はないのでどうでもいい。

PC-98 の MS-DOS ではカーソルが点滅しているのが標準だったが、自分でつくるならあえて点滅させないようにするかなw IBM は PC DOS だが互換機がたくさんあり MS-DOS もあったのでアプリケーションがそこまで IBMBIO.COM/IO.SYS の仕様にどっぷりになっていなさそうな気がするんだけど、PC-98 は互換機はエプソンしかなかったし、ANSI.SYS 相当の実装もなしで適当に作ったら動かないアプリケーションがたくさん出てきそうだからな。

テキスト VRAM の仕様も今見るとちょっと不思議だな。 PC-9801 が漢字 ROM を積んでいなかったので ANK 仕様だったのはまぁわかるし、アトリビュートを別にして偶数アドレスだけにしたのも、漢字 ROM なければ文字コードのほうも偶数アドレスだけだろうし、そのへんは 8086 (バス幅 16 ビット) だったからそうなったんだろうと思うけど、2 バイト文字のほうだよな。 どうして上位 8 ビットだけ 20H を引く仕様にしたのか? 下位 8 ビットも引いてもよくない? というのと、左右別々に 2 回繰り返して入れる仕様はメモリーが高い時代にしては割と贅沢なのでは? というところかな。 おかげで半角 2 バイト (!?) なるものも使えたとも言えるが...

PC-98 の、漢字 ROM へのアクセス時にテキスト画面の漢字が出なくなる仕様は割と合理的で、JX はむしろなんでそうしなかったんだろうという感じはある。 JX のグラフィックス画面への文字表示は、フォント読み取りのたびにいちいち垂直同期を待つのでとても遅かった。 待たずに読み取って描画するプログラムを作ったことがあるが、一応動くけどなぜか画面にチラチラと線が出た。 VRAM の読み取りにところどころ失敗して FFH が読めたんじゃないかというような、そんな表示だった。 グラフィックスモードならフォント ROM にアクセスする必要はないはずだが、何かが切り離しきれていなかったみたいだった。 ビデオコントローラーからフォント ROM へのアクセスを遮断する 1 ビットがどこかの制御レジスターに作ってあれば、グラフィックス画面の文字表示もめっちゃ速くできただろうになぁ。

まぁ、それを言ったら JX がなんでわざわざメモリー空間切り替えでフォント ROM にアクセスするようにしていたのかも不思議かな。 何もわざわざ CPU からの VRAM アクセスを一時無効にしてからフォント ROM アクセスを有効にしてとやらなくても、もっと小さなウインドウがメモリーのどこかに現れるだけで十分だったはずでは... あるいは別に I/O ポートを 16 個とか 32 個とか確保してもよかっただろうになぁ...

2022/10/21 のコメントを読む・書く


22 (土)

%1 どようび

曇り。

大型特殊の教習動画を YouTube で検索してみた。 ホイールローダーというのが教習車なのかな。 車輪がたぶん後輪操舵? いや、前後輪操舵なのかな? 真ん中が折れて内輪差がないらしい。 オートマチックというのはクラッチ操作が不要ということで、トルクコンバーターだろうか。 変速機は無しかな。 サスペンションがなくステアリングのあそびがないみたいな話は見た。 まぁ、最初はとにかく慣れるってところかららしいし、予習はそのくらいで。

車の点検の前にバッテリー充電をかねて適当にドライブ。 前回の走行が先週の水曜日、潮来まで長距離だったためかバッテリーは電圧を見る限りは十分充電されていた感じではあった。 多摩センターあたりの住宅地をぐるぐるしてから野猿街道に出て、こっち行ったら八王子みなみ野駅のほうに出るんだっけと走っていたら北野のほうに向かっていてあれれれ、ってなったw 16 号バイパスに出てムラウチハードオフ。 車で来たの久しぶりだな。 ブックオフがちょぴっと移転していた。 適当にジャンクのケーブルを買って、それから 100 円ショップを探したらすぐ近くにあったので寄ってからディーラーに向かった。

車の 12 か月点検。 オイル交換と洗車もお願いした。 バッテリーは... あと数日で 9 年だなww

夕方の帰り道は混雑していた。 新奥多摩街道だと渋滞していそうだったので空いていそうな道を選んで日野バイパスまで出て、それでも国道 20 号をずっと行くとこむよなと思って裏道へ...

『孤独のグルメ』Season 10、第 3 話。 桜木町。 ごはん屋さん キッチン・カフェ ばる。 魚を市場で仕入れて 30 年? 美味そう。

テレビアニメ『うる星やつら』。 2 話。 高橋留美子作品、高橋留美子劇場とあと、らんま 1/2 を一部読んだぐらいだが、アニメになるとこんなに楽しいもんかな。 ってちょっとした発見。

%2 PC-98

PC-98 用の IO.SYS を作り始めてみたがやっぱりディスク I/O のところが面倒だなぁ。 ディスクアクセスに使う DA/UA, UA はフロッピードライブの場合は単に 0〜3 の番号だから、DA のほうだな。

あっているかわからないがたぶんこんな感じ。 2D は E・F・M までで終わったみたいだが、JX の PCjr 対応のことを思えばシークだけシリンダー番号を倍にすれば使えるんだろうし、何か BIOS の説明もよく見るとその設定もありそうにも見える。

なお回転数に関してはもともと IBM PC はミニフロッピーディスクの 2D 300rpm だったのが、後に 2HD (2HC) になる時に 360rpm になったのと、マイクロフロッピーディスクは 300rpm のまま来たという経緯があるらしい。 PC-98 は別の電電公社等の話からミニになる前のフロッピーディスクの 360rpm を引き継ぎマイクロフロッピーディスクもそれを引き継いだ的な? で、データ転送スピードが 250kbps とか 500kbps とかいろいろあるらしく、360rpm で 2DD をアクセスするのは 300kbps (250/5*6) でそれは PC/AT での採用もありサポートがされていたらしい。 ところが 1440KiB を 360rpm でいくと 600kbps となりそれはコントローラーがサポートしていない。 逆に 1232KiB を 300rpm でいくのも 500/6*5 kbps という中途半端な数字になってしまいサポートされていない。 まぁそういうことらしいんだけど、昔 PC-9821Ap2 の外付けマイクロフロッピーディスクドライブで回転数切り替え (物理スイッチ) を忘れてリッチテキストコンバーターで読んだら読めてしまった的なことがあったような気がしていて、何かアクセス方法によっては読めることがあったのかも知れない。 あるいはアレ 2DD だったのかも知れないけど、そこまでは記憶にない。 2DD (or 2D) だったら 250kbps でも 300kbps でもコントローラーがサポートしているからどっちの回転数でも良いんだなと。

この kbps と rpm で 1 トラックあたりの物理的なデータ量がわかるな。 2DD で 6250 バイト, 2HD で 12500 バイトか。 80 シリンダー両面で計算すれば全部でそれぞれ 1MB, 2MB となる。 あと、JX や PCjr のあのスペックで DMA を使わずに 2HD が扱えていたかを想像するのも楽しい。 あれ 250kbps (31.25KBps) だから間に合っていたのであって、2 倍になったら間に合っていなかった可能性もあるんじゃないかなー。 65536 回のループがビープ音をピーッと鳴らす時の待ち時間に使われていたぐらいだからね。 そういや JX 用のハードドライブは転送はどうしていたんだろうな...

2022/10/22 のコメントを読む・書く


23 (日)

%1 にちようび

晴れ。 暖かい日。

%2 大型特殊教習 1・2 時限目

遅刻しないよう 30 分以上も早く到着し、校内 Wi-Fi をありがたく使いつつ時間をつぶした。 なんか、人多いよな、ここ。 けっこうでかい自動車学校だよな、うん。 などと考えながら、あまり緊張感はなかった。 車はこのへんにとまっていて見ればわかりますからと事前の案内で言っていたが、どこだ? ときょろきょろしたくらいで、結局は、配車券も出したし後は何とかなるだろ、ってな感じで。

さて時間の数分前にチャイムが鳴り人々が移動... ははー、コース内の至る所にとめられている普通車に人々が移動するのだ。 やっぱでかいぞ、ここは。 んで待合室みたいなののかげに隠れていた大型特殊車両を発見! 高さが高い! なお待合室かと思ったらただの物置になっているとのことだった...w

んでまぁ助手席に乗り込み横で見てから交代して自分で運転〜、って流れは噂通りだ。 乗り降りははしごを上り下りする感じだ。 健常者でないと危険を感じると思われる高さだ。 列車から線路に降りる時もこんな感じなのかもと思った。 荷物は座席の後ろに押し込む感じで OK。

バケットの上げ下げの仕方、上げ下げのロック、パーキングブレーキ (パチッと軽い押しボタン式)、セレクトレバーのニュートラルロック、セレクトレバー (F N R の 3 種類)、アクセル、ブレーキ、ハンドル。 ブレーキは右側の他に、左足で踏める位置にもあり、さらにその左に教官用のペダルもあり、右足でブレーキを踏めばそれが全部一斉に動く。 ハンドルにはノブがついていて、それを主に左手で掴んで操作し、右手は方向指示器ぐらいしか使わない。 ハンドルの位置は変化していて、まっすぐに走っていてもいろんな方角を向いている。 方向指示器は車と同じような右レバーだが、オートキャンセルはない。 オートマチックだがクリープ現象はなく、アクセルペダルを離しただけでかなり強力なエンジンブレーキがかかり、停止までする。 ブレーキペダルを踏まないとブレーキランプは光らないらしい。 リバースに入れても音は鳴らない。 変速はなく、エンジンがうわぁぁぁとうなっても 30km/h ぐらいしか出ていない。

ホイールローダーでもっとも特徴的なのは、後輪操舵でも前輪操舵でもなく、ハンドルで 車体の折れ具合を操作する というところだ。 内輪差がないと言われるのはそのためだ。 停車中でもハンドルを回すと折れる動きをするのは、普通の車やバイクと違い、タイヤ以外にも注意を要するということだろうな、とは思ったが、停車中にハンドル操作なんてしないからそんな話はしていない。 んで最初どうしてもハンドルを回し始めるのが遅れた。 だって車もバイクも皆前輪操舵じゃん... 前輪をべたべたに縁石に寄せたら後輪もちゃんと通るから、って言われても、ピンと来ないわけ。 右折はタイミングが難しかったが、2 時限目の先生に、バケットの端がマークの内側を通るようにと説明されて、ちょっと良くなった。 先にバケットが通るから、そこから寄せていったほうがスムーズになるわけだ。

なお 2 時限目の先生、府中の試験場で技能試験を受けたことがあるそうで、何を受けたんですかと聞いたら、いろいろと言っていたが、その中の一つが 大型特殊二種... 激レア免許のひとつだw 大型特殊二種の試験では鋭角コースは無かった気がすると言っていた。 まぁホイールローダーのあの曲がりっぷりなら、鋭角コースがあっても操作に慣れているなら楽勝である... 自分も今日一度だけ普通車二種用の鋭角コースを通らされた。 牽引二種もレアだが、都内のバス路線にそれが必要なのが一応ひとつだけある。 都内じゃなくて日本と言うべきか?w

今日開始の際、路上に出る車が多いから時間が掛かるようだ。 これでも 2 月・3 月のピーク時に比べたら空いている感じみたい。 自分は普通免許取得の時は非公認だったから 3 月でもガラガラだったもんなー!w

2022/10/23 のコメントを読む・書く


24 (月)

%1 げつようび

さっむい日。 気象庁アメダスの府中のデータを見ると、最高気温が 00:02 の 15.9 度になっている。 なおきのうの最高気温は 13:54 に 25.1 度と記録されていて、確かに教習の時ちょっと暖かかったんだよな。 ちなみにホイールローダー教習車は新しめの車両で、普通に会話ができるほど静かな上に冷房も付いていた。

きのうというか今朝の F1 アメリカ GP 決勝。 ラッセルがやらかし気味でサインツは早々にリタイア、残念だなと思っていたら、ボッタスがなんと単独スピンでリタイアでセーフティカー、再開したらアロンソがストロールの動きにやられて宙を舞い、なぜかストロールだけがパーツをばらまいてリタイアして (!!) セーフティカー、アロンソはレースに復帰 (いろいろぶつけていたのによくレースできたな?)、そんな感じでハミルトンが表彰台圏内でペースが良い。 さぁどうなるかなと見ているとフェルスタッペンのピット作業でホイールガンにトラブルがあったようで時間が掛かり、ルクレールが前に出てしまい、ハミルトンの優勝のチャンスが!? という流れになって俄然おもしろくなってきた。 角田もそこそこがんばっていたが、ガスリーにふたをされていた上に、ガスリーのすぐ後でピットインしたんじゃ意味ないだろ... みたいな... フェルスタッペン vs ルクレール、フェルスタッペン vs ハミルトンという、スムーズにいっていたら見られなかったであろう熱いバトルが見られて良かった。 ライコネンが最後に優勝した地でもあるしな、ハミルトンの優勝もあるのか!? と思ったよ。

%2 IO.SYS

PC-98 版 IO.SYS を実装して少しデバッグして一応動くようになっている。 テキスト VRAM 属性のシークレットのビット (ビット 0) は、上に線がついていたのを見て、1 で隠すのかと思ったが、どうも 0 で隠すらしい... なんでこんなビット作ったんだろうな...

DOSBox-X で 1440KiB フォーマットのフロッピーディスクイメージを使って試している。 720KiB はなぜか 1440KiB と同じドライブ指定になって怪しいので使わないことに。 1232KiB は読み込みを試しただけ。

さっさと push しようかとも思ったが、がんばって実装したはずのカレンダー時計の読み取りがなぜか時刻しかうまくいっていないのでまだデバッグが必要だ。 PC-98 用は 1/100 秒部分がないので 0 固定 (JX の TIMDEV.SYS と同じ)、それに年は下 2 桁しかないのでどこかの基準から 100 年しか扱えず、閏年計算も簡単だ。 と思って作った割には全然動いていないんだから笑える。

ディスク BIOS まわりは面倒くさかったが、PC 用のコードと同じレジスター割り当てのまま、追加データをスタック経由で受け取るディスク I/O サブルーチンを書いて、流用部分を多めにした。 セクターサイズは 1232KiB が 1024 バイトの他は 512 バイト固定にした。 面倒だし。

2022/10/24 のコメントを読む・書く


25 (火)

%1 かようび

寒い日。

今日は出社した。

久しぶりにステーキ屋松に寄ったら少し変わっていた。 前は別料金 150 円だったごはんが、おかわりも含め無料になっていて、あと紙エプロンが机の下からご自由にどうぞスタイルになっていた。 しかしそれでも 1000 円でステーキが食えるのだ。 つよい。

%2 IO.SYS

PC-98 用の実装を修正して追加して push した。 日付が出なかったのはオフセットに DI を付け忘れた (変な番地を破壊していた) という見事なバグで、そこは修正して、それからエミュレーターにぶち込む前に、念のため日付の計算ルーチンを簡単にチェックするテストコードを作って試してみたところ、ちゃんと動かないじゃないのw テストコードは単に CLOCK に書き込んでから読み込んで、ちゃんと書き込んだものが出てくるかを、ダミーの ROM BIOS 用ルーチンを用意して繰り返すだけの簡単なもので、CLOCK の入出力に曜日は出てこないので曜日はテストできていないが、RTC にセットする曜日のために 7 で割った余りを求めているところでなぜか商のレジスターを書いてあってひどいことになっていたw

PC-98 のディスク BIOS は 320KiB 用のインターフェイスを見ると少し歴史がわかる感じがする。 古いインターフェイスでは SEEK コマンドや RECALIBRATE は無く、コマンドは上位 4 ビットが 0 になっている。 コマンドコードがフロッピーディスクのコントローラーのコマンド由来と思われるところは同じだが、SEEK が別になっていないのは PC に近い。 そこから 640KiB 対応に移る際に SEEK コマンド等が導入され複雑になったと思われる。 その理由はわからないが 2D ディスクのアクセスのためだったんだろうか?

DOS 2.x では、CHKDSK のソースコードを見る限り、FAT ID (Media ID) は F8H 以上が想定されていたようである。 JX の日本語 DOS のフォーマットの挙動からすると、ビット 0 が 0 だと片面、1 だと両面、ビット 1 が 0 だと 9 セクター/トラック、1 だと 8 セクター/トラック、ビット 2 が 0 だと 2DD (80 シリンダー)、1 だと 2D (40 シリンダー)、という感じで比較的スマートな使われ方をしている。 ところが PC-98 の 1232KiB 2HD フォーマット (1024 バイト/セクター、8 セクター/トラック、77 シリンダー) は FEH を使っていてその理由はよくわからない。 今回 PC-98 用を実装するにあたり 2D の FEH と 2HD の FEH の両方に対応しようとしたため妙な実装になっている。

当時は device/BIOS parameter block を IO.SYS 内に持っていて、FAT ID (Media ID) を元に選択するという構造だった模様である。 市販の MS-DOS 2.x は、1440KiB フォーマットは当時は存在していなかったから対応していない。 実際には FAT の構造は変わらないので、1440KiB フォーマットの parameter block を持つデバイスドライバーを作って組み込めば、ハードウェアが対応しているなら使えたはずである。 その場合起動ドライブにはならないし、別のドライブ文字が割り振られることになるので実用上は不便である。 理屈の上では、1440KiB に対応しない古い PC-98 であっても、回転数を 300rpm にしたドライブ (後に出た回転数切り替えスイッチ付きドライブでも良い?) をつなげば 1440KiB のアクセスが可能だったと思われるが、とにかくその際にデバイスドライバーを作って組み込む作業がいるのでいろいろと敷居が高かったのだろう。

JX は 2DD ドライブだから 2HD のアクセスは不可能だが、2DD でも 512 バイト・9 セクター/トラックのフォーマットを 1024 バイト・5 セクター/トラックとすれば 800KiB フォーマットは実現できたのではないかと思う。 そういうのも、デバイスドライバーを作って組み込めば使えたはず、という話になる。

2022/10/25 のコメントを読む・書く


26 (水)

%1 休暇

晴れ。 寒い日。

ホイールローダーの不思議なクラッチシステムは、HST と言われていて、なんと、油圧モーターでドライブするものらしい。 アクセル離したら止まるのも、エンジンブレーキがやたら強いのも、それが理由らしい。 スピードは出ないが、トリッキーなテクニックがいらなくなり、現場では便利みたいだ。 バケットを動かすのが油圧なのは想像通りだが、中折れ式のステアリング機構も油圧だし、ドライブも油圧とはね。 もし油圧を失ったら、例えエンジンが止まっていなくても完全に立ち往生するんだろうな。

%2 大型特殊教習 3・4 時限目

3 時限目が第一段階みきわめ。 みきわめの時は配車券がユーザー操作では出てこないらしい。 で、なぜか時間になっても教習車が来ていない!? きょろきょろしていたら、別の教官らしき人に「何号車ですか?」って聞かれて、大型特殊は車番がないもんだから「大型特殊です!」って答えるしかなかったw 数分後にやってきた。

んで、検定コースの 2 パターンだというコースをひたすらやった。 ついでなので (?) 方向変換まで入っていた。 検定では S 字もクランクもないらしい... それで二種になっても鋭角もないわけか。 みきわめをクリア。

4 時限目。 ここまで毎回違う教官である。 が、違うんだけど、また牽引二種も大型特殊二種も持っている教官だった。 趣味率高いな?w 法規走行を中心に進めるが検定コースをぐるぐる。 ついでに S 字・鋭角・クランクもまた通ったが、前回に比べればまぁまぁスムーズに通れたかな。 キープレフトに注意しましょうねと言われた。 何か自然と真ん中を走ってしまう... 運転席が真ん中にあるからかも。

1 年ちょっと前までは後輪操舵の車両を使っていたそうで、その時は方向変換で失敗した時の切り返しなどちょっとコツが必要だったらしい。 試験場は中折れ式だったそうでそっちの試験のほうがずっと簡単だったよという雰囲気の話をしていた。 確かに後輪操舵はこれに比べたら難しそう。

二種免許のほうが教えるのが楽かと思ったら全然楽じゃないんだよという話をしていた。 タクシー会社から送り込まれてくるらしく、車が好きでも何でもない、免許取って以来一度も運転していません、みたいな人に二種の教習をしなきゃいけないんだとか... 大変!

普通車の教習車は屋根に黄色いコーンが載っているのが MT で赤いのが AT なんだと教えて頂いた。 MT な教習車が目の前でストールしたらしく、待っていると、ガコガコっと派手に揺れながら発進していった。 あああ。 もうちょっと仕組みを知ればそうはならなそうだけど... まぁ、そういうことをやって覚えていく人もいるよね。

あと高齢者講習の車も走っていた。 止まれのところで別の教習車が来ているのに飛び出しそうになりブレーキを踏まれている様子だった... そういやバイクの教習の時もあったな、合図もあげずにフッと曲がってきた高齢者講習の車...

メーターまわりをきょろきょろすると HI LO というスイッチがあり、たぶんスピードを選ぶんだと思うが、HI のほうになっているからメーターに H と出るんだな。 アクセル全開にすると 30km/h は一応出せる、ぐらいの性能。 ワイパーも前後ありつまみで操作するようだ。 手前に OFF と、点がひとつ・ふたつの選択肢があるつまみがあるのに気づいたが、用途は不明。

他に聞いた話によると、近所で見かける教習車はどうやら仮免許取り立ての人達らしい。 なるほど、車が少なくて比較的走りやすいから、その人達の練習コースに使っているのか。 あと、同じくこのへんでよく見かける、K 王バスで「教習車」のやつ、大型二種の仮免許を取れたら後は自社でやっているらしいみたいな、そんな話をしていたような気がするが、でも仮免許練習中の札はついていなかったよな、確か...

2022/10/26 のコメントを読む・書く


27 (木)

%1 もくようび

晴れ。 朝晩は冷える。

大型特殊の運転免許ってちょっと独特で、技能試験項目が少ない (S 字もクランクもない) し、運転経歴を求められることもない。 それでいて原付と小型特殊の上位ではあり、学科試験に関しては他の四輪等と共通でもある (ので四輪等の後から追加の場合には学科試験や教習がない)。 何となく、意外と試験場での一般受験に適しているような感じがする。 初めての普通免許の技能試験でポイントとなる、S 字、クランク、縦列駐車や、坂道発進もないし、40km/h も出ないし、中折れ式なら内輪差もない。 二輪免許と比べても、方向変換はあるものの、S 字、クランク、坂道発進、それにスラローム、急制動、一本橋がないわけで。

小型特殊だと学科試験のみで、確か特に講習もなく、それで堂々と公道を運転できる。 試験場の大型特殊と同じような中折れ式 (あるいは後輪操舵) の小型特殊車両で練習を積み、非公認の教習所などで大型特殊をちょぴっと練習させてもらえば、スルッと技能試験もいけるのでは? そしてそれで時間が経つとなんと大型免許や二種免許の取得も可能になる... 普通免許持ちの人と同じように教習や試験を受けられる。 大型特殊しか持っていないなんて教習所の教官はいやがると思うが、一応理屈の上ではそういうことになる。

%2 日付の計算

HIDOS/DOS_IO.ASM at 8cbc500aaba6b4b43bd105143036bae9ea8a7f51 - hdk1983/HIDOS - GitHub

DOS 用に 1980-01-01 からの日数との間で変換する日付計算ルーチンを見直して無駄をそぎ落としていったらずいぶん小さくなった。 1980 年から 2099 年までなので閏年計算は 4 年に一度のみ。

日数からの変換ではまず 1401 を足して 1976-03-01 からの日数にした上で、4 年分の日数で割り、商を 4 倍してこれを年のベースとする。 余りを 365 で割ると 0〜4, 4 余り 0 については閏年の 2 月 29 日なので 3 余り 365 に補正した上で、商を年に加えさらに 1976 を加える。 その余り 0〜365 を 5 倍し、2 を加えて 153 で割ると、3 月が 0 で 2 月が 11 となる数字が商となる。 後から 3 を足すのは命令数がもったいないので、2 を加える時に 153 の 3 倍も一緒に足すことで、3 月が 3 で 2 月が 14 になる。 13・14 は翌年の 1 月・2 月として補正し、ここまでで年月は確定する。 んで、その余り 0〜152 を 5 で割って、商に 1 を加えると日になる。

日数への変換ではまず月を 3 月が 0 で 2 月が 11 となるよう補正し、1 月・2 月は前年とする。 で、年から 1976 を引いて、それを 4 で割った商、および、それに 365 を掛けた値を求めて、足す。 これで 1976-03-01 からその年の 3 月 1 日までの日数が出る。 それから補正した月の値に 153 を掛け、2 を加え 5 で割る。 これは 3 月 1 日から月の 1 日までの日数を出している。 レジスターのやりくりがトリッキーで、5 で割る前に日を日数に加える処理が入ったが、まぁそれはどこでやっても良い。 んで最後に、日の 1 を引くのと 1980-01-01 基準にするための 1401 を引いて完了である。

PC-98 版は AAM と AAD を多用するという、サイズ優先でスピード完全無視の強引な実装となった。 AAM と AAD は実質は 8 ビット固定の割り算命令とかけ算命令 (と足し算) であり、8086 にとっては結構実行時間が長い命令だ。 しかし隠し引数で割る数・掛ける数を指定できる上に 2 バイトで済むので、サイズを抑えるにはとても都合がいい。 これを引数を変えて連続で使うことで packed BCD との変換を行うようにした。

さて MS-DOS を作った人の気持ちになるとちょっとおもしろいのだが、なんでシステムコールは年月日なのに CLOCK は 1980-01-01 からの日数を採用したのか? というと、これ、RTC を搭載していなかった IBM PC 等の仕様が念頭にあったのではないだろうか? IBM PC では ROM BIOS によりタイマー割り込みでインクリメントされるカウンターがあり、それが 1 日単位までは管理してくれるので、日付は手動入力 (だが 24 時になれば進む)、時刻はタイマー割り込みで自動的に進む、という世界。 そうすると 1 日進めるという処理を IO.SYS に実装する必要があるので、年月日が別々になっていると計算が面倒くさい。 1980-01-01 からの日数ならばインクリメントするだけで良いので簡単だ。

ところが... その後の PC-98 や JX や PC/AT などの RTC はほぼほぼ決まって BCD で、日数でなく年月日で管理している。 おそらく RTC が一般的な時計か何かに使われる集積回路の恩恵を受けているのだろう。 4 ビットで出てくるあたり、ディジタル時計ならエンコーダーに入れて 7 セグメント液晶にでもつなげばいいわけだし、日付を進める処理にしても 4004 程度の簡単なプロセッサで十分なはず。 まぁ、それで結果として IO.SYS や RTC デバイスドライバーではわざわざ年月日と日数を変換する必要が生じてしまった。 デバイスドライバーで変換をして、システムコールでも逆に変換をするのだ。 控えめに言って無駄でしかない処理をいろんなメーカーで実装する羽目になった。 DOS の仕様がそうなってしまったこと自体が残念だが、ハードウェアも、DOS を念頭に置くなら日数をインクリメントするだけで良かったのにね。 おかげで PC-9821Ap2 みたいに年のインクリメントがされないバグあり RTC まで誕生してしまった... 日本電気もアレだよな、RTC なんぞわざわざ作り替えてバグを仕込むぐらいなら、RTC を単純化して ROM BIOS 側の仕事を増やしてもよかったはずなのに。 Unix 時間並に単純化したカウンターなら、フリップフロップを並べるだけで良くて 4004 すらいらないレベルだろ?

2022/10/27 のコメントを読む・書く


28 (金)

%1 きんようび

晴れ。 寒い日。

テレビでやってた映画『君の名は。』。 2016 年のアニメーション邦画。 映画館で見た映画。 そっかもう 6 年も経ったんだな。 夢から覚めた時のように記憶が失われていく設定がおもしろい。 あっ、2021 年はこの映画の中とは別世界になっていたなw

%2 AAM/AAD

コメントで指摘頂いた通り、V30 (μPD70116) は AAM/AAD の 2 バイト目を無視するという話があるのだった。 V20 (μPD70108) もそうらしいが、PC-98 には 8 ビットバスの V20 は出てこない。 何かで見た記憶はあるんだけど、8086/8088 では使えるのと、今の Intel や AMD の x86 プロセッサでも 16bit や 32bit のコードセグメントであれば利用可能なだけに、うっかりしていた。

んで書き直してみるとどうしても若干長くはなる。 特に PC-98 版は BCD の変換に使ったから使用箇所が多くてどうしたものか。 と思いながら整理していったら、10 バイト程度の追加で収まった。 ポイントは、長くなるならサブルーチン化できるということだ。 元々は 2 命令 4 バイトで済んでいたから CALL 命令で 3 バイトにしても 1 バイトしか稼げなくて、サブルーチン側に RET 命令もあるからメリットがなかったが、もはや 4 バイトでは絶対に済まなくなったので CALL 命令がきいてくる。 よく出てくる直前の命令 (LODS 等) もまとめてサブルーチンに突っ込んでしまって飛び先を微妙に変えてやるテクニックも使える。

MUL/DIV のワードオペランドをメモリーにして 1 バイト稼げないかなと思ったが、いろいろ整理していった結果意味がなくなったw どうしても、immediate オペランドの演算命令はできるだけアキュームレーターに対して使いたいし、immediate オペランドはワードよりバイトにしていたいし、というのがあって、MOV CX,4 みたいなのは気になるんだけど、どうにも削れなかっ... あっ、いや、削れるぞ! 粘ってやってみるもんだなw レジスター BP まで使う羽目になったが、何とかなった。

2022/10/28 のコメントを読む・書く


29 (土)

%1 どようび

テレビドラマ『祈りのカルテ』第 3 話。 産婦人科。 帝王切開と子宮頸がん。

%2 MS-DOS

例の時計の処理、もう小さくならんだろー! と思っていたら、AAA 命令が使えることを発見したw 月を 3 月を 0, 2 月を 11 になるように変換するのに、3 を引いてキャリーがあったら 12 を足す、みたいな処理を書いていたが、AAA 命令なら、キャリーがあったら 6 を足す、を 1 バイトで実現できる。 キャリーがなくても値が 10〜15 でもそうなるんだけど、3 月から 12 月は 0〜9 にぴったり収まるから、AAA 命令を 2 回使えば条件ばっちりで 12 足せる。 条件ジャンプが不要となり、2 バイト削れた上に速くなる。 (条件ジャンプは、昔のプロセッサはジャンプするとプリフェッチキューを飛ばすので遅くなるし、今のプロセッサも分岐予測のデータを汚すので少ないほうがいいはず。 AAA 命令そのものが遅いことには目をつむる。)

あと 5 で割る問題にも AAA 命令が使えた。 月の日を求めるのに 5 で割っているところ。 まず AAM 命令で AL を 10 で割る。 AH に商、AL に余り (0〜9) が来る。 これを ADD AX,AX で 2 倍する。 AH は 10 で割った商の 2 倍、AL は余りが 2 倍されて 0〜18 になる。 そして AAA 命令。 AL が 10〜18 の場合 (16, 18 は補助キャリーフラグによる)、AL (AX) に 6 を足してさらに AH に 1 を足してくれる。 今回の用途では AL はどうでも良くて、AH に 1 を足してくれるのがポイントで、つまり 10 で割った商の 2 倍に、10 で割った余りが 5 以上であれば 1 を足す、ということになるので、なんと 5 で割った商が得られる。

5 で割るのはどうメリットがあったかというと、DIV で使うためにその前に 5 を掛ける時に使った 5 を取っておくためにレジスターを入れ替え、しかもそのレジスターの上位 8 ビットが 0 でないために 16 ビットで 5 を代入、としていたところの、レジスター入れ替えも 16 ビット代入もいらなくなって 2 バイト削れて、DIV とその前の MOV AH,0 を上の AAM 作戦にしてここは 1 バイト追加、つまり全部で 1 バイト削れた!

%3 大型特殊教習 5・6 時限目

5 時限目も 6 時限目もひたすらぐるぐる練習だった。 6 時限目は一応みきわめということになっているような気がするが、配車手続きも普通だったし普通にぐるぐる回った。 教官は 6 時限目に初めて 1 時限目と同じ人になった。 5 人の教官から教習を受けたのである... 右折でハンドル回しすぎだよとのことでそこをかなり意識して走行した。

やっぱり土曜日は教習車が多い。 普通車が 3 台ぐらい続いてきたり、二輪車も 3 台 4 台 (たぶん教官を含む) 続いてきたりして、何かと待つタイミングが多くなる。 検定の際はコース内の車両は少ないのでかえって注意が必要とも。 また、検定の際にコース内を走る普通車の多くは仮免許の人達であり、初めての免許の人が多いわけで、無理しないようにとのご指導。 確かにね。 先に二輪の免許を持っている人などはまだいいが、初めての免許は普通免許が圧倒的に多そうだ。

ちなみに大型特殊をとりにくる人の 7 割は実際に現場作業等で使う人達 (工事現場や、広い土地で農業をされる方々) だと言っていた。 自分は 3 割のほう、多いかどうかはよくわからんw 時間が短く取得費用も安く済むので、多いほうかもね? 教習費用が 30 万を超える大型四輪等を趣味でとる人は少なそうだしな。

6 時限目にその他のスイッチを触らせてもらったw 点が書いてあったつまみは、前照灯だそうだ。 2 段階のオンと、オフというわけだ。 パネルにも照明のスイッチがあるが、これは前方後方などに別の照明があるそうで、現場作業用かも知れない。 操作の位置からしても、公道走行時に使うのはハンドルの右下ぐらいについているつまみのほうだろう。 あと、H と L は予想していた通りスピードの切り替えみたいだ。 L はエンジンブレーキが強く、スピードも遅そうな感じだった。 現場の状況に応じて使うスイッチと思われる。 教習所の教官も案外そのへんのことはあまり知らないというのがおもしろい。

パネル左側は下から H と L のスイッチ、照明のスイッチ、その上はハザードか。 右側には上にパーキングのスイッチがあり、その下に前後のワイパーを制御するつまみがある。 メーターにも何か設定ボタンが付いているがそこは触っていない。 たぶん何かのスピード設定だと思う。

左手レバーがセレクトレバーで F N R であり、その手前に赤いニュートラルロックノブがついていて、N で押し込むと物理的に固定され、引っ張って解除するまで F R に入れられない。 クラクションはハンドルの真ん中についているが、ハンドルもノブを持って操作するからクラクションはかまえていないと押せないと思う。 ハンドル右手部レバーが方向指示器で手動で戻すタイプ。 右手のハンドルから離れた位置、左ハンドル大型車のシフトレバーにでも見えそうなレバーがバケットを操作するレバーである。 前に押すと下がり、後ろに引くと上がる。 また、右に押すと下を向き、左に押すと上を向く。 レバーの横に説明アイコンがあるがいまいちわかりづらい。 レバーの根元にレバーを物理的にロックする短いレバーが付いている。 錠の絵がある。 前に倒すとロック、後ろに倒すと解除である。 そのレバーよりさらに右側に空調のボタンが付いている。 ヒーターは別スイッチになっていて、クーラーは簡単な温度 (数字でなく目盛り) と風量の選択ができるボタンと液晶パネルが付いている。

シートベルトは 2 点式、運転席のものは最初に引っ張った後は戻す方向にしか動かなくなるみたい。 助手席も 2 点式シートベルトだが固定式である。 運転席が真ん中にあり、シートは上下方向にバネが付いていて座ると沈む。 また、普通の車と同じように前後に動かせるが、後ろにはあまり動かないので 170cm ちょっとの身長があるならたぶん適当でいい。 ルームミラーは右上についている。 サンバイザーは大型車みたいな色つきのタイプが真ん中についている。 窓は昔の列車やバスのように左右のつまみを掴んで動かすタイプで、運転席に座ったままで動かすのは大変そう。 踏切の安全確認の際は窓が開いている必要があるとのことで、注意が必要である。

ZW80 前進でL(ロー)後退でH(ハイ)になるスイッチ取付け 日立ホイールローダー - YouTube

動画の中身は関係ないんだがメーターまわりの雰囲気はこんな感じである。 動画で最初に右手で解除しているのがパーキングだ。 これ入れたまま F (たぶん R も) に入れるとピーピーとビープ音が鳴ってうるさいのだw 免許取得後は乗る機会はまずないだろうが、乗ったら懐かしく感じるかもねw 万が一その運転免許が役に立つ機会があるとしても、フォークリフトとかクレーンとかいろいろあるからな。 それにそのへんは公道で走らせるだけならともかく、きちんと活用するには別の資格も必要になるのでまぁまず機会はないだろう...

かめこう 働く車♪納車♪こころ主任登場♪#ホイールローダー#HITACHI#ZW80 - YouTube

こっちの動画のほうがわかりやすいな。 教習車も助手席と教官ブレーキがあるぐらいでまさにこんな感じだ。

2022/10/29 のコメントを読む・書く


30 (日)

%1 にちようび

朝のうちに F1 メキシコ GP の予選をチェック。 今回もフェルスタッペンが圧勝か?

テレビアニメ『うる星やつら』。 3 話。

大型特殊の卒業検定、終わって帰りに弁当屋に寄った時点で 14:00, 帰り着いて SUPER FORMULA の鈴鹿の最終戦を YouTube ライブで観戦 (14:30 からだったので間に合った)。 きのう 2 位でチャンピオンを決めた野尻がチャンピオンらしく圧勝して見せてくれた。 ずっと全開で攻めたらしい。 そんなことを言えるメンタルも、それにこたえてくれるタイヤやマシンも、チームメイトはピット作業でトラブってもこの人はトラブらない運も、2 度目のセーフティカーのタイミングでピットインできた運も、すべてがつよい。 ワンメイクとは思えないほどの違いがある。 セッティングの差なんだろうけど、チーム力というのもあるに違いない。

%2 大型特殊卒業検定

約 3 年前の大型二輪の時以来の自動車学校の卒業検定。 晴れ。

11:40 までに集合すればいいというところ (教習の際はキャンセル待ち対応のため配車手続きを 15 分前までに行うことという制限があったが検定には無し)、20 分ぐらい早く着いて、余裕じゃーんと思っていたらさっそく検定員から声を掛けられて説明が。 今日の大型特殊の検定は 1 人だけ! ふむふむ。 それで、その検定員は別の普通仮免許の検定も行うそうで、そちらに同乗してほしいとのこと。 なるほどね! もろもろの説明はまぁ二輪の時とも大きくは変わらない、いや、大型特殊は踏切と方向変換しかないから説明が簡単だ。 脱輪は乗り越えずに後退して戻れっていうのを聞いて、仮免許の 2 回目の技能試験で脱輪したなぁ! っていうのを思い出したww

教習の 4 時限目が 11:55 まであり、そこまで待機、それから移動。 カローラハイブリッドの後部座席右側に乗車。 検定員が説明をしている。 もうひとりの検定の際に同乗するよう言われたと思うけど、車種が違って乗れないので、検定後は 2 階の待合室で待機してください、的な。 サクサクと説明をしているが、自分が免許持ちであること、ほぼバレているよな?w プレッシャーにならなきゃいいけどな、と思いながら、検定員の運転でスタート地点まで移動し、その後の若いお兄さんの検定を眺めていた。 ちょっと慎重すぎやしないか、と思ったけど直線は指示の 30km/h 出していたし、S 字とクランクがおそるおそるなのは自分もだったのでまぁそんなものかも知れない。 右折の巻き込み確認しないな? とは思った。 自分は最初がトミンドライビングスクールだったせいか、右折でも確認するのが当たり前になっている。 っていうかバイクでは右折時もやったよな、確か。

それから自分の検定がスタート。 コース 2。 窓は最初から開けてあった。 まっすぐスタート、突き当たり一時停止で左折、外周 1 周、それから左折、信号を右折、左折、一時停止を右折して反対向きに外周半周、右折して踏切、突き当たり右折 (別の検定車がいたが自分の左の S 字に入る車だったようで譲られた)、すぐまた右折して左折で方向変換 (右向き後退、左折出発)、左折、右折で外周 8 割回って右折で発着点。 メリハリを付けて、直線ではアクセルべた踏み、スピードメーターは見なかったw 方向変換から出てきたところの見通しの悪い交差点で、いこうとしてアクセルを踏んだところでバイクが見えたのであわててとまったのが何か言われるかなと思った。 まぁ、妨害はしていない。 仮免許と違って課題は少ないし、サクサクと完了。 そうそう、大型特殊、キーをオフにしても方向指示器がつくんだよね。 理由は知らない。

んで待合室へ。 仮免許の人達とは別の待合室で、どうも二輪の人達が集まっているらしい。 やらかしたー、っておじさんがいて、一本橋か波状路か何かだろうか、ギヤが 1 速になっていないのに気づかず、もう少しのところでエンジンストールさせてしまったらしい。 確かストールはだめだよね、と話していた。 ギヤが入らないこと、あるんだよな。 自分も普通二輪の卒業検定の時に 1 速にしたつもりがニュートラルというのをやらかしている。 大型二輪の時にもあったみたいだな。 教習中は一度もなかったそんなことがなぜか起きるんだよな。

さて二輪の人もけっこう多かったので待ち時間が長い。 10 分ぐらいした頃だろうか、先ほどの検定員がやってきて名前を呼ばれて、廊下に出るとそこで合格を伝えられた。 待合室がなんかぴりぴりしていますね? って笑顔で言いながら合格を伝える検定員おもしろいw みんな合否がわかるまでハラハラドキドキでしょ。 自分のは、安全確認もしっかりしていてよかったという。 ヨシ。 なんか、トミンドライビングスクールで教えてもらった技能試験を乗り切るテクニックが無駄に生きている気がする。 んで、二輪の人達が多いのでもう少し時間が掛かるとのこと。 二輪の人達と一緒に卒業証書の受け取り等があるらしい。

つまり、まだ合否がわかっていない二輪の人達と同じ待合室に戻って待つのであるw すぐ外の廊下で伝えられたから自分が合格なの絶対みんな聞こえていたと思うw 何か微妙な雰囲気のままさらに待つこと 10 分ほど、やっと二輪の検定員 2 人が別々にやってきて合否が伝えられていた。 んでアンケートとか書類受け取りとか説明とかあって終了。 その辺は二輪の時の自動車学校とも同じだが、あのアンケート、検定日と大型特殊って書いたら、ひとりしかいなかったんだからもう個人特定可能だろう...w

二輪で合格した人にも慎重に行った人がいたようで、合否発表の際に、加速不良を取るほどではなかったけど、もうちょっと... という話をしているのが聞こえていた。 メリハリを付けて走るというのも、トミンドライビングスクールで教えてもらった技能試験を乗り切るテクニックのひとつだ。 たぶんそのおかげで自分は二輪の時にも自然とメリハリを付けて走っていたのだ。 今回久しぶりに仮免許の同乗をしていて思ったけど、苦手なところをゆっくり行くのは仕方ないとしても、直線でもたもたするのは心証が悪い。 試験場・免許センターの技能試験も合格基準は基本的には同じはずだけど、そういうところを厳しめに見ているというのはあるんだろうな。 路上で仮免許練習中の皆さんが、左折で信じられないほど小回りできていないのに遭遇することもあるけど、そういう基準の差が出るのかな。

%3 MS-DOS

もう時計の話はいいと思うので、そろそろ MSVER じゃないビルドとか KANJI を有効にしたビルドとかができるようにしたいなと思っている。 メモリー不足対策のために自作のプリプロセッサを通して使っているので、そのプリプロセッサで強引に設定を上書きしてスイッチを切り替えてしまえるようにすれば、いろんなビルドがしやすくなって便利になるかな。

予想としては IBM 版はビルドできたら PC 互換機や QEMU 上で普通に動かせるんじゃないかと思う。 IBMJAPVER は DEBUG コマンドに特殊な実装が入っていてたぶん使えない。 パリティが云々というもの、ポート A0H を読み出してビット 1 を OR した上で捨てる謎のコードが実装されているが、JX ではビット 5〜7 しか使わないので JX 用ではない。 想像では時期等を考えればこれは 5550 用ではないかなと。 なので基本的には使えないと思う。 COMMAND.COM の TIME 等の時刻表示で小数点以下を出力しない改造も IBMJAPAN の場合だけあって、これは JX の日本語 DOS にも適用されているようである。

2022/10/30 のコメントを読む・書く


31 (月)

%1 げつようび

朝 5:00 スタートの F1 メキシコ GP を 30 分遅れぐらいで DAZN で観戦。 結果的には予想通りのフェルスタッペン圧勝。 解説ではメルセデスのタイヤ戦略が外れたのではというようなことを言っていたが、正直メルセデスのほうがタイヤに厳しいんだろうと自分は思っていて、メルセデスがレッドブルと同じ戦略だったならもっと早くに離されていただろうし、逆にレッドブルがメルセデスと同じ戦略だったとしてもやっぱりフェルスタッペンは前にいただろうなと。 ミハエルシューマッハがメルセデスで走った 3 年間を思い出すような、いやあれほどではないんだけど、タイヤに厳しい特性が今年は出ているように感じる。

んで眠かったのでもう一度寝直して 9 時過ぎまでゴロゴロしていた。

%2 ラーメン

東京ラーメンフェスタ 2022 なるものが開催されているとのことで、まぁ何って、同級生がやっている店がまた出店をするんだけれども、それはあさってからの第 2 幕。 何となく眺めていたら、明日までの第 1 幕にある宮崎ラーメンが美味そうに見えてきたので行ってみることにした。 明日は 18:00 までだから仕事終わりでは間に合わない。 今日行くしかない。

そんなわけで在宅勤務後スクーターで go。 以前「東京ラーメンショー」だった時に何度か行った駒沢オリンピック公園だから、道はわかるだろと一切地図をチェックせずに出発。 二子玉川駅方面へ向かっていたがそっち方面に曲がる右折帯に大行列ができていたため方針変更、環八通りに出る作戦に。 確かあのへんだから国道 246 号はこえるはず... その先どこで左折だったか... と思いながら走っていたら「駒沢通り」の案内板、これだ、と思ってそこで曲がったら正解! しばらく行っていなかった割には記憶にあるものだな。

宮崎 らーめん椛というお店の宮崎ラーメン。 豚骨は豚骨だが醤油っぽさを感じる濃ゆいスープで、んまぁまずくはなかったけど、東京のラーメンにありがちなメンマも入っていて好みとはちょっと違ったなぁという感じだった。 もしかしたら東京の人向けに調整されているのかも知れないけどね。

帰りは国道 246 号で川を渡ってから側道で右折、その先南武線の北側を通って登戸駅の近くに出るのが早いらしいとの Google Maps 情報を信じて走っていったものの、曲がるところを間違えて住宅地に迷い込み、地図を再確認する羽目になったw 平日夜のこの時間は大通りも比較的流れがいいもんだから、単純に裏道を選べば早いってわけでもなくて、なかなか難しいんだよな、混雑回避ルートが。

前回行った時はスクーターだったっけなぁー、違ったような気がするなぁ、って考えていたんだが、2017 年に行ったのが最後だったようなので、やっぱりスクーターは今回が初めてなんだな。 片道 20km ぐらいなら楽々行けてしまうし、道に迷っても引き返すのも簡単という、100cc スクーターの利便性の高さよ...

2022/10/31 のコメントを読む・書く


prev, this, next

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

トップ / 日記索引 / 日記 (2022 年 10 月)

Hideki EIRAKU