Skip to main content
NESdev Wiki
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

IRQ

IRQ (interrupt request) is a signal on the NES CPU. It is used to trigger a CPU interrupt.

If the CPU’s /IRQ input is 0 at the end of an instruction, then the CPU pushes the program counter and the processor status register, sets the I flag to ignore further IRQs, and the Program Counter takes the value read at $fffe and $ffff.

This behaviour is masked by the CPU’s interrupt-disable status flag. The SEI instruction disables IRQs, and the CLI instruction enables them.

/IRQ functions as an open collector input: it is normally 1, but any device on the CPU bus can pull it down to 0. An IRQ handler is expected to push any registers it uses, acknowledge the interrupt by writing to a port so that the source no longer forces /IRQ to 0, pull the registers back, and return with RTI.

Therefore if a program uses more than one source of IRQ, the priority between the conflicting interrupts should be handled in software.

Sources of IRQ on a Famicom or NES include

SourceEnableDisableAcknowledge
APU DMC finish$4010 write with bit 7 = 1$4010 write otherwiseDisable then reenable, or APU Status ($4015) write
APU Frame Counter$4017 write with bits 7-6 = 00$4017 write otherwiseAPU Status ($4015) read
MMC3Write to $E001Write to $E000Disable then reenable
MMC5Write $80 to $5204Write $00 to $5204Read $5204
VRC4/6/7depends on specific IC
FME-7write $81 to register $Dwrite even number to register $Dwrite anything to register $D
Namco 163write to $5000 and $5800$5800 write with bit 7 = 0write to $5000 or $5800
FDSWrite $02 to $4022Write $00 to $4022Read $4030

See also

Edit this page on GitHub