I have an old partially working C64 that I'd like to diagnose and possibly fix. The machine is a 1983 brown breadbox C64 with "Assy no.250407 Artwork no.251137 rev.c". The only symptom is some programs do not work correctly, mostly longer ones. The problem is NOT with the files; they work perfectly with VICE.
I've already spent a lot of time investigating the cause, and have found out the following:
1) Something causes data to not get written in RAM properly
2) Because some of the required data is missing, the program crashes
So while the problems ARE related to corrupted data in the RAM, the RAM itself is almost certainly not faulty (been tested very thoroughly). Instead, something causes data to not get written or to get written incorrectly. I tracked down that when a program loads, it stops writing data to RAM when it goes over 38911 bytes. This does not happen with VICE, with the exact same loading procedure. With help from another forum, I found out that this happens because after that point, the loading process starts to write to the RAM "through the ROM". This is what the faulty C64 does not handle correctly. They even made a memory test that tests writing data through the ROM, and it detected an error, unlike all ordinary RAM tests.
So it seems the machine only has problems writing data when it goes through the ROM. This results in some programs working while others don't. I feel I'm getting closer and closer to the solution. Now all I'd need to find out is, which part inside the C64 could cause this behaviour? Perhaps someone has in-depth knowledge of the C64 and can pinpoint the culprit with the information given above?
I've been able to rule out the following parts:
-Disk Drive (tested with substitute)
-Power Supply (tested with substitute)
-CIAs (tested with substitutes)
-SID (tested with substitute)
-VIC (tested with substitute)
-RAM (tested from $0002 to $FFFF)
-ROMs (dumps were 100% correct)
That pretty much leaves only CPU, PLA and the smaller logic chips (which are all soldered). I've attached the code for the memory tester (it should always print 0, on the faulty C64 it prints 7).