今回は、新たに設計したオリジナル極小CPUコアSamarium用のBlockly開発環境の立ち上げを主題とします。
スタックマシンのプログラミングは、引数をスタックへ積んで、演算して、スタックへ積まれた結果を取得する、この繰り返しです。
汎用レジスタマシンなら、「今、何のレジスタに、何の値を入れてあったっけ?」を気にしながらプログラムして行く事になります。
一方、スタックマシンの場合には、「今、何の値が、何の順番でスタックへ積まれているのだっけ?」を気にしながらプログラムしなくてはなりません。また、スタックへ複数のデータを積んでも、直近の演算や処理に使用できるのはスタックトップの2値だけ、と言う制約が課されています。
最終的な目的に向かって、何の値を何の順番でスタックへ積んで行くのが最適なのか考えながらプログラムするのは、慣れてくるとパズルみたいで楽しい作業です。しかし、本格的なプログラミングを始めると、さすがに「パズル」を楽しむ余裕は無くなり、スタック操作が面倒に思えてきます。
スタックを操作しながら組み上げるプログラムは、良い頭の体操になるのだけど、それ故に、コーディングに頭を使いたくない向きには苦手とされそうです(パズルがお嫌いな方もいるでしょうしね)。
プログラミングした結果、動かしてみると想定した動作とならず、デバッグに時間を要してしまう場合も少なくありません。
この様に、スタックを駆使したプログラミングには癖があり、人によってはアセンブラでのプログラミングに難があると予想されます。Blockly開発環境は、その課題を解決しようとするものです。
名付けて、Blockly for Samariumを、なるべく手をかけずに立ち上げていきたいと思います。Moscovium用のBlockly開発環境、Blockly for Moscoviumが完成しているので、その環境で作成したプログラムを、Samarium用のアセンブラソースリストに変換するスクリプトを新たに起こすのが近道だと考えました。
Blockly.XML→Samarium.ASM変換スクリプト(blky2sama.olv)を作成します。
このスクリプトも、Moscovium用のBlockly.XML→Moscovium.ASM変換スクリプト(blky2mcvm.olv)が存在しているので、それをベースとしてSamarium用にアセンブラ出力内容を変更することが最短経路だと考えました。
しかし、ランタイムライブラリは、そうは問屋が卸してくれません。
変換スクリプトはランタイムライブラリを前提として、変換したアセンブラソースリストを出力してくるので、全てのランタイムライブラリをSamarium用に移植するなり、作成し直すなりする必要があります。
これは、シンドイ。
そこで、Blockly for Samariumは、Blockly for Moscoviumのサブセットとして、ランタイムライブラリの整備が不必要な、基本的ブロックに限定して適応する事にしたいと思います。
サブセット: Blockly for Samarium << Blockly for Moscovium
※サブセットかつ前方互換なので、Blockly for Samariumで開発したプログラムは、Blockly for Moscoviumで使用可能です。ただし、インラインアセンブラasmブロックでSamariumの命令コードを使った場合は、この限りではありません。
一般的なC言語開発環境になぞらうと、「ライブラリ支援の無い、裸のCコンパイラ」が、Blockly for Samariumに相当するとお考え下さい。
Blockly for Samariumは最適化無しのアセンブラ変換ですが、裏返すと、腐っても「コンパイラ」であるため、必要な関数はBlocklyで記述してしまえば良いのです。
※多くのBlockly処理系は、PythonやJavaScript等、インタープリタ方式処理系のソースリストに変換されるので、一般に処理速度が遅いです。M5StickC PlusのUIFlow(Pythonインタープリタ)と、Blockly for Moscovium(コンパイラ)の圧倒的な速度差については、こちらの記事をご覧ください。
この割り切りによって、用意すべきランタイムライブラリの規模が一気に縮小して、導入障壁🧱が下がりました。
確かに、Blockly for Moscoviumの様にライブラリ支援があれば、用意されたブロックを組み立てるだけで色々な機能にアクセスできて便利ですが、そもそも、そう言う物が必要な用途にはMoscoviumを使ったら良いのです。
敢えてSamariumを使うケースであれば、最小のランタイムライブラリでコンパイルされ、オブジェクトコードも極小となる、Samariumの魅力を際立たせる方が有効だと考えました。
しかも、ランタイムライブラリの最小化によって、CPU以外のリソースを必要としないアセンブラソースリストを出力することができます。高機動アセンブラとして、アセンブラの代わりに使用可能なBlocklyである事も特徴となるでしょう。
※昔、8ビットパソコン(FM-7)のCコンパイラ(Draco-C)を入手して、UNIXのライブラリ関数仕様を横睨みで同等の関数をC言語で記述していた時代を思い出します(1=−=)oO。
Blocklyのワークスペースは、Moscovium用のワークスペース(下図)をそのまま使って「も」良いと思います。

