問題タブ [6502]
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.
assembly - 6502 の .byte ディレクティブ: 格納場所
この質問には重複する可能性がありますが、私のものと同じ概念を持つ特定の質問は、単一の方法で回答されていません.
この.byte
ディレクティブは、命令によって使用されていないバイトを ROM に格納します。(私のものと同様のトピックに関するいくつかの質問には、これを示す回答がありました) コードからデータにアクセスする方法がわからない.byte
ので、6502 コードの例を挙げましょう。
これは機能しますか?とにかく、私の質問は .byte の行き先 (ROM) ではなく、どのようにアクセスするかです。たとえば、NES ではカートリッジは にロードされますが、プログラムの最初にデータ$8000
があるとしたら、からロードしてアクセスしますか? そして、次の 16 バイトをロードするときは、?.byte
$8000
$8010
ありがとうございます。これを重複としてマークしないでください。私の質問に答える質問は他にありません。
tl;dr の場合、どのように.byte
ROM (NES 内)からデータにアクセスしますか?
javascript - MOS 6502 エミュレーターが Enhanced Basic を科学表記法で出力する
私は MOS 6502 用のエミュレーターに取り組んでおり、この時点でほぼ完全に完成しています。ただし、小さな問題が 1 つあります。私が行ったすべてのテストに合格したように見えますが、何らかの理由で Enhanced Basic が文字を含むすべてを指数表記で出力してしまいます。
Enhanced Basic は、数値が 999999.4375 を超える場合にのみ、数値を指数表記に入れることになっています。
どこから見始めるべきですか?EhBasic からこのような応答を引き起こす可能性のあるエミュレーションの問題は何ですか? このような大規模なプログラムをどこから始めればよいかさえわかりません。また、エミュレーターが供給したすべてのテストに合格したことを考えると、テストの問題を正確に見つけることができません。
拡張基本からの出力例を次に示します。
4.8383 は、実際には 48383 のはずです。
私は自由にコードを書き直し、この問題を確認するために必要のないものはすべてコメントアウトしました。今では誰にとってもはるかに読みやすいはずです。
これを再現するには、C キーを押して EhBASIC Cold を実行し、メモリ サイズとして $C000 を入力します。
編集:明確にする
アキュムレータはメモリ[memory_size]です
一部の変数の後に [0] が付いているのは、javaScript Uint8 配列を利用して符号なし 8 ビット整数と符号なし 16 ビット整数を使用したためです。
emulation - 6502 およびリトルエンディアン変換
楽しみのために、私は NES エミュレーターを実装しています。現在、6502 CPU のドキュメントを読んでいて、少し混乱しています。
6502 はリトル エンディアンであるため、絶対アドレッシング モードを使用する場合はバイトをスワップする必要があると記載されているドキュメントを見てきました。私はこれをリトルエンディアンの x86 マシンで書いているので、単純に uint16_t* にキャストし、それを逆参照して、コンパイラーに詳細を処理させることができなかった理由がわかりません。
私は google test でいくつかの簡単なテストを書きましたが、それらは私に同意しているようです。
これは合格なので、私の推測は正しいようですが、私よりも経験豊富な人に尋ねようと思いました。
6502絶対アドレッシングモードでオペランドを引き出すのはこれで正しいでしょうか?私はおそらく何かを逃していますか?
function - 6502 JMP、分岐、およびサブルーチンを C++ でエミュレートするにはどうすればよいですか?
MOS Technologies 6502 プロセッサを完全にエミュレートするプログラムがあります。命令セット全体をほぼ完全に C++ 関数に実装しました。これには、数学関数やビット単位関数も含まれます。クロック速度をエミュレートすることさえできます。私がうまく実装できなかった唯一の命令は、JMP とすべての分岐命令、およびサブルーチン命令です。これは、C++ で goto のようなループを作成する方法がわからないためです。ヘッダーが大きすぎてコード ブロックに入れられないため、ファイル "6502.h" としてリンクしました。ステップバイステップのヘルプをいただければ幸いです。
https://drive.google.com/file/d/0B1j1lbKWU98iQ1dyVGNCVzRzdDA/view?usp=sharing 6502.h
c++ - 複数のクラスで定義されたオブジェクト指向のジャンプ テーブル
NMOS6502 エミュレーターを複数のクラスにリファクタリングしている最中です。関数ジャンプ テーブルを定義する「オブジェクト指向」の方法があるかどうか疑問に思っていました。基本的に、CPU オブジェクトへの参照を持つ「CStackInstHandler」や「CArithmeticInstHandler」など、関連する CPU 操作のグループを分類するために個別の命令クラスを定義しました。各命令クラスは、抽象命令クラスから派生します。各派生命令クラスには、cpu オブジェクトのパブリック インターフェイスを使用して cpu の状態を変更する一連の関数があります。
問題は、実行時に、命令ハンドラーとそのハンドラーに定義された適切なメンバー関数をオペコードを使用して決定する必要があることです。
したがって、オペコードはメモリから読み取られ、CPU はテーブルを使用してオペコードを命令ハンドラー タイプにマップし、命令ハンドラーは同じオペコードを使用して正しい関数を選択します。各命令は、「実行」機能をオーバーライドします。例:
}
最終的に 2 つのルックアップが発生しますが、そのうちの 1 つは冗長です。1 つはハンドラーを選択し、もう 1 つはハンドラー関数を選択します。これはこのタスクを達成するための間違った方法のように感じますが、非メンバー関数のグループに委譲するだけではない代替手段については確信が持てません。
誰かがこの問題について洞察を持っているかどうか疑問に思っています。基本的には、クラスをより小さなバイト (cpu クラスと命令クラスにリファクタリングされた命令メンバー関数を持つ cpu クラス) にリファクタリングしたいということですが、すべてのコンポーネントが非常に相互に関連しているため、同じことを繰り返す必要があります。冗長性が導入されます。
非オブジェクト指向の解決策は、これらの命令を cpu 参照を受け入れる非メンバー関数にすることです。次に、関数ジャンプ テーブルが定義され、命令が検索され、オペコードによってインデックス付けされて実行されます。
これは、オブジェクトでは実際には実用的ではないようです。すべての命令を静的にすることもできますが、これはポイントを逃しているようです。
接線的に関連する問題であっても、洞察や情報は非常に役立ちます。
ありがとう。
emulation - スタンドアロン テストとコモドール PET での 6502 の割り込み動作
FPGA 上に Commodore PET を構築しています。Kansas Lava に独自の 6502 コアを実装し (コードはhttps://github.com/gergoerdi/mos6502-kansas-lavaで入手できます)、その周りに十分な IO を配置しました ( https://github.com/gergoerdi /eightbit-kansas-lava ) オリジナルの Commodore PET ROM を起動し、カーソルが点滅して入力を開始できました。
ただし、古典的なBASICプログラムを入力した後
しばらくすると(数秒後)クラッシュします
私のコードはかなり合理的なオペコードごとのテスト カバレッジを持ち、 AllSuiteAに合格するため、より複雑な動作のテストを調べようと思いました。これが、Klaus Dormann の interrupt testsuiteにたどり着いた方法です。Kansas Lava シミュレーターで実行すると、元の割り込み実装に大量のバグが指摘されました。
I
割り込みハンドラに入ったときにフラグが設定されませんでしたB
旗がいたるところにありましたI
IRQ 割り込みは、到着時に設定されていない限り完全に無視されました (正しい動作はI
、設定されているときに割り込みをキューに入れ、設定が解除されたときに割り込みを処理する必要があるようです)。
これらを修正した後、Klaus Dormann テストを正常に実行できるようになったので、マシンを実際の FPGA にロードし直して、BASIC クラッシュがなくなることを期待していました。
ただし、これらすべての割り込みバグが修正され、シミュレータでの割り込みテストに合格した新しいバージョンでは、キーボード入力に応答しなかったり、実際の FPGA でカーソルが点滅したりすることさえありません。キーボード入力とカーソル点滅の両方が外部 IRQ (画面の VBlank 信号から接続) に応答して行われることに注意してください。これは、修正バージョンが何らかの形ですべての割り込み処理を壊したことを意味します ...
何がうまくいかないのか、またはこれをデバッグし始める方法について、漠然とした提案を探しています。
完全なコードはhttps://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewriteで入手できます。問題のあるコミット (テストを修正して PET を壊すもの) は7a09b794afです。これは最小限の実行可能な複製とは正反対であることを認識していますが、変更自体はごくわずかであり、どこで問題が発生するのかわかりません。また、問題を再現するには、ストックコモドール PET ROM を起動するのに十分な機能を備えたマシンが必要であるため、変更は必要ありません。縮める方法がわからない…
追加した:
ストック PET ROM の代わりに非常に単純な (あえて最小限の) ROM を使用して、同じハードウェアで同じ問題を再現することができました。