HP Forums

Full Version: HP-15C Synthetics
You're currently viewing a stripped down version of our content. View the full version with proper formatting.

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?

TIA.....Mike

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?

nosy.....Mike

"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:

Quote:
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

Thomas

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

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

Cheers

Thomas


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE state SYSTEM "nonpareil.dtd">
<state version="1.00" model="15C" platform="voyager" arch="nut">
<ui/>
<chip name="Nut">
<registers>
<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"/>
</registers>
</chip>
<chip name="Voyager LCD">
<registers>
<reg name="enable" data="1"/>
<reg name="blink" data="0"/>
</registers>
</chip>
<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"/>
</memory>
</state>

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.

Ciao.....Mike

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

Could you elaborate on how to run the tests?

Thanks

Thomas

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.

Cheers

Thomas

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

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

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).

Ciao.....Mike

Hi,

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 :

Olivier


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 :(

Ciao.....Mike

Hello Thomas,

have a look here.

Ciao.....Mike

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

Thomas

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.

Cheers

Thomas

Quote:
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

Cheers

Thomas

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.

Ciao.....Mike

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

Nice.....Mike

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

Cheers

Thomas