Post Reply 
Somebody having a clever substitute for the CLRGX command?
09-29-2024, 06:14 PM
Post: #1
Somebody having a clever substitute for the CLRGX command?
Hello all,

does anyone in this distinguished forum have a substitute function for the CLRGX command for use on a non-CX HP41? I wouldn't mind it using X-functions, but HEPAX commands are out of the question.

If I'd write this myself, I'd probably do a loop over the given register interval, just counting up the numbers, and set the register with those numbers equal to zero. Is assume there is a better way, possibly with a command I don't know? Any help appreciated, thanks,

emefff.

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-29-2024, 07:37 PM
Post: #2
RE: Somebody having a clever substitute for the CLRGX command?
(09-29-2024 06:14 PM)emefff Wrote:  substitute function for the CLRGX command for use on a non-CX HP41? I wouldn't mind it using X-functions, but HEPAX commands are out of the question.

If I'd write this myself, I'd probably do a loop over the given register interval, just counting up the numbers, and set the register with those numbers equal to zero.
I think this is the way to go.

The X-Functions module won't help here.
Ok, you could construct something using REGMOVE if you have a predefined block of cleared registers beforehand,
but that would be more effort than just running a simple loop for the task.

(09-29-2024 06:14 PM)emefff Wrote:  Is assume there is a better way, possibly with a command I don't know?
Not without any external hardware IMHO.

-- Ray
Find all posts by this user
Quote this message in a reply
09-30-2024, 09:24 AM (This post was last modified: 09-30-2024 09:29 AM by emefff.)
Post: #3
RE: Somebody having a clever substitute for the CLRGX command?
Hello,

thank you for taking time. I just realized: for a 100% substitute I also need to implement a kind of stepping as the original command reads:

CLRGX Clear registers by X (bbb.eeeii).
Clear every iith register from Rbbb through Reee.

That's a bit more than I expected... oh my. I don't even know how to check the length of eeeii (is it only eee or eeeii), and also what about wrong entries of bbb.eeeii? Yuck!

emefff.

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-30-2024, 09:38 AM (This post was last modified: 10-01-2024 06:53 AM by Stephan61.)
Post: #4
RE: Somebody having a clever substitute for the CLRGX command?
Quick and dirty:
Code:
01 LBL "CLRGX"
02 0
03 LBL 00
04 STO IND Y
05 ISG Y
06 GTO 00
07 END

15C CE, 41CV, 48GX, 71B, DM41X, C47(DM42n)
Find all posts by this user
Quote this message in a reply
09-30-2024, 09:51 AM (This post was last modified: 09-30-2024 02:29 PM by Werner.)
Post: #5
RE: Somebody having a clever substitute for the CLRGX command?
(09-29-2024 06:14 PM)emefff Wrote:  does anyone in this distinguished forum have a substitute function for the CLRGX command for use on a non-CX HP41?

If you don't mind a few synthetic commands, I wrote this quite a while ago, it's part of my much larger 'Basic subroutines' pack:
(if the entry for CLRGX contains an increment ii>1, there can be no gain over the simple loop. But clearing a contiguous block using the technique below is surprisingly fast, even on a real '41)

--
-- b0: contiguous block clear
-- 65-Byte Prgm including END
--
--              L       X       Y       Z       T
01 LBL"b0"              a,b
02 ENTER        -- size check
03 FRC
04  E3
05 *                    b       a,b
06 STO IND X
07 5            -- simple loop vs Σ-loop
08 -
09 X<Y?
10 GTO 00               b-5     a,b
11 RCL Y
12 INT
13 ,06
14 +                    a,6     b-5     a,b     a,b
15  E3
16 /
17 +                    b-5,a,6 a,b     a,b     a,b
18 RCL c      -- ΣREG?
19 ΣREG IND Z
20 CLΣ
21 RCL b        -- LBL 05
22 ΣREG IND Z  <-+
23 CLΣ           |
24 DSE Z         |
25 STO b       --+ GTO 05
26 Rv
27 STO c        -- ΣREG IND X
28 RTN
29 LBL 00          -- 6 elements or less, simple loop
30 CLX
--
-- bI: intitialize counter in Y with value in X
--
31 LBL"bI"
32 LBL 06
33 STO IND Y
34 ISG Y
35 GTO 06
36 END


Cheers, Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
09-30-2024, 10:08 AM (This post was last modified: 09-30-2024 10:28 AM by emefff.)
Post: #6
RE: Somebody having a clever substitute for the CLRGX command?
Oh that was quick, I think I got it:

Code:
01 LBL CLRGX2   # substitute for CLRGX on non-CX HP41s
02 FIX 5
03 STO 30     # bbb.eeeii in X, STO this in reg 30, a lot of registers may be in the way in the lower region, set SIZE 35 minimal
04 XEQ INT
05 STO 31     # bbb integer part in reg 31
06 RCL 30
07 RCL 31
08 -
09 100000
10 *
11 STO 32     # stuff after comma to reg 32 in the form eeeii not 0.eeeiii, leading 0 disappears!
12 100
13 /
14 XEQ INT
15 STO 33     # eee in reg 33
16 RCL 32
17 RCL 33
18 100
19 *
20 -
21 STO 34     # ii in reg 34 # reg 31 will be the counter in the loop, the first reg to delete
22 X=0?
23 1
24 STO 34     # if ii = 0 it means it is not set, then every reg is to be deleted! therefore we must set ii = 1 
25 LBL 01     # loop starts here
26 0
27 STO IND 31     # store 0 in the register stored in reg 31
28 RCL 33     # eee in X
29 RCL 31     # bbb in x, eee in Y
30 RCL 34     # ii in X, bbb in Y, eee in Z
31 +          # bbb+ii in X, eee in Y
32 STO 31     # bbb+ii in X, this is our counter
33 X<=Y?
34 GTO 01
35 FIX 9
36 END

Thank you Werner, I will try yours as well. My code doesn't check anything LOL. We are using the same amount of lines, VERY interesting! :-)

emefff.

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-30-2024, 02:33 PM
Post: #7
RE: Somebody having a clever substitute for the CLRGX command?
I updated my program, putting non-synthetic alternatives in comments, but of course ΣREG? is also only in the CX, not in the X-Functions module. If you don't mind ΣREG to be affected, this is a non-synthetic version:

--
-- b0: contiguous block clear
-- 59-Byte Prgm including END
--
--              L       X       Y       Z       T
01 LBL"b0"              a,b
02 ENTER        -- size check
03 FRC
04  E3
05 *                    b       a,b
06 STO IND X
07 5            -- simple loop vs Σ-loop
08 -
09 X<Y?
10 GTO 00               b-5     a,b
11 RCL Y
12 INT
13 ,06
14 +                    a,6     b-5     a,b     a,b
15  E3
16 /
17 +                    b-5,a,6 a,b     a,b     a,b
18 ΣREG IND Y
19 CLΣ
20 LBL 05
21 ΣREG IND X
22 CLΣ
23 DSE X
24 GTO 05
25 RTN
26 LBL 00          -- 6 elements or less, simple loop
27 CLX
--
-- bI: intitialize counter in Y with value in X
--
28 LBL"bI"
29 LBL 06
30 STO IND Y
31 ISG Y
32 GTO 06
33 END


Cheers, Werner

41CV†,42S,48GX,49G,DM42,DM41X,17BII,15CE,DM15L,12C,16CE
Find all posts by this user
Quote this message in a reply
09-30-2024, 04:33 PM (This post was last modified: 09-30-2024 04:34 PM by Didier Lachieze.)
Post: #8
RE: Somebody having a clever substitute for the CLRGX command?
If you don’t mind something slower but also shorter and which leaves the stack unchanged excepted X and L here is a simple routine compatible with the basic HP-41C that you should be able to use as a CLRGX replacement:

Code:
01 LBL "CLRGX"
02 X<> L
03 CLX
04 LBL 00
05 STO IND L
06 ISG L
07 GTO 00
08 X<> L
09 END

Start with bbb.eeeii in X, it will clear every ii register from register bbb up to register eee (if ii is 0 the increment used is 1, so to clear every register from 12 to 18 just enter 12.018 XEQ "CLRGX").
Find all posts by this user
Quote this message in a reply
09-30-2024, 05:09 PM (This post was last modified: 09-30-2024 05:24 PM by emefff.)
Post: #9
RE: Somebody having a clever substitute for the CLRGX command?
Seems elegant, I have one problem though: How do I enter the second line, respectively every line with L? XEQ alpha X shift I shift J alpha .... then I'm stuck....

EDIT: I gave up too early... XEQ alpha X shift I shift J alpha ST L

That's it.

I have no idea what's going on here, but it seems to work! Compared to my solution it seems like magic. Thanks Didier!

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-30-2024, 05:35 PM (This post was last modified: 09-30-2024 05:36 PM by emefff.)
Post: #10
RE: Somebody having a clever substitute for the CLRGX command?
@Stephan: sorry, I overlooked your solution, maybe because it is so short :-). In fact, Didier's is similar to yours. Thank you also for this very elegant solution!

emefff

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-30-2024, 06:07 PM
Post: #11
RE: Somebody having a clever substitute for the CLRGX command?
(09-30-2024 04:33 PM)Didier Lachieze Wrote:  If you don’t mind something slower but also shorter …

Saving 2 precious bytes:
Code:
01▸LBL "CLRGX"
02 ABS
03 CLX
04▸LBL 00
05 STO IND L
06 ISG L
07 GTO 00
08 +
09 END

It consumes the X register without leaving it in L.
Find all posts by this user
Quote this message in a reply
09-30-2024, 06:45 PM (This post was last modified: 09-30-2024 06:54 PM by emefff.)
Post: #12
RE: Somebody having a clever substitute for the CLRGX command?
Thank you Thomas, danke!

Is this becoming a competition? :-)

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
09-30-2024, 09:24 PM
Post: #13
RE: Somebody having a clever substitute for the CLRGX command?
(09-30-2024 06:45 PM)emefff Wrote:  Is this becoming a competition? :-)

Nah, we just want to make programs:


Find all posts by this user
Quote this message in a reply
10-01-2024, 02:11 AM
Post: #14
RE: Somebody having a clever substitute for the CLRGX command?
(09-30-2024 06:45 PM)emefff Wrote:  Thank you Thomas, danke!

Is this becoming a competition? :-)

It's pretty much inevitable here... but it's OK as one can learn soooo much by reading the increasingly elegant solutions, as they evolve, getting slightly smaller, or faster, and often both! Smile

--Bob Prosperi
Find all posts by this user
Quote this message in a reply
10-01-2024, 06:19 AM
Post: #15
RE: Somebody having a clever substitute for the CLRGX command?
(09-29-2024 06:14 PM)emefff Wrote:  I wouldn't mind it using X-functions, but HEPAX commands are out of the question.

Hi,

How about this one?

Code:
01 LBL "CLRX"
02 FRC
03 LASTx
04 X<>Y
05 1 E3
06 *
07 RCL Y
08 INT
09 -
10 1
11 +
12 "X"
13 CRFLD
14 RDN
15 GETRX
16 PURFL
17 END

To clear register AAA up to BBB, just enter AAA.BBB XEQ "CLRX"
Register X and Y are preserved, alpha lost, and register [AAA,BBB] are cleared.

I.e. 5.015 XEQ "CLRX" clears register 5 up to and including 15.

The pros of this one, is that it is quite fast - especially for larger number of registers (no loops).

The big drawback is that it need X-Memory, and there must (temporarily) be space for a file with the same number of registers as to be cleared, and the file "X" (or other unique name) must not be present (no error check in this little routine) ...

But, if speed is wanted (and MCode routines are out of question) ... Wink

Cheers,
Thomas

[35/45/55/65/67/97/80 21/25/29C 31E/32E/33E|C/34C/38E 41C|CV|CX 71B 10C/11C/12C/15C|CE/16C 32S|SII/42S 28C|S 48GX/49G/50G 35S 41X]
Find all posts by this user
Quote this message in a reply
10-01-2024, 08:28 AM (This post was last modified: 10-01-2024 08:37 AM by J-F Garnier.)
Post: #16
RE: Somebody having a clever substitute for the CLRGX command?
Inspired by Thomas' solution:

- Step 1 (to be done only once):
create a 319-reg data file on a mass storage unit:
319 "ZEROREG" CREATE

- Step 2:
use this CLRX program:
Code:
01 LBL "CLRX"
02 "ZEROREG"
03 SEEKR
04 READRX
05 END

HP-IL needed, as well as a (possibly virtual) mass storage unit.
But all registers preserved, except ALPHA.

J-F
Visit this user's website Find all posts by this user
Quote this message in a reply
10-01-2024, 09:13 AM
Post: #17
RE: Somebody having a clever substitute for the CLRGX command?
Thank you all, I underestimated the enthusiasm. But then I think it is a useful command to have on every HP41, not only the CX.

emefff

[35, 45, 41CV, 41CX, 12c, 15c, 15CE, 28S, 42s, 48GX, DM15L, DM42, DM41X, wp34s, wp34s_on_DM42, 35S, Prime, IVEE]
Find all posts by this user
Quote this message in a reply
Post Reply 




User(s) browsing this thread: 3 Guest(s)