This program is Copyright © 2007 by Jean-Marc Baillard and is used here by permission.
This program is supplied without representation or warranty of any kind. Jean-Marc Baillard and The Museum of HP Calculators therefore assume no responsibility and shall have no liability, consequential or otherwise, of any kind arising from the use of this program material or any part thereof.
1°) A Focal Program
2°) Micro-Code Routine ( Contiguous
Registers only )
1°) A Focal Program
01 LBL "SORT"
02 SIGN
03 LBL 01
04 LASTX
05 LASTX
06 RCL IND L
if you don't have an HP-41CX, replace lines 08 to 13 by
07 LBL 02
08 X<=NN?
RCL IND Y
09 GTO 03
X>Y?
( or X<=Y? to sort in decreasing order )
10 X<>Y
GTO 03
11 STO Y
X<>Y
12 RCL IND X
LASTX
13 LBL 03
+
14 ISG Y
LBL 03
15 GTO 02
RDN
16 X<> IND L
17 STO IND Z
18 ISG L
19 GTO 01
20 END
( 40 bytes )
STACK | INPUT | OUTPUT |
X | bbb.eeeii | / |
where bbb.eeeii is the control number of the array.
-For example, to sort numbers in registers R01 R03 R05 R07 , key in
1.00702 XEQ "SORT"
-Execution time is of the order of 47 seconds for an array of
20 numbers
--------------------------------- 17 minutes -------------- 100
--------
-This program uses a selection sort.
-The numbers are sorted in increasing order.
-If you want to sort in decreasing order, replace line 08 by
X>=NN?
2°) Micro-Code Routine ( Contiguous Registers
only )
-The following routine uses the "Bubble Sort" which is probably the
worst sorting-algorithm...
-However, it is approximately 40 times as fast as the program above!
Code Mnemonics
094 "T"
012 "R"
00F "O"
013 "S"
0F8 READ 3(X)
The first executable word
361 ?NCXQ
This execute instruction
050 14D8
checks for alpha data
284 CLRF 7
2FE ?C#0 MS
These 4 blue lines ( and the 3 other blue lines below )
013 JNC +02
allow to sort in decreasing order if the input is negative.
288 SETF 7
05E C=0 MS
084 CLRF 5
0ED ?NCXQ
064 193B
226 C=C+1 S&X
226 C=C+1 S&X
226 C=C+1 S&X
088 SETF 5
0ED ?NCXQ
064 193B
070 N=C ALL
0F8 READ 3(X)
05E C=0 MS
0ED ?NCXQ
064 193B
260 SETHEX
38D ?NCXQ
008 02E3
0F0 C<>N ALL
38D ?NCXQ
008 02E3
10E A=C ALL
378 READ 13(c)
03C RCR 3
146 A=A+C S&X
066 A<>B S&X
10E A=C ALL
0B0 C=N ALL
206 C=C+A S&X
066 A<>B S&X
306 ?A<C S&X
013 JNC + 02
0A6 A<>C S&X
070 N=C ALL
130 LDI S&X
200 hexadecimal = 512 decimal is the correct value if you have an HP-41CV/CX
or an HP-41C with a quad memory module.
200 CON: 512
Replace this line by 100h = 256d if you have an HP-41C without any memory
module.
306 ?A<C S&X
381 ?NCGO
-If register Rbb or Ree don't exist,
00A 02E0
you'll get a "NON EXISTENT" message
0B0 C=N ALL
1BC RCR 11
11A A=C M
0AE A<>C ALL
033 JNC +06
270 RAMSLCT
0EE C<>B ALL
2F0 WRIT DATA
198 C=M ALL
266 C=C-1 S&X
158 M=C ALL
106 A=C S&X
03C RCR 3
070 N=C ALL
366 ?A#C S&X
3A0 ?NC RTN
270 RAMSLCT
038 READ DATA
0EE C<>B ALL
198 C=M ALL
106 A=C S&X
0B0 C=N ALL
366 ?A#C S&X
373 JNC -12
226 C=C+1 S&X
070 N=C ALL
270 RAMSLCT
038 READ DATA
06E A<>B ALL
37E ?A#C MS
023 JNC +04
35E ?A#0 MS
0B7 JC +16
0A3 JNC +14
21C PT=2
362 ?A#C
@PT
these 25 green lines compare the numbers in the CPU registers A and C,
03B JNC +07
place the lowest one in A and the highest one in C.
342 ?A#0
@PT
017 JC +02
0AE A<>C ALL
2EE ?C#0 ALL
057 JC +0A
05B JNC +0B
366 ?A#C
S&X
023 JNC +04
306 ?A<C
S&X
02F JC +05
01B JNC +03
31A ?A<C M
017 JC +02
0AE A<>C ALL
35E ?A#0
MS
013 JNC +02
0AE A<>C ALL
28C ?FSET 7
013 JNC +02
0AE A<>C ALL
0EE C<>B ALL
0B0 C=N ALL
266 C=C-1 S&X
270 RAMSLCT
0AE A<>C ALL
2F0 WRIT DATA
2A3 JNC -2C
STACK | INPUT | OUTPUT |
X | +/- bbb.eee | +/- bbb.eee |
Where bbb.eee is the
control number of the array.
The stack is actually unchanged.
-A positive input will sort the numbers in increasing
order
-A negative --------------------------- decreasing order
Notes:
-Execution time is of the order of 25 seconds for an array of
100 numbers
--------------------------------- 100----------------------
200 --------
-It is proportional to the square of the number of elements.
-In fact, the 4th , 5th , .... decimals of the input are not taken into account
-You can also key in eee.bbb instead of bbb.eee
-For instance, if you have to sort the numbers in registers R00
R01 ............ R99
simply press 99 XEQ "SORT" instead of
0.099 XEQ "SORT" ( both work )
-If you do not need to sort in decreasing order, delete
the 7 lines written in blue ( especially the last 3 ones: 28C
013 0AE )
and replace the last line ( written
in red ) by
2BB JNC -29 the routine will run 6% faster.
-There is no risk of "crash" if the registers contain alpha data, but
the sorting may be quite fanciful!
-For example, if registers R01 thru R05 contain "A" "B"
"Z" "AB" "ABC"
1.005 XEQ "SORT" will produce "Z" "B"
"A" "ABC" "AB" in these registers...
-It is due to the way alpha strings are coded in a register.
Go back to the HP-41 software library
Go back to the general software library
Go
back to the main exhibit hall