VS Hogan's Alley

Discuss emulation of the Nintendo Entertainment System and Famicom.

Moderator: Moderators

User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

VS Hogan's Alley

Post by oRBIT2002 »

I've been doing a bit of debugging on this one. It seems to use four-screen mode (not documented anywhere and the bit is currently not set in the INES header in the GoodNESs ROMset..). I've been trying to convert it from mapper 99 to mapper 1 (with four-screen set in the header).
However the issues starts here. Is there anything stopping a mapper1 game working with four-screen layout? I haven't tried my code on real hardware but emulators behave
really odd here (Latest FCEUX shows nothing in the Nametables-debug view, it's blank). Nintendulator doesn't seem to support four-screen properly either when the ROM is set to mapper 1 (no issues with mapper 99 however). Is the mirroring-settings in MMC1 conflict with the four-screen layout?
Can anyone shed some light on this?
Thanks.
User avatar
koitsu
Posts: 4203
Joined: Sun Sep 19, 2004 9:28 pm
Location: A world gone mad

Re: VS Hogan's Alley

Post by koitsu »

I imagine the problem is that emulators note that the game is using MMC1 and thus only support V or H mirroring -- meaning writes to $2800-2FFF result in V/H mirroring being applied and not external on-cartridge RAM. References:

http://wiki.nesdev.com/w/index.php/PPU_nametables
http://wiki.nesdev.com/w/index.php/Mirr ... creen_VRAM
http://wiki.nesdev.com/w/index.php/INES_Mapper_004

Note this quote from that last URL:
4-screen mirroring for these boards is hardwired! When in 4-screen mode, your emu must ignore writes to the
mirroring reg.
You have to kind of "read between the lines" to conclude what I did above about 4-screen. If you converted the game to use mapper 4 (MMC3) you'd be able to use 4-screen.

Whether or not 4-screen on MMC1 on actual hardware would work, I don't know -- hardware guys here can surely tell you if that's the case. However it's safe to say no one would be able to play the game in any emulators.
Sik
Posts: 1589
Joined: Thu Aug 12, 2010 3:43 am

Re: VS Hogan's Alley

Post by Sik »

I'll never get why Nintendo didn't make mirroring a bit in the PPU registers rather than hardwiring it in the cartridge... And yeah, I know, looking at the registers it seems like they ran out of bits, but I think I'd have rather hardwired the EXT setting and given the mirroring setting that bit instead.
tepples
Posts: 22345
Joined: Sun Sep 19, 2004 11:12 pm
Location: NE Indiana, USA (NTSC)
Contact:

Re: VS Hogan's Alley

Post by tepples »

Sik wrote:I'll never get why Nintendo didn't make mirroring a bit in the PPU registers rather than hardwiring it in the cartridge
The problem isn't register bits; there are 8 available bits in $2002.W. I'd guess pin count. It already has to interleave address and data. And that's probably also why sprite 0 doesn't assert /IRQ.
Sik
Posts: 1589
Joined: Thu Aug 12, 2010 3:43 am

Re: VS Hogan's Alley

Post by Sik »

tepples wrote:The problem isn't register bits; there are 8 available bits in $2002.W.
$2002 is already used for reading and it's very likely that making it read/write would have made it a tad worse.
tepples wrote:I'd guess pin count. It already has to interleave address and data.
Aren't there more bits above already? I recall elsewhere being mentioned that it's possible to point the nametable to CHR-ROM (and Afterburner does it - I guess it makes sense, it'd need to completely rewrite it otherwise, which is too slow).
tepples wrote:And that's probably also why sprite 0 doesn't assert /IRQ.
Actually, not asserting anything on sprite collision was very common on video hardware (i.e. it isn't just a Nintendo thing), it seems that merely providing the status bit was considered enough =P That the collision test in hardware went almost universally ignored probably didn't help - in the NES it's more heard of only because of the complete lack of a proper way to do mid-screen timing without custom hardware. If there was a scanline counter or something nobody would have touched it.
lidnariq
Posts: 10677
Joined: Sun Apr 13, 2008 11:12 am
Location: Seattle

Re: VS Hogan's Alley

Post by lidnariq »

The "four screen" bit should be an override in all mappers. But most emulators don't seem to treat it that way: hence the problem I fixed in Vs. Goonies. If the game actually uses 4 screens of data, your best hope is to switch the mirroring control register as time goes on.

Tangentially related, why do you keep targeting MMC1 instead of simpler mappers like CNROM?
tepples wrote:And that's probably also why sprite 0 doesn't assert /IRQ.
I thought I remember reading that that was avoiding infringing some patent? Maybe US4423870?
Sik wrote:$2002 is already used for reading and it's very likely that making it read/write would have made it a tad worse.
Doubtful; it's not like reads to write-only registers cause weird values to be written or and we're pretty certain that writes to read-only registers don't cause a bus conflict. It'd just be a little more die area.
Sik
Posts: 1589
Joined: Thu Aug 12, 2010 3:43 am

Re: VS Hogan's Alley

Post by Sik »

lidnariq wrote:Tangentially related, why do you keep targeting MMC1 instead of simpler mappers like CNROM?
Flashcarts? (guessing here)
lidnariq wrote:
Sik wrote:$2002 is already used for reading and it's very likely that making it read/write would have made it a tad worse.
Doubtful; it's not like reads to write-only registers cause weird values to be written or and we're pretty certain that writes to read-only registers don't cause a bus conflict. It'd just be a little more die area.
That "little more die area" is exactly what would have made it a tad worse. Don't underestimate how much it could have costed (or what else may have needed to be sacrificed in order to get it there).

Really, if this wasn't a problem chances are they'd have made the status register overlap some of the write-only registers in the first place (much like how the TMS9918-based chips have a port as control port when writing and status port when reading).
User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

Re: VS Hogan's Alley

Post by oRBIT2002 »

I've probably used mapper1 by habit.. However it's pretty neat to have expansion RAM available and battery aswell.
However this title might work better with CNROM so I might check that out..

I've released a patch now for Hogan's Alley for people to try... Can't get it to run properly in any emulator so it will be exciting to see if it works on PowerPak/EverDrive..
lidnariq
Posts: 10677
Joined: Sun Apr 13, 2008 11:12 am
Location: Seattle

Re: VS Hogan's Alley

Post by lidnariq »

This game almost will work correctly with hardwired vertical mirroring (horizontal arrangement). You'll need to patch it to use the nametable at $2400 instead of $2800 if so. Alternatively, if you use MMC1, you could flip the mirroring control register at the appropriate times.

AFAICT, most Vs system games don't actually use all 4 KiB of nametable memory—they just treat as 2 screen mirroring, arranged however they want. Hogan's Alley apparently expects "whenever they want" too.
proveaux
Posts: 87
Joined: Wed Feb 15, 2012 10:19 pm

Re: VS Hogan's Alley

Post by proveaux »

Image
Looks 99% correct on FCEUX 2.2.0 but not on hardware for intro animation.

Image
When you shoot there is no white screen so can't play.

Image
Some palettes not correct on hardware for targets but look ok on FCEUX 2.2.0.

Image
Was only able to catch on camera a few times and not for all instances.
User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

Re: VS Hogan's Alley

Post by oRBIT2002 »

Thanks for the screenshot. The titlescreen indicates that four-screen doesn't work properly on hardware either, and the other screenshots is a result of that..
User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

Re: VS Hogan's Alley

Post by oRBIT2002 »

Emulators that uses checksums to optimize ROMs.. Sorry but I don't like it. :)
I can't test "Vs Zapper" emulation properly unless checksum fits on of the available ROMs released. Frustrating? Yep!

I've submitted a request to the FCEUX team to add "Vs Zapper" as selectable input, let's hope they listen.
tepples
Posts: 22345
Joined: Sun Sep 19, 2004 11:12 pm
Location: NE Indiana, USA (NTSC)
Contact:

Re: VS Hogan's Alley

Post by tepples »

oRBIT2002 wrote:I've submitted a request to the FCEUX team to add "Vs Zapper" as selectable input, let's hope they listen.
What's the SourceForge bug number of this request so that the rest of us can follow?
User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

Re: VS Hogan's Alley

Post by oRBIT2002 »

User avatar
oRBIT2002
Posts: 643
Joined: Sun Mar 19, 2006 3:06 am
Location: Gothenburg/Sweden

Re: VS Hogan's Alley

Post by oRBIT2002 »

I'm a bit stuck with this patch. I'm using the same code I previously used in "VS Duck Hunt", but no luck. It's like the sense-bit never gets triggered and I don't get it..

I think I've located the code that causes the problem. If I set the sensebit always to zero in the code below (in the unpatched version of the game) I get the same behaviour as my patch (never gets pass the player select screen).

Code: Select all

00:A1E1:A2 08     LDX #$08
00:A1E3:D0 02     BNE $A1E7
00:A1E5:A2 07     LDX #$07
00:A1E7:A9 01     LDA #$01
00:A1E9:05 18     ORA $0018 = #$04
00:A1EB:8D 16 40  STA $4016 = #$FF
00:A1EE:29 FE     AND #$FE
00:A1F0:85 18     STA $0018 = #$04
00:A1F2:8D 16 40  STA $4016 = #$FF
00:A1F5:A4 98     LDY $0098 = #$00
00:A1F7:B9 16 40  LDA $4016,Y @ $4016 = #$FF
00:A1FA:CA        DEX
00:A1FB:D0 FA     BNE $A1F7
00:A1FD:60        RTS 
The subroutine above gets called with X either 7 or 8. Which means, get trigger-bit if X=8 or get sense-bit if X=7.
I insert a JMP to my own code at $A1F7 and inserts the following code:

Code: Select all

Zapper:
		cpx #7
		beq ZapperSense
		
		cpx #8
		beq ZapperTrigger
		lda #0                  ;Never reached
		ldx #0
		rts

ZapperSense:
		ldx #0
		lda JOYPORT2
		and #%1000
		eor #%1000
		lsr
		lsr
		lsr
		rts
The result is EOR'd because the sense-bit is inverted on the VS-system. However it still never gets a sense-hit with this code..
Can anyone spot something obvious I've missed? As I mentioned, I've used this code in "VS Duck Hunt" successfully.
Post Reply