HP-15C Synthetics


It is not new what I found here, it was only new for me. I tried to test it with Nonpareil (V0.77 Win32, also not new), but failed. Is there an "emulator" out there who offers this feature?


Edited: 15 May 2013, 7:02 a.m.


I dont't think any emulator will offer this feature, this is a behavior due to the CPU hardware and not due to any opcode of the CPU. It could be added, but is it useful ? ;)


Is it useful?!? For what purpose do I need an "emulator"? :)
Why do I collect HP's caluclators? Do I need to answer all qeustions? Did Eric Smith read my eMail? What would happen if we stop asking?


"Never stop asking." - A. Einstein

(Is this a secret order?)


Nonpareil allows to read and write its state to XML files. The written file is gnu-zipped but that's not needed to read it. Thus you can write the state to a file, gunzip it, modify it and read it back.

As a proof of concept I modified the Y-register according to the description and got the same effect as mentioned in the article:

Since a 3 rotates to a xC the small o is the display code for xC.

For this I modified the following address in the memory section of the state-file which represents the Y-register:

<memory as="ram">
<loc addr="000" data="0000000c000000"/>

So after the transfer execute [RDN] and then [f] [PREFIX].

Sorry that I can't explore any more right now but I hope I could lead you into the right direction. Let us know your findings.

Kind regards


Edited: 15 May 2013, 10:24 a.m.


Yes, brute force, modify the state file and start the "emulator" again. That is result oriented the best way.

What I'd like is to simulate as close as possible the keyboard to get a virtual clone of the real thing. I was able to do so with Nonpareil 0.77 for the Voyagers' keys in the rightmost column + ON key to get keybord test, self test, reset, and continious self test. Alas I failed to get the ON + x^y that way.



Could you elaborate on how to run the tests?




Hello Thomas,

have a look here.



Sorry if wasn't clear but I'm familiar with running the tests on real calculators. But I had no luck with the same procedure using an emulator. What's the exact procedure here?

Many thanks in advance



Sorry, but that depends on the emulator you use, it must offer the possability to press at least two keys at the "same" time.

Nonpareil-Win v0.77 uses KML files to define this and that, inter alia mapping of PC keys to calculator keys. If you append

scancode 115   map 115     44 end  # s - STO
scancode 114 map 114 45 end # r - RCL
to a Voyager KML file you may use s and r for STO and RCL. By chance I found the undocumented feature to map two calculator keys:
# experimental:
scancode 59 map 59 41 map 59 48 end # ; - change digit sep.
scancode 33 map 33 41 map 33 40 end # ! - ON +
scancode 34 map 34 41 map 34 30 end # " - ON -
scancode 167 map 167 41 map 167 20 end # § - ON *
scancode 36 map 36 41 map 36 10 end # $ - ON /
It is ment for a german PC keybord, so ';' is the shifted comma to toggle the decimal separator, and the others are the shifted 1-2-3-4 for the self tests. Use all from deep sleep.

But this is only for the a. m. version 0.77 of Nonpareil for windows. Alas Eric Smith did un-publish it years ago.



Thanks for the explanation. I was assuming there must be some kind of trick to do it.




The state file would be a good way to investigate some of the internal behaviours on the 15C.

E.g. the matrix inversion and solutions to systems of equations use a Doolittle LR decomposition with partial pivoting. My suspicion is that the pivoting information is stored in the matrix descriptor so the conversion can be undone to restore the original matrix.

- Pauli


Open the following XML file in Nonpareil 15C and run [GSB A].



<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE state SYSTEM "nonpareil.dtd">
<state version="1.00" model="15C" platform="voyager" arch="nut">
<chip name="Nut">
<reg name="a" data="b1fffff1f36000"/>
<reg name="b" data="b1fffff1f36000"/>
<reg name="c" data="00000000000eae"/>
<reg name="m" data="00000000a00000"/>
<reg name="n" data="11000000000000"/>
<reg name="g" data="09"/>
<reg name="p" data="c"/>
<reg name="q" data="4"/>
<reg name="q_sel" data="0"/>
<reg name="fo" data="00"/>
<reg name="s" data="0800"/>
<reg name="pc" data="0000"/>
<reg name="stack" index="0" data="0096"/>
<reg name="stack" index="1" data="0000"/>
<reg name="stack" index="2" data="0000"/>
<reg name="stack" index="3" data="0000"/>
<reg name="decimal" data="0"/>
<reg name="carry" data="0"/>
<reg name="awake" data="0"/>
<reg name="pf_addr" data="00"/>
<reg name="ram_addr" data="007"/>
<reg name="active_bank" index="0" data="0"/>
<reg name="active_bank" index="1" data="0"/>
<reg name="active_bank" index="2" data="0"/>
<reg name="active_bank" index="3" data="0"/>
<reg name="active_bank" index="4" data="0"/>
<reg name="active_bank" index="5" data="0"/>
<reg name="active_bank" index="6" data="0"/>
<reg name="active_bank" index="7" data="0"/>
<reg name="active_bank" index="8" data="0"/>
<reg name="active_bank" index="9" data="0"/>
<reg name="active_bank" index="a" data="0"/>
<reg name="active_bank" index="b" data="0"/>
<reg name="active_bank" index="c" data="0"/>
<reg name="active_bank" index="d" data="0"/>
<reg name="active_bank" index="e" data="0"/>
<reg name="active_bank" index="f" data="0"/>
<chip name="Voyager LCD">
<reg name="enable" data="1"/>
<reg name="blink" data="0"/>
<memory as="ram">
<loc addr="000" data="00000000000000"/>
<loc addr="001" data="00000000000000"/>
<loc addr="002" data="00000000000000"/>
<loc addr="003" data="00000000000000"/>
<loc addr="004" data="b1fffff1f36000"/>
<loc addr="005" data="00000000000008"/>
<loc addr="006" data="0000000000000c"/>
<loc addr="007" data="00000000000eae"/>
<loc addr="008" data="00000000000000"/>
<loc addr="009" data="00800000620000"/>
<loc addr="00a" data="7fa20200880000"/>
<loc addr="010" data="01000000000000"/>
<loc addr="011" data="02100000000001"/>
<loc addr="012" data="11000000000000"/>
<loc addr="013" data="00000000000000"/>
<loc addr="014" data="f0000000000439"/>
<loc addr="015" data="c0d2f6f6f6f6f6"/>
<loc addr="016" data="000000000001fa"/>
<loc addr="017" data="000000000005fb"/>
<loc addr="018" data="00000000000000"/>
<loc addr="019" data="01240000000000"/>
<loc addr="01a" data="00000000a00000"/>
<loc addr="0c0" data="00000000000000"/>
<loc addr="0c1" data="00000000000000"/>
<loc addr="0c2" data="00000000000000"/>
<loc addr="0c3" data="00000000000000"/>
<loc addr="0c4" data="00000000000000"/>
<loc addr="0c5" data="00000000000000"/>
<loc addr="0c6" data="00000000000000"/>
<loc addr="0c7" data="00000000000000"/>
<loc addr="0c8" data="00000000000000"/>
<loc addr="0c9" data="00000000000000"/>
<loc addr="0ca" data="00000000000000"/>
<loc addr="0cb" data="00000000000000"/>
<loc addr="0cc" data="00000000000000"/>
<loc addr="0cd" data="00000000000000"/>
<loc addr="0ce" data="00000000000000"/>
<loc addr="0cf" data="00000000000000"/>
<loc addr="0d0" data="00000000000000"/>
<loc addr="0d1" data="00000000000000"/>
<loc addr="0d2" data="00000000000000"/>
<loc addr="0d3" data="00000000000000"/>
<loc addr="0d4" data="00000000000000"/>
<loc addr="0d5" data="00000000000000"/>
<loc addr="0d6" data="00000000000000"/>
<loc addr="0d7" data="00000000000000"/>
<loc addr="0d8" data="00000000000000"/>
<loc addr="0d9" data="00000000000000"/>
<loc addr="0da" data="00000000000000"/>
<loc addr="0db" data="00000000000000"/>
<loc addr="0dc" data="00000000000000"/>
<loc addr="0dd" data="00000000000000"/>
<loc addr="0de" data="00000000000000"/>
<loc addr="0df" data="00000000000000"/>
<loc addr="0e0" data="00000000000000"/>
<loc addr="0e1" data="00000000000000"/>
<loc addr="0e2" data="00000000000000"/>
<loc addr="0e3" data="00000000000000"/>
<loc addr="0e4" data="00000000000000"/>
<loc addr="0e5" data="00000000000000"/>
<loc addr="0e6" data="00000000000000"/>
<loc addr="0e7" data="00000000000000"/>
<loc addr="0e8" data="00000000000000"/>
<loc addr="0e9" data="00000000000000"/>
<loc addr="0ea" data="00000000000000"/>
<loc addr="0eb" data="00000000000000"/>
<loc addr="0ec" data="00000000000000"/>
<loc addr="0ed" data="00000000000000"/>
<loc addr="0ee" data="00000000000000"/>
<loc addr="0ef" data="00000000000000"/>
<loc addr="0f0" data="00000000000000"/>
<loc addr="0f1" data="00000000000000"/>
<loc addr="0f2" data="00000000000000"/>
<loc addr="0f3" data="00000000000000"/>
<loc addr="0f4" data="00000000000000"/>
<loc addr="0f5" data="00000000000000"/>
<loc addr="0f6" data="00000000000000"/>
<loc addr="0f7" data="00000000000000"/>
<loc addr="0f8" data="00000000000000"/>
<loc addr="0f9" data="00000000000000"/>
<loc addr="0fa" data="00000000000010"/>
<loc addr="0fb" data="ff00ff965daff0"/>
<loc addr="0fc" data="f1c1f196bf5daf"/>
<loc addr="0fd" data="f940f141f0f20a"/>
<loc addr="0fe" data="2213089dde0080"/>
<loc addr="0ff" data="00d002f4f40000"/>


