2015年4月30日木曜日

HP50g : SysRPLで配列を扱うためのメモ

SysRPLにも配列(行列、ベクトル)を確保するためのコマンドがいくつかあります。まずは「^MAKEARRY 」というコマンドを使ってみようと思いました。

HP49G Entry Reference
https://staff.fnwi.uva.nl/c.dominik/hpcalc/entries/hp49g/entries.pdf

には、SysRPLの多くのコマンドが掲載されています。しかし、これに従ってコードを書いてみたのですが、なかなかうまく動いてくれません。(注意 ! このコードは確実に暴走します)

!NO CODE
!RPL
::
  { 3 } %2.3 ^MAKEARRY
;
@

ホトホト困り果て、調べてみた所、どうやら足りないモノがあった模様。

HP49G SYSRPL ^MAKEARRY HELP - compgroups.net
http://compgroups.net/comp.sys.hp48/hp49g-sysrpl-makearry-help/123989

によると、「If the command start with ^, add FPTR2」とあります。^MAKEARRYの様にキャレットで始まるコマンドを使う場合、FPTR2 を付けよ、という具合らしい。エェッー、そんなん聞いていないヨ !!
そんな具合で、取り敢えず「配列を作る(だけの)」プログラムは、こんな具合になりました。

!NO CODE
!RPL
::
  { 3 } %2.3 FPTR2 ^MAKEARRY
;
@

  1. { 3 } で作成する配列の大きさを指定し、
  2. 各要素の初期値を %2.3 (実数値の2.3) として、
  3. FPTR2 ^MAKEARRY で配列を作成します。

これで作成できるのは配列と言っても「ベクトル(1次元配列)」です。大きさの指定を変える事で行列(2次元配列)も作成できます。

配列を作る命令語には、ほかに「^XEQ>ARRY」などがあります。^XEQ>ARRYは、スタックから、配列の大きさと構成する要素を取り出して配列を構成します。キャレットが付いているので「FPTR2」を忘れずに。
配列の要素取り出しには「GETATELN」、要素設定には「PUTEL」があり、この辺りのコードを使った習作を示しておきます。

!NO CODE
!RPL
::
    %0 %1 %2 %3 %4 { %5 } FPTR2 ^XEQ>ARRY
    DUP
    #4 SWAP GETATELN DROP
    %5 %* #3 PUTEL
;
@

無事に実行が終わると [0. 1. 15. 3. 4.] というベクトルがスタックに残っている筈です。

大して長いコードではないのですが、勉強しながらの作業なので暴走させる事もしばしばです。

今回は、リセットが効かない暴走を経験しました。リセットを掛けようとON+[F3], ON+[F1]+[F6] を押しても、反応がないのです。画面の下、4/5が真っ黒くろすけになって、動きがないのですね。これはコマッタ。

Educalc.netに「電池抜きリセット」(電池を全て取り外し、15分以上放置新聞)というTipsが出ていたので、藁をもすがる思いで試したのですが、電源を入れても同様の状態です。ウーム !?
検索していたら、「FlashROM更新とセルフテストメニューの呼び出し」という話題が見つかって、「そうだ、コレだ」と試してみる事にしました。ON+[F3]が効かないので、電池を入れる前に「+」、「-」キーの両方を押しておき、押しながら電池を装填するという奇っ怪な技でメニューの呼び出しに成功し、セルフテストも一通り問題ない事が確認できました。ハードウェアはイカれていない様子。そこで判ったのは「SysRPLの暴走で、FlashROMが書き換わってしまった」という可能性です。
現在、最新のROMは2.15で、これは一度書き込んでいるので、手元にイメージはあります。早速、SDカードによるFlashROMの書き込みを行い、ようやく復旧したという次第です。ヨカッタ、ヨカッタ。


15 件のコメント:

Sentaro さんのコメント...

akatuki様、こんばんは!

SysRPLは基本的なことだけ試してまだ配列までは進んでなかったのですけど、配列確保で暴走したら本体flash書き換わるかも?なんていうのはかなりびっくりです。

