問題タブ [chip-8]
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.
javascript - 仕様による私の chip8 実装は、インターネット上のオープン ソース コードとは異なります。説明が必要
私はCHIP8の実装に取り組んでおり、読んでいます
参考までに。CHIP8 について話しているいくつかのブログでも推奨されていたので、これは正確な仕様であると確信しています。私の質問は、コード「7xkk」を処理するためのオペコードを実装したことです
そして、これは私のコードです
しかし、他のオープンソースのCHIP8には、まったく異なる実装があります
//この人は、Vx が 255 より大きいかどうかもチェックしますが、これは仕様には記載されていません。
リンク - https://github.com/loktar00/chip8/blob/master/chip8.js#L181
オンラインで見つけたC++実装
//この人は「opCode & 0x00FF」を追加し、「0x00FF」でも適用・操作。
あまりにも古い仕様を見ているのか、それとも正しくやっているのか混乱します。
hex - 「不可能な」Chip-8命令をどのように処理しますか
そのため、CompSci クラスの最終プロジェクトとして Chip-8 エミュレーターに取り組んでおり、私のコードを超えていると思われる問題に遭遇しました。私がダウンロードした大量のデモ (SuperChip などではなく、本物の Chip-8 プログラムであると確信しています) には、Chip-8 オペコードの形式に適合しないマシン命令が含まれています。
http://mattmik.com/files/chip8/mastering/chip8.html
ページの下部には、各 2 バイト長のすべてのオペコードのリストと、それらのデータの各ニブルが表すものがあります。ただし、かなりの数のプログラムには、どの命令の形式にも適合しない命令があります。たとえば、これはそれらの 1 つからの 16 進ダンプです。その中のいくつかの個別のケースを指摘します。
0x154 には、
ただし、8 で始まる命令は 8 で終わることはできません。8 で終わる唯一の正当な命令は、1、2、3、4、5、6、7、または e で終わる必要があります。別のもの、0x158、
この形式に一致する命令もありません。e で始まる命令の 2 番目のバイトは、9E または A1 でなければなりません。
これはエラーのほんの一部です。コード全体にこれらの「不可能な」命令がいくつかあります。
私は何か根本的に間違っていますか?これらの指示にどのように対処すればよいですか? それらをスキップするだけですか?Chip-8 リソースとして使用しているページは何らかの形で不完全ですか? これに対処する方法についてのアドバイスは大歓迎です。ありがとう!
c# - Chip-8 Emulator: クロック速度を遅くする
私はNESエミュレーターを書く予定です。しかしまず、エミュレーションのしくみを理解するために、Chip-8 エミュレーターを作成します。
エミュレーターはほぼ完成しています。ゲームにいくつかのバグがありますが、これはすぐに修正されます。私の問題番号 1 は、エミュレーターを Chip-8 のクロック速度と同期させることです。私がよく読んだインターネットでは、一般的なクロック速度は〜540Hzである必要があります。チップのタイマーは、60Hz の周波数で刻む必要があります。
エミュレータを Chip-8 と同期させるために、次のロジックを記述しました。
詳細については、私のリポジトリをご覧ください: https://github.com/Marcel-Hoffmann/Chip-8-Emulator
ご覧のとおり、CPU サイクルごとに 1852 マイクロ秒待機します。結果は、540Hz に等しい 1 秒間に ~ 540 サイクルになります。しかし、私はこの論理にあまり満足していません。
クロック速度を同期する方法について、誰かがより良いアイデアを持っていますか?
c - CHIP8 in C - 遅延タイマーを正しく処理するには?
TL;DR 60 Hz で一定のデクリメントを維持しながら (正確ではありませんが、ほぼ正確です)、同時書き込みと読み取りを可能にするタイマーを C でエミュレートする必要があります。これは、Linux CHIP8 エミュレーターの一部になります。共有メモリとセマフォでスレッドベースのアプローチを使用すると、精度の問題が発生するだけでなく、メイン スレッドがタイマーを使用する方法に応じて競合状態が発生します。
そのようなタイマーを考案して実装する最良の方法はどれですか?
エミュレーションの世界に飛び込むために、モジュールごとに C で Linux CHIP8 インタープリターを作成しています。
実装が仕様で可能な限り正確であることを望みます。その点で、タイマーは私にとって最も難しいモジュールであることが証明されています。
遅延タイマーを例にとってみましょう。仕様では、これは「特別な」レジスタであり、最初は 0 に設定されています。値を設定してレジスタから取得する特定のオペコードがあります。
ゼロ以外の値がレジスタに入力されると、60 Hz の周波数で自動的にデクリメントを開始し、ゼロに達すると停止します。
その実装に関する私の考えは次のとおりです。
を使用して約 60 Hz の周波数で自動的に減分を行う補助スレッドの使用
nanosleep()
。fork()
とりあえずスレ立てに使ってます。mmap()
タイマー レジスタを割り当て、その値を格納するための共有メモリの使用。このアプローチにより、補助スレッドとメイン スレッドの両方がレジスタから読み書きできるようになります。両方のスレッドのアクセスを同期するためのセマフォの使用。私は
sem_open()
それを作成し、共有リソースをロックおよびロック解除するためにそれぞれ使用sem_wait()
します。sem_post()
次のコード スニペットは、概念を示しています。
このような実装で見られる潜在的な問題は、3 番目の点に依存しています。ゼロ以外の値に達した後にプログラムがたまたまタイマー レジスタを更新した場合、補助スレッドはメイン スレッドがリソースのロックを解除するのを待機してはなりません。そうしないと、60 Hz の遅延が満たされません。これは、両方のスレッドがレジスタを自由に更新および/または読み取ることができることを意味し (補助スレッドの場合は一定の書き込み)、明らかに競合状態が発生します。
私が何をしているのか、何を達成しようとしているのかを説明したら、私の質問は次のとおりです。
許容可能な固定周波数を維持しながら、同時書き込みと読み取りを可能にするタイマーを考案してエミュレートする最良の方法はどれですか?