PCB Repair: Ajax
Problem
Displays garbage, watchdog reset continuously triggering.
Diagnosis
Ajax is one of several Konami games to uses their custom, 6809-derived 052001 CPU. It is not unheard of for this CPU to fail, which, without a replacement, would relegate this PCB to the scrap pile.
Probing around with my oscilloscope revealed that there was no activity on any of the CPU address lines. The CLK and RESET input signals were present and correct and the HALT input is unused. The CPU has a /DTAC input, (Data Transfer Acknowledge), which is used to inform the CPU that data is ready to be transferred to/from memory or some other device. The /DTAC input was constantly high, which was effectively keeping the CPU in a halted state.
/DTAC is generated by this circuit:
Probing the LS08 at I2 revealed a floating output on pin 8. Replacing I2 didn’t magically fix the game (it was still displaying garbage and watchdogging, albeit less frequently) but at least now there was observable CPU bus activity.
To get an idea of why the watchdog reset was triggering, I hooked up my logic analyzer to the CPU address bus. This would hopefully give an idea of where code execution was reaching before the watchdog triggered. For the watchdog to trigger, it was likely that the CPU had become stuck in a loop and was no longer kicking the watchdog timer. I actually discovered that code execution was not progressing far beyond the reset location. Here’s the disassembly of the reset sequence:
; Reset 8000: CLRA 8001: STA $0800 8005: STA $00c0 8009: LDS #$6000 800C: LDA #$20 800E: PUSHS A 8010: PULLS DP 8012: CLRA 8013: LDU #$2000 8019: STA ,u+ ; Zero 0x2000 bytes of shared RAM 801B: STA $0020 801F: INCA 8020: CMPA #$FF 8022: BNE $8025 8024: CLRA 8025: LEAX #$-01,x 8028: BNE $8019 802A: CLRA 802B: LDU #$2000 ; Read back contents of shared RAM 802E: LDX #$2000 8031: CMPA ,u+ 8033: LBNE $8186 ; ERROR! Value did not match 8036: INCA 8037: CMPA #$FF 8039: BNE $803C 803B: CLRA 803C: LEAX #$-01,x 803F: BNE $8031
I observed that the branch to $8186 at $8033 was being taken, which indicates a bad value read back from the RAM shared between the main CPU and the slave CPU. I decided to check the shared RAM and the logic surrounding it:
An 007644 Konami bus transceiver interfaces the shared RAM to the main CPU. The OEO input, which routes Y[7:0] to O[7:0] during a read, was floating. The inputs of the LS32 at J5 looked valid but the output at pin 11 was floating. Replacing this IC brought the game back to life, and without any further issues!
Fix
Replace 74LS08 at I2.
Replace 74LS32 at J5.