3

最初に:これがだまされたらごめんなさい!少し検索しましたが、これを十分に説明しているリソースが見つかりませんでした。

n00bish質問はこちら!

.byteディレクティブが何をするのか理解しようとしています。さまざまな情報源がさまざまなことを言っていますが、その要点は次のようなものです。

.db、DB、.byte などは、指示としてではなくデータとして、指定した正確なバイトを配置します ( http://forum.6502.org/viewtopic.php?f=2&t=2374 )

cc65 マニュアルも同様にあいまいです:

.byte: バイト サイズのデータ​​を定義します。(バイト範囲の) 式または文字列のシーケンスが続く必要があります。

例:

        .byte   "Hello "
        .byt    "world", $0D, $00

( http://www.cc65.org/doc/ca65-11.html )

それが何を意味するのかわかりません。データの定義に関連するすべての操作は、メモリ アドレスの読み取りと書き込みのバリエーションであると考えていました。このようなものです(NES開発に関するつぶやきから)

; Number of PRG-ROM blocks
.byte $01
; Number of CHR-ROM blocks
.byte $01
; ROM control bytes: Horizontal mirroring, no SRAM
; or trainer, Mapper #0
.byte $00, $00

正確には何をしているのですか?オペコードの観点からすべてを説明できますか、それとももっと凝ったことをしているのでしょうか? 私には、次のようなゼロページから始まるシーケンシャルデータを書き込んでいるように見えますか??:

LDA #$01
STA $00
LDA #$01
STA $01
LDA #$00
STA $02
LDA #$00
STA $03

私はここから離れていますか?Leo Scanlon による 6502 Software Design を読んでいますが、その (または) ディレクティブへの言及は見当たりません。私は NES 開発の目的で 6502 を学んでおり、すべてのサンプル コードは.byte.ascii、および他のいくつかのディレクティブでいっぱいです。ユーザーが投稿した NES チュートリアルの世界をナビゲートしようとする前に、Scanlon の本のようなアカデミックなテキストから 6502 の強固な基礎を取得したかったのですが、これが NES 6502 を理解する上で障害になっています。

4

2 に答える 2

2

ここで考慮すべき点が 2 つあります。値が常にここにある ROM メモリの場所 (「ロード」することはできませんし、すべきではありません) と、システムの電源を入れたときに内容が定義されない RAM を混在させています。使用したいデータは、ある時点で効果的に「ロード」する必要があります。

例えば ​​:

.byte $00, $01, $02, $03

これらの 4 バイトを ROM のどこかに追加します。それらは「読み込まれる」のではなく、常にここにあります。

とは対照的に :

ldx #$00
stx somewhere
inx
stx somewhere+1
inx
stx somewhere+2
inx
stx somewhere+3

どこかが RAM を指している場合、この場所にバイト $00、$01、$02、$03 がロードされます。これらのバイトは、これらの値をロードした後、RAM を他の値で上書きするまで、RAM の場所にのみ存在します。

さて、あなたの例について言えば、これは実際には紛らわしいものです。これは、常に 16 バイトの長さである iNES ヘッダー形式のバイトを定義するためです。これらのバイトは ROM や RAM の一部ではなく、PC に NES ROM を格納するための単なるヘッダー規則です。

あなたが見た例は、実際にはそうではないのに、ヘッダが ROM の一部であるとアセンブラに思わせるだけです。それを行う方法の 1 つにすぎません。別の方法は、アセンブラでクリーンな「生の」ROM イメージを生成し、ビルド時に iNES ヘッダーを個別に追加することです。これが私が個人的に行っている方法です。

これが役に立ったことを願っています。

于 2015-03-02T09:03:14.270 に答える