V20-MBCエミュレータの開発 その1

タイトルと内容の食い違いがあって分かりづらいというご意見を頂いたので、今回から「V20-MBCエミュレータの開発」に変更します!

後先考えてないからこーなる!(ToT)

 

前回の間違い訂正

まずは前回、大間違いをしてしまったのを訂正してみたい。

前回、CMPSBという命令がちょっと特殊な動きをする…という書き方をしてしまったが、調べてみたところ、私の勘違いであった!

すみません…orz

 

私が勘違いしていたのは、REPZと組み合わせてCMPSBを使った時の動きだった。

なんとなく…私はこんな感じで実装をしていた。

・CXの値を調べて0で無ければ処理をする

・CMPSB

・Zフラグが落ちていたら処理を抜ける

・CXの値を1マイナス

・先頭へ戻る

C系の処理でforを使ってプログラムを書くと、大体こんな感じになる。

 

どうやらホントはこっち↓の処理になるらしい。

・CXの値を調べて0で無ければ処理をする

・CXの値を1マイナス

 ・CMPSB

・Zフラグが落ちていたら処理を抜ける

・先頭へ戻る

 違いはCXレジスタを減算するタイミングだ。

 

これを読み違えて、CMPSBの処理に答えを求めてしまったのが間違いだった(T-T)

動いてるマシンがあるんだからデバッガで確かめてから発言しないと…と肝に銘じた汗

でもブログに書いてなかったら、私はそう思い込んでずっとプログラムをそうしていたに違いない。書いてみて間違いに気づけたのだから良かったんだ…と前向きに考えます(^^;;

以後、気をつけます!!

 

エミュレータの現状

エミュレータの現状を報告してみたい。

写真をいくつも撮ったのだが……コンソールにテキストというのはホントに華がないw

良く見ないと違いが分からないと思うが、このブログを読んでくれてる人は、きっとそういう画面が好きに違いない…と勝手に解釈をして、遠慮無く載せていきたい!

 

実はまだキー入力を受け付けるようにしていない。

受け付けるようにするのは簡単なのだが、エミュレータを安定させるのを優先させている。もう少し問題なく動くようになったら、いろいろと入力して遊んでみようと思う。それまでは「入力なし」で見て欲しいw

※現状の入力はプログラムで強制的に発生させている「ハリボテ」

f:id:PocketGriffon:20200817002409p:plain

↑ASM86.CMDが起動したところ。

ファイルを指定していないので何も起こらない。

とりあえず起動してエラーが出るのが大事だ!(^^;

 

f:id:PocketGriffon:20200817002518p:plain

↑TYPEコマンドが動いたところ。

付属のSINX.BAS(テキストファイル)を表示させてみた。

ファイルは正しく読み込まれている模様。

 

f:id:PocketGriffon:20200817002640p:plain

↑MBASICが起動したところ。

とりあえずOkプロンプトまでは表示された!

 

f:id:PocketGriffon:20200817002727p:plain

↑そして、イマココ…の写真。

やりたいことは、MBASICのオプションにファイル名を指定して、ASCIART.BASを起動させようとしているのだが、Okプロンプトが出てしまい実行が出来ない。

本来であればOkは表示されず、BASICプログラムが起動するはずなのだが…(T-T)

ASCIART.BASのファイルは読み込みをしているっぽいが、その先へ進まない。V20命令のバグに間違いはないのだが、見つけられない…。ぐぬぬ

 

疑問だったパリティビット

f:id:PocketGriffon:20200817004224p:plain

少し話は横にそれるが、実はずっと疑問に思っていた事があった。

↑はSYMDEBでの実験で、16bitの2つの値(7FFFh、0001h)を加算してオーバーフローさせるテストをしているところだが…これを見るとパリティフラグがPE、つまり1になっている。

 

パリティビットとは、演算結果の数値を2進数で見た時、1になってる数を数えてみて答えが偶数の時にセット(1)、奇数の時にリセット(0)となるもの。ところが、↑のテストの場合、演算結果(AXレジスタ)は8000hであり、ビットの数は1、つまり奇数だからパリティビットは0になるはずなのだが、結果はPE(1)となる。

はじめて8086を覚えた頃に気が付いて、もう30年以上も疑問だった。

 

今回、CMPSBの件もあり、この際だから自分の思い違いを正したいと思った!

手元にある資料を探しまくり、ようやくその答えが見つかった!

 

f:id:PocketGriffon:20200817011033j:plain

書いてあった本は、NEC日本電気株式会社から発行されていた「μPD70108/70116 ユーザーズ・マニュアル」で、こんな書き方がされていた。

演算の結果を構成するビットの下位8ビットのうち、1のビットの数が偶数個のときセットされ、奇数個のときリセットされます

しれっと「下位8ビット」って書いてある!!!

 

実験プログラムを作ってみても下位8ビットしか反映されていないっぽいなぁ…とは思っていたが、今まで確証が得られなかったのでモヤモヤしてた。これでようやく気になっていた事が解決した!\(^O^)/

 

まぁパリティの計算が正しくなっても、上のMBASICのプログラムが起動しない件は影響ないんですけどね(ToT)

 

ではまた次回!(^-^)ノ