1つのバグに半日掛かる作業…
先日の「DIR」が入力出来ないバグが直りました!
直すのに半日掛かってしまった…。
この歳になると集中力が持たない(^^;;
マジで寿命が縮むので、ソース書くのもためらっちゃうなぁw
原因は…8086の命令フォーマットに詳しい方ならピンと来ると思うけど、dビットの扱いだった。このビットが立っていると、演算のソースとディスティネーションが逆になるという恐ろしいビット…(T-T)
もちろんコード書いた時にチェックはしているんだけど、たまたま00hが入っているレジスタ同士だったり、直接は見られないメモリだったりすると「まぁ後でまとめてチェックすればいいか」とか思いつつ前に進めたりするからこういうメにあう(T-T)
そしてバグを修正して、ようやく前に進んだ画面がコレだ!!
……いや、NO FILEじゃなくて…orz
たくさんあるはずでしょ、表示するべきファイルが(TOT)
ファイルが見つからない
これも面倒なタイプのバグ(T-T)
こんなふうに「それっぽく動いちゃう」症状がホントに怖い(T_T)
上記の場合は、 V20のエミュレータが間違ってNO FILEになっているのか、それともAtmega32A側の実装がダメでNO FILEになってるのかが不明。唯一分かるのは、原因を探るのは簡単じゃないって事くらい。
V20-MBCが手元にあるんだから、実機を見ながら作ればいーじゃん…と思ってみても、エミュレータと違って実行途中の中身は見られないので、起動し終わってからのメモリを見ていくしか方法がない。でも実機があるおかげでだいぶラクさせてもらってるけど(^^;
エミュレータを実行させながら逆アセンブラを見ていくのでは、プログラム全体の流れがつかみにくいため、前に開発した静的な逆アセンブラを駆り出す事にした。
コレは前にも写真載せたことがあるかも知れない!
このツールを一言で言えば「マシン上に仮想8086を作りだし、そこに実機と同じメモリを配置し、可能な限り逆アセンブルしまくる」ツールだ。
設定ファイルさえちゃんと定義してやれば、メモリへのデータロード、逆アセンブルしたいアドレスの追加、コメントの挿入などなど、結構便利に使える。
これでようやく全体の流れが、うっすらとだけど見えてきた!
見えてきたけれども…分かってきたのは、Atmega32A側の実装は、おそらく問題がなさそうという事。という事は、やっぱりV20エミュレータのバグか!(TT)
そうと分かっていても見つからないのがバグ。
原因の箇所と思われる部分を300ステップくらいに絞り込んだけれども、どうしても探しきれない。理屈と動作が矛盾してる…。
命令実装の盲点
以下、間違った情報が書かれていますので気をつけてください!一番↓に追記しました!
ハタと気になったCMPSBという、ストリング命令。REPプリフィックスと組み合わせると、A2つのメモリの内容を比較していってくれる便利な命令だ。
もうプログラムは何度も見直しているけれども、書いてあるプログラムと照らし合わせるとなんかおかしい。
CMPSBの動作はこんな感じだ。
・[ES:DI]と[DS:SI]のメモリ内容を比較する
・比較結果をフラグに反映させる
・DFフラグに基づきDIとSIを更新
特に特別な事はない。
ユーザープログラムでは、この命令を実行し終わった後のフラグを見て処理をすれば良い。
……と思い込んでいた。ずーっと何十年も思い込んでいた(^^;
実はこれが盲点だった(T-T)
どうやら、正しい動作は次のようなのだ。
・[ES:DI]と[DS:SI]のメモリ内容を比較する
・比較結果をフラグに反映させる
・比較の結果、Zフラグが立っていなければDFフラグに基づきDIとSIを更新
命令から抜けてきたDIとSIの値を使おうとしなければ、この問題には気が付かないはずだ。
たままたCP/M-86内部でそのような使われ方をしていて、1バイトずつズレていくのは何故なんだろう…というところから気が付いた!
ちなみにこの件を詳しく書いてある書籍は、私の手元には存在しなかった。多くの本はREP命令との組み合わせで「フラグが立ったら止まる」という表記だった。きっとREP命令が止まるという意図で書かれてるんだろうとは思う。
というわけで修正をして動いたのがこちら↓!
やっとDIRが動くようになった〜!\(^O^)/
たかがDIR、されどDIR!
よーし、これからまずはビルトインコマンドを中心に動作テストをしていくよ!
最終的にはMBASICやTurboPascalを起動して動かしてみたい!
ではまた次回!(^-^)ノ
追記:
ブログの投稿をした後、twitterにて「デバッガで試すと+1されてる」と報告があり、実際に私もMS-DOS上で試してみたところ、同じ結果になりました!
すみません、ちょっとコード組んで試せば良い話でした!失礼しました。
という事で、また別のバグが潜んでるって事ですね…orz