The keyboard is heavy. And it was clear from the orientation of the main QWERTY portion that it is intended to be mounted at an angle. Each key has a long travel and feels very solid as they are depressed. They don't have the "click" of an IBM M keyboard but feel very satisfying none-the-less. The PCB is 2-layer and obviously hand-drawn with curved traces and a very interesting array of vertical and horizontal wavy traces at the top where a large number of jumpers in vias between the top and bottom had been added manually to create a specific set of key to XY mappings.

There is one IC, a couple of filter capacitors and a set of pull-up or pull-down resistors on a parallel bus. Signals from the IC are wired to one side of a PCB connector. Signals from the keys themselves are wired to the other side of the connector and another connector at the other side of the PCB. It is (or seemed) obvious which connector pins supply power to the IC. A 15 uF electrolytic capacitor with a 35 VDC rating was no help deciding what voltage the IC ran at. There are 15 signals from the IC that go to the connector. Two connected to the large power traces and the rest to the keyboard array. It was easy to guess that the IC output keyboard data in some sort of parallel fashion.

I could not make out the part number on the IC but I could tell it was manufactured by AMI. I did a bunch of online research and found out that AMI made a series of keyboard encoders in the 1970s but no datasheets for these parts exist today. I could find nothing that resembled the part on my keyboard.

I decided to apply some power to see what would happen. My keyboard had a 1974 date-code and I figured that keyboards of that era would have been powered by +5 volts with a parallel output of some kind (although I was a little confused by the fact that my keyboard had 15 apparent data signals going to the edge connector - my research indicated that they usually had 7 data signals plus a strobe and maybe parity). The electrolytic capacitor indicated the polarity and a quick DMM measurement indicated no short so I applied +5 volts with a 100 mA limit. The PSU immediately went into current limiting mode. hmm.... I looked and looked and didn't see any apparent shorts. Then I noticed that every key had 4 IOs and two of the IOs were connected to power! What?!?! More research and I learned about hall-effect key switches. Apparently these are sort-of the Cadillac of key switches. Each key has a hall-effect sensor (IC) and a magnet. They are incredibly reliable because all the key has to do is move the magnet over the sensor. No contacts to corrode or break down. Each key takes power and has one or two outputs that pulse when the magnet moves past the sensor. Typically each key has two open-drain outputs that go low simultaneously when the key is pressed. The two outputs are used in a XY array for an external encoder chip. One of the really cool attributes of hall-effect keys, I read, was that they don't need to be debounced. The sensor IC has hysteresis and generates a clean signal upon each keypress. Another cool attribute is that the keyboard has inherent N-key rollover.

I upped my PSU current limit to an amp and powered up again. This time it maintained 5 volts and was supplying just over 400 mA. Nothing got hot and the current remained steady. I figured that was a good sign; all the keys on the keyboard required quite a bit of current. But then I thought about the machine(s) this keyboard might have been part of in 1974 and realized that 400 mA for the keyboard was probably nothing compared to the power-budget of the entire machine.

Next up was to see if I could see anything on the signals coming from the keyboard. I started with an oscilloscope and looked at each signal while pressing various keys. Nothing. Some signals appeared to be logic high and some signals appeared to be logic low but nothing changed, no matter what I did to the keyboard. I then probed the two outputs of each button. There was a short pulse on each when the key was pressed! Cool! So these were, in fact hall-effect keys. But nothing was happening on the other side of the keyboard encoder chip.

I pondered for a while and did more online research. Then some reference to the MOS IC technology of the time hinted at a solution. The KR2367 keyboard encoder used in the SWTP PC needed a negative bias supply. A bit more research indicated that -12 volts seemed common. I looked at the PCB layout some more. There was a trace, next to the lines supplying +5 volts and GND, to the IC that was routed differently than the apparent data lines next to it. I guessed that this might be the bias supply. I set the second output channel on my PSU to -5 volts with a tiny current limit and powered the keyboard up with a DMM current monitor in line. The keyboard was taking about 1 mA on the negative supply so I figured nothing was going to be fried. I started probing the signals again with the scope and pressing keys.

Success!!!! Some signals started changing voltage levels and then I found 3 signals that looked like they had a strobe on them that more-or-less matched the timing of the keys themselves. Each pulse was about 40 uSec long (they varied a bit, seemingly between 40-60 uSec).

Time to see if I could figure out what all those signals (now 14 since I had used one for the bias supply). I turned to a very old, but trusty, HP logic analyzer because it had more than the 8 signals in my easy-to-use saleae USB device. I wired it to all 14 signals and set it to trigger on any of the signals that I had seen pulses on. It was fun to power on this logic analyzer because I hadn't used it in years. I started to see data that made some sense. One signal seemed to strobe high for every keypress. Two other signals appeared to be strobes that only went low for some keypresses. One signal went high when either SHIFT key was pressed or when the SHIFT-LOCK key was low (mmm...how does the decoder figure out is is still pressed???). All but one of the remaining signals were set valid before the strobe and seemed consistent for each key pressed. So my initial guess that this was a parallel output keyboard seemed correct.

There were a few anomalies that I couldn't explain and would show up later but I decided to press onward.

My next idea was to try to capture the value of the "data" signals for each strobe and see if I could create a map of data values to keys. Since I had one signal that seemed to pulse on every keypress I thought that I could use a simple Arduino program to capture the values of the other signals when that pulse ended and print them. I mapped the other two pulses separately. They only were pulsed for keys on the numeric keyboard and I could see no pattern so I decided to ignore them (they were not important for my purpose of getting keypress data out of the keyboard). The Arduino experiment was successful and I soon had a table of all keypresses to 9-bit data values. I guessed that perhaps the keyboard might have some relation to the traditional 7-bit ASCII table and cross referenced the alpha and numeric key values to ASCII values. Success! It was clear that at least 7-bits of the keyboard output were ASCII values. It was soon clear that one of the outputs was an odd-parity bit. The remaining changing bit only went high for certain numeric keys or control keys. I couldn't figure out any association and because I had a good map from 7 of the other data bits, I decided to ignore this signal.

All of the alphanumeric keys sent their equivalent in ASCII. Some, but not all, of the "control" keys sent their equivalent in ASCII (for example Carriage Return and Linefeed both sent what we would expect today). The numeric keys all sent what we would consider obsolete Control Characters. I guess that this keyboard's design lay in the time where what we consider ASCII was in its prototypical form, the control codes were in flux. Interestingly, this keyboard has no "CTRL" key. Just a set of dedicated CTRL functions (for example, the BS key sends a Backspace - 0x08 - and the DEL key sends Delete - 0x7F).

That left only one other signal on the connector edge I couldn't figure out. It never changed so I guessed it might be an input to the keyboard encoder IC. One of the keys on the keyboard was labeled "REPEAT". However, that key sent a valid 7-bit code, just like any other key. I made a guess that perhaps the decoder IC would repeat a previous key press upon receipt of the "REPEAT" keycode at a frequency set by this mystery signal. I connected a signal generator set to a few Hz output via a 10 k-ohm resistor to the pin. The resistor would protect the keyboard IC in case the signal was an output. The experiment was a failure. No behavior changed. I then tried just setting the pin to both polarities via a resistor. Again, no behavior changed. So I had one signal that I didn't have any idea of its function. But I could get data out of the keyboard. I decided to leave that signal be.

I wanted a serial data stream for my bigger project so I decided to use some spare parts to build a parallel-to-serial converter. I employed an almost equally ancient isolated DC-DC supply to generate the negative supply voltage and a spare PIC 16F883 micro-controller to convert the 7-bit parallel output to a serial data stream. Because this was to go in a retro computer I decided to also add the ability to drive an incandescent light bulb "SHIFT" indicator and a nice bell sound upon receipt of the BEL control character using PCM data and a PWM filtered output. I wrote the code in assembly. 259 instruction words plus about 2K locations for a 7-bit ASCII lookup table and "bell" sound PCM 7-bit sound (using a 62.5 kHz PWM output). I created the sound using Audacity to downsample a canned sound to 8-bit unsigned ints and then a simple C program to convert that to two 7-bit values packed into each PIC program word.

All coded and seemingly working until it quit while I was testing. Or at least a whole bunch of keys on the keyboard stopped sending data. Oh crap. I worried that I had accidentally shorted something and blown either the AMI decoder IC (bad, but at least I could replace it with a modern micro-controller) or a bunch of keys because I shorted something to a data line (terrible because I had no replacement keys). I used the scope to verify that the keys were still sending pulses when they were pressed. Whew. But now I thought the decoder IC was blown. Because replacing it would be a huge PIA, I decided to take a close look at the PCB traces in case there might be something shorted (or I had added a short with some piece of wire, etc). Perhaps it would output nothing if more than two of its input signals had a pulse on them at a time. I noticed that in a few places there was still corrosion and some gunk between traces. I used an old toothbrush and some rubbing alcohol to give the entire board a good cleaning. Success. It was now working again.

So, in the end, I have an old keyboard that has an old - but satisfying - feeling that can output 7-bit ASCII values for keypresses, supports a repeat function (press REPEAT and it will repeat the previous key pressed at about 4 Hz until REPEAT is pressed again or another key is pressed) and interprets the BEL (0x07) control character to generate a nice bell sound.

I've included the schematic for my circuit, Microchip MPLABX project for the the code and a couple of links I found useful in case anyone is interested.