問題タブ [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.

0 投票する
1 に答える
741 参照

javascript - 仕様による私の chip8 実装は、インターネット上のオープン ソース コードとは異なります。説明が必要

私はCHIP8の実装に取り​​組んでおり、読んでいます

参考までに。CHIP8 について話しているいくつかのブログでも推奨されていたので、これは正確な仕様であると確信しています。私の質問は、コード「7xkk」を処理するためのオペコードを実装したことです

そして、これは私のコードです

しかし、他のオープンソースのCHIP8には、まったく異なる実装があります

//この人は、Vx が 255 より大きいかどうかもチェックしますが、これは仕様には記載されていません。

リンク - https://github.com/loktar00/chip8/blob/master/chip8.js#L181

オンラインで見つけたC++実装

//この人は「opCode & 0x00FF」を追加し、「0x00FF」でも適用・操作。

あまりにも古い仕様を見ているのか、それとも正しくやっているのか混乱します。

0 投票する
2 に答える
1271 参照

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 リソースとして使用しているページは何らかの形で不完全ですか? これに対処する方法についてのアドバイスは大歓迎です。ありがとう!

0 投票する
1 に答える
2197 参照

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 サイクルになります。しかし、私はこの論理にあまり満足していません。

クロック速度を同期する方法について、誰かがより良いアイデアを持っていますか?

0 投票する
1 に答える
1532 参照

c - CHIP8 in C - 遅延タイマーを正しく処理するには?

TL;DR 60 Hz で一定の​​デクリメントを維持しながら (正確ではありませんが、ほぼ正確です)、同時書き込みと読み取りを可能にするタイマーを C でエミュレートする必要があります。これは、Linux CHIP8 エミュレーターの一部になります。共有メモリとセマフォでスレッドベースのアプローチを使用すると、精度の問題が発生するだけでなく、メイン スレッドがタイマーを使用する方法に応じて競合状態が発生します。

そのようなタイマーを考案して実装する最良の方法はどれですか?


エミュレーションの世界に飛び込むために、モジュールごとに C で Linux CHIP8 インタープリターを作成しています。

実装が仕様で可能な限り正確であることを望みます。その点で、タイマーは私にとって最も難しいモジュールであることが証明されています。

遅延タイマーを例にとってみましょう。仕様では、これは「特別な」レジスタであり、最初は 0 に設定されています。値を設定してレジスタから取得する特定のオペコードがあります。

ゼロ以外の値がレジスタに入力されると、60 Hz の周波数で自動的にデクリメントを開始し、ゼロに達すると停止します。

その実装に関する私の考えは次のとおりです。

  1. を使用して約 60 Hz の周波数で自動的に減分を行う補助スレッドの使用nanosleep()fork()とりあえずスレ立てに使ってます。

  2. mmap()タイマー レジスタを割り当て、その値を格納するための共有メモリの使用。このアプローチにより、補助スレッドとメイン スレッドの両方がレジスタから読み書きできるようになります。

  3. 両方のスレッドのアクセスを同期するためのセマフォの使用。私はsem_open()それを作成し、共有リソースをロックおよびロック解除するためにそれぞれ使用sem_wait()します。sem_post()

次のコード スニペットは、概念を示しています。

このような実装で見られる潜在的な問題は、3 番目の点に依存しています。ゼロ以外の値に達した後にプログラムがたまたまタイマー レジスタを更新した場合、補助スレッドはメイン スレッドがリソースのロックを解除するのを待機してはなりません。そうしないと、60 Hz の遅延が満たされません。これは、両方のスレッドがレジスタを自由に更新および/または読み取ることができることを意味し (補助スレッドの場合は一定の書き込み)、明らかに競合状態が発生します。

私が何をしているのか、何を達成しようとしているのかを説明したら、私の質問は次のとおりです。

許容可能な固定周波数を維持しながら、同時書き込みと読み取りを可能にするタイマーを考案してエミュレートする最良の方法はどれですか?