楽屋裏 - fx-CG50 のチューンアップ - Ptune3

楽 屋 裏
e-Gadget


2017/07/20
更新 2019/08/31

Ptune3 Ver 0.22 が差替えアップデート [2019/08/31]



fx-CG50 を入手したので、早速チューンアップに挑戦!

これまで、fx-CG20 で愛用してきた Ptune2 (sentaro様の作品) の fx-CG50 対応版 Ptune3 を導入しました。Ptune2 はかなりの安全設計なので、引き続き fx-CG50 専用の Ptune3 を試しています。

fx-CG20 はRAMにSRAMを使っていますが、fx-CG50 は SDRAM に変わっています。従って新たに Ptune3 が登場したわけです。


使用例
  • Ptune3 を起動
  • メモリチェック: [OPTN] - [F5] (RAM) と [OPTN] - [F6] (ROM) 実行
  • SDRAM: と Write: の数値 (SDRAM最大クロック と Write 最大クロック) をメモ
  • 最大値設定画面:[SHIFT] - [MENU] でBus CLK をメモしておいたSDRAM最大 か Write が最大付近に設定
  • 最大値設定画面を抜けて設定を保存:[EXIT] でメイン画面に戻り、[SHIFT] - [F1] (SAVE) で設定を保存
  • 設定をストレージメモリにバックアップ保存:[SHIFT] - [AC] (OFF) で一旦電源オフ
  • 電源オン [AC] して、Ptune3 起動
  • PLL を保護された範囲内で最大値に設定
  • [F5] のプリセットを選び、上で設定した値以下で、BFC と PFC を大きめに設定
  • [SHIFT] - [▲] で FLL を変更すると、各クロックを小刻みに調整できる
  • PLL や CPU クロックだけでなく、BFC (メモリバスクロック) や SFC (I/Oクロック) を安全圏内で最大化した方が、全体の動作が最速化できる。場合によっては、PLL を1段落とし、BFC / SFC を大きめに設定し、さらに FLL を上げて BFC / SFC を安全圏内で小刻みに最大化する方法も有効
※ メモリチェックを行った直後は SDRAMアクセスが不安定になる傾向があるので、一旦リスタート (背面ボタン) すると良い。
  • 最大値設定画面は、できるだけ安全を確保する Ptune3 の最大の特徴。値は安全サイドに慎重に設定する必要がある。
  •  [F4] のプリセットはCPUクロックを優先して大きめに設定する。CPUが早くても必ずしも全体の動作が速くならない。全体の動作の高速化には、メモリバスクロック (BFC) や I/O クロック (PFC) の寄与が極めて大きい。これらを大きめに設定する方が良い反面、メモリアクセスの異常は、特にROMアクセスの異常はファームウェアの修復不能なダメージに繋がるので、"メモリチェック" と "最大値設定" を活用して、慎重に設定するのが良い。




Ver 0.22 ベータ版 [2019/98/31 更新]

同じ電池を使った時に fx-9860G シリーズや fx-CG20 と同じ値を示すように、電圧表示値が実際よりも小さめであったのを修正。sその後 電池電圧表示値について C.Basicでの値との誤差を最小にする修正を行い、差替えアップデート。

Ptune3 Ver 0.22 ダウンロード
マニュアル



Ver 0.21 ベータ版 [2019/02/20 更新]

実際のクロックが表示よりも微妙に遅くなっていたが、スペクトラム拡散に原因があることが判明。デフォルトでスペクトラム拡散がONになっているが、これをOFFに切り替えられるようになった。OFFにすると1.6%程度速くなる。
スペクトラム拡散ONで、FLLを1.6%上げても同じ効果なので、顕著なスピードアップにはならなそう。

Prune3 Ver 0.21 ダウンロード

[X2] または [^] キーでスペクトラム拡散を On/Off できます。



Ver 0.20 ベータ版 [2018/08/19 更新]

実際の周波数とのズレを考慮して表示するように修正(セットアップで設定できる)
(暫定補正値 = PLLより算出される内部周波数 * 900 / 914)
Ptune3  Ver 0.20 ダウンロード

sentaro様によるコメント
CG50だけお持ちの場合はさして問題になることも無いのですが、
SH4AのFX機やCG10/20をお持ちの場合は
Ftune2/Ptune2とPtune3で同じクロックにした場合、
CPUベンチマーク結果が違うことに気が付かれた方もいるかもしれません。
(参考リンク)
http://www.casiopeia.net/forum/viewtopic.php?f=25&t=7327

これはCG50のCPUが何かしらの内部仕様の変更があったか、SDRAMアクセスでの何かで、
実際の動作周波数が計算で求められる周波数よりも低い周波数で動作していると思われます。

CG50デフォルトの計算上の動作周波数は
117.96MHz
ですが、
実際にはC
-1.6%ほど低いところの、
116.15MHz(正確ではありません)
くらいで動作しています。

これはFtune2/Ptune2とPtune3でCPUベンチ値を比較すると
FX機/CG20よりも-1.6%ほど低くなるのが分かるかと思います。

今回のアップデートはその周波数誤差を補正して表示できるようにするものです。





Ver 0.10 ベータ版 [2017/09/30 更新]
sentaro様によるコメント

