CPUエミュの作成を考える

一度は作ってみたいと思うがどこまでやるのか?
というのは迷うところ。

例えば1命令の処理を行う場合
Z-80の LD A,(aabbh)
(aabbh = 16bitアドレス aa=上位バイト bb=下位バイト)

CPUの動きは
PC=プログラムカウンタ
(1)OPコードフェッチ
 アドレスバスにPCが指すアドレスが出力→
 →PCが指すアドレスの内容 OPコードがメモリからデータ
  バスに現れCPUに読み込まれる→PC=PC+1→
(2)オペランドフェッチ
 →PCが指すアドレスの内容 bbh がメモリからデータバスに
  現れる→Aレジスタに読み込まれる→PC=PC+1→
 →PCが指すアドレスの内容 aah がメモリからデータバスに
  現れる→Aレジスタに読み込まれる→PC=PC+1→
(3)処理
 →読み込まれたアドレス aabbhがアドレスバスに出力→
 →出力アドレスのデータがデータバスに現れる→
  Aレジスタに読み込まれる。

この流れが LD A,(aabbh) の動作で、よくCPUの
データシートの命令のタイムチャートで示される動作の
説明である。


エミュの実現手段として3パターン程あるか?
実物の動作に近いエミュ2パターン
[1] 先に示したようにCPUの動作にソフトウェア側の
  処理も近い記述をして実現する方式
[2]命令単位で処理を記述(命令ごとカスタム)してその
  命令の実行クロックだけをカウントしサンプリング
  時間レート内での空時間でウェイト処理を入れ
  処理時間を実機に近い値で処理をする方式。
[3]命令コードの機能だけ見たし出来るだけ高速に実現
  して今の時代ならこれくらい出来るはずという
  極限追及方式

この3種類だろうか?


[3]の実現方法でも更に2パターンはある。
各命令内記述ではインラインアセンブラまで使う方法と
あくまでもC/C++の記述駆使までの方法と分けられ
どちらもプログラマの挑戦し甲斐のある部分である。
インラインアセンブラを使ってしまうと実行環境
毎に用意する必要性がありポータビリティは損なわれるので
C/C++による構造化の効率化と記述の限界で留めるべき
である。

個人的には正当コードのエミュ作成の場合[3]を目指すこと
になるが今のPCではどのくらい(何MHz)相当なのだろうか?
4MHzのZ-80Aから今のCPUは3GHzのQuadコアなら…
クロックは単純に3000/4=750倍なので
4MHzのCPUを余裕でエミュできるはずである。
但し、Windowsの他の処理がバックグラウンドで動いているの
でエミュ環境がCPUエミュに割ける時間はの1/16~1/4くらい
か?それでも楽々でリアルエミュできるはず。
という概算が出るので

それから考えるとZ-80Hや40~60MHzくらいまでは
エミュ可能か?面白い!
スペックを勝手仕様設定でRISC的に1命令1~2クロックとし
てしまえばもっと早いCPUとなる。

だから 8bit CPUエミュでも相当遊べるエミュパソコンを
実現できるはず。

PS2エミュがあそこまでできるのだからレトロ8bitPCは
軽快に動作するのは明らか。

だからこちらとは別カテゴリーの『仮想8ビットCPUおやじ』
を立ち上げて理想の8ビットPCを作ろうとしているのだ。
(いつ完成するか完成するのかも分からない
 人生の余興度が高いカテゴリーではある)

Z-80のリアルCPUエミュに関しては拘りたいのは
CPUコア部分だけなのでそれ以外の部分は
オープンソースのものをベースにコア部分の差し替え
でかなり楽に実現は出来るので暇さえあればやってみたい
気持ちはある。


[余談]
実際に差し替えて遊んでみたいのは完成度の高い
EmuZ-2500だが MZ-25xx系の集めた仕様書籍が少なく情報
不足で遊び辛い。

X1turboZは中古書籍を買いあさってかなり揃っているので
できればX1turboZのエミュがあればよいのだがX1シリーズは
X1turboまでのエミュしかない。
またMZ25はROMバイナリ入手可能に対しX1系ROMは
各自吸出ししかできず turboZ本体は以前にヤフオクで入手し
ているものの吸出しツールと表示できるディスプレイもないの
で非常に残念な状態だ!

こうなるともう少し楽な自分仕様の8ビットCPU&PCを
作ってしまう方が早いと思ってしまう。

| | コメント (0) | トラックバック (0)

Z-80の検証(レジスタ編)

ある部分では致し方のない仕様も含んでいるが
割と好き勝手に改造できているようにも思えることから
自分ならこうしたという仕様をレジスタから検討してみる。

互換モードとオリジナルモードを搭載しても良かったという
思いが先ずある。
但し当時の回路集積技術では無理だったかもしれない。

レジスタ
◆Aレジスタ
 非常にそもそも論になるがこれはHLレジスタを
 アキュムレータにすべきでこれはi8080のバイナリ互換
 が原点のための最大の呪縛となっている。
 (これはi8080自身の最大の失敗でもある。)
  Z-80ベースならAレジスタは廃止してFレジスタとIレジスタを
 16bitペアのフラグレジスタにした方が良い。

◆BCレジスタ
 これはI/Oポートレジスタとしても使われ
 BCレジスタペアで16bitI/O空間のアクセスが可能と
 なっていた隠し仕様は正しい。
 (i8080でもそうだったのかは不明)

◆IX,IYレジスタ
 この2つは必要ない。
 それなら IX を DEで IY を BCのレジスタペアで
 拡張インデックス機能に機能拡張した方が良かった。

◆I,Rレジスタ
 Rはソフトウェア側から見ると全く不要なレジスタ。
 IはFにペア統合するのが良い。

◆裏レジスタ
 IX,IYレジスタが無い上でならば、あれば良いという程度
 8bitCPUでは処理速度とメモリ空間の制限を考慮す
 ると割り込み発生時のレジスタ内容の保護によるスタック
 退避はレジスタ本数が多いほどリソース消費は負荷が
 大きい。
 組込CPUでもレジスタセットを複数バンク持つCPU
 があるが実は必要性はない。
 複数バンク持とうが固定的なバンク数のため汎用的
 にはなりえないからだ。
 ならばレジスタセットの本数は必要最小限にしそれらに
 アドレッシングモードを出来るだけ与え割り込みでの
 退避数を抑える方が良い。
 これは経験上可能であることも実践的に証明できる。

◆Fレジスタ
 問題は中身
 ・P/Vフラグ これは不要
  8bitの中に1が偶数個あるときまたはあふれるとき
  ビットが逆は逆の意味という機能は全く使えない。
  有効性があるなら溢れる寸前(フルビット)のときだけ
  あればよいがそれも無意味であるし使う必要性も感
  じない。
  実際6809を見ても分かるがそういったフラグは存在
  していないのでないとどうしうようと思う必要もない。

 ・Hビット
  これは4bitCPU時代の名残でしかない。
   レジスタのビットシフト命令が1bitシフトでなく
  x86のように複数ビット指定命令にしていれば効率的な
  判別ができるので無用である。

結論
Z-80の必要最低限の汎用レジスタは
HL,DE,BCの3セットである。
裏レジスタを付ける場合は各レジスタペア毎の
表裏の入れ替えができないと不便である。

そしてレジスタセットを少なくするのはマルチタスク処理
を意識するためでコンテキスト切換えで遅い8bitCPUでは
レジスタ退避の負荷を最小限にできるからだ。

現在では基本命令は高速実行に設計できるので尚更で
ある。

この検討を元に命令の検討となる。

| | コメント (0) | トラックバック (0)

部屋の気温が低いからだったのか?

録画PC用の電源FANの異音が頻繁になり
取り換えようと新しい電源を用意したが異音も治まった。

少し寝るときに冷えすぎるかな?と換気のためにいつも
窓を少し開けているがそれを完全に閉めたら電源FAN
の異音も治まった。

冷えから来ていたのか?
駆動系は冷えてもダメなのね?
CPUは良いんだけど?

結局まだ録画用PCの中開けて掃除してない。
もう少し暖かくなって3月の第1クール終わりあたり
でPCの中のほこり取りをすることにしよう。

それまでに余計な大破は無く行って欲しい。

| | コメント (0) | トラックバック (0)

«メモリ空間について考える