I recently had a problem with my Joust where the game played perfectly, and everything looked fine at the inputs test screen, but get to the point of trying to enter a high score and the screen just sits there waiting, and doesn't respond to any inputs.
I'd seen the old thread about this (
https://forums.arcade-museum.com/threads/cant-enter-name-in-joust-high-score-or-setup-screen.182914/) but the reason for the problem wasn't conclusive (faulty PIA on the widget board was suggested), so whilst I wasn't convinced, I swapped it anyway, but no change.
So a bit of basic troubleshooting found a dead output on pin 4 of one of the 4049s. This feeds a 257 mux so its floating input (pin 6) floated high which gave a high on its corresponding output when selected (pin 7) feeding PA7 of the PIA. This signal is one that tracks back to NC, or unused input on Joust, so it wasn't clear if or why this could be the issue.
I swapped out the 4049 and that fixed the problem. Still had no idea why an unused input on the game (which doesn't even appear on the test screen) would affect entering your initials, and I don't like not knowing...
Fortunately the original source code for Joust is available so I thought I'd take a look and see what I could find. A bit of searching found that variable "PIA2" is mapped PA0..PA7, with bit 0=left, bit 1=right, bit 2=flap, bit 4=2P start and bit 5=1P start, with bits 3, 6 & 7 (our problem bit) being unused. Now for the offending code (with original Williams comments and spelling mistakes

):-
Code:
LDB PIA2 READ THE SWITCH INPUTS
ANDB #$07 WE ONLY WANT 'MOVE LEFT','MOVE RIGHT','FALP'
BNE 40$ BRA= SWITCHES HAVE BEEN PRESSED
LDB .DEBONC,Y
BEQ ENTRET
DEC .DEBONC,Y
BRA ENTRET
40$ LDX #ENTI2 DEBOUNCE THEM A BIT
STX .WAKUP,Y GET THE WAKE-UP ADDRESS
ANDCC #$FE CLEAR CARRY
RTS GO AND SLEEP
*** JUMPS HERE ONCE A SWITCH IS PRESSED ***
ENTI2 PSHS B
LDB .SIDE,Y
STB PIA3+1
PULS B
CMPB PIA2 IS THE SAME SWITCH STILL PRESSED ***THIS IS THE PROBLEM***
BNE ENTRET BRA= NO SO IT'S PROBBALY NOISE RETURN TO THE CALLER
...continue with entering initials
ENT10$ LDX #ENTINT
STX .WAKUP,Y
RTS RETURN TO THE CALLER
ENTRET BSR OUTHSC WRITE THE CHARACTER
ANDCC #$FE CLEAR CARRY
BRA ENT10$
So the game code is pretty good at masking only the bits that it needs to look at, with just about every "read" of the PIA inputs being followed with an "AND" to mask off just the required bits. The problem here is the command "CMPB PIA2" which (during debouncing the inputs) compares the previous state of the inputs (that have been masked off to only include left, right and flap) with the current state (that includes all 8 bits), and if they aren't the same it doesn't accept the input (assuming it to be "noise").
Normally this shouldn't be a problem, as the other inputs/bits are unused and should always be zero. But in my case when there was a fault pulling bit 7 high, the masked value and the current value would never be the same, it constantly ignores the input and never lets you enter your initials. The interrupt code also continues to kick the watchdog so that never reboots the game, and it never times out from the initial entry screen.
I guess it is a bug, although you're very unlikely to ever encounter it. I'm sure it was assumed it could never happen, but then again it could have been avoided.