HP-41C プログラミング編 (3)

HP-41C プログラミング編第3弾の今日は、分岐、サブルーチン、条件判断、ループといった制御構造をまとめます。

1. プログラムの構造と LBL 命令
HP-41のプログラムが LBL "プログラム名" ~ END でひとまとめになっていることは最初に書いたとおりですが、プログラム中にもローカルなラベル(2ケタの数値またはアルファベット"A"~"J", "a"~"e")を含めることができます。これらのラベルは、分岐(GTO 命令)およびサブルーチン呼び出し(XEQ 命令)のジャンプ先として指定することができます。サブルーチンは、プログラムと同様 LBL {ラベル} で始まり RTN 命令 (プログラムの最終行なら END 命令)で終わりますが、XEQ 命令で呼び出されると、RTN(または END)命令にて呼び出し元(XEQ 命令)の次の行に戻ってきます。サブルーチンを含むプログラムは以下のような構造になります。メインプログラムの最後も、それが最終行ではないときは RTN 命令を使います。
 00 LBL "START"
    …
  (メインプログラム)
    …
 10 RTN
 11 LBL 01
  (サブルーチン1)
 20 RTN
 21 LBL 02
  (サブルーチン2)
 30 END
ラベルはこれまでも書いたように2ケタの数値またはALPHA文字列が使用できますが、種類によって有効範囲(スコープ)が変わるので、注意が必要です。
 2ケタの数値 : 同一プログラム内
 "A"~"J", "a"~"e" : 同一プログラム内。「ローカルラベル」と言われます。
 その他のALPHA文字列 : メモリ内の全プログラム。
「ローカルラベル」は特別な機能を持つラベルです。一般的なALPHA文字列のラベル異なり、そのプログラム内でのみ有効であり、[SHIFT] [CATALOG] 1 でも一覧表示されません。これらのラベルは、USERモードでプログラムを実行中に"A"~"J"の刻印のあるキー(または[SHIFT]+"A"~"E"の刻印のあるキー)が押されると、そのラベルにジャンプするようになっています(ただし、ASN 命令で他の機能を割り当ててある場合は無効です)。PROMPT 命令や STOP 命令で停止中にでこのいずれかのキーを押し、押したキーによって処理を分けるような場合に役立つと思います。

2. ジャンプ(GTO 命令)
GTO {ラベル} で指定ラベル(2ケタの数値またはALPHA文字列)へジャンプします。ジャンプ先で RTN または END 命令があると、そこで実行を終了します。GTO 命令を誤って使うと、無限ループに入ってしまうことがあります。このような場合はいつまでたっても実行が終了しませんので、[R/S]キーを押して止める必要があります。

3. サブルーチン呼び出し(XEQ 命令)
XEQ {ラベル} で指定ラベル(2ケタの数値またはALPHA文字列)から始まるサブルーチンを呼び出します。他のプログラムを呼び出すことも可能です。ジャンプ先で RTN または END 命令があると、呼び出し元(XEQ 命令)の次の行に戻ってきます。サブルーチン呼び出しは6段までネスティングが可能です。

4. 条件分岐
高度なプログラムを作ろうとすると、数値の大小で処理を分けたいケースが出てくると思います。それに利用できるのが条件判断命令です。以下のような命令がありますが、いずれも条件が成立すれば次の命令を実行、成立しなければ次の命令をスキップするというものです。比較されるのはXレジスタとYレジスタの数値です。
 X=Y? : X=Yかどうか比較。(ALPHA文字列も可)
 X=0? : X=0かどうか比較。
 X>Y? : X>Yかどうか比較。
 X>0? : X>0かどうか比較。
 X<Y? : X<Yかどうか比較。
 X<0? : X<0かどうか比較。
 X<=Y? : X≦Yかどうか比較。
 X<=0? : X≦0かどうか比較。
 X≠Y? : X≠Yかどうか比較。(ALPHA文字列も可)
 X≠0? : X=0かどうか比較。
いずれも、直後に GTO 命令などを置くことによって、比較結果で処理を分けることができます。

5. ループ
ISG(Increment and Skip if Greater)命令とDSE(Decrement and Skip if Equal)命令があります。これらの命令に与えるパラメータは次のような書式で与える必要があります。
 iiiii.fffcc
iiiiiがループカウンタの初期値(5ケタまで)、fffが比較する値、ccがカウンタに減算/加算される値です。fffの省略値は0、ccの省略値は1になりますので、整数のみ指定すると、iiiii.00001 と指定したのと同じことになります。実際の使用方法は下記の通りです。ループカウンタとしてはメモリレジスタnn(またはスタック)を使用します。
 iiiii.ffcc
 STO nn    ← 初期値をループカウンタ(レジスタnn)にセット
 ISG nn    ← Rnnにccを加算し、fffと比較
ISG nn 命令は、レジスタRnnにccずつ加算を行い、iiiii(Rnnの整数部分)>fff となれば次の命令をひとつスキップします。
DSE nn 命令は、レジスタRnnからccずつ減算を行い、iiiii(Rnnの整数部分)≦fff となれば次の命令をひとつスキップします。
これらの命令の直後に GTO 命令を置けば、ループを作ることができます。以下に例を示します。
 01 LBL "LOOP"
 02 10.02001
 03 STO 00
 04 LBL 01
 05 RCL 00
 06 STOP
 07 ISG 00
 08 GTO 01
 09 "END"
 10 AVIEW
 11 END
[XEQ] "LOOP" で実行すると、[R/S]キーを押すたびにカウンタの値がカウントアップして表示され、20.0200になった時にさらに[R/S]を押すと"END"と表示し終了します。

これらの制御構造を理解すれば、さらに高度なプログラムを組むことができます。数値計算に限って言えばパソコンなみと言ってよいでしょう。最終回の明日は、間接操作とフラグについて説明したいと思います。

本日使用した命令のまとめ:
[LBL] {nn} : プログラム内でのみ有効なラベルを指定。
[LBL] "{ラベル}" : 全体で有効なラベルまたはローカルラベル("A"~"J", "a"~"e")を指定。
[RTN] : プログラムまたはサブルーチンを終了(最終行では END)。
[GTO] {ラベル} : 指定されたラベルへジャンプする。
[XEQ] {ラベル} : 指定されたラベルをサブルーチンとして呼び出す。
[SHIFT] [ISG] {nn} : Rnnに指定値(cc)を加算し、整数部が指定値(fff)より大きければ次の命令をスキップ。
[XEQ] "DSE" {nn} : Rnnから指定値(cc)を減算し、整数部が指定値(fff)以下なら次の命令をスキップ。
[SHIFT] [x=y?] : XレジスタとYレジスタ(ALPHA文字列も可)が等しくなければ次の命令をスキップ。
[SHIFT] [x=0?] : Xレジスタが0でなければ次の命令をスキップ。
[SHIFT] [x>y?] : XレジスタがYレジスタ以下なら次の命令をスキップ。
[XEQ] "X>0?" : Xレジスタが0以下なら次の命令をスキップ。(">" はALPHAモードで[SHIFT] [J])
[XEQ] "X<Y?" : XレジスタがYレジスタ以上なら次の命令をスキップ。("<" はALPHAモードで[SHIFT] [I])
[XEQ] "X<0?" : Xレジスタが0以上なら次の命令をスキップ。("<" はALPHAモードで[SHIFT] [I])
[SHIFT] [x≦y?] : XレジスタがYレジスタより大きければ次の命令をスキップ。
[XEQ] "X<=0?" : Xレジスタが0より大きければ次の命令をスキップ。("<" はALPHAモードで[SHIFT] [I])
[XEQ] "X≠Y?" : XレジスタとYレジスタ(ALPHA文字列も可)が等しければ次の命令をスキップ。("≠" はALPHAモードで[SHIFT] [H])
[XEQ] "X≠0?" : Xレジスタが0なら次の命令をスキップ。("≠" はALPHAモードで[SHIFT] [H])

HP-41C同様「4レベルRPN」でプログラムできる電卓です。

関連記事
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

tag : HP 41C プログラム関数電卓

trackback


この記事にトラックバックする(FC2ブログユーザー)

まとめteみた.【HP-41C プログラミング編 (3)】

HP-41Cプログラミング編第3弾の今日は、分岐、サブルーチン、条件判断、ループといった制御構造をまとめひとまとめになっていることは最初に書いたとおりですが、プログラム中にもロ

コメント

非公開コメント

アクセスカウンタ
カレンダー
11 | 2021/12 | 01
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
最新記事
最新コメント
リンク
カテゴリ
楽天お勧め商品
検索フォーム
Kyoroのつぶやき
FC2掲示板
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示