Code: Select all
0093FD LDX #$80 A:0000 X:0021 Y:0010 S:01FD DB:00 D:0000 P:17 e
0093FF STX $2115 [002115] A:0000 X:0080 Y:0010 S:01FD DB:00 D:0000 P:95 e
009402 REP #$10 A:0000 X:0080 Y:0010 S:01FD DB:00 D:0000 P:95 e
009404 LDA #$0000 A:0000 X:0080 Y:0010 S:01FD DB:00 D:0000 P:85 e
009407 LDX #$0200 A:0000 X:0080 Y:0010 S:01FD DB:00 D:0000 P:07 e
00940A STX $40 [000040] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00940C STA $2116 [002116] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00940F LDX $2139 [002139] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
009412 CPX $40 [000040] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
009414 BNE $9435 [009435] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:07 e
009416 INC $40 [000040] A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:07 e
009418 INC A A:0000 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
009419 INC A A:0001 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941A INC A A:0002 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941B INC A A:0003 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941C INC A A:0004 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941D INC A A:0005 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941E INC A A:0006 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
00941F INC A A:0007 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
009420 CMP #$0100 A:0008 X:0200 Y:0010 S:01FD DB:00 D:0000 P:05 e
009423 BNE $940C [00940C] A:0008 X:0200 Y:0010 S:01FD DB:00 D:0000 P:84 e
This is a VRAM dump:
Code: Select all
00022002555555555555555555555555
0102AAAAAAAAAAAAAAAAAAAAAAAAAAAA
0202FFFFFFFFFFFFFFFFFFFFFFFFFFFF
03020000000000000000000000000000
...
With the inc #8, it's setting the VRAM pointer to $00n0 (after multiplying by two) each test. It then tries to read the value from $2139, however: I fail this test because I don't immediately return the value read from VRAM, or basically, I treat the first read as a dummy read and return the previous read instead. My code looks like this:
Code: Select all
//VMDATALREAD
uint8 bPPU::mmio_r2139() {
uint16 addr = get_vram_address();
uint8 r = regs.vram_readbuffer;
if(regs.vram_incmode == 0) {
addr &= 0xfffe;
regs.vram_readbuffer = vram_read(addr);
regs.vram_readbuffer |= vram_read(addr + 1) << 8;
regs.vram_addr += regs.vram_incsize;
}
return r;
}
//VMDATAHREAD
uint8 bPPU::mmio_r213a() {
uint16 addr = get_vram_address() + 1;
uint8 r = regs.vram_readbuffer >> 8;
if(regs.vram_incmode == 1) {
addr &= 0xfffe;
regs.vram_readbuffer = vram_read(addr);
regs.vram_readbuffer |= vram_read(addr + 1) << 8;
regs.vram_addr += regs.vram_incsize;
}
return r;
}
get_vram_address() returns the absolute 64k address, not the word version thats written to $2116. It also adjusts for address remapping/etc. which isn't used in this test.
Basically, ZSNES and the SNES test program expect the VRAM read to return the full 16-bit value immediately after the first $2139/$213a read... can someone please explain what I'm doing wrong? :/
$73 is, AFAIK, supposed to be the RTO test, right? Probably be a while before I add support for that one...