fx-CG50国内発売前に一応、ってことで、0.10にバージョンアップしました。
アイコンをCG50スタイルに変更したのとSDRAMチェックの仕様を少し変更したのみで機能的には0.05と変わるところはありません。(^^;

ということで、現状Ptune3では2倍以上の大幅なオーバークロックは出来ないですが、CG50は基本ベースで高速化されているのであまりPtune3の必要性はないかもしれませんね。

Ptune3 Ver 0.10 ダウンロード


バグや疑問点、何かお気づきの点がありましたらよろしくお願いします。


=== コメントここまで ===

なお管理人の私が所有している個体で、[F5] で設定される CPU コアクロック 210.11Mhz で 2ヶ月使っている限りでは問題ありません。Ver 0.10 も機能面で変わりないので [F5] で問題ないと思います。



Ver 0.05 アルファ版 [2017/07/20 公開]
sentaro様によるコメント

αテスト版ですが、Ptune3 ver0.05です。(^^;
Ptune3 Ver 0.05 ダウンロード


一番の注意点としては、SDRAMのメモリチェックはチェック後にシステムエラーを起こすことが少々あるので、SDRAMのメモリチェックをした後はリセット推奨です。
それ以外は以前のPtune2と同様にUSB接続で使用しないこと、ぐらいでしょうか。

現状ではCG20のようにメモリクロックがどんどん上げられないので、デフォルトからPLL倍率を上げていくクロックアップが全体の速度向上には効果的です。
この場合はSDRAMのメモリ動作限界で全体の動作限界が決まってしまうのでCG20よりCPUクロックを高くすることが出来ません。
CPUクロックだけを上げるには[F4]を押してPLLをx32にして[SHIFT]+[UP]を押して最上段のFLLで上げていくことになります。(PLLは32倍で制限されているため)
この場合はメモリ限界よりもCPUクロック限界が先にくるので、これでCPUの動作限界が分かります。
私の個体では280MHz前後までいきましたが、速度的にはメモリクロックがあまり上がらないためにPLLを上げていく方が全体パフォーマンス的にはかなり有利になります。
現バージョンの0.05ではデフォルトからPLLを28倍くらいまで上げて1.8倍速ぐらいが安定限界というところです。

fx-CG20はPtune3で約3倍速まで引き上げられますが、fx-CG50はデフォルトで1.5倍~2倍、それがさらに1.8倍まで上がるとすればCG20の最高速度並にはなりそうです。
そしてその状態でも消費電力がCG20比で約半分というところなのでなかなか良いですね。(^^)

=====





αバージョンなので、なんと言っても完全に自分の責任で使うもので、今はこわごわ触っています。Ptune3 に関する話題をこのエントリーにまとめるため、楽屋裏ネタとしてこの記事を投稿しています。

早速、作者のsentaro様への質問をコメント欄にアップしました。

[2019/01/31 追記] 
fx-CG50 を2台持っていますが、いずれも 300MHz までチューンアップできました。単に CPUクロックが 300MHzといっても、他の設定に応じて実際のプログラム処理速度は大きく変わりますので、CPUクロックのみで話をするのはあまり意味はありません。
以下のコメント欄にあるように sentaro様のアドバイスを頂きながら、2018年8月末に 自分なりの安全かつ最速設定を見つけ、その後ほぼ5ヶ月使用使って問題ないので、運が良ければここまでチューンアップできます。ちなみにsentaro様所有のfx-CG50では300MHzには至らないようです。無理はしないでください。






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


 


keywords: プログラム関数電卓、fx-CG50、クロックアップ、Ptune3

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

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

Casio Basic入門1

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現などは随時追記・修正します.
最終更新:2019/08/31


はしがき
[2014/11/03追記]

fx5800P_calcfx-5800P を買ってきてプログラムを作ってみようと思い、取扱説明書を見ると、プログラムが分かる人向けのヒントくらいしか書かれていません。

これはヒドイ!!(以前は良かったのに...このあたりは「1.はじめに」で紹介してます)

とりあえずプログラミングを始めたものの、細かいことは、色々と試行錯誤を繰り返さないと分かりません。こうして、取扱説明書には書かれていない詳しいことが、少しづつ分かってきました。

プログラムを作りながら色々と調べているうちに、fx-5800P に搭載されているプログラミング言語:Casio Basic は、かなり優れモノだと分かってきました。プログラミング経験者向けに Casio Basic の面白さを一言で紹介すると、「電卓で使える構造化BASIC風言語 」 です。

なかなか優れている Casio Basic なのに、こんな取扱説明書では、さっぱり使いこなせない人が多いだろうし、経験者が取扱説明書を読むと、未だに古い Basic 風言語と変わらないと思うだろうし、良さを知らないままにプログラミングを諦める人も多いだろうと思うので非常にもったいないと思います。

"新世代 Casio Basic" が使える fx-5800P は、非力なプロセッサしか積んでいないにもかかわらず、まともな実用プログラムを作れます。さらに、fx-5800P はプログラムを呼び出して使う利便性が高く、高機能な fx-9860GII や fx-CG20 よりも便利なことは、あまり知られていないのではないでしょうか? 

自分の必要性に合わせて、いくつもの実用プログラムを作ってみて、分かったこと試してみたこと を含めて、取扱説明書では絶対にわからない Casio  Basic の使いこなしを整理したものが Casio Basic 入門 講座です。それと並行して、取扱説明書では絶対にわからない Casio Basic のコマンドリファレンス 、逆引き Casio Basic を公開しています。

「1.はじめに」 では、Casio Basic や fx-5800P の歴史や特徴を私見を交えて書いていますので、「2.プログラミングとは」まで飛ばしてもらって結構です。



1.はじめに [2015/01/04 修正]

私が初めて手にした電卓が、カシオのFX-502Pという関数電卓でした。手帳サイズでプログラミングできる画期的な製品で、世界中にカシオファンを増やした原動力となったようです。

fx-502P 
手帳タイプのソフトカバーが付属した FX-502P

私がFX-502P を入手した当時は、関数電卓として使っていて、プログラミングの「プ」の字も知りませんでした。その後プログラムに興味を持ち、生まれて初めて作ったのが、FXー502Pのプログラム「反射ゲーム」
画面表示が変化した直後に、どれだけ早く反応してキーを押せるか...そんなゲームでした。
 ⇒ FX-502P / 602P / 603P のプログラム

カシオはFX-502Pに続いて、プログラム互換性の高い後継機として、1981年にFX-602P、1990年にはfx-603Pを発売しました。
FX-602P には取扱説明書だけでなく、「プログラムライブラリー」と言う厚い本が付属していて、それには数多くの実用プログラムが掲載されていました。掲載されているプログラムを入力し、理解し、さらに自分なりに改造することで、プログラミングがどのようなものか、少し分かりました。きちんと動作するサンプルプログラムを参考にして、自分でプログラムを改造する作業が、プログラミングの学習には非常に有効だと実感しました。

これらのプログラム機能は、今思えばアセンブリ言語に近い感じで、電卓のメモリに直接あるいは間接的にアクセスして、ジャンプはインクリメント/デクリメントを行うことができるなど、工夫のしがいがある面白いもので、プログラミングの好きな人には楽しく遊べるものでした。

その後登場したプログラム互換のFX-602P や FX-603P は、アルファベット表示が可能になり、記憶容量が増えたことで、測量計算などの実用に耐えるプログラム関数電卓として不動の地位を得てきました。プログラム言語としての完成度、ハードウェアとしての使いやすさがユーザーに支持された結果でしょう。


プログラミング言語仕様から読み解く Casio Basicの開発史 [2019/08/31 追記修正]

カシオは、プログラム関数電卓とグラフ関数電卓、そしてポケットコンピュータの3系統で、搭載言語の開発を進めている時期がありました (プログラム電卓メモワール1990-12 参照)。ポケットコンピュータはPCの高機能化、小型化、低価格化により市場からその姿を消しました。プログラム関数電卓では、fx-4850P を最後にプログラミング言語のバージョンアップを止め、新製品が出なくなりました。そして、唯一グラフ関数電卓が搭載言語とともに進化してゆきました。

プログラム関数電卓 fx-4000番台の製品に搭載された言語は、試行錯誤の跡がみられ、このシリーズ最終機種の fx-4850P の搭載言語は中途半端な仕様のまま成功せずに終わったと感じています。fx-4850P のハードウェアデザインは fx-5800P に引き継がれましたが、搭載言語はシリーズ初号機の fx-4000P の仕様が 現在の Casio Basic に引き継がれています。

一方で、グラフ関数電卓での搭載言語は着実な進化を見せました。fx-7400Gで初めてBasicコマンドが搭載され、1996発売の CFX-9850G には、ついに GetkeyLocate コマンドが搭載され、現在の世代のCasio Basic に近づきました。但し空行改行や If 文の Then や Else の直後での改行がエラーになる、コード編集画面がデフォルトで上書きモードになるなど、実用的なプログラミング言語としてはもう一歩という感じでした。しかし、これは Casio Basic の歴史上極めて重要な一歩だと言って良いと思います。GetkeyLocate が、Casio Basic の実用性を格段に向上させているからです。⇒ プログラム電卓温故知新 - CFX-9850G の最後の項目 "プログラム電卓の系譜" を参照。


翌年の 2006年に登場した fx-9860G は、基本的に CFX-9850GC PLUS の Casio Basic をベースに改行の問題を解決し、コード編集画面がデフォルトで挿入も度に変更され、プロット系コマンドのバグとも言える理解不能な仕様がうまく整理されました。ここでようやく現在の "新世代 Casio Basic" が登場しました。

fx-9860G の搭載言語からグラフィックス関連とシリアル通信関連のコマンドを取り去り、さらにいくつかのコマンドが改良したものが fx-5800P に搭載されました。fx-9860G 発売と同年のことでした。


fx-5800P での改良点の代表的なものを挙げてみます。

入力命令 ?A では、変数 A に既に入っている値を表示し、変更がなければ [EXE] キーを押すだけで確定できる機能が追加されました。一方、?→A とすれば、A の値を表示せずに新たに入力させます。この ?A の機能は、変更が無ければ [EXE] を押すだけで良いので、作成したプログラムの使い勝手が格段に向上します。現在のところ、この機能があるのは、fx-5800P と fx-FD10 Pro のみで、グラフ関数電卓にはこのような便利な機能はありません。

[FILE] キーでプログラムリストを表示し、そこからプログラムを実行できる機能も、fx-5800P の利便性を向上させる優れた改良だと思います。これが可能なのは、他には fx-FD10 Pro のみです。グラフ関数電卓では、一旦プログラムモードに入らないとプログラムを呼び出せません。

fx-9860G にあった グラフィックス関連とシリアル通信関連のコマンドは、fx-5800P にはありません。fx-5800P をプログラム関数電卓に位置づけるなら、グラフィックス関連のコマンドは不要といっても良いと思いまが、シリアル通信関連コマンドは残して欲しかったと思います。さらに、電卓とPCの間でプログラムファイルをやりとりするPCリンク機能が無いのも fx-5800P の利便性を発揮しきれない仕様上の大きな弱点です。

このような弱点があるものの、fx-5800P は、グラフ機能の無いプログラム関数電卓として、極めて大きく進化した "新世代Casio Basic" を搭載し、プログラム電卓としてバランスの取れた、そして関数電卓としても使いやすい優れた製品です。

歴史を少し遡って、プログラム関数電卓として大成功を納めた FX-502P や FX-602P の最終進化形 の FX-603P は、結果的に21世紀に入っても販売が続き、その製品寿命は10年以上の長きにわたりました。趣味ではなく仕事用に実用プログラムが使われ続け、ユーザーの大きな支持に答え続けた結果なのだと思います。FX-603P の実用品としての完成度の高さの証明でもあります。FX-603P に取って代わるプログラム関数電卓が永らく登場しませんでした。

※参考: プログラム関数電卓ノスタルジア(Casio fx-502P、fx-602P、fx-5800P)

さて、グラフ関数電卓で熟成してきた新世代 Casio Basic を機能制限して搭載した fx-5800P は、しばらく FX-603P と併売されていましたが、ついに FX-603P が生産中止となりました。fx-5800P が プログラム関数電卓 FX-603P の後継機となったわけです。

その後も Casio Basic の改良がグラフ関数電卓で続き、fx-9860Gシリーズで文字列処理コマンドが追加搭載され、ハードウェアとしては高精細カラー液晶搭載した fx-CG10/20 が登場しています。そして 2015年1月時点での最新機種、fx-FD10 Pro は、fx-5800P の利便性と最新の Casio Basic を搭載したハイブリッド機とでも言える、面白い性格を持っています (fx-FD10 Pro は Casio Basic専用機です。fx-9860GII とほぼ同じハードウェアを使いながらアドインが使えない設定にした判断は、販売戦略上のものなのでしょう)。

気がつけば、新世代Casio Basic搭載のプログラム関数電卓 fx-5800P は、2006年の登場から12年を超えており、その製品寿命を超える可能性も見えてきました。使用しているIC類などの部品調達の継続性を考えれば、FX-603P と同様に 10年を1つの区切りとすれば、2019 年には fx-5800P の後継機種が期待されるところです。

2014年12月に、スタンダード関数電卓の新シリーズ fx-JP500, fx-JP700, fx-JP900 (CLASSWIZ シリーズ) が発表され、順次発売が開始されました。高精細液晶の搭載、省電力でありながらCPUの大幅な処理速度向上、その他様々な改良が加えられ、死角が殆ど無い関数電卓と言えます。fx-JP900 のみに搭載された表計算機能 は、データ保存機能が無いので実用的とは言えないものの、実力をアピールする意味は十分にあります。この表計算が、操作性やユーザーインターフェースの面でグラフ関数電卓 fx-9860GII に似ていることは、大変興味深いのです。

高精細液晶と高速・省電力CPUと言う新しいハードウェアに加えて、グラフ関数電卓と酷似した表計算機能を新ハードウェアで走らせる機能のアピールは、発売開始から12年目の fx-5800P の後継機種がそろそろ現実性を帯びてきているのではないかと、大きな期待を寄せています。 

[2018/10/31 追記]:fx-CG50 が登場
2017年春に fx-CG10/20 の後継機として fx-CG50 が欧米で発売開始され、同年10月に日本国内で発売されました。fx-CG50 は fx-CG10/20 とほぼ同じ仕様で、消費電力が大幅に抑えられ、処理速度が大幅に向上しました。そのデザインは fx-JP900 と極めて似通ったものになりました。

最新のグラフ関数電卓 fx-CG50 (2017) 
Casio fx-CG50 の概要

カシオは、プログラム電卓については欧米ならびに中国市場を中心に考えているののが残念なところですが、シャープがプログラム電卓開発から事実上撤退している状況で、日本企業として唯一カシオがプログラム電卓の開発を続けていることは、歓迎したいと思います。但し、特にグラフィック関連は、マクロ言語を出自とする故かVRAMへの転送速度が非常に遅いことから、fx-CG50でさえグラフィックスプログラミングを自由に行えるレベルには至っていません。

さてこのような状況下で、fx-5800P の後継機種の動向が気になります。fx-JP900 と fx-CG50 と同様のデザインで、これらの中間サイズの グラフィック機能を割愛したプログラム関数電卓が fx-5800P の後継として登場すれば面白いと思います。

===== 追記おわり ====


fx-5800Pの特徴

最新の Casio Basic から見れば、fx-5800P 搭載の Casio Basic はサブセット版と言えますが、プログラム関数電卓として不要な機能を省略しただけで、新世代 Casio Basic 搭載機としては、低価格で使い勝手の良い絶妙なバランスの製品です。

上て述べたように、fx-5800P の最大にして唯一の欠点が、作ったプログラムをPCにバックアップすることが出来ない点で、なんとも中途半端な仕様になっています。非常にもったいない。なぜこんな中途半端な仕様にしたのか?機会があれば、是非ともカシオに話を聞きたいところです。

fx-5800P で作ったプログラムは、もう1台の fx-5800Pへ転送することはでき、そのための通信ケーブルがオプションで用意されています。バックアップしたいなら「もう1台買って下さい」と言うわけです。 ここを参照

ところで、この通信ケーブル(3pinシリアルケーブル)は、fx-9860GII や fx-CG20 にUSBケーブルと共に標準添付されているものです。

fx-5800P の後継機種では、同様に3PシリアルケーブルとUSBケーブルを標準添付してPCリンク機能を実現してもらいたいものです。これがあれば、fx-5800P のプログラムも PCにバックアップ可能になるからです。

なお、私は作ったプログラムをエクセルに転記して、バックアップをしています。
[2014/09/30 追記] バックアップ用に、専用通信ケーブルと2台目のfx-5800P を購入してしまいました。但し、エクセルへのソースコードの記録は続けています。→ ここを参照


fx-502P&fx-5800P 
fx-502P と fx-5800P (写真は「プログラム関数電卓ノスタルジア(fx-502P、fx-602P、fx-5800P)」掲載のもの)


My_func_calcs_20190803
My_graph_calcs_20190803
 
※ 管理人所有のプログラム電卓


fx-5800P は、薄型、軽量で上着の内ポケットに十分入る大きさです。そして、4行x16桁の液晶ディスプレイを搭載し、加えて新世代 Casio Basic が搭載されています。 高機能グラフ関数電卓 fx-9860GII も入手し、fx-5800P と比較していますが、改めて fx-5800P のバランスの良さを再認識しています。新世代 Casio Basic は、実用プログラムに加えて、ちょっとしたアクションゲームを作れるレベルの構造化Basic です(本ブログでも、いくつか紹介しています)。さらに、fx-5800Pは実売で6000円台なので圧倒的に購入しやすいのです。



さて、新世代 Casio Basicを搭載した fx-5800P の取扱説明書では、プグラミングが分かっている人しか分からない程度の記述しかありません。その上、プログラム事例は殆ど紹介されていません。カシオは、紙のプログラムライブラリーやウェブでの情報も国内では用意するつもりはなさそうです。

[2014/1/21 追記] 
fx-CG20の簡単なプログラミングの紹介を見つけました。申し訳ない言い方ですが、とりあえずやっつけたといった内容に感じられ、電卓の使い方の導入で終わっています。それが目的ならば敢えて申し上げることはありませんが、プログラミング入門としては、あまり力を入れているとは思われません。→ここ

一方で、海外では、カシオのホームページで動画による様々な説明(Webinar)が紹介されています。但し全て英語なので、明らかに日本人向けではありません。日本メーカーであるカシオ製品のサポートが、日本で積極的に行われないのは、非常に残念です。

Webinarの一例

そこで新世代 Casio Basic の良さを共有したいと考え、私なりの「Casio Basic入門」を公開することにしました。fx-5800P のプログラミングのしきいを下げてみよう、という試みです。合わせて、プログラミング経験者、特に長らく Casio プログラム電卓でプログラムを作ったことのある方には、新世代 Caso Basic が大きく進化していることを伝えたいという気持ちもあります。

[2017/08/06 追記]
この連載を始めた当初は、fx-5800P しか持っておらず、その後 fx-9860GII、fx-9860GII SD、fx-CG20、fx-CG50 を入手し、それらの Casio Basic でプログラムを作っています。その結果 これらの Casio Basic は互いに一定レベルの互換性が保たれるように考慮されていることが分かっています。fx-5800P で Casio Basic を使いこなせるようになれば、fx-9860GII シリーズや カラー高精細液晶の fx-CG20 / fx-CG50 でも問題無く使えるということです。

[2018/12/26 追記]
有志の方により CcLinker が開発され、fx-5800PのPCリンクが実現され、プログラムの保存や導入が容易になりました。
- 開発者 takumako様による CcLinker のサイト
- 当ブログの CcLinker 紹介記事


2. プログラミングとは
[fx-5800P] [fx-9860G (SD) fx-9860GII (SD) / fx-CG20 / fx-CG50]

プログラムの「プ」の字も知らない方のために、最初にあらかじめ知っておいて頂きたい基本的な事柄を紹介します。


プログラムって何だ?

プログラムと言うのは、「手順書」です。そして予め用意された単語と文法を使って、手順を書くことをプログラミングと言います。
手順を書くために使う言葉を「プログラミング言語」と言います。

そして、その単語と文法が分かればプログラムを書けるようになるわけです。

プログラムを読む相手は電子回路ですから、そこには情緒も感性も不要です。むしろ曖昧さがは有ってはなりません。厳密に一通りにしか解釈できないように書くために、単語や文法が考えられています。

言葉に動詞や文型があるように、プログラミング言語にもコマンド(命令)やステートメント(文)があります。これらの単語を覚え、文法を覚えるのは難しくありません。普通の外国語に比べると覚えることはとても少ないのです。Casio Basic については、覚えるべき事柄が非常に少ないので、さらに楽です。



プログラミング言語とは?

プログラムは手順書なので、基本的にはコマンド(動詞)と必要な名詞(目的語)をステートメントの規則(文型)に従って書きます。

「~をしなさい」  「~に~をしなさい」

といった短い文の組合せと繰返しで、プログラムは構成されます。


プログラミング言語には、多くの種類があります。C言語、java、BASIC、FORTRAN などを見聞きしたことは有りませんか?これらは最もよく用いられる代表的な言語です。これらの言語に一般的な優劣は有りませんが、それぞれ得意とするものが異なっています。

なお、これらの多くはアメリカで発明されたので、英単語から派生した単語を使い、語順は英文法に近くなっています。「O に V しなさい」 は、「V O」 といった語順になります。「ピアノを弾きなさい」「Play piano」 となるのと同じです(動詞 + 目的語)。

fx-5800P や fx-9860GII などのカシオのプログラム電卓には、BASIC が内蔵されています。但し、カシオが作った BASIC なので、Casio Basic と呼ばれています(特に海外のサイトでは、この表現をよく見ます)。基本的な単語や文型はパソコンで使う BASIC とほぼ同じです。

一部カシオ独自のものがありますが、古くからのユーザーのために残しているとのことです。古くから採用されていた独自のものは、当ブログでは旧来の命令と読んでいますが、使い勝手が良いので残っていても良いと思います。

ちなみに、Casio Basic で検索すると、おかげさまで当ブログがヒットしますが、CASIO Basic はカシオ時計のブランドだというのが分かります。



プログラムで計算

プログラムを書く時に、計算をさせることもできます。

1234 x 5678

とプログラムに書けば、電子回路が計算してくれます。プログラムを書く時に計算結果を知る必要はありません。

但し、上の計算結果を知るためにわざわざプログラムを書く人はいないでしょう。電卓のキーをチョイチョイと叩けば答えが出ますね。

上のように決まった数でなくて、色々と異なった数のかけ算をしたい時、プログラムが役立ちます。

A = 1234
B = 5678

としておいて、

C = A x B
Print C


とプログラムを書くと、かけ算の結果を画面に表示します。この書き方はパソコンで使う一般的なBASICの書き方です。

A x B は、A や B に色々と異なった数を入れると、異なった答えを出してくれます。これを Casio Basic で書くと、

1234→A
5678→B
AxB→C


正確に、このように3行のプログラムを書いて、それを実行させると、画面には 7006652 と計算結果が表示されます。


前置きが長くなりましたが、ポイントは以下の6項目です。

1) パソコンのプログラミングは、こんなに簡単ではありません
プログラム電卓ならではの簡便さです。

2) A や B は変数
変数は、数を入れておく容器です。A や B は容器の名前です。
予め、容器Aに数1234を入れ、容器Bに5678を入れておきます。
そして、AxB は、容器の中身の数のかけ算をしなさい、と言うプログラムです。
このように、プログラムでは頻繁に「変数」を使います。

fx-5800P や fx-9860GII などのプログラム電卓で使える変数は、アルファベットの A~Zの26文字です。但し、配列変数 (fx-5800P) や 行列 (fx-5800P や fx-9860GII など) という変数を必要に応じて追加して使うことができます。配列変数や行列については、その使い方を含めて、後で説明します。今は忘れてもらって結構です。

