Thanks Angel, very interesting!
Knowing that my "HEPAX trick" was not available back in the day, well at least until 1988 which is very late in the '41 life, I made a version using the Advantage pack complex routines. At least they were available in a ROM module (so you can use XROMs) by 1985.
I got consternated by the results. As slow as with JMB routines when they reside in main memory, so with the global searches! These routines are terrible, using up to 4 registers, plenty of calls back and forth, not optimised the slightest bit, unsuitable for loops. JMB routines are also in user code, but at least he bothered to make them straightforward and reasonably fast.
It is a really pity that the Advantage pack does not contain the full 15C functionality in MCODE. If HP could commission Firmware specialists to adapt the 15C SOLVE and INTEG routines for the '41, why not going all the way, and also adapt the complex stacks (improved with complex STO and RCL), hyperbolics, Gamma, combinations and permutations, and random numbers?
The matrix routines on the Advantage pack are outstanding, more powerful than the 15C, but they were made by the CCD, not by HP.
This Advantage ROM is a half-baked product, too little too late. Hp was already showing signs of decadence by 1985...
Hi Vincent, I agree 101% with your assessment on the complex routines in the Advantage and with your comments. I know the 41Z wasn't there back then but hey, it is here right now... so I'll prepare a tweaked version replacing the calls to JMB's routines with the 41Z counterpart, stay tuned.
it's done, quite easy since it's almost a one-by-one replacement...
but the choice of those real data registers is very inefficient (it requires multiple ZENTER^ instructions sprinkled throughout the program).
If I understand your description you used:
R01 and R24
R02 and R25
R03 and R36
etc...
for real and imaginary parts?
Redoing that to use adjacent (contiguous) numbered registers will eliminate the need for all those ZENTER^, abd thus reduce the execution time even further...
Code:
9:24PM 04/21
01*LBL "RZVA"
02*LBL 01
03 STO 24
04 RDN
05 STO 01
06 1 E-4
07 STO 19
08 X^2
09 STO 20
10 ,5
11 STO 25
12*LBL 02
13 XEQ IND 00
14 0
15 RCL 25
16 Z/
17 STO 21
18 RDN
19 STO 02
20 RCL 19
21 ST+ 24
22 XEQ IND 00
23 STO 22
24 RDN
25 STO 03
26 RCL 19
27 ST- 24
28 ST- 24
29 XEQ IND 00
30 STO 23
31 RDN
32 STO 04
33 R^
34 RCL 03
35 RCL 22
36 Z+
37 ZENTER^
38 RCL 02
39 RCL 21
40 Z-
41 ZENTER^
42 0
43 RCL 20
44 Z/
45 STO 06
46 RDN
47 STO 05
48 RCL 03
49 RCL 22
50 ZENTER^
51 RCL 04
52 RCL 23
53 Z-
54 ZENTER^
55 0
56 RCL 19
57 ST+ 24
58 Z/
59 ZENTER^
60 0
61 RCL 25
62 Z*
63 STO 23
64 RDN
65 STO 04
66 RCL 06
67 RCL 05
68 ZENTER^
69 RCL 04
70 RCL 23
71 Z/
72 STO 22
73 RDN
74 STO 03
75 R^
76 ZENTER^
77 RCL 02
78 RCL 21
79 Z*
80 ZENTER^
81 RCL 04
82 RCL 23
83 Z/
84 1
85 -
86 CHS
87 X<>Y
88 CHS
89 X<>Y
90 RCL 25
91 Z^X
92 1
93 -
94 ZENTER^
95 RCL 03
96 RCL 22
97 Z/
98 ST+ 24
99 RDN
100 ST+ 01
101 R^
102 ZENTER^
103 RCL 01
104 RCL 24
105 Z/
106 R-P
107 RCL 20
108 X<Y?
109 GTO 02
110 RCL 01
111 RCL 24
112 R-P
113 RDN
114 STO 23
115 SIN
116 ABS
117 RCL 20
118 X<=Y?
119 GTO 03
120 RCL 23
121 COS
122 ENTER^
123 ABS
124 X#0?
125 /
126 RCL 01
127 RCL 24
128 R-P
129 X<>Y
130 RDN
131 *
132 STO 24
133*LBL 03
134 RCL 01
135 RCL 24
136 ZAVIEW
137 END
and:
Code:
9:28PM 04/21
01*LBL "ZZ"
02 RCL 01
03 RCL 24
04 ZENTER^
05 W^Z
06 ZRCL 4
07 Z-
08 END
in the last part you see that ZRCL 4 is equivalent to {RCL 08, RCL 09, ZENTER^}
Cheers,
ÁM
(04-21-2024 07:27 PM)Ángel Martin Wrote: [ -> ]it's done, quite easy since it's almost a one-by-one replacement...
but the choice of those real data registers is very inefficient (it requires multiple ZENTER^ instructions sprinkled throughout the program).
If I understand your description you used:
R01 and R24
R02 and R25
R03 and R36
etc...
for real and imaginary parts?
Redoing that to use adjacent (contiguous) numbered registers will eliminate the need for all those ZENTER^, abd thus reduce the execution time even further...
Code:
9:24PM 04/21
01*LBL "RZVA"
02*LBL 01
03 STO 24
04 RDN
05 STO 01
06 1 E-4
07 STO 19
08 X^2
09 STO 20
10 ,5
11 STO 25
12*LBL 02
13 XEQ IND 00
14 0
15 RCL 25
16 Z/
17 STO 21
18 RDN
19 STO 02
20 RCL 19
21 ST+ 24
22 XEQ IND 00
23 STO 22
24 RDN
25 STO 03
26 RCL 19
27 ST- 24
28 ST- 24
29 XEQ IND 00
30 STO 23
31 RDN
32 STO 04
33 R^
34 RCL 03
35 RCL 22
36 Z+
37 ZENTER^
38 RCL 02
39 RCL 21
40 Z-
41 ZENTER^
42 0
43 RCL 20
44 Z/
45 STO 06
46 RDN
47 STO 05
48 RCL 03
49 RCL 22
50 ZENTER^
51 RCL 04
52 RCL 23
53 Z-
54 ZENTER^
55 0
56 RCL 19
57 ST+ 24
58 Z/
59 ZENTER^
60 0
61 RCL 25
62 Z*
63 STO 23
64 RDN
65 STO 04
66 RCL 06
67 RCL 05
68 ZENTER^
69 RCL 04
70 RCL 23
71 Z/
72 STO 22
73 RDN
74 STO 03
75 R^
76 ZENTER^
77 RCL 02
78 RCL 21
79 Z*
80 ZENTER^
81 RCL 04
82 RCL 23
83 Z/
84 1
85 -
86 CHS
87 X<>Y
88 CHS
89 X<>Y
90 RCL 25
91 Z^X
92 1
93 -
94 ZENTER^
95 RCL 03
96 RCL 22
97 Z/
98 ST+ 24
99 RDN
100 ST+ 01
101 R^
102 ZENTER^
103 RCL 01
104 RCL 24
105 Z/
106 R-P
107 RCL 20
108 X<Y?
109 GTO 02
110 RCL 01
111 RCL 24
112 R-P
113 RDN
114 STO 23
115 SIN
116 ABS
117 RCL 20
118 X<=Y?
119 GTO 03
120 RCL 23
121 COS
122 ENTER^
123 ABS
124 X#0?
125 /
126 RCL 01
127 RCL 24
128 R-P
129 X<>Y
130 RDN
131 *
132 STO 24
133*LBL 03
134 RCL 01
135 RCL 24
136 ZAVIEW
137 END
Cheers,
ÁM
Yes, when I adapted Valentin's program I wanted to reduce the risk of errors, so whenver he used variable X for instance, I used the corresponding letter number for the real part (here 24) and I used the registers as needed going forward for the imaginary parts (so here: 1), leaving 00 free to store the function's name. But please double check, I might not have gone in order 100% of the times. Best is to check the RCLs... When I did this I had not 41Z and consecutive registers in mind, it didn't matter
How long does it take to solve with R=PI?
Cheers
G'morning, with the register number changes done the execution takes just 40 seconds on V41 (using 41Z functions), or about 2 seconds in Turbo mode. Much better, saves about one minute.
Here's how the registers changed:
Code:
R25 -> R01
R01 -> R03 - ZR 01
R24 -> R02
R02 -> R05 - ZR 02
R21 -> R04
R03 -> R07 - ZR 03
R22 -> R06
R04 -> R09 - ZR 04
R23 -> R08
R05 -> R11 - ZR 05
R06 -> R10
R19 -> R12
R20 -> R13
And here's the new program listing:
Code:
01*LBL "RZVA"
02 ASTO 00
03*LBL 01
04 ZSTO 01
06 E-4
07 STO 12
08 X^2
09 STO 13
10 ,5
11 STO 01
12*LBL 02
13 XEQ IND 00
14 RCL 01
15 ST/ Z
16 /
17 ZSTO 02
19 RCL 12
20 ST+ 02
21 XEQ IND 00
22 ZSTO 03
24 RCL 12
25 ST- 02
26 ST- 02
27 XEQ IND 00
28 ZSTO 04
30 ZRC+ 03
32 ZRC- 02
34 RCL 13
35 ST/ Z
36 /
37 ZSTO 05
39 ZRCL 03
41 ZRC- 04
43 RCL 12
44 ST+ 02
45 ST/ Z
46 /
47 RCL 01
48 ST* Z
49 *
50 ZSTO 04
52 ZRCL 05
54 ZRC/ 04
56 ZSTO 03
58 ZRC* 02
60 ZRC/ 04
62 1
63 -
64 CHS
65 X<>Y
66 CHS
67 X<>Y
68 RCL 01
69 Z^X
70 1
71 -
72 ZRC/ 03
74 ZST+ 01
76 ZRC/ 01
78 R-P
79 RCL 13
80 X<Y?
81 GTO 02
82 ZRCL 01
84 R-P
85 RDN
86 STO 08
87 SIN
88 ABS
89 RCL 13
90 X<=Y?
91 GTO 03
92 RCL 08
93 COS
94 ENTER^
95 ABS
96 X#0?
97 /
98 RCL 03
99 RCL 02
100 R-P
101 X<>Y
102 RDN
103 *
104 STO 02
105*LBL 03
106 ZRCL 01
108 ZAVIEW
109 END
See attached the RAW file in case you want to try it on your V41 environment...
It possibly can be further tweaked to squeeze a few more seconds off the timing, specially the final part - feel like taking a stab at it?
That was fun , thanks for the cues. BTW this version will go into a new module I'm putting together, credits will state "Albillo-Weber-Martin"
Cheers,
ÁM
PS. note that the "R" constant (pi in the example) now cannot be stored in R08, R09. I used PI facevalue since subtracting a real value from a complex number only involves its real part.:
01*LBL "ZZ"
02 ZRCL 01
04 ZENTER^
05 W^Z
06 PI
07 -
08 END
Many thanks Angel ! Very interesting.
40s is twice is fast as the 15C version, which is consistent since the '41 is twice as fast as the 15C in general
Just one question, I'm not familiar with 41Z, but do ZSTO/ZRCL work on complex registers ? So they need to be contiguous ? I'm intrigued because I see some ZSTO 03 and ZSTO 04 in your listing, how does it work ?
I don't think I deserve to have my name next to Valentin's and yours for this module
Kind of you, but I have done nothing much, just blind conversion !
Cheers
yes, the 41Z uses complex registers - which in turn are nothing more than pairs of contiguous real registers managed automatically by the STO/RCL/Z<>/VIEW/etc. functions.
You can peruse the HP-41Z Manual at your leisure if you're interested, it's available
here
Cheers
(04-22-2024 09:48 AM)Ángel Martin Wrote: [ -> ]yes, the 41Z uses complex registers p which in turn are nothing more than pairs of contiguous real registers managed by the STO/RCL/Z<>/VIEW/etc. functions automatically.
You can peruse the HP-41Z Manual at your leisure if you're interested, it's available here
Cheers
Thanks !
I have no doubt that 41Z really shines. The problem is, it was not available in the 20th century, so you can't say that it beats the 15. Otherwise, Mathematica also does, but this is utterly unfair...
There was a complex stack à la 15C developped in 1986 as part of the Toulouse "ROM". But this "ROM" was never more than an EPROM at the time, so I guess nobody could use it...
Cheers
Actually I beg to disagree with your Mathematica comparison: consider that the 41Z uses exclusively coconut MCODE and calls to the 41-OS, therefore it properly and fairly is the very same machine and thus should be considered part of the same achievement, no matter when it got "released" ;-)
(04-22-2024 05:33 PM)Ángel Martin Wrote: [ -> ]Actually I beg to disagree with your Mathematica comparison: consider that the 41Z uses exclusively coconut MCODE and calls to the 41-OS, therefore it properly and fairly is the very same machine and thus should be considered part of the same achievement ;-)
Yeah, I see your point
41Z is what HP should have included in the advantage pack. If they could do something like that for the 15C in 1982, they should have been able to do it in 1985 for the '41!