mirror of
https://github.com/daniel5151/ANESE.git
synced 2025-04-02 10:32:00 -04:00
647 lines
15 KiB
Text
Executable file
647 lines
15 KiB
Text
Executable file
NES PPU Read Buffer Tests
|
|
----------------------------------
|
|
This mammoth test pack tests many aspects of the NES system,
|
|
mostly centering around the PPU $2007 read buffer.
|
|
|
|
The test will take about 20 seconds.
|
|
|
|
The program attempts to do as many tests as possible before
|
|
reporting the result. When the screen is blanked for a long
|
|
time, audio is used to report progress. A low-pitched fat
|
|
tone indicates failure; bright beeps indicate progress.
|
|
|
|
If a sub-test fails, at a certain point the list of all
|
|
failed tests is provided in a numeric form, and a textual
|
|
explanation of the first failed test is shown.
|
|
|
|
|
|
Full list of tests performed is below.
|
|
Note that the tests are not performed in a numerical order.
|
|
For example, test #47 (does palette reading work at all) is
|
|
performed before test #7 (does sequential palette reading work).
|
|
|
|
Test 2 (TEST_PPUMEMORYIO):
|
|
|
|
PPU memory I/O does not work.
|
|
Possible areas of problem:
|
|
- PPU not implemented
|
|
- PPU memory writing ($2007)
|
|
- PPU memory reading ($2007)
|
|
- PPU memory area $2C00-$2FFF
|
|
|
|
Test 3 (TEST_ONEBYTEBUFFER):
|
|
|
|
Non-palette PPU memory reads
|
|
should have one-byte buffer.
|
|
|
|
Test 4 (TEST_CIRAM_READ):
|
|
|
|
CIRAM reading
|
|
does not work.
|
|
|
|
Test 5 (TEST_CIRAM_SEQ_READ_1):
|
|
|
|
Sequential CIRAM reading
|
|
with 1-byte increment
|
|
does not work.
|
|
|
|
Test 6 (TEST_CIRAM_SEQ_READ_32):
|
|
|
|
Sequential CIRAM reading
|
|
with 32-byte increment
|
|
does not work.
|
|
|
|
Test 7 (TEST_PALETTE_RAM_SEQ_READ_1):
|
|
|
|
Sequential PALETTE reading
|
|
with 1-byte increment
|
|
does not work.
|
|
|
|
Test 8 (TEST_PALETTE_RAM_SEQ_READ_32):
|
|
|
|
Sequential PALETTE reading
|
|
with 32-byte increment
|
|
does not work.
|
|
|
|
Test 9 (TEST_CHRROM_READ):
|
|
|
|
CHR-ROM reading
|
|
does not work.
|
|
|
|
Test 10 (TEST_CHRROM_SEQ_READ_1):
|
|
|
|
Sequential CHR-ROM reading
|
|
with 1-byte increment
|
|
does not work.
|
|
|
|
Test 11 (TEST_CHRROM_SEQ_READ_32):
|
|
|
|
Sequential CHR-ROM reading
|
|
with 32-byte increment
|
|
does not work.
|
|
|
|
Test 12 (TEST_CIRAM_SEQ_WRITE_1):
|
|
|
|
Sequential CIRAM writes
|
|
with 1-byte increment
|
|
does not work.
|
|
|
|
Test 13 (TEST_CIRAM_SEQ_WRITE_32):
|
|
|
|
Sequential CIRAM writes
|
|
with 32-byte increment
|
|
does not work.
|
|
|
|
Test 14 (TEST_NTA_MIRRORING_FAIL_1NTA):
|
|
|
|
1-nametable setup seems to
|
|
be active, even though this
|
|
ROM is explicitly configured
|
|
for horizontal mirroring.
|
|
|
|
Test 15 (TEST_NTA_MIRRORING_FAIL_4NTA):
|
|
|
|
Four-screen setup seems to
|
|
be active, even though this
|
|
ROM is explicitly configured
|
|
for horizontal mirroring.
|
|
|
|
Test 16 (TEST_NTA_MIRRORING_FAIL_VERT):
|
|
|
|
Vertical mirroring seems to
|
|
be active, even though this
|
|
ROM is explicitly configured
|
|
for horizontal mirroring.
|
|
|
|
Test 17 (TEST_PPU_OPEN_BUS):
|
|
|
|
Any data that is transferred
|
|
through PPU I/O should linger
|
|
and be readable for a while
|
|
in any PPU register that does
|
|
not have a read function.
|
|
This is called "open bus".
|
|
To minimally pass this test,
|
|
you need to at least provide
|
|
a bridge between $2003(W) and
|
|
$2000(R).
|
|
|
|
Test 18 (TEST_PPU_OPEN_BUS_SHORTCUT):
|
|
|
|
Reading a write-only PPU
|
|
register should not just give
|
|
the current value of SPRADDR.
|
|
That would be a too lazy
|
|
workaround for a failed test!
|
|
|
|
Test 19 (TEST_PPU_OPENBUS_MUST_NOT_COPY_READBUFFER):
|
|
|
|
PPU memory read buffer is not
|
|
the open bus. Reading the bus
|
|
should repeat the last value
|
|
that was transferred, not
|
|
disclose the buffered byte.
|
|
|
|
Test 20 (TEST_PPU_OPENBUS_FROM_WRITE2000_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2000 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 21 (TEST_PPU_OPENBUS_FROM_WRITE2001_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2001 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 22 (TEST_PPU_OPENBUS_FROM_WRITE2002_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2002 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 23 (TEST_PPU_OPENBUS_FROM_WRITE2003_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2003 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 24 (TEST_PPU_OPENBUS_FROM_WRITE2004_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2004 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 25 (TEST_PPU_OPENBUS_FROM_WRITE2005_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2005 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 26 (TEST_PPU_OPENBUS_FROM_WRITE2006_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2006 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 27 (TEST_PPU_OPENBUS_FROM_WRITE2007_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A write to $2007 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 28 (TEST_PPU_OPENBUS_FROM_READ2000_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2000 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 29 (TEST_PPU_OPENBUS_FROM_READ2001_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2001 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 30 (TEST_PPU_OPENBUS_FROM_READ2002_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2002 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 31 (TEST_PPU_OPENBUS_FROM_READ2003_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2003 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 32 (TEST_PPU_OPENBUS_FROM_READ2004_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2004 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 33 (TEST_PPU_OPENBUS_FROM_READ2005_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2005 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 34 (TEST_PPU_OPENBUS_FROM_READ2006_MUST_NOT_WRITETO_READBUFFER):
|
|
|
|
A read from $2006 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 35 (TEST_PPU_OPENBUS_INDEXED):
|
|
|
|
STA $2000,Y with Y=7 must
|
|
issue a dummy read to $2007.
|
|
|
|
Test 36 (TEST_PPU_OPENBUS_INDEXED2):
|
|
|
|
STA $1FF0,Y with Y=$17 mustn't
|
|
issue a dummy read to $2007.
|
|
|
|
Test 37 (TEST_PPU_OPENBUS_FROM_READ_MIRROR_MUST_WRITETO_READBUFFER):
|
|
|
|
A read from a mirrored copy
|
|
of $2007 must act as if
|
|
$2007 was read, and update
|
|
the same read buffer.
|
|
|
|
Test 38 (TEST_PPU_READ_WITH_AND):
|
|
|
|
The AND instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 39 (TEST_PPU_READ_WITH_ORA):
|
|
|
|
The ORA instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 40 (TEST_PPU_READ_WITH_EOR):
|
|
|
|
The EOR instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 41 (TEST_PPU_READ_WITH_CMP):
|
|
|
|
The CMP instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 42 (TEST_PPU_READ_WITH_CPX):
|
|
|
|
The CPX instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 43 (TEST_PPU_READ_WITH_CPY):
|
|
|
|
The CPY instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 44 (TEST_PPU_READ_WITH_ADC):
|
|
|
|
The ADC instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 45 (TEST_PPU_READ_WITH_SBC):
|
|
|
|
The SBC instruction must be
|
|
usable for reading $2007
|
|
or any other I/O port.
|
|
|
|
Test 46 (TEST_ONEBYTEBUFFER_PALETTE):
|
|
|
|
Palette reads from PPU should
|
|
not have one-byte buffer.
|
|
|
|
Test 47 (TEST_PALETTE_READS):
|
|
|
|
Palette reads from PPU do not
|
|
seem to be working at all.
|
|
|
|
Test 48 (TEST_PALETTE_READS_UNRELIABLE):
|
|
|
|
Palette reads from PPU seem
|
|
to work randomly.
|
|
|
|
Test 49 (TEST_PALETTE_MIRRORS):
|
|
|
|
Palette indexes $3F1x should
|
|
be mirrors of $3F0x when
|
|
x is 0, 4, 8, or C.
|
|
|
|
Test 50 (TEST_PALETTE_UNIQUE):
|
|
|
|
It must be possible to store
|
|
unique data in each of $3F00,
|
|
$3F04, $3F08 and $3F0C.
|
|
|
|
Test 51 (TEST_PPU_PALETTE_WRAP):
|
|
|
|
PPU addresses 3F00-3F1F
|
|
should be mirrored within
|
|
the whole 3F00-3FFF region,
|
|
for a total of 8 times.
|
|
|
|
Test 52 (TEST_PPU_MEMORY_14BIT_A):
|
|
|
|
Failed sub-test 1 of:
|
|
The two MSB within the PPU
|
|
memory address should be
|
|
completely ignored in all
|
|
circumstances, effectively
|
|
mirroring the 0000-3FFF
|
|
address range within the
|
|
whole 0000-FFFF region,
|
|
for a total of 4 times.
|
|
|
|
Test 53 (TEST_PPU_MEMORY_14BIT_B):
|
|
|
|
Failed sub-test 2 of:
|
|
The two MSB within the PPU
|
|
memory address should be
|
|
completely ignored in all
|
|
circumstances, effectively
|
|
mirroring the 0000-3FFF
|
|
address range within the
|
|
whole 0000-FFFF region,
|
|
for a total of 4 times.
|
|
|
|
Test 54 (TEST_PPU_MIRROR_3000):
|
|
|
|
PPU memory range 3000-3EFE
|
|
should be a mirror of the
|
|
PPU memory range 2000-2EFE.
|
|
|
|
Test 55 (TEST_PPU_READ_3EFF):
|
|
|
|
Setting PPU address to 3EFF
|
|
and reading $2007 twice
|
|
should give the data at
|
|
$3F00, not the data at $2EFF.
|
|
|
|
Test 56 (TEST_PPU_MIRROR_2F):
|
|
|
|
Reading PPU memory range 3Fxx
|
|
should put contents of 2Fxx
|
|
into the read buffer.
|
|
|
|
Test 57 (TEST_PPU_SEQ_READ_WRAP):
|
|
|
|
Setting PPU address to 3FFF
|
|
& reading $2007 thrice should
|
|
give the contents of $0000.
|
|
|
|
Test 58 (SEQ_READ_INTERNAL):
|
|
|
|
Unexpected: VROM contents at
|
|
$0000 and $1FFF read the same.
|
|
This should never happen in
|
|
this test ROM.
|
|
|
|
Test 59 (TEST_VADDR):
|
|
|
|
Relationship between $2005
|
|
and $2006 is not implemented
|
|
properly. Here is a guide.
|
|
It explains which registers
|
|
use which parts of the address.
|
|
Note that only the second
|
|
write to $2006 updates the
|
|
address really used by $2007.
|
|
FEDCBA9876543210ZYX: bit pos.
|
|
^^^^^^^^^^^^^^------ =$2007
|
|
zz543210-------------- $2006#1
|
|
76543210------ $2006#2
|
|
76543210--- $2005#1
|
|
210--76543----------- $2005#2
|
|
10---------------- $2000
|
|
|
|
Test 60 (TEST_RAM_MIRRORING):
|
|
|
|
CPU RAM at 0000-07FF should
|
|
be mirrored 4 times, in the
|
|
following address ranges:
|
|
- 0000-07FF
|
|
- 0800-0FFF
|
|
- 1000-17FF
|
|
- 1800-1FFF
|
|
|
|
Test 61 (TEST_PPUIO_MIRRORING):
|
|
|
|
PPU I/O memory at 2000-2007
|
|
should be mirrored within the
|
|
whole 2000-3FFF region, for
|
|
a total of 1024 times.
|
|
|
|
Test 62 (TEST_SPHIT_AND_VBLANK):
|
|
|
|
Sprite 0 hit flag should not
|
|
read as set during vblank.
|
|
|
|
Test 63 (TEST_SPHIT_DIRECT):
|
|
|
|
Sprite 0 hit test by poking
|
|
data directly into $2003-4
|
|
^ Possible causes for failure:
|
|
- $2003/$2004 not implemented
|
|
- No sprite 0 hit tests
|
|
- Way too long vblank period
|
|
|
|
Test 64 (TEST_SPHIT_DIRECT_READBUFFER):
|
|
|
|
Sending 5 bytes of data into
|
|
$2003 and $2004 must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 65 (TEST_SPHIT_DMA_ROM):
|
|
|
|
Sprite 0 hit test using DMA
|
|
($4014) using ROM as source
|
|
^ Possible causes for failure:
|
|
- $4014 DMA cannot read from
|
|
anything other than RAM
|
|
|
|
Test 66 (TEST_SPHIT_DMA_READBUFFER):
|
|
|
|
Invoking a $4014 DMA with a
|
|
non-$20 value must not
|
|
overwrite the $2007 read
|
|
buffer.
|
|
|
|
Test 67 (TEST_SPHIT_DMA_PPU_BUS):
|
|
|
|
Sprite 0 hit test using DMA
|
|
($4014) using PPU I/O bus
|
|
as source
|
|
^ In this test, $4014 <- #$20.
|
|
Possible causes for failure:
|
|
- DMA does not do proper reads
|
|
- PPU bus does not preserve
|
|
last transferred values
|
|
- $2002 read returned a value
|
|
that differs from expected
|
|
- $2004 read modifies the OAM
|
|
|
|
Test 68 (TEST_DMA_PPU_SIDEEFFECT):
|
|
|
|
Writing $20 into $4014 should
|
|
generate 32 reads into $2007
|
|
as a side-effect, each time
|
|
incrementing the PPU read
|
|
address.
|
|
|
|
Test 69 (TEST_SPHIT_DMA_RAM):
|
|
|
|
Sprite 0 hit test using DMA.
|
|
All internal RAM pages are
|
|
tested, including mirrored
|
|
addresses. Failing the test
|
|
may imply faulty mirroring.
|
|
|
|
Test 70 (TEST_CHRROM_READ_BANKED):
|
|
|
|
CHR ROM read through $2007
|
|
does not honor mapper 3
|
|
(CNROM) bank switching
|
|
|
|
Test 71 (TEST_CHRROM_READ_BANKED_BUFFER):
|
|
|
|
The $2007 read buffer should
|
|
not retroactively react to
|
|
changes in VROM mapping.
|
|
When you read $2007, the
|
|
data is stored in a buffer
|
|
("latch"), and the previous
|
|
content of the buffer is
|
|
returned. It is not a delayed
|
|
read request.
|
|
|
|
Test 72 (TEST_CHRROM_WRITE):
|
|
|
|
CHR ROM on mapper 3 (CNROM boards)
|
|
must not be writable.
|
|
|
|
Test 73 (TEST_BUFFER_DELAY_BLANK_1FRAME):
|
|
|
|
The PPU read buffer should
|
|
survive 1 frame of idle
|
|
with rendering disabled.
|
|
|
|
Test 74 (TEST_BUFFER_DELAY_BLANK_2SECONDS):
|
|
|
|
The PPU read buffer should
|
|
survive 2 seconds of idle
|
|
with rendering disabled.
|
|
|
|
Test 75 (TEST_BUFFER_DELAY_INTERNAL):
|
|
|
|
Unexpected: VROM contents at
|
|
$1Bxx did not match what was
|
|
hardcoded into the program.
|
|
|
|
Test 76 (TEST_BUFFER_DELAY_VISIBLE_1FRAME):
|
|
|
|
The PPU read buffer should
|
|
survive 1 frame of idle
|
|
with rendering enabled.
|
|
|
|
Test 77 (TEST_BUFFER_DELAY_VISIBLE_1SECOND):
|
|
|
|
The PPU read buffer should
|
|
survive 1 second of idle
|
|
with rendering enabled.
|
|
|
|
Test 78 (TEST_BUFFER_DELAY_VISIBLE_3SECONDS):
|
|
|
|
The PPU read buffer should
|
|
survive 3 seconds of idle
|
|
with rendering enabled.
|
|
|
|
Test 79 (TEST_BUFFER_DELAY_VISIBLE_7SECONDS):
|
|
|
|
The PPU read buffer should
|
|
survive 7 seconds of idle
|
|
with rendering enabled.
|
|
|
|
|
|
|
|
Expected output:
|
|
|
|
TEST:test_ppu_read_buffer :)
|
|
-------------------------------
|
|
Testing basic PPU memory I/O.
|
|
Performing tests that combine
|
|
sprite 0 hit flag, $4014 DMA
|
|
and the RAM mirroring...
|
|
Graphical artifacts during
|
|
this test are OK and expected.
|
|
|
|
Hit No-Hit
|
|
Direct poke OK OK
|
|
DMA with ROM OK OK
|
|
DMA + PPU bus OK OK
|
|
DMA with RAM OK OK
|
|
-------------------------------
|
|
This next test will take a while.
|
|
In order to distract you with
|
|
entertainment, art is provided.
|
|
Contemplate on the art while
|
|
the test is in progress.
|
|
|
|
|
|
Passed
|
|
|
|
The ":)" should be blue/purple; the "OK" should be brownish
|
|
orange, and the "Graphical artifacts" paragraph should
|
|
also be brownish orange. Everything else should be white.
|
|
|
|
In the painting by Thomas Kinkade that is shown before
|
|
the "Passed" text appears, the ground should be pleasantly
|
|
green.
|
|
|
|
|
|
The text outputted to the $6000 console is
|
|
slightly different than the reference shown above,
|
|
because parts of the text above are placed on the
|
|
screen directly, and for other reasons.
|
|
|
|
|
|
Because this ROM contains a large amount of text and
|
|
some graphics data, portions of the ROM had to be
|
|
compressed to avoid increasing the ROM size too much.
|
|
Should one want to rebuild the ROM, a particular set
|
|
of tools will be needed; including nasm, gcc, and php.
|
|
|
|
|
|
Flashes, clicks, other glitches
|
|
-------------------------------
|
|
If a test prints "passed", it passed, even if there were some flashes or
|
|
odd sounds. Only a test which prints "done" at the end requires that you
|
|
watch/listen while it runs in order to determine whether it passed. Such
|
|
tests involve things which the CPU cannot directly test.
|
|
|
|
|
|
Alternate output
|
|
----------------
|
|
Tests generally print information on screen, but also report the final
|
|
result audibly, and output text to memory, in case the PPU doesn't work
|
|
or there isn't one, as in an NSF or a NES emulator early in development.
|
|
|
|
After the tests are done, the final result is reported as a series of
|
|
beeps (see below). For NSF builds, any important diagnostic bytes are
|
|
also reported as beeps, before the final result.
|
|
|
|
|
|
Output at $6000
|
|
---------------
|
|
All text output is written starting at $6004, with a zero-byte
|
|
terminator at the end. As more text is written, the terminator is moved
|
|
forward, so an emulator can print the current text at any time.
|
|
|
|
The text output may include ANSI color codes, which take the form of
|
|
an esc character ($1B), an opening bracket ('['), and a sequence of
|
|
numbers and semicolon characters, terminated by a non-digit character ('m').
|
|
|
|
The test status is written to $6000. $80 means the test is running, $81
|
|
means the test needs the reset button pressed, but delayed by at least
|
|
100 msec from now. $00-$7F means the test has completed and given that
|
|
result code.
|
|
|
|
To allow an emulator to know when one of these tests is running and the
|
|
data at $6000+ is valid, as opposed to some other NES program, $DE $B0
|
|
$G1 is written to $6001-$6003.
|
|
|
|
|
|
--
|
|
Joel Yliluoma <bisqwit@iki.fi>
|
|
Shay Green <gblargg@gmail.com>
|