Hello! That's a nice one! :)
Thank you.


After quite a bit of fiddling I found another message that could be displayed. Just use these lines in the XML file above instead:

<loc addr="0fe" data="003d0dc0000000"/>
<loc addr="0ff" data="00d08278881000"/>

This is the listing of the corresponding program lines:

001 - 42,21, 0  LBL 0             
002 - 22 0 GTO 0
003 - 22 25 GTO I
004 - 43,30, 8 TEST 8
005 - 42, 5, 0 DSE 0
006 - 42 0 x!
007 - 42,21, 0 LBL 0
008 - 42,21, 0 LBL 0
009 - 42,21, 0 LBL 0
010 - 42,21, 0 LBL 0
011 - 48 .
012 - 42,21,14 LBL D
013 - 45 14 RCL D
014 - 42,21, 0 LBL 0

If you're interested in the Perl script I can post it here.



Edited: 15 May 2013, 6:37 p.m.


What I tried last nite was just to fiddling with that (ON)+(Y^X) in two "emulators". But no success. IMHO there must be some code in the ROM that shifts the X register 22 bits to the right. Alas I did not find out yet, I am stuck at the branch when the Voyager tests what key is pressed when waking up from deep sleep.

In this respect I did no tests with a real HP15C yet. But my aim is to lite nothing but the G of GRAD. On an HP41 you need MCode for that, on Voyager it should be possible with synthetic only (if register 9 and A are accessible).




No there is no code in the rom to do that, it is a pure hardware behavior, so a 'simple' nut emulation can not support this synthetic.

But now go15c support it. Fell free to crash your emulation (and perhaps the app too) when trying to do nice display see :


Edited: 16 May 2013, 5:06 a.m.


In that case I do not need to look any further, thank you. Also for the free GO12C :) Alas, no Android, no luck :(



But my aim is to lite nothing but the G of GRAD.

Use the following entries in the state file:

<loc addr="0fe" data="00000000000000"/>
<loc addr="0ff" data="00000000004000"/>

Which translates to this rather boring program:

001 - 42,21, 0  LBL 0             
002 - 44 0 STO 0
003 - 42,21, 0 LBL 0
004 - 42,21, 0 LBL 0
005 - 42,21, 0 LBL 0
006 - 42,21, 0 LBL 0
007 - 42,21, 0 LBL 0
008 - 42,21, 0 LBL 0
009 - 42,21, 0 LBL 0
010 - 42,21, 0 LBL 0
011 - 42,21, 0 LBL 0
012 - 42,21, 0 LBL 0
013 - 42,21, 0 LBL 0
014 - 42,21, 0 LBL 0




If the DM-15CC is considered an emulator I can confirm that the "rotate" function works as described in the article. However the HEllo PPC program doesn't work: the display keeps showing me RUNNING.




...aha... interesting! So if there is no MCode for the 'rotating' the DM-15CC does more than interpret the Voyager ROM only.


Possibly Related Threads...
Thread Author Replies Views Last Post
  Synthetics John W Kercheval 13 1,078 05-23-2012, 03:02 PM
Last Post: Garth Wilson
  Photo of my HP 15c | 15c LE DigiGal 2 508 10-12-2011, 12:34 PM
Last Post: DigiGal
  HP 15c LE vs HP-15C dimensions - BOTH ARE HUGE! Joerg Woerner 4 661 10-03-2011, 06:53 AM
Last Post: Jim Johnson
  HP 15C and 15C LE not the same dimensions? Derek 16 1,433 09-30-2011, 05:33 PM
Last Post: Derek
  Original 15C Keyboard Test Works With 15C LE!!! DigiGal 5 790 09-26-2011, 07:33 PM
Last Post: M. Joury
  15C LE Synthetics Kerem Kapkin (Silicon Valley, CA) 11 855 09-21-2011, 06:46 PM
Last Post: Paul Dale
  How would a new HP 15c+ affect 15c market value? megarat 5 657 07-07-2010, 06:48 PM
Last Post: John Stark
  HP 15C: Any cure for an HP 15C with "snappy" keys? Jeff 2 426 09-05-2001, 08:33 PM
Last Post: Jim

Forum Jump: