/var/log/hdk.log

2022 年 9 月中旬

prev, this, next


10 (土)

%1 どようび

晴れ。 のんびり。

西九州新幹線の開業が近づいてきたとのことでニュースが増えている。 武雄温泉駅と長崎駅の間が約 66km で、最速 23 分らしい。 鹿児島中央駅と出水駅の間が 78.8km で 24 分なのと比べると、ずいぶん遅いなと思ったが、駅数が多いみたいだ。 あらためて地図を見ると、鳥栖駅ってところから西に向かって長崎本線が始まっている。 一駅で、新鳥栖駅という、今の九州新幹線鹿児島ルートの駅がある。 佐賀駅までは何駅かあるようだ。 佐賀駅を過ぎて少し行くと唐津線という路線との分岐がある。 唐津線は北部の海岸のほうまで出る路線だ。 長崎本線をさらに進めば数駅で武雄温泉駅... ではない、これはまた別の路線に分岐していて佐世保線という路線の駅だ。 西九州新幹線は武雄温泉駅からだから、長崎本線から佐世保線に乗り入れる列車を多く通すんだろう。 長崎本線は鹿島市というところに向かって南下し始めて、その後は海沿いを走って諫早市というところに行くようだ。

そんな感じで意外と路線が多いんだなというところ、以前使ったことがある佐賀県の駅は、鹿児島本線のけやき台駅で、佐賀県の端っこである。 博多駅からそこまで鹿児島本線で行って、途中下車して、乗り直して久留米駅まで鹿児島本線で行って、新幹線に乗った。 んで地図を見れば新鳥栖駅があるわけだ。 あれ? あの時ひょっとして久留米駅まで行かなくても良かった??

かというと、そうではない。 鳥栖駅から新鳥栖駅までは長崎本線であって鹿児島本線ではないため、新幹線の博多駅から久留米駅間を途中経路に含む乗車券を持っていても、使えないようだ。 別途鳥栖駅から新鳥栖駅までの乗車券を買った場合は新鳥栖駅に行けるだろうが、その場合、新幹線の博多駅から久留米駅間の経路を鳥栖駅まで消化したものを新鳥栖駅から使えるんだろうか? という疑問はある。 答えはよくわからない。 鹿児島本線で久留米駅まで行ったこと自体は全く問題なさそうだ。

んでまぁ地図を見れば西九州新幹線が佐賀県にメリットがなさすぎるというのもわかる。 鉄道網で見れば、鹿児島本線の鳥栖駅からわかれる長崎本線が佐賀県と長崎県の県庁所在地を通るメインルート。 佐賀県からすれば在来線の長崎本線を残せ & 金は出さねぇよってところか。

MASM の自作プリプロセッサ改造... いろいろ考えて、作って、試して... 定義をまるごととっておき、必要になったらその場で出す、これは EQUSTRUC について適用可能。 name STRUC の使い方として SIZE name というのがあるらしい。 シンボル名解決だから OK OK と思って書いていると、EQU の右辺にそれがあって、使ってもいないのに無駄に STRUC が出てしまう事案。 それで EQU はすべてとっておくにしたら TRUE FALSE みたいなのまで対象になってあんまりだ。 どこかに短縮対象シンボルが含まれる場合に限りとっておくとした。 しかし行まるごととっておくのはメモリーが厳しい。 簡易的にスペース除去の実装を入れて対処。 今度こそ OK と思って試していたら、なんと STRUC の中に別の STRUC のサイズを使うものがあった... それを STRUC の中に STRUC を出してしまったから MASM がエラーを出した。 そりゃそうだ。 ウーン! 大変だねこれは! いきなりアセンブリ言語で書いていなくてよかった。 C なのでいろいろと対処はしやすい。

%2 MS-DOS

昔の某ぷ... 市販ゲームをなんとフロッピーディスクじゃなくてファイル単位でしか持っていなかったらしく、まぁいいかと動かそうとしたらメモリー不足だと。 本来 MEGDOS だからな、DOS 6.2 はデカすぎか。 探すと某一... 市販ワードプロセッサのフロッピーディスクのイメージがあって MS-DOS 2.11 だ。 懐かしの MS.COM コマンドで見るとメモリーの空きはかなりある。 ふむふむ、とフロッピーディスクイメージにファイルを入れようとしたら入りきらない。 MEGDOS ってめっちゃ小さかったらしい。