3) → は代入命令
変数Aに 1234を入れることを、「変数Aに1234を代入する」と言います。
そして、Casio Basic では、代入をしなさいと言う「代入命令」を 「」と言う右矢印の記号で表現します。

の左のものを、右へ代入すると決められています。
1234→A
のように、数字を変数に代入するだけでなく、変数を変数に代入できます。

例えば、

1234→A
5678→B
A→B


とすると、変数Bの中身は、5678でなくて、1234 に変化します。

CasioBasicコマンドリファレンス: → (代入命令)

パソコンの Basic では、変数 A に 1234 を代入するとき、

A = 1234

と書きます。代入命令については、Casio Basic は独特なものですが、 記号は代入の方向を示しているので、却って分かりやすいと思います。



4) は出力命令

これも Casio Basic 独特の命令です。◢ は出力、つまり画面表示するだけでなく、併せて一時停止の機能があります。

上の3行のプログラムは、上から下へ順に実行されます。

AxB

は、AxBの結果を表示して、そこでプログラムの実行を一時停止しなさい、という命令です。そして、[EXE] キーを押すと一時停止が解除されます。これも命令に含まれる機能です。

CasioBasicコマンドリファレンス: (出力命令)


5) ?は入力命令
変数Aと代入命令を併せて使って、

?→A

と書くと、画面表示が、

?

となり、そこでプログラムが一旦停止します。

の表示は、キー入力をしてください、と言う意味です。そして、プログラムが一時停止し、何かキー入力を待ちます。[EXE] キーを押すと入力内容が確定され変数Aに代入され、プログラムの一時停止が解除されます。これも Casio Basic 特有の命令です。

実はここには、Casio Basic 特有のおもしろい面があります。
画面に

?

と表示され、入力が促されている時に、例えば

9999÷3

と入力して[EXE] キーを押すと、この計算結果が変数Aに代入されます。

fx-5800P は関数電卓なので、様々な関数機能が内蔵されています。そこで、? が表示されて入力待ちの状態で、sin(30) と入力して[EXE]キーを押すと、計算結果の 0.5 が変数 A に代入されます(DEGモードの時)。関数電卓特有の機能を活かした入力命令になっていることが分かります。

"A="?→A

と書くと、画面には" と "で括られた文字

A= ?

のように表示され、入力待ちになります。

"A="?→A
5678→B
AxB


は、キー入力した数字を変数Aに代入して、AxBを計算した結果を表示するプログラムです。様々な数値や計算結果に5678を掛け算した結果を表示します。

CasioBasicコマンドリファレンス: ? (入力命令)


6) プログラムは上から下へ連続実行
プログラムは、上から下へ連続的に実行されます。

そして、出力命令や入力命令は、一旦停止の機能があるので、そこで実行が一旦停止します。この一旦停止は特別な例です。さらに、実行の流れを変えるコマンドや文があり、これらを使えば上から下への実行順序を変えることができます。

このような明示的なコマンドや文が無い限り、プログラムは上から下へ連続的に実行され、プログラムの一番下の行で、完全に実行が停止します。

プログラムは上から下へ実行される原則は、当たり前のように感じられるでしょう。しかし、これを忘れるとプログラムの動作が分からなくなるものです。とても重要な原則なので、必ず覚えてください。


関連記事:
- プログラム関数電卓でプログラミング
- fx-5800P【プログラミング入門】:プログラム作成から実行までの操作



*****


次からは、実際にプログラムを作りながら、プログラムの単語や文型をみてゆきます。


つづく...

⇒ CasioBasic入門2 / 目次



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


 


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

fx-5800P 素因数分解 - 高速化

追記修正 2019/08/28

今回は、fx-5800P の素因数分解プログラムの高速化の話題です。

素因数分解の一般的な方法は、"エラストテレスのふるい" と言われるものです。最初に入力した数 N を小さい順に素数で割り算を繰り返す方法です。最大の素因数は N の平方根以下の整数なので、平方根以下の整数を対象に2と3以上の奇数で割り算を行う方法で fx-5800P での素因数分解プログラムを作っています。
⇒ fx-5800P 素因数分解 - バグ修正と表示変更

さらに高速化する方法は無いものかと、色々と考えたり、試したりしていました。
例えば Casio 関数電卓の素因数分解 など。



最速の素因数分解プログラム

最近、目からうろこの高速化を達成した記事を見つけました。
A fast prime factorizing program for Casio fx-5800P 
このトピックで、作者の slugrustle 様 は、2つのプログラムを公開されています。いずれもプログラム名は FACTOR です。
オリジナルは、上のサイトをご覧ください。

これらには、面白い工夫がなされています。その部分には手を付けず、表示やユーザーインターフェースの不具合(と私が思うだけですが...)を解消するために、チョット変更しました。


1本目のプログラムの変更版:
結果の表示を 3^2 と乗数を表示し、List にも乗数の結果が FREQ に反映するように変更しました。
FACTOR-M1 のダウンロード

FACTOR-M1_1 FACTOR-M1_2 
FACTOR-M1 の結果出力 - 左: 乗数表示、- 右: [MODE] [3] で現れる List表示


2本目のプログラムの変更版:
オリジナルプログラムでは、結果表示画面を、複数ページで切り替えて自由に見られるようになっています。[EXE] [▲] [▶] [+] で次のページを表示、[(ー)] [▼] [◀] で前のページを表示、[EXIT] [DEL] でプログラムを終了するようになっています。計算が高速化しているだけでなく、結果表示も良くなっています。

このキーの使い方がチョット馴染まないので、[▼] で次のページ、[▲] で前のページ、[+] は使えないようにし、指定以外のキーを押した時の誤動作を抑制するように修正しました。時間をかけて計算できた結果が、誤動作で見えなくなるのは嫌ですから...
さらに、オリジナルはキーを軽く押しても応答せず長押しが必要、つまり応答がとても悪いので、キー入力待ちを最小のループにして応答を十分高速にしました。軽くキーを1回押すだけで、チョット待ちますが必ず画面が変わります。
またオリジナルでは結果表示一覧で素因数として 1 が表示されますが、1 は素数ではないので、素因数として 1 が表示されないように修正しました。
FACTOR-F1 のダウンロード

FACTOR-F1_1  FACTOR-F1_2 
FACTOR-F1 の結果表示 - 全結果を画面切り替えで確認、左: 2/1ページ、右: 2/2ページ


比較のための以前作った PRIME DECOMP:
PRIME DECOMP のダウンロード

Prime_Decomp_2 Prime_Decomp_3 


上記でダウンロードしたZIPファイルには、それぞれ CCL ファイルと TEXT ファイルが含まれています。CCL ファイルは CcLinker を使って fx-5800P に転送できます。或いは、下のリンクからテキストファイルを参考にしてください。



計算時間の比較

先ずは、fx-5800P でどのくらい高速化されたかの結果を示します。

PRIME DECOMP
ソースコード
FACTOR-M1
ソースコード
FACTOR-F1
ソース (メインルーチン)
ソース (サブルーチン)
123,456,789
= 32 x 3607 x 3803
170 秒60 秒
3 倍高速化
42 秒
4 倍高速化
6,666,666,667
= 19 x 1627 x 215659
77 秒27 秒
3 倍高速化
20 秒
4 倍高速化
7,849,516,203
= 32 x 9811 x 88897
458 秒165 秒
3 倍高速化
111 秒
4 倍高速化

1本目の FACTOR-M1 で3倍高速化、さらに2本目の FACTOR-F1 は4倍高速化されていることが分かります。

素因数分解は、与えられた数を小さい数から順に割ってゆく時、その操作の回数を減らせば、高速化に繋がります。
PRIME DECOMP では入力した数に、先ず平方根をとって一気に探査範囲を狭め、2と3以上の奇数で小さい方から順に割り算してゆく作戦です。

一方で、理想的なのは、小さい素数から素数だけで順に割り算してゆくことです。それには素数リストが必要ですが、それがあれば苦労しません。素数を算出する計算式などありません。

さて、slugursite様の工夫は、高い確率で素数を見つけるだけでなく、割り算する候補 (例えば、2 や 3 だけでなく、一旦割り算で使った素数の倍数) を効果的にふるい分ける手法にあります。そして、最初の FACTOR-M1 よりも 次の FACTOR-F1 の方が、素数を見つける確率が高くなっているので、さらに高速化されています。



最速プログラムでの工夫 [2019/07/31]

読者のまつ様から、高速プログラムの考え方をご説明頂きました。私はこれに大変納得しましたので、それを掲載致します。以前の記述は撤回させて頂きます。

素因数分解プログラムで通常行われている割り算では,「2,および,3以上の奇数」を割る数としています。
これですと,ご存知のように,例えば3で割り切った後に9でも割るという無駄が出てしまいます。
FACTOR-M1は,「2, 3, 3より大きい3の倍数を除く奇数」を割る数としており,3で割ったあと9や15で割ることはないようにしています。

3より大きい3の倍数を除く奇数について考えてみます。

まず,3より大きい3の倍数でない整数は次の(1),(2)のどちらかです。
 3m+1 (1)
 3m+2 (2)
 (m>=1)

次に(1),(2)が奇数となる式をそれぞれ求めます。

(1)は (2m+1)+m と変形できます。2m+1 は奇数ですから,(1)が奇数であるためには m が偶数である必要があります。そこで m=2n (n>=1) とおけば,(1)は 6n+1 となります。

(2)は 2(m+1)+m と変形できます。2(m+1) は偶数ですから,(2)が奇数であるためには m が奇数である必要があります。そこで m=2n+1 (n>=1) とおけば,(2)は 6n+5 となります。

5とこれらの式を並べ,さらに,隣り合う式の差も書き加えると次のようになります。(n=1とします)
式の並び隣り合う式の差
52
6n + 14
6n + 52
6(n+1) + 14
6(n+1) + 52
6(n+2) + 14
6(n+2) + 52
:
:
:
:
このような訳で,2, 4, 2, 4, ... と加算していると思われます。
この繰り返しは,6n+1 および 6n+5 の式からも分かるように,2と3の最小公倍数6を周期としています。

FACTOR-F1は,これを拡張して,割る数として
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
を順番に求めていく方法をとっていると思われます。
2,3,5,7の最小公倍数は210ですから,隣り合う割る数の差(2,4,6,8など)の並びは210が1周期です。
FACTOR-F1の場合は,13+210n〜13+210(n+1)-1 [n>=0]の範囲で,2,3,5,7のいずれの倍数でもない整数を並べて,隣り合う整数の差をリストにしていると思われます。

ちなみに,13〜222の210個の整数のうち,
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
の個数は,FACTOR-F1の「While 1」の下にある
 B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1
のパターンの行数と同じ48個です。

48個となる理由は次の通りです。

まず,2,3,5,7の倍数に関わるそれぞれの個数を求めます。

2の倍数の個数=210/2=105
3の倍数の個数=210/3= 70
5の倍数の個数=210/5= 42
7の倍数の個数=210/7= 30
 
2と3の公倍数の個数= 6の倍数の個数=210/ 6=35
2と5の公倍数の個数=10の倍数の個数=210/10=21
2と7の公倍数の個数=14の倍数の個数=210/14=15
3と5の公倍数の個数=15の倍数の個数=210/15=14
3と7の公倍数の個数=21の倍数の個数=210/21=10
5と7の公倍数の個数=35の倍数の個数=210/35= 6
 
2,3,5の公倍数の個数= 30の倍数の個数=210/ 30=7
2,3,7の公倍数の個数= 42の倍数の個数=210/ 42=5
2,5,7の公倍数の個数= 70の倍数の個数=210/ 70=3
3,5,7の公倍数の個数=105の倍数の個数=210/105=2
 
2,3,5,7の公倍数210の個数=210/210=1

重複を考慮すると,
2,3,5,7のいずれかの倍数の個数
=(105+70+42+30)-(35+21+15+14+10+6)+(7+5+3+2)-1
=162

従って,2,3,5,7のうちどの倍数でもない整数の個数は,
 210-162=48
で 48個となります。


素因数分解の正しい動作を検証

この作者は自分のプログラムを検証するテストプログラムまで作って、ソースコード (C++) を公開しています。fx-5800P 用なので、素因数分解する数は最大10桁と決まっています。この条件下でアルゴリズムの正しさを検証しています。

検証プログラムのソースコードが公開されています。そこで Visual Studio 2019 Community でビルドしました。


 FACTOR-F1 のテストプログラム Factor.exe のダウンロード [2019/08/28 リンクを修正]

コマンドプロンプトで、Factor.exe のあるデイレクトリに移動し、そこで

 Factor 1000 50000 4

と入力してエンターキーで実行すると、1000 から 50000まで 4 刻みで入力を変化させて FACTOR-F1 を実行した結果を一気に連続して自動実行してくれます。そして、結果が素数がどうか判定し、素数でないものが出てくるとエラーを出し、素数であれば実行を継続します。正常終了すれば、正しく素因数分解が実行されたことになります。

factor_1
正常終了しているので、1000 から 50000 までの素因数分解は問題ないことが検証されました。


fx-5800P 用のプログラムなので、入力値は 1 ~ 9,999,999,999 (10桁) の範囲なので、完璧にテストするには、

 Factor 1 9999999999 1

とすれば良いのですが、試しに私のPCだと、1晩で150億回分の検査が済みました。 10桁に相当する (1000億 - 1) 個全部のテストは、夜のみ終夜運転で計算させるとして1週間程度必要になりそうです。

factor_2
1 ~ 9,999,999,999 までのテスト中

テストが正常終了すれば、このアルゴリズムが正しいことが検証されます。但し、他のパラメータ設定でも正しい組み合わせは有りそうです。



グラフ関数電卓用に移植

FACTOR-F1 をグラフ関数電卓用に移植しました。素因数分解の計算部分は変更の余地がありませんが、結果表示は7行全部を使うように変更しました。

グラフ関数電卓用 FactorG のダウンロード

FactorG 
FactorG の結果表示


今回は、slugrustle 様による投稿の解説記事になってしまいましたが、私としては十分楽しませてもらったので、記事にして残そうと思いました。




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


 


keywords: プログラム関数電卓、fx-5800P、素因数分解、プログラミング、Casio Basic

リンク集 | ブログ内マップ

関連記事

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

温故知新 - CFX-9850GC PLUS

プログラム電卓 温故知新
 - 搭載プログラミング言語に注目して、プログラム電卓の変遷を考える -

 
2019/06/23
追記修正 2019/06/24
追記修正 2019/06/25
追記修正 2019/06/30
追記修正 2019/07/01
追記修正 2019/08/17
追記 2019/08/22


特定のカシオ製プログラム電卓に搭載されたプログラミング言語にスポットライトを当てて、過去から現在に至る仕様の変化を調べる。

5. 新世代 Casio Basic 登場前夜 - 可読性と機能の向上(2)

今回は、2004年発売の CFX-9850GC PLUS を取り上げる。国内では 2005年1月に発売された。海外では2010年まで発売されていたが、国内では2006年には生産中止扱いになり、2007年にはカタログに掲載されなくなった。国内でのカタログ掲載期間は1年8ヶ月と短かった。
2005年1月発行のカシオ電卓総合カタログ
2006年9月発行のカシオ電卓総合カタログ

カシオ機に搭載されたプログラム言語で、Basicコマンドが追加されたものを欧米のプログラム電卓コミュニティでは Casio Basic と呼ばれている。私も当ブログ開設当初から Casio Basic という呼称を使っていた。

Casio BasicGetkeyLocate が追加されたのが CFX-9850G であった。その後、コマンドや関数が追加され、シリーズ最終の CFX-9850GC PLUS が登場した。この機種の後継として fx-9860G が発売され、これ以降の機種に搭載された言語を私は "次世代Casio Basic" と呼称している。詳しくは fx-9860G を取り上げる時に紹介したい。

CFX-9850GC PLUS はCFXシリーズの最終形であり、新世代Casio Basic 登場前夜と言える。



Casio CFX-9850GC PLUS

CFX-9850GC_PLUSCFX-9850GC_PLUS_Manual

2004年海外で発売、2005年1月 に国内発売開始、海外では2004年発売。
カタログ 取扱説明書 (Casioサイト) 取扱説明書 (e=Gadgetサイト) 

64KBのメモリ領域にシステムも含まれており、それ以外がプログラムやデータに使える。取扱説明書の表紙から分かるのは、fx-9750G PLUS(モノクロ液晶)など複数の機種とほぼ共通の仕様になっている。

取扱説明書で分からない Casio Basic の使いこなし が当ブログのメインテーマなので、実際に触ってみたいと思い、以前から中古品を探していた。



実際に入手した CFX-9850GC PLUS
幸運なことに、eBayで "未使用品 - 動作確認のため開封" というものを見つけたので入手した。EU域内保証書が添付されていた。
 CFX-9860GC_PLUS_1 CFX-9850GC_PLUS_2 
実際に傷や汚れが一切なく、新品状態であった。

CFXシリーズは、3色カラー液晶搭載のグラフ関数電卓で、デフォルトがブルーで、オレンジとグリーンを追加した3色が使える。実際の画面は、輝度も色もコントラストが低い。液晶を見る角度でコントラストや色合いが大きく変化するのも見づらさの原因だ。明るいところでは問題ないが、少し暗くなると見づらいと感じる。実際にしばらく使い続けると多少は慣れた。
CFX-9850GC_PLUS_Display 

fx-9860GIIシリーズのメニュー画面を比較する。
CFX-9850GC_PLUS_Display fx-9860GII_SD_Display 
液晶のバックグランドが黄色みが強いことも視認性の悪さの原因だと感じる。
また、この3色カラー液晶は応答性が悪い。

なお、CFX-9850GC PLUSの液晶画面のサイズは、fx-9860Gシリーズと比較すると小さいことが分かる。
Disp_Size_9859GC_9860GII 



関数電卓としての性能 [2019/06/25 追記]
キーの種類と配置は、後継機のfx-9860Gシリーズと同じになっている。但し、[SHIFT] と一緒に押して選ぶ裏の機能やファンクションメニューの機能は fx-9860G よりは少なく、当然ながら後継機で進化しているわけだ 。

分数表示と演算精度
235÷658 を計算すると 0.3571428571 と表示される。計算制度は内部15桁で、後継機種 fx-9860Gと同じ。
ここで、[F↔D] キーを押しても 5/14 にはならない。ここは、後継機種 fx-9860Gと異なる。
最初に 235/658 と入力し [EXE] を押すと、5/14 と表示され、[F↔D] キーを押すと 0.3571428571 と表示が変わる。

複素指数関数
eπi を計算してみる。計算できれば答えは -1 になる。
Complex 
fx-9850GC PLUS では複素指数関数の計算ができず、演算エラー(Ma ERROR) になる。但し、複素数の加減乗除はできる。
後継機種の fx-9860G以降のモデルでは複素指数関数の計算に対応している。



搭載言語 (Casio Basic) の概要 [2019/8/18 追記]

追加されているBasicコマンドによりプログラムの可読性と機能が向上し、さらに GetkeyLocate が追加されているのでプログラムの自由度が向上している。さらに CFX-9850G よりも関数が追加されている。

主なコマンド
 - 入力:?→, Getkey
 - 出力:" ", , Locate
 - カラーコマンド:Orange, Green (" "とSketchコマンドにのみ有効)
 - 無条件ジャンプ:Goto / Lbl
 - 条件ジャンプ: (fx-4000P、7000G と同じ仕様)
 - カウントジャンプ:Isz, Dsz
 - 条件分岐:If / Then / Else / IfEnd
 - For ループ:For / To / Step / Next
 - Do ループ:Do / LpWhile
 - While ループ:While / WhileEnd
 - 制御コマンド:Break, Return, Stop
 - 比較演算: =,, >, <,,
 - 論理演算: And, Or, Not
 - 配列:無し
 - リスト:List (配列としても使える)
 - 行列:Mat (配列としても使える)、
初期化コマンド Dim が追加されている
 - 各種関数

但し、以下の要因により可読性が損なわれている。
 - Then / Else 直後の改行:Syn ERROR になる
 - 行頭での改行 (空白行):Sys ERROR になる

 主なグラフィック コマンド
 - グラフ設定:CoordOn/CoordOff, GridOn/GridOff,
        AxesOn/AxesOff, LabelOn/LabelOff
 - 座標系設定:ViewWindow,
        Xmax/Xmin/Xscl/Xfct, XdotYmax/Ymin/Yscl/
Yfct  Xdotが追加されている
 - 消去コマンド:ClrGraph, Cls
 - Sketchコマンド:Plot, PlotOn/PlotOff, PlotChg, PxlOn, PxlOff, PxlTest
          Line, F-Line, Vertical, Horizontal, Circle
 - 各種グラフコマンド

但し、Plot, PlotOn, PlotOff, PlotChg, PxlOn, PxlOff, PxlChg, Circle の詳細仕様は、後継の fx-9860G 以降とは異なる。CFX-9850GC PLUS ではこれらのコマンドのパラメータに X, Y を使うと誤動作する。X, Y は内部動作のために予約されていると思われ、これらのコマンドを実行すると予期せぬ値が X, Y に自動的に入力されてしまう。つまり、X, Y をパラメータに使ってはいけない。

後継機種である fx-9860G 以降 fx-CG50 までのグラフ関数電卓では上記のコマンド実行後に、それぞれのコマンドの詳細仕様に従った正しい値が X と Y に自動的に入力される。つまり、その詳細仕様を理解していれば上記のコマンドのパラメータに X, Y を使える。



プログラムの作成と実行
キーコード取得プログラム GETKEY を入力してみた。コマンドを入力するためのキー (キープレス) は、fx-9860Gシリーズや最新の fx-CGシリーズと全く同じだ。言語機能の基本仕様はこの機種の頃から固まっていることが分かる

ファイル名:GETKEY
Locate 1,1,"=== GET KEYCODE ==="
Locate 1,3,"KEYCODE ="
Locate 10,5,"HIT ANY KEY"
Locate 13,7,"[AC]:QUIT"
While Getkey
WhileEnd
Do
Do:Getkey→K
LpWhile K=0
Locate 9,3,"=   "
(スペース6個)
Locate 11,3,K
LpWhile


GETKEY 
[DEL]キーを押したところ、キーコード44が表示されている。
fx-9860Gシリーズや fx-CGシリーズと同様に、テキスト表示の範囲は21桁7行だ。

[AC]キーを押してプログラムを終了させると、画面下8行目に Break と表示される。
ここで、[EXE] を押すとプログラムが再起動し、もう一度 [AC] を押すとProgram List に戻らず RUNモードに切り替わる。
この仕様は、fx-9860Gシリーズや fx-CGシリーズとは異なる。完成したプログラムを繰り返し使うには便利な仕様だ。一方、プログラムを試してから修正する場合は面倒だ。RUNモードに戻った後、[MENU] を押して PRGMモードに移行して編集するプログラムを探す必要がある。

Program List には、プログラム名 (ファイル名) は入力した順序で並んでおり、アルファベット順になっていない。プログラムの数が多いと、編集あるいは実行したいプログラムを探すのが楽ではない。

CFX-9850GC PLUSProgram List でプログラムを探す最善の方法は、サーチ(検索)機能だ。Program List 画面で [F6] (▷) - [F1] (SRC) と押せば Search For Program 画面が現れるので、そこで探しているプログラム名の頭のアルファベットを押せば良い。すると同じ頭文字で始まるプログラム名が全て表示される。この機能は必須だ。

ところで、取扱説明書には、以下の記述がある。
Program_Manual_Note
繰り返し計算や複雑な計算を便利に実行するのが、プログラム機能の主目的だと考えれば、プログラム終了後に Program List 画面に戻らず、RUMモードになる仕様は、理にかなっている。



プログラムの編集 [2019/07/01 修正]
プログラム編集画面は、極めて使いにくい。

パソコンで文章を書く時は、通常は挿入モードで利用しているはずで、上書きモードは必要な時のみ切り替えて使うと思う。fx-9860Gシリーズや fx-CGシリーズでも、プログラム編集画面は常に挿入モードになっていて、必要な時に [SHIFT]-[DELL](INS) と押して上書きモードに切り替えて使う。

ところが、CFX-9850GC PLUS は、通常が上書きモードになっていて、[SHIFT]-[DELL](INS) を押して挿入モードに切り替える必要がある。一旦挿入モードに切り替えると、改行を超えない範囲でカーソル移動する限りは挿入モードが維持されるが、カーソルが改行を超えると上書きモードに戻ってしまう。改行から改行までを1行として認識し、その行内なら挿入モードが維持されるのは、ラインエディタの仕様をそのままマルチラインのエディタに持ち込んでると考えるのが妥当であろう。そのためマルチラインエディタとして編集の利便性が得られず残念な仕様と言える。

昔のプログラム電卓やポケコンで、区切り文字を使ってプログラムをズラズラと1行に書く時の仕様を、そのまま引きずっているのではないかと想像している。



プログラムの転送 [2019/08/15 追記修正]

PClink_9850GC_Plus2 PCリンク
3pin-USBケーブル (SB-88) と プログラムリンク ソフトウェア (FA-124) を使えばPCリンクや電卓の画面取得が可能になる。
3pin-USBケーブル (SB-88)
現在は製造中止品だが、takumako様により互換ケーブルが有償頒布されているので私はこれを利用した。
プログラムリンク ソフトウェア (FA-124)
カシオのサイトから無償ダウンロードできる。

 電卓間転送
3pin-3pinケーブル (SB-62) を使えば、3pin端子のあるグラフ関数電卓とプログラムの転送ができる。
3pin-3pinケーブル (SB-62)
まだ販売されているが、takumako様により互換ケーブルが有償頒布されている。SB-62 は fx-9860Gシリーズや fx-CGシリーズの国内正規版には標準添付されている。

PCへ転送されるファイルは CAT ファイル (拡張子 cat) だ。CATファイルには複数プログラムを格納できる。

ところで、電卓本体右下にある3pinコネクタには、防塵防滴用と思われるゴム製の "栓" が刺さっている。ある程度使われた中古品だとこれが無くなっているケースが多いのではないかと思う。



fx-9860Gシリーズからのプログラムの移植
以前作ったプログラムの入った fx-9860Gシリーズと CFX-9850GC PLUS を 3pinケーブル (SB-62) で接続し、プログラムを CFX-9850GC PLUS に転送する。次にプログラムを走らせ、エラーが出たら [◀] か [▶] キーを押すとエラーが発生したコマンドにカーソルが表示されている。そこでカーソルのある部分を修正できるので、移植作業は比較的楽だ。当然エラーが発生している原因と対策を知っておく必要がある。具体的には、以下で紹介しているので、参照ください。

テキストベース・プログラム
モグラ叩きゲーム
以前作ったアクションゲーム - "Whack-a-Mole(もぐら叩き)" を転送して、必要な変更を行ってから遊んでみた。ついでにトップ画面のタイトルをオレンジにしてみた。デフォルトはブルーになっている。
ここで転送して修正したプログラムファイルは、WHACKAMOWAMINPI の3つだ。
プログラムのダウンロード - ダウンロードした Whackamo.cat には上記3つのプログラムを含む
Whack-a-Mole_9850GC 

CFX-9850GC PLUS の処理速度に対応するために、WHACKAMO の冒頭にある変数A の初期化を 2→A と変更しただけで、ロジックは変えていない。他は CFX-9850GC PLUS の搭載言語の制限に合わせて、エラーが出なくなるように修正を行うだけで移植は完了する。搭載言語のこの制限と修正方法については後述する。

実際に遊んでみると、液晶のハードウェアとしての応答性が悪い割にはゲームとして遊べて、それほど悪い感じはしない。表示が始まってところで反応できるから、表示が完了するまでのタイムラグが問題にならないのだろうと思う。

キーコード取得プログラム
以前作ったキーコード取得プログラムを転送し、エラーが出なくなるように必要な修正を行って CFX-9850GC PLUS / fx-9750G 専用に変更した。
プログラムのダウンロード - Keycode.cat
GetKey_1 GetKey_2 
左:起動直後の画面、右:キーコード取得プログラム、[EXIT] キーを押してみたところ。

CFX-9850GC PLUSfx-9860Gシリーズ / fx-CG シリーズは、全く同じキーを備えており、キーコードも同一になっている。従って、CFX-9850GC PLUS 特有の修正を行えば、ロジックや数値を変更せずに移植が可能となる。

さて、このプログラムや上のモグラ叩きゲームで、アルファベットの小文字が表示されていることにお気づきだろうか?

CFX-9850GC PLUS
 本体では、プログラム編集画面で小文字アルファベットを入力する方法が見つからない。ところが、小文字を使ったプログラムを fx-9860Gシリーズから転送したら小文字が表示されているのだ。

システムには既に小文字フォントが準備されていて、コードさえ入力されればプログラムで使えるようになっている。fx-5800P も同じ事情で、CcEditor / CcLinker を使えば 小文字アルファベットやその他フォントが使える。

温度換算プログラム
以前作った温度換算プログラムを転送し、エラーが出なくなるように必要な修正を行った。
ここで、転送・修正したプログラムファイルは、TEMPCONV と IN の2つだ。
プログラムのダウンロード - ダウンロードした TempConv.cat には TEMPCONV と IN が含まれる
TempConv 

