公開日:2024/08/31
title.png

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開発環境の構築方法については、こちらをご覧ください。

a316_blky_demo.png


 上図で「Code Editor」リンクの先が、Blocklyエディタです(下図)。

a316_blky_edit.png

 プログラムを作成したら、「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にて配布しております。以下バナーよりアクセスしてください。

btn_moscovium.png

 Blockly.XML→Moscovium.ASM変換スクリプトやマクロアセンブラなども、GitHubのデータに含まれます。

※本HPの設計データは全て、「サポート無し、無保証」であることを前提としています。ご承知の上、ご活用ください。

変換に対応したブロック

 各ブロックについて、引数の省略は不可です。引数に対しては、必ず、何らかの値を設定してください。適切なブロックが設定されることで、対応するアセンブラソースリストが出力されるため、引数を省略すると、意図した動作には、なりません。
 同様にifブロックなど、ステートメント(do)の内容が省略不可の場合があります。

 基本的ブロックの動作について、以下に説明します。

Logic:
  • ifブロック
    • 歯車アイコンをクリックすると、else ifやelse等の組み合わせを指定可能です。
    • if/else if/else等の処理内容(do)を空にすると、エラーになります。
      • 何らかの処理を必ず記述してください。
  • 比較ブロック
    • 数値または、文字列の比較を実行します。
    • 数値比較の場合、コメント中に指定する変換オプションによって、符号付整数比較"@int@"または、浮動小数比較"@float@"、を実行します。
    • 2数共、符号付整数型あるいは浮動小数型と見なしますので、揃えて使ってください。
    • 浮動小数比較では、比較結果がNaNにならないことを確認してください。
      • 比較結果がNaNの場合、動作は保証しません。
  • 論理演算ブロック
    • 複数の比較結果などを組み合わせることができるブロックです。
    • AND/OR論理演算を選択できます。
  • notブロック
    • 論理演算結果を反転するブロックです。
  • false/trueブロック
    • 真理値false/trueを指定可能なブロックです。
  • testブロック
    • test引数を評価した結果、
      • 真ならif true引数、
      • 偽ならif false引数、
      • を、返すブロックです。
    • 返す値は、数値(符号付整数または浮動小数)です。
      • 文字列を返すことはできません。
a316_blky_logi.png
Loops:
  • repeatブロック
    • doに指定したプログラム列を指定回数(符号付整数)繰り返すループです。
  • repeat while/untilブロック
    • 指定した条件が真(true)の間、実行し続けるwhileループ、
    • または、指定した条件が偽(false)の間、実行し続けるuntilループです。
  • count withブロック
    • 指定した変数をfrom値からto値までby値ずつ増加しながら実行するループです。
  • break/continueブロック
    • ループ内から抜けたり(break)、ループの先頭に戻ったり(continue)する、ループ制御ブロックです。
a316_blky_loop.png
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を返します。
a316_blky_math.png
Text:
  • 文字列ブロック
    • 文字列定数を返します。
  • create textブロック
    • 引数を文字列と見なして、順番に連接して返すブロックです。
    • 引数に数値が渡された場合、符号付整数と見なして文字列に変換後、連接します。
      • 浮動小数には非対応です。
    • 歯車アイコンをクリックすると、引数の数を増/減することができます。
    • 本ブロックを入れ子にすることはできません。
    • 文字列変数へセットする場合、本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
  • append textブロック
    • 文字列型変数に格納された文字列の最後尾に文字列引数を追加します。
    • C言語標準関数では、strcat()関数に相当する動作となります。
    • 本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
  • lengthブロック
    • 文字列引数の長さ(文字数)を返します。
    • C言語標準関数では、strlen()関数に相当する動作となります。
  • is emptyブロック
    • 文字列引数が空文字列("")だった場合、trueを返します。
    • それ以外の場合にはfalseが返ります。
  • printブロック
    • 文字列引数をUART8N1ユニット(#0)に送信するブロックです。
    • こちらのuart printブロックと同じ動作となります。
a316_blky_text.png
Variables:
  • Create variable...
    • 新規変数を宣言します。
    • 全ての変数はグローバル変数です。
  • setブロック
    • 指定した変数に値を設定するブロックです。
    • 文字列変数を使う場合、必ず最初に空文字列("")の代入を実行してください。
      • 一度、文字列型に設定した変数は、一貫して文字列型として使用してください。
    • 文字列変数へセットしようとする場合、本ブロックの引数に、セットしようとする文字列変数を含んでは、いけません。
  • changeブロック
    • 数値変数の値に、引数を加算するブロックです。
    • 引数が正なら加算、負なら減算となります。
  • 変数参照ブロック
    • 変数値を参照するブロックです。
    • 全ての変数はグローバル変数です。
a316_blky_vari.png
Functions:
  • 手続きブロック
    • 手続きを作成するブロックです。
    • 歯車アイコンをクリックすると、引数変数を指定可能です。
      • 引数変数もグローバル変数です。
      • 引数変数は、数値型です。
  • 関数ブロック
    • 関数を作成するブロックです。
      • 手続きとの違いは、値を返すことです。
    • 歯車アイコンをクリックすると、引数変数を指定可能です。
      • 引数変数もグローバル変数です。
      • 引数変数は、数値型です。
    • 返す値は、数値(符号付整数または浮動小数)です。
  • if returnブロック
    • 引数の値が真だった場合、return値を返して、関数または手続きから戻ります。
      • 返す値は、数値(符号付整数または浮動小数)です。
    • 引数の値が偽だった場合、何もせず、次のブロックに制御が移ります。
    • 手続きまたは関数の、外部では使用できません。
a316_blky_func.png

Moscovium用カスタムブロック

 Moscovium用に拡張したカスタムブロックの動作について、以下に説明します。

Moscovium:
  • asmブロック
    • インラインアセンブラを展開するブロックです。
    • テキストフィールドに記述した文字列を、そのまま、アセンブラソースリストに埋め込みます。
  • cendブロック
    • 引数を符号無整数と見なして、エンディアン変換した値を返すブロックです。
    • ビッグエンディアン⇔リトルエンディアンの相互変換ですので、2回実行すると元に戻ります。
  • cpu regブロック
  • cpu setブロック
    • 引数を符号付整数と見なして、CPUの内部レジスタにセットするブロックです。
  • fdownブロック
    • 引数を浮動小数と見なして、小数点以下の数値をゼロ方向の整数へ丸めて返します。
    • y=fdown (x)=sgn (x)×floor (fabs (x))です。
    • 返り値は、符号付整数ではなく、浮動小数です。
  • ftoiブロック
    • 引数を浮動小数と見なして、符号付整数に変換した値を返します。
    • 引数が符号付整数範囲を超えた場合、値は保証されません。
  • isinfブロック
    • 引数を浮動小数と見なして、無限大数(+INFまたは−INF)だった場合にtrueを返します。
    • それ以外の場合は、falseが返ります。
  • isnanブロック
    • 引数を浮動小数と見なして、非数(NaN)だった場合にtrueを返します。
    • それ以外の場合は、falseが返ります。
  • itofブロック
    • 引数を符号付整数と見なして、浮動小数に変換した値を返します。
  • sim failブロック
    • シミュレーションをfail終了します。
    • "@sim@"変換オプションを有効化した、論理シミュレーションでしか効力がありません。
  • sim passブロック
    • シミュレーションをpass終了します。
    • "@sim@"変換オプションを有効化した、論理シミュレーションでしか効力がありません。
a316_blky_mcvm.png
Memory:
  • mem readブロック
    • アドレスadrからデータを読み出して、符号無整数値として返します。
    • データサイズをB(yte)/W(ord)/L(ong)から選択可能です。
    • L(ong)データサイズを指定できるのは、Nihonium 32ビットモード("@Nh@")だけです。
  • mem writeブロック
    • アドレスadrへデータdatを書き込みます。
    • データサイズをB(yte)/W(ord)/L(ong)から選択可能です。
    • L(ong)データサイズを指定できるのは、Nihonium 32ビットモード("@Nh@")だけです。
  • memx readブロック
    • mem readブロックと同じですが、主にMoscovium 16ビットモード("@Mc@")で、adrxを上位16ビットとする拡張アドレス空間adrx:adr(計32ビット)からの読み出しを実行します。
  • memx writeブロック
    • mem writeブロックと同じですが、主にMoscovium 16ビットモード("@Mc@")で、adrxを上位16ビットとする拡張アドレス空間adrx:adr(計32ビット)への書き込みを実行します。
a316_blky_memo.png
Standard:
  • asciiブロック
    • 指定した1文字のASCIIコードを符号無整数で返します。
  • ビット毎論理演算ブロック
    • 引数を符号付整数と見なして、ビット毎論理演算を実行するブロックです。
    • &(AND)/|(OR)/^(Exclusive OR)/<<(Arithmetic Shift Left)/>>(Arithmetic Shift Right)演算を指定可能です。
  • 定数ブロック
    • 16進数(0x12ab)、定数演算(5*1024)、アセンブラで定義されるラベル(idrgcode)等の定数を指定可能なブロックです。
    • 定数式に空白( )を含むことはできません。
  • 単項演算ブロック
    • 単項演算を実行するブロックです。
    • −(符号反転)/〜(ビット毎論理否定)/!(論理否定)/sq(自乗)/2*(二倍)/1+(1増加)/-1+(1減少)/!!(論理肯定)演算を選択可能です。
    • 〜および!、!!演算は、符号無整数演算します。
  • packブロック
    • 一塊の処理をパック(梱包)するためのブロックです。
    • チェックボックスのチェックを外すと、ブロック内のプログラムはアセンブラソースリストに反映されません。
  • swapブロック
    • 指定された2変数の内容を入れ替えるブロックです。
    • 2つの変数は、共に同じ型でなくてはなりません。
      • 符号付整数型/浮動小数型/文字列型
  • atoiブロック
    • 引数を10進整数文字列と見なして、符号付整数に変換して返します。
    • C言語標準関数では、atoi()関数に相当する動作となります。
    • 文字列先頭の符号(+(省略可)/−)を認識します。その他、数字(0〜9)以外の文字が見つかった時点で解釈を打ち切ります。
  • itoaブロック
    • 引数を符号付整数と見なして、10進整数文字列に変換して返します。
  • itoxブロック
    • 引数を符号無整数と見なして、digit桁の16進整数文字列に変換して返します。
  • xtoiブロック
    • 引数を16進整数文字列と見なして、符号無整数に変換して返します。
    • 16進数字(0〜9/a〜f/A〜F)以外の文字が見つかった時点で解釈を打ち切ります。
a316_blky_stnd.png
String:new
  • ※文字列変数<item>の先頭文字からオフセット(+<ofst>=0〜strlen (<item>))を持つ文字列に対して、文字列操作を行うブロック群です。
    • 例)<item>="hello, world"の場合、<item>+4="o, world"です。
  • compare leftブロック
    • <item>+<ofst>から文字列<and>の文字数までの文字列比較を行うブロックです(前方一致比較)。
    • 一致するとtrue、不一致の場合はfalseを返します。
    • C言語標準関数では、strncmp (<item>+<ofst>,<and>,strlen (<and>))=0に相当します。
  • ctoaブロック
    • 引数をASCII文字コード(符号無整数)と見なし、1文字の文字列に変換して返すブロックです。
  • findブロック
    • <item>+<ofst>位置から、引数<char>のASCII文字コード(符号無整数)を持つ文字を探し、そのオフセット位置(=0〜strlen (<item>))を返します。
      • 返り値は、<item>先頭文字からのオフセットです。
    • <char>が見つからなかった場合、−1が返ります。
    • C言語標準関数では、strchr (<item>+<ofst>,<char>)に相当します。
  • get charブロック
    • <item>+<ofst>位置の文字コード(符号無整数)を返すブロックです。
  • pointerブロック(文字列定数、ラベル)
    • pointer to label型のブロックは、命令ROM上に配置した文字列定数を指し示すラベル<label>からのオフセット付き文字列参照ブロックです。
      • <label>引数には、アセンブラで定義したラベル名を指定してください。
    • <label>+<ofst>への文字列ポインタを返します。
  • pointerブロック
    • pointer to item型のブロックは、文字列変数<item>からのオフセット付き文字列参照ブロックです。
    • <item>+<ofst>への文字列ポインタを返します。
  • set offsetブロック
    • <item>+<ofst>位置へ、引数文字列(=<text>)を複製するブロックです。
    • C言語標準関数では、strcpy (<item>+<ofst>,<text>)に相当します。
    • 引数<text>に、セットしようとする文字列変数<item>を含んでは、いけません。
a316_blky_strg.png
Library:
  • digitalReadブロック
    • 汎用I/Oポート(pin)の状態(0または1)を入力して返します。
    • 0≦pin≦15(符号付整数)の範囲で、こちらのピン配置図のport_iop[0〜15]に相当します。
  • digitalWriteブロック
    • 汎用I/Oポート(pin)へ値val(符号付整数0または1)を出力します。
    • 0≦pin≦15(符号付整数)の範囲で、こちらのピン配置図のport_iop[0〜15]に相当します。
  • delayブロック
    • ミリ秒単位で指定した時間(符号無整数)、待機します。
  • delayMicrosecondsブロック
    • マイクロ秒単位で指定した時間(符号無整数)、待機します。
  • microsブロック
    • リセット解除からの経過時間をマイクロ秒単位(符号無整数)で返します。
  • millisブロック
    • リセット解除からの経過時間をミリ秒単位(符号無整数)で返します。
  • ticksブロック
    • リセット解除からの経過時間をCPUクロック数(tick)単位(符号無整数)で返します。
  • uart availブロック
    • UART8N1ユニット(#0)に1バイト以上の受信データがある場合、trueを返します。
    • それ以外ではfalseが返ります。
  • uart getlineブロック
    • UART8N1ユニット(#0)から、改行コード(LF)までのテキストデータを読み込んで、返します。
    • 改行コード(CRおよびLF)は、返り文字列に含みません。
    • 改行コードを受信する前にcstr_sizバイトを超えた場合、そこで一旦打ち切って、文字列を返します。
  • uart printブロック
    • 引数を文字列と見なして、UART8N1ユニット(#0)から送信します。
  • uart printlnブロック
    • uart printブロックと同じ動作を実行した後、改行コード(CR+LF)を送信します。
a316_blky_libr.png

変換オプション

 Blocklyエディタの「右クリック ⇒ Add comment」で追加できるコメント中に、変換オプションを指定することができます。

 以下に、変換オプションの仕様を示します。

  変換オプション仕様:

 ブロック毎に"@int@"/"@float@"オプションを切り替える事で、符号付整数演算と、浮動小数演算を混在する事が可能です。

改訂履歴

日付 項目 備考
2024/09/07 文字列操作ブロック オフセット付き文字列操作ブロックを追加した。
2024/08/31 Google Blocklyデモ版 改定
2024/07/27 Blockly.XML→Moscovium.ASM変換スクリプトマニュアル 作成

btn_arduino.png btn_moscovium.png

home