Indexing and Subroutines
This is a continuation in a two-part series covering indirect addressing. While Part 12 dealt with memory registers, Part 13 will deal with subroutines.
To store a number in the index register, press [STO] [TAN] (I)
To call up subroutine label "I", press [GSB] [TAN] (I)
To branch to label "I", press [GTO] [TAN] (I).
When calling subroutines or branching to labels, only the integer portion of I is considered. For either one of these purposes, 0 ≤ I ≤ 24.
If RI contains... GTO I/GSB I calls label...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 .0
11 .1
12 .2
13 .3
14 .4
15 .5
16 .6
17 .7
18 .8
19 .9
20 A
21 B
22 C
23 D
24 E
We will present two programs that make use of calling subroutines indirectly.
Random Voting Machine
This program uses the calculator's random function to count a specified number of votes between two candidates: Candidate 0 and Candidate 1. In order to get the calculator to round the random number to 0 or 1, we use the setting Fix 0, then execute the RND (round) function.
RND rounds the displayed number, using the display settings for the number of decimal points used.
Labels used: A (main), 0, 1, 2 (loop)
Storage Registers Used:
R0 = number of votes Candidate 0 receives
R1 = number of votes Candidate 1 receives
R2 = total number of votes
Program Listing:
Key Code Key
001 42 21 11 LBL A
002 44 2 STO 2
003 0 0 * Clear R0 and R1
004 44 0 STO 0
005 44 1 STO 1
006 42 7 0 FIX 0 * Fix decimal settings
007 42 21 2 LBL 2
008 42 36 RAN #
009 43 34 RND
010 44 25 STO I * Store result in the
index register
011 32 25 GSB I
012 42 5 2 DSE 2
013 22 2 GTO 2
014 45 0 RCL 0
015 31 R/S
016 45 1 RCL 1
017 43 32 RTN
018 42 21 0 LBL 0
019 1 1
020 44 40 0 STO+ 0
021 43 32 RTN
022 42 21 1 LBL 1
023 1 1
024 44 40 1 STO+ 1
025 43 32 RTN
Instructions:
1. Enter the number of votes to be counted.
2. Press [ f ] [ √ ] (A)
3. The number of votes for Candidate 0 is displayed. Press [R/S] to display the number of votes for Candidate 1.
Example:
A sample vote of 25 votes: 25 [ f ] [ √ ] (A)
You may get 13 votes for Candidate 0 and 12 votes for Candidate 1.
A sample vote of 2,500 votes yields 1,252 votes for Candidate 0 and 1,248 votes for Candidate 1. It took about 17 seconds for the program to run on the HP 15C Limited Edition. It may take considerably longer on the original HP 15C.
Fresnel Integrals
This program calculates the Fresnel Integrals:
Fresnel Sine Integral: S(x) = √(2/π) × ∫((sin u)^2, u, 0, x)
Fresnel Cosine Integral: C(x) = √(2/π) × ∫((cos u)^2, u, 0, x)
This program sets an index. If RI = 0, S(x) is calculated. If RI = 1, C(x) calculated. If RI > 1, the program flashes to communicate an error condition. RI is set before program execution.
Program Listing:
Key Codes Key
001 42 21 11 LBL A
002 45 25 RCL I
003 1 1
004 43 30 8 TEST 8 ( x < y )
005 22 3 GTO 3
006 43 8 RAD
007 33 R ↓
008 33 R ↓
009 0 0
010 34 x<>y
011 42 20 2 ∫ 2 * Integer - label 2
012 2 2
013 43 26 π
014 10 ÷
015 11 √
016 20 ×
017 43 32 RTN
018 42 21 2 LBL 2
019 32 25 GSB I
020 43 11 x^2
021 43 32 RTN
022 42 21 0 LBL 0
023 23 SIN
024 43 32 RTN
025 42 21 1 LBL 1
026 24 COS
027 43 32 RTN
028 42 21 3 LBL 3
029 43 4 9 SF 9
030 43 32 RTN
Caution: Because integration is involved, an additional 23 registers is required. The particular program takes up 28 registers (integration, program instructions)
Instructions:
1. To calculate the Fresnel Sine Integral, set register I to 0. To calculate the Fresnel Cosine Integral, set register I to 1.
2. Enter x.
3. Run program A. [ f ] [ √ ] (A).
Examples:
1. S(1.5) [Fresnel Sine Integral]
Key Strokes:
0 [STO] [TAN] ( I )
1.5 [ f ] [ √ ] (A)
Result: S(1.5) ≈ 0.5703
2. C(1.5) [Fresnel Cosine Integral]
Key Strokes:
1 [STO] [TAN] ( I )
1.5 [ f ] [ √ ] (A)
Result: C(1.5) ≈ 0.6266
3. Try to run program A with I = 2.
Key Strokes:
2 [STO] [TAN] ( I )
1.5 [ f ] [ √ ] (A)
The display flashes. Stop the flash by pressing the backspace key or clearing Flag 9.
This concludes Part 13. Until next time, happy programming,
Eddie
This tutorial is property of Edward Shore. © 2011