Загрузка #$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, как я это запрограммировал.
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
- См. https://wiki.nesdev.com/w/index.php/CPU_memory_map для получения дополнительной информации о карте памяти NES.
- См. https://wiki.nesdev.com/w/index.php/INES для получения дополнительной информации о заголовках iNES.
- См. https://wiki.nesdev.com/w/index.php/Init_code для более полной подпрограммы инициализации, которую вы, возможно, захотите использовать, если собираетесь в конечном итоге поговорить с PPU.