プログラムの構造、ロジックは全く変更せず、プログラムが正常に動作する。

和暦-西暦換算・年齢推定プログラム - あの人の歳は今いくつ?
以前作った 和暦-西暦換算・年齢推定プログラムを転送して、エラーを解消する変更を実施した。長押し判定のカウンタの初期値Lを実機の処理速度に合わせて30に変更した (プログラム冒頭に 30→L と変更)。
転送・修正したプログラムファイルは、YEARCONV、YRC、YRD、INPI の4つだ。
プログラムのダウンロード - ダウンロードした YearConv.cat には YEARCONV, YRC, YRD, INPI の4つが含まれる。
YearConv 

ある程度複雑な構造でも、CFX-9850CG PLUS 搭載言語の制限や欠点を理解すれば、移植できることが分かった。



CFX-9850GC PLUS でのプログラミング

プログラミング上の制限と注意点 - fx-9860Gシリーズ / fx-CGシリーズとの比較

空行 (改行のみの行) はSyn ERROR になる
 ※対策空行を削除する
 対策を実施すると、ソースコードが非常に見づらくなる。特にブロック構造を意識した分かりやすいプログラミングには困った仕様だ。幸いコメントアウト ' が使えるので、空行の代わりに
'== 
などと書けば良いが、ソースレベルでブロック構造を分かりやすく見るには空行はとても便利だ。それが出来ないのは発展途上の欠点だと敢えて申し上げたい。これは、昔の1行プログラミングの時代の影響を引きすっていると感じられる。

Then / Else の直後を改行すると Syn ERROR になる
 ※対策Then / Else 直後の改行を削除する
 対策を実施すると、ソースコードが見づらくなる。上の空行禁止を組み合わさると、If ステートメントが非常に分かりにくくなる。ソースレベルで、ブロック構造を意識した見やすいコードを書けないにのは困った仕様だ。
これも、昔の1行プログラミングの影響をまだ引きずっている結果だと感じられる。

ループ (While / Do) の2重構造で、内側のループと If の入れ子構造が共存すると IfEnd のところで Syn ERROR になる
 ※対策:外側のWhile / DoLbl / Goto に置き換える。Break が有れば新たに Goto ジャンプに置き換える
 対策を施すと、スパゲティ化の第一歩となり、分かりやすいブロック構造を意識したプログラミングの大敵だ。個人的には最大の問題と感じている。
このエラーは、上記の 温度換算プログラムと和暦・西暦換算・年齢推定プログラムをfx-9860GII から転送して発見した。
While / DoIf の構造制御のスタック管理に失敗しているバグと考えている。昔は Goto / Lbl しか無かったところに構造制御ステートメントを追加している過渡期に潜り込んだバグがまだ解消していないのだろう。
取扱説明書の第22章ライブラリー編に掲載されているサンプルプログラムでは、構造制御に While / Do を使ったものが無く、全て Lbl / Goto が使われていることから、この時点で While / Do の機能が不完全だったと考えている。 

出力 "" で内部カーソルが改行されない
 ※対策"" で内部カーソルの改行機能を当てにせず Locate で表示位置を明示的に指定する
"" はNOP (何もしない) 処理になっているかも知れない。
"" で内部カーソル行を制御しているプログラム (fx-5800Pfx-9860G 以降のグラフ関数電卓で正常動作しているもの) を転送した場合、CFX-9850GC PLUS では画面配置が崩れる。

行末に区切り文字 : があると Syn ERROR になる
 ※対策:行末の区切り文字 : を削除する
 対策を実施しても大きな問題はない。
区切り文字は改行と同じ内部実装になっていれば、空行でエラーになるのと同じ原因なのだろう。

カラーコマンドは " " 出力には有効だが、Locate 出力には無効 [2019/05/25 追記]
 ※対策:有効な対策はない。"" で内部カーソルが改行されないので Locate を " "出力に変更できないことが多いためだ。
 カラーコマンドには、Orange と Green がある。Orange "String" と書けば String がオレンジ色で表示される。
一方、Locate コマンドで出力する場合は、カラーコマンドを追加すると Syn ERRORになる。 

出力文字列に : を含む行を ' でコメントアウトすると Syn ERRORになる
 ※対策:機切り文字 : の直後に ' を付加する
この問題は、fx-9860Gシリーズや fx-CGシリーズにも残っており、カシオは操作マニュアルを修正して対応している。
詳しくは 楽屋裏 - Casio Basic コメントアウト '  のバグ を参照

出力文字列に : を含んでも Syn ERRORにならない
これは、後継機種の fx-9860Gの OS2.1 かそれ以前のバージョンではエラーになっており、OS2.04 以降で修正されており、この修正は fx-9860GIIfx-CG20、そして最新の fx-CG50 まで維持されている。それなのに fx-9860G よりも古い CFX-9850GC PLUS で同じエラーが発生するかと思えば、エラーにならないのは、面白い。
改行のみの空行や区切り文字が行末にあることを許すように変更した際に、新たにバグが入り込んだと推測される。細かいようではあるが、このような開発の苦労や経緯が透けてくるのは面白い。 

出力命令 " " では1文字ごとに出力する
"Strings" を実行するとタイプライターのように1左から1文字づつ出力される。一方 Locate 1,1,"Strings" を実行すると、文字列が一度に出力される。

fx-9860Gシリーズ以降の機種らの移植では、実装されていない関数やコマンドで Syn ERROR
 ※対策:使えるコマンドを使って別表現に変更する (当たり前ですね)
今回移植を試みたプログラムには一例として、RanInt#( があったので、それぞれ以下のように別表現にした。 
- RanInt#(1,9)Int(90Ran#÷10)+1 に変更
- RanInt#(1,3)Int(30Ran#÷10)+1 に変更
- RanInt#(0,9)Int(10Ran#) に変更

Do / While / For ループからの脱出に Dsz / Isz を使うと Syn ERROR になる [2019/06/30 追記]
 ※対策:ループを Lbl / Goto に置き換えるか、ループ脱出に Break を使う
この現象は、fx-5800Pfx-9860G 以降のグラフ関数電卓でも存在することが確認されている。
⇒ 楽屋裏 - Dsz にとるループ脱出 参照
カシオとのやりとりの結果、ループの後 (必ずしも直後でなくても良い) に Goto 0:Lbl 0 と記述することでこのエラーを回避できることが分かっている (詳細は上記記事参照)。ところが、CFX-9850GC PLUS では、この対処方法が効かない。



処理速度の比較

四則演算および関数計算

加算プログラム
加算 

プログラムを起動し、N に 1000 を入力して実行時間を計る。

CFX-9850GC PLUS のプログラム
fx7000G_source_adding_up_Isz2 AddTest_For 
繰り返しに Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。


数値積分プログラム
関数 

この通史積分は、とね日記 - 席初の手帳型プログラム関数電卓 CASIO FX-502P (1979), FX602P (1981) で取り上げられているものをそのまま使わせていただく。

プログラム起動し、分割数として 1000 を入力して、時効時間を計る。

CFX-9850GC PLUS のプログラム
FuncTest_Goto_9850 FuncTest_For_985 
クリア絵師に Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。

以前調べた結果と併せて、上記の計算速度のを比較結果を示す [2019/07/31 修正]
加算プログラム数値積分プログラム
機種実行時間比較実行時間 (秒)比較
FX-502P123.1 秒---1261.8 秒---
FX-602P111.2 秒1.1 倍716.5 秒1.8 倍
FX-603P37.8 秒3.3 倍166.2 秒7.6 倍
fx-4000P61.7 秒2.0 倍349.1秒3.6 倍
fx-4500P195.0 秒0.6 倍798.1 秒1.6 倍
fx-4800PA=A+126.3 秒4.7 倍114.3 秒11.0 倍
Isz A21.2. 秒5.8 倍109.4 秒11.5 秒 
fx-7000GA=A+120.7 秒5.9 倍146.1 秒8.6 倍
Isz A19.3 秒6.4 倍143.2 秒8.8 倍
CFX-9850GGoto20.9 秒5.9 倍98.3 秒12.8  倍
For9.2 秒13.4 倍84.3 秒15.0 倍
CFX-9850GC PLUS
Goto22.0 秒5.6 倍100 秒12.6 倍
For9.2 秒13.4 倍85.4秒14.8 倍
記念すべき FX-502P を基準に、速度が何倍になっているかも併せて示している。

Basicコマンドとして追加された For 文は効率化、高速化している。Basicコマンドは可読性向上だけでは無いことが分かる。併せて関数処理も高速化していることが分かる。但し、CFXシリーズ初号機である CFX-9850G よりは少し遅くなっている。インタープリター言語なので、コマンドが追加されたことが原因だと思われる。


グラフィックス描画
▶ ドット描画プログラム

fx-7000G のグラフィック画面が 95 x 63 ドットなので、それに合わせて CFX-9850GC PLUS でも 95 x 63 ドットを塗りつぶして処理速度を比較する。

fx-7000G のプログラム
fx7000G_Dot DOT_fx7000G  

CFX-9850GC PLUS のプログラム
Dot_Plot Dot_Pxl fx9850GC_Plus_Dot 
Plot を使うケース(左)と PxlOn を使うケースの2通りで処理速度を調べる。

PlotPxlOn
fx-7000G213 秒
CFX-9850G926.5 秒0.23 倍496.0 秒0.43 倍
CFX-9850GC PLUS901.1 秒0.24 倍929.1 秒0.23 倍

CFX-9860G と全く同じコードであるにも関わらず、CFX-9850GC PLUS では遅くなっている。
PxlOn によるドット描画は、CFX-9850G の2倍の時間がかかった。
fx-7000G と比べると、処理が4倍以上遅くなった。


画面更新プログラム
上で、画面へのデータ転送が処理速度のボトルネックになることが分かったので、頻繁に画面更新するプログラムを実行して、その処理速度を調べて比較することにする。

ところで Getkey コマンドの追加によりテンキーと[EXE]キーだけでなく、[AC]を除く全てのキー入力が検知可能になり、Locate コマンドの追加により任意の位置への出力が可能になったので、プログラムの自由度が大きく向上し、画面がスクロールしないプログラムを書けるようになった。画面がスクロールしないプログラムでは、画面更新速度は重要な評価ポイントになる。

出力画面は、テキスト画面とグラフィックス画面 (グラフ画面) の2つがあり、これらは同時に表示できない。そこでテキスト画面の高速更新プログラムとグラフィックス画面の高速更新プログラムを作成して評価に利用することにする。

CFX-9850GC PLUS で調べる。
以下は CFX-9850G の結果で、CFX-9850GC PLUS のデータを後日追加する。

グラフィックス画面更新プログラム - モンテカルロ法にょる円周率計算
fx9850GCplus_Montekar 
プログラムのダウンロード - Montecar.cat を電卓に転送する
プログラムの詳細はこちら
ランダムに500回点を打って出力するまでの時間を調べると、165.6 秒であった。

テキスト画面更新プログラム - ピタゴラス数の計算
CFX9860GCplus_Pytha 
プログラムのダウンロード - Pytha.cat を電卓に転送する
プログラムの詳細はこちら
ピタゴラス数500個を計算して結果を出力するまでの時間を調べると、294.3 秒であった。



プログラム電卓の系譜 [2019/08/15 追記修正]

CFXシリーズの最終機種である CFX-9850GC PLUS は、CFX-シリーズの初号機 CFX-9850G と同じ仕様の言語を搭載しているが、処理速度が遅くなっている。CFX-9850G よりも関数や機能が増強されているので多少処理が遅くなるだろうと思う。しかしグラフィックスのドット描画については、特に PxlOn の処理が倍程度遅くなっているのは意外であった、

さて、CFX-9850GC PLUS に搭載されたプログラミング言語は、CFX-9850G と同様に Baiscコマンドとして IfFor / While / Do / Getkey / Locate などが追加されているが、編集画面で考えながらコーディングするのは難しいと思う。

後継機種である fx-9860G では、搭載言語と編集画面の大幅な修正が行われた。この改良は、fx-9860G と同年に発売された fx-5800P にも反映されている。

編集画面については、FX-502P / FX-602P / FX-603P では、デフォルトで挿入モードになっており、必要に応じて 上書きモードに切り替える仕様になっている。ところが、その後の fx-3650Pfx-4000P シリーズ、fx-7000G シリーズ そして CFXシリーズの最終モデル CFX-9850GC PLUS に至るまで、デフォルトで上書きモードになっていた。

当時、欧米市場での競合であった TI の電卓でも84シリーズのような古くからある機種では上書きモードが主流であった (sentaro様による情報、コメント欄参照)。

