CまたはC ++でグラフィカルZ80エミュレーターを作成する[非公開]

StackOverflow https://stackoverflow.com/questions/1215777

  •  06-07-2019
  •  | 
  •  

質問

Z80 プロセッサー用のシンプルなエミュレーターの作成に興味があります。この種のプログラミングの経験はありません。私が最もよく知っているのは、Cベースの言語を使用することです。

これを達成するために必要なものと、このプロジェクトに役立つ可能性のある優れたチュートリアル/リファレンスは何ですか?

TI-84 PlusのROMダンプアプリケーションをコーディングするためのチュートリアルも希望しますこのエミュレータでROMを使用できるようにするための計算機。

役に立ちましたか?

解決

他のヒント

ちょっとした旅行ですが、この種のプログラミングの経験はないと言うので、 2006 ICFPプログラミングコンテストのユニバーサル仮想マシン a>。これは経験豊富なプログラマーに90分かかるタスクですが、経験のない多くのチームが数日で完了することができました。エミュレータを終了すると、たくさんの楽しいもののロックが解除されます。Z80に取り組む前のウォームアップになるかもしれません。

追加するもの(特にZ80の場合):

  1. ドキュメントが100%バグがないことを信頼しないでください

    ここに記載されているものを含め、バグのないものはありません。

  2. CPUコアのバグを適切にテストする

    後で多くの頭痛や混乱からあなたを救います。

テストには、3つのアプローチを使用しています:

  1. 既知のコードに対するステップ/トレース(通常はコメント化されたROM分解)

    これは、まだ何も機能しない最初のステップです。誤って(デコードされた)命令が表示されます。

  2. エミュレータに異なるZ80コアを含め、すべてを二重エミュレーションとして処理します

    同じステッピング、トレース、および実行システムを持つ2つの「分離された」エミュレーターを作成します。両方のCPUに独自のメモリハードウェアなどが必要です。

    私のデュアルエミュレーターの例

    • エミュレータを実行し、各命令の後にレジスタと [hl]、[sp]、[sp-1] ...
    • などの即時メモリ位置を比較します
    • 最初の違いで停止し、どの命令がそれを引き起こしたかを確認します。
      デバッグして、「バグがなくなる」まで続けます。 2番目のコアもバグがあるので注意してデバッグしてください。
  3. より実行可能な場合は、コアテスターを使用します

    ZEXALLエクササイザーを使用します。 Z80 で最適です(少なくとも私の経験から)。それは非常に多くのことを助けてくれました(私のコアは現在、100%ZEXALL互換です)。実際のハードウェアに対して実行されるため、バグはありません。 CP / M からのものであるため、一部のバージョンでは 64K RAMモード。異なる OS / ROM など、メモリアクセスのある命令が失敗する原因になる可能性があるため、修正されたCRCを見つけるか、実際のハードウェアと比較する必要があります。

    たとえば、生の ZEXALL ZX Spectrum で多くのことを失敗します( MSX および 64K RAM ROM なしのstrong>)が、実際の ZX Spectrum に対して行われたバージョンがあり、 ZX Spectrum OK ですstrong>(そして私のエミュレータでも:))

    Z80all instruction exerciser
    
    <adc,sbc> hl,<bc,de,hl,sp>...OK
    add hl,<bc,de,hl,sp>.........OK
    add ix,<bc,de,ix,sp>.........OK
    add iy,<bc,de,iy,sp>.........OK
    aluop a,nn...................OK
    aluop a,<b,c,d,e,h,l,(hl),a>.OK
    aluop a,<ixh,ixl,iyh,iyl>....OK
    aluop a,(<ix,iy>+1)..........OK
    bit n,(<ix,iy>+1)............OK
    bit n,<b,c,d,e,h,l,(hl),a>...OK
    cpd<r>.......................OK
    cpi<r>.......................OK
    <daa,cpl,scf,ccf>............OK
    <inc,dec> a..................OK
    <inc,dec> b..................OK
    <inc,dec> bc.................OK
    <inc,dec> c..................OK
    <inc,dec> d..................OK
    <inc,dec> de.................OK
    <inc,dec> e..................OK
    <inc,dec> h..................OK
    <inc,dec> hl.................OK
    <inc,dec> ix.................OK
    <inc,dec> iy.................OK
    <inc,dec> l..................OK
    <inc,dec> (hl)...............OK
    <inc,dec> sp.................OK
    <inc,dec> (<ix,iy>+1)........OK
    <inc,dec> ixh................OK
    <inc,dec> ixl................OK
    <inc,dec>  iyh...............OK
    <inc,dec> iyl................OK
    ld <bc,de>,(nnnn)............OK
    ld hl,(nnnn).................OK
    ld sp,(nnnn).................OK
    ld <ix,iy>,(nnnn)............OK
    ld (nnnn),<bc,de>............OK
    ld (nnnn),hl.................OK
    ld (nnnn),sp.................OK
    ld (nnnn),<ix,iy>............OK
    ld <bc,de,hl,sp>,nnnn........OK
    ld <ix,iy>,nnnn..............OK
    ld a,<(bc),(de)>.............OK
    ld <b,c,d,e,h,l,(hl),a>,nn...OK
    ld (<ix,iy>+1),nn............OK
    ld <b,c,d,e>,(<ix,iy>+1).....OK
    ld <h,l>,(<ix,iy>+1).........OK
    ld a,(<ix,iy>+1).............OK
    ld <ixh,ixl,iyh,iyl>,nn......OK
    ld <bcdehla>,<bcdehla>.......OK
    ld <bcdexya>,<bcdexya>.......OK
    ld a,(nnnn) / ld (nnnn),a....OK
    ldd<r> (1)...................OK
    ldd<r> (2)...................OK
    ldi<r> (1)...................OK
    ldi<r> (2)...................OK
    neg..........................OK
    <rrd,rld>....................OK
    <rlca,rrca,rla,rra>..........OK
    shf/rot (<ix,iy>+1)..........OK
    shf/rot <b,c,d,e,h,l,(hl),a>.OK
    <set,res> n,<bcdehl(hl)a>....OK
    <set,res> n,(<ix,iy>+1)......OK
    ld (<ix,iy>+1),<b,c,d,e>.....OK
    ld (<ix,iy>+1),<h,l>.........OK
    ld (<ix,iy>+1),a.............OK
    ld (<bc,de>),a...............OK
    Tests complete
    

    ZEXALL を使用する場合は、徹底的なテストであり、〜50MHz エミュレーションでの IIRC 完了するまでに30〜60 分。そして、スクロールのためにキーを数回押す必要があります...

    競合モデルが必要な場合は、適切なテストを追加します。次に見つけます。 ZX Spectrum には、多くのフローティングバス、割り込み、スクリーンテスターがあります。 TI についてはわかりません...( TI 電卓ユーザーではありません)

ところで:エミュレータはどうでしたか? (やったか?)

命令セット

ここで命令セットをコピーしますが、1792行と121KBがあるため、30KBの制限に収まりません。代わりに、この回答のダウンロードリンクで見つけることができます

正しいすべての OP コード、コーディングタイミング、マシンサイクルを含む「すべて」の ZX 命令が含まれています。すべてのドキュメントをまとめるのに数年かかったので、 ZEXALL 100%を正しく渡しました。エミュレータはこの(1792命令)テキストファイルを init のコアにロードし、実行時に命令デコーダーとプロセッサを構成します。

ミッチは完全に正しいです。プロセッサを理解することから始めます。次に、特定の命令を実装するコードを記述して、少し遊んでください。これにはC ++を使用してください。CではなくBTWを使用しないと、プロセッサの概念がコード内のクラスにマップされません。

命令を実装するプロセスでは、フラグや命令ポインタなどを定義する必要があることがわかります。最終的には、メモリモデル、さらにはI / Oモデルを実装する必要がある場所に到達するはずです。

最終的には、コードとデータをメモリにロードする方法と、おそらくそれをディスクにダンプアウトする方法を理解する必要があります。

そのときだけ、指定された命令ポインタで、メモリにロードされたコードの実行をエミュレートするポイントに到達する必要があります。

Sega Master SystemとGame Gearエミュレーターを見てみてください(一部はオープンソースであると確信しています)。これらのコンソールにはCPUとしてZ80があり、 ZX Spectrum も使用しており、 http://www.worldofspectrum.org/emulators.html

プロセッサだけでなく、完全なマシン用のエミュレータが必要なようです。また、ハードウェアの残りの部分をエミュレートするタスクもあります。そのためのドキュメントを見つけることは、より難しいタスクになる可能性があります。

目標に応じて、Z80用の既存のエミュレーターから開始することもできます。クイック検索では、それらのいくつかが提供されますが、TI-84のエミュレータは提供されません。 simh は、古いコンピューターエミュレーション用のフレームワークにすでにZ80プロセッサーのエミュレーションがあり、残りのエミュレーションを追加しています。ハードウェアは最初から始めるよりも簡単なはずです。その道に行かなくても、役立つドキュメントがいくつかあります。

少し単純ですが、関連するCPUであるのエミュレーターを書くことから始めることをお勧めします。 8080 。 Z80は実際にはかなり複雑です(マルチバイト命令、アドレス指定モード、インデックスレジスタなど)。8080命令は非常に簡単にデコードできます(一次ソリューションとして256エントリのルックアップテーブルを使用できます)。 。

プログラムを制御するために記述するすべてのコード(表示、データ入力、メモリダンプなど)は、Z80を試してみることにした場合は再利用可能でなければならず、実際にユーザーインターフェイスを設計する必要がありますプロセッサに依存しないでシミュレートされます。

Z80と計算機のアセンブリについて知っていることはすべてここ http://www.ticalc.orgで学びました。 / programming /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top