Datasheet legend
Ab/c: Fractions calculation
AC: Alternating current BaseN: Number base calculations Card: Magnetic card storage Cmem: Continuous memory Cond: Conditional execution Const: Scientific constants Cplx: Complex number arithmetic DC: Direct current Eqlib: Equation library Exp: Exponential/logarithmic functions Fin: Financial functions Grph: Graphing capability Hyp: Hyperbolic functions Ind: Indirect addressing Intg: Numerical integration Jump: Unconditional jump (GOTO) Lbl: Program labels LCD: Liquid Crystal Display LED: LightEmitting Diode Liion: Lithiumion rechargeable battery Lreg: Linear regression (2variable statistics) mA: Milliamperes of current Mtrx: Matrix support NiCd: NickelCadmium rechargeable battery NiMH: Nickelmetalhydrite rechargeable battery Prnt: Printer RTC: Realtime clock Sdev: Standard deviation (1variable statistics) Solv: Equation solver Subr: Subroutine call capability Symb: Symbolic computing Tape: Magnetic tape storage Trig: Trigonometric functions Units: Unit conversions VAC: Volts AC VDC: Volts DC 


The other day (December 20, 2012 to be exact; just a day before the world was supposed to come to an end according to some Mayan calendar), a gift package arrived in the mail, all the way from Germany. In it, a kit for an emulator of an old East German desktop programmable calculator, the Robotron K1003, which dates back to 1978 or thereabouts.
VEB Robotron (the abbreviation VEB stands for Volkseigener Betrieb, or Peopleowned Enterprise), based in Dresden, was East Germany's largest electronics manufacturer. Among other things, it manufactured calculators, desktop computers and mainframe computers as well. This included the K1000 line of desktop calculators. Of these, the K1003 had the most memory and also featured a builtin printer.
These K1000 machines present a curious mix of features. The size, the ability to print (albeit not display) alphanumeric characters remind me of the SR60 from Texas Instruments. But the reverse polish logic definitely smells like HP. On the other hand, the calculator only has a 3level stack (a nontrivial limitation compared to the 4level stack of HP calculators). It also has guard digits (the internal precision is 12 decimal digits, of which 10 are displayed) which is again reminiscent of Texas Instruments devices.
In 2012, Michael Berger from Germany decided to resurrect this design. He created an emulator for the K1000 that is implemented on a standard microcontroller. He then created a kit comprising the requisite printed circuit boards, parts, and most importantly, a professional quality keyboard.
Michael was kind enough to send me one of these kits as a Christmas present. And it arrived a few days early, leaving me enough time to put it together so that it can go under the Christmas tree fully assembled and working. The picture on the right shows the machine on my testbench; I have yet to build a shorter cable to connect the display, and mount the display itself permanently.
But now that I got this calculator working, I of course had to find out more about its programming model. I have been able to locate some vintage manuals online, and these were sufficient to teach me the basics. Although I have not yet played with more advanced programming features such as conditional jumps, indirect memory addressing and the like, I endeavored to put together a simple version of my standard programming example, the Gamma function. More specifically, an implementation of Stirling's formula, accurate to the full displayed precision of this calculator for arguments greater than 5, computing the natural logarithm of the Gamma function. Most notably, this program uses no memory registers; I was able to work around the limitations of the 3level stack and perform all requisite calculations using the stack only. Without further ado, here is the program (to use it, enter the argument and hit STM x!):
0000 155 MARKE 0001 004 x! 0002 127 ↑ 0003 127 ↑ 0004 053 1/x 0005 106 2 0006 124 * 0007 077 Π 0008 124 * 0009 055 √x 0010 015 ln 0011 066 x⇔y 0012 123 : 0013 076 1 0014 125 − 0015 066 x⇔y 0016 015 ln 0017 126 + 0018 124 * 0019 124 * 0020 066 x⇔y 0021 054 x² 0022 054 x² 0023 054 x² 0024 124 * 0025 076 1 0026 076 1 0027 104 8 0028 104 8 0029 053 1/x 0030 126 + 0031 066 x⇔y 0032 054 x² 0033 123 : 0034 076 1 0035 115 6 0036 104 8 0037 107 0 0038 053 1/x 0039 125 − 0040 066 x⇔y 0041 054 x² 0042 123 : 0043 076 1 0044 106 2 0045 115 6 0046 107 0 0047 053 1/x 0048 126 + 0049 066 x⇔y 0050 054 x² 0051 123 : 0052 116 3 0053 115 6 0054 107 0 0055 053 1/x 0056 125 − 0057 066 x⇔y 0058 054 x² 0059 123 : 0060 076 1 0061 106 2 0062 053 1/x 0063 126 + 0064 066 x⇔y 0065 123 : 0066 165 ENDE