サンプルプログラムが何とか理解できたのでまとめておく.
以前にも書いたが, プログラマブルメニューのサンプルプログラムの仕様をもう一度示す.
・ プログラムは 12 個のメニュー項目から構成される. それぞれのメニュー項目は一年の 12 の月, 1 月, 2 月,..., 12 月に対応している. 各月の略称と正式名は次のとおりである: JAN (January), FEB (February), MAR (March), APR (April), MAY (May), JUN (June), JUL (July), AUG (August), SEP (September), OCT (October), NOV (November), DEC (December).
・ メニューは 2 つのメニュー画面から構成される. つまり, 6 個のメニュー項目を持つメニュー画面が二列列存在する. 一列目は 1 月から 6 月に対応し, 二列目は 7 月から 12 月に対応する.
・ メニューキーを押すと, プログラムはそのメニューキーに対応する月の省略しない名前と月の日数をディスプレイに表示する.
この最後の機能のリストはマニュアルには載っていない.
サンプルプログラムの完全なリスト
プログラムは大きくわけると 3 つの部分から構成される.
● メニュー A の定義
これはメニューの 1 ページ目で, 1 月から 6 月に対応している. また, $[\blacktriangle]$ キーあるいは $[\blacktriangledown]$ キーによってもう一つのメニュー B に移るための処理と $[\mathtt{EXIT}]$ キーによるメニューの終了処理を含んでいる.
● メニュー B の定義
これはメニューの 2 ページ目で, 7 月から 12 月に対応している. $[\blacktriangle]$ キーあるいは $[\blacktriangledown]$ キーによってもう一つのメニュー A に移るための処理と $[\mathtt{EXIT}]$ キーによるメニューの終了処理を含んでいる.
● サブルーチンの定義
終了処理のサブルーチンはメニューを終了してプログラムを終了する (※). 01 〜 12 それぞれのサブルーチンは以下の文字列をディスプレイに表示する.
サブルーチン 01: "January:31"
サブルーチン 02: "February:28"
サブルーチン 03: "March:31"
サブルーチン 04: "April:30"
サブルーチン 05: "May:31"
サブルーチン 06: "June:30"
サブルーチン 07: "July:31"
サブルーチン 08: "August:31"
サブルーチン 09: "September:30"
サブルーチン 10: "October:31"
サブルーチン 11: "November:30"
サブルーチン 12: "December:31"
※: 実際には終了処理の最後では呼び出し元に戻る $\mathrm{RTN}$ 命令を使用している. このサンプルプログラムではトップレベルで終了処理が実行されるために, 結果としてプログラム自体が終了する.
プログラムの構造をこのような, いくつかの意味的・処理的にまとまった部分の集まりとして捉えることができたことは大きい. このような思考や捉え方がずっとできなかったからだ.
メニュー A の定義
\begin{alignat*}{2}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\Arr}[1]{\mathrm{Arr}(#1)}
\newcommand{\Card}{\text{card}}
\newcommand{\Cdot}{\,\cdot^{\mathrm{op}}}
\newcommand{\Cocone}{\mathrm{Cocone}}
\newcommand{\Colim}{\mathrm{colim}\,}
\newcommand{\CommaCat}[2]{(#1/#2)}
\newcommand{\Cone}{\mathrm{Cone}}
\newcommand{\Eqclass}[4]{{#1#2#3}_{#4}}
\newcommand{\EqCls}[2]{{\left[#1\right]}_{#2}}
\newcommand{\Eqcls}[1]{\left[#1\right]}
\newcommand{\FnRest}[2]{{#1}|{#2}}
\newcommand{\Func}[2]{\mathrm{Func}(#1,#2)}
\newcommand{\g}{\varg}
\newcommand{\Hom}{\mathrm{Hom}}
\newcommand{\Id}[1]{\mathrm{id}_{#1}}
\newcommand{\In}{\mathrm{incl}}
\newcommand{\Inc}[2]{\mathrm{incl}\left(#1,#2\right)}
\newcommand{\Incl}[2]{\mathrm{incl}_{#1}^{#2}}
\newcommand{\Mb}[1]{\mathbf{#1}}
\newcommand{\Mr}[1]{\mathrm{#1}}
\newcommand{\Ms}[1]{\mathscr{#1}}
\newcommand{\Mt}[1]{\mathtt{#1}}
\newcommand{\Nat}{\mathrm{Nat}}
\newcommand{\Ob}[1]{\mathrm{Ob}(#1)}
\newcommand{\Opp}[1]{{#1}^{\mathrm{op}}}
\newcommand{\Prj}[2]{\mathrm{proj}\left(#1,#2\right)}
\newcommand{\Proj}[2]{\mathrm{proj}^{#1}_{#2})}
\newcommand{\q}{\hspace{1em}}
\newcommand{\qq}{\hspace{0.5em}}
\newcommand{\Rel}[1]{\langle{#1}\rangle}
\newcommand{\Rest}[2]{{#1}|{#2}}
\newcommand{\SkelCat}[1]{\mathrm{sk}(#1)}
\newcommand{\Slash}[1]{{\ooalign{\hfil/\hfil\crcr$#1$}}}
\newcommand{\SliCat}[2]{{#1}\,\big/\,{#2}}
\newcommand{\Src}{d^{0,\mathrm{op}}}
\newcommand{\Sub}{\mathrm{Sub}}
\newcommand{\ssqrt}[1]{\sqrt{\smash[b]{\mathstrut #1}}}
\newcommand{\Tgt}{d^{1,\mathrm{op}}}
\newcommand{\TwArCat}[1]{\mathrm{Tw}(#1)}
\newcommand{\VectCat}[1]{#1 \mathchar`- \mathbf{Vect}}
\newcommand{\Grp}{\mathbf{Grp}}
\newcommand{\Mon}{\mathbf{Mon}}
\newcommand{\POs}{\mathbf{Pos}}
\newcommand{\Psh}{\mathbf{Psh}}
\newcommand{\Set}{\mathbf{Set}}
\newcommand{\Sh}{\mathbf{Sh}}
\newcommand{\Top}{\mathbf{Top}}
\newcommand{\A}{\mathscr{A}}
\newcommand{\B}{\mathscr{B}}
\newcommand{\C}{\mathscr{C}}
\newcommand{\D}{\mathscr{D}}
\newcommand{\E}{\mathscr{E}}
\newcommand{\F}{\mathscr{F}}
\newcommand{\sH}{\mathscr{H}}
\newcommand{\I}{\mathscr{I}}
\newcommand{\J}{\mathscr{J}}
\newcommand{\K}{\mathscr{K}}
\newcommand{\sL}{\mathscr{L}}
\newcommand{\M}{\mathscr{M}}
\newcommand{\N}{\mathscr{N}}
\newcommand{\sO}{\mathscr{O}}
\newcommand{\sP}{\mathscr{P}}
\newcommand{\R}{\mathscr{R}}
\newcommand{\sS}{\mathscr{S}}
\newcommand{\T}{\mathscr{T}}
\newcommand{\U}{\mathscr{U}}
\newcommand{\V}{\mathscr{V}}
\newcommand{\W}{\mathscr{W}}
\newcommand{\X}{\mathscr{X}}
\newcommand{\Y}{\mathscr{Y}}
\newcommand{\Z}{\mathscr{Z}}
\newcommand{\Pw}{\mathbf{P}}
\newcommand{\Rn}[1]{\Real^{#1}}
\newcommand{\Pw}{\mathbf{P}}
\newcommand{\Rn}[1]{\Real^{#1}}
\phantom{02} & \phantom{\qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99} & \hspace{4em} & \phantom{; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.}} \\
01 & \qq\Mr{LBL}\qq\Mr{''YEAR''} & \hspace{4em} & ; \text{プログラム ``YEAR''.} \\
02 & \qq\Mr{LBL}\qq\Mr{A} & ~ & ; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.} \\
03 & \qq\Mr{''JAN''} & ~ & ; \text{メニュー ``JAN'': 1 月.} \\
04 & \qq\Mr{KEY}\qq 1 \qq\Mr{XEQ}\qq 01 & ~ & ; \text{キー 1: $[\Sigma +]$ でサブルーチン 01 を呼び出す.} \\
05 & \qq\Mr{''FEB''} & ~ & ; \text{メニュー ``FEB'': 2 月.} \\
06 & \qq\Mr{KEY}\qq 2 \qq\Mr{XEQ}\qq 02 & ~ & ; \text{キー 2: $[1/x]$ でサブルーチン 02 を呼び出す.} \\
07 & \qq\Mr{''MAR''} & ~ & ; \text{メニュー ``MAR'': 3 月.} \\
08 & \qq\Mr{KEY}\qq 3 \qq\Mr{XEQ}\qq 03 & ~ & ; \text{キー 3: $[\sqrt{x}]$ でサブルーチン 03 を呼び出す.} \\
09 & \qq\Mr{''APR''} & ~ & ; \text{メニュー ``APR'': 4 月.} \\
10 & \qq\Mr{KEY}\qq 4 \qq\Mr{XEQ}\qq 04 & ~ & ; \text{キー 4: [LOG] でサブルーチン 04 を呼び出す.} \\
11 & \qq\Mr{''MAY''} & ~ & ; \text{メニュー ``MAY'': 5 月.} \\
12 & \qq\Mr{KEY}\qq 5 \qq\Mr{XEQ}\qq 05 & ~ & ; \text{キー 5: [LN] でサブルーチン 05 を呼び出す.} \\
13 & \qq\Mr{''JUN''} & ~ & ; \text{メニュー ``JUN'': 6 月.} \\
14 & \qq\Mr{KEY}\qq 6 \qq\Mr{XEQ}\qq 06 & ~ & ; \text{キー 6: [XEQ] でサブルーチン 06 を呼び出す.} \\
15 & \qq\Mr{KEY}\qq 7 \qq\Mr{GTO}\qq \Mr{B} & ~ & ; \text{キー 7: $[\blacktriangle]$ およびキー 8: $[\blacktriangledown]$ でメニュー B に切り換わる.} \\
16 & \qq\Mr{KEY}\qq 8 \qq\Mr{GTO}\qq \Mr{B} & ~ & \\
17 & \qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99 & ~ & ; \text{キー 9: [EXIT] でメニューの終了処理 99 に飛ぶ.} \\
~ & ~ & ~ & ; \text{これによりプログラム自体も終了する.} \\
18 & \qq\Mr{MENU} & ~ & ; \text{定義されたメニューの開始. メニュー A が開始される.} \\
19 & \qq\Mr{LBL}\qq 20 & ~ & ; \text{サブルーチン 20: メニュー A を表示してキー入力待ちを行う.} \\
20 & \qq\Mr{STOP} & ~ & ; \text{プログラムを一時停止する.} \\
~ & ~ & ~ & ; \text{何れかのキー入力で再開して対応する処理を起動する.} \\
21 & \qq\Mr{GTO}\qq 20 & ~ & ; \text{キー入力処理の終了後にこの行に戻る.} \\
~ & ~ & ~ & ; \text{自分自身を呼び出して再びキー入力待ちの無限ループに入る.} \\
\end{alignat*}
メニュー B の定義
\begin{alignat*}{2}
\phantom{02} & \phantom{\qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99} & \hspace{4em} & \phantom{; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.}} \\
22 & \qq\Mr{LBL}\qq\Mr{B} & ~ & ; \text{メニュー B の定義: 7 月 〜 12 月・メニュー切り替え・終了処理.} \\
23 & \qq\Mr{''JUL''} & ~ & ; \text{メニュー ``JUL'': 7 月.} \\
24 & \qq\Mr{KEY}\qq 1 \qq\Mr{XEQ}\qq 07 & ~ & ; \text{キー 1: $[\Sigma +]$ でサブルーチン 07 を呼び出す.} \\
25 & \qq\Mr{''AUG''} & ~ & ; \text{メニュー ``AUG'': 8 月.} \\
26 & \qq\Mr{KEY}\qq 2 \qq\Mr{XEQ}\qq 08 & ~ & ; \text{キー 2: $[1/x]$ でサブルーチン 08 を呼び出す.} \\
27 & \qq\Mr{''SEP''} & ~ & ; \text{メニュー ``SEP'': 9 月.} \\
28 & \qq\Mr{KEY}\qq 3 \qq\Mr{XEQ}\qq 09 & ~ & ; \text{キー 3: $[\sqrt{x}]$ でサブルーチン 09 を呼び出す.} \\
29 & \qq\Mr{''OCT''} & ~ & ; \text{メニュー ``OCT'': 10 月.} \\
30 & \qq\Mr{KEY}\qq 4 \qq\Mr{XEQ}\qq 10 & ~ & ; \text{キー 4: [LOG] でサブルーチン 10 を呼び出す.} \\
31 & \qq\Mr{''NOV''} & ~ & ; \text{メニュー ``NOV'': 11 月.} \\
32 & \qq\Mr{KEY}\qq 5 \qq\Mr{XEQ}\qq 11 & ~ & ; \text{キー 5: [LN] でサブルーチン 11 を呼び出す.} \\
33 & \qq\Mr{''DEC''} & ~ & ; \text{メニュー ``DEC'': 12 月.} \\
34 & \qq\Mr{KEY}\qq 6 \qq\Mr{XEQ}\qq 12 & ~ & ; \text{キー 6: [XEQ] でサブルーチン 12 を呼び出す.} \\
35 & \qq\Mr{KEY}\qq 7 \qq\Mr{GTO}\qq \Mr{A} & ~ & ; \text{キー 7: $[\blacktriangle]$ およびキー 8: $[\blacktriangledown]$ でメニュー A に切り換わる.} \\
36 & \qq\Mr{KEY}\qq 8 \qq\Mr{GTO}\qq \Mr{A} & ~ & ; \\
37 & \qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99 & ~ & ; \text{キー 9: [EXIT] でメニューの終了処理 99 に飛ぶ.} \\
~ & ~ & ~ & ; \text{これによりプログラム自体も終了する.} \\
38 & \qq\Mr{MENU} & ~ & ; \text{定義されたメニューの開始. メニュー B が開始される.} \\
39 & \qq\Mr{LBL}\qq 21 & ~ & ; \text{サブルーチン 21: メニュー B を表示してキー入力待ちを行う.} \\
40 & \qq\Mr{STOP} & ~ & ; \text{プログラムを一時停止する.} \\
41 & \qq\Mr{GTO}\qq 21 & ~ & ; \text{何れかのキー入力で再開して対応する処理を起動する.}
\end{alignat*}
サブルーチンの定義
終了処理のサブルーチン
\begin{alignat*}{2}
\phantom{02} & \phantom{\qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99} & \hspace{4em} & \phantom{; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.}} \\
42 & \qq\Mr{LBL}\qq 99 & ~ & ; \text{終了処理の開始.} \\
43 & \qq\Mr{CLMENU} & ~ & ; \text{メニューをクリアーする.} \\
44 & \qq\Mr{EXITALL} & ~ & ; \text{全メニューを終了する.} \\
45 & \qq\Mr{RTN} & ~ & ; \text{$\Mr{END}$ 命令ではなく $\Mr{RTN}$ 命令でサブルーチンを終了する.} \\
~ & ~ & ~ & ; \text{このサンプルプログラムがサブルーチンとして別のプログラム} \\
~ & ~ & ~ & ; \text{から呼び出されている場合は, 実行はそのプログラムに戻る.} \\
\end{alignat*}
1 月から 12 月用の各メッセージを表示するサブルーチン
\begin{alignat*}{2}
\phantom{02} & \phantom{\qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99} & \hspace{4em} & \phantom{; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.}} \\
46 & \qq\Mr{LBL}\qq\Mr{01} & ~ & ; \text{``JAN'' メニュー.} \\
47 & \qq\Mr{''January:31''} & ~ & ; \text{表示するメッセージ.} \\
48 & \qq\Mr{AVIEW} & ~ & ; \text{ALPHA レジスターの内容を表示する.} \\
49 & \qq\Mr{PSE} & ~ & ; \text{約 1 秒間プログラムの実行を停止する.} \\
50 & \qq\Mr{RTN} & ~ & ; \text{呼び出し元に戻る (他の月のサブルーチンも同様).} \\
51 & \qq\Mr{LBL}\qq\Mr{02} & ~ & ; \text{``FEB'' メニュー.} \\
52 & \qq\Mr{''February:28''} & ~ & ; \text{2 月は 28 日とする.} \\
~ & ~ & ~ & ; \text{} \\
53 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
54 & \qq\Mr{PSE} & ~ & ; \text{} \\
55 & \qq\Mr{RTN} & ~ & ; \text{} \\
56 & \qq\Mr{LBL}\qq\Mr{03} & ~ & ; \text{``MAR'' メニュー.} \\
57 & \qq\Mr{''March:31''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
58 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
59 & \qq\Mr{PSE} & ~ & ; \text{} \\
60 & \qq\Mr{RTN} & ~ & ; \text{} \\
61 & \qq\Mr{LBL}\qq\Mr{04} & ~ & ; \text{``APR'' メニュー.} \\
62 & \qq\Mr{''April:30''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
63 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
64 & \qq\Mr{PSE} & ~ & ; \text{} \\
65 & \qq\Mr{RTN} & ~ & ; \text{} \\
66 & \qq\Mr{LBL}\qq\Mr{05} & ~ & ; \text{``MAY'' メニュー.} \\
67 & \qq\Mr{''May:31''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
68 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
69 & \qq\Mr{PSE} & ~ & ; \text{} \\
70 & \qq\Mr{RTN} & ~ & ; \text{} \\
71 & \qq\Mr{LBL}\qq\Mr{06} & ~ & ; \text{``JUN'' メニュー.} \\
72 & \qq\Mr{''June:30''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
73 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
74 & \qq\Mr{PSE} & ~ & ; \text{} \\
75 & \qq\Mr{RTN} & ~ & ; \text{} \\
\end{alignat*}
\begin{alignat*}{2}
\phantom{02} & \phantom{\qq\Mr{KEY}\qq 9 \qq\Mr{GTO}\qq 99} & \hspace{4em} & \phantom{; \text{メニュー A の定義: 1 月 〜 6 月・メニュー切り替え・終了処理.}} \\
76 & \qq\Mr{LBL}\qq\Mr{07} & ~ & ; \text{``JUL'' メニュー.} \\
77 & \qq\Mr{''July:31''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
78 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
79 & \qq\Mr{PSE} & ~ & ; \text{} \\
80 & \qq\Mr{RTN} & ~ & ; \text{} \\
81 & \qq\Mr{LBL}\qq\Mr{08} & ~ & ; \text{``AUG'' メニュー.} \\
82 & \qq\Mr{''August:31''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
83 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
84 & \qq\Mr{PSE} & ~ & ; \text{} \\
85 & \qq\Mr{RTN} & ~ & ; \text{} \\
86 & \qq\Mr{LBL}\qq\Mr{09} & ~ & ; \text{``SEP'' メニュー.} \\
87 & \qq\Mr{''September:30''} & ~ & ; \text{} \\
~ & ~ & ~ & ; \text{} \\
88 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
89 & \qq\Mr{PSE} & ~ & ; \text{} \\
90 & \qq\Mr{RTN} & ~ & ; \text{} \\
91 & \qq\Mr{LBL}\qq\Mr{10} & ~ & ; \text{} \\
92 & \qq\Mr{''October:31''} & ~ & ; \text{``OCT'' メニュー.} \\
~ & ~ & ~ & ; \text{} \\
93 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
94 & \qq\Mr{PSE} & ~ & ; \text{} \\
95 & \qq\Mr{RTN} & ~ & ; \text{} \\
96 & \qq\Mr{LBL}\qq\Mr{11} & ~ & ; \text{} \\
97 & \qq\Mr{''November:30''} & ~ & ; \text{``NOV'' メニュー.} \\
~ & ~ & ~ & ; \text{} \\
98 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
99 & \qq\Mr{PSE} & ~ & ; \text{} \\
100 & \qq\Mr{RTN} & ~ & ; \text{} \\
101 & \qq\Mr{LBL}\qq\Mr{12} & ~ & ; \text{} \\
102 & \qq\Mr{''December:31''} & ~ & ; \text{``DEC'' メニュー.} \\
~ & ~ & ~ & ; \text{} \\
103 & \qq\Mr{AVIEW} & ~ & ; \text{} \\
104 & \qq\Mr{PSE} & ~ & ; \text{} \\
105 & \qq\Mr{RTN} & ~ & ; \text{} \\
106 & \qq\Mr{END} & ~ &
\end{alignat*}
-
no image
-
no image
-
no image
-
no image
-
no image