ok, I'm narrowing this down...
The stack isn't dipping too low, I wrote some code to display at all times when the stack falls into $240, $230, $220, and $210. I have yet to see it at $230 it dips into (below) $240 as soon as you start a game - so the stack bottom is between $230 and $240. That's really good, because it means that I'm not clobbering the virtual ball registers, and that there might be some room to use the lower part of the stack if needed (stock, the game uses $200-$20f already).
I'm adding back in crunch code that I added between 36-43, and I think I've found where I've gone wrong - on the first try. (well, maybe 2 things). One of the most commonly used pigs functions is "checklampvalue" - 131 times in the code. Uses 2 bytes, one for the function and one for the parameter. So I had written some code to do this on compilation:
If function is checklampvalue, $parameter AND parameter is >7f, create byte code: $21 $parameter. This is the original way the function always worked.
If function is checklampvalue, $parameter AND parameter is <$80, create byte code: $parameter+$80. This is a new way to do this, and saves one byte per function $21 where the parameter is <$80.
Then, in the pigs engine, when you load the function from a pigs script, if the sign bit is set, transfer the byte to B, clear the sign bit, and set the command to $20, check lampvalueinB.
A couple things went very south here:
First, some lamps were not turning off when collected, notable when the BLAST or OFF is completed - it would turn it on the left lane, say "BLAST" or "OFF", but leave the last letter lit... unless you collected it from the spot letter quickshot.
Then, the walker would have errors again. This was the second bug, when I added attract mode speech code, it didn't take into account that I was using the locations that were for the currently up player and the current ball in play - normally not an issue, since the attract mode is only running at game over. BUT, the attract light show is ALSO used at multiball start! So through an unfortunate series of tragic events, the attract mode speech timers were blanking the ball in play. Oops.
I've added a check for the attract situation to see if it makes a difference in the older 43 branch before (finally) abandoning that one. I had that source 1/2 commented up all nice and pretty too, with lots of explanations in the text so people could follow along if interested. Temporarily, I'm taking off the check lamp crunch to see if it makes a difference.... if it does, I'll try and debug that, because it's really needed to crunch into the original rom footprint - for about 9 bytes of check code, you can save about 100 bytes.