2007年12月19日水曜日

HP50g : SysRPLで円を描いてみたよ

先日、はるまき様から「HP50gで円を描くのに、もう少し早くならないか」という話題が提供されました。ARCを使うと大変遅いのですが、SysRPLでもARCのROMルーチンを呼び出すだけなので、あまり早くはなりませんでした。

しかし、円弧ではなく、円を描くという目的に絞れば、かなり早くは描けるサービスがありましたので、ここで試してみたという次第です。以下のソースを御覧下さい。
------------

!NO CODE
!RPL

::
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
DO>LCD
;
@

------------
これは、PICTをスタックに積み、そこへ同心円を描くプログラムです。最後に DO>LCD で画面に表示しようと試みているのですが、この試みは失敗します。一瞬表示されるだけなのです。しかし、PICTに描いているので、実行後にグラフ画面を表示すると、結果が見られます。

実行速度はARCに比してかなり早くなっておりました。もちろん、円を描くだけなので、円弧を描くには使えません。しかし、これを表示しておく方法がわかりません。何か良い方法はないものでしょうか > kaak様 (オイッ、振ってどうする ?!)


追記 on 2014/09/08
最近になって、海外からのアクセスがあり、表題が機械翻訳されると、とんでもない事になっているらしいので、少し改めました。

【以前】HP50g : SysRPLで円を描いて見たよ
【以後】HP50g : SysRPLで円を描いてみたよ

以前のままだと「I saw in a circle in SysRPL」となってしまいます。まあ、言われてみれば、その様で。


10 件のコメント:

kaak さんのコメント...

このプログラムはかなり速いようですね。
知りませんでした。
数式のグラフはよく作るのですが、円や円弧の図形を描くことはあまりないのです。

プログラム中で DO>LCD は不要です。
DO>LCD のかわりに DROP としても同じ動作をします。この理由は Programing in System RPL の Chap15 (Grobs) のはじめの説明にある "bang-type" だからです。

図形表示を続ける方法ですが、いくつかあると思いますが、たとえば以下の方法があります.

!NO CODE
!RPL

::
GBUFF
60 55 DO
65 40 INDEX@ CircleB
LOOP
ViewObject
;
@

kaak さんのコメント...

デバック用にパラメタを変更していたので、akatukiさんのもとのパラメタにもどします。

!NO CODE
!RPL

::
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
ViewObject
;
@

はるまき さんのコメント...

けっこう速いですね。一瞬、何が起こったのか分からなかった(笑)

私の方は多重プロットのマーカーを色々と変えるときに円を使ったりしていますので、データ数だけ打たなくてはいけなくて重さが・・・、となっていたわけです。

こっちはCとアセンブラばっかりやっているので、一瞬SysRPLが読めない体になってますが、こっちだとONキーが押されるまでループとか、そんな方法で止めてます。

kaak さんのコメント...

DO>LCD が不要だと書きましたが間違いでした。

DO>LCD のあとフリーズして表示を続けることもできます。

!NO CODE
!RPL
::
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
DO>LCD
BINT1 Ck&Freeze
;
@

他にはちょっとインチキかもしれませんが UserRPL コマンドを使って次のような方法もあります。

!NO CODE
!RPL
::
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
DROP
xGRAPH
;
@

はるまきさんの言われるようにONキーを待つ方法は例えば次のようなものでしょうか。

!NO CODE
!RPL
::
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
DO>LCD
BEGIN
ATTN?
UNTIL
;
@

CircleB の中身はSaturnアセンブラなのでかなり速いですね。ARCも全部saturnアセンブラで書けばこのくらい速いものができるのかもしれません。

akatuki さんのコメント...

kaak様、早々のレス、有難う御座いました。これから試してみたく思います。

はるまき様も有難う御座います。最近はHP3Sもおそろかになっており、50gのSysRPLも余り進んでおりません。
そういや、最新のエントリ「データの入力」ですが、拍手ボタンがありませんね、どうされました ?

はるまき さんのコメント...

あくまで趣味の世界なので(私の場合)、のんびりとやっていきまっしょい(^^)
SysRPLは詳しく知らないけど、引数とかは何となく感じ取れるので、こういったネタは助かります。

