の続き.
HP-42S が備えているプログラムの処理を分岐させるための 2 つの命令:
\begin{equation*}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\ar}{\mathrm{ar}}
\newcommand{\arop}{\Opp{\mathrm{ar}}}
\newcommand{\Cocone}[2]{\mathrm{Cocone}(#1,#2)}
\newcommand{\Colim}{\mathrm{colim}}
\newcommand{\CommaCat}[2]{(#1 \downarrow #2)}
\newcommand{\Cone}[2]{\mathrm{Cone}(#1,#2)}
\newcommand{\Func}[2]{\mathrm{Func}(#1,#2)}
\newcommand{\Hom}{\mathrm{Hom}}
\newcommand{\Id}[1]{\mathrm{id}_{#1}}
\newcommand{\Mb}[1]{\mathbf{#1}}
\newcommand{\Mr}[1]{\mathrm{#1}}
\newcommand{\Ms}[1]{\mathscr{#1}}
\newcommand{\Mt}[1]{\mathtt{#1}}
\newcommand{\Nat}[2]{\mathrm{Nat}(#1,#2)}
\newcommand{\Ob}[1]{\mathrm{Ob}(#1)}
\newcommand{\Opp}[1]{{#1}^{\mathrm{op}}}
\newcommand{\Pos}{\mathbf{Pos}}
\newcommand{\q}{\hspace{1em}}
\newcommand{\qq}{\hspace{0.5em}}
\newcommand{\Rest}[2]{{#1}|{#2}}
\newcommand{\Sub}{\mathrm{Sub}}
\newcommand{\Src}{d^{0,\mathrm{op}}}
\newcommand{\Tgt}{d^{1,\mathrm{op}}}
\Mr{GTO}, \quad \Mr{XEQ}
\end{equation*} のうち, $\Mr{GTO}$ 命令はメモリー内に置かれたラベルに処理を移す $\Mr{goto}$ に相当する.
一方, $\Mr{XEQ}$ 命令は, サブルーチンの呼び出しに相当する. 移動先の処理中に $\Mr{RTN}$ 命令または $\Mr{END}$ 命令に遭遇すると, プログラムの処理は $\Mr{XEQ}$ 命令の次の行に戻って来る. ここまで処理がなされて, $\Mr{XEQ}$ 命令による分岐処理が完了する.
マニュアルによれば, $\Mr{XEQ}$ 命令による処理の分岐が行われると, HP-42S はその $\Mr{XEQ}$ 命令の位置を記憶する. これにより, 分岐先での処理が終了して $\Mr{RTN}$ 命令または $\Mr{END}$ 命令が実行されると, 元の位置に戻って処理を継続することができる.
なお, $\Mr{XEQ}$ 命令は, キーボードからプログラムを実行する際にも使用される.
■ サンプルプログラム
以下のような二つのプログラム $\text{"PRG3"}$, $\text{"PRG4"}$ を考える.
\begin{align*}
& 01 \q \Mr{LBL} \qq \text{"PRG3"} & \q & ; \text{グローバルラベル: PRG3.} \\
& 02 \q \Mr{XEQ} \qq \text{"PRG4"} & & ; \text{グローバルラベル "PRG4" に分岐. HP-42S はこの XEQ 命令行の位置を記憶.} \\
& 03 \q \Mr{TONE} \qq \Mr{0} & & ; \text{ビープ音を鳴らす. トーン番号 0 の音が鳴る.} \\
& 04 \q \Mr{END} & & \\
& & & \\
& 01 \q \Mr{LBL} \qq \text{"PRG4"} & & ; \text{グローバルラベル: PRG4.} \\
& 02 \q \Mr{TONE} \qq \Mr{9} & & ; \text{ビープ音を鳴らす. トーン番号 9 の音が鳴る.} \\
& 03 \q \Mr{END} & &
\end{align*}
1 番目のプログラム $\text{"PRG3"}$ を
\begin{equation*}
\Mr{XEQ} \qq \text{"PRG3"}
\end{equation*} (キーボードからプログラムを実行するための $\Mr{XEQ}$ 命令の例) により実行すると $\Mr{02}$ 行目の $\Mr{XEQ}$ 命令により処理がグローバルラベル $\text{"PRG4"}$ に分岐する. プログラム $\text{"PRG4"}$ の $\Mr{02}$ 行目の $\Mr{TONE} \qq \Mr{9}$ によって, トーン番号 $9$ に対応するビープ音が鳴る.
$\Mr{03}$ 行目に置かれた $\Mr{END}$ 命令によって, 処理はプログラム $\text{"PRG3"}$ に戻り, $\Mr{03}$ 行目から実行が継続される.
これにより, プログラム $\text{"PRG3"}$ の $\Mr{TONE} \qq \Mr{0}$ によって, トーン番号 $0$ に対応するビープ音が鳴る.
$\Mr{04}$ 行目の $\Mr{END}$ 命令によって, 全処理が終了する.
呼び出し先のプログラム $\text{"PRG4"}$ の $\Mr{02}$ 行目にある $\Mr{TONE} \qq \Mr{9}$ と, 呼び出し元のプログラム $\text{"PRG3"}$ の $\Mr{03}$ 行目にある $\Mr{TONE} \qq \Mr{0}$ の両方が実行される.
つまり, ビープ音は 2 度鳴る.
なお, $\Mr{XEQ}$ 命令によるサブルーチン呼び出しが行われる度に, そのアドレスが戻り位置として記憶されるが, その個数には上限がある.
HP-42S が記憶できる戻り位置の最大個数は 8 個である. もし最大値である 8 個, 戻り位置が記憶された状態で 9 個目のサブルーチン呼び出しが行われた場合, 1 個目すなわち最も古い戻り位置のアドレスが失われてしまう. これにより, プログラムの処理は, 一番最初の $\Mr{XEQ}$ 命令には戻って来ることができず, その時点で実行が途中終了する.
HP-42S によるプログラミングの勉強も, 分岐命令まで辿り着いた.
この後はプログラマブルメニュー (分岐先をメニューにより指定する機能), 条件判断機能, ループ制御機能などが出てくる.
理解するのが大変になるだろうが, その分面白くなっていきそうで楽しみだ.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image