あと DOS 6.2 は 1440KiB フロッピーディスクに対応しているが 2.11 では無理そうだ。 フーン... MEGDOS を無理やり起動できたらそれはそれでおもしろいんだがブートローダーを手作りしないと無理だな。

昔の DOS のブートローダーって IO.SYS やらを連続セクターに入れていないと動いてくれなくて、それを FAT を見て非連続でも動くようにしようという無茶な試みを一時期やったことがあったような気がする。 まぁ無茶っていうかいつ頃からか公式に実現していたような気もするんだけど。 今考えれば IO.SYS の先頭に何か必要情報を置いておいて連携して続きを読むぐらいで良かった気がするし、PC-98 で主流だった 1232KiB フォーマットなら 1024 バイト/セクターだったから最初から余裕があったはずではある。

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


11 (日)

%1 にちようび

昼はやや暑かったが涼しい日。 のんびり。

GNU Emacs のフォント設定、"Noto Sans Mono CJK JP" に変えた。 デフォルトで選択されるフォントではなぜか漢字が中国語か韓国語の形になっていた。 あんまり X11 で使わないから気にしていなかったけど、たまに X11 でも使うのでなおしておこうと。 なんでデフォルトがそうなるのかは知らない。 他のアプリケーションでは大丈夫なのにな。

F1 イタリア GP の週末。 DAZN まだ見られるんだけど、おかしいな、2 週前に買った povo トッピング (1 週間) だぞ? 1 日 2 日は誤差かと思ったが、1 週間はさすがに...

%2 例のプリプロセッサ

ずっと作っていたのは EQU やら STRUC やらの定義をためておき、必要になった時点で放出するというもの。 そのため IF で囲まれたブロック内にあったら困るから無視するとか、STRUC の中に STRUC を出してしまわないようにするとか、いろいろと対策が必要だった。 さらには EQU の右辺に $ (現在のアドレス) を入れているケースがあり ($ はシンボル名の文字として使えるが、1 文字だけの $ シンボルが特別扱いで現在のアドレスになっているよう)、それも場所が変わったら困るので、無視するようにして。 それでいい感じだなと片っ端からファイルを入力して試していたら、FORMAT.ASM で引っ掛かった。 なんと、EQU の定義が使っているところより後ろにある...

こうなると未知のシンボルをかき集めて把握するか、あるいは 2 pass にするかだ。 まぁ 2 pass のほうが話としてはシンプル。 IF 無視も $ 無視もいらなくなり、参照されていない不要な定義の除去だけすればいい。 というわけで書き直し始めたら 3 pass になったんだけど、まぁいいか。

%3 MS-DOS

ALTOS ACS-86C 用のコードなら公開されている分でビルドできるのかと思っていたけど、IO.ASM が不足している。 これにはシステムコールの 1〜12 の実装が必要らしい。 10 だけは STRIN.ASM に実装があり、これを INCLUDE する形で他のシステムコールを実装して IO.ASM を完成させないといけないのか。 まぁ面倒そうなのはなさそうには見えるけど。 バージョン 1.25 のほうには IO.ASM があるけど、これは全然実装が違っていそうだなぁ。

んでもそういえばどうやって実装するんだ? リダイレクトができるってことはファイル I/O を使う? でも 1〜12 ってデバイスドライバーからでも使えるんだか何かじゃなかったっけか。 スタックの消費量が少ない的な、そんなような話があったような... お、6 の実装もあるな。 RAW_CON_IO ってなっている。 7 の RAW_CON_INPUT もある。 このへんを参考にして実装するのか。

いまいち DOS のデバイスドライバーの作りがわかっていないんだけど、CON デバイスの実装 (SKELIO.ASM) を見る限り、単に BIOS を呼び出している風に見える。 CON の読み取り (COPY CON 等) で行編集機能が使えるのは何つながりだ? って探すと DISK.ASM の中で STRIN.ASM にあるルーチンを呼び出す部分がある。 DEV.ASM から LOAD ってので来るのかなー、いや、これはファイル I/O 用だな? 意味わからん!w DISK.ASM にキャラクターデバイスの実装入れるの何とも思わなかったんだろうかw

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


12 (月)