さて、拍手ボタンですが気がつきませんでした(汗 何かの設定でも変えちゃったのかな?まぁ、意識して設置しているわけでないので(FC2の設定が変わったときそのまんま)、今回は良しとしておきます。

akatuki さんのコメント...

kaak様、遅れてしまいましたが、貴重な情報を戴き有難う御座いました。UserRPLのxGRAPHを使う「インチキ・メソッド」ですが、これこそが当方の求めていたものでした。しかし、出来ればメニュー表示を隠す方法がありましたら、と思います(おねだり守屋)。

はるまき様、「私の方は多重プロットのマーカーを色々と変えるときに円を使ったりしていますので、データ数だけ打たなくてはいけなくて」との事ですが、小さい丸や十字のGROBを作って重ね書き、という方法はどうでしょうか。とは言いましても、当方も試していないので何とも言えませんが。

kaak さんのコメント...

メニューを表示しなくするには、いちばん簡単なのは xGRAPH を使ったプログラムで図形表示のあとメニューで EDIT → NXT(Lキー)→ MENU ですね。

プログラムで行うには、ちょっと長くなりますが次のような方法があります。もっと簡単に出来るかもしれません。( ) 内はコメントです。
' のあとのスペースの有無等には注意してください。


::
CHECKPICT
GBUFF
60 0 DO
65 40 INDEX@ CircleB
LOOP
FALSE
{ NULLLAM NULLLAM } BIND ( 図と FALSE を LAM2, LAM1 にそれぞれ格納 )

ClrDA1IsStat ( 時計表示を停止 )
TURNMENUOFF ( メニューをオフ )

( 以下 ParOuterLoop )
' :: 2GETLAM DO>LCD ; ( 図の表示 )
' :: DROP 47 ?CaseKeyDef
:: TRUE 1PUTLAM ; ( ONキー(47番)を押したら TRUE をLAM1に格納 )
DROP 'DoBadKeyT ; ( それ以外のキーは無視 )

TrueTrue
{ } ( メニューの中身。今回は何もなし )
ONEFALSE
' 1GETLAM ( LAM1 が TRUE のとき終了 )
'ERRJMP
ParOuterLoop

ABND ( メモリ開放 )
RECLAIMDISP ( 表示をもとにもどす )
ClrDAsOK
;
@

これは電卓でプログラムするときの書式で、debug4xでプログラムするときは最後の @ は不要です。

また、{ NULLLAM NULLLAM } BIND の部分を FPTR2 ^2LAMBIND (電卓)、または FLASHPTR 2LAMBIND (debug4x) とするとプログラムサイズが小さくなります。

まず1行目の CHECKPICT はもとのプログラムにも入れておいたほうが良いものですが、ERASE などでグラフィック画面が消去されていてもプログラムが動作するようになります。

LOOP のあとについては詳しくは Programming in SystemRPL の本の 32節 Parameterized Outer Loop にあります。ここに書いたものは本に載っているサンプルプログラムより簡単です。

画面になにかを表示させる場合、「画面に何かを表示してキー入力を待つ」、「キーが入力されたらそれに対応する動作をする」、「また表示してキー入力を待つ」というような動作を繰り返します。それを簡単に実現するのが ParOuterLoop です。このプログラムでは、「1.画面に表示をする」、「2.ONキーを待つ(ONキーがきたら終了、それ以外なら継続)」としています。
1.は ' :: 2GETLAM DO>LCD ; の部分で、
2.は ' :: DROP 47 ?CaseKeyDef :: TRUE 1PUTLAM ; DROP 'DoBadKeyT ; の部分です。

本にあるサンプルプログラムでは、2.でカーソルキーを押したときの動作も定義しているので、もっと長いプログラムになっていますが、基本は同じです。

kaak さんのコメント...

追加:
上記のプログラムで 1.に「カーソル表示」を加え、2.に「カーソルキーを押したときの動作(カーソルの位置を変更)」を加えたり、
また、2.に「F1を押すとメニューの ON/OFF」を加えたり、{ }としたメニューに「メニューの中身」を書き加えると、やりたいことのほとんどは実現できると思います。

akatuki さんのコメント...

kaak様、早々におねだりのお返事を戴きまして恐縮です。これは当方の知識を上回る内容なので「冬休みの宿題」として、じっくりと研究したく思います。有難う御座いました。