公開日: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 for Moscovium

 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.ASM変換スクリプト、INCLファイルはMoscoviumマクロアセンブラでアセンブルする時に必要となる、ランタイムライブラリです。

設計データ

 Cmod A7ボード(FPGA)用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。

btn_moscovium.png

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

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

プログラムのエントリポイント

 Blocklyのエディタに於いて、より上に配置されたブロック群が、先にXML形式として出力されます。
 Blockly.XML→Moscovium.ASM変換スクリプトは、XMLファイル内の出現順にプログラムを実行しますので、プログラムのエントリポイントが一番上に配置されるようにしてから、XML形式で保存してください。

 エディタ背景部分で「右クリック ⇒ Clean up Blocks」を実行すると、ブロックが縦に整列されるので、この様な機能も活用してください。

 複数のブロック群が見つかった場合、変換スクリプトは、より上に配置されたブロック群から順に、下方のブロック群を実行して行きます。
 これは、初めての関数/手続き/タスク定義に遭遇するまで適応されます。関数/手続き/タスク定義に遭遇すると、そこでCPUが停止します。CPUを停止したくない場合は、無限ループにするなど、プログラムで対処してください。

 なお、一旦、関数/手続き/タスク定義が挟まった後で、再び遭遇したブロック群は、実行されることがありません。こちらに関しても、配置順(配置場所)に注意を払ってください。

変換に対応したブロック

 各ブロックについて、引数の省略は不可です。引数に対しては、必ず、何らかの値を設定してください。適切なブロックが設定されることで、対応するアセンブラソースリストが出力されるため、引数を省略すると、意図した動作には、なりません。
 同様に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値ずつ増加しながら実行するループです。
  • do repeatブロックnew
    • 指定した条件が真(true)の間、実行し続けるwhileループ、
    • または、指定した条件が偽(false)の間、実行し続けるuntilループです。
    • まず、無条件でループを実行して、最後にループ継続条件を判定します。
    • continueブロックを実行すると、ループ継続条件の判定に分岐します。
  • loopブロックnew
    • 無条件で無限ループします。
    • breakブロックを実行しても、loopブロックの先頭に戻って継続します
      • continueブロックと同等動作です。
  • 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回実行すると元に戻ります。
  • irq enableブロックnew
    • 割り込み許可レベル0〜3を設定します。
    • 指定された数値が状態レジスタsrの割り込み許可レベルIE[1:0]フィールドに設定されます。
  • 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 addrブロック
    • 変数<item>の格納アドレス値を返します。
      • C言語の単項&演算に相当します。
    • <item>が文字列変数だった場合、先頭文字の格納アドレスが返ります。
  • 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)等の定数を指定可能なブロックです。
    • 定数演算式に空白( )を含むことはできません。
  • 単項演算ブロック
    • 単項演算を実行するブロックです。
    • −(符号反転)/inc(1増加)/dec(1減少)/sq(自乗)/2*(二倍)/〜(ビット毎論理否定)/!(論理否定)/!!(論理肯定)演算を選択可能です。
    • 〜および!、!!演算は、常に符号無整数演算します。
  • packブロック
    • 一塊の処理をパック(梱包)するためのブロックです。
    • チェックボックスのチェックを外すと、ブロック内のプログラムはアセンブラソースリストに反映されません。
  • swapブロック
    • 指定された2変数の内容を入れ替えるブロックです。
    • 2つの変数は、共に同じ型でなくてはなりません。
      • 符号付整数型/浮動小数型/文字列型
  • taskブロック
    • 特定のタスクを宣言します。
      • 同種のタスクは、プログラム内で1回だけ、宣言することができます。
    • CPU2:
      • SMPデュアルコア版Moscoviumマイコンに於ける、CPU2(サブCPU)のエントリポイントです。
      • ブロック内に記述したプログラムを実行後、CPU2は停止します。
    • IRQ:new
      • シングルコア版CPUまたは、
      • SMPデュアルコア版に於いて、CPU1(メインCPU)が、
      • 割り込みを受け付けた場合に実行するタスクを記述します。
    • IRQ2:new
      • SMPデュアルコア版に於いて、CPU2(サブCPU)が、
      • 割り込みを受け付けた場合に実行するタスクを記述します。
  • 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:
  • ※文字列変数<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ブロック
    • マイクロ秒単位で指定した時間(符号無整数)、待機します。
  • delayTicksブロック
    • CPUクロックサイクル単位で指定した時間(符号付整数≧0)、待機します。
    • CPU命令の実行時間でカウントするため、少なくとも指定時間以上、待機します。
    • 割り込み等の状況によっては、大幅に超える時間を待機する場合もあります。
  • 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/10/26 割り込み対応 irq enableブロックを追加。
taskブロックにIRQ,IRQ2タスクを追加。
変換オプション"@isr_bank@","@uart_baud@"を追加。
do repeat/loopブロックを追加。
2024/10/19 マルチコアタスク対応 taskブロックを追加。
mem addrブロックを追加。
delayTicksブロックを追加。
変換オプション"@var_iram@"を追加。
エントリポイントに関する説明を追加した。
2024/09/07 文字列操作ブロック オフセット付き文字列操作ブロックを追加した。
2024/08/31 Google Blocklyデモ版 改定
2024/07/27 Blockly.XML→Moscovium.ASM変換スクリプトマニュアル 作成

btn_arduino.png btn_moscovium.png

home