問題タブ [gameboy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
if-statement - gbz80 - IF ステートメント
VisualboyAdvance の Z80 でコーディングを行っていますが、IF ステートメントの実行方法がわかりません。
画面上の各タイルの値を 0xC3A0 からインクリメントするスクリプトを作成しました。画面データは 0xC507 で終了します。
私のコードは次のとおりです。
ご覧のとおり、これは常にループし、最終的にコア関数をインクリメントすることでゲームをクラッシュさせます。HL が 0xC507 に達したときに 0xC9 (Ret) を使用する方法が欲しいです。
どんな助けでも大歓迎です。
そして、あなたが提供するステートメントがどのように機能するかを私に説明できれば、それは素晴らしいことです. マシンコードは私にはなじみがありません。
c - Gameboy GB Emulation の割り込みルーチンがいつ終了するかを決定する
したがって、文脈のために、私がこれまでに理解していることをお知らせしたいと思います。
割り込み処理は、命令の実行後に呼び出され、割り込みマスター イネーブル フラグが設定されます。
割り込み処理は、いくつかの「割り込みルーチン」で構成されています (ゲームボーイの場合、Vblank、LCD stat、タイマー、ジョイパッド、およびシリアルがあります)。
CPU は、IE フラグと IF フラグに設定された値に応じて、各割り込みを処理する必要があります。
割り込みルーチンには優先順位があります (私の質問とはあまり関係ありません)。
割り込みルーチンには開始と終了が必要です
したがって、割り込みルーチンを調べると、ルーチンの終了後に保持する必要があるレジスタ値をスタック ポインターにプッシュすることから始めます。これは、割り込みが処理される前に次の命令のアドレスをポップする必要がある割り込みルーチンの終わりであると私は常に考えています。
私は知りたいです:
reti命令は各割り込みルーチンに1回だけ出現し、最後にのみ出現するのが「標準」ですか?これ以上の指示を読むのをやめるかどうかを判断できる唯一の方法だからです。
ret の代わりに reti を使用するのは、ime フラグがまだ有効であることをアサートし、他の割り込みを処理する必要があるかどうかを引き続き確認できるようにするためです。
割り込み処理の開始前に、次の命令のアドレスをスタック ポインターに明示的にプッシュする必要があります。これは、割り込み処理の開始前に次の命令のアドレスをプッシュすることを示すアセンブリ命令がないためです。これは、割り込みの最後にある reti intruction 用です。
編集:
そのため、私の問題についてより多くのコンテキストを提供するために、命令サイクル コードを投稿することにしました。
CPU.cで
InteruptHandler.c 内
assembly - レジスタをそれ自体にロードする命令の目的は何ですか?
ゲームボーイの命令セットを調べていると、次のような命令に出くわしました。
これらの各命令には、この表に独自のオペコードがあります。これは、可能なオペコードの数の制限により、それらがある程度重要であると私に思わせます。
私は最初、そのレジスタ内のポインターを逆参照し、そのポインターに値を格納している可能性があると考えました (この質問のように) が、エミュレーターでLD A, A
は次のように実装されています。
それらはプロセッサの状態に影響を与えないようで(レジスタを独自の値に設定するだけです)、NOP
実行するのに a と同じサイクル数を要します。
これらのオペコードが命令セットに含まれているのはなぜですか? また、それらはどのような目的に役立ちますか?