CPU Test Mode

From NESdev Wiki
Revision as of 03:10, 14 November 2021 by Lidnariq (talk | contribs) (→‎2A03E / 2A03G Test Mode: no test mode in 2A03E)
Jump to navigationJump to search

2A03E ???

The schematic for the Playchoice 10 permits the supervisor CPU to stop or "res" the 2A03E; the signal is synchronized to M2 before it gets into the 2A03E. Testing with just a button only crashed the 2A03E, so the synchronization must be necessary.

2A03G / 2A03H Test Mode

Pin 30 of the 2A03 revision G can be activated to enable a special test mode for the APU. This activates registers for testing the APU at $4018-$401A at the expense of deactivating the joypad input registers at $4016-$4017:

R$4018: [BBBB AAAA] - current instant DAC value of B=pulse2 and A=pulse1 (either 0 or current volume)
R$4019: [NNNN TTTT] - current instant DAC value of N=noise (either 0 or current volume) 
                      and T=triangle (anywhere from 0 to 15)
R$401A: [.DDD DDDD] - current instant DAC value of DPCM channel (same as value written to $4011)
W$401A: [L..T TTTT] - set state of triangle's sequencer to T, and lock all channels 
                      (pulse+noise always output current volume, triangle/DPCM no longer advance) if L=1

2A03letterless Programmable Interval Timer

Visual inspection of the original 2A03 revision indicates there was planned IRQ functionality from $401C-$401F, but this was left unfinished and unusable and was outright removed from later CPU revisions.

W$401C,D,E: write lower, middle, upper bits of counter reload value
R$401C,D,E: read lower, middle, upper bits of current counter value
W$401F: [ELAC DTZC]
         |||| ||||
         |||+----+-- Clock source
         |||  |||    00: M2÷16   10: M2÷256
         |||  |||    01: Rising edges of JOY2  11: Falling edges of JOY2
         |||  ||+--- Exists but does nothing. Toggles (invisibly) on terminal count.
         |||  |+---- Value driven out on JOY1. Toggles on terminal count.
         |||  +----- 1:count up; 0:count down
         ||+-------- 1:automatic reload when counter reaches 0; 0:counter stops while zero
         |+--------- 1:reload immediately
         +---------- 1:IRQ enabled (counts regardless)
R$401F: [E... ...I]
         |       |
         |       +-- Timer IRQ would be asserted if enabled
         +---------- IRQ is enabled
        Reads from $401F acknowledge the IRQ

See also