ところが、2005年に発売された機種、fx-71Ffx-5800Pfx-9860G では、一斉に挿入モードに切り替わっている。プログラミングのできない関数電卓においても、fx-991MS まではデフォルトで上書きモードで、2005年発売の次機種 fx-991ES から挿入モードに切り替わっている (2005年1月の電卓総合カタログ参照。

[2019/07/01 追記]
コメント欄に情報をお寄せいただいたsentaro様によれば、SHARP製の関数電卓も以前は上書きモードだったが、2004年以降のモデルは挿入モードに変わっているとのこと。Casioとほぼ同時期に変更されているようだ。

sentaro様の考察によれば(コメント欄参照)、欧米、特に北米での学校販売ビジネスでしのぎを削っていた TI 機と使い勝手の異なる挿入モード機を一斉に投入するには、ビジネス上のリスクを伴う大きな判断があったに違いないとのことだ。私もそれに賛同する。その上で、一斉に挿入モードに切り替えたのは、グラフ関数電卓やプログラム関数電卓の将来の目標 / ビジョンがあったのではないかと私は想像している。それは計算補助のマクロ機能を超えて、より柔軟な一般的なプログラミングが可能な言語仕様を目指すことであった、と想像している。

LocateGetley コマンドの存在は、スクロールしないプログラムを可能にするが、これらのコマンドは CFXシリーズの初代 CFX-9860G に初めて追加された。CFXシリーズは、プログラム関数電卓、ポケコン、グラフ関数電卓それぞれで個別に開発が進んでいた搭載言語が、ようやく1つの方向性に収束し、Locate / Getkey コマンドを追加することで柔軟なプログラミングが可能になり、大きく進化した。3色限定とは言えカラー表示を可能にしたのも CFXシリーズの特徴であり、各種コマンドや関数を増強した最終機種 CFX-9850GC PLUS は、カシオ機搭載のプログラミング言語の歴史の重要な転換点を示しており、次世代Casio  Basic 登場前夜の記念すべきモデルと言える。

Casio Baisc は fx-9860G シリーズでさらに進化してゆく。



温故知新 - FX-502P / FX-602P / FX-603P
温故知新 - fx-4000P / fx-4500P / fx-4800P
温故知新 - fx-7000G
温故知新 - CFX-9850G
温故知新 - CFX-9850GC PLUS

温故知新 - fx-9860G
温故知新 - fx-5800P
温故知新 - fx-CP400
温故知新:番外編 - 関数電卓としての使い勝手



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


 


keywords: プログラム関数電卓、プログラミング、Casio Basic、CFX-9850GC PLUS

リンク集 | ブログ内マップ













関連記事

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

楽屋裏 - 構造化プログラミング

楽 屋 裏
e-Gadget

2014年09月28日 追記
2017年08月27日 追記
2019年08月21日 追記修正


CasioBasic入門」シリーズは、改めてキチンと勉強する良い機会になっています。CasioBasic入門12 で、構造化プログラミングについて、チラッと触れたのですが、改めて整理をしてみます。


50年くらい前、COBOLPL/IFORTRANPascal などの高級言語が使われるようになって、ソフトウェアの生産性と品質が向上してきました。時期を同じくして、ソフトウェアの需要が増加したため、生産性や品質の向上が追いつかなくなりました。それを「ソフトウェア危機」と呼び、なんとかしなければヤバイという時代がありました(当然私はリアルタイムでは知りませんが、プログラミング雑誌「C Magazine」 などを通して知っていました。

この当時は、アセンブリ言語がプログラミングの主流でした。この言語はプロセッサの動作に近い命令を記述するものなので、ジャンプ命令が非常に多く(gotoの嵐と言っても良い)、プログラムコードからプログラム動作を理解し解析することが簡単ではありません。プログラミングは工芸であり、匠の技の世界でした。作ってみて動かして、不具合が見つかったらそれを直すと言う方法では、生産性や品質の向上は容易に進みません。こういう背景の中、構造化プログラミングStructured Programmingと言う概念が出てきました。

プログラミングの匠が活躍していた時代に、生産性と品質の向上を目指した新しい考え方構造化プログラミングは簡単には受け入れられませんでした。パラダイムシフトの前には必ず旧来の考え方との激しい争いがあるのは、いつの時代でも同じですが、当時も大論争が勃発しました。それでも、世の中はより良いプログラムをより多く必要としていたわけで、それに応えてゆく必要はあり、それが新勢力と旧来勢力の共通目標ではあったのでしょう。ついに両者が歩み寄ることが出来ました。

私が調べる範囲では、その落としどころのきっかけを作ったのが、1974年に発表された Donald Knuth の論文 "Structured programming with goto statement" のようです。この説が最も説得力があり、現実的なように思われます。

ここに落ち着くまえには、2つの重要なポイントがあるとの指摘があります。

1966年にCorrad Boehmら から提案された「構造化定理」

これは、どのようなプログラムでも、下図に示すような、連結(Concatenation)、選択(Selection)、反復(Iteration)の3つで表現できると言う数学理論です(引用)。

構造化定理 

要するに、goto がなくてもプログラムを作れると言うことを言っています。それ以上でもそれ以下でもない、単なる数学理論です。この理論が出された時は「構造化定理」とは呼ばれておらず、goto使用禁止を唱える人たちによる命名と言う話もあります。さらに細かいことですが、ここでは「連結」を使っていますが、「順」、「順次」、「順接」と言う和訳も見られます。



1968年にEdsger Dijkstraが書いた書簡"Goto statement considered harmful"

これは、Association of Computing Machinery (ACM) に送られた書簡で、書簡のタイトルgoto文は有害である」通りに、極めてストレートにgoto文の使用禁止を主張するものです。goto文を使うと、プログラムは簡単にスパゲティ構造になり、これには異論の余地はありません。

これが大論争に油をそそいだようです。もうこうなると、どこまで行っても平行線、宗教論争の様相であったに違いないと私は思います。Boehmの構造化定理がいくら数学的に正しくても、それまで goto文を使ってプログラムを作っていたプログラマが、いきなり使うなと言われても、そう簡単に受け入れられるものではないことは想像に難くありません。

ネットで検索すると、今でもgoto論争を見ることができ、そこではダイクストラ (Dijkstra)の名前が必ずでてきます。それくらい根源に迫る劇薬のようなものなのだと思います。



このような歴史的背景があって、10年近くたってから出された Knuth の論文 "Structured programming with goto statement"「goto文を使った構造化プログラミングは、goto使用是非論争を一旦横に置き、大目標である生産性と品質の向上を達成する構造化プログラミングとは「読んで分かりやすいソースコードを書くこと」であり、非常時には goto もやむなし、と言う大人の議論だと思います。

私の主張: Gotoは用法・用量を守って使いましょう! を支持するものでもあります。

実際問題、2000~3000行の中規模のプログラムを作った経験(個人の趣味で1万行超えの大規模プログラムを作ることは滅多に無いでしょう)では、絶対に必要な時以外に goto文を使うと、あとで絶対に自分の首が絞まります。

私は、エラー処理や例外処理には goto を使っても良いと自分で決めています。この使い方は、goto のジャンプ先が、必ずエラー処理や例外処理になるので、むしろプログラムの流れが明確になる利点があります。

落としどころとして Knuthの論文が受け入れられた歴史的事実を知ることは、考え方に幅を与えるものと思います。今では、構造化プログラミングは空気を吸うくらい当たり前になっているのでしょう。普通にC言語を使えば、自然にこの手法になります。と言うのも、最近の高級言語 (最近のBasic を含む) は構造化プログラミング言語として作られているので当然なわけです。これらには例外処理専用のステートメントが準備されているものがありますが、内部的には goto を使っていて、外から見えないだけだと言えます

生業としてのプログラミング経験の無い私の目には、goto是非論争は子細なことのように映るのです。



Casio Basicは構造化プログラミング風言語

構造化プログラミングは、「読んで分かりやすいプログラムを書こう」という目標で、以下の方針でプログラムを作ることです。

1. 構造化定理に出てくる 1)連結、2)分岐、3)反復 に加えて 4)呼び出し のみで構成されるブロックを作る。

2. このブロックは出口と入り口が1つだけでなければならず、ブロックの連結でプログラムを構成する。

3.Goto はなるべく使わない。使う場合は、先へ進むGoto のみを使い、後戻りするGoto は使わない。


CasioBasicは、これらの感覚でコーディング可能です。

1) 連絡: 要するにプログラムが上から下へ動作する、実はこれは大切なこと

2) 分岐: If文や⇒命令があります。

3) 反復: Doループ、Whileループがあります。

4) 呼び出し: サブルーチンや関数の呼び出し。プログラム呼び出しの Prog コマンドがあり、関数電卓の機能を呼び出す多くの関数がある。

そして、プログラム記法として、処理内容別に「連結」で繋がるブロックを作ることが最も大切です。ブロックとは、複数の処理をまとめて区切り、出口と入り口が1つだけになるようにした機能のかたまりです、。

[2019年08月20日 修正] 
構造化プログラミングを行う手続き型言語の要件として、ユーザー定義の関数/ プロシージャがありますが、Casio Basic では仕様上これができません。つまり、サブルーチンに引数を渡したりサブルーチンから戻り値を返せません。これに付随してローカル変数(局所的変数)が使えず、変数は全てグローバル変数(大域変数)として扱われます。
言い換えると、大域変数を利用してサブルーチンとの間での値のやりとりが可能です。そこで、コーディングの工夫で関数やプロシージャのようなサブルーチンを作れます。この手法の一例としては、入力ボックス3桁区切り出力 を紹介しています。そこで Casio Basic は構造化Basic ではありませんが、Casio Basic は構造化プログラミング可能と言うこともあります。

現在の "新世代Casio Basic" は、構造化プログラミングを意識したコーディングができ、これは実際に分かりやすく効率的なコーディングに繋がります。現在連載している CasioBasic入門でも、キッチリと構造化Basic風プログラミングをしていて、連結で繋がるブロックのイメージを体験してもらいながら、処理の変更や追加を楽に行えることを紹介しています。

ちなみに 海外のみで販売されている fx-CP400 や fx-CG500 に搭載されている Casio Basicは、構造化Basicと言えます。構造化Basic ではないのですが、これが極めて使いにくいだけでなく、処理速度がかなり遅いものになっおり、実用プログラムを作って使おうという気にとてもなれない、中途半端なものです。さらなる進化が望まれます。
実用上は 構造化プログラミング風言語バージョンの Casio Basic の方が遙かに使いやすく、処理速度もグラフィックスプログラムを除けば十分速い仕様に、とてもうまくまとまっています。プログラミングが楽しめる言語と言えます。

なお、"新世代 Casio Basic では、使いやすくするために、Basicコマンドを導入する前の 各種ジャンプ命令をそのまま残していますが、それゆえに Goto コマンドの内部動作が複雑になっています。具体的には、多重ループとカウントジャンプの組み合わせで発生する異常動作対策のために Goto 0:Lbl 0 という記述を使います。詳しくは、
ここを参照 ください。
================


ちょっと脱線...

オブジェクト指向プログラミング

構造化プログラミングは30年以上も前に生まれたもので、今ではその問題点がハッキリしていて、それを解決するために考えられた「オブジェクト指向プログラミング」が主流になっています。

プログラムは、手続きとデータから成り立っています。

構造化プログラミングは、プログラムの流れの制御を構造化するもの、つまり手続きを管理するものです。しかし、データについては何も言っていません。プログラムの中の色々な局面で、データに自由にアクセスすると、データの管理が出来なくなります。goto文を野放しにすることで制御構造がグチャグチャになるのと同じことが、データ管理で起きます。これを何とかしよう、と言うのがオブジェクト指向なのです。

私自身は、Visual C++ を使ってきており、最近 C# を使い始め、オブジェクト指向プログラミングの経験だけはありますが、オブジェクト指向プログラミングについて正しくまとめられるかどうか自身がありません。ただその有効性と重要性は肌感覚として認識しているので、少し触れておこうと思います。

プログラムの中から自由にデータアクセスすると、問題が有ったときにプログラム内のどこで誤ったデータ操作をしたのかを見つけるのがかなり面倒になります。そこで、データへのアクセスを大幅に制限してしまおう、と言うのがオブジェクト指向プログラミングの根本にあります。

読み書きできるデータは変数なわけですが、その変数には大域変数(グローバル変数)と局所変数(ローカル変数)があります。大域変数とは、プログラム内のどこからでも自由にアクセスできるので、これが問題になります。

オブジェクト指向プログラミングは、大域変数を無くそうと言うものです。



話を戻して...

CasioBasicはオブジェクト指向ではない

CasioBasicにオブジェクト指向は関係ありません。変数は大域変数のみ、同じ変数に異なるプログラムからアクセスが自由に行える仕様です。CasioBasicには局所変数はありません。

GotoLbl で使うラベルの及ぶ範囲は、1つのプログラム内に制限されるのですが、まぁラベルは変数でないし、使えるラベルは英数字1文字に限られるので妥当な仕様です。

使える変数も極めて限られ、A~Z、そして配列変数Z[ ]のみです。頑張って管理するしかありませんし、管理しきれる範囲内と言えましょう。



ですから、CasioBasicを使う場合は、構造化プログラミングを行うのが最良の道と言うわけです。

見方を変えると、30年前の最新技術が、今や単4電池1本で何ヶ月も動作する電卓の中に詰まっているわけで、これは素晴らしいことだと思うのです。




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


 


keywords: fx-5800PCasioBasic構造化プログラミングプログラミング入門プログラム関数電卓

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

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

管理人からのメッセージ

更新 2019/08/09


2005年以降に登場したカシオのプログラム電卓に搭載されているプログラミング言語を "新世代 Casio Basic" と私は呼んでいます(但し海外専用モデル ClassPadシリーズは除く)。そもそも Casio Basic という言い方は私が勝手に言っているとばかり思っていたのですが、海外のカシオプログラム電卓のファンが既にCasio Basic と呼んでいました。WiKi Pedia には、Casio Basic のエントリーがあります。日本でググると Casio Basic はカシオの時計の名前だと分かります。

プログラミングは管理人の趣味の1つです。典型的な下手の横好きです。人生初のプログラミングは FX-502P で作ったゲーム。PCでの初めてのプログラミングは N88-BASIC、その後 MS-DOS や Windows で、Basic、C、C++ などでプログラミングを楽しんできました。最近は C# の味見をして 簡単な Windows アプリを作ってみました。

2007年のある日、fx-5800P を高性能な関数電卓として購入し、せっかくプログラミング機能が付いているのでチョット使ってみようと思ったのが Casio Basic との出会いでした。当時は電卓でプログラムを作る必要性を殆ど感じていませんでした。

PCでのプログラミング経験があるので、最初は Casio Basic の貧弱さに驚き、まあ電卓の言語なんてこんなものか、と思いました。キーボードを叩けば入力できるPCと違って、最初はコマンドの入力にも不自由しました。取扱説明書にはコマンドについて殆ど最低限のことしか書かれていません。PCでの Basic プログラミングの感覚で Casio Basic のコードを試しに書くと結構そのまま使えることが分かり、Casio Basic に興味を持ち、少し調べてみようと思った時、当ブログ e-Gadget を作りました。2013年10月のことでした。

今では、Casio Basic はよくできていると思います。構造化プログラミング風のコーディングが可能で、最も非力な fx-5800P で実用プログラムやアクションゲームを簡単に作れる程度の能力を持っていることは、意外に知られていません。当ブログでは実用プログラムやゲームを紹介しています。新世代 Casio Basic の搭載機種の間でプログラムの互換性が高いのも大きな利点です。電卓さえあれば、通勤電車の中でさえプログラミングできます。いつでもどこでもプログラミングできるのは電卓ならではです。なので当ブログの英語版コンセプトは "Anywhere Anytime Programming" だったりします。

新世代Casio Basic や、それを搭載した機種でのプログラム実行の利便性は、実際に使い込んで初めて分かると思います。換算プログラムや実用プログラムが作れるので、趣味だけでなく日々の仕事や生活に役立ちます。

この良さは、実際に使い込んで感じるもので、カタログや取扱説明書を読むだけでは分かりにくいと思います。1990年台のプログラム電卓からは大きく進化しています。古い情報による先入観で誤解したまま発信しているのをたまに見かけます。今やプログラム電卓は海外市場が主戦場なので、カシオ自身が日本語で情報発信していません。使い込んで初めてその良さに気付く現状は、ちょっと残念に思います。高級言語でのプログラミング経験者なら、高品質なプログラムが楽にスグ作れます。プログラミング初心者には、プログラミング導入に適していると思います。

