From NESdev Wiki
Jump to navigationJump to search


From the decapsulated VRC7 image we have available, and with tracings of the lower layers provided by the user SCSR on Discord, I was able to build a preliminary visual chip simulator and analyze the IRQ counter:

  • The prescaler is actually implemented as 2 separate counters: one 2-bit that counts up to 2 before resetting and one 7-bit that counts up to 112 or 113 before resetting (with the condition ((B0 | A1) & B4 & B5 & B6)).
  • The prescaler runs even with the "M" bit is set, but it doesn't do anything.
  • When the "A" bit is set, the IRQ counter reloads once it overflows and then continues counting (e.g. $FD -> $FE -> $FF -> $xx + IRQ -> $xx+1 -> $xx+2 -> ...); when it is clear, it reloads and then turns off (e.g. $FD -> $FE -> $FF -> $xx + IRQ -> $xx -> ...).
  • When the "E" bit is clear, the prescaler and IRQ counter continue to run but no interrupts are generated.
  • Writing to the Control register immediately reloads the IRQ counter and resets the prescaler regardless of the data written.
  • Writing to the Acknowledge register does not copy the "A" bit to the "E" bit. This was tested as follows:
    • Setting E=1 and A=1 and writing to ACK post-IRQ acknowledges it and the counter continues running.
    • Setting E=1 and A=0 and writing to ACK post-IRQ acknowledges it but the counter remains stopped.
    • Setting E=1 and A=0 and writing to ACK pre-IRQ does not prevent the IRQ from firing.
    • Setting E=0 and A=1 and writing to ACK, even pre-IRQ, does not not cause interrupts to start happening.

It would be worth rerunning these tests on an actual VRC7, just in case the simulator I used contains errors (SCSR and I have both discovered and fixed multiple errors so far), and the earlier VRC chips should also be retested to see how they behave. --Quietust (talk) 14:47, 23 June 2022 (UTC)