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 


*Forensic result in EXP mode; in FLOAT mode, the result is 9.0039554305.
Though strictly speaking, the Sharp PC1001 is not a handheld programmable calculator, as it runs from AC power only, it is smaller than many old handhelds (notably, CompuCorp's line of programmable machines) and it certainly deserves some attention, being the first small programmable calculator manufactured by Sharp.
It is also an example of an early programmable calculator with really "dumb" programmability: no branching, no jumping, no program control instructions of any kind, only straightforward execution of keystrokes entered.
Or perhaps not? I cannot help but wonder: part of the calculator's memory serves a dual purpose, storing either program steps or numbers. Perhaps it is possible to write selfmodifying programs and use this mechanism to implement branching, conditional branching, perhaps even indirect addressing?
So far, all I've been able to figure out is that as you enter program code, it fills up memory registers starting from 7, working down to 0. Logically, it'd seem that 8 program steps fill up one register, but things are not quite that simple; after entering 8 program steps, I found that already more than one memory register was erased, and conversely, entering a program between 48 and 56 steps didn't quite work if I used more than one memory register.
The programming model has other limitations. Not only is it completely unmerged (i.e., F ln is, in fact, two program steps), but functions other than arithmetic functions cannot appear in chain calculations. Further, there are no parentheses either, necessitating the use of memory registers for immediate results. These limitations may explain why I was only able to write a somewhat shortened version of my favorite Gamma function example, this time using Stirling's formula:
01 x?M 02 0 03 F 04 ln 05  06 1 07 × 08 MR 09 0 10 = 11 x?M 12 1 13 2 14 × 15 p 16 ÷ 17 MR 18 0 19 = 20 √ 21 F 22 ln 23 M+ 24 1 25 1 26 ÷ 27 1 28 2 29 ÷ 30 MR 31 0 32 = 33 M+ 34 1 35 MR 36 1
The program uses two memory registers, 0 and 1; the argument is stored in register 0, whereas the result is in register 1, and also appears on the display.