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