またしても中途半端に動いちゃう系!
1.2が表示され、とても気持ちよく前に進もうとした矢先の事だった…。
↓こっちが本来のASCIART.BASの動き
↑こんな感じで0〜Fの文字でアスキーアートっぽくマンデルブロー図形を表示するプログラム。計算式がバリバリ入っててテストとしては申し分ない感じ。
それを動かそうとしたら…こうなった!↓
…うん、もはや動くとか動かないとか、そういうレベルではないみたい(T-T)
この中途半端に動いてしまう系はホントに厄介なんだってば…orz
解決に向けて、もう少し糸口が欲しい。
試しにプログラムをLOADしてLISTしてみよう。
そしてこっち↓がオリジナル。70、80行に注目して欲しい。
そして↓こっちがエミュレータ上でLISTした時の結果。
表示は違うけれども、言わんとしている事(数値として)は同じだ。
なんとなく…中間言語への変換はちゃんとしているけれども、表示時に変わっていそう。
試しにBASICのコードが格納されているメモリ内容を見てみる。
まさかバイナリを追いかける読者はいないと思うが(^^;;
念のためF000:0B49から70行のデータが始まっている。
BASICの内部構造(大枠)はPC-8001やPC-8801と同じだ。その機種の解析本などがあればBASICプログラムは追い掛ける事が出来る。
そしてこのバイナリは実機でもエミュレータでも同じ状態だった。
ということは表示しようとして変換を間違えているという事だよね…。
実行出来ない問題に影響があるかどうか分からないが、問題を見つけてしまったら直さないワケにはいかない!いっこずつ直していこう!
まずはLIST表記を合わせるデバッグをするよ!
エミュレータの実行速度
ちなみに…V20-MBC実機でCP/M-86を起動させ、MBASICを立ち上げてASCIART.BASをロード後にLISTしようとすると、この過程だけで25秒くらいの時間が掛かる。
V20が遅いとかじゃなくて、単純にSDカードからのロードに時間が掛かるのだ。
エミュレータで同じことをしようとすると1秒と掛からない。
この時間の短さ、手間の無さを考えると、やはりエミュレータの開発は必要だよなぁ…と再認識させられる。
最終的には出来上がったプログラムを実機で動かすのが目的ではあるけれども、その途中は出来る限りラクをしたいのだ(^^)
ラクをするために苦労をしてる…うーん…どっちが良いんだろう??
デバッグ開始!
こういう文字が表示される系はプログラムを捕まえるのもソコまで大変ではない。なぜならば必ずCP/Mのシステムコールを介して文字が出力されるからだ。システムコールの先頭で待ち構えていれば、プログラムの方がやってきてくれる…というワケだ。
調べてみると、メモリ中のF000:05CAにある文字列を表示しようとしていた。つまり先に数値→文字列への変換があり、その後に表示している事になる。
ではその数値→文字列への変換を探す事になる。
ちなみに逆アセンブラのコードは、こんな表示のものをひたすら追い掛けている。
これだけではプログラムがストレートにしか分からないので、実機のメモリを逆アセンブルしたものやGW-BASICのソースコードと一緒に照らし合わせながら、地道な作業をしている。
ある程度自動化出来るのかも知れないが、地味な作業が大好きな私は気にしてないw
文字列を生成しているプログラムが特定出来たら、ここから先は内部計算系だ。
こういう計算系のバグは非常に難しい。特にMBASIC内部の中枢部分だったりするので、レジスタとフラグ、そしてスタックの使い方が非常にトリッキーだ。
PUSH、PUSHF、SAHF/LAHF、さらにCALL元のアドレスにデータが置かれていたり、熟練の8086使いが組んだ感じがプンプンする。省メモリと高速化テクニックがてんこ盛りだ!
追い掛ける方はたまったモノではない(T-T)
今回のバグは、オーバーフローのフラグ生成が間違っていた!
こんなの……今まで何度も作ってるモノなのに(T-T)
なんか情けなくなってきた(^^;
よし!これで表示された!
気になるのでもう少しだけ深追いしてからASCIART.BAS問題に戻ろうと思う!
きっと指数表示とかでもバグ出るんだろうなー(T-T)
ではまた次回!(^-^)ノ