%1 夏休み 1 日目

泌尿器科。 土曜日よりこんでいた気がする。 今日は残尿少なかった。

1 か月以上ぶりぐらいに原付を動かしたんだが、エンジンは一発始動で好調だった。 やっぱりたまにフューエルワンを投入するぐらいがちょうどいいのかな、これには。 バッテリーもまだ無事なよう...

車もそろそろバッテリーがやばいなと思って動かした。 始動直後に 11.4V 台の激やば電圧が見えた気がするがちゃんと小一時間走行したから大丈夫に違いない。 久しぶりにイオンモールに行った。 5 年ぐらい行っていなかったんじゃね? と思ったが実際 4 年半以上前に行ったのが最後かも知れない。 調布にイオンシネマができたので行く機会が本当になくなった。 それ以上にここ 2 年はパンデミックの影響で無駄に寄り道しなくなったのも大きいが。 で、たまに行くと楽しい。 うっかり絵文字クッションを買ってしまったw

久しぶりだったので途中の景色も新鮮だった。 昭和記念公園の近くの道が太くなって南北に突き抜けたのは知っていたが、その道に沿ってドラッグストアやマンションか何かがぽこぽこと生えていた。 それでも半分は何もない感じだけど、以前とはだいぶ景色が違う。 それから... イオンモール。 テナントに「ガチャガチャの森」なるカプセルトイ専門店が入っていて、明らかに前はこんなのなかったなという感じが。 ゲームコーナーは今やクレーンゲームや類似の景品ものが大部分を埋め尽くし、その他のゲームを追いやっている感じ。 他にも以前と違うテナントがあるような気もするが、ここに来ていたのは映画を見に来ることが多かったから、あまりわからない。

%2 きのうの F1

イタリア GP。 フェルスタッペンが異次元の速さで優勝。 チームメイトのペレスと比べてもまさに異次元の速さで最後尾からでも勝っていたんじゃないのかなこの人。 フェラーリは地元で精一杯対抗した感じだったがルクレール 2 位。 セーフティカーのまま終了となってしまったが、そうならなくてもルクレールが優勝できる余地はなかったように見えた。 終盤のソフトタイヤのルクレールがタイム差をほとんど詰められなかったからねぇ。

アルボンが虫垂炎のため欠場となり、代役の新人デ・フリースが注目だった。 新人といってももう 27 歳なのだが、2019 F2 チャンピオン、さらには 2020-2021 シーズンのフォーミュラ E チャンピオンだそうで実績十分。 なんと予選からチームメイトを上回り、決勝ではポイント獲得。 直線がやたら速い今年のウィリアムズのマシンには、この人は今年スペイン GP の free practice で一度乗っただけのはずだが、今回の free practice 3 から乗ってこの結果とは... (今回の free practice 1 ではアストンマーチンをドライブしたそうなんだけど、マシン特性全然違うだろうからなぁ...) 新人にも負けるラティフィの遅さが際だってしまっている。

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


13 (火)

%1 夏休み 2 日目

平日 4 時台の高速はトラックだらけであり、平日 5 時台の空港はガラガラであった。 少し雨が降った。

初パッソ。 コンパクトカーとして 20 年前レベルの品質を感じる。 サイズも初代ヴィッツ並みだし。 特にステアリングの手応えがないのは何と言ったらいいんだろう... 軽すぎるというより、どこかに緩みがあるんじゃないのと言いたくなるほど、タイヤからの情報が届かない。 ゲーム機みたいな感覚だ。 トヨタが iQ の頃からとてもしっとりとしたステアリングの操作性を実現していたのとは大違いだ。 パッソもブランドはトヨタだけど。 ヤリスとは比較にならないし、2 代目スイフトだって電動パワーステアリングの違和感はあったものの、こんなひどさはなかったな。

MASM のプリプロセッサを MASM で書こうとしている件は、バージョン 1.10 の難しさもあって、プリプロセッサのプリプロセッサがほしくなって、文法を考えていた。 MASM に @@: @F みたいな表記が導入されたのは画期的だったし、GNU as だって 1: 1f みたいなのがあるわけで、それが何もない時代のアセンブリ言語は label の名前付けがかなり大変である。 それと一時変数や引数用のスタック参照、さらには if while などの構造も書き間違えそうになるわけで、そのへんの補助がほしい。 昔 PASM っていうのがあったが根本的なアイディアとしては同じだな。 演算子まで処理する気はないのと、解釈が簡単な文法にしたいくらいで。 まぁマクロでもそこそこ凝ったことができるはずだけどね。

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


14 (水)

%1 夏休み 3 日目

同級生の店でランチ。 たまには違うのをとてんこ盛り丼メニューの小盛版を頼んでみたものの量的には BIG 丼普通盛りみたいなもので、食べ過ぎて気持ち悪くなってしまったがそれは宿便の影響もあったか。

図書館に少し寄った。

Mugiuda Base っていうところの電動レンタルカート。 先月オープンしたばかりらしい。 カートといっても普通のフレームとは別物で、たぶんホイールベースが短いし駆動軸の幅も狭い。 最高速 37km/h 版はタイヤが減りすぎたらしく一時休止中。 28km/h 版だったかな、走らせてみるとおそろしく不安定で最初はこわかったがなれるとアクセル全開で周回できた。 S 字区間の切り返しでふらつくしひっくり返りそうな感覚になるが大丈夫だw アクセルオフでもある程度減速できる。 ブレーキも感触としては完全に電気仕様のようだ。 停止してブレーキ 2 回踏み込むと後退もできるらしい。 ふらつきっぷりからするともしかして駆動軸は直結でなくディファレンシャルが組み込まれているだろうか?

パッソはコストダウンを隠さない感じの車だ。 スマートキーにはなっているがドアに解錠・施錠用のボタンがついているタイプで、解錠したか施錠したかはハザードランプの点滅回数を見て判断するしかないようだ。 室内灯のスイッチが ON/OFF だけかと思ったらドア連動と OFF だけのようでつまり走行中に ON にできないっぽい。 方向指示器はダイハツお得意の中立位置に戻る使いにくい電子スイッチで、これも自動解除をソフトウェアでするためのコストダウン策であろう。 レーン逸脱警告など一応ついているみたいだったが右側のスタートストップボタンの下あたりにごちゃっとスイッチが並べられているだけでわかりにくい。 さらにはフォグランプのスイッチっぽいのもあったのにフォグランプはそもそも装備していなかったんじゃないかな? メーターにはタコメーターがないのは当然で、平均燃費はあるのに瞬間燃費がない。 ヤリスより軽いのか加速はそこそこな感じもしたが、ヤリスは明らかに 1.5L をつめる余裕のあるボディに 1.0L だったから遅く感じたのかも知れない。 燃費はエアコンの影響が大きいのか 17km/l いかない感じで悪そうだ。 アイドリングストップは再始動はそこそこ速いが、ブレーキをわずかに踏み込んだり緩めたりするだけで再始動する感じ。 エアコンの関係で再始動した時はブレーキを緩めていないのに少し前進しだして、ブレーキをもうちょっと踏み込んでいる時じゃないとエンジン停止しちゃだめなのでは...? 一時停止等でエンジン停止してほしくない時にマツダみたいにブレーキを強く踏み込まないという手が有効でないため、セレクトレバーを N か S に入れておく必要がありそう。

とまぁパッソのいまいちなところが目立つのは 3 月にヤリスに乗ったせいだ。 ヤリスは iQ 同様まともに設計されている感じだが、パッソは街乗り用だからこんなのでいいよねという雰囲気を至る所から感じる。 まぁ、そうね、自分が大型二輪と小型スクーターを持っているように、でかい車を持っている人の 2 台目用としては売れるのかも知れない。 軽ターボくらいのパワーはあって軽ターボ車より安くてちょっと広い、みたいな、そんな感じじゃないだろうか。

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


15 (木)

%1 夏休み 4 日目

朝の溝辺はパラッと雨が降ったりやんだり。 飛行機は揺れも少なく東京着。 おとといの宮崎上空あたり (たぶん) のほうが揺れた。 駐車料金 4500 円強を支払い、案内板を頼りに一般道で帰宅。

東京国際空港の駐車場を出て、環八通りの案内に沿って来たつもりがなんかぐるぐる回らされたような... 駐車場の周回道路から一発では出られないのかな、あそこ。 それから環八通りが途中で渋滞するだろうと見込んで、適当に川崎方面に出てみようと思っていたところ、第一京浜というところで出てみたら、けっこうこんでいてなかなか国道 246 号線までたどり着かなかった。 2 時間ぐらいは掛かった。

車のバッテリーはだいぶ弱っているだろうに車の充電制御は容赦なく機能しており、もしやと思ってスタートストップシステムをオンにしたらちゃんとエンジン停止もしていた。 再始動の時にコンピューターが電圧降下を見ているだろうから、それでエンジン停止しなくなるかなと思っていたが、そうでもなかった。 南武線を越えるぐらいまでオンのまま来て、そこから先はまたオフにした。

%2 朝一便

今回は朝一便の飛行機を使っての 2 泊 3 日の帰省、実質 2 日だった。 ANA/SNA で東京発が 6:45, 鹿児島発が 7:15。

5 時台の東京国際空港はさすがに空いていて快適。 P4 駐車場もどのフロアも空車の表示。 空港の店はコンビニぐらいしか開いていない。 ラウンジでさえも 6:00 オープンで、実質 15 分ぐらいしかいられないから、使うまでもないかという感じだった。 到着した時の 8:30 過ぎの鹿児島空港は出発の人達がそこそこいる感じ。

6 時台の鹿児島空港も空いていたが、店は山形屋なども 6:30 頃には開けていたのだろうか、おみやげなどにも比較的アクセスしやすい感じになっていた。 到着した時の 9:00 前ぐらいの東京国際空港はやはりそれなりに人がいる感じ。

パンデミックになってからやっているこの空港駐車場利用の弾丸帰省 (?) も 4 回目になるが、朝一便は空いているという点では一番快適。 空港や機内でマスクすらまともに付けられない頭のおかしい大人はどこにでもいるので避けられないけど、純粋に人が少ないのがうれしい。 保安検査場はオープンしているレーンが少なくてアレだけど、それでも人が少ないし。 レンタカーの返却が前日になってしまうのが面倒とか、宿泊施設の選択肢がほぼないとか、そういうのはある。 ちなみに往復の飛行機とホテル 2 泊 3 日を楽天のパック旅行で手配して 29,900 円 (クーポン 500 円分の値引き後) だった。 2 年前はこの不人気な朝イチの便は欠航になっていて予約もできなかったが、今はこの繁忙期でない平日でも普通に運行されているのでありがたい。

えっ、PCR 検査を受けたかって? 去年の 4 月以降一度もないね!

%3 MASM

アセンブリ言語のプログラムを書きやすくするためのプリプロセッサをアセンブリ言語で作った。 できるだけ実装を手抜きできるような文法として、めちゃくちゃ手抜きして書いたので用途は限られている。 PROC 定義:

{(PROC(NAME))
...
}

これで ENDP まで自動。 cdecl の引数参照:

{(ARG(ARG1,ARG2))
...
}

これで PUSH BP MOV BP,SP POP BP が投入される他、%ARG1% %ARG2% がそれぞれ [BP+4] [BP+6] に置き換えられる。 (数字部分は固定桁数 16 進数になる。) ローカル変数:

{(LOCAL(I,J))
...
}

これで SUB SP,...MOV SP,BP が投入される他、%I% %J% がそれぞれ [BP-2] [BP-4] に置き換えられる。 (数字部分は固定桁数 16 進数になる。) Label の自動割り当て:

{((FOO,BAR))
...
}

これで %FOO%%BAR% が連番ベースの label 名に置き換えられる。 置き換えるだけなので %FOO%: のようにして好きなところで使う。 ブロックを抜ければ名前が無効になり、同じ名前を再利用できるのがポイント。 Label の自動割り当ての登録:

{(HOGE(FOO,BAR))}

これが一番悩んだ機能だったが削りに削ってこうなった。 こうしておくと {((FOO,BAR)) の代わりに {(HOGE) と書けるよ、という代物だ。 何を目指しているかというと、例えば以下のような IF 文の記述:

{(IF(THEN,ELSE,ENDIF))}
{(IF)
 CMP AX,1
 JE %THEN%
 CMP AX,2
 JNE %ELSE%
%THEN%:
 ...
 JMP %ENDIF%
%ELSE%:
 ...
%ENDIF%:
}

みたいなのを定型文として使えたらいいなという発想。 めちゃくちゃ簡易的なんだが結構使いやすくなるんじゃないかな。

MASM Version 1.10 はめっちゃ古いのにリスト出力機能なるものがついていて、どのアドレスにどの命令が割り当てられたか見えるようになっている。 何に使うかって言ったらこれをデバッグに使っていたんだな。 SYMDEB はシンボルを扱えたが DEBUG.COM は扱えなかったから、これを印刷して見ながらデバッグしていたんだろう。 ここまで実行、とか、この変数の中身を確認、とか、そういうのを手作業でアドレスに変換してやっていたわけだ。 自分はこれを印刷した記憶はないが、今は現代的に DOS をウインドウの中で動かしながらリストファイルを別のウインドウに出して作業すると案外便利だった。

MASM は 2 pass 仕様で、手前で定義されたシンボルはすぐに解決できるが後ろで定義される未知のシンボルはメモリーを想定して展開されている模様。 最終的にそれが定数だった場合 1 バイト余り、そこには NOP が入る。 JMP も同様で、手前については SHORT が自動的に適用されるが後ろは結果として短かったなら NOP になる。

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


16 (金)

%1 夏休み 5 日目

晴れ。 のんびりゴロゴロ。

パッソのエンジンは 1KR-FE で、型式的には iQ の 1L モデルやヤリスに積まれているものも同じだ。 しかしいろいろとマイナーチェンジがあるようだ。 ヤリスはスタートストップ機能が廃止されているが燃費はよく、パッソともさらに違うものなのかも知れない。 借りたパッソは平成 31 年 4 月登録だった。

テレビでやってた映画『マスク』(原題: The Mask)。 1994 年のアメリカ映画。 ヒロイン役はキャメロン・ディアス。 美人。

%2 MS-DOS

GitHub - hdk1983/HIDOS

とりあえずいろいろビルドできるようになったので GitHub においてみた。 プリプロセッサが 1 バイト単位の入力をするので DOSBox では非常に遅く、QEMU+FreeDOS でもちょっとファイルが大きいと 1 秒前後の時間が掛かる。

COMMAND.COM が既存の MS-DOS 上でも動かなくて残念な思いをしているが、調べてみるとひとつは international support がある DOS でないと NULL ポインター呼び出しになってしまうようだということと (case map routine を使うため)、もうひとつは環境変数 COMSPEC をあてにして自分自身をオープンして読み込む処理があるようで、それが別の COMMAND.COM になっているとだめなようだ。 しかし、それをクリアしても EXEC failure になるなどの不可思議事象が起きていてなんだろうなこれ。 内蔵コマンド系はちゃんと動いていそう。

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


17 (土)

%1 どようび

のんびりゴロゴロ。 夕方まで晴れていたと思う。

%2 MS-DOS ハック

さて。 COMMAND.COM は IBM DOS (PC DOS) で試すと EXEC failure になる疑惑。 NEC の MS-DOS バージョン 2.11 上であれば問題なく動いているみたい。 今回 MSVER でビルドしており、ソースコードにあった IF IBM が影響しているんだな。 なんか知らないけどいろいろと IBM 版は実装が違うみたいなんだよな。 NEC 版は COMMAND.COM を差し替えての起動もでき、英語バージョンだが日付等の国別設定は反映されている。

COMMAND.COM ではまだおもしろみがないので、次は MSDOS.SYS にチャレンジした。 問題はシステムコールの 1〜12 で、うち 6, 7, 11 は実装があるので残りを自分で作る。 他に不足するのが BUFOUT, OUTTAB の 3 つ。 それぞれ caller を見て入出力仕様を推測して実装するしかない。 まぁこの 3 つは幸いどれも簡単な文字出力のようで、制御文字を ^A スタイルにして出力するもの、単に 1 バイト出力するものと、タブ文字を出力するもののようだ。 システムコールも見よう見まねで実装し、^C のチェックをどうするのかと思ったら STATCHK というのがエクスポートされているのにどこからも参照されていないことが発覚したので、それを適当に呼び出すように書いた。

で、それを NEC の MSDOS.SYS と差し替えて起動すると、画面がぐしゃっとなって... さすがにだめか... でも、ソースコードがあるんだ! まずもって自分が書いたあたりが怪しいのは間違いないわけだが、軽く追うと起動時のメッセージを出すところがあるらしい。 ...というかまだ IBM 定義になっているのを変え忘れていたのが発覚したので修正した。 それでメッセージ出力の前後に無限ループを仕込んで起動して、メッセージが出ないところからスタート、いろいろ見ていくとアレだな、レジスターの保存が足りていない感じがしてきた。 いくつか加えると起動はしたが、COMMAND.COM にコマンドを入れるとハング。 わざと SHELL を DEBUG.COM に変えて、システムコールを試そうとしたが、どんなコマンドを入力しても完全に無視されるw 行入力ルーチンを確認したらこれもまたレジスターか。 レジスターの保存をさらに増やして、COMMAND.COM も起動するようになったが行編集機能がおかしい。 行編集機能の実装を見たらまたレジスターかw 何でもかんでも PUSH しようかとも思ったが、少しコードを追ってみたらファイルハンドルの参照に DS:SI を使うのとファイルハンドルの指定に BX を使うのでそこだけ保存すれば、他はすでに保存処理があるみたいだ。

MS-DOS

そんなこんなで動くようになった。 NEC 版 IO.SYS に、自分でビルドした MSDOS.SYS と COMMAND.COM の組み合わせ。 これは楽しい。

残るは IO.SYS といきたいところだが、ここはもう機種依存の実装から避けることはできない。 さらにはセグメントが何か面倒なことになっていそうな疑惑もあり、どのように作ろうか。

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


18 (日)

%1 にちようび

雨。 時々曇ったり晴れたり。

とんでもねぇ強さの台風が鹿児島市に上陸した。 935hPa! 八代市付近まで来ても 940hPa というのだから本当にとんでもない。 今年は鹿児島の気温が 20 年前の奄美大島並だねーなんていって笑っていたが、まさか台風まで奄美大島並とは... アメダスのデータを見れば鹿児島市は上陸直前あたりの 19 時頃にすげぇ雨が降ったのと、午前中に最大瞬間風速 43.5m/s が記録されているが、その後は落ち着いていそうだ。 進行方向右側になってしまった牧之原や志布志は風も降水量も強いデータが残っている。 まぁ、それを言ったら宮崎のほうが雨続きでかなりやばいらしい。 暴風域もデカいのでとにかくやばい。

鹿児島と言えば、こないだは Mugiuda Base からの帰りに姶良 IC を使ったんだけど、その一般道、制限速度いっぱいぐらいで割とのんびり走っていたら後ろの車は追い越したそうにしていたけど、追い越したのは登坂車線みたいになっていたところで 1 台だけだったか、なんだかとにかくついてきていた。 こっちはレンタカーなのにw まぁいいかとのんびり走っていたら、信号のところでさっき追い越された前の車に追いつき... んで信号が変わる、というパターンを数回やって、まるで走り慣れた道みたいになっていて不思議だった。

%2 IO.SYS

MS-DOS の IO.SYS 部分の作業に取りかかり始めたんだが... 難しいなこれ... ブートローダーのことも考えなきゃいけないのに、SKELIO.ASM ってなんかいろいろバグがあるように見えるんだよな...

他にもディスクのデバイスドライバーで初期化時に BPB array を指すポインターを指定するってのがあり、てっきり struct bpb hoge[n] 的な array の先頭アドレスのことだと思ったんだが SKELIO.ASM を見ると struct bpb *hoge[n] 相当になっていて、はてなと首をかしげつつ DOS の他のソースコードをチラチラ読んでみたら後者で合っていたので、これはドキュメントが説明不足だったか。

無理やり既存の DOS 環境の DEBUG.COM から立ち上げる手段でテストしようとしているんだが、なぜか \DEV\CON が見つからないエラーとコマンドインタープリターが見つからないエラーが出ている。 ディスクアクセスができていないのかなと思ったがよくわからない。 エラーメッセージが出ているんだから CON は大丈夫そうな気もするし... (INT 29H は未実装)

最初のスタックってどこにするのがいいんだろうな。 100 バイト程度でいいのなら別に割り込みベクターテーブルだってそのぐらいはあいている。 400H バイトもあるからね、1/4 でも 256 バイトは使える。 一時的にそれ用に使って用が済んだらクリア (IRET のアドレスに設定) しておくという手はなくはないのかも知れない。

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


19 (月)

%1 敬老の日

強い雨が降ったり、晴れたり、晴れているのに雨が降ったり、いろいろ。 夜になると風が強まってきた。 九州をガリガリと痛めつけた台風が今度は日本列島を横断するやつだ。

%2 MS-DOS

IO.SYS 起動チャレンジ。 ちょっと文字表示を足して試してみたところディスク I/O がうまくいっていない気配だ。 ディスクに問題があると \DEV\CON がなんちゃらみたいなエラーが出るのか。 へぇ。

ブートローダーを書くために FAT12 を見てファイルを読み込むコードを作った。 まずは IO.SYS から MSDOS.SYS を読み込むように作って先に DOS 上から IO.SYS を立ち上げる方法でテストし、うまくいったら今度はブートローダーの実装だ。 案外簡単に 512 バイトに収まった。 昔の苦労は何だったのか? PC-98 の面倒なのがあったかな。 いや、ここ 20 年何度もコードゴルフ的な遊びをやってきたせいで、コードサイズが無駄に大きい部分がすぐに気になって削ってしまうせいかも知れない。

それでいろいろとデバッグをして、案の定たくさんのバグを仕込んでしまっていて、手直しして何とか動くようになってきた。 そしてタブ文字が IBM の変な記号になる問題が発覚。 BIOS は水平タブを解釈しないんだな。 そのへん実装して、ついでに CARPOS を適当に設定するようにしてとりあえず使いやすくなるようにはした。 適当過ぎるのでいろいろ問題はあると思う。

CON のタブ対応と INT 29H を実装し気持ち高速になったか? AUX もうまく動いていなかったのでバグを直し、CLOCK もめちゃくちゃだったので修正をした。 IBM PC 互換の 40 年ものの古〜いインターフェイスを使ったのでまともに動くのは時刻のみだ。 それを 0x1800b0 と 8640000 でかけたり割ったりしなければならず、かけるのはともかく割り算はつらいなぁと思っていた。 ら、factor コマンドに突っ込んだらめちゃくちゃ因数あるじゃないか。 16 ビットで表せる数字の組み合わせにすれば、かけ算も割り算も 2 回ずつすれば良いのでどうってことはない。 多倍長演算にはなるが、プログラムは簡単だ。 実装して試したら四捨五入をしたほうが良さそうな感じがしてきた。 それもまぁ適当に実装。

いろいろ動くようになると JX ではどうなのかと気になり出す。 調べると JX は日本語処理用に BIOS が使う領域が広く先頭の 8KiB は使えないようだ。 英文モードのゲームが、なぜかブートセクターに IBMJ って入っていたせいで基本モードで起動できたものの画面表示がおかしかったというのがあったがこのへんが理由なのか。 ロードアドレスを調整すれば問題なく起動するようだ。 拡張表示モードでも基本モードでも英文モードでも起動する DOS。 良い。

ちなみに JX の英文モードは片面フォーマット (360KiB) で使っていたがこれは PCjr が 5.25 インチの片面ディスケットドライブを搭載していたことに由来するらしい。 PC DOS 3.2 のディスケットがあって、実はそれだと両面アクセスもできた疑惑がある。 (実機では未確認。) PC DOS 2.11 ではだめだったが、おそらく今回の自前ビルド MS-DOS ならアクセス可能なんじゃないか。

複数ドライブ対応も入れたがハードドライブには対応していない。

とまぁ 2 日がかりだったが何とか少しは使えそうなところまで来た。 DOS とはいえデバイスドライバーやブートプログラムといったところに来るとやっぱり手こずるんだな。 特にブロックデバイスは、FAT のパラメーターブロックと密接に関係していながら実質は LBA を使っているという、今思えば不思議な構成でだいぶ頭を使った。 でも、今時のコンピューターで仮想環境はあるしアセンブルは速いしリソースは有り余っているしという状況でやったからこんなもんだが、これを 40 年前にやっていた人達は本当にすごいし、時間も掛かっただろうなぁ。 そして意外と変なバグが残ったままリリースされていたものも多々あったんだろう。 この自分でビルドしたやつも、セクター数の違うディスクを交互にアクセスすると何かおかしい気がする。

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


prev, this, next

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

トップ / 日記索引 / 日記 (2022 年 9 月中旬)

Hideki EIRAKU