ROM fault workbench v27

Address line diagnostics for ROM dumps and glitchy Game Boy boot logo diagnostics.

How to use

Overview

This app has three distinct functions:

  • Address line scan - Use with a ROM dump file to search for stuck address bits or memory mirroring. This section is not Game Boy specific, but can be used with any kind of ROM dump. I originally came up with the idea when troubleshooting a BIOS file dumped from a laptop.
  • Game Boy boot logo glitcher - Force address and data bits low or high to see what the resulting glitched logo would look like. Most useful for cases where parts of the Nintendo logo are repeated.
  • Game Boy boot logo search - Provide a clean ROM dump and recreate the glitched logo by drawing it. The app searches the provided ROM for bit patterns matching the pixels you've drawn.

The goal in all cases is to aid in hardware troubleshooting by pointing to one or more address or data lines to check for loose connections or other faults.

Made by nitro2k01/GameboyGenius with the help of Claude AI. (The documentation in the how-to sections is 100% human written.)

Address line scan

Principle of operation

When a device with a parallel address/data bus wants to read from memory, it first presents the address it wants to read from, then sends a read signal. The memory chip detects the read signal, reads the address and finally outputs the data from the requested read address. Let's look at an example read sequence from address 0-7 with the binary equivalent and finally what the memory chip sees.

Request Binary            ROM chip sees
0x0000  00000000000000000 0x0000
0x0001  00000000000000001 0x0001
0x0002  00000000000000010 0x0002
0x0003  00000000000000011 0x0003
0x0004  00000000000000100 0x0004
0x0005  00000000000000101 0x0005
0x0006  00000000000000110 0x0006
0x0007  00000000000000111 0x0007

Now what happens if one of the data lines is faulty, for example disconnected or grounded, and always reads 0? Let's try this with address bit 0, the lowest address bit.

Request Binary            ROM chip sees
0x0000  00000000000000000 0x0000
0x0001  00000000000000000 0x0000
0x0002  00000000000000010 0x0002
0x0003  00000000000000010 0x0002
0x0004  00000000000000100 0x0004
0x0005  00000000000000100 0x0004
0x0006  00000000000000110 0x0006
0x0007  00000000000000110 0x0006

The pattern is that every odd address would incorrectly read the value of its corresponding even address. We can check for this going through the file and comparing every odd and even pair. If all of them match, it's likely address bit 0 is stuck. Let's now try the same thing with bit 1.

Request Binary            ROM chip sees
0x0000  00000000000000000 0x0000
0x0001  00000000000000001 0x0001
0x0002  00000000000000000 0x0000
0x0003  00000000000000001 0x0001
0x0004  00000000000000100 0x0004
0x0005  00000000000000101 0x0005
0x0006  00000000000000100 0x0004
0x0007  00000000000000101 0x0005

The pattern this time is more complex: 2 became 0 and 3 became 1. We now expect addresses that are two steps apart to be identical if this fault exists. So we can scan through the file and check if addresses that are 1 apart, 2 apart, 4 apart, 8 apart etc, are identical to detect a fault in a certain address bit. For every address bit, we check whether addresses that are 2n bytes apart are identical. If 100% of addresses are mirrored, we likely have a fault. If close to 100% of addresses are mirrored, we may have a fault, but this is not a given as we'll see in the following examples.

How to analyze the data, and examples of real life data

Here's an example of a real-life file, a ROM dump of the BIOS chip, which inspired this project.

[{"bit":0,"percent":44.04,"buckets":[21.29,2.88,0.93,0.73,0.15,1.9,0.88,24.71,58.5,68.8,100,100,100,100,47.8,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0.59,0.78,0.83,0.34,33.15,0.44,53.81,0.49,37.16,1.51,5.62,0.68,0.73,0.44,94.14,100,21.14,1.76,3.96,6.2,1.56,1.42,2,1.37,2.49,0.98,1.56,2.88,1.07,4.44,63.92,42.48]},{"bit":1,"percent":44.3,"buckets":[21.24,3.47,2.2,2.64,3.13,4.1,1.56,19.58,47.75,64.36,100,100,100,100,47.85,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.03,1.17,2.78,6.69,33.64,2.64,56.2,1.12,38.09,5.22,7.18,1.46,2.64,3.03,94.24,100,19.58,3.37,4.59,4.3,1.51,0.88,1.37,0.88,2.69,1.61,2.1,2.83,1.51,3.91,62.79,46.44]},{"bit":2,"percent":44.27,"buckets":[20.85,3.03,3.27,2.98,4.39,5.91,2.54,14.5,28.52,46.14,100,100,100,100,47.41,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,5.47,5.47,4.83,6.05,35.79,4.1,56.35,3.81,41.02,7.62,10.6,3.86,5.57,5.13,94.24,100,17.09,3.27,3.52,3.47,3.08,2.88,2.69,1.66,3.47,3.22,3.42,4.74,2.88,8.64,60.01,40.04]},{"bit":3,"percent":43.54,"buckets":[9.62,3.22,2.64,3.03,3.27,4.74,3.52,16.8,18.6,34.62,100,100,100,100,47.56,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,3.56,3.86,3.91,3.76,34.86,2.88,55.66,2.49,39.5,6.05,8.59,2,3.71,4.79,94.29,100,18.21,3.47,3.52,3.76,2.73,3.52,3.52,3.56,3.96,3.37,5.13,9.77,3.22,7.52,55.62,38.48]},{"bit":4,"percent":43.79,"buckets":[8.94,3.61,1.81,1.61,2.88,4.25,3.13,16.75,32.96,50.39,100,100,100,100,48.68,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.44,2.88,2.73,3.61,34.18,2.49,54.64,1.71,38.92,3.91,6.84,1.81,2.44,2.88,93.8,100,17.38,2.49,4.59,12.26,1.61,2.69,2.15,2.78,3.32,2.59,3.08,8.69,3.13,7.28,58.79,39.55]},{"bit":5,"percent":43.19,"buckets":[16.36,3.32,1.95,2.29,1.56,3.22,2.64,13.28,26.86,48.83,100,100,100,100,47.71,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.9,1.51,1.51,1.71,34.18,1.86,54.35,1.76,37.11,3.81,5.96,1.37,2.49,1.56,93.8,100,18.02,1.9,2.93,3.27,1.81,3.27,2.54,2.69,2.83,1.71,2.93,8.2,2.44,5.18,57.13,34.38]},{"bit":6,"percent":43.1,"buckets":[47.36,1.9,0.98,1.76,1.27,2.15,2.39,9.23,20.07,44.09,100,100,100,100,46.97,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.34,1.51,1.56,1.81,33.5,1.95,54.35,1.51,36.38,2.39,5.71,1.61,2.2,1.07,93.75,100,15.63,1.76,1.95,4.39,1.86,2.05,2.34,2.78,2.98,1.76,1.81,6.54,1.86,3.17,55.47,32.47]},{"bit":7,"percent":42.48,"buckets":[37.21,2.39,1.51,1.81,1.03,2.2,2.1,11.96,27.54,40.53,100,100,100,100,46.24,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.86,1.32,1.71,1.42,32.76,1.12,51.66,1.27,36.18,2.1,1.07,0.93,1.32,1.66,93.9,100,16.02,1.32,2.25,3.91,1.56,2.88,2.2,2.88,2.34,2.25,1.51,2.29,1.95,2.44,40.04,27.78]},{"bit":8,"percent":42.05,"buckets":[37.16,2.15,1.27,1.86,1.76,0.98,1.66,9.57,22.71,39.79,100,100,100,100,41.36,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.46,1.46,1.27,1.12,29.3,1.22,50.73,1.51,36.18,1.51,1.86,1.71,1.27,1.27,88.28,100,15.53,1.51,2.73,3.52,1.86,1.9,2.05,2.44,1.86,1.66,1.56,1.66,1.76,1.86,39.94,28.66]},{"bit":9,"percent":41.07,"buckets":[28.91,1.86,2.49,1.46,1.03,1.32,1.46,9.13,18.8,37.01,100,100,100,100,40.33,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.42,1.37,1.03,1.56,25.93,1.07,50.83,1.17,25.98,1.27,0.88,1.07,1.03,1.37,88.28,100,4.98,1.32,2.05,1.66,2.34,1.9,1.86,2.25,1.12,1.76,1.37,1.76,2.1,2.2,32.32,19.29]},{"bit":10,"percent":39.85,"buckets":[18.41,1.86,0.54,0.83,0.93,0.98,1.46,6.49,24.12,33.5,100,100,100,100,40.23,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.61,1.86,1.22,1.03,16.8,1.32,7.57,1.46,23.68,1.22,0.93,0.68,1.76,0.83,88.28,100,3.47,1.37,1.27,2,1.71,2.69,2.15,1.51,1.03,1.86,1.32,1.56,0.93,2.54,28.42,17.14]},{"bit":11,"percent":38.46,"buckets":[15.87,1.27,1.61,0.73,1.17,1.51,1.42,4.98,19.58,27.78,100,100,100,100,0.54,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.56,1.07,0.68,1.42,0.73,1.46,7.57,0.98,0.93,0.88,1.03,1.66,1.22,1.07,88.28,100,2.78,1.56,1.56,1.37,2.59,1.27,1.56,2.44,0.88,1.9,1.07,1.76,1.9,2.1,33.06,16.85]},{"bit":12,"percent":38.1,"buckets":[2.64,null,1.17,null,1.27,null,1.25,null,24.85,null,100,null,100,null,45.07,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,1.78,null,1.1,null,0.98,null,0.83,null,1.2,null,1.34,null,1.22,null,94.14,null,1.51,null,1.68,null,1.81,null,2,null,1.2,null,1.66,null,1.59,null,28.96,null]},{"bit":13,"percent":31.53,"buckets":[0.85,0.81,null,null,1.22,2,null,null,1.9,1.29,null,null,45.07,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,1.46,1.07,null,null,29.35,1.22,null,null,1.39,1.17,null,null,1.29,0.29,null,null,1.95,1.1,null,null,2.15,1.68,null,null,1.2,1.54,null,null,4.3,4.61,null,null]},{"bit":14,"percent":30.67,"buckets":[1.05,1.25,1.07,1.03,null,null,null,null,1.9,1.29,45.07,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,1.1,1.15,0.42,1.12,null,null,null,null,1.12,1.25,5.69,0.9,null,null,null,null,1.39,0.93,1.2,1.2,null,null,null,null,0.9,1.46,4.17,4.91,null,null,null,null]},{"bit":15,"percent":28.09,"buckets":[11.84,3.64,0.68,1.46,0.88,1.07,0.73,2.03,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,0.68,1.27,0.88,0.88,1.05,1.49,53.74,0.51,null,null,null,null,null,null,null,null,1.81,1.39,1.42,1.42,1.46,1.73,3.44,3.25,null,null,null,null,null,null,null,null]},{"bit":16,"percent":18.38,"buckets":[4.42,0.61,0.68,1.46,0.88,1.07,0.78,2.03,1.9,1.29,100,100,100,100,45.07,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1.68,1,0.98,1.05,2.05,0.81,2.44,0.9,1.05,1.15,1.05,1,1.15,1.07,7.37,3.32,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},{"bit":17,"percent":6.65,"buckets":[2.54,1.25,0.63,0.54,0.51,0.78,0.98,1.93,2.22,3.64,5.71,0.9,1.25,0.29,45.07,100,0.22,1.51,2.2,2.78,4.1,3.25,4.08,3.98,0.81,1.22,1.25,1.34,2.03,5.25,7.2,3.32,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}] [{"bit":0,"percent":38.8,"buckets":[21.29,2.88,0.93,0.73,21.29,2.88,0.93,0.73,58.5,68.8,100,100,58.5,68.8,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0.59,0.78,0.83,0.34,0.59,0.78,0.83,0.34,37.16,1.51,5.62,0.68,37.16,1.51,5.62,0.68,21.14,1.76,3.96,6.2,21.14,1.76,3.96,6.2,2.49,0.98,1.56,2.88,2.49,0.98,1.56,2.88]},{"bit":1,"percent":38.95,"buckets":[21.24,3.47,2.2,2.64,21.24,3.47,2.2,2.64,47.75,64.36,100,100,47.75,64.36,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.03,1.17,2.78,6.69,1.03,1.17,2.78,6.69,38.09,5.22,7.18,1.46,38.09,5.22,7.18,1.46,19.58,3.37,4.59,4.3,19.58,3.37,4.59,4.3,2.69,1.61,2.1,2.83,2.69,1.61,2.1,2.83]},{"bit":2,"percent":38.5,"buckets":[20.85,3.03,3.27,2.98,20.85,3.03,3.27,2.98,28.52,46.14,100,100,28.52,46.14,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,5.47,5.47,4.83,6.05,5.47,5.47,4.83,6.05,41.02,7.62,10.6,3.86,41.02,7.62,10.6,3.86,17.09,3.27,3.52,3.47,17.09,3.27,3.52,3.47,3.47,3.22,3.42,4.74,3.47,3.22,3.42,4.74]},{"bit":3,"percent":37.32,"buckets":[9.62,3.22,2.64,3.03,9.62,3.22,2.64,3.03,18.6,34.62,100,100,18.6,34.62,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,3.56,3.86,3.91,3.76,3.56,3.86,3.91,3.76,39.5,6.05,8.59,2,39.5,6.05,8.59,2,18.21,3.47,3.52,3.76,18.21,3.47,3.52,3.76,3.96,3.37,5.13,9.77,3.96,3.37,5.13,9.77]},{"bit":4,"percent":38.03,"buckets":[8.94,3.61,1.81,1.61,8.94,3.61,1.81,1.61,32.96,50.39,100,100,32.96,50.39,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.44,2.88,2.73,3.61,2.44,2.88,2.73,3.61,38.92,3.91,6.84,1.81,38.92,3.91,6.84,1.81,17.38,2.49,4.59,12.26,17.38,2.49,4.59,12.26,3.32,2.59,3.08,8.69,3.32,2.59,3.08,8.69]},{"bit":5,"percent":37.38,"buckets":[16.36,3.32,1.95,2.29,16.36,3.32,1.95,2.29,26.86,48.83,100,100,26.86,48.83,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.9,1.51,1.51,1.71,1.9,1.51,1.51,1.71,37.11,3.81,5.96,1.37,37.11,3.81,5.96,1.37,18.02,1.9,2.93,3.27,18.02,1.9,2.93,3.27,2.83,1.71,2.93,8.2,2.83,1.71,2.93,8.2]},{"bit":6,"percent":37.7,"buckets":[47.36,1.9,0.98,1.76,47.36,1.9,0.98,1.76,20.07,44.09,100,100,20.07,44.09,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.34,1.51,1.56,1.81,2.34,1.51,1.56,1.81,36.38,2.39,5.71,1.61,36.38,2.39,5.71,1.61,15.63,1.76,1.95,4.39,15.63,1.76,1.95,4.39,2.98,1.76,1.81,6.54,2.98,1.76,1.81,6.54]},{"bit":7,"percent":37.17,"buckets":[37.21,2.39,1.51,1.81,37.21,2.39,1.51,1.81,27.54,40.53,100,100,27.54,40.53,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.86,1.32,1.71,1.42,1.86,1.32,1.71,1.42,36.18,2.1,1.07,0.93,36.18,2.1,1.07,0.93,16.02,1.32,2.25,3.91,16.02,1.32,2.25,3.91,2.34,2.25,1.51,2.29,2.34,2.25,1.51,2.29]},{"bit":8,"percent":36.92,"buckets":[37.16,2.15,1.27,1.86,37.16,2.15,1.27,1.86,22.71,39.79,100,100,22.71,39.79,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.46,1.46,1.27,1.12,1.46,1.46,1.27,1.12,36.18,1.51,1.86,1.71,36.18,1.51,1.86,1.71,15.53,1.51,2.73,3.52,15.53,1.51,2.73,3.52,1.86,1.66,1.56,1.66,1.86,1.66,1.56,1.66]},{"bit":9,"percent":35.66,"buckets":[28.91,1.86,2.49,1.46,28.91,1.86,2.49,1.46,18.8,37.01,100,100,18.8,37.01,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.42,1.37,1.03,1.56,1.42,1.37,1.03,1.56,25.98,1.27,0.88,1.07,25.98,1.27,0.88,1.07,4.98,1.32,2.05,1.66,4.98,1.32,2.05,1.66,1.12,1.76,1.37,1.76,1.12,1.76,1.37,1.76]},{"bit":10,"percent":35.17,"buckets":[18.41,1.86,0.54,0.83,18.41,1.86,0.54,0.83,24.12,33.5,100,100,24.12,33.5,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.61,1.86,1.22,1.03,1.61,1.86,1.22,1.03,23.68,1.22,0.93,0.68,23.68,1.22,0.93,0.68,3.47,1.37,1.27,2,3.47,1.37,1.27,2,1.03,1.86,1.32,1.56,1.03,1.86,1.32,1.56]},{"bit":11,"percent":34.03,"buckets":[15.87,1.27,1.61,0.73,15.87,1.27,1.61,0.73,19.58,27.78,100,100,19.58,27.78,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.56,1.07,0.68,1.42,1.56,1.07,0.68,1.42,0.93,0.88,1.03,1.66,0.93,0.88,1.03,1.66,2.78,1.56,1.56,1.37,2.78,1.56,1.56,1.37,0.88,1.9,1.07,1.76,0.88,1.9,1.07,1.76]},{"bit":12,"percent":33.76,"buckets":[2.64,null,1.17,null,2.64,null,1.17,null,24.85,null,100,null,24.85,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,1.78,null,1.1,null,1.78,null,1.1,null,1.2,null,1.34,null,1.2,null,1.34,null,1.51,null,1.68,null,1.51,null,1.68,null,1.2,null,1.66,null,1.2,null,1.66,null]},{"bit":13,"percent":25.98,"buckets":[0.85,0.81,null,null,0.85,0.81,null,null,1.9,1.29,null,null,1.9,1.29,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,1.46,1.07,null,null,1.46,1.07,null,null,1.39,1.17,null,null,1.39,1.17,null,null,1.95,1.1,null,null,1.95,1.1,null,null,1.2,1.54,null,null,1.2,1.54,null,null]},{"bit":14,"percent":100,"buckets":[100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null]},{"bit":15,"percent":26.71,"buckets":[11.84,3.64,0.68,1.46,11.84,3.64,0.68,1.46,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,0.68,1.27,0.88,0.88,0.68,1.27,0.88,0.88,null,null,null,null,null,null,null,null,1.81,1.39,1.42,1.42,1.81,1.39,1.42,1.42,null,null,null,null,null,null,null,null]},{"bit":16,"percent":13.71,"buckets":[4.42,0.61,0.68,1.46,4.42,0.61,0.68,1.46,1.9,1.29,100,100,1.9,1.29,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1.68,1,0.98,1.05,1.68,1,0.98,1.05,1.05,1.15,1.05,1,1.05,1.15,1.05,1,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},{"bit":17,"percent":1.8,"buckets":[2.54,1.25,0.63,0.54,2.54,1.25,0.63,0.54,2.22,3.64,5.71,0.9,2.22,3.64,5.71,0.9,0.22,1.51,2.2,2.78,0.22,1.51,2.2,2.78,0.81,1.22,1.25,1.34,0.81,1.22,1.25,1.34,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}] [{"bit":0,"percent":39.27,"buckets":[20.65,2.93,1.07,0.63,22.51,3.17,0.98,0.29,58.11,68.95,100,100,58.5,67.04,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,0.49,0.88,0.88,0.39,0.49,0.88,3.86,0.39,36.23,2.34,5.27,0.68,36.23,2.34,8.25,7.28,24.12,2.49,4.39,7.62,24.12,2.54,4.35,7.13,3.91,0.68,2.34,2.59,3.91,0.68,6.54,4.2]},{"bit":1,"percent":39.41,"buckets":[20.36,4.3,2.1,2.78,23.88,4.49,1.86,2.64,46.97,64.45,100,100,47.41,64.84,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.27,1.07,2.93,6.93,1.27,1.07,6.74,6.84,37.4,5.96,6.84,1.17,37.4,5.96,9.33,7.42,20.41,3.52,4.3,4.98,20.41,3.52,4.35,4.54,4.39,1.07,3.22,3.03,4.39,1.07,7.32,5.81]},{"bit":2,"percent":38.8,"buckets":[21.29,2.54,3.42,2.25,23.88,2.69,3.37,2.05,26.42,45.46,100,100,27.1,45.61,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,4.88,5.37,4.39,6.35,4.88,5.37,7.23,6.49,40.23,8.11,11.62,4,40.23,8.11,14.5,10.5,18.26,2.88,2.64,4.39,18.26,2.88,2.54,3.86,4.79,2.98,4.2,4.83,4.79,2.88,8.3,6.64]},{"bit":3,"percent":37.77,"buckets":[8.79,3.52,2.69,3.03,12.4,3.13,2.49,2.49,17.29,35.5,100,100,18.41,35.16,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,3.52,3.42,4.3,3.32,3.52,3.42,7.23,3.27,38.96,7.13,7.32,2.44,38.96,7.13,10.11,8.74,18.85,3.81,3.42,4.3,18.85,3.81,3.47,4.3,5.57,3.08,7.62,10.64,5.57,3.08,11.38,11.62]},{"bit":4,"percent":38.44,"buckets":[8.11,3.66,1.32,0.98,12.35,4.49,1.51,1.9,35.64,51.22,100,100,34.38,50.83,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.44,1.86,2.54,3.81,2.44,1.86,5.52,3.91,37.99,3.71,6.25,1.81,37.99,3.71,9.77,8.11,17.97,1.81,5.18,13.18,17.97,1.86,4.79,12.06,4.59,2.49,3.91,8.89,4.59,2.64,8.3,10.06]},{"bit":5,"percent":37.79,"buckets":[14.79,3.27,1.76,2.39,18.36,3.66,1.61,2.49,27.78,49.85,100,100,28.08,48.78,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.66,1.66,1.37,2.05,1.66,1.66,4.39,1.95,35.84,3.81,4.49,0.98,35.84,3.81,8.45,7.23,19.73,2.54,3.71,4.1,19.73,2.54,3.81,4.25,4.3,1.42,3.52,7.91,4.3,1.37,7.23,8.3]},{"bit":6,"percent":37.76,"buckets":[40.58,2.05,0.63,1.42,39.94,2.05,0.78,1.61,22.95,46.53,100,100,23.44,44.29,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,2.54,1.27,1.66,2.05,2.54,1.27,4.74,1.95,34.38,1.46,5.47,1.95,34.38,1.46,7.23,5.66,15.53,2.44,2.44,5.18,15.53,2.44,2.54,4.64,3.22,2.44,1.76,6.35,3.22,2.34,4.05,6.54]},{"bit":7,"percent":96.82,"buckets":[94.53,85.11,90.09,83.69,96,81.93,88.28,87.89,90.23,89.11,100,100,92.33,91.36,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,88.13,89.65,100,99.9,100,99.02,100,99.02,95.95,93.36,100,99.8,100,99.95,100,99.95,93.07,84.38,100,97.71,100,98.54,100,99.27,93.65,94.29]},{"bit":8,"percent":36.93,"buckets":[36.04,1.95,1.51,1.07,36.33,2.2,1.22,1.37,23.93,40.97,100,100,26.17,40.53,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.46,1.66,1.37,1.27,1.46,1.66,1.12,1.32,33.98,1.86,2.25,1.95,33.98,1.86,2.29,1.66,14.94,1.86,3.32,2.64,14.94,1.86,2.93,2.34,2.05,2.2,1.27,1.46,2.05,2.05,1.32,2]},{"bit":9,"percent":35.74,"buckets":[26.76,2.2,1.71,1.46,29.83,2.49,2.05,1.95,21.14,37.11,100,100,19.78,35.99,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.27,0.78,0.68,1.76,1.27,0.78,0.59,1.81,25.78,1.17,1.07,1.17,25.78,1.22,1.03,1.22,7.13,1.27,2.64,1.95,7.13,1.27,2.34,2.15,1.17,1.81,1.27,1.37,1.17,1.86,1.51,1.17]},{"bit":10,"percent":35.2,"buckets":[16.46,2.15,0.49,0.73,17.68,2.34,0.63,0.78,28.17,35.94,100,100,26.17,33.4,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.46,1.86,0.98,0.59,1.46,1.86,0.73,0.78,21.19,0.88,1.46,0.78,21.19,0.88,1.51,1.95,3.32,1.46,1.07,2.64,3.32,1.46,1.07,2.59,0.88,2,1.46,1.51,0.88,2.05,1.37,1.32]},{"bit":11,"percent":34.18,"buckets":[14.06,2.05,1.03,0.88,16.41,1.71,1.76,0.78,22.41,29.05,100,100,22.31,27.2,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,1.27,1.46,0.59,1.66,1.27,1.46,0.44,1.76,0.98,0.68,1.17,1.95,0.98,0.68,1.32,1.76,3.22,1.66,1.66,1.76,3.22,1.66,1.46,1.42,0.68,1.86,1.27,1.66,0.68,1.86,1.66,2.98]},{"bit":12,"percent":33.85,"buckets":[3.03,null,1.29,null,3.52,null,1.32,null,25.22,null,100,null,25.1,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,1.71,null,1.03,null,1.71,null,1,null,1.46,null,1.29,null,1.44,null,1.22,null,1.95,null,1.81,null,1.95,null,1.81,null,1.22,null,1.34,null,1.27,null,1.46,null]},{"bit":13,"percent":25.97,"buckets":[0.78,0.71,null,null,0.98,0.71,null,null,1.2,0.51,null,null,1.15,0.59,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,1.56,1.03,null,null,1.44,1.12,null,null,1.71,0.83,null,null,3.47,0.85,null,null,2.05,1.17,null,null,2.03,1.22,null,null,1.27,1.49,null,null,1.32,1.71,null,null]},{"bit":14,"percent":93.92,"buckets":[78.44,73.88,64.33,68.8,null,null,null,null,80.18,89.55,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,94.07,94.63,null,null,null,null,100,99.46,97.05,92.77,null,null,null,null,100,99.88,94.09,91.38,null,null,null,null,100,98.49,95.29,93.04,null,null,null,null]},{"bit":15,"percent":26.81,"buckets":[10.91,3.61,0.83,1.42,13.57,3.74,0.93,1.37,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,0.73,1.51,1.03,0.85,0.73,1.49,0.88,1,null,null,null,null,null,null,null,null,1.9,1.39,1.32,1.73,1.9,1.42,1.83,1.86,null,null,null,null,null,null,null,null]},{"bit":16,"percent":13.67,"buckets":[3.93,0.66,0.83,1.42,4.93,0.68,0.93,1.37,1.2,0.51,100,100,1.15,0.59,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1.46,1.17,1.07,1.27,1.46,1.17,1.15,1.29,1.22,0.95,0.93,1.03,1.22,0.95,1.05,1.78,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},{"bit":17,"percent":2.11,"buckets":[2.51,1.42,0.49,0.56,2.66,1.2,0.61,0.42,2.29,3.74,5.27,0.9,2.17,3.59,8.23,7.32,0.15,1.78,2.1,2.73,0.15,1.81,2.08,2.98,1.12,1.39,1.03,1.29,1.12,1.37,1.07,2.03,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}]

Looking first at the clean dump. Something you can note is that the graph goes up and down. What are the red areas in the graph? Those area areas where the ROM is empty, which is to say filled with just the same value. We're looking for error by checking if pairs of data are equal. But if all bytes in a memory area equal anyway, they match this test. In essence, the areas where the graph is high are low entropy areas, where the data is very similar. Areas where the graph is low are high entropy areas where the data is more random. However, the telltale sign that this is likely a clean dump, is that the graphs for all of the tested bits are more or less identical. Every graph shows kind of the same thing and none of them diverge.

The A14 stuck example shows what to look for: when one of the data lines shows something different. Every tested pair off addresses where A14 is forced low and forced high, is identical. This is because A14 had a bad connection so every read from two addresses that differ only in the value of A14 ended up reading the same address in ROM.

The A7/A14 soft failure example shows something more subtle. A7 and A14 are stuck either low or high, but intermittently. Still, this is highly indicative of an issue with those address lines.

A couple more examples:

[{"bit":0,"percent":77.17,"buckets":[77.73,78.91,77.73,76.56,76.17,71.88,80.47,78.91,76.56,78.52,78.52,75.39,77.73,72.66,79.69,77.34,77.73,78.91,77.73,76.56,76.17,71.88,80.47,78.91,76.56,78.52,78.52,75.39,77.73,72.66,79.69,77.34,77.73,78.91,77.73,76.56,76.17,71.88,80.47,78.91,76.56,78.52,78.52,75.39,77.73,72.66,79.69,77.34,77.73,78.91,77.73,76.56,76.17,71.88,80.47,78.91,76.56,78.52,78.52,75.39,77.73,72.66,79.69,77.34]},{"bit":1,"percent":77.51,"buckets":[78.13,79.3,77.73,77.73,75.78,74.22,79.3,80.08,76.56,76.56,79.69,76.95,77.73,72.27,79.69,78.52,78.13,79.3,77.73,77.73,75.78,74.22,79.3,80.08,76.56,76.56,79.69,76.95,77.73,72.27,79.69,78.52,78.13,79.3,77.73,77.73,75.78,74.22,79.3,80.08,76.56,76.56,79.69,76.95,77.73,72.27,79.69,78.52,78.13,79.3,77.73,77.73,75.78,74.22,79.3,80.08,76.56,76.56,79.69,76.95,77.73,72.27,79.69,78.52]},{"bit":2,"percent":77.27,"buckets":[78.91,78.91,78.13,75,75,74.22,78.52,78.91,76.56,76.17,79.3,76.95,78.13,73.44,80.08,78.13,78.91,78.91,78.13,75,75,74.22,78.52,78.91,76.56,76.17,79.3,76.95,78.13,73.44,80.08,78.13,78.91,78.91,78.13,75,75,74.22,78.52,78.91,76.56,76.17,79.3,76.95,78.13,73.44,80.08,78.13,78.91,78.91,78.13,75,75,74.22,78.52,78.91,76.56,76.17,79.3,76.95,78.13,73.44,80.08,78.13]},{"bit":3,"percent":0,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"bit":4,"percent":77.37,"buckets":[76.56,79.3,77.73,76.56,76.17,73.44,79.69,80.47,76.95,76.56,79.3,75,78.13,74.61,79.3,78.13,76.56,79.3,77.73,76.56,76.17,73.44,79.69,80.47,76.95,76.56,79.3,75,78.13,74.61,79.3,78.13,76.56,79.3,77.73,76.56,76.17,73.44,79.69,80.47,76.95,76.56,79.3,75,78.13,74.61,79.3,78.13,76.56,79.3,77.73,76.56,76.17,73.44,79.69,80.47,76.95,76.56,79.3,75,78.13,74.61,79.3,78.13]},{"bit":5,"percent":77.34,"buckets":[77.73,78.52,78.52,76.56,75,72.66,79.69,78.91,78.52,77.73,77.73,77.34,78.13,72.66,79.3,78.52,77.73,78.52,78.52,76.56,75,72.66,79.69,78.91,78.52,77.73,77.73,77.34,78.13,72.66,79.3,78.52,77.73,78.52,78.52,76.56,75,72.66,79.69,78.91,78.52,77.73,77.73,77.34,78.13,72.66,79.3,78.52,77.73,78.52,78.52,76.56,75,72.66,79.69,78.91,78.52,77.73,77.73,77.34,78.13,72.66,79.3,78.52]},{"bit":6,"percent":77.32,"buckets":[76.56,79.3,77.73,75,75.39,75,78.91,79.69,78.13,77.34,78.52,75,78.91,75,79.3,77.34,76.56,79.3,77.73,75,75.39,75,78.91,79.69,78.13,77.34,78.52,75,78.91,75,79.3,77.34,76.56,79.3,77.73,75,75.39,75,78.91,79.69,78.13,77.34,78.52,75,78.91,75,79.3,77.34,76.56,79.3,77.73,75,75.39,75,78.91,79.69,78.13,77.34,78.52,75,78.91,75,79.3,77.34]},{"bit":7,"percent":77.54,"buckets":[78.13,78.91,78.52,75.39,75.39,73.44,81.64,79.3,76.17,79.3,78.91,76.17,78.13,74.22,79.69,77.34,78.13,78.91,78.52,75.39,75.39,73.44,81.64,79.3,76.17,79.3,78.91,76.17,78.13,74.22,79.69,77.34,78.13,78.91,78.52,75.39,75.39,73.44,81.64,79.3,76.17,79.3,78.91,76.17,78.13,74.22,79.69,77.34,78.13,78.91,78.52,75.39,75.39,73.44,81.64,79.3,76.17,79.3,78.91,76.17,78.13,74.22,79.69,77.34]},{"bit":8,"percent":0,"buckets":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"bit":9,"percent":77.27,"buckets":[77.93,null,77.15,null,74.22,null,79.88,null,77.54,null,77.73,null,75,null,78.71,null,77.93,null,77.15,null,74.22,null,79.88,null,77.54,null,77.73,null,75,null,78.71,null,77.93,null,77.15,null,74.22,null,79.88,null,77.54,null,77.73,null,75,null,78.71,null,77.93,null,77.15,null,74.22,null,79.88,null,77.54,null,77.73,null,75,null,78.71,null]},{"bit":10,"percent":77.1,"buckets":[77.34,77.34,null,null,77.54,75.98,null,null,77.34,77.15,null,null,78.71,75.39,null,null,77.34,77.34,null,null,77.54,75.98,null,null,77.34,77.15,null,null,78.71,75.39,null,null,77.34,77.34,null,null,77.54,75.98,null,null,77.34,77.15,null,null,78.71,75.39,null,null,77.34,77.34,null,null,77.54,75.98,null,null,77.34,77.15,null,null,78.71,75.39,null,null]},{"bit":11,"percent":77.54,"buckets":[76.76,76.95,79.49,78.32,null,null,null,null,78.52,74.41,79.1,76.76,null,null,null,null,76.76,76.95,79.49,78.32,null,null,null,null,78.52,74.41,79.1,76.76,null,null,null,null,76.76,76.95,79.49,78.32,null,null,null,null,78.52,74.41,79.1,76.76,null,null,null,null,76.76,76.95,79.49,78.32,null,null,null,null,78.52,74.41,79.1,76.76,null,null,null,null]},{"bit":12,"percent":77.1,"buckets":[76.95,77.34,78.71,75.39,76.76,72.85,79.69,79.1,null,null,null,null,null,null,null,null,76.95,77.34,78.71,75.39,76.76,72.85,79.69,79.1,null,null,null,null,null,null,null,null,76.95,77.34,78.71,75.39,76.76,72.85,79.69,79.1,null,null,null,null,null,null,null,null,76.95,77.34,78.71,75.39,76.76,72.85,79.69,79.1,null,null,null,null,null,null,null,null]},{"bit":13,"percent":100,"buckets":[100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},{"bit":14,"percent":100,"buckets":[100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}] [{"bit":0,"percent":97.69,"buckets":[0.39,51.95,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":1,"percent":97.71,"buckets":[0,53.13,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":2,"percent":97.68,"buckets":[0,51.56,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":3,"percent":97.66,"buckets":[0,50.39,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":4,"percent":97.67,"buckets":[0.78,50.39,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":5,"percent":97.67,"buckets":[0.78,50,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":6,"percent":97.66,"buckets":[0,50.39,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":7,"percent":97.67,"buckets":[0.39,50.39,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":8,"percent":96.95,"buckets":[0.39,4.3,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100]},{"bit":9,"percent":96.89,"buckets":[0.39,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null,100,null]},{"bit":10,"percent":95.4,"buckets":[0.59,52.15,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null,100,100,null,null]},{"bit":11,"percent":95.4,"buckets":[0.59,52.15,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null,100,100,100,100,null,null,null,null]},{"bit":12,"percent":95.4,"buckets":[0.59,52.15,100,100,100,100,100,100,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null]},{"bit":13,"percent":95.4,"buckets":[0.59,52.15,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},{"bit":14,"percent":95.4,"buckets":[0.59,52.15,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]}]

The mirrored example shows a request to read 32 kiB from an 8 kiB chip. This means that the contents of the 8 kiB chip is mirrored (repeated) 4 times. This shows up as A13 and A14 being "stuck", which in a sense they are: A13 and A14 don't influence the data being read. If looking blindly at a dump where one or more of the highest address bits show as stuck, it's theoretically possible that those address lines are indeed actually stuck, but your first instinct might be that you the read size is mismatched with the memory chip's size so you're getting an overdump.

In particular, the mirrored example is a dump of a Game Boy cartridge's save RAM after the battery has run out, which means that it contains "random" data. One somewhat interesting observation is that A3 and A8 are showing a flatline 0%, unlike the other lines which hover somewhere in the middle. Let's look at some of the data:

0x0000 FF FF FF FF FF DF FF FF 00 00 00 00 00 11 00 00
0x0010 FF FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
0x0020 FF FF FF FF FF FF FF FF 40 00 00 40 00 00 00 00
0x0030 F7 FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00

The file consists of repeated runs of 8 bytes with mostly all bits set, and then 8 bytes with mostly all bytes cleared. This gives a very low chance that two bytes that are 8 bytes apart match (addresses that only differ in bit 3) are ever equal. This happens due to physical construction of the SRAM chip. The bit cells for the first 8 bytes may for example be closer to the chip's internal VCC rail so they're pulled toward a logic 1. Whereas the next 8 bytes are closer to the chip's ground rail, and are biased toward a logic 0. This is a quirk of the chip that's visible in the statistics gathered by this test.

The mostly empty example shows a ROM dump which is mostly empty apart (fileld with the same value) from the bottom 512 bytes or so bytes. This file would be reported as suspect on all data lines by the tool because over 90% of the byte pair are identical. However, this is a false positive that comes from the overwhelming majority of repeated bytes in the file. However, as explained before, an error would show up as one (or more) address lines looking different than the others.

Drop a dump here

Everything runs in this page. The file never leaves your machine.