当ブログ e-Gadget では、取扱説明書では絶対に分からない新世代 Casio Basic の使いこなしを中心にして、プログラム電卓に関する情報を発信しています。 

=====
[2018/08/02 追記]

fx-5800P 関連の話題:
fx-5800P の欠点はいくつかありますが、PCとリンクしてプログラムコードを保存したり電卓に転送できないので、プログラムを皆さんと楽に共有できす、これが最大の問題だと思っていましたが、現在では 可能になりました。ご興味があれば  "CcLinker" で検索してください。当ブログの紹介ページや CcLinker の作者によるオリジナルページがヒットします。

また、fx-5800P はカバーヒンジの作りが貧弱で簡単に壊れるという弱点もありますが、完璧確実で安く修理する方法があるので紹介しています。"fx-5800Pリニューアル" で検索すると記事がヒットします。

グラフ関数電卓の話題:
さて、fx-5800P よりも高価だけど能力の高いグラフ関数電卓も Casio Basic が使えて、fx-5800P との互換性が比較的高いことも確認済みです。fx-5800P よりもプログラムが高速動作しますが、グラフィックス描画は残念なくらい遅く、Casio Basic のグラフィックスコマンドはグラフ描画機能を活かすマクロコマンドの位置づけでしかありません。より高速で高機能なコマンドを使ってプログラミングしたいという目的で、アドイン版 Casio Basic の開発が継続しており当ブログでサポートしています。それは、C.Baisc というインタープリタですが、将来はコンパイラ版の C:Basic も登場する予定です。純正 Casio Basic の互換性をできるだけ保っているので、純正 Casio Basic プログラムが殆ど修正なしでかつ高速に走ります。また C.Basic 用新コマンドも多数追加され、かなり自由自在にプログラミングが可能になっています。fx-9860G 以降 fx-CG50 までのグラフ関数電卓に対応しています。

=====

当ブログを始めた時、Casio Basic だけのネタでここまで続くとは思っていませんでした。そこで、プログテーマとして電子小物を想定して、当ブログを e-Gadget と銘々しました。従って、PCや周辺機器、電子辞書やPDAなどの話題も備忘録も兼ねて記事にしています。


keywords: fx-5800P、 fx-9860GII、fx-9860GII SD、fx-CG20、fx-CG50、CasioBasic、プログラム電卓

関連記事

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

MOD( - コマンドリファレンス

Casio Basicプログラミング - コマンドリファレンス
<コマンドリファレンス・トップ>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2018/08/17
追記修正 2018/08/18


[純正 / C.Basic] [FX / CG]


MOD(




整数の剰余を計算する。

(書式) MOD(A,N)
整数 A を 整数 N で割った余りを返す。

(キープレス) [OPTN] [F6](▷) [F4](NUM) [F6](▷) [F4](MOD)

(例)
 MOD(7,3)
※ 7 を 3 で割った余り 1 を返す。

(例)
  14→A
  5→N
  MOD(A,N)→M
  Locate 1,1,"M="
  Locate 3,1,M
  ※ 14 を 5 で割った余り M = 4 を出力する。

(注意) A や N が負の整数の場合は、AN で割った余りにならない。
MOD_Schematic2  
AN が負の整数の場合は、上表から分かるように 0, 1, 2 が繰り返すような計算結果になる。

※ 取扱説明書には "除算を行った際の余りを求める関数" とあるが、必ずしも正しくない。
※ この仕様は Casio Basic 特有のもので、特定の処理では役立つが、自然数に限定して使うのが良いかも知れない。



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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング



関連記事

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

温故知新 - CFX-9850G

プログラム電卓 温故知新
 - 搭載プログラミング言語に注目して、プログラム電卓の変遷を考える -

 
2019/08/14
追記修正 2019/08/15
追記修正 2018/08/18


特定のカシオ製プログラム電卓に搭載されたプログラミング言語にスポットライトを当てて、過去から現在に至る仕様の変化を調べる。


4. Casio Basic 登場 - 可読性と機能の向上 (1)


今回は、fx-7000P シリーズ登場後 CFX-9850G に至る搭載言語の変遷を取り扱う。

1996年に発売された CFX-9850G には、Basic コマンドが追加されている。特に CFX-9850G の最大の特徴は LocateGetkey コマンドが初めて搭載された点にある。

ところで Casio Basic という呼称は、カシオが公式に使っているものではないが、欧米のプログラム電卓愛好家のコミュニティでは以前から使われている。当ブログでは、当初管理人が CasioBasic と呼んでいたが、その後海外のコミュニティで同じ名称が使われているのを知った。

但しそれらの海外のコミュニティにおいて Casio Basic の明確な定義が見当たらない。当ブログでは以前から、Basic風のコマンドが追加された搭載言語を "Casio Basic" と呼んでいる。それには LocateGetkey コマンドが追加されたもの (CFX-9850G が初)も含む。
次に、下記の条件を備えたものを "新世代Casio Basic" と呼んでいる。
 - Locate と Getkey を含んだ Basic コマンドが追加されている
 - 行頭の改行がエラーにならない
 - Then と Else 直後の改行がエラーにならない
以上が、当ブログでの定義だ。

今回は、"新世代" 前夜の "Casio Basic" に焦点を当てる。


Basicコマンドの追加

ネットで得られる操作マニュアルを調べたところ、最初にBasicコマンドが追加されたのは、1995年フランスで発売された GRAPH 20 (fx-9610aG) であり、世界市場で最初に Basicコマンドが搭載されたのは、1996年発売の fx-7400G であった。
  GRAPH 20 (fx-9610aG) の User's Manual 
 ▶ fx-7400G の User's Manual - Programming編
これらでは、If 文、For 文、Do 文、While 文、Break、Return、Stop が追加されている。 


Locate, Getkey の追加

カシオのプログラム電卓で、初めて Locate コマンドと Getkey コマンドが追加されたのは、1996年発売の CFX-9850G であった。

それまでの搭載言語では、入力できるのはテンキーと[EXE]キーのみ、文字列や数値の出力は " " コマンドや  コマンドで行うが出力位置は指定できなかった。ところが、Getkey コマンドが追加されたことで、[AC]キー以外の全てのキーの入力を個別に検知できるようになり、Locate コマンドが追加されたことで、出力位置を自由に設定できるようになった。これにより、画面がスクロールしないプログラムを書けるようになり、プログラムの自由度が格段に向上した。極めて大きな進化といえる。

CFX-9850G は、LocateGetkey が初めて追加された機種だ。カシオのプログラム電卓の系譜で重要なマイルストーンだ。CFX-9850G の系統には下記がある。
- CFX-9850G / CFX-9850G Plus / CFX-9850GA Plus / CFX-9850GB Plus (1996 1998)
- CFX-9950G / CFX-9959GB Plus (1996 - 2003)
- CFX-9850GC Plus
(2004 - 2010、2005年国内発売)


CFX-9850G
が発売された頃は、fx-4500Pfx-4800P が販売されていた。
1996年4月発行のカシオ電卓総合カタログ - CFX-9850G (国内では 1996年3月発売), fx-4500P, fx-4800P


Casio CFX-9850G

CFX-9850G_22GBのメモリに、プログラム領域26KBが含まれる。

CFXシリーズは、3色カラー液晶搭載のグラフ関数電卓で、デフォルトがブルーで、オレンジとグリーンを追加した3色が使える。実際の画面は、輝度も色もコントラストが低い。液晶を見る角度でコントラストや色合いが大きく変化するのも見づらさの原因だ。明るいところでは問題ないが、少し暗くなると見づらいと感じる。この3色カラー液晶は応答性が悪い。

CFX9850G_Display 

プログラムの転送
PClink_9850G_2 PCリンク
3pin-USBケーブル (SB-88) と プログラムリンク ソフトウェア (FA-124) を使えばPCリンクや電卓の画面取得が可能になる。
3pin-USBケーブル (SB-88)
現在は製造中止品だが、takumako様により互換ケーブルが有償頒布されている。
プログラムリンク ソフトウェア (FA-124)
カシオのサイトから無償ダウンロードできる。

 電卓間転送
3pin-3pinケーブル (SB-62) を使えば、3pin端子のあるグラフ関数電卓とプログラムの転送ができる。
3pin-3pinケーブル (SB-62)
まだ販売されている。takumako様により互換ケーブルが有償頒布されている。

ところで、電卓本体右下にある3pinコネクタには、防塵防滴用と思われるゴム製の "栓" が刺さっている。ある程度使われた中古品だとこれが無くなっているケースが多いのではないかと思う。


搭載言語 (Casio Basic) の概要
Basicコマンドが追加されたことでプログラムの可読性と機能が向上し、さらに GetkeyLocate が追加されたことでプログラムの自由度が向上している。

主なコマンド
 - 入力:?→, Getkey
 - 出力:" ", , Locate
 - カラーコマンド:Orange, Green (" "とSketchコマンドにのみ有効)
 - 無条件ジャンプ:Goto / Lbl
 - 条件ジャンプ: (fx-4000P、7000G と同じ仕様)
 - カウントジャンプ:Isz, Dsz
 - 条件分岐:If / Then / Else / IfEnd
 - For ループ:For / To / Step / Next
 - Do ループ:Do / LpWhile
 - While ループ:While / WhileEnd
 - 制御コマンド:Break, Return, Stop
 - 比較演算: =,, >, <,,
 - 論理演算: And, Or, Not
 - 配列:無し
 - リスト:List (配列としても使える)
 - 行列:Mat (配列としても使える)、
但し初期化コマンド Dim は適用できない
 - 各種関数
GRAPH20fx-7400G 以降で追加されたBasicコマンドを青色で示す
CFX-9850G で追加されたコマンドを赤色で示す

但し、以下の要因により可読性が損なわれている。
 - Then / Else 直後の改行:Syn ERROR になる
 - 行頭での改行 (空白行):Sys ERROR になる

 主なグラフィックス コマンド
 - グラフ設定:CoordOn/CoordOff, GridOn/GridOff,
        AxesOn/AxesOff, LabelOn/LabelOff
 - 座標系設定:ViewWindow,
        Xmax/Xmin/Xscl/Xfct, Ymax/Ymin/Yscl/
Yfct
 - 消去コマンド:ClrGraph, Cls
 - Sketchコマンド:Plot, PlotOn/PlotOff, PlotChg, PxlOn, PxlOff, PxlTest
          Line, F-Line, Vertical, Horizontal, Circle

但し、Plot, PlotOn, PlotOff, PlotChg, PxlOn, PxlOff, PxlChg, Circle の詳細仕様は、後継の fx-9860G 以降とは異なる。CFX-9850G ではこれらのコマンドのパラメータに X, Y を使うと誤動作する。X, Y は内部動作のために予約されていると思われ、コード上予期せぬ値が X, Y に自動的に入力されてしまう。つまり、X, Y をパラメータに使ってはいけない。

後継機種である fx-9860G 以降 fx-CG50 までのグラフ関数電卓では、上記のコマンドで X, Y を使える。書くコマンド実行後に、それぞれのコマンドの詳細仕様に従った正しい値が自動的に入力されるので、それを理解して X, Y をパラメータとして使える。


プログラムの作成と実行
キーコード取得プログラム GETKEY を入力してみた。コマンドを入力するためのキー (キープレス) は、fx-9860Gシリーズや最新の fx-CGシリーズと全く同じだ。言語機能の基本仕様はこの機種の頃から固まっていることが分かる

ファイル名:GETKEY
Locate 1,1,"=== GET KEYCODE ==="
Locate 1,3,"KEYCODE ="
Locate 10,5,"HIT ANY KEY"
Locate 13,7,"[AC]:QUIT"
While Getkey
WhileEnd
Do
Do:Getkey→K
LpWhile K=0
Locate 9,3,"=   "
(スペース6個)
Locate 11,3,K
LpWhile


Getkeycode_1 Getkeycode_DEL  
[DEL]キーを押したところ、キーコード44が表示されている。
fx-9860Gシリーズや fx-CGシリーズと同様に、テキスト表示の範囲は21桁7行だ。

[AC]キーを押してプログラムを終了させると、画面下8行目に Break と表示される。
ここで、[EXE] を押すとプログラムが再起動し、もう一度 [AC] を押すとProgram List に戻らず RUNモードに切り替わる。
この仕様は、fx-9860Gシリーズや fx-CGシリーズとは異なる。完成したプログラムを繰り返し使うには便利な仕様だ。一方、プログラムを試してから修正する場合は面倒だ。RUNモードに戻った後、[MENU] を押して PRGMモードに移行して編集するプログラムを探す必要がある。

Program List には、プログラム名 (ファイル名) は入力した順序で並んでおり、アルファベット順になっていない。プログラムの数が多いと、編集あるいは実行したいプログラムを探す最善の方法は、サーチ(検索)機能だ。Program List 画面で [F6] (▷) - [F1] (SRC) と押せば Search For Program 画面が現れるので、そこで探しているプログラム名の頭のアルファベットを押せば良い。すると同じ頭文字で始まるプログラム名が全て表示される。この機能は必須だ。


プログラムの編集
プログラム編集画面は使いにくい。
パソコンで文章を書く時は、通常は挿入モードで利用しているはずで、上書きモードは必要な時のみ切り替えて使うと思う。fx-9860Gシリーズや fx-CGシリーズでも、プログラム編集画面は常に挿入モードになっていて、必要な時に [SHIFT]-[DELL](INS) と押して上書きモードに切り替えて使う。

ところが、CFX-9850G は、通常が上書きモードになっていて、必要な時に [SHIFT]-[DELL](INS) を押して挿入モードに切り替える。一旦挿入モードに切り替えると、カーソルのある行内で挿入モードが維持されるが、カーソルが別の行に移ると上書きモードに戻ってしまう。


fx-9860Gシリーズからのプログラムの移植
以前 fx-9860Gシリーズで作ったプログラムを CFX-9850G に転送した。fx-9860Gシリーズは"次世代Casio Basic"を搭載しており、CFX-9850G への移植にはコードへの若干の手直しが必要だ。多くの場合はなんとかなるが、移植不可能、あるいは極めて困難なケースもある。

モグラ叩きゲーム
Whack-a-Mole_1 Whack-a-Mole_2  
fx-9860GII
で作ったアクションゲーム - "Whack-a-Mole(もぐら叩き)" は移植できた。トップ画面のタイトルをオレンジにしてみた。CFX-9850G の処理速度に対応するために、WHACKAMO の冒頭にある変数A の初期化を 2→A と変更しただけで、ロジックは変えていない。実際に遊んでみると、液晶の応答性が悪さは、さほど気にならない。
 Whack-a-Mole のダウンロード

キーコード取得プログラム
fx-9860GIIで作ったキーコード取得プログラムを移植した後、CFX-9850G 用になるよう表示を一部変更した。
 Keycode_1 Keycode_MENU 
左:起動直後の画面、右:キーコード取得プログラム、[MENU] キーを押したところ。

CFX-9850G は、fx-9860Gシリーズや fx-CGシリーズと全く同じキーを備えており、キーコードも同一になっている。
 Keycode のダウンロード

ところで、上記2つの移植したプログラムでは小文字アルファベットが表示されている。CFX-9850G 本体では、プログラム編集画面で小文字アルファベットを入力する方法が無いが、小文字を使ったプログラムを転送すると小文字が表示される。システムには既に小文字フォントが準備されていることが分かる。

プログラムリンクソフトウェアFA-124でCATファイルを開くとコードを編集できる。そこで出力文字列を小文字アルファベットに変更できる。変更後のCATファイルを保存し、CFX-9850G に転送すれば、プログラムで小文字アルファベットを表示可能になる。 



処理速度の比較

四則演算および関数計算

加算プログラム
加算 

プログラムを起動し、N に 1000 を入力して実行時間を計る。

CFX-9850G のプログラム
fx7000G_source_adding_up_Isz2 AddTest_For 
繰り返しに Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。


数値積分プログラム
関数 

この通史積分は、とね日記 - 席初の手帳型プログラム関数電卓 CASIO FX-502P (1979), FX602P (1981) で取り上げられているものをそのまま使わせていただく。

プログラム起動し、分割数として 1000 を入力して、時効時間を計る。

CFX-9850G のプログラム
FuncTest_Goto_9850 FuncTest_For_985 
クリア絵師に Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。

以前調べた結果と併せて、上記の計算速度のを比較結果を示す [2019/07/31 修正]
加算プログラム数値積分プログラム
機種実行時間比較実行時間 (秒)比較
FX-502P123.1 秒---1261.8 秒---
FX-602P111.2 秒1.1 倍716.5 秒1.8 倍
FX-603P37.8 秒3.3 倍166.2 秒7.6 倍
fx-4000P61.7 秒2.0 倍349.1秒3.6 倍
fx-4500P195.0 秒0.6 倍798.1 秒1.6 倍
fx-4800PA=A+126.3 秒4.7 倍114.3 秒11.0 倍
Isz A21.2. 秒5.8 倍109.4 秒11.5 秒 
fx-7000GA=A+120.7 秒5.9 倍146.1 秒8.6 倍
Isz A19.3 秒6.4 倍143.2 秒8.8 倍
CFX-9850GGoto20.9 秒5.9 倍98.3 秒12.8  倍
For9.2 秒13.4 倍84.3 秒15.0 倍
記念すべき FX-502P を基準に、速度が何倍になっているかも併せて示している。

Basicコマンドとして追加された For 文は効率化、高速化している。Basicコマンドは可読性向上だけでは無いことが分かる。併せて関数処理も高速化していることが分かる。


グラフィックス描画
▶ ドット描画プログラム

fx-7000G のグラフィック画面が 95 x 63 ドットなので、それに合わせて CFX-9850G でも 95 x 63 ドットを塗りつぶして処理速度を比較する。

fx-7000G のプログラム
fx7000G_Dot DOT_fx7000G  

CFX-9850G のプログラム
Dot_Plot Dot_Pxl Dot_9850 
Plot を使うケース(左)と PxlOn を使うケースの2通りで処理速度を調べる。

PlotPxlOn
fx-7000G213 秒
CFX-9850G926.5 秒0.23 倍496.0 秒0.43 倍

fx-7000G では Rangeコマンドで指定した論理座標系に従って Plot コマンドでドットを描画する。CFX-9860G では ViewWindowコマンドで指定した論理座標系に従って Plot コマンドでドットを描画する。

For 文は効率化・高速化されていることは上の例で分かっているが、ドット塗りつぶしプログラムでは CFX-9850G がかなり処理が遅い。グラフィック画面へのデータ転送に時間がかかっており、それがボトルネックになっていると考えられる。
fx-7000G の液晶は 95 x 63 = 5085 ドット、CGX-9850G は 127 x 63 = 6001 ドット、その差 2016 ドット。1ドット出力するたびに転送しているなら、CFX-9850G のグラフィック画面への転送は fx-7000G よりもデータが多いから転送が重い理由となり得る。 

CFX-9850G には、PxlOn コマンドが追加されている。このコマンドは左上が原点 (1, 1) の物理座標系でのドット描画コマンドであり、Plot よりは約2倍高速だ。PlxOn は論理座標系のように座標計算が不要なので高速になっていると考えられる。


画面更新プログラム
上で、画面へのデータ転送が処理速度のボトルネックになることが分かったので、頻繁に画面更新するプログラムを実行して、その処理速度を調べて比較することにする。

ところで Getkey コマンドの追加によりテンキーと[EXE]キーだけでなく、[AC]を除く全てのキー入力が検知可能になり、Locate コマンドの追加により任意の位置への出力が可能になったので、プログラムの自由度が大きく向上し、画面がスクロールしないプログラムを書けるようになった。画面がスクロールしないプログラムでは、画面更新速度は重要な評価ポイントになる。

出力画面は、テキスト画面とグラフィックス画面 (グラフ画面) の2つがあり、これらは同時に表示できない。そこでテキスト画面の高速更新プログラムとグラフィックス画面の高速更新プログラムを作成して評価に利用することにする。

第一弾として CFX-9850G で調べる。

グラフィックス画面更新プログラム - モンテカルロ法にょる円周率計算
MonteCar_9859 
プログラムのダウンロード - Montecar.cat を電卓に転送する
プログラムの詳細はこちら
ランダムに500回点を打って出力するまでの時間を調べると、165.6 秒であった。

テキスト画面更新プログラム - ピタゴラス数の計算
Pytha_9850 
プログラムのダウンロード - Pytha.cat を電卓に転送する
プログラムの詳細はこちら
ピタゴラス数500個を計算して結果を出力するまでの時間を調べると、294.3 秒であった。


プログラム電卓の系譜

1978年発売の FX-502P に搭載されたプログラミング言語はキーストローク型で、表示レジスタやメモリに直接アクセスして演算を行うことで効率の高い処理が行え、プログラムのサイズも小さく抑えられる。一方でコードの可読性はアセンプラに似て決して良くない。シリーズ最終の FX-603P は1990年に発売され、CPUの高速化、メモリの増強、シリアル通信機能とPCリンク機能などハードウェアが充実しており、2006年の生産中止までの16年間製造が続いた。この間ポケットコンピュータが市場に登場し消えてゆき、プログラム関数電卓が生き残ったのは興味深い。

fx-3000Pシリーズやfx-4000Pシリーズでは、大きく異なる2系統の言語を搭載された機種が発売された。これらはいずれもコードの可読性が向上している。シンプルな計算マクロ言語を搭載した機種も発売された。シリーズ最終の fx-4850P は1997年に発売され、CPUの高速化、メモリ増強(26KB)などバードウェアが充実し 2006年まで生産が継続された。ハードウェアデザインやソフトウェアメニューが fx-5800P に引き継がれたが、一方で fx-4850P に搭載されていた言語は主流とはならず、1985年発売の fx-4000P の搭載言語の系統がその後のグラフ関数電卓の主流となり、fx-5800P にも搭載されたのが大変興味深い。

世界初のグラフ関数電卓 fx-7000G が1985年に発売された。fx-4000Pシリーズの初号機 fx-4000P も同年に発売されている。fx-7000G はグラフ機能以外は fx-4000P と同一の関数電卓としての機能とキーレイアウト、そして同一の搭載言語を有しているのは着目すべきだろう。fx-7000Gfx-4000P が同時開発された可能性が考えられるが、それが偶然なのか意図的なのかは大変興味がある。

いずれにせよ、グラフ関数電卓初代の fx-7000G の言語系統がそのままグラフ関数電卓で発展してきている。これはネットで確認できるマニュアルを調べると明らかだ。1995年フランスモデルとして発売されたグラフ関数電卓 GRAPH 20、そして1996年に世界で発売された fx-7400G で初めてBasicコマンドが追加された。追加されたのは 条件分岐 (If) とループ (For, Do, While) 関連のコマンドで、処理効率の向上が図られた。また明らかにコードの可読性も向上した。 Casio Basic の登場である。しかし残念なことに、入力がテンキーと[EXE}キーに限定されており、出力位置もプログラムで制御できないものであった。

1996年に発売された CFX-9850G では、[AC]キー以外の全てのキーの入力を検知できる Getkey コマンド、そして任意の位置に出力できる Locate コマンドが追加された。このたかだか2つのコマンドの追加により、プログラムの自由度が飛躍的に向上した。大きな進化と言える。現行の最新機種 fx-CG50 や1つ前の fx-9860GII で動作するプログラムの多くが、CFX-9850G で動作するのは、その進化の大きさを示している。

但し CFX-9850G は、行頭に改行があると Syn ERROR となり、空行が許されない。さらに If 文で使う ThenElse の直後が開業だと Syn ERRORになってしまう。この残念な仕様のためコードの可読性が損なわれている。
それだけではなく、行列の初期化コマンドが無いので変数を用いた行列の初期化ができない、現行最新機種に搭載されている便利な関数が不足しているなど、まだ発展途上と言える。

なお、ドット描画コマンド Plot と PxlOn / PxlOff の詳細仕様が現行の最新機種とは異なり、理解できない動作をする。これについては調査継続中だ。



温故知新 - FX-502P / FX-602P / FX-603P
温故知新 - fx-4000P / fx-4500P / fx-4800P
温故知新 - fx-7000G
温故知新 - CFX-9850G
温故知新 - CFX-9850GC PLUS

温故知新 - fx-9860G
温故知新 - fx-5800P
温故知新 - fx-CP400
温故知新:番外編 - 関数電卓としての使い勝手



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


 


keywords: プログラム関数電卓、プログラミング、Casio Basic、CFX-9850GC PLUS

リンク集 | ブログ内マップ













関連記事

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

コマンドリファレンス - Casio Basicプログラミング

Casio Basicプログラミング - コマンドリファレンス・トップ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2018/01/09
追記修正 2019/08/17


純正Casio Basic と C.Basic に共通のコマンドがあり、C.Basic で純正コマンドを拡張したものがあり、さらに C.Basic 独自のコマンドがある。

入力コマンド


出力コマンド
 [純正 / C.Basic] [FX / CG] Menu

制御コマンド
 [純正 / C.Basic] [5800 / FX / CG] If ステートメント
 [純正 / C.Basic] [5800 / FX / CG] For ステートメント
 [純正 / C.Basic] [5800 / FX / CG] While ステートメント
 [純正 / C.Basic] [5800 / FX / CG] Do ステートメント
 [純正 / C.Basic] [5800 / FX / CG] Prog
 [純正 / C.Basic] [5800 / FX / CG] Return
 [純正 / C.Basic] [5800 / FX / CG] Break
 [純正 / C.Basic] [5800 / FX / CG] Stop

 [C.Basic] [FX / CG] Switch ステートメント
 [C.Basic] [FX / CG] ElseIf
 [C.Basic] [FX / CG] Gosub



 [C.Basic] [FX / CG] Local
 [C.Basic] [FX / CG] ACBreak

文字列
 [純正 / C.Basic] [FX / CG] + (文字列結合)
 [純正 / C.Basic] [FX / CG] StrJoin( 
 [純正 / C.Basic] [FX / CG] StrLen(
 [純正 / C.Basic] [FX / CG] 
StrCmp(
 [純正 / C.Basic] [FX / CG] StrSrc(
 [純正 / C.Basic] [FX / CG] StrLeft(
 [純正 / C.Basic] [FX / CG] StrRight(
 [純正 / C.Basic] [FX / CG] 
StrMid(
 [純正 / C.Basic] [FX / CG] Exp▸Str(
 [純正 / C.Basic] [FX / CG] Exp(
 [純正 / C.Basic] [FX / CG] StrUpr(
 [純正 / C.Basic] [FX / CG] StrLwr(
 [純正 / C.Basic] [FX / CG] StrInv(
 [純正 / C.Basic] [FX / CG] StrShift(
 [純正 / C.Basic] [FX / CG] StrRotate(

 [C.Basic] [FX / CG] ToStr(
 [C.Basic] [FX / CG] StrChar(
 [C.Basic] [FX / CG] StrCenter(
 [C.Basic] [FX / CG] Hex(
 [C.Basic] [FX / CG] Bin(
 [C.Basic] [FX / CG] StrRepl(
 [C.Basic] [FX / CG] 
Sprintf(
 [C.Basic] [FX / CG] 
文字列変数 Str

座標変換
 [純正 / C.Basic] [FX / CG] Pol( / Rec(

関数
 [純正 / C.Basic] [FX / CG] MOD(


グラフィックス


行列



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


 


keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

リンク集 | ブログ内マップ




関連記事

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

fx-5800P で Mod を使いたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2015/06/12
修正 2018/08/17

[純正] [5800P]
fx-5800P で整数の割り算の余りを求める Mod 関数を使いたい。



カシオのグラフ関数電卓 fx-CG50 / CG20 や fx-9860GII などに実装されている Mod 関数が、fx-5800P には無い。そこで、fx-5800P のプログラムで Mod 関数と同じ機能を実装する。


fx-9860GII などのグラフ関数電卓の Mod 関数
Mod は剰余を得る関数。fx-CG50 / CG20 や fx-9860GII では、1373 で割った余りは、Mod (137,3) で得られる。整数を格納した変数 AN を用いて、Mod (A,N) とすれば、AN で割った余りが求められる。


fx-5800P で Mod 関数と同じ機能を実現する
正の整数 A を 正の整数 N で割った時の商 Q と余り M は、以下の関係になる。

A = QN + M  ・・・(1)

一方、商 Q は以下のように現せる。

Q = Int(A÷N)  ・・・(2)


式(2) の Int( ) は、小数点を以下を切り捨てた結果の整数を求める関数だ。
式(2) を使って、式(1)の Q に代入すると、

A = N・Int(A÷N) + M

従って、式を変形して、余り M は以下の式(3)で現される。

M = A - N・Int(A÷N)   ・・・(3)


fx-5800P では、Mod(A,N) の代わりに以下の記述をすれば良い;

A-NInt(A÷N)

[2019/08/17 修正]
但し、Casio BasicMOD(A, N) と同じ動作とするには、A ≧ 0、N ≧ 0 (A, N0以上の整数) が前提条件となる。




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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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

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

最新記事
検索フォーム
最新コメント
カテゴリ
C# (3)
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

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


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

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR