アフィリエイト広告を利用しています

2018年11月27日

HP-42S: 図形の描画 ── PIXEL 機能と AGRAPH 機能

$\mathrm{PIXEL}$ 機能および $\mathrm{AGRAPH}$ 機能を使って HP-42S のディスプレイに図形を描くことができる.

$\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*} ディスプレイに下記のようにスマイルマークが描かれる.
hp42s_smile.png


図形を描くプログラムは面白く, 理解するのも楽しい.
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

この記事へのトラックバックURL
https://fanblogs.jp/tb/8376978

この記事へのトラックバック
ファン
検索
<< 2024年11月 >>
          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
最新記事
最新コメント
眼科の定期検査 〜 散歩 by コトタマ (02/15)
眼科の定期検査 by 三文字寄れば文殊のヒフミヨ (09/21)
本を読んで過ごす by 底彦 (12/13)
本を読んで過ごす by ねこ (12/12)
数学の計算をする by 底彦 (12/04)
タグクラウド
カテゴリアーカイブ
仕事(59)
社会復帰(22)
(44)
コンピューター(211)
(1437)
借金(8)
勉強(13)
(13)
数学(97)
運動(8)
日常生活(1398)
(204)
健康(38)
読書(20)
プロフィール

ブログランキング・にほんブログ村へ
にほんブログ村
にほんブログ村 メンタルヘルスブログ うつ病(鬱病)へ
にほんブログ村
にほんブログ村 科学ブログ 数学へ
にほんブログ村
にほんブログ村 IT技術ブログ プログラム・プログラマーへ
にほんブログ村