$\mathrm{PIXEL}$ は $\mathrm{X}$ レジスターと $\mathrm{Y}$ レジスターの数値をディスプレイの $x$ 座標, $y$ 座標として与えて, そこにドットを打つ機能である. 関数のグラフなどを描く際に用いる.
ここでは $\mathrm{AGRAPH}$ 機能を用いてディスプレイに絵を描くプログラムを作ってみる.
HP-42S のディスプレイは $x$ 方向 (横) の 131 ピクセルと $y$ 方向 (縦) の 16 ピクセルから構成されている.
\begin{equation*}
\newcommand{\Ar}[1]{\mathrm{Ar}(#1)}
\newcommand{\ar}{\mathrm{ar}}
\newcommand{\arop}{\Opp{\mathrm{ar}}}
\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{\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}}}
\xymatrix@=48pt {
{(1,1)} \ar@{-}[d]_{y} \ar@{-}[rrr]^{x} &&& {(131,1)} \ar@{-}[d] \\
{(1,16)} \ar@{-}[rrr] &&& {(131,16)}
}
\end{equation*} この四角形の中に絵を描く. $\Mr{AGRAPH}$ 機能の場合は次のような原理に基いて絵を作成する.
それは次のような方法による.
$\Mr{AGRAPH}$ は各英数文字の文字コードによって 8 ピクセルのカラム (縦方向の列) を指定することによって図形を描く.
$y$ 方向の横 1 ピクセル, 縦 8 ピクセルのカラムを単位とし, それぞれに上から 2 の冪乗 $2^n \hspace{2mm} (n = 0, 1,..., 7)$ を割り当てる.
\begin{equation*}
\begin{matrix}
2^0 = 1 & ○ \\
2^1 = 2 & ○ \\
2^2 = 4 & ○ \\
2^3 = 8 & ○ \\
2^4 = 16 & ○ \\
2^5 = 32 & ○ \\
2^6 = 64 & ○ \\
2^7 = 128 & ○
\end{matrix}
\end{equation*} このカラムの縦方向の 8 ビットで表現される各パターンに, 塗りつぶすピクセルに割り当てられた各々の数の和を対応させる. たとえば 1 ピクセル置きに塗りつぶしを行うパターン
\begin{equation*}
\begin{matrix}
1 & ○ \\
2 & ● \\
4 & ○ \\
8 & ● \\
16 & ○ \\
32 & ● \\
64 & ○ \\
128 & ●
\end{matrix}
\end{equation*} では, 塗りつぶすピクセルに割り当てられた数は 2, 8, 32, 128 である. よってこのパターンに対応する数は
\begin{equation*}
2 + 8 + 32 + 128 = 170
\end{equation*} となる. この規則で表現できる数は
\begin{align*}
0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 & = 0, \\
1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 & = 1, \\
0 + 2 + 0 + 0 + 0 + 0 + 0 + 0 & = 2, \\
・ \qq ・ \qq ・ \qq ・ \qq ・ \qq ・ \qq ・ \qq ・ & \\
1 + 2 + 4 + 8 + 16 + 32+ 64 + 128 & = 255
\end{align*} までの 256 個になり, HP-42S の持っている文字コード $0, 1,..., 255$ に (非印字可能文字, 未使用コードまで含めて) 対応させることができる. ちなみに上記の 1 ピクセル置きのパターンの数 $170$ は未使用コードの一つに対応している.
こうして作成したパターンを $x$ 方向に並べて絵を作る.
そのためには以下の手順で処理を行えばよい:
(1) 複数のカラムを並べて, パターンの合成として図形を作成する;
(2) 並べた各カラムに対応する文字コードもしくは文字を, 順に $\Mr{ALPHA}$ レジスターに格納する;
(3) 図形の左上の $y$ 座標 ($1,..., 16$ のいずれか) を指定する;
(4) 図形の右上の $x$ 座標 ($1,..., 131$ のいずれか) を指定する. $y$ 座標, $x$ 座標の順に指定することにより, $y$ 座標が $\Mr{Y}$ レジスターに, $x$ 座標が $\Mr{X}$ レジスターに入る;
(5) $\Mr{CLLCD}$ 命令を発行して全画面を消去する;
(6) $\Mr{AGRAPH}$ 命令を発行して指定した位置に図形を描画する.
HP-42S のマニュアルには, 下記のスマイルマークを描くプログラムが例として挙げられている.
\begin{equation*}
\begin{matrix}
○ & ● & ● & ○ & ○ & ○ & ● & ● & ○ \\
○ & ● & ● & ○ & ○ & ○ & ● & ● & ○ \\
○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ \\
○ & ● & ○ & ○ & ○ & ○ & ○ & ● & ○ \\
● & ● & ○ & ○ & ○ & ○ & ○ & ● & ● \\
○ & ○ & ● & ○ & ○ & ○ & ● & ○ & ○ \\
○ & ○ & ○ & ● & ● & ● & ○ & ○ & ○ \\
○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○
\end{matrix}
\end{equation*} 各カラムに対応する数と, これを文字コードと解釈した時に対応する文字は次のようになる.
\begin{equation*}
\begin{matrix}
1 & ○ & ● & ● & ○ & ○ & ○ & ● & ● & ○ \\
2 & ○ & ● & ● & ○ & ○ & ○ & ● & ● & ○ \\
4 & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ \\
8 & ○ & ● & ○ & ○ & ○ & ○ & ○ & ● & ○ \\
16 & ● & ● & ○ & ○ & ○ & ○ & ○ & ● & ● \\
32 & ○ & ○ & ● & ○ & ○ & ○ & ● & ○ & ○ \\
64 & ○ & ○ & ○ & ● & ● & ● & ○ & ○ & ○ \\
128 & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ & ○ \\
& 16 & 27 & 35 & 64 & 64 & 64 & 35 & 27 & 16 \\
& \leftarrow & {\Mr{\small E}}_{\Mr{\normalsize C}} & \# & @ & @ & @ & \# & {\Mr{\small E}}_{\Mr{\normalsize C}} & \leftarrow \\
\end{matrix}
\end{equation*} このカラムの並びを $\Mr{ALPHA}$ レジスターに格納して $\Mr{AGRAPH}$ 命令で描画するプログラムは次のようになる.
\begin{align*}
& 01 \q \Mr{LBL} \qq \text{"SMILE"} & \q & ; \text{グローバルラベル.} \\
& 02 \q \Mr{"\leftarrow"} & & ; \text{文字コード 16 に対応する文字} "\leftarrow" \text{を} \\
& & & ; \text{ALPHA レジスターに入れる.} \\
& 03 \q 27 & & ; \text{文字コード 27 を X レジスターに入れる.} \\
& 04 \q \Mr{XTOA} & & ; \text{X レジスターの内容 27 を文字コード 27 に対応する文字に変換して} \\
& & & ; \text{ALPHA レジスターに入れる.} \\
& 05 \q \Mr{\vdash}\text{"#@@@@#"} & & ; \text{文字コード列 "#@@@@#" (35 64 64 64 35).} \\
& 06 \q \Mr{XTOA} & & ; \text{X レジスターの内容 27 を文字コード 27 に対応する文字に変換して} \\
& & & ; \text{ALPHA レジスターに入れる.} \\
& 07 \q \Mr{\vdash}"\leftarrow" & & ; \text{文字コード 16 に対応する文字} "\leftarrow" \text{を} \\
& & & ; \text{ALPHA レジスターに入れる.} \\
& 08 \q 5 & & ; \text{図形の左上の位置の y 座標 5 を指定する.} \\
& 09 \q 62 & & ; \text{図形の左上の位置の x 座標 62 を指定する.} \\
& 10 \q \Mr{CLLCD} & & ; \text{図形表示のために全画面を消去する.} \\
& 11 \q \Mr{AGRAPH} \qq & & ; \text{図形イメージを表示する.} \\
& 12 \q \Mr{END} & & ; \text{プログラムの終了.} \\
\end{align*}
このプログラムを実行する.
\begin{equation*}
\Mr{XEQ} \qq \Mr{"SMILE"}
\end{equation*} ディスプレイに下記のようにスマイルマークが描かれる.
図形を描くプログラムは面白く, 理解するのも楽しい.
【このカテゴリーの最新記事】
-
no image
-
no image
-
no image
-
no image
-
no image