跳轉到內容

NES 程式設計/初始化 NES

來自華夏公益教科書

雖然有一些 NES 編譯器可以使用高階語言(參見參考資料),但大多數 NES 程式設計都是使用匯編語言完成的。如果你還沒有這樣做,最好看一下之前的教程“關於組合語言的幾句話”。對於那些想了解更多關於 NES 組合語言資訊的人,請檢視下面提供的一些連結。對於下面的程式碼示例,我將使用 P65 彙編器,我認為它比 NesAsm 不那麼令人困惑。它也是用 Perl 編寫的,所以任何人都可以使用它。


INES 頭部

[編輯 | 編輯原始碼]

INES 頭部用於讓模擬器瞭解你試圖載入的 NES ROM 的規格。任何 nes 檔案的前三個位元組包含字元“NES”,後面跟著十六進位制 0x1A。注意,P65 的十六進位制值以“$”開頭。在這些初始資訊之後是兩個位元組,分別代表 16K Prg-Rom 塊和 8K Chr-Rom 塊的數量。在沒有對映器的情況下,最多可以有 2 個 Prg-Rom 塊。

; iNES header  

; iNES identifier
.byte "NES"
.byte $1a
; 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
; Filler
.byte $00,$00,$00,$00,$00,$00,$00,$00


中斷向量

[編輯 | 編輯原始碼]

NES 有三個中斷向量,它們代表 CPU 在發生某些型別的中斷時跳轉到的程式程式碼中的位置。NES 有三種不同的中斷:不可遮蔽中斷或 NMI($FFFA)、復位向量($FFFC)和 IRQ/BRK 向量($FFFE)。括號中的十六進位制值是 NES 在其中查詢要跳轉到的 16 位位置的地方。

通常,復位向量會指向你的程式碼的開頭,這取決於你擁有的 Prg-Rom 塊的數量,可以是 $8000 到 $BFFF 或 $C000 到 $FFFF 之間的某個位置。

不可遮蔽中斷是指當 PPU 重新整理螢幕時發生的中斷(也稱為 V-Blank 週期)。在此期間,螢幕可以在沒有任何閃爍效果的情況下更新。

最後,IRQ/BRK 中斷(我喜歡稱之為可遮蔽中斷)是在發生 BRK 命令時使用的。它通常由程式設計師用於各種目的。

示例

 reset:
 nmi:
 irq:
   rti
 ; ... more code
 .advance $FFFA
 .word nmi, reset, irqq; words pointing to the location of nmi, reset and irq.

程式設計 PPU

[編輯 | 編輯原始碼]

NES 上的圖形處理單元 (PPU) 負責將圖形顯示到螢幕上。它包含四個主要元件,用於顯示背景和精靈影像:模式表、名稱表、屬性表和精靈/影像調色盤。模式表儲存用於在螢幕上顯示任何內容的 8x8 或 8x16 畫素影像。這些影像中的每一個最多可以儲存四種不同的顏色。名稱表用於顯示背景影像,屬性表會影響可以顯示在背景上的顏色。最後是精靈和影像調色盤,它們分別包含前景精靈和背景影像的可能顏色。

模式表

敬請期待...

名稱表

敬請期待...

屬性表

敬請期待...

精靈和影像調色盤

敬請期待...

P65 彙編器 - 可移植的 6502 系列彙編器,本程式中所有示例程式碼都是使用它編寫的。

6502 彙編器指南 - 6502 組合語言世界的一個很好的介紹。

Nes Dev - 一個很棒的網站,提供了大量關於 NES 程式設計的資源,以及對替代編譯器的連結。

華夏公益教科書