Warbling ROM data

The following requires a basic knowledge of how ROM works. Addressing, logic states, digital signals. If you want a simplified refresher, please read How ROM works (normally) first.

Warbling ROM data works by making external physical connections between the pins, changing the data passed along them. The ROM stores the data that the CPU borrows from to run programs and synthesize sounds. When external connections are made, the original data gets "warbled", causing wildly different behavior and sounds.

These are oscilloscope and logic analyzer traces taken from the ROM of the MT-240. The three lines from top to bottom are; Top: the Output Enable (OE) trace indicates when the data is valid, which I've highlighted for convenience. Middle: Address Line (A2). Bottom: Data Line (D4)

First, let's take a look at the MT-240's normal behavior. There are four possible scenarios:

A2 and D4 (not connected):

A

A2: 1 / D4: 1

B

A2: 0 / D4: 0

C

A2: 1 / D4: 0

D

A2: 0 / D4: 1


Both A2 and D4 are held at a High voltage when data isn't valid. When data is valid, this High voltage is around 5.5V for both lines. Note that A2: "1" takes a dip after the valid data, and that D4 takes a dip regardless of level before the valid data. Let's look at how both lines handle both 1 and 0.


Case A (1/1): A2 takes a big dip after the valid data, and there's a small bump after it bounces back. D4 takes a big dip before the valid data, then has a small dip after.

Case B (0/0): A2 drops low with a tiny dip before valid data, then returns high with a little bump. D4 drops low with a bigger dip, and then floats back high over a long time.


These little signature dips will be revealing in this next data set. These are traces of A2 and D4 when there is a ~120 ohms connection between them. This is right above the threshold of when things get weird- but everything is still working normally and it does not have an effect on the sound.

A2 and D4 (~125ohms):

A

A2: 1 / D4: 1

B

A2: 0 / D4: 0

C

A2: 1 / D4: 0

D

A2: 0 / D4: 1


Let's look closer at each case, comparing it to the not-connected traces:


Case A (1/1): The big difference is that both A2 and D4 have lost that huge dip before and after. Both have been smoothed out.

Case B (0/0): A2 now shares the dip before from D4.

Case C (1/0): D4's low level is now higher, pulled up from A2.

Case D (0/1): D4's high level is now lower, pulled down from A2.


The important thing is that the high levels in 0/1 1/0 cases are significantly lower. However, because they still fall within the high range, they are still clearly defined as high, and so all four cases still pass the same data. This means that there is no change in the program and thus no change in the sound.

Things change when we decrease the resistance even more (this is the interesting part).

A2 and D4 (~95ohms):

A

A2: 1 / D4: 1

B

A2: 0 / D4: 0

C

A2: 1 / D4: 1

D

A2: 0 / D4: 0


Now things are weird: both 1/0 and 0/1 cases are no longer the same. In Case C, D4 is pulled up so far by A2 that it no longer reads as a 0. In Case D, A2 is pulled down so far by D4 that it no longer reads as a 1.

This simple change alter the programs and thus causes a change in the sound. Importantly, this is still totally deterministic. A high A2 will always pull up a low D4, and vice versa. This means that the sound effect it has can be counted on!

But what if we don't want to count on it? We can actually teeter right at the threshold of where Case C and D turn from normal to weird. Sometimes they reach their intended logic levels, but they're so close to the threshold, that sometimes they cross over and turn weird. This causes the program to behave pretty wildly, but this could be desirable.

coming soon !