Загрузка #$FF в A и сохранение по адресу $0000 не работает

Я изучаю ассемблер для NES, и я написал эту программу:

    .org $8000 ; set code to start of rom
Start:         ; make a label called start
    lda #$ff   ; set acc to 0xff
    sta $0000  ; store address 0x0000 to acc which is 0xff
    jmp Start  ; jump to label start

Я компилирую программу с помощью NESASM3, она успешно компилируется, затем запускаю ее в своем эмуляторе, когда я захожу в средство просмотра памяти в эмуляторе, смотрю на адрес $0000, это 01, а не FF, как я запрограммировал.


person TheRealSuicune    schedule 26.02.2019    source источник
comment
Это полный исходный код? Где находятся директивы заголовка iNES (.inesmap, .inesprg и т. д.)? Вы уверены, что код действительно выполняется (вы его пошагово проходили в отладчике эмулятора)?   -  person Michael    schedule 26.02.2019
comment
В стороне: LDA #$ff должен собираться в байты A9 FF, так как LDA # имеет код операции A9. Таким образом, вы ожидаете увидеть A9 в качестве первого байта, а не FF, и, поскольку вы установили .org в $8000, вы ожидаете увидеть его по адресу $8000, а не по нулевому. В противном случае см. ответ Майкла о настройке векторов NMI, start и IRQ, чтобы 6502 знал, с чего начать выполнение, а также поля, специфичные для NES, необходимые для гарантии определенного расположения памяти.   -  person Tommy    schedule 27.02.2019


Ответы (1)


В вашем коде отсутствует куча информации, необходимой для того, чтобы эмулятор знал, что это за ПЗУ, и чтобы NES знала, где он должен начать выполнение.

Рабочий пример может выглядеть примерно так (проверено в FCEU):

   ; ROM header
   .inesprg    2        ; Two 16k PRG-ROM banks
   .ineschr    1        ; One 8k CHR-ROM bank
   .inesmir    1        ; Vertical mirroring
   .inesmap    0        ; Mapper 0 (none)

   .bank 0
   .org $8000 ; set code to start of rom
Start:         ; make a label called start
    lda #$ff   ; set acc to 0xff
    sta $0000  ; store address 0x0000 to acc which is 0xff
    jmp Start  ; jump to label start

; Dummy interrupt handlers 
nmi: 
irq:
    rti

; Specify reset and interrupt vectors

    .bank 3       ; The .bank directive uses 8kB granularity, so bank 3
                  ; is final 8kB chunk of our 32kB PRG-ROM.
 .org  $fffa
    .dw   nmi
    .dw   Start
    .dw   irq   
person Michael    schedule 26.02.2019