2013年10月14日月曜日

SysRPLの例と、その解説

先日、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 件のコメント: