先日、HP PrimeでSierpinski Gasketsの実行例がYouTubeに上がっているというので、我がHP50gで同じ様なコードを動かして比較した、というネタを書いたのですが、ここで、そのコードの内、SysRPL版についての簡単な解説を出しておきます。こんなコードでした。
!NO CODE
!RPL
::
CLEARLCD (LCD クリア )
TURNMENUOFF (MENU 表示を OFF に)
80 131 MAKEGROB (画面の大きさのGROBを作成)
GROB>GDISP (作成したGROBをPICTに入れる)
TODISP (PICT を表示します)
' ID R PURGE (一旦、変数を削除してから)
%0 ' ID R CREATE (変数を作り直す)
' ID X PURGE (上記と同様)
%1 ' ID X CREATE
' ID Y PURGE
%1 ' ID Y CREATE
3000 0 DO (3000 回のループ計算)
%RAN %3 %* ' ID R STO (変数Rに0以上3未満の乱数を入れる)
ID R %1 %< ITF (Rの中身が1未満ならば、)
:: ID X %0.5 %* ' ID X STO ID Y %0.5 %* ' ID Y STO ;
(X=0.5*X; Y=0.5*Y; )
:: ID R %2 %< ITF (入れ子判定 ; Rが2未満ならば、)
:: ID X %0.5 %+ %0.5 %* ' ID X STO ID Y %1 %+ %0.5 %* ' ID Y STO ;
(X=(X+0.5)*0.5; Y=(Y+1)*0.5; )
:: ID X %1 %+ %0.5 %* ' ID X STO ID Y %0.5 %* ' ID Y STO ;
(Rが2以上の場合 ; X=(X+1)*0.5; Y=0.5*Y; )
;
ID X %80 %* COERCE 25 #+ 80 ID Y %80 %* COERCE #- (点を描く座標の計算)
PIXON3 (PICT に点を打つ)
LOOP
;
@
* SysRPLが早いワケ
SysRPLでは、BINT (Binary Integer) という整数値 (5 nibble) を利用できます。整数値の計算は、BCDの十進数よりも計算の時間が少ないので、BINT を積極活用する事で、UserRPL よりも高速に動作するプログラムが作成できるのです。
また、システムのAPIを直接呼び出すので、UserRPLよりも早く動作します。
しかし、SysRPLでは、プログラムの作成、実行に少々手間が掛かるのも事実です。
コンパイラ(ASM コマンド)は、ソース中の整数値を自動でBINTとして解釈しますが、整数の演算には、#+, #-, #*, #/ の様に「#」を付けた命令を使います。BCDの電卓数値、演算は、%3 %4 %+ の様に「%」を付けて表現されます。
COERCE によって、スタックにあるBCD実数値をBINTに変換できます。
* 大域変数の作成
大域変数の作成には、CREATE が利用できます。スタックに変数の内容を積んでおき、変数名を指定して CREATE を実行します。
変数名の指定には、' ID [変数名] というシーケンスを書きます。最初のシングルクォートがないと、変数の読み出しとなってしまいます。
変数を作成するには、以上の操作で十分ですが、何度も CREATE で変数を作成すると、同じ変数名の変数が複数作成されます。変数の同一性を担保するには、作成前に変数を削除するのが確実です。変数の削除には、PURGE が使えます。
以上をまとめて、大域変数 R を作成するには、つぎの様にしました。
' ID R PURGE (一旦、変数を削除してから)
%0 ' ID R CREATE (変数を作り直す)
* 分岐構造
分岐構造には、いくつかの方法がありますが、ここでは ITF (If Then False) を使用しています。
[condition] ITF [True block] [False block]
ブロックは、:: と ; で囲む事で成立します。
ITF は、ブロックを2つしか取れませんから、複数の分岐の場合、False block 中に、更に ITF による分岐を入れ子にする必要があります。
* グラフィクスの扱い
大まかに、50gでは LCD (液晶画面) と、PICT の2 つのグラフィクスがあります。
特に何もしなければ、画面に表示されているのは液晶画面のハードウェア・グラフィクス・メモリです。プログラムの実行中はグラフィクスが表示されていますが、実行後は、スタック表示になって消えてしまいます。
PICTにグラフィクスを描けば、プログラムの実行後にもグラフィクスを呼び出せます。
プログラムで PICT を表示させるには、 TODISP が使えます。TODISP を実行すると、PICT を表示しながらグラフィクスに手を入れられます。
CLEARLCD (LCD クリア )
TURNMENUOFF (MENU 表示を OFF に)
80 131 MAKEGROB (画面の大きさのGROBを作成)
GROB>GDISP (作成したGROBをPICTに入れる)
TODISP (PICT を表示します)
PICT のクリアには、MAKEGROB にて 新しいGROB を作成し、GROB>GDISP で作成したGROB を GDISP (PICT) に入れてやります。
LCDに点を打つには PIXON 、PICTに点を打つには PIXON3 を使います。他のコマンドも多くあります。
なお、SysRPLの勉強には、
Introduction to System RPL and Assembly Language - hpcalc.org
http://www.hpcalc.org/details.php?id=7114
が大変参考になります。
0 件のコメント:
コメントを投稿