14

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

これを達成するために何が必要であり、このプロジェクトで私を助けることができるいくつかの良いチュートリアル/リファレンスは何ですか?

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

4

8 に答える 8

17

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

于 2009-08-01T04:58:51.780 に答える
16

おそらく、これらを見ることから始めます:

良いチュートリアルはここにあります:独立したZ80アセンブリガイド

Z80ドキュメント

文書化されていないZ80文書化されたv0.91(pdf)

完全なZ80命令リファレンス

Z80マイクロプロセッサ命令セットの概要

于 2009-08-01T03:47:13.813 に答える
12

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

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

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

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

    それは後で多くの頭痛や混乱からあなたを救うでしょう。

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

  1. 既知のコードに対するステッピング/トレース(通常はコメント付きのROM分解)

    まだ何も機能しないときの最初のステップです。ひどく(デコードされた)命令が表示されます。

  2. エミュレーターにさまざまなZ80コアを含め、すべてをダブルエミュレーションとして処理します

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

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

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

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

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

    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が完了するまでに約1分かかったことに注意してください。そして、それは数回スクロールするためにキーを押す必要があります...30-60

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

ところで:それはあなたのエミュレーターでどうでしたか?(あなたはそれをしましたか?)

指図書

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

これには、正しいOPコード、コーディングタイミング、およびマシンサイクルを含む「すべての」ZX命令が含まれています。すべてのドキュメントをまとめるのに数年かかったので、ZEXALLを100%正しく合格しています。私のエミュレーターはこの(1792命令)テキストファイルをコアにロードし、実行時に命令デコーダーとプロセッサーを構成するので、(バグが検出された場合)非常に高速で簡単に変更することができました...多くの時間。init

于 2013-10-07T07:15:00.317 に答える
5

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

命令を実装する過程で、フラグや命令ポインタなどを定義する必要があることがわかります。これにより、最終的には、メモリモデル、さらにはI/Oモデルを実装する必要がある場所にたどり着くはずです。

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

そうして初めて、特定の命令ポインタで、メモリにロードされたコードの実行をエミュレートするポイントに到達する必要があります。

于 2009-08-01T03:53:50.350 に答える
4

セガマスターシステムとゲームギアエミュレーターを見てみてください(いくつかはオープンソースであると確信しています)。これらのコンソールにはCPUとしてZ80があり、 ZX Spectrumもそれを使用していました(http://www.worldofspectrum.org/emulators.html ) 。

于 2009-08-01T12:47:49.090 に答える
3

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

目標によっては、Z80用の既存のエミュレーターから始めることをお勧めします。クイック検索ではそれらのいくつかが表示されますが、TI-84用のエミュレーターはありません。 simh、古いコンピューターのエミュレーション用のフレームワークにはすでにZ80プロセッサーのエミュレーションがあり、ハードウェアの残りの部分のエミュレーションを追加することは、最初から始めるよりも簡単なはずです。あなたがその道に行かなくても、あなたを助けることができるいくつかの設計文書がそこにあります。

于 2009-08-01T08:20:13.667 に答える
3

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

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

于 2009-08-01T08:29:41.353 に答える
2

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

于 2012-12-13T17:49:58.647 に答える