2025W51
- 20251215
- cradle86
- とりあえず、qemu用のラッパー(仮想ディスクから読んで0番地に展開して、0x1FFF0にジャンプ)はできたから、偽の割り込みハンドラを作る。
- cradle86
- 20251216
- cradle86
- qemuを使って、COMMAND.COMを含めたメモリイメージを作って読ませ、”Invalid COMMAND.COM”というエラーメッセージがでてきた。
- ディスクアクセスが必要みたい。
- あと、何故か実機だと動かない。
- cradle86
- 20251217
- cradle86
- qemuでも実機と同じレベルでログが取れないか調べてたが、難しそう。
- qemuでもプラグインを書くとメモリアクセスが取得できると聞いたが、プラグインのコンパイルができなかった。
- cradle86
- 20251218
- cradle86
- プログラムカウンタと命令フェッチを見比べてた。
- 割り込みから戻ったあとおかしくなってた。
- 実機のメモリアクセスを見ていたら、 intの時に、CPUはスタックを3つ積む(フラグ、セグメント、PC)んだけど、 iretの時に、2つしか取り出していない事に気がついた。
- 割り込みハンドラのプロローグで、 レジスタをpushして、 エピローグでpopしてるんだけど、 この数が合わなくてズレてるのではないかと思い、確認したら、 数はあってるが、
spをpush/popしてた。
- これをやる意味が理解できなかったので、 AIさんに聞いたら、じゃあ消しましょう、となって消したらなおった。
- 識者に聞いたら、8086と80286以降で挙動が違う有名な所らしい。
- https://ja.wikipedia.org/wiki/Intel_80286#cite_note-21 8086のPUSH SP命令でスタックポインタSPを退避させる場合、SPから2が減算された後のSP値が記録される。例えば、PUSH SPのあとPOP AXを実行するとAXにはSP-2がロードされる。80286以降ではPUSH SPの際に減算される前の元のSP値を退避するようになった。この挙動の違いはプログラムが8086で実行されているのか、80286で実行されているのかを判別することに使用できる。
- cradle86
- 20251219
- cradle86
- ファイルIOのスタブを作ったら、起動メッセージはでた。
- しかしプロンプトは出ない。
- ソースをみると、メモリを確保して自分を読みなおし、それを使って以降の実行を続けている。
- メモリ関連のファンクションコールがいるな。
- cradle86
- 20251220
- cradle86
- ファンクションコールをたぶん実装できたが動かない。
- そもそも正解の応答がわからないからなぁ。
- 万策付きた。
- 例えば、debug.comは、そういう難しい事をしてないから普通に操作できる。
- 識者に聞いたら、HIDOSを使って、いじりながらコンパイルする事を勧められた。
- なるほど。
- ファンクションコールをたぶん実装できたが動かない。
- 雑プロッタ
- inaさんが組み立ててくれた
- https://x.com/ina_ani/status/2001958316067676160
- https://x.com/ina_ani/status/2001960294843809931
- いろいろフィードバックを頂いたので、バージョンアップしたいな。
- inaさんが組み立ててくれた
- cradle86
- 20251221
- cradle86
- HIDOSのCOMMAND.COMがどう動いてるか確認する。
- ジャンプ先は似てるように見えるけどなぁ。
- COMMAND.COMだけを再現するのは諦めて、HIDOSのVM_IO.SYSとMSDOS.SYSも入れる方向でやっていこうという方向性になった。
- HIDOSのCOMMAND.COMがどう動いてるか確認する。
- cradle86
意見、ご感想、コメントはフォームにどうぞ。