CPU power up state: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (Text description of noise channel test link.)
No edit summary
Line 4: Line 4:
:P = $34<ref>The [[Emulator tests|golden log of nestest]] differs from this in the [[CPU status flag behavior|irrelevant bits 5 and 4 of P]]</ref> (IRQ disabled)<ref>IRQ was first asserted about 1/60 second after power-up, by APU.</ref>
:P = $34<ref>The [[Emulator tests|golden log of nestest]] differs from this in the [[CPU status flag behavior|irrelevant bits 5 and 4 of P]]</ref> (IRQ disabled)<ref>IRQ was first asserted about 1/60 second after power-up, by APU.</ref>
:A, X, Y = 0
:A, X, Y = 0
:S = $FD
:S = $FD<ref name="reset-stack-push">This is due to RESET actually pushing PC and P onto the stack, even though they aren't actually used. See [https://www.youtube.com/watch?v=fWqBmmPQP40&t=41m45s 27c3: Reverse Engineering the MOS 6502 CPU (en)] from 41:45 onward for details</ref>
:$4017 = $00 (frame irq enabled)
:$4017 = $00 (frame irq enabled)
:$4015 = $00 (all channels disabled)
:$4015 = $00 (all channels disabled)
Line 15: Line 15:
==After reset==
==After reset==
:A, X, Y were not affected
:A, X, Y were not affected
:S was decremented by 3 (but nothing was written to the stack)
:S was decremented by 3 (but nothing was written to the stack)<ref name="reset-stack-push" />
:The I (IRQ disable) flag was set to true (status ORed with $04)
:The I (IRQ disable) flag was set to true (status ORed with $04)
:The internal memory was unchanged
:The internal memory was unchanged

Revision as of 10:51, 1 July 2019

The following results are from a US (NTSC) NES, original front-loading design, RP2A03G CPU chip, NES-CPU-07 main board revision, manufactured in 1988. The memory values are probably slightly different for each individual NES console. Please note that you should NOT rely on the state of any registers after Power-UP and especially not the stack register and RAM ($0000-$07FF).

At power-up

P = $34[1] (IRQ disabled)[2]
A, X, Y = 0
S = $FD[3]
$4017 = $00 (frame irq enabled)
$4015 = $00 (all channels disabled)
$4000-$400F = $00 (not sure about $4010-$4013)
All 15 bits of noise channel LFSR = $0000[4]. The first time the LFSR is clocked from the all-0s state, it will shift in a 1.
Internal memory ($0000-$07FF) has unreliable startup state. Some machines may have consistent RAM contents at power-on, but others do not.
  • Emulators often implement a consistent RAM startup state (e.g. all $00 or $FF, or a particular pattern), and flash carts like the PowerPak may partially or fully initialize RAM before starting a program, so an NES programmer must be careful not to rely on the startup contents of RAM.

After reset

A, X, Y were not affected
S was decremented by 3 (but nothing was written to the stack)[3]
The I (IRQ disable) flag was set to true (status ORed with $04)
The internal memory was unchanged
APU mode in $4017 was unchanged
APU was silenced ($4015 = 0)

See also

Notes

  1. The golden log of nestest differs from this in the irrelevant bits 5 and 4 of P
  2. IRQ was first asserted about 1/60 second after power-up, by APU.
  3. 3.0 3.1 This is due to RESET actually pushing PC and P onto the stack, even though they aren't actually used. See 27c3: Reverse Engineering the MOS 6502 CPU (en) from 41:45 onward for details
  4. Noise channel init log