To preface, the establishment I work at has a recurring "Free Play" event.
As we have a number of games to sort through in the arcade, I began to think about possible solutions for reducing the amount of labor involved. While you can easily go through game settings and change the machine to "Free Play" mode, there's still a lot of churn involved.
The ultimate goal is to be able to set any/every game, regardless of manufacturer or type of machine, to a "Free Play" or coin-op mode remotely. Insert relevant buzzwords here. (IoT Pinball! Woo!)
I'm working out the low level hardware before implementing the controllers and developing the software stack.
What's involved in the WPC implementation is rather like what I've done with older Bally -35's: I use an EPROM twice (or more) the capacity of the original, program a it with a combined image of a normal ROM and a free play only ROM, run the most significant bit to the middle pole of a switch, and put the other switch poles on GND and VCC. This will be replaced with the appropriate control circuitry at a later point.
The difference between the Bally and the WPC implementation, though, is all in the software stack.
The first thing a WPC MPU does on cold boot is check the EPROM's checksum, then the ROM revision against what's previously stored in memory. Checksums can change out just fine on this platform. It's quite easy to calculate a new one after modifying the ROM image to set the boolean "Free Play" / "Home Use" bit to true. The check that matters the most is the revision label, which will most likely need to be forged.
You see, if the revision differs from what's stored in memory from the previous boot, a factory reset will occur. This isn't what we want.
I was able to generate a "Free Play Only" ROM for Fish Tales rev. L-5. Upon boot I found it running L-38, which was derived from the checksum. Ended up forging the revision label.
As a test rig, I took an Atmel 27C080, burnt it, then bent out the MSB (A19, Pin 1) and attached a toggle to it between VCC and GND.
The '080 was programmed with a concatenation of both ROM versions. After physical modification of the EPROM, it was then verified with both images using the '040 HI/LO bank toggle in the programmer.
After the forgery, Fish Tales stopped factory resetting. Both versions claimed L-5 with differing checksums.
What I ended up discovering is that you can change the "Free Play Only" bool on the fly. You might have to wait for the current frame to finish, but the next one that displays credit status should reflect what setting you have.
The resulting behavior is exactly what I anticipated and is a great stepping stone to full automation. While I can solve a lot more of this with modifying the game's code, this is a simple and realistic solution that's quite efficient in its implementation.
Now on to writing a ROM patching toolset for this...
Post edited by misentropy: clarification: poles.