Hardware assembler / EMUI

Early computer designers were cheap masochists. This front panel is much better yet could have been made 50 years ago !

Similar projects worth following
I implement a more user-friendly electromechanical front-panel for a computer that could have been built in the 50s or 60s. Rotary encoders free us from those annoying binary switches and the layout reflects the machine's instruction and architecture, making it more suitable to write longer sequences of code with fewer errors.

This module is called the "Assembler" because it directly assembles instructions from buttons, saving us the effort of manually encoding assembly language into binary. A corresponding disassembly output provides direct feedback and reduces users' strain and efforts for coding and debugging, without a single line of code !

This EMUI (ElectroMechanical User Interface) is a subproject of #YGREC8 using the advances of #Numitron Hexadecimal display module  and reusing the experience of #YGREC-РЭС15-bis :-) (actually it's a 2nd version or generation of panel, after this log)

This project builds the user interface / front panel of a neovintage / electropunk 8-bits computer. It's pretty simple : diodes, buttons, switches, relays, lamps (and a few extras to interface with modern stuff). But the organisation and the ease of use are better than most computers built before the 80s.

Since no computer today uses that sort of interface, it's being designed "for educational purposes" : it's much less confusing for beginners who get easily scared by rows of buttons, since they are grouped in ways that make much more sense. Nobody would otherwise use such an interface for actual work, right ? ;-)

In this project, I explore why front panels were so cumbersome.

Of course there is the argument of cost and price. By the 70s, few people would actually toggle switches to program a computer, except those too poor to get a real computer system (or the kids undergoing training). Those miserable folks would have to

  1. write their code in assembly language
  2. translate their code into binary
  3. input the binary codes with switches on the front panel

This is an error-prone procedure that would be suitable only for short sequences of code, such as a bootloader or a deadstart routine. For example, the CDC6600 had a panel of 144 switches to encode the bootstrap sequence.

CDC6600 dead start panel switches (Ed Thelen)

But the CDC6600 is a "high end" system (the top of the line !) that could afford the marginal expense of so many switches. Low-end, cheap, affordable computers make a lot of compromises and the user's time is a commodity. Save a hundred switches and let the user do the work !

PDP8/E front panel (Wikipedia)

And even as microprocessors arrived, this archaic tradition persisted. But WHY BINARY ? The above front panel has a 6-position rotary encoder and, as this IBM System/34 panel shows, people knew that hexadecimal rotary encoders existed in the 70s:

IBM System/34 front panel

Isn't it way better than toggling countless buttons ? Hexadecimal encoders are awesome, no ? So I bought some on eBay when I found them, many years ago :-)

Inside a rotary hexadecimal encoding switch

I have featured them on past projects such as my frequency generator:

And for #YGREC16 - YG's 16bits Relay Electric Computer I used more of them :-D

The assembler board for YGREC16

The front panel has two main purposes.

  1. enter programs
  2. diagnose, inspect, control the hardware

It appears that 1) is a special case of 2) and the front panel must be carefully designed to provide enough introspection features. Actually, it's even part of a larger 3) debug software. So the panel of this project is in fact the central module of the debug system of the processor.

The above diagram shows the modules (in light blue) that this project aims to build.

  • There are entry modules (switches and buttons) : the assembler panel, the start/step/stop logic, and the Force Address module.
  • Most entry panels are coupled with a display panel : PC, Result, DST, SRC, Instruction (the disassembly panel).

Most values (except the instruction word) are 8-bits wide so 2 Hexadecimal modules are used for PC, Res, DST, SRC and the immediate field of the instruction. That's 2×5=10 modules to assemble. Which by chance is how many PCB I have ordered :-) (the 5 prototype boards would be used later for other purposes because their pinout and dimensions are not compatible so it would break the modularity of the whole design)

  1. The easiest part is what forces and displays the instruction address : it's a set of encoders and display modules,...
Read more »

  • 25PDT

    Yann Guidon / YGDES4 days ago 0 comments

    This switch was used to share a printer (or a computer) with its 25-poles dual-throw switch :

    The drawback is its purely mechanical nature. It can't be controlled by another electrical circuit.

    The knob is not too hard to turn but the diodes-based multiplexer is more convenient because an external computer, or another relay, can take over the function.

    I wonder how I could use this insane switch anyway...

  • Numitron display modules

    Yann Guidon / YGDES4 days ago 0 comments

    After the success of the 5 prototype units of the #Numitron Hexadecimal display module , the 10 series units have been fabricated. I now have 15 hexadecimal modules :

    • The 5 prototypes will be used for an "event counter". It could be a cycle counter, or a condition selected from a set of pulse sources.
    • 2 modules for the PC
    • 2 modules for the Imm8 section of the instruction
    • 2 modules for SRC
    • 2 modules for DST
    • 2 modules for RES

    Unlike the prototype modules, the new modules have their IV-9 soldered with the full length of the wires preserved, so they can be resoldered to fit a useful mechanical layout. I had to solder them anyway so the whole could be tested.

    I'm pretty satisfied with the results, and now I have to build the other decoders for the remaining fields of the instruction word. I'll start with the @SRC, the COND and the @DST fields that are 3 bits wide each. The circuit has been covered already.

    I must also work on the binary counter but I have no idea which project it belongs to. Probably here ?

  • The dawn of the micros

    Yann Guidon / YGDES07/25/2018 at 11:00 3 comments



    Popular Electronics had in fact been running a series written by Roberts for several issues before January 1975. The series was billed as a short course in “digital logic.” In the December 1974 issue, Roberts walked readers through building a “very low cost computer terminal,” which was basically an octal keypad that could input values into an 8-bit computer. In the course of describing the keypad, Roberts explained how transistor-to-transistor logic works and also how to construct a flip-flop, a kind of circuit capable of “remembering” digital values. The keypad, Roberts promised, could be used with the Altair computer, to be announced the following month.

    It’s unclear how many Popular Electronics readers actually built the keypad, but it would have been a very useful thing to have. Without a keypad or some other input mechanism, the only way to input values into the Altair was through the switches on the front panel. The front panel had a row of 16 switches that could be used to set an address and a lower row of eight switches that could be used to control the operation of the computer. The eight right-most switches in the row of 16 could also be used to specify a value to be stored in memory. This made sense because the Intel 8080 used 16-bit values to address 8-bit words. The 16 switches on the front panel each represented a bit—the up position represented a one, while the down position represented a zero. Interacting with a computer this way is a revelation (more on that in a minute), because the Altair’s front panel is a true binary interface. It’s as close as you can get to the bare metal.

    As alien as the Altair’s interface is to us today, it was not unusual for its time. The PDP-8, for example, had a similar binary input mechanism on its front panel, though the PDP-8’s switches were nicer and colored in that attractive orange and yellow color scheme that really ought to make a comeback. The PDP-8, however, was often paired with a paper-tape reader or a teletype machine, which made program entry much easier. These I/O devices were expensive, meaning that most Altair users in the early days were stuck with the front panel. As you might imagine, entering long programs via the switches was a chore. Eventually the Altair could be hooked up to a cassette recorder and programs could be loaded that way.


    Though clicking on switches does not offer the same tactile satisfaction as flipping real switches, playing with the Altair simulation is a great way to appreciate how a binary human/computer interface was both horribly inefficient and, at least in my opinion, charmingly straightforward.

    IMSAI 8080 computer at the Computer History Museum

    No wonder I focus on the UI and not just the processor...

  • Start/Step/Stop

    Yann Guidon / YGDES07/24/2018 at 23:48 0 comments

    One simple yet critical circuit is the clock generator.

    It must be controlled with the start/step/stop button : it's a SPDT switch with 3 positions, including a middle (no contact) and a temporary position.

    So the clock generator must work both in monostable and multivibrator modes...

    I already have a 24V electromechanical pulse counter as well as a safe-like rotary knob that generates pulses to help with longer sequences and reduce wear on the SPDT button.

    The pulse counter can run at maybe 8 pulses per second, which is 3 times slower than the expected clock frequency. The pulse rate must be limited in this case... a predivider might be necessary.

    Initially I wanted to use the mains' frequency (50Hz over here) to "clock" the whole circuit. A dedicated transformer uses a single diode to rectify the 50Hz sine and create 10ms-long half-sine pulses, with 10ms gaps. But 50Hz might be too fast... and it wouldn't be synchronised with external signals (race conditions become possible).

    A divide-by-2 circuit is not too hard to make with a few relays. A divide-by-4 predivider is possible too. But apparently this part is more sophisticated than I would think, but I'm not surprised because it was a problem already with the #SPDT16and #YGREC16...

    The rotary encoder sends 100 pulses per rotation, and I can use the A or B output at will. It works with 4V/50mA approximately (some spikes/overshoot appears on the output at 5V). I'll try to see if I can gang that output to the pulse counter, through a transistor for example...

    Further thinking makes me to ditch the EM pulse counter altogether. It's too slow and will only make things uselessly too complicated.

    A much better approach is to use the 5 prototype digits to build the cycle counter, since the predivider is not that hard to build (and can reuse the internal relays) and a 5×4 bits binary ripple counter could be great (ditch decimal !). At least, the counter could work at full speed !

    Now, the cycle control unit has :

    • One RESET/RUN toggle switch (to clear the state or let the program run)
    • 4 push buttons : STOP, STEP, SEQ, START
      * STOP just clears a latch that is set by START
      * SEQ momentarily shorts the latch's output
      * STEP sends only one pulse to nudge the oscillator for one cycle (monostable)
      * STEP and SEQ only work when the latch is in STOP state
    • One rotary button (acts like multiple STEP pulses)
    • Pulses are counted and displayed with 5 hex digits => another reset button is required.

    it's getting crowded now... so I must split it: the pulse counter is relegated to a separate module, as an "event counter" that can be triggered by other modules, such as the breakpoints.

  • Panel layout

    Yann Guidon / YGDES07/21/2018 at 20:02 0 comments

    I started to sketch the panel's organisation :

    but the right side doesn't look great. Ideally, all the 7 segments modules would be stacked horizontally...

  • Tales of PDPs

    Yann Guidon / YGDES07/19/2018 at 01:25 3 comments

    Digital's minis in the 70s used a main recipe to design the front panel but there seems to be variations, even inside a given family. The main page shows the PDP8/e, but the PDP11 is interesting too :-)

    This is a rebranded PDP11/70 with its red LED dots off :

    (thanks to Thad for the picture ! more on Facebook )

    You have to turn a knob or two to display the values you want, in raw binary. The 16-bits field on the bottom could be a register value, or the datapath, the field is unmarked so it's confusing... The 22-bits wide field just above must be a bus address, which again is not directly specified.

    Notice that the rotary knob (upper right corner) has 8 positions so it could also encore octal numbers, but they decided to use only one and stick to SPST keys for data/values.

    In contrast, the PDP11/20 has a more logical layout because it better matches the processor's structure:

    DEC PDP-11 20 computer at the Computer History Museum (Wikipedia)

    You have the address, the data, the source, the destination : it seems easier to understand at a glance what's happening.

    If only they had used hexadecimal (or octal) displays instead of binary !

    Oh wait, it's not LEDs ! According to Wikipedia:

    "Another modification made to the PDP-10 by CompuServe engineers was the replacement of the hundreds of incandescent indicator lamps on the KI10 processor cabinet with LED lamp modules. The cost of the conversion was easily offset by the cost savings in electric consumption, the reduction of heat, and the manpower required to replace burned-out lamps. Digital followed this step all over the world."

    (OK I know this is about the PDP-10 but they used similar technologies, right ?)

    So my idea to use Glühbirnchen is time-accurate :-)

    Meanwhile, Digital went berserk with the PDP-15:

    PDP-15 control panel, restored by Mike Ross, 2012

    Why did they put the key labels so far from the keys ?...

    More front panel stories can be found at ! Seriously, click there, it's insane !

    IBM Stretch front panel

  • Multiplexing

    Yann Guidon / YGDES07/17/2018 at 01:06 0 comments

    In this log we look at the electrical design of the instruction address bus, which drives the ROM address decoder and the display modules. The address is set by either the PC register, the EMUI switches or an external electronic controller.

    The instruction bus has a similar design, except it has 16 bits and is driven by the diode ROM.

    The obvious constraint is parts count since relays are not free and they dissipate a lot of power...

    So in the beginning, we have the ROM decoder, driven in series with the display module. By design, the #Numitron Hexadecimal display module  has a controlled and constant input impedance (one relay coil) that greatly simplifies the series connection. They are tied to the high side, so one only has to tie it to 0V to toggle the bit.

    At 70mA, the relays are well driven, so the + side can be set at about 4V, or more if the decoder needs more coils in series.

    The tricky part is the multiplexing : there is one SPDT switch that selects the source of data, and there are 8  bits to select. That would require an OPDT (Octuple Pole Dual Throw) switch, which, even though I have a few, is far from practical...

    It is possible to remove the OPDT with the help of diodes and a single SPDT switch is required :

    This adds about 0.7V to the supply voltage but it saves complexity elsewhere. And without the diodes, there would be shorts here and there...

    This switch is easily operated by the user. But it doesn't end here ! Now, we want the bus to be taken over by an external computer. A transistor can easily short the "bus" wire to ground but it also must prevent the other current path. This is solved with another relay. That relay must be "normally closed" and must stand at least 0.07×8=0.5A.

    There is still the possibility that the user has left the SPDT switch in the position of the EMUI and that would prevent the external controller from letting the processor run freely... This is solved with the help of yet another relay that short-circuits the PC register rail to 0V, independently from the relay that inhibits the manual SPDT switch.

    There are other possible configurations but there can be no fewer than 2 relays to get the desired functionality, and the system must be functional when the external control circuits are disabled...

View all 7 project logs

Enjoy this project?



Yann Guidon / YGDES wrote 4 days ago point

Damn... I forgot to include the "Write Back / Enable" flag/lamp to the front panel...

  Are you sure? yes | no

Steve Toner wrote 07/20/2018 at 16:33 point

I don't have a problem with binary.  It is simultaneously binary, octal and hexadecimal.  There is a small learning curve, but I imagine a skilled operator could enter either octal or hexadecimal values just as quickly and accurately with binary switches as with a rotary switch.  (I still have trouble with the pattern for hex D, but all other hex digits are automatic for me.  Octal is trivial and automatic).

Note the grouping/coloring of the switches in the photos: The DEC and CDC machines are octal (grouped in threes).  The IMSAI is hexadecimal (groupings of 4).

I can think of a couple of advantages of binary as well: On a binary display, I can instantly tell if a value is negative.  The state of high bit tells me instantly.  Also, if I want to enter a negative number, I can pretty much do that directly on the front panel without much effort.  Assuming a twos-complement machine, enter the inverted value into the switches and then increment.  For example: Want to store a value of -3?  Set the switches to 111...100 then bump the last switch to get 111...101 and press DEPOSIT...

  Are you sure? yes | no

Yann Guidon / YGDES wrote 07/25/2018 at 11:21 point

Hi Steve :-)

The point here is not to make a machine that would have been operated by skilled technicians, I try to make it as accessible as possible within the constraints of 50-years old technologies. Think of it like: "what if Steve Jobs was born 30 years earlier ?" :-)

For the negative values, this is something I intend to design in the "constant" field of the assembler. It's already "solved" for the IC version because #DYPLED has a "2s complement" mode but it requires quite some relays here. Fortunately, an incrementer is also needed for PC (they would share design techniques), and they are both 8 bits wide only.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates