The controller is an 8021 and it has a 5V regulator. The Service Manual variously says 8V and 9.6V. It doesn't really matter and I'll power it with 12V, because that's what I have here. The PCB 12KC138F does not have any other branding. The soldering job isn't great. I don't know whether one soldered in the switches with the Heathkit version or it came already assembled from Japan. It also turns out the F7 key doesn't work on this one, so that'll need to be dealt with at some point.
Besides the attraction of quirky early '80s terminal keyboard design, the Theory of Operation had this tantalizing bit:
Powering it without anything other than a scope attached gives this on the transmit line: Which appears to be the keyboard trying hard to get the terminal to notice transitions on the XMIT line. So that aforementioned handshaking needs to be taken care of.The detachable keyboard communicates directly with the terminal CPU through a proprietary 8 bit, bit serial closed loop transmission protocol. There is one signal line out to the keyboard and one signal line returned from the keyboard. Upon an interrupt from a depressed key, a special handshaking routine is executed in firmware that allows the terminal CPU to determine which key has just been pressed on the keyboard. Also the host may transmit certain special status codes to the keyboard to turn on status lights or or beep the beeper.
Like the recent TeleVideo board, it has a dedicated RESET line, which activates at the same time as it resets the microcontroller, based on a hard-wired key chord. In this case, SHIFT-BREAK.
So the converter ends up looking very much the same, up to exactly which wire goes where. Fortunately, when one bought an H-29, included was a binder with a printout of the Z-29 source code, which someone has scanned.
The designers evidently didn't trust bit-banged RS-232 with the bit width implied by the baud rate. The serial protocol basically acknowledges every bit by toggling the other signal, and so gets delicate when the terminal wants to send a command at the same time as the keyboard is ready to send a key.
As usual, the keyboard controller tries to save work in the terminal by doing a bunch of the ASCII encoding up-front. Most of the ASCII control keys send the corresponding control character: ESC, BACK SPACE, DELETE, RETURN, LINE FEED. But not SPACE and TAB, which are instead encoded like function keys. That is because CTRL-SPACE sends NUL. This probably could have been arrived at successfully by AND'ing, but maybe that didn't fall out of how the CTRL code is arranged. SHIFT-TAB variously sends ESC - or ESC [ Z, so that would indeed have been hard to arrange in the controller.
The other function keys also send different codes from the terminal to the host when CTRL or SHIFT is applied. So they each send from the keyboard to the terminal a non-ASCII code with the eighth bit set, further arranged so that two of the bits indicate which of the two shift keys is pressed. But then the encoding runs out of bits, so the F1 - F9 keys need to be two-byte sequences with a preceding ACCESS escape code. I suppose this was deemed more compact than the simpler alternative of always sending two bytes, the first of which gave the shifts.
It is possible to undo much of this to produce a minimally functional QMK implementation.