e-Gadget - プログラム関数電卓 fx-9860GII への移植 - ピタゴラス数

fx-9860GII への移植 - ピタゴラス数

2014年12月06日
2014/12/07: fx-9860GII オーバークロックでのテストを追加
2014年12月14日: 配列変数の代わりには行列が良い点を追記

fx-9860GII を入手したので、さっそくピタゴラス数探索プログラムを fx-5800P から移植してみました。
 ⇒ fx-5800P でピタゴラス数

このプログラムについて、fx-5800P のプログラムとの違いは、以下を考慮すれば良いだけの筈です。

・キーコード: Getkey が返す値が 全く異なる
・Locate コマンドの引数: 画面が 21 x 7 と広い

ところで、キーコードを調べるプログラム GET KEYCODE (プログラムライブラリ - キーコード取得 参照) は、そのまま100% 互換で移植できます。fx-9860GII はプログラム名を8文字以内で指定しなければならないので、fx-9860GII のプログラム名を KEYCODE としました。
 ⇒ プログラムライブラリ - キーコード取得

具体的な比較は上記参照。これでキーコードを調べると、[EXE] キーは 31、[(-)] キーは 41 でした。


さて、fx-5800P用のピタゴラス数探索プログラムで、キーコードのみを変更してfx-9860GII で走らせてみると、画面の1行目に

- Disp -

と表示されてしまい、1行目の表示に上書きされていまうことが分かったので、Locate の引数を変更して、表示全体を1行下にずらすようにしました。

表示行を1行下にずらした - ステップモード

9860_Pytha1 


表示を1行下にずらした - 連続モード

9860_Pytha2 


fx-9860GIIピタゴラス数探索プログラム: PYTHA
3→M:1→N:1→D:1→D:1→E     (初期化処理)
Locate 1,3,"A="            
(初期画面表示)
Locate 1,4,"B="
Locate 1,5,"C="

Lbl 0

E=0⇒Locate 14,2,"(-):Stop"
(M2-N2)÷2→A             
(ピタゴラス数の計算)
MN→B
(M2+N2)÷2→C

Locate 1,1,D              (見つかった回数の表示)
Locate 3,2,"          "    (スペース19個)
Locate 3,2,A              
(ピタゴラス数の表示)
Locate 3,3,"          "    (スペース19個)
Locate 3,3,B              (ピタゴラス数の表示)
Locate 3,4,"          "    (スペース19個)
Locate 3,4,C              (ピタゴラス数の表示)

Getkey=41⇒1→E
0→K
While Getkey=31
Isz K:K=20⇒Break
WhileEnd:K=20⇒0→E

Locate 14,2,"EXE:Next"◢    
(操作法表示&プログラム一時停止)

Do                     
(次の M と N を探す)
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0
Isz D                    
(見つかった回数を1つ増やす)

Goto 0



fx-9860GII は fx-5800P よりもかなり動作が速いようで、[EXE] キー長押しの時間を長く設定しないと長押しにならないことから、fx-5800P で長押し時間のカウンタ 7 だったのを、20 に変更しました。

ピタゴラス数100個を探索する時間を比較してみると

・ fx-5800P:                 40秒
・ fx-9860GII (ノーマル 29MHz):       18秒
・ fx-9860GII (オーバークロック 236MHz):  4秒  [2014/12/07 追記]

と、sentaro様のご報告と同様に、fx-9860GII (ノーマル) は約2倍の速さでした。

[2014/12/07 追記]
ちなみに、sentaro様作アドイン Ftune 2 によるオーバークロックで 約236MHz にすると、上記の通り fx-5800P の10倍の速度となりました。

Ftune 2 は、
こちら
このアドインを起動後、メモリーチェックを行い、F5 キーで上記設定ができました。

なお、オーバークロックに合わせて、長押し検出のカウンタは 150 にしています(そうでないと速すぎてステップモードに切り替えが難しい)。



実際見た目も速くなっています。

ノーマル (29MHz)




オーバークロック (236MHz)



これは、凄い速さですね!



fx-9860GII は、並行輸入品 (¥9,000) なので、添付している紙のマニュアル類に日本語はありません。ところが、添付CDに、日本語のマニュアルがありました。プログラミングについては、fx-5800P と同様に殆ど役に立たない、最低限の内容しか記載がありません。

そこで、開封し、電池を入れて、マニュアルなしでいきなり キーコード取得プログラムを入力してみました。
たった20行のプログラムですが、コマンドをどこから選んで良いのか、最初はサッパリ分からず、結構な時間をかけて入力完了!
これで、大雑把に、どこにどのコマンドがあるのかが分かりました。

このプログラムは、手直し無しで正常動作しました。fx-5800P から fx-9860GII への互換性がかなり高いことが証明されました。

次にピタゴラス数探索プログラムの入力は、かなり楽になりましたが、ここで - Disp - 表示という思わぬ罠がありました。
この表示は、出力命令 ◢ を使うと、現れるようです。

例えば、1行だけのプログラム

Locate 1,1 "1ST LINE"

を実行すると、1行目の左端から、

1ST LINE

と表示されますが、出力命令 ◢ を使って、

Locate 1,1,"1ST LINE"◢

として、実行してみると、1行目の右端に

- Disp -

と表示され、1ST LINE が表示されません。

- Disp - が表示されるとき、その行全体を左端から上書きして表示されているために、1ST LINE が消えているようです。

次に、

""
""
""
""
""
""
Locate 1,1,"1ST LINE"◢


を実行してみると、"" で内部カーソルが6回改行され、7行目に - Disp - が表示されるので、1行目の 1ST LINE は上書きされずに、きちんと表示されます。

このことから、- Disp - は現在の内部カーソルの位置を示していると思われます。

Locate 1,1,"1ST LINE"◢

が正常に表示されない問題を避ける方法がないものか、もう少し調べて見ようと思います。


他にも、色々と触っていて気付いたのですが、fx-9860GII には配列変数がありません。その代わりに List コマンドを使うしかないのかなぁ、と思いますが、その処理速度がどの程度か、いずれ調べてみようと思います。

[2014年12月13日 追記]
fx-9860GII (ノーマルクロック: 約29MHz) でリストと行列のアクセス速度を測定したところ、行列の方が速いことが分かりました。速度と汎用性を考えると、fx-5800P の配列変数の代わりに fx-9860GII で行列を使うのが正解です。

処理内容処理時間 (ミリ秒)
リスト読み出し13.2
リスト書き込み17.6
行列読み出し10.7
行列書き込み12.0
※ 測定はココ の方法に準じて実施。但しループ回数は2000回とした。


fx-9860GII は標準で 29MHz程度。クロックが8倍速くなっているのに、表示まで含めた速度は4.5倍程度にとどまっている、という上記の結果から、表示(描画)速度がかなり遅くて、これが全体の速度を決めてしまう(律速)ことになっているようです。

fx-5800P が14MHzも無いとするならば、fx-5800P の描画速度がfx-9860GII に比べて速いと言えます。




fx-9860GII 用ピタゴラス数探索プログラム: PYTHA

※ fx-9860GII へ転送して使える プログラムファイル pytha.g1m のダウンロード

fx-9860GII PYTHA_src 
 ※ 13行目、15行目、17行目の Locateコマンドの空白はスペース19個




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ



keywords: プログラム関数電卓、fx-5800P、fx-9860GII、キー長押し、CasioBasic、 ピタゴラス数

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

No title

管理人様、こんにちは!

出張、おつかれさまです。

>Casio Basicで遊ぶ最大の利点は、車中でできることですね。

電卓本体だけであれこれできるというのはやっぱりいいですよね(^^)


>Casiopea でしたか...全くチェックしておりませんでした。sentaro様の情報収集能力はすばらしいですね。

いえいえ、ちょい昔に偶然に見つけたものですけど、かなり初期の頃から存在していた有名な解析文書のようですね。


>fxSeverse Project Documentation とは、全く凄いものがありますね!

全部独自調査だと思われるのに質、量ともに本当にすごいです。


>Bkey_GetKeyWait の宰1引数 code1 と 第2引数 code2 は、Casio Basic のGetkey で得られるコードとしっかり相関性があるのに気がつきました。

うわ、これは全然気が付いてませんでした。さすが管理人様です!(^^)

早速にうちのfx-9860GIIにも入れときました。


>オーバークロック対策で、プログラム起動時の [EXE] キーを拾わず

速いがゆえの弊害が出てしまうのですよね(^^;

Re: RTC_GetTicksは…

sentaro様

コメント、ありがとうございます。


ただいま、出張へ向かうバスの中

Casio Basicで遊ぶ最大の利点は、車中でできることですね。
最近は、電車に乗るとついつい寝てしまいますが...


> RTC_GetTicksは1/128秒カウンタですけどSDKではサポートされてなかった隠れSYSCALLで元から内蔵されている機能みたいです。
> こちらからダウンロードできるドキュメントに隠れSYSCALLやその他の細かい内部情報が記されています。
> http://www.casiopeia.net/forum/downloads.php?view=detail&df_id=72

Casiopea でしたか...全くチェックしておりませんでした。sentaro様の情報収集能力はすばらしいですね。
fxSeverse Project Documentation とは、全く凄いものがありますね!

早速このpdfをスマホに入れて、眺めています。

> https://edu.casio.com/
> からダウンロードできる
>
> fx-9860G_SDK_Announcement.pdf

あ"、そうでした。これ斜め読みして忘れていました。
そそっかしい、私の性格が見事にでています(/_;)

Bkey_GetKeyWait の宰1引数 code1 と 第2引数 code2 は、Casio Basic のGetkey で得られるコードとしっかり相関性があるのに気がつきました。

Casio Basic の Getkey の2桁の戻り値の10の位が code1 で、1の位かに1を足したものが code2 になっています。

なので、いちいちドキュメント見ないですむように、fx-9860GII専用 Get Keycode プログラムを Casio Basic で作っておきました。

こんな感じです...

"KEYCODE (FX-9860GII)"
Locate 1,3,"CODE1= CODE2="
Locate 1,4,"CODE1=1 CODE2=1 [AC]"
Locate 10,6,"HIT ANY KEY"
Locate 13,7,"[AC]:QUIT"
While Getkey:WhileEnd
Lbl 0
Do:Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = "
Locate 11,1,K
Locate 7,3,Int(K÷10)
Locate 15,3," "
Locate 15,3,K-10Int(K÷10)+1
Goto 0

オーバークロック対策で、プログラム起動時の [EXE] キーを拾わず、プログラムタイトル"KEYCODE (FX-9860GII)"をきっちりと表示させたい(せっかく fx-9860GII専用なので...)ので、

While Getkey:WhileEnd

で、キーアップ検知の関所を入れてみました(^^;)

RTC_GetTicksは…

管理人様、こんにちは!

シンプルイズベストなアドインですけどお役に立てたみたいでよかったです(^^)

>私の、fx-9860GII (SH-4A)での結果は、
>・29MHz:bench 3.180s、bench2 4.322s
>・236MHz:bench 0.624s、bench2 0.543s
>・295MHz:bench 0.499s、bench2 0.435s
>となりました。

表示無しのbench2ではクロック比どおりに速くなってますね(^^)
小さなプログラムだと32KBの内部キャッシュにすべて収まるのでオーバークロックパフォーマンスが最大限発揮できます。


>ところで、RTC_GetTicks はsentaro様の自作ですか?

RTC_GetTicksは1/128秒カウンタですけどSDKではサポートされてなかった隠れSYSCALLで元から内蔵されている機能みたいです。

ですので、アセンブラソースはそれを呼び出しているだけのものですね(^^;
これはSH3でもSH4Aでどちらでも互換ありますが、SH4Aだけ専用となればさらに32,768KHzカウンタも存在してましてFtune2ではそれを使ってます。
こちらからダウンロードできるドキュメントに隠れSYSCALLやその他の細かい内部情報が記されています。
http://www.casiopeia.net/forum/downloads.php?view=detail&df_id=72


>これ、色々と使わせて頂きます。ベンチマーク以外にも使いでが豊富にありそうです。

お、ベンチマーク以外、というといろいろと期待しちゃいます(^^ゞ



>Bkey_GetKeyWait() は、fxlib.h、stdio.hやstdlib.h では見つからず、他にもさっと見てみましたが、どこにもなく...

https://edu.casio.com/
からダウンロードできる

fx-9860G_SDK_Announcement.pdf

にSH4A機ではBkey_GetKeyWait()を使うようにとありましたのでそのサンプルの通りに使ってみました。
New Functionとありますけど、最初からあったわけですね(^^;
デフォルトのヘッダファイルだけで普通に使えるみたいです。


>それからお陰様でアドイン・アイコンの作り方が分かりました。

MainIcon.bmpを書き換えるか、同じフォーマットのBMPファイルを用意すればOkみたいですね(^^)

RTC_GetTicks

sentaro様

おお、C版移植コード、ありがとうございます。早速遊ばせて頂きました。

私の、fx-9860GII (SH-4A)での結果は、

・29MHz:bench 3.180s、bench2 4.322s
・236MHz:bench 0.624s、bench2 0.543s
・295MHz:bench 0.499s、bench2 0.435s

となりました。

ところで、RTC_GetTicks はsentaro様の自作ですか?
これ、色々と使わせて頂きます。ベンチマーク以外にも使いでが豊富にありそうです。


実は、キーコード取得関連で悩んでいたので、実にタイムリーなサンプルソースです。

Bkey_GetKeyWait() は、fxlib.h、stdio.hやstdlib.h では見つからず、他にもさっと見てみましたが、どこにもなく...

リファレンスの在処はどこでしょう?


それからお陰様でアドイン・アイコンの作り方が分かりました。

勉強になります。ありがとうございます。

アドイン版、移植してみました。

1000個までの表示ありベンチマークと1000000個までの表示無しベンチマークを追加してます。

オーバークロックに対応するために、[EXE]長押しで連続探索は、[+]キーを押すことに変更しました。

たいしたソースではないですけど、fx-9860GIIのプログラム上での時間計測のサンプルになるかと思います。

SDKのエミュレータでそのまま動きます(^^)

http://pm.matrix.jp/pytha.zip


---1000個までの表示ありベンチマーク---
エミュレータでの実行結果       2.141s
fx-9860G SH3 29MHzでの実行結果  4.427s
fx-9860G SH3 118MHzでの実行結果  3.100s

fx-9860GII SH4A 29MHzでの実行結果  3.179s
fx-9860GII SH4A 236MHzでの実行結果  0.624s


---1000000個までの表示無しベンチマーク---
エミュレータでの実行結果       4.627s
fx-9860G SH3 29MHzでの実行結果  6.592s
fx-9860G SH3 118MHzでの実行結果  2.114s

fx-9860GII SH4A 29MHzでの実行結果  4.324s
fx-9860GII SH4A 236MHzでの実行結果  0.543s


アドインになるとSH4A版は本領発揮できますね。
エミュレータはノーウエイトマシンなので速いですが、それよりも速いのはSH4A版のfx-9860GIIだけです(^^;

アドイン削除できました

sentaro様

なにせ、開封して、マニュアルも読まず適当に触っていたのがいけません。

じっくりとマニュアルを読めば、アドイン削除方法が書いてありました。

メモリマネージャから無事、自作バグ入りアドインの削除ができました。

お騒がせ致しました。

ちょっと教えて頂けませんか?

sentaro様


> fx-5800Pから10倍速、いいですね~(^^)
> 動画でみると一目瞭然というか、CasioBasicでもこれだけ速度あればCの出番はあまりないかもしれませんね。

はい、Cの作りかけを放置しちゃっています。


> ま、速度はすぐに慣れちゃうので普段はノーマルで使っていざというときにオーバークロックするのが速さを実感できてよいです(笑)

そうですね、電池がもったいないので、ノーマルにしています。


> >クロック費は約8倍なのに、表示を含めた速度は4.5倍程度と言う結果です。
>
> 表示速度はメモリの速度が一番影響大きいですから、バス速度は4倍速アップなのでそのあたりに落ち着いてしまうみたいです。

なるほど、バス速度が表示に最も影響...ですか。


> 以前のSH3のfx-9860GとCG10でもちょこっと計測してみました。
>
> SH3 OS1.05 19秒  (オーバークロック118MHz 9秒)
> SH3 OS2.04 20秒  (オーバークロック118MHz 9秒)
> CG10 OS2.00 37秒  (オーバークロック236MHz 11秒)
>
> SH3機はメモリバス速度は変えられないのでOSのバージョンが違っても画面表示速度がやはり律速になりますね。
> そして、画面表示が絡むとSH4機より遅いです。
> SH4機は画面表示が速くなった分、内部速度を落として従来機との速度バランスをとってるような感じです。
>
> CG10はfx-5800Pと大差ないですし、オーバークロックしてもSH4のfx-9860GIIには全然及ばないです。
> 。

fx-CG10/20 は以外なところに落とし穴があるんですね。


> >...と言うことで、オーバークロックおよびその結果について、本文に追記させてもらいました。
>
> オーバークロックのfx-9860GIIも速いですけど、管理人様の更新の速さもオーバークロック級ですね(笑)


ぷぷ、そうですか...


ところで、1つご教示頂きたいのですが、作りかけのCのアドインが、デバッグと言う名前のアドインになって、本体にあります。デバッグが2つある状態なんです。

このアドインを、本体から消去したいのですが、どーもやり方が見つからないのです。

リンクソフト上では、メニューのDelete がグレイアウトされていて使えず...

お助けいただけませんか?


No title

管理人様、こんにちは!

>面白そうなので、さっそく Ftune 2 を使ってみました。

ぉお!早速にありがとうございます!

fx-5800Pから10倍速、いいですね~(^^)
動画でみると一目瞭然というか、CasioBasicでもこれだけ速度あればCの出番はあまりないかもしれませんね。
ま、速度はすぐに慣れちゃうので普段はノーマルで使っていざというときにオーバークロックするのが速さを実感できてよいです(笑)


>クロック費は約8倍なのに、表示を含めた速度は4.5倍程度と言う結果です。

表示速度はメモリの速度が一番影響大きいですから、バス速度は4倍速アップなのでそのあたりに落ち着いてしまうみたいです。

以前のSH3のfx-9860GとCG10でもちょこっと計測してみました。

SH3 OS1.05 19秒  (オーバークロック118MHz 9秒)
SH3 OS2.04 20秒  (オーバークロック118MHz 9秒)
CG10 OS2.00 37秒  (オーバークロック236MHz 11秒)

SH3機はメモリバス速度は変えられないのでOSのバージョンが違っても画面表示速度がやはり律速になりますね。
そして、画面表示が絡むとSH4機より遅いです。
SH4機は画面表示が速くなった分、内部速度を落として従来機との速度バランスをとってるような感じです。

CG10はfx-5800Pと大差ないですし、オーバークロックしてもSH4のfx-9860GIIには全然及ばないです。



>...と言うことで、オーバークロックおよびその結果について、本文に追記させてもらいました。

オーバークロックのfx-9860GIIも速いですけど、管理人様の更新の速さもオーバークロック級ですね(笑)

楽ちんな Casio Basic でいいかも

sentaro様

コメントありがとうございます。

Casio Basic は分かりやすいので、結構深く突っ込み可能ですね。
Cに比べて100万倍楽チンです。

面白そうなので、さっそく Ftune 2 を使ってみました。

ピタゴラス数100個探索時間は、
・ノーマルクロック (29MHz): 18秒
・オーバークロック(236MHz): 4秒

と言うことになりました。クロック費は約8倍なのに、表示を含めた速度は4.5倍程度と言う結果です。

おっしゃるように、表示速度がかなり律速になっていることを裏付けていますね。

以前からカシオ機は、描画が遅いと言う話は、、色々なところで聞いていましたが、やはりその通りなんだと改めて思いました。

...と言うことで、オーバークロックおよびその結果について、本文に追記させてもらいました。

No title

管理人様、こんにちは!

届いたその日から早くもfx-9860GIIへの移植記事!!さすが管理人様です!(^^)

世界を見渡してもfx-5800Pとfx-9860GIIの比較記事というのはたぶんどこにもないと思いますし、fx-5800Pを持っていてfx-9860GIIを買おうと思案してる方がいたらすごい参考になる移植記事ですね(^^)


>このことから、- Disp - は現在の内部カーソルの位置を示していると思われます。

一日目でここまで掘り下げられてるのはさすがです!
まさに、
”取扱説明書では絶対にわからない Casio Basic の使いこなし”
ですよね(^^)

fx-9860GIIの最新CasioBasicも管理人様の手にかかるとあっという間に丸裸にされちゃいそうですね(笑)


>その代わりに List コマンドを使うしかないのかなぁ、と思いますが、その処理速度がどの程度か、いずれ調べてみようと思います。

私もこれは最初に悩んだ箇所でした。
グラフ電卓のCasioBasicでは配列はListかMatでという形になるのですけど、N-queen速度ベンチマークではMatが使われているようにMatの方がListより若干速いですが大差はない感じです。


>単純計算すると、fx-5800P は 14MHz 程度になるのでしょうか?

表示が絡むとそのまま額面どおりにはいかないところも出てくるのですけど、逆に表示込みで考えるとfx-5800P大健闘といえるところですね。

fx-9860GIIのクロックはノーマルで29MHzで間違いないですけど、fx-5800Pのクロックは内部が完全ブラックボックスなので世代の近い電卓の速度から想像するしかないですが、一世代前のfx-4800Pが3.45MHzなので、2~4MHz程のクロックではないかと思われます。
そこからするとfx-9860GIIは10倍速くて当然といえるところで、実際に初期のfx-9860Gは10倍速かったです。
現在のOSにバージョンアップして半分くらい遅くなってさらにSH4版ではそのまた最悪半分になるという、
fx-9860GのOSバージョン&本体CPUの違いによる速度差についてはこちらにちょこっとベンチマークでっちあげました(^^;
http://pm.matrix.jp/ftune2.html
デフォルトでは一番遅い現行SH4Aのfx-9860GIIですけど、Ftune2にてちょいといじれば最速です(^^)
最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR