公開日:2024/08/31
31st Season
#31-6 Moscoviumの開発環境(付録)
このページは、本HPで作成したオリジナル16ビットCPUコアMoscoviumをBlocklyで開発するための、Blockly.XML→Moscovium.ASM変換スクリプトマニュアルです。
詳細については、以下リンクから本文を参照してください。
本文へ戻る。
Blockly.XML to Moscovium.ASM translator Manual
概要
オリジナル16ビットCPUコアMoscoviumのプログラムを、Blocklyで開発できる様になりました。
Google Blockly公式HP(別ウインドウが開きます)
Blocklyは、Google社が提供する、グラフィカルにブロックを組み上げることでプログラムを開発できる、ビジュアルプログラミング開発環境です。
Blocklyデモ
Googleが配布するBlocklyデモに、Moscovium用のカスタムブロックを追加した環境で、プログラム開発が可能です。Blocklyデモ+Moscovium開発環境の構築方法については、こちらをご覧ください。
上図で「Code Editor」リンクの先が、Blocklyエディタです(下図)。
プログラムを作成したら、「XMLタブをクリック ⇒ XMLデータを全選択 ⇒ コピー ⇒ テキストエディタに貼り付け ⇒ セーブ」等の手順で保存が可能です。
保存したXMLデータは、逆の手順で読み込み可能な他、Blockly.XML→Moscovium.ASM変換スクリプトによって、Moscovium用のアセンブラソースファイルへ変換することができます。
変換スクリプトはこちらからダウンロード可能です。
変換手順
Blockly.XMLからMoscovium.ASMソースリストへの変換は、いたって簡単です。
アセンブラ言語に比べて抽象度の高いBlocklyを使ってプログラムを組むことができるのは、大きな優位となるはずです。
変換スクリプト
以下リンクよりダウンロードしてお使いください。
変換プログラム:blky2mcvm.olv
ランタイムライブラリ:blky2mcvm.incl
※スクリプト(.olv)の実行には拙作Olive+をWindowsにインストールしてください。
拡張子OLVファイルはBlockly.XML→Moscovium変換スクリプト、INCLファイルはMoscoviumマクロアセンブラでアセンブルする時に必要となる、ランタイムライブラリです。
設計データ
Cmod A7ボード(FPGA)用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。
Blockly.XML→Moscovium.ASM変換スクリプトやマクロアセンブラなども、GitHubのデータに含まれます。
※本HPの設計データは全て、「サポート無し、無保証」であることを前提としています。ご承知の上、ご活用ください。
変換に対応したブロック
各ブロックについて、引数の省略は不可です。引数に対しては、必ず、何らかの値を設定してください。適切なブロックが設定されることで、対応するアセンブラソースリストが出力されるため、引数を省略すると、意図した動作には、なりません。
同様にifブロックなど、ステートメント(do)の内容が省略不可の場合があります。
基本的ブロックの動作について、以下に説明します。
Logic: |
- ifブロック
- 歯車アイコンをクリックすると、else ifやelse等の組み合わせを指定可能です。
- if/else if/else等の処理内容(do)を空にすると、エラーになります。
- 比較ブロック
- 数値または、文字列の比較を実行します。
- 数値比較の場合、コメント中に指定する変換オプションによって、符号付整数比較"@int@"または、浮動小数比較"@float@"、を実行します。
- 2数共、符号付整数型あるいは浮動小数型と見なしますので、揃えて使ってください。
- 浮動小数比較では、比較結果がNaNにならないことを確認してください。
- 論理演算ブロック
- 複数の比較結果などを組み合わせることができるブロックです。
- AND/OR論理演算を選択できます。
- notブロック
- false/trueブロック
- 真理値false/trueを指定可能なブロックです。
- testブロック
- test引数を評価した結果、
- 真ならif true引数、
- 偽ならif false引数、
- 返す値は、数値(符号付整数または浮動小数)です。
|
|
Loops: |
- repeatブロック
- doに指定したプログラム列を指定回数(符号付整数)繰り返すループです。
- repeat while/untilブロック
- 指定した条件が真(true)の間、実行し続けるwhileループ、
- または、指定した条件が偽(false)の間、実行し続けるuntilループです。
- count withブロック
- 指定した変数をfrom値からto値までby値ずつ増加しながら実行するループです。
- break/continueブロック
- ループ内から抜けたり(break)、ループの先頭に戻ったり(continue)する、ループ制御ブロックです。
|
|
Math: |
- 数値ブロック
- 数値を指定可能なブロックです、
- 0xa1等の16進数値も入力可能ですが、自動的に10進数値に変換されてしまうようです。
- こちらの定数ブロックも、ご活用ください。
- 数値演算ブロック
- +(加算)/−(減算)/×(乗算)/÷(除算)の、各数値演算を実行します。
- コメント中に指定する変換オプションによって、符号付整数演算"@int@"または、浮動小数演算"@float@"、を実行します。
- 2数共、同じ型(符号付整数型あるいは浮動小数型)と見なしますので、揃えて使ってください。
- is even/odd/positive/negativeブロック
- 引数を符号付整数と見なして、偶数(even)または、奇数(odd)、正数(positive)、負数(negative)の時にtrueを返すブロックです。
- 条件を満たさない場合、falseを返します。
- 上に挙げた以外の条件を指定したり、浮動小数モード"@float@"で実行するとエラーとなります。
- remainderブロック
- 剰余算を実行します。
- 浮動小数の剰余算(%)は、A%B=A−fdown (A÷B)×Bと定義します。
- ここで、fdown()関数は、引数をゼロ方向の整数へ丸める関数です。
- 尚、実行後、商(除算結果)が汎用レジスタR2に保持されています。
- constrainブロック
- 引数Xを、low値からhigh値までの間に制限して返します。
- X≦lowの場合、lowを返します。
- X≧highの場合、highを返します。
- それ以外の場合、そのままXを返します。
|
|
Text: |
- 文字列ブロック
- create textブロック
- 引数を文字列と見なして、順番に連接して返すブロックです。
- 引数に数値が渡された場合、符号付整数と見なして文字列に変換後、連接します。
- 歯車アイコンをクリックすると、引数の数を増/減することができます。
- 本ブロックを入れ子にすることはできません。
- 文字列変数へセットする場合、本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
- append textブロック
- 文字列型変数に格納された文字列の最後尾に文字列引数を追加します。
- C言語標準関数では、strcat()関数に相当する動作となります。
- 本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
- lengthブロック
- 文字列引数の長さ(文字数)を返します。
- C言語標準関数では、strlen()関数に相当する動作となります。
- is emptyブロック
- 文字列引数が空文字列("")だった場合、trueを返します。
- それ以外の場合にはfalseが返ります。
- printブロック
|
|
Variables: |
- Create variable...
- 新規変数を宣言します。
- 全ての変数はグローバル変数です。
- setブロック
- 指定した変数に値を設定するブロックです。
- 文字列変数を使う場合、必ず最初に空文字列("")の代入を実行してください。
- 一度、文字列型に設定した変数は、一貫して文字列型として使用してください。
- 文字列変数へセットしようとする場合、本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
- changeブロック
- 数値変数の値に、引数を加算するブロックです。
- 引数が正なら加算、負なら減算となります。
- 変数参照ブロック
- 変数値を参照するブロックです。
- 全ての変数はグローバル変数です。
|
|
Functions: |
- 手続きブロック
- 手続きを作成するブロックです。
- 歯車アイコンをクリックすると、引数変数を指定可能です。
- 引数変数もグローバル変数です。
- 引数変数は、数値型です。
- 関数ブロック
- 関数を作成するブロックです。
- 歯車アイコンをクリックすると、引数変数を指定可能です。
- 引数変数もグローバル変数です。
- 引数変数は、数値型です。
- 返す値は、数値(符号付整数または浮動小数)です。
- if returnブロック
- 引数の値が真だった場合、return値を返して、関数または手続きから戻ります。
- 引数の値が偽だった場合、何もせず、次のブロックに制御が移ります。
- 手続きまたは関数の、外部では使用できません。
|
|
Moscovium用カスタムブロック
Moscovium用に拡張したカスタムブロックの動作について、以下に説明します。
変換オプション
Blocklyエディタの「右クリック ⇒ Add comment」で追加できるコメント中に、変換オプションを指定することができます。
以下に、変換オプションの仕様を示します。
変換オプション仕様:
- Blocklyのコメント(<comment>〜</comment>)中にテキストで指定します。
- ブロックの「右クリック ⇒ Add comment」で追加できるコメントです。
- "@"<translator_options>"@"
- コメント中の"@"から"@"までの間が変換オプション<translator_options>です。
- 1つのコメント中、最初に見つかった"@"〜"@"が有効です。
- <translator_options>=<translator_option>[","<translator_option>[","……]]
- カンマ(,)で区切って、複数の変換オプション<translator_option>を指定可能です。
- <translator_option>=
- "Mc": Moscovium 16ビットモード
- Moscovium/Moscovium-SS/Nihonium/Nihonium-SSで動作可能なアセンブラソースリストを出力します。
- "Nh": Nihonium 32ビットモード
- Nihonium/Nihonium-SSで動作可能なアセンブラソースリストを出力します。
- Moscovium 16ビットモードと、Nihonium 32ビットモードを選択します。
- 一度指定したら、同じプログラムの中で、重複して異なるモードを指定することはできません。
- オリジナル8ビットCPUコアTennessineは、対象外です(Blocklyの適応不可)。
- "sim": シミュレーションモード
- シミュレーション実行用のアセンブラソースリストを出力します。
- Moscoviumマイコンの論理シミュレーションを実行する時だけ、指定してください。
- "int": 符号付整数モード
- "float": 浮動小数モード
- 変数や数値、演算等を符号付整数として扱うか、浮動小数として扱うかを切り替えます。
- "@Mc@"+"@float@"では、半精度浮動小数となり、Moscovium+H-FPUコプロセッサが必要です。
- "@Nh@"+"@float@"では、単精度浮動小数となり、Nihonium+S-FPUコプロセッサが必要です。
- プログラム中何度でも指定可能です。
- ブロックの定義順番に従い、"@int@"または"@float@"オプションが指定されてから、次の"@int@"/"@float@"オプションが指定されるまでの間、有効となります。
- 変換開始時のデフォルトモードは、符号付整数モード"@int@"です。
- "cstr_siz=<size>": 文字列のバッファサイズを<size>バイトとします。
- C言語文字列(NIL'\0'終端)なので、最後のNILバイトを含めて、<size>バイト以内で使用してください。
- 本オプションが複数回指定された場合、最後に指定された<size>が有効です。
- 明示的に指定しなかった場合のデフォルトは、"@cstr_siz=64@"です。
- "rom_siz=<size>": 命令ROM容量
- 命令ROM容量をバイト単位で指定します。
- 使用するMoscoviumマイコンの命令ROM容量に合わせて設定してください。
- 命令ROM容量と異なる値を設定した場合、動作は保証しません。
- 明示的に指定しなかった場合のデフォルトは、"@rom_siz=4*1024@"(4KバイトROM)です。
- <translator_option>の大文字小文字は区別しません。
- 未定義のオプションを指定する事は禁止です。
- 例)
- @Nh,cstr_siz=256@
- Nihonium 32ビットモード指定。
- 文字列バッファサイズ256バイト。
- @int@
- @float@
- @rom_siz=8*1024@
ブロック毎に"@int@"/"@float@"オプションを切り替える事で、符号付整数演算と、浮動小数演算を混在する事が可能です。
改訂履歴
日付 |
項目 |
備考 |
2024/09/07 |
文字列操作ブロック |
オフセット付き文字列操作ブロックを追加した。 |
2024/08/31 |
Google Blocklyデモ版 |
改定 |
2024/07/27 |
Blockly.XML→Moscovium.ASM変換スクリプトマニュアル |
作成 |