しかし、前節の検討に従った割り切りによって、ライブラリ支援の無いブロックをうっかり使ってしまうと、変換スクリプトがエラーを発生することになります。コンパイルの段階まで進んでからエラーを見て、「しまった」と、Blocklyワークスペースに戻るのは非効率です。
Samarium用に使用可能なブロックだけを残したワークスペースを起こした方が良いでしょう。
Blockly for Moscoviumでは、RAM領域、または命令RAM(I-RAM)領域に変数領域とスタック領域を割り当てていました(下図およびリンクを参照)。

Moscoviumの場合、命令RAM搭載の有無などがオプションだったため、変換オプション(@var_iram@/@stk_iram@)で設定して、各領域の割当先を設定していました。
Samarium搭載マイコンでは、命令RAMの搭載が必須なので、変換オプションによらず命令RAMに変数領域を設定します。上図の(3)および(4)に相当します。ただしBlockly for Samariumには、スタック領域が存在しません(CPU内蔵スタックがあるため)。
また、多コア版の命令RAMは、各CPUコア毎に独立したインスタンスを参照しているため、他のCPUとデータを共有するにはRAM領域を使います。これも、上図(3)および(4)と同じです。
※もし、Blockly for Moscoviumと、Blockly for Samariumの両方で正常動作するプログラムを記述しようとする場合は、こちらの「R6相対」に留意してください。必要に応じて、「r6+演算子」を使用するなどの対応が必要となります。
以下にBlockly for Samarium開発環境を構築する手順を記します。
Blockly for Samarium開発環境構築手順:
code\index_sama.htmlを開くと、以下の様なSamarium用のワークスペースが開きます(エンジョイ)。

上図の通り、Blockly for Moscoviumのワークスペースと比べて、「Standard」より下方のカテゴリがごっそり無くなっています。文字列(Text)もサポートされないので、「Text」カテゴリも消えています(※)。残ったカテゴリの中身も、一部の非対応ブロックが表示されない状態になっています。
Blockly for Samariumは、Blockly for Moscoviumのサブセットであり、従って、Blockly.XML→Samarium.ASM変換スクリプトも、サブセットのブロックだけを変換できるようにプログラムされているため、変換スクリプトのサポートが無いブロックは消去してあります。
ただし、残ったブロックの中にもドロップダウンリストなどの一部に、選択してしまうと変換スクリプトがエラーを発生するものが残っています。その様な一部のブロックのために、わざわざ別なカスタムブロックを起こす事はしなかったので仕様制限です。エラーが発生する項目などについては、使いながら学習してくださいm(1__)m。
※Textブロックは使えませんが、C言語にだって「文字列型」という型は存在しないのと同様に、Blocklyでも同様な方法(メモリ空間へのバイトアクセス等)で実装可能です。
無くなってしまったブロックで使いたい機能がある場合は、自分で直接I/Oレジスタを叩くなどしてプログラムするんです。上のワークスペース画像にも、Arduinoのdelay()関数に相当する、delay手続きの定義が見切れていますよね?こんな感じで、自分で1から作り込んで行くんです。
楽しいねぇo(1^−^)o。
Samarium用の変換スクリプトを以下にリンクしておきます。
Blockly.XML→Samarium.ASM変換スクリプト:blky2sama.olv
ランタイムライブラリ:blky2sama.incl
※スクリプト(.olv)を実行するには拙作Olive+をWindowsにインストールしてください。
ランタイムライブラリは、システム要件チェックやシフト乗・除算サブルーチンなど、最小限となっています。
コンパイル(変換・アセンブル)手順は、こちらのMoscovium版と同様です。変換スクリプトとアセンブラを、各々Samarium用(blky2sama.olvおよびasm_sama.olv)に読み替えてご参照ください。
各ブロックの機能などについて記したマニュアルも、同様に「Blockly for Moscoviumマニュアル」を参照してください。
なお、変換オプションの中に、Blockly for Samariumで設定するとエラーを発生するものがあります。以下、ご確認ください。
設定するとエラーとなる変換オプション:
Blockly for Samariumが対応している変換オプションは、以下の通りです。
上に記載の無い変換オプションは、指定しても無視されます。
三三七拍子でLチカするプログラムをBlocklyで作成しました。以下リンクよりご確認ください。
実験用プログラム:sama_blink_337.bxml
参考JavaScript風変換結果:sama_blink_337.js
上のプログラムでは、Arduinoコアライブラリでお馴染みのdelay()関数やdigitalWrite()関数などをBlocklyで記述してあります(ご参考)。
Cmod A7ボード(FPGA)にSamariumマイコン(SMOC062TF66L8等)を書き込み、上のプログラムを転送すると、以下動画の様にオンボードLEDが光ります。
※別な機会に撮影した時の動画(使い回し)ですが、見た目は、ほとんど変わらないと思われます。
プログラムのコンパイル(変換・アセンブル)手順は、こちらです。デザインデータへのアクセスや、Cmod A7ボードへの書き込み方法などは、こちらを参照してください。
オリジナル極小CPUコアSamariumが故に、Blockly開発環境も、サクッと極小の労力で構築して見ました。しかし、Blockly for Samariumの潜在能力は、極小どころか「極大」であると信じています。


