問題タブ [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 - なぜ NES の初期化コードはこのようになっているのですか (6502 アセンブリ)?
基本的には、前述のすべてのアドレスを 0 で初期化し、x をインクリメントし、ラベルの先頭に戻り、すべてのアドレスを 1 で埋め、x を再度インクリメントし、BNE が false になるまで繰り返し発生します (したがって、ゼロ フラグが 1 の場合)。したがって、基本的に X が 0xFF のときに INX が発生すると、X は 0 になり (そうですか?)、BNE は false になり、分岐を停止してプログラムを続行します。残りの大部分は理解できますが、一見ランダムなメモリアドレスでこれを行うのはなぜですか? なぜ 0x000、0x100、0x200 などなのですか? そして、なぜこのループが 256 回も発生するのでしょうか? この後のコードは、プログラムが 2 番目の VBLANK (NES PPU 関連) を待っていることを示しています。約 30k サイクルを燃焼させる必要があると記載されていますが、なぜこのようになるのでしょうか。
注: コードを読んでいる間、注意を払っていなかったことが判明し、この質問をしたときに STA 命令が何をしたかを一瞬忘れてしまいました。上記の情報の一部は正しくありません。
assembly - 6502 軽量圧縮アルゴリズム
私が書いている Forth のコモドール PET (楽しみのために) のデュアル カセット テープ デッキに仮想メモリを実装しています。興味があれば、私がこれまでに持っているものはhttp://github.com/chitselb/pettilにあります。
PET のネイティブ 192 バイト カセット データファイル形式を使用する予定です。そうそう、すべてに 32K の RAM しかありません。私はウォズの優れたメモリ効率の良いSweet-16インタプリタを言語に組み込みました。
Forth ブロックは (通常) 1024 バイトです。ブロック ID に 2 バイトを追加すると、利用可能な仮想アドレス空間が 64 メガバイトに制限され、テープに収まる容量よりもはるかに大きくなります。「再生」デッキ (デバイス 1) と「記録」デッキ (デバイス 2) があり、FLUSH では仮想メモリ全体を 1 つのドライブから別のドライブにコピーする必要があります。なぜ風車を傾けるのですか?当時、ほとんどの PET 所有者が持っていたのはカセット テープでした。
ほとんどのデータは Forth コードの画面であり、この実装では 1000 バイトのテキストと 24 バイトの行折り返しテーブルになります。これは、PET ROM 画面エディターも利用しているためです。私が探しているのは、Lempel-Ziv のような複雑なものの CPU とメモリのオーバーヘッドなしで、この目的のために (おそらく) 単純なランレングス エンコーディングを打ち負かすものの提案です。「忘れてください」以外のすべての提案を歓迎します。
assembly - エミュレーターのプログラミング: エミュレーターはアドレスからオペコードをどのように理解しますか?
SNES がオペコードとアドレス/パラメータをどのように理解するか理解に苦慮しています。各オペコードが一意の 16 進バイトでエンコードされていることはわかっています。それらは直後のバイトをパラメータ化していますか? その場合、1 バイトまたは 2 バイト (絶対アドレスまたは直接アドレスの場合) をどのように認識するのでしょうか。
この場合、ファイルの最初のバイト (ヘッダーの後の) がオペコードであることを意味しますか?
assembly - X レジスタの間接インデックス - アセンブラ 6502
そのため、LDX には間接インデックスのオプションがないという事実を回避する方法を見つけようとしていますが、すべてうまくいきません。(アセンブラではかなり新しい) LDA (arrPoint)、Y を使用して int 配列から MSB を取得し、LDX (arrPoint)、Y を使用して LSB を取得したい。
Xレジスタで間接インデックスを使用できるように、これを作成する方法に関するヒントはありますか?
これが私のコードの一部です。arrPoint はメモリ $1000 にあり、slask は 2 データバイトです。
ありがとう
c++ - C/C++ の 6502 エミュレーター: アドレッシング モード コードを実際の命令コードから分離する方法
空き時間に、6502 CPU 用の非常に単純な C++ エミュレーターを書き始めています。私はこの CPU のアセンブリ コードをたくさん書き留めていたので、すべてのオペコード、アドレッシング モード、その他のものは大したことではありません。
6502 には 56 の異なる命令と 13 のアドレッシング モードがあり、合計 151 の異なるオペコードを提供します。私にとって速度は問題ではないので、巨大な switch-case ステートメントを記述して同じコードを何度も繰り返す代わりに (異なるオペコードは異なるアドレッシング モードを使用して同じ命令を参照できます)、実際の命令コードをアドレッシング モードのコード: このソリューションは、13 個のアドレッシング モード関数と 56 個の命令関数を繰り返すだけでよいため、非常に優れていることがわかりました。
ここでアドレッシングモード機能:
それらはすべて、オペランド/結果を読み書きするために命令によって使用される実際のメモリアドレス(16ビット)を返します
命令関数のプロトタイプは次のとおりです。
16 ビット アドレスを取得し、独自の操作を実行し、ステータス フラグやレジスタを更新し、結果 (存在する場合) を同じメモリ アドレスにコミットします。
そのコード フレームワークを考えると、メモリ アドレスの代わりに A 内部レジスタの実際の値を返す唯一のモードである ACCUMULATOR アドレッシング モードを使用するのが難しいことがわかりました。uin16_t 戻り値の型を使用して A の値を返し、そのようなアドレス指定モードのブール値フラグを追加することもできますが、それは非常に醜い解決策だと思います。
命令関数は、アドレッシング モードに完全に依存しない必要があります。
c - 8 ビット NES プログラム メモリ制限
C コンパイラ (www.cc65.org) で 8 ビット 6502 のプログラミングを学習しています。
NES FC には、8 ビット 6502 プロセッサと 2K RAM が搭載されています。ただし、次の C は (nes ファイルに) コンパイルされ、VirtualNES エミュレーターに正常にロードされます。
なぜこれでOKなのですか?明らかに、上記の C コードで 2K を超えるメモリを割り当てています。
assembly - 6502 アセンブラー - RTS コマンドとスタック
6502 アセンブリ言語に関する次の質問に答える必要があります。
「スタックには、次の値があります (一番上の要素が最初):0x01, 0x02, 0x03, 0x04, 0x05, 0x06
アドレス0xc000
は命令jsr 0xABCD
です。フェッチ/実行サイクルの後にプログラム カウンターに格納される値と、スタックの一番上の要素は何ですか?」
プログラムカウンターが になることはわかっていますが0xABCD
、スタック要素について混乱しています。6502 アーキテクチャでは、スタックが上から下に (から0x01FF
まで0x0100
) 成長することを知っています。だから、スタックポインタは要素を指していると0x01
思いますよね?
ここで、コマンドprogram counter + 3
があるため、戻りアドレスは である必要があります。つまり、スタックにプッシュされますが、リトルエンディアン順であるため、最上位の要素になります。あれは正しいですか?next
0xc003
c0
assembly - 2 つの 16 ビット整数を加算して 6502 で 16 ビットの回答を生成しますか?
絶対モード アドレッシングを使用して 16 ビットの応答を生成するには、2 つの 16 ビット整数を追加する必要がありました。ただし、メモリアドレスを台無しにしてしまい、その理由がわかりません。コードの修正について教えてください:
loops - 2 つの n バイト整数を追加して、6502 で n バイトの回答を生成しますか?
6502 の追加で別の問題が発生しています....
n バイトの結果を生成するために 2 つの n バイト整数を追加しようとしています。このプロジェクトで必要なだけ 6502 チップを理解しているかどうか完全にはわからないので、現在のコードに関するフィードバックは非常に役に立ちます。
INX (x レジスタをインクリメント) と DEY (y レジスタをデクリメント) を使用することになっていることはわかっていますが、オペコードの配置がわかりません。
説明: 絶対インデックス アドレッシングを使用して 2 つの n バイト整数を加算します。
LDA、ADC、および STA がループの外側にある (アセンブリで初めてループを使用する)
編集: