6502單片機編程--中斷
中斷:
6502有3個中斷IRQ/BRK、NMI和RESET,每個中斷都有一個16位的向量,即指針,用來存放該中斷發生時中斷服務函數的地址。中斷發生時CPU都會把狀態標志和返回地址壓棧,然后調用中斷服務程序。
IRQ/BRK中斷由一下兩種情況產生:一是軟件通過BRK指令產生,一是硬件通過IRQ引腳產生。
RESET在開機的時候觸發,這是ROM被裝入,6502跳到RESET向量指向的地址沒有寄存器被修改,沒有內存被清空,這些都只在開機是發生。
NMI指不可屏蔽中斷,它在VBlank即屏幕刷新時發生,持續時間根據系統(NTSC/PAL)不同而不同。NTSC是每秒60次,而PAL是每秒50次。6502的中斷延時是7個時鐘周期,也就是說,進入和離開中斷都需要7個時鐘周期。它產生于PPU的每一幀結束,NMI中斷可以由$2000的第7位的1/0控制允許/禁止。
大部分中斷應該使用RTI指令返回,但是有些游戲不用,例如《最終幻想1》。它用一個很奇怪的方式:手工修改堆棧指針,然后執行RTS指令。這種方法在技術上是可行的,但是應該盡量避免。
以上中斷在ROM內有以下對應的地址:
6502有3個中斷IRQ/BRK、NMI和RESET,每個中斷都有一個16位的向量,即指針,用來存放該中斷發生時中斷服務函數的地址。中斷發生時CPU都會把狀態標志和返回地址壓棧,然后調用中斷服務程序。
IRQ/BRK中斷由一下兩種情況產生:一是軟件通過BRK指令產生,一是硬件通過IRQ引腳產生。
RESET在開機的時候觸發,這是ROM被裝入,6502跳到RESET向量指向的地址沒有寄存器被修改,沒有內存被清空,這些都只在開機是發生。
NMI指不可屏蔽中斷,它在VBlank即屏幕刷新時發生,持續時間根據系統(NTSC/PAL)不同而不同。NTSC是每秒60次,而PAL是每秒50次。6502的中斷延時是7個時鐘周期,也就是說,進入和離開中斷都需要7個時鐘周期。它產生于PPU的每一幀結束,NMI中斷可以由$2000的第7位的1/0控制允許/禁止。
大部分中斷應該使用RTI指令返回,但是有些游戲不用,例如《最終幻想1》。它用一個很奇怪的方式:手工修改堆棧指針,然后執行RTS指令。這種方法在技術上是可行的,但是應該盡量避免。
以上中斷在ROM內有以下對應的地址:
| 中斷地址 | 中斷 | 優先權 |
| $FFFA | NMI | 中 |
| $FFFC | RESET | 高 |
| $FFFE | IRQ/BRK | 低 |
NMI 非屏蔽中斷
IRQ/BRK 屏蔽中斷
RESET 開機中斷


評論