SysRPLの性格上、マシン語の暴走と同じくRAMデータがめちゃめちゃになってしまうのは予想の範囲内ですが、電池抜きリセットでも起動しないとなると
かなり焦りますね(^^;

CASIOのfx-CG10では起動BIOSが割と簡単に飛ぶらしくflash飛ばしてしまったらもう二度と起動しなかったので(汗)
50Gは起動BIOSが簡単に飛ばないことがわかって一安心?です(^^)

akatuki さんのコメント...

Sentaro 様、こんばんは!

> SysRPLは基本的なことだけ試してまだ配列までは進んでなかったのですけど、配列確保で暴走したら本体flash書き換わるかも?なんていうのはかなりびっくりです。

SysRPL、もう試しておりますか !
当方、すっかり御無沙汰だったので、殆ど初心者状態です。一から出直し。

> SysRPLの性格上、マシン語の暴走と同じくRAMデータがめちゃめちゃになってしまうのは予想の範囲内ですが、電池抜きリセットでも起動しないとなると
> かなり焦りますね(^^;

そうなんですよ ! 「あー、やっちまったか ...」と思っていたのですが、FlashROM更新メニューが表示された時は、どれだけ安堵した事か !
それだけ「スリル」があると、ますます興味深いというか ... 。火遊びは慎重に、ですネ。

> CASIOのfx-CG10では起動BIOSが割と簡単に飛ぶらしくflash飛ばしてしまったらもう二度と起動しなかったので(汗)

という事は、2代目 ... ?
ウーン、マイッタ !

> 50Gは起動BIOSが簡単に飛ばないことがわかって一安心?です(^^)

実際の所、この辺りの挙動は良く判らんのです。
今回は「たまたま」そこ(起動BIOS)が書き換わっていない暴走だったのか ... 。

50gもPCで動くエミュレータがあるらしく、SysRPLではエミュレータで試験走行するのが確実らしいのですが、
当方、本体でゴニョゴニョやるのが割合気に入ってしまって、無茶ばかりしております。

Sentaro さんのコメント...

akatuki様、こんばんは!

>SysRPL、もう試しておりますか !

は、はい(^^;
UserRPLと並行して比較しながらという感じでちょこちょことですけど、なかなか難解なところもありで元となったといわれるforth言語を調べたりとまさに温故知新モード突入です。

>当方、すっかり御無沙汰だったので、殆ど初心者状態です。一から出直し。

はるまき様のhp50Gを使い倒す。というwikiサイトが繋がらないのが残念ですけど、SysRPLに関してはakatuki様の以前の記事がかなり参考になってるのでとてもありがたいです(^^)


>それだけ「スリル」があると、ますます興味深いというか ... 。火遊びは慎重に、ですネ。

壊したかも?っていう「スリル」はもうめっちゃ分かります!
昔のマスクROM機だと簡単に壊れるはずがないという妙な自信がありましたけど、最近のflash採用機種のフリーズは冷や冷やものです(^^;


>という事は、2代目 ... ?

普通の使い方じゃなかったので仕方ないところあるのですけど…(汗)
禁断のオーバークロック実験中にCG10を2台飛ばしてしまった気配なので今はCG10は3代目だったりします(^^;
fx-9860GIIの方はリセット復活で粘ったのですが、CG10の方はいとも簡単にあっけなく…。


>実際の所、この辺りの挙動は良く判らんのです。
>今回は「たまたま」そこ(起動BIOS)が書き換わっていない暴走だったのか ... 。

通常運用時には起動BIOS領域は書き込みプロテクト保護されているはずなのでそうそう書き換わる可能性はないと思われるのですが、検索してたら中の基板の写真が載っているサイトがあったのでチップを見てみるとflashチップは一つしかないみたいで、そうするとBIOSからOSから全部1チップに載っているわけで、飛ぶか飛ばないか運しだいみたいなことに(^^;


>50gもPCで動くエミュレータがあるらしく、SysRPLではエミュレータで試験走行するのが確実らしいのですが、

たしかにエミュで試せるのならそっちで動作確認してからのほうが間違いなく安全ですね。
で、エミュ装備でSysRPLからASMまでいじれるらしいDebug4xをダウンロードしてみましたが、まだ使い方がよくわからず試行錯誤中です(^^;


>当方、本体でゴニョゴニョやるのが割合気に入ってしまって、無茶ばかりしております。

今のところは私もコネクトキットで簡単にPCと連携できるので本体で試してしまってます(^^;

で、akatuki様が暴走した上記のSysRPLですが試しに実行してみたところ、
一回目はソフトリセットになっただけ、
二回目は暴走、裏のハードリセットで復活しました。
三回目は……実行するのを止めました(^^;

とりあえずだいじょぶだったです(^^ゞ

akatuki さんのコメント...

Sentaro 様、こんばんは!

> は、はい(^^;
> UserRPLと並行して比較しながらという感じでちょこちょことですけど、なかなか難解なところもありで元となったといわれるforth言語を調べたりとまさに温故知新モード突入です。

> はるまき様のhp50Gを使い倒す。というwikiサイトが繋がらないのが残念ですけど、SysRPLに関してはakatuki様の以前の記事がかなり参考になってるのでとてもありがたいです(^^)

はるまき様のサイトは、かなり以前に閉めてしまわれたのですが、当方、諦めきれずにリンクを残しておる所でして ... 。
ちなみに、はるまき様のサイトでは、主にHPGCCとUserRPLの高度な使い方を紹介されておりました。
SysRPLの使い方については、kaak様からコメントを戴いておりましたが、不義理な事をしており、最近はコメントも戴いておりませんで。

> 壊したかも?っていう「スリル」はもうめっちゃ分かります!
> 昔のマスクROM機だと簡単に壊れるはずがないという妙な自信がありましたけど、最近のflash採用機種のフリーズは冷や冷やものです(^^;

それ、確かに !

> 普通の使い方じゃなかったので仕方ないところあるのですけど…(汗)
> 禁断のオーバークロック実験中にCG10を2台飛ばしてしまった気配なので今はCG10は3代目だったりします(^^;
> fx-9860GIIの方はリセット復活で粘ったのですが、CG10の方はいとも簡単にあっけなく…。

ヲイヲイ !
いや、そうした尊い犠牲の上にクロックアップの成果があったとは ... 。

> 通常運用時には起動BIOS領域は書き込みプロテクト保護されているはずなのでそうそう書き換わる可能性はないと思われるのですが、検索してたら中の基板の写真が載っているサイトがあったのでチップを見てみるとflashチップは一つしかないみたいで、そうするとBIOSからOSから全部1チップに載っているわけで、飛ぶか飛ばないか運しだいみたいなことに(^^;

コストを考えると、そうですよね。
最後は、フタを開けて、Flashメモリのピンへ直接書き込む、なんて事になるのかなぁ ... 。
こうなると、当方の様な素人には手に負えない。

> たしかにエミュで試せるのならそっちで動作確認してからのほうが間違いなく安全ですね。
> で、エミュ装備でSysRPLからASMまでいじれるらしいDebug4xをダウンロードしてみましたが、まだ使い方がよくわからず試行錯誤中です(^^;

いや、そこはなるべく早い時期に慣れておくのが宜しいかと。
使っていない当方が言うのも何ですが、開発の速度が違ってくると思います。

> 今のところは私もコネクトキットで簡単にPCと連携できるので本体で試してしまってます(^^;

ConnKitも便利ですが、SD cardもイイです。ただ、容量を選ぶ様な所がある(大きいのは難しい ?)ので、探すのに苦労しそう ?

> 一回目はソフトリセットになっただけ、
> 二回目は暴走、裏のハードリセットで復活しました。
> 三回目は……実行するのを止めました(^^;
> とりあえずだいじょぶだったです(^^ゞ

だから、オイタは止めなさいって ! (笑)

Sentaro さんのコメント...

akatuki様、こんばんは!

>はるまき様のサイトは、かなり以前に閉めてしまわれたのですが、当方、諦めきれずにリンクを残しておる所でして ... 。
>ちなみに、はるまき様のサイトでは、主にHPGCCとUserRPLの高度な使い方を紹介されておりました。

なんとももったいないというか惜しいというか…ぜひまた復活できれば復活して欲しいところです。

>SysRPLの使い方については、kaak様からコメントを戴いておりましたが、不義理な事をしており、最近はコメントも戴いておりませんで。

過去記事を拝見すると的確なコメントがすごく参考になりますね。
何か難題につまづいた時にはまた来てくださることを期待して…(^^)


>いや、そうした尊い犠牲の上にクロックアップの成果があったとは ... 。

パソコンではかなりオーバークロックしてもBIOSが壊れて起動しないとかは一度もなかったですけど、電卓はハード的にシンプルな分、無茶すれば壊れる時は一瞬ですね(^^;
せめて起動BIOSくらいは書き換わらない別チップで載せて欲しいですけど、Nspireはそのあたりはしっかりしていたようですね。(というかハッキング対策なんでしょうけど…)

>最後は、フタを開けて、Flashメモリのピンへ直接書き込む、なんて事になるのかなぁ ... 。

flashなので専用のライタがあれば楽に復活できそうですけど、それがない現状ではまた試行錯誤で何台か犠牲に…ってことに(^^;

>いや、そこはなるべく早い時期に慣れておくのが宜しいかと。

Division by zeroというわけのわからないエラーが出てちょい難儀してましたけど、なんとかエミュでの動作も出来るようになって無事使えるようになりました。
akatuki様のSysRPLは”Sierpinski Gaskets”が描画されないという以外はすんなり動作できまして、UserRPLも普通にいけるのでSaturnASMまでは本体無くてもなんとかなりそうです(^^)

で、ちょこっとオイタもしてみたら実機同様暴走しましたです(^^;


>ConnKitも便利ですが、SD cardもイイです。ただ、容量を選ぶ様な所がある(大きいのは難しい ?)ので、探すのに苦労しそう ?

ザウルスで使っていた1GBが使えました。
今後の機種ではSD機種は皆無になりそうなので貴重ですね(^^)

akatuki さんのコメント...

Sentaro 様、こんばんは!

> なんとももったいないというか惜しいというか…ぜひまた復活できれば復活して欲しいところです。
> 過去記事を拝見すると的確なコメントがすごく参考になりますね。
> 何か難題につまづいた時にはまた来てくださることを期待して…(^^)

仰る通りです。

> パソコンではかなりオーバークロックしてもBIOSが壊れて起動しないとかは一度もなかったですけど、電卓はハード的にシンプルな分、無茶すれば壊れる時は一瞬ですね(^^;

オーバークロッカー ! コレは ... 。

> せめて起動BIOSくらいは書き換わらない別チップで載せて欲しいですけど、Nspireはそのあたりはしっかりしていたようですね。(というかハッキング対策なんでしょうけど…)

Nspireのプロテクトって、オイタでFlashを飛ばしたユーザーが泣きついて来たから設置した、って事ですかネ !?
ウーム、コリャ耳が痛い ... 。
アドレスピンの辺りにASICとか噛ませて、特定のアドレス空間をRead onlyにするとか、なんてネ。
良う判らんです、ハイ。

> flashなので専用のライタがあれば楽に復活できそうですけど、それがない現状ではまた試行錯誤で何台か犠牲に…ってことに(^^;

コレはクルシイ ... 。
そういう危機回避をするためには、エミュレータの活用しかありまへんなぁ。

> Division by zeroというわけのわからないエラーが出てちょい難儀してましたけど、なんとかエミュでの動作も出来るようになって無事使えるようになりました。
> akatuki様のSysRPLは”Sierpinski Gaskets”が描画されないという以外はすんなり動作できまして、UserRPLも普通にいけるのでSaturnASMまでは本体無くてもなんとかなりそうです(^^)

ありゃ、Sierpinski Gaskets はダメでしたか。ウーン。

> で、ちょこっとオイタもしてみたら実機同様暴走しましたです(^^;

エミュレータなら「...の日も安心」って、オイ、ソレは違う !
まあ、それはネタですが、エミュレータなら取り敢えずは安心ですネ。

> ザウルスで使っていた1GBが使えました。

おお、それは良かった !

> 今後の機種ではSD機種は皆無になりそうなので貴重ですね(^^)

CASIOはこれからSDカードを積極採用する方向だとすると、HP,TIも、この動向は意識するのだと思います。
すると、コストカットのため、SD cardよりはmicro SDカードとかがありそう ?

その前に、高機能電卓自体がどうなるのか、難しいのかも知れませんが ... 。

kaak さんのコメント...

ご無沙汰しております。

SysRPL の記事を久しぶりに読みましたので、うれしくなりコメントいたします。

最近はこちらのブログを読むだけでコメントをしていませんでしたので、
不義理をしているのはこちらです…

今は SysRPL のプログラミングからは遠ざかっていますが、
何年か前まではかなり熱心でした。

現在もHP50g は頻繁に使いますが、
SysPRL でやりたいことは、プログラミングして、ライブラリにしてしまったので、
今はもうほとんど忘れてしまっています。
(自作のライブラリは頻繁に使います。)

今回の暴走の件ですが、
背面のリセットスイッチは効かなかったのでしょうか?

SysRPL は、やはりエミュレータ (debug4x) の使用をお勧めします。
プログラミングをしていた当時、エミュレータは毎日のように暴走していました。
SysRPL では、スタックに必要な変数がそろっていない状態でコマンドを実行すると、すぐに暴走します。
エミュレータでは、1ステップごとに実行でき、スタックも確認できるので、
そのようなバグも簡単に修正できます。

エミュレータは、はじめは面倒かもしれませんが、使い方が一度わかれば手放せなくなると思います。
SysRPLの楽しさは、エミュレータで開発しても十分味わえると思います。

Sentaro さんのコメント...

kaak様、はじめまして!

ここのところ、こちらにお邪魔しまくりで、ほんのこの前にHP-50GユーザーになりましたRPL超初心者のSentaroと申します。
よろしくお願いいたします。

HP-50Gの情報を探索する中で、こちらでkaak様の書き込みを拝見させていただいてまして、とても参考になりました。
どうもありがとうございます(^^)

ずっとRPLじゃない電卓に慣れきってたのでHP-50Gの電卓機能もまだほとんど使いこなせてない状況ですけど、UserRPLも序の口の状態でSysRPLにも手を出してしまい、RPLの迷宮でたびたび暴走しつつもDebug4xはなんとか使えるようになりまして、エミュのありがたさを実感する毎日です(^^)

akatuki さんのコメント...

kaak 様、遅れてしまいました。
こちらこそ不義理をしておりまして、申し訳ない。

> 最近はこちらのブログを読むだけでコメントをしていませんでしたので、

あっ、これは有り難う御座居ます !

> 今は SysRPL のプログラミングからは遠ざかっていますが、
> 何年か前まではかなり熱心でした。

当方、入門文書みたいなものをアップした以降、しばらくやっていなかったので、再び初心者に逆戻りでして。
最近は、Sentaro様が熱心になっておられるので、つられて勉強している様な有様です。
少しずつ勉強を進めて、面白味を取り戻しつつ、タラタラと進めて居ります。

> 現在もHP50g は頻繁に使いますが、
> SysPRL でやりたいことは、プログラミングして、ライブラリにしてしまったので、
> 今はもうほとんど忘れてしまっています。
> (自作のライブラリは頻繁に使います。)

ウーン。やはり電卓って、計算の道具でしたね。実用に供するライブラリ、ツールを充実させ、それで計算の効率化を図るのが、まっとうな使い方でした。
当方、単立の、目的特化プログラムをぶん回す様な事ばかりで、ときたま暴走させてメモリクリア ... 。
電卓でこちゃこちゃやるのが面白いので、暫くはこんな事を続けそうです。面白い、ユニバーサルなツールでも作れたら、とは思うのですが。

> 今回の暴走の件ですが、
> 背面のリセットスイッチは効かなかったのでしょうか?

そうなんですよ。
[ON]+[F3], [ON]+[F1]+[F6] がアカンので、リセット穴も使ってみたのですが、それでもバナーが出てこないで、白黒画面のままで停止するという、お粗末でして。
今回、取り敢えず復旧出来たのは、それこそ偶然、奇跡だった様です。IPLまで壊していなかった ? のかと。

> SysRPL は、やはりエミュレータ (debug4x) の使用をお勧めします。
> プログラミングをしていた当時、エミュレータは毎日のように暴走していました。
> SysRPL では、スタックに必要な変数がそろっていない状態でコマンドを実行すると、すぐに暴走します。
> エミュレータでは、1ステップごとに実行でき、スタックも確認できるので、
> そのようなバグも簡単に修正できます。

やはり、そうですよね ... 。
これに懲りて使用を検討しているのですが、Windows OS状況も変化がありそうで、ちょっと手が出し辛い様な所もあります。
当方、最近では英語文書を読むのも億劫になってしまって ... コレはアカンですね !

> エミュレータは、はじめは面倒かもしれませんが、使い方が一度わかれば手放せなくなると思います。
> SysRPLの楽しさは、エミュレータで開発しても十分味わえると思います。

当方、SysRPLについては、まだまだ若輩者で。最近になってDOS用のアセンブラがあると知ったくらいですから、こうしたものの活用を本格的に行うのがプログラミング技能の習得は確実なのか、などと思っております。

hpcalc.orgに、logスケールのグラフを描図されるユーティリティがありました。ああいったツールとかを作れたらいいのですが、発想の貧困さと技能の少なさから、なかなか面白いものが思い浮かびません。もっと精進せなアカンです。ハンセイ。

kaak さんのコメント...

返信が遅くなりました.

Sentaro様
SysRPL が使えるようになれば、UserRPL は、ほとんどいらないと思います。
UserRPLのコマンドはSysRPLからも使えますし。
(UserRPLのコマンドの最初に x をつければSysRPLから使えます.
例えば、SIN は xSIN とすると SysRPL で使えます。)

akatuki様
logスケールのライブラリは、多分私が作ったものだと思います。
(私が作ったもの以外にもあったかもしれません。)
あのライブラリはSysRPLで書かれていますが、重要な部分がUserRPLのコマンドを使っているので、実行速度が遅いのが残念でした。
ただこれ以上速くするにはアセンブラ(ML)を勉強しなくてはならず、
これはかなり難しそうなのであきらめました。

このライブラリを作ったころ、hp50gについて比較的活発に話している日本の掲示板があって
(現在はありません。どこだかも忘れてしまいました)、
そこでlogスケールのグラフを描きたいという投稿があり、
はじめは単に exp や log で関数を変換すればできるという話をしていたのですが、
対数目盛にしたい、トレースで関数の値(expやlogで変換していない値)の表示もしたい、
という話になって、私自身もそれがあったら便利だと思い、ライブラリを作成しました。
私の発想というより、掲示板での何人かの発想や要求がもとになっています。

akatuki様のブログとこのコメント欄は hp電卓の貴重な情報源となっています。
ここでのお話やコメントから、また新しいライブラリが作れたらいいなと思っております。

akatuki さんのコメント...

kaak 様、コメント多謝です !

> logスケールのライブラリは、多分私が作ったものだと思います。
> (私が作ったもの以外にもあったかもしれません。)

やはり、そうでしたか !

> あのライブラリはSysRPLで書かれていますが、重要な部分がUserRPLのコマンドを使っているので、実行速度が遅いのが残念でした。
> ただこれ以上速くするにはアセンブラ(ML)を勉強しなくてはならず、
> これはかなり難しそうなのであきらめました。

ウーム。
確かにSaturnに限らずアセンブリは面倒です。増して、UserRPLのコマンド代替をアセンブリでやるとなると、これは相当面倒です。

> このライブラリを作ったころ、hp50gについて比較的活発に話している日本の掲示板があって
> (現在はありません。どこだかも忘れてしまいました)、

惜しいなァ。
でも、それだけHP50Gが普及していなかったのか、と思うと、残念でもあります。

> そこでlogスケールのグラフを描きたいという投稿があり、
> はじめは単に exp や log で関数を変換すればできるという話をしていたのですが、
> 対数目盛にしたい、トレースで関数の値(expやlogで変換していない値)の表示もしたい、
> という話になって、私自身もそれがあったら便利だと思い、ライブラリを作成しました。
> 私の発想というより、掲示板での何人かの発想や要求がもとになっています。

なるほど、そういう事でしたか。
こういう欲求なりがあって、との事ですが、一方、kaak様のコードスキルがなければ、実際のモノは世に出なかったわけです。
お疲れ様です!

> akatuki様のブログとこのコメント欄は hp電卓の貴重な情報源となっています。
> ここでのお話やコメントから、また新しいライブラリが作れたらいいなと思っております。

恐れ入ります。
当方も、何か面白そうな話題がないのか、日夜、脂汗を流しながらネタを探しております !
なかなか面白そうな話題がありませんが、長い目で見て戴き度 !

Sentaro さんのコメント...

kaak様、こんにちは!

>(UserRPLのコマンドの最初に x をつければSysRPLから使えます.
>例えば、SIN は xSIN とすると SysRPL で使えます。)

85番フラグでSysRPLっぽいのが見えた最初の頃はいまいち分からなかったですけど、最近やっと仕組みが分かってきました(^^)

ちょこちょこいじくるにはUserRPLが簡単ですけど、やはり速度面や自由度の魅力で今のところはほとんどSysRPLばかりいじくってるという状況ですね。
まだまだ使いこなすレベルには程遠いですけどSysRPLは面白いです。


>logスケールのライブラリは、多分私が作ったものだと思います。

hpcalc見させていただきました。他にもいくつか発見しましたけどすごいですね。
海外のサイトで日本の方のプログラムに遭遇できることがすごく嬉しく思います(^^)
一日も早くkaak様のようにライブラリ作成ができるところまでいきたいです。


http://akatuki-724.blogspot.jp/2014/05/hp-prime.html
購入以来、こちらのエントリ「HP Primeで円周率を計算してみたよ」の後半、(200コメント以上でページ分割になってます(^^;)
円周率プログラムをドタバタしながらもUserRPLからSysRPLまで移植したりしてますけど、今はどれだけ高速化できるかの最適化でちょっと煮詰まっているところです(^^;

配列アクセスで一番速いのはやはりスタックに展開してアクセスするのが一番でしょうかね?

kaak さんのコメント...

Sentaro様

SysRPL の最大の利点はやはり高速化ですね。
単に SysRPL に移植するだけで、びっくりするぐらい速くなることがあります。
ただ、場合によってはあまり変わらないこともあります。

> 配列アクセスで一番速いのはやはりスタックに展開してアクセスするのが一番でしょうかね?

配列に関しては、通常はスタックに全部展開してアクセスするのが速いとされています。
comp.sys.hp48 のニュースグループなどでもそのように書かれていたと思います。

ただ、hp50g で実際に作ってみると
Array や Matrix や List (composit object) のほうが速いこともあります。
私は、Array や Matrix で作ったほうがわかりやすいので、
Array や Matrix を使うことがほとんどです。

昔に試した結果では、
どのような場合にスタックとarrayのどちらが速くなるか、ということはわかりませんでした。

配列の要素に関しては,ZINTより、BINTやReal numberの計算が速くなります。

スタックを使って複数の配列を扱う場合には、バーチャルスタックというものがあって、
スタックをまるごと高速に切り替えて使うことができます。

以前、バーチャルスタックを使ってプログラムしたこともありましたが、
速度は結局 Array とあまり変わらないこともありました。

いろいろな方法を試してみるのもプログラムの面白さだと思います。

akatuki さんのコメント...

kaak 様、コメント有難う御座居ます。

まだまだ不勉強なもので、なかなかついて行けそうにありませんが、手隙の折にでも色々とやってみたくなりました。

「配列アクセスが早い場合がある」のは、スタックなどの(リストによる)データアクセスよりも、配列要素の算術的データアクセスの方が速度が稼げる、という理解をしているのですが、この辺りは実際にコードを作ってみないと理解が進まないのかも知れません。

> いろいろな方法を試してみるのもプログラムの面白さだと思います。

御意 !

Sentaro さんのコメント...

kaak様、こんにちは!

>SysRPL の最大の利点はやはり高速化ですね。

はい!
最初はUserRPLがインタプリタでSysRPLはコンパイルするから速くなる感じと思っていたのですが、そうではなくて、冗長なチェックや無駄な処理を省いて最適化する手段がSysRPLなのですよね。オイタすると簡単に暴走するのも含めてそこのあたりがだんだんとツボにはまってきました。


>配列に関しては、通常はスタックに全部展開してアクセスするのが速いとされています。
>comp.sys.hp48 のニュースグループなどでもそのように書かれていたと思います。

やはり、そうでしたか。
最初は配列をどう扱うのかがわからなかったので、スタックに展開してという方法でやってたのですが、結果的にはそれは一番速い方法だったってことですね。
スタック上の配列アクセスはPICKとUNPICKを使うのが一番早そうですけど、
SysRPLでUNPICKが使えなかったのでちょっとはまりました(^^;
でも、非公式には存在したので、これをどうやって実行させるかどうかでしばらく悩んで、kaak様のコメントで見てたPTRコマンドを使うとわかったら実機でPTR 373D0 で無事動作することができました。
Debug4Xでは最後にアンダーバーが付くのが非公式コマンドなんですよね。
これも気が付くのにしばらくかかってしまいましたけど、
Debug4xで作業していると実機との記述の違いがちょっと気になってきたりしてます。
このエントリでのキャレット付きコマンドのFPTR2→FLASHPTRもそうですけど、、
名前無しローカル変数の宣言順が逆になっていたりとか、
ソースコードが実機用とDebug4x用に分かれてしまうのがちょっと惜しいですね。


>ただ、hp50g で実際に作ってみると
>Array や Matrix や List (composit object) のほうが速いこともあります。
>私は、Array や Matrix で作ったほうがわかりやすいので、
>Array や Matrix を使うことがほとんどです。

ArrayやMatrixの方が配列らしくアクセスできるので速そうな感じはありますよね。
ちょこっと試した限りではスタック上でのPICK/UNPICKアクセスとはあまり差が出なかった感じですけど、まだ詰めが甘いのでさらに深く試してみます。


>配列の要素に関しては,ZINTより、BINTやReal numberの計算が速くなります。

なるほどです。これは直感的に理解できました。
配列での多桁演算はほぼ限界っぽいので、配列使わないでZINTで四則演算できないものかと今のところ思案中です。


>スタックを使って複数の配列を扱う場合には、バーチャルスタックというものがあって、
>スタックをまるごと高速に切り替えて使うことができます。

これはまだ踏み込めていない領域ですけど、SysRPLの世界は本当に深いですね。
すごく参考になります。ありがとうございます。


>いろいろな方法を試してみるのもプログラムの面白さだと思います。

内部まで触らせてくれない電卓が当たり前になりつつある状況の中、標準搭載言語でここまで内部に踏み込める電卓はなかなかないですね。
ひとつの問題を解決するための方法が幾通りもあるというのも大変ですけど、新たな手段を覚えて最適化すればそれが結果に出てくるのがやっぱりすごく面白いと思うところです(^^)