Friday, April 20, 2018

Build of IBM 1130 console printer (1053) emulator along with testing


My parts all arrived allowing me to begin wiring up the emulator for the console printer of the IBM 1130. This printer is a 1053, an I/O or computer drive Selectric typewriter sans keyboard. The 1053 printer attaches to the 1130 computer via three SMS paddle cards - two for signals and one for power.

My device is wired with two paddle cards to plug into the two signal card sockets in the 1130. The device is built into a box, with the cables out to the paddle cards coming from the rear and a USB cable on the side to attach to a PC.

The feedback signals that are sent back to the controller circuits, which are expecting 48V and 12V. While I could build in two power supplies just for this need, it is probably easier to grab power from the 1130 via the third SMS paddle card that supplies the 1053 with 48V, 12V and 220VAC. I only need the two DC voltages and ground.

I first wired together two small boards, one holding 3 side by side 7-segment displays that will show the current print column. On the real 1053, a horizontal plexiglas strip on the front face of the printer has numbering across it and a small blue indicator attached to the typewriter carrier moves to show where the typeball will strike next.

These displays will be fed by my code in an Arduino Mega 2560 mounted in the box, which tracks the location based on spacing, backspace, carrier return, typing and tab activities to reflect where the 1053 carrier would have been at any moment. I output three BCD characters to 74LS48 chips which drive the common cathode 7 segment displays.

A real 1053 has three blue buttons across the bottom of the front face, to allow the operator to space, tab or return the carrier to the left margin. My device will have three red rectangular pushbuttons for these functions, placed below the digital column display.
IBM 1053 console printer
In addition, a real 1053 has a blue toggle handle on the left side of the front face which is pushed upwards to set a tab stop at the current column or pushed down to clear a tab stop at this spot. I installed two more red pushbuttons, mounted in a column on the left side of my box, to provide the set and clear functions.

The circuits inside an 1130 that control the 1053 effectively open collector drivers, although they have a snubber diode to absorb the reverse EMF when the solenoid coils are switched off. The solenoids inside the 1053 are attached to +48V and the other ends run to the 1130 driver cards.

Since these are open collector cards, I will be switching 5V instead of 48V. Further, with no solenoid coil involved, there is no reverse EMF. I configured the Arduino inputs to pullup mode, meaning that a resistor inside the Arduino keeps the line at 5V unless the open collector driver circuit activates and pulls it to ground. This makes the inputs inverse logic - high means not active, grounding them is a logical 1.

A 1053 printer has a number of microswitches inside that collectively provide four feedback functions. In the 1053, they take 12V from the CPU and switch it back to the 1130 to indicate when the print cycle is active and when the machine is busy doing long actions such as tab or carrier return. The other two lines indicate when the carrier it at the right margin and when there is no more paper. The 1053 has a pin feed roller and takes continuous form paper with pinfeed strips on each side.

Due to the 12V requirement, I control relays from the Arduino at 5V and those relays switch the 12V to the feedback lines into the 1130. Some resistors round out the component list for this device. Inside the box I have an Arduino, digital display board, 74LS48 driver board and a resistor board mounted.

Column display active
I had to carefully mark and cut out the locations for the five pushbuttons and the three 7 segment displays to be mounted on the board. Additionally, I had to mark and drill holes for the mounting screws for the various boards inside the box. Finally, the holes on the back for the SMS paddle card cables and side for the USB cable were drilled. 

I updated by Arduino code to provide for logical commands from the user terminal to the device, to set the left and right margins. Eventually, I could add support for switching the typeballs since the 1053 could optionally make use of an APL character set ball when the machine was running APL. 

Testing began with the commands from the PC, then proceeded to test the five buttons that provide SPACE, TAB, CR, TabSET and TabCLR. I tested them in concert with the margin commands to ensure that a CR took us to the left margin, that space moved us forward and that tabs were appropriately set and advanced to the proper stop. 

I discovered a few problems and cleaned them up. By the end of the day, I could set and clear tabs stops. tab reliably to the location, do carrier returns back to the left margin and space ahead. The space button will fire space cycles as long as the button is depressed. Since the Selectric will cycle at 15.5 characters or spaces per second, it is quite hard to get just one space. 

The solution will be modifying behavior of the buttons, which I will achieve electrically rather than trying to handle this in the Arduino code. I want the behavior to be reasonable for an operator. Therefore I want a one-shot that sends one short pulse to the Arduino then stays off until the button is released by the operator. 

Time to build three one-shots on a small PCB - the tab set and tab clear buttons are pushed while the column is not changing, and are idempotent, so multiple actions while the button is pressed are not an issue. 

Thus the remaining tasks are:

  • Build and test the three one-shots
  • Rewire existing device to use with one-shots
  • Simulate various signals from 1130 and observe results on scope
  • Mark and cut openings on box for displays, pushbuttons and cable exits
  • Install and wire two SMS paddle connector cables into the device
  • Mount Ardinuo, displays, switches and related boards
  • Install and wire third SMS paddle connector for 48 and 12V power
  • Install and plug in long USB cable to Arduino
  • Test on an IBM 1130 to verify correct operation


  1. After you have the basics working, you just gotta go back and set up the tab and CR implementation so they take the right amount of time, and the LCD display doesn't just jump from one column number to the next, but the column numbers actually ripple through all the sequential column numbers.

    FYI: back in the mesozoic age when I was in APL\360 development, we had a selectric-based test of system response time. As you probably remember, if you type an expression such as "2+2" into an APL system, it evaluates it and prints the answer "4".

    So using the 2741 (selectric-based terminal) attached to our 360\40, we'd hold down the space bar to get out to column 100 or so, type "2+2" and hit return.

    If the APL\360 software was working properly, it would type the "4" response while the carriage was still returning, and a blurred "4" would print an inch or so short of the left margin. If it printed in the left margin, we had a performance issue.

  2. Great points, David.

    Will take a bit of work to add in the ripple of the counter, but definitely will be cooler than a quantum leap to the next tab stop value.

    Indeed, my initial take used a fixed time for CR and Tab, but it wouldn't be hard to calculate the number of columns to pass and use it to vary the delay.

    No idea how the terminal emulator program would get the blurred 4 effect. I have a similar problem when I implement the APL typeball, since my APL characters are printed by overstrike of multiple typeball characters. The terminal emulator might backspace and show only the last value typed. To solve that, I might need to do something quite a bit more clever on the PC side.

  3. Hi Carl,

    I love reading your accounts of keeping them alive and well and explaining how they work.

    The marriage of old machines and new stuff in these emulators for certain subsystems I find especially fascinating.

    I have no hands-on knowledge of these old systems, though, I am purely a spectator. So please forgive me if my comment is completely off:

    > The solution will be modifying behavior of the
    > buttons, which I will achieve electrically rather
    > than trying to handle this in the Arduino code

    What about doing it like a modern terminal? By pressing the button once it activates once. After holding it down for a while it auto-repeats.

    This would of course most easily be done in software on the Arduino and give the user the best of both worlds: Single stepping for precision and speed for the long distance :-).

    Thank you for your work and writeup.


  4. Hi Carl,

    One addition you might want to consider is remembering the tab stops set between uses of the emulator. The real console has mechanical tab stops and you rely on them already being set each time you use the machine. Having to set the tab stops each time you use the emulator may get a bit tedious.

    I.e. storing the tab stops in a file on the pc and the emulator using those settings when it starts.



  5. David - I have implemented the rippling column number effect, working on the appropriate timing for CR and Tab. I/O selectric devices came with both normal and high speed carrier return features, thus the time I will implement is the performance of the high speed function from the 1053 on an IBM 1130. Tab is, AFAIK, the same on all models of I/O Selectric (e.g. 1053 or 2741).

    Marian - I have set up the one-time behavior of the three pushbuttons in software. The 1053 did not do autorepeats, thus I chose not to implement this for the sake of increased realism for 1130 operators.

    Peter - I am building in commands to send tabset or tabclear to the Arduino using new commands TS xxx and TC xxx. Any updates done by the operator using the pushbuttons will not be stored back to the PC, but you can send a file with the appropriate settings before you configure the terminal emulator to capture output lines to a file.