MicroPython のシャープ X680x0 向け移植です。
MicroPython v1.21.0 をベースにしています。
- v1.20.0 からの差分は こちら を参照してください。
- v1.21.0 は組み込みモジュール名の扱いが従来のバージョンから変更されているため、モジュールの import に関して注意が必要な場合があります。「モジュールのimportに関しての注意点」を参照してください。
ビルドにはPC環境のクロスツールチェイン elf2x68k が必要です。 ツールチェインにパスが通って m68k-xelf-gcc 等が実行できる状態で、以下の手順でビルドします。
$ cd ports/x68k
$ make
ビルドに成功すると実行ファイル build/micropython.x
が出来るので、X680x0 の環境上にコピーしてください。
-
X680x0 環境上で micropython.x を実行します。
micropython [ -h ] [ -i ] [ -O<level> ] [ -X <option> ] [ -m <module> | <script> ] [ <args> ]
-m <module>
- モジュール
<module>
を実行します。モジュールはカレントディレクトリまたは環境変数MICROPYPATH
で指定されるパスに存在している必要があります。
- モジュール
<script>
- ファイル
<script>
を実行します。スクリプトは有効な MicroPython ソースコードファイルである必要があります。
- ファイル
上記のオプションのいずれも指定されていない場合、MicroPython は対話型 REPL モードで実行されます。
<args>
- モジュール/スクリプトの後の追加の引数は
sys.argv
に渡されます。
- モジュール/スクリプトの後の追加の引数は
-h
- コマンドラインの使用法を含むヘルプメッセージを出力して終了します。
-i
- 検査を有効にします。このフラグを設定すると、コマンド、モジュール、スクリプトが終了した後、MicroPython が対話型 REPL モードに入ります。これは、未処理の例外の後の状態をデバッグするのに役立ちます。環境変数
MICROPYINSPECT
も参照してください。
- 検査を有効にします。このフラグを設定すると、コマンド、モジュール、スクリプトが終了した後、MicroPython が対話型 REPL モードに入ります。これは、未処理の例外の後の状態をデバッグするのに役立ちます。環境変数
-O
|-O<level>
|-OO
...- 最適化レベルを設定します。の
O
の後に数字を付けるか、O
を複数回繰り返すことによりレベルを示すことができます。たとえば-O3
と-OOO
は同じです。
- 最適化レベルを設定します。の
-X <option>
- 追加の処理系固有のオプションを指定します。可能なオプションは次のとおりです:
-X emit={bytecode,native,viper}
はデフォルトのコードエミッタを設定します。-X heapsize=<n>[w][K|M]
はガベージコレクターのヒープサイズを設定します。接尾辞w
はバイトではなくワードを意味します。K
は x1024、M
は x1024x1024 を意味します。
MICROPYPATH
- MicroPython ライブラリの検索パスを設定します。検索パスは、ディレクトリのリストをコロンで区切ることで設定します。
MICROPYINSPECT
- この環境変数に空でない文字列が設定されていると、MicroPython はスクリプトの実行終了後に対話シェルモードに入ります。コマンドラインオプションの
-i
と同じ効果があります。
- この環境変数に空でない文字列が設定されていると、MicroPython はスクリプトの実行終了後に対話シェルモードに入ります。コマンドラインオプションの
MICROPYHIST
- 対話シェルへの入力履歴を保存するファイル名を指定します。
MicroPython 自体の使い方は 公式ドキュメント を参照してください。
X680x0版では、加えて以下のライブラリをサポートしています。
X680x0版では以下のクラスのみをサポートしています。
通常の MicroPython では Pin
はMCUのI/O ピン (GPIO - 汎用入出力)の制御のために使用されますが、X680x0版ではすべて出力ピンとして、ピン#0~#6がキーボードの各LEDに対応します。
MicroPython向けLチカのコードをそのままX680x0版で動かすためだけに存在します。:-)
x68k.crtmod(mode [,gon])
- 画面の表示モードを設定する IOCS CRTMOD を実行します。mode には設定する画面モードを指定します。
- gon を
True
にすると、画面モード設定後にグラフィック画面をクリアして表示モードにします(IOCS G_CLR_ON の実行)。
x68k.vsync()
- CRTCの垂直帰線期間になるまで待ちます。
x68k.curon()
x68k.curoff()
- カーソル表示をON/OFFします。
x68k.fontrom()
- フォントROM領域の
memoryview
オブジェクトを返します。読み出し専用です。
- フォントROM領域の
x68k.i.<IOCSコール名>
- IOCSコール番号を定数で定義しています。
- 例:
x68k.i.B_PRINT
= 0x21
- 例:
- IOCSコール番号を定数で定義しています。
x68k.iocs(d0, d1, d2, d3, d4, d5, a1[w], a2[w], rd, ra)
- IOCSコールを実行します。
d0
~d5
,a1
,a2
は呼び出しの際のCPUレジスタ値を指定します。d0
以外は省略可能です。- 例:
x68k.iocs(x68k.i.B_KEYINP)
# IOCS _B_KEYINPを実行します
- 例:
- CPUレジスタ引数には整数値を直接指定する他に、バッファオブジェクトを指定することも可能です。この場合の挙動はレジスタの種類によって異なります。
- データレジスタの場合は、与えられたオブジェクトの先頭4バイトを整数値として使用します。
- x68k.iocs()に渡されるPythonの引数は32bit符号付き整数として扱われるため、これに収まらない値(0x80000000のような)は直接引数として与えることができません。バッファオブジェクトを介して
d1=struct.pack('L',0x80000000))
のようにすることで渡せるようになります。
- x68k.iocs()に渡されるPythonの引数は32bit符号付き整数として扱われるため、これに収まらない値(0x80000000のような)は直接引数として与えることができません。バッファオブジェクトを介して
- アドレスレジスタの場合は、与えられたオブジェクトの先頭アドレスが渡されます。
- 与えられたバッファに書き込みを行うようなIOCSに対しては、名前を
a1w
,a2w
にしてbytearray
のような書き換え可能なオブジェクトを与えます。
- 与えられたバッファに書き込みを行うようなIOCSに対しては、名前を
- データレジスタの場合は、与えられたオブジェクトの先頭4バイトを整数値として使用します。
- IOCS実行後のd0レジスタの値が関数の戻り値となります。他のレジスタの値が必要な場合は、
rd
,ra
にそれぞれデータレジスタ、アドレスレジスタの個数を指定することでそれらのレジスタ値を並べたタプルを返します。rd=2
,ra=1
を指定すると、関数の戻り値は(d0,d1,d2,a1)
のタプルとなります。
- IOCSコールを実行します。
x68k.d.<DOSコール名>
- DOSコール番号を定数で定義しています。
- 例:
x68k.d.PRINT
= 0xff09
- 例:
- DOSコール番号を定数で定義しています。
x68k.dos(callno [,arg])
- DOSコールを実行します。
callno
には呼び出すDOSコール番号を指定します。- 例:
x68k.dos(x68k.d.GETCHAR)
# DOS _GETCHAR を実行します
- 例:
- DOSコール実行後のd0レジスタの値が関数の戻り値となります。
- 追加の引数としてバッファオブジェクトを指定することができます。指定されたオブジェクトの内容がスタックに積み上げられてからDOSコールを実行します。オブジェクトのデータ配置、サイズは呼び出すDOSコールと正しく対応している必要があります。
- 例:
import x68k import struct import uctypes buf=bytearray(94) x68k.dos(x68k.d.GETDPB,struct.pack('hl',0,uctypes.addressof(buf)))
- DOS _GETDPBは「1ワードのドライブ番号」「94バイトのバッファを指す1ロングワードのポインタ」をこの順にスタックに積んで呼び出す仕様なので、
struct.pack
のフォーマット文字列'hl'
によってこのデータ配置を指定しています。
- 例:
- 注) 上記コード例でバッファオブジェクトのアドレスを取得するために使用していた
addressof()
関数はuctypes
モジュールに含まれていて従来はctypes
モジュールという別名での呼び出しも可能でしたが、MicroPython v1.21.0 での仕様変更に伴いuctypes
でのみ呼び出せるようになりました。v1.20.0 以前でctypes
を import してるコードはuctypes
に変更する必要があります。
- DOSコールを実行します。
x68k.mpyaddr()
- MicroPython本体のメモリ上の開始アドレスを返します。デバッグ用です。
x68k.loadfnc(file [,flag])
- X-BASIC の外部関数ファイルを読み込みます。
- 詳細はこちらのドキュメントを参照してください。
x68k.xarray(typecode [,sub1][,sub2][,iterable])
x68k.xarray_char([sub1][,sub2][,iterable])
x68k.xarray_int([sub1][,sub2][,iterable])
x68k.xarray_float([sub1][,sub2][,iterable])
- X-BASIC 外部関数の引数として用いることができる配列オブジェクトを構築します。
- 詳細はこちらのドキュメントを参照してください。
- class
x68k.Super()
- Super オブジェクトを構築します。以下のように
with
ステートメントで使用することで、ブロック内をスーパーバイザモードで実行します。
# ここまではユーザーモード with x68k.Super(): # ここからスーパーバイザモード a = machine.mem32[0] # スーパーバイザモードでアクセス # ここからはユーザーモード
- Super オブジェクトを構築します。以下のように
x68k.issuper()
- スーパーバイザモードであれば
True
を、ユーザーモードであればFalse
を返します。
- スーパーバイザモードであれば
x68k.super([mode])
- スーパーバイザモードとユーザモードの間の切り替えを行います。
- mode を省略または
True
であればスーパーバイザモードに、False
であればユーザーモードに切り替えます。 - 関数の戻り値として切り替え前のモードを返します。
# ここまではユーザーモード s = x68k.super() # ここからスーパーバイザモード a = machine.mem32[0] # スーパーバイザモードでアクセス x68k.super(s) # ここからはユーザーモード
- class
x68k.GVRam([page])
- GVRam オブジェクトを構築します。複数の描画ページを持つグラフィックスモードの場合は、pageに描画するページ番号を指定します。省略するとページ0を使用します。
- 構築されるオブジェクトは指定した描画ページのグラフィックVRAMのフレームバッファとなります。
framebuf.FrameBuffer
オブジェクトのコンストラクタに与えることで、framebuffer
クラスによる画面描画が可能です。
以下のメソッドによって描画を行います。
GVRam.palet(pal, col)
-- パレット設定GVRam.home(x, y [,all])
-- 表示位置指定GVRam.window(x0, y0, x1, y1)
-- 描画範囲設定GVRam.wipe()
-- 画面クリアGVRam.pset(x, y, c)
-- ポイント描画GVRam.point(x, y)
-- ポイントゲットGVRam.line(x0, y0, x1, y1, c [,style])
-- 直線描画GVRam.box(x0, y0, x1, y1, c [,style])
-- ボックス描画GVRam.fill(x0, y0, x1, y1, c)
-- 塗りつぶしボックス描画GVRam.circle(x, y, r, c [,start, end, ratio])
-- 円描画GVRam.paint(x, y, c [,buf])
-- シードフィル描画GVRam.symbol(x, y, str, xmag, ymag, c [,ftype, angle])
-- 文字列描画GVRam.get(x0, y0, x1, y1, buf)
-- 範囲内のデータ取得GVRam.put(x0, y0, x1, y1, buf)
-- 範囲内へデータ書き込みx68k.vpage(page)
- グラフィック画面の表示ページを設定します。
page
のビット0~ビット3が各ページ番号に対応します。
import x68k x68k.crtmod(16,True) x68k.vpage(1) # ページ0のみ表示 g = x68k.GVRam(0) # ページ0のオブジェクト構築 g.line(0, 0, 767, 511, 11) g.fill(100, 100, 200, 200, 9) g.symbol(10, 300, 'MicroPython!', 2, 2, 7)
- グラフィック画面の表示ページを設定します。
- class
x68k.TVRam()
- TVRam オブジェクトを構築します。
- 構築されるオブジェクトはテキストVRAMのフレームバッファとなります。
framebuf.FrameBuffer
オブジェクトのコンストラクタに与えることで、framebuffer
クラスによる画面描画が可能です。
以下のメソッドによって描画を行います。
TVRam.palet(pal, col)
-- パレット設定TVRam.palet2(pal, col)
-- パレット設定 (マウスプレーンを考慮しない)TVRam.xline(plane, x, y, len [,style])
-- 横直線描画TVRam.yline(plane, x, y, len [,style])
-- 縦直線描画TVRam.line(plane, x, y, w, h [,style])
-- 直線描画TVRam.box(plane, x, y, w, h [,style])
-- ボックス描画TVRam.fill(plane, x, y, w, h [,style])
-- 塗りつぶしボックス描画TVRam.rev(plane, x, y, w, h)
-- 矩形領域反転TVRam.rascpy(src, dst, n, dir, plane)
-- ラスターコピーTVRam.color(plane)
-- 描画対象プレーン設定TVRam.get(x, y, buf)
-- 範囲内のデータ取得TVRam.put(x, y, buf)
-- 範囲内へデータ書き込みTVRam.clipput(x, y, buf, (x0, y0, x1, y1))
-- 範囲内へデータ書き込み(クリッピングあり)
- class
x68k.Sprite()
- Sprite オブジェクトを構築します。
以下のメソッドによって描画を行います。
Sprite.init()
-- スプライト面の初期化Sprite.disp([onoff])
-- スプライト面の表示ON/OFF (引数省略時は表示ON)Sprite.clr([from][,to])
-- スプライトパターンのクリアfrom
,to
にはクリアするパターンコードの先頭、末尾を指定します。from
だけを指定した場合はそのコードのパターンのみ、from
,to
とも省略した場合はすべてのパターンをクリアします。
Sprite.defcg(code, pat [,size])
-- スプライトパターンの定義pat
には定義するパターンをバッファオブジェクトで与えます。binascii.unhexlify()
を使うことで16進文字列を定義パターンに変換できます。
size
に0を指定すると8×8ドットのパターン、1を指定または指定を省略すると16×16ドットのパターンを定義します。2を指定した場合は16×16ドットですがパターンの並びがIOCSコール_SP_DEFCGと同じになります(左上、左下、右上、右下の順)。
Sprite.set(plane[,x, y, code, prio [,vsync]])
-- スプライトレジスタの設定- パターンコード
code
のスプライトをプレーンplane
の座標x
,y
に優先度prio
で表示します。 plane
以外を省略すると、そのプレーンのスプライトを表示しません。vsync
でレジスタ設定前に垂直帰線期間になるまで待つかどうかを指定します。True
を指定、またはパラメータを省略すると待ちます。
- パターンコード
Sprite.palet(p, color [,pb][,vsync])
-- スプライトパレットの設定- パレットコード
p
のカラーコードをcolor
に設定します。 color
には設定したいカラーコードをそのまま指定する他、複数のカラーコードを並べたタプルを指定することができます。タプルを指定した場合は、p
から連続したパレットコードにそれぞれカラーコードが設定されます。pb
で設定するパレットブロック番号を指定します。省略するとパレットブロック 1 となります。vsync
でパレット設定前に垂直帰線期間になるまで待つかどうかを指定します。True
を指定、またはパラメータを省略すると待ちます。
- パレットコード
Sprite.bgdisp(bg[,text][,disp])
-- BGコントロールレジスタの設定bg
で指定したBG面に表示するテキストページ、表示のON/OFFを設定します。text
,disp
を省略すると、テキストページ 0 の表示 ON となります。
Sprite.bgfill(text, code)
-- BGテキストのフィルtext
で指定したテキストページをパターンコードcode
で埋めます。
Sprite.bgput(text, x, y, code)
-- BGテキストの設定text
で指定したテキストページの座標x
,y
にパターンコードcode
を設定します。
Sprite.bgget(text, y, y)
-- BGテキストの読み出しtext
で指定したテキストページの座標x
,y
のパターンコードを読み出して返します。
Sprite.bgscroll(bg, x, y [,vsync])
-- BG面のスクロールbg
で指定したBG面のスクロール位置を座標x
,y
に設定します。vsync
でスクロール設定前に垂直帰線期間になるまで待つかどうかを指定します。True
を指定、またはパラメータを省略すると待ちます。
-
これらのクラスによって、Python言語で書かれた割り込みハンドラを登録することができます。割り込みハンドラには通常の関数と異なるさまざまな制約が存在します。詳細は公式ドキュメントを参照してください。
- 割り込みハンドラは後述のネイティブコードまたはバイパーコード、インラインアセンブラを使用するなどして、出来るだけ早く処理を完了させるようにしてください。
-
class
x68k.IntVSync([callback, arg, mode, disp, cycle])
- IntVSync オブジェクトを構築します。このオブジェクトで垂直同期による割り込みハンドラを登録します。
callback
には垂直同期の際に呼び出すコールバックを指定します。指定できるのは、関数名のような呼び出し可能(callable)なオブジェクトです。arg
にはコールバックを呼び出す際に渡す引数を指定します。mode
にはコールバックがどのように呼び出されるのかを示す呼び出しモードを指定します。mode
指定を省略するか 0 を指定した場合、コールバックはCPUの割り込みハンドラから直接呼び出されます。割り込み要因発生後ただちに呼び出される一方で、実行中にオブジェクトのインスタンス作成等メモリ確保を伴う操作ができないなどの制約があります。mode
に 1 を指定した場合、コールバックはmicropython.schedule
機能を用いてキューに入れられ、CPUの割り込みハンドラが終了してメインプログラムに復帰した後に実行されます。実行開始までの遅延がある一方で、メモリ確保における制約などはなく通常のPythonプログラムのような操作が可能です(LinuxなどのOSの割り込み処理における、ボトムハーフに相当する機能です)。
disp
を省略または 0 を指定すると、コールバックは垂直帰線区間に入ると呼び出されます。1 を指定すると垂直表示区間に入ると呼び出されます。cycle
は垂直同期何回ごとにコールバックを呼び出すかを指定します。省略すると 1 を指定したことになり、毎垂直同期ごとにコールバックが呼ばれます。
以下のように
with
ステートメントで使用することで、割り込みハンドラはブロック内でのみ有効となります。実行がブロックの外に出る際に割り込みハンドラの登録も削除されます。# ここまでは割り込みハンドラ登録なし with x68k.IntVSync(callback, ... ): # この中では垂直同期ごとにcallbackが呼ばれる # 割り込みハンドラ登録なし
構築したオブジェクトには以下のようなメソッドを呼び出すこともできますが、割り込みハンドラを登録したままプログラムを終了させるとシステムクラッシュなどの致命的な問題が発生する場合があるため、できるだけ上記の
with
ステートメントを用いるようにしてください。IntVSync.init([callback, arg, mode, disp, cycle])
a = x68k.IntVSync()
のように引数なしで構築したオブジェクトに対して、後付けで各引数を設定します。
IntVSync.deinit()
- 割り込みハンドラの登録を解除します。
IntVSync.callback([callback])
- オブジェクトにコールバックのみを設定します。引数を省略すると割り込みハンドラの登録を解除します。
-
class
x68k.IntRaster([callback, arg, mode, raster])
- IntRaster オブジェクトを構築します。このオブジェクトでCRTCのラスター走査割り込みハンドラを登録します。
- 引数の意味は
x68k.IntVSync
と同様です。 raster
には割り込みを発生させるラスター番号を指定します。
-
class
x68k.IntTimerD([callback, arg, mode, unit, cycle])
- IntTimerD オブジェクトを構築します。このオブジェクトでMFP Timer-Dの割り込みハンドラを登録します。
- 引数の意味は
x68k.IntVSync
と同様です。 unit
には後述の割り込み周期の単位時間を指定します(1 = 1μs / 2 = 2.5μs / 3 = 4μs / 4 = 12.5μs / 5 = 16μs / 6 = 25μs / 7 = 50μs )cycle
には割り込み周期を指定します(0を指定すると256として扱います)。unit
×cycle
が実際の割り込み周期となります。
-
class
x68k.IntOpm([callback, arg, mode])
- IntOpm オブジェクトを構築します。このオブジェクトでFM音源IC(OPM)の割り込みハンドラを登録します。割り込みを発生させるには更にOPMレジスタを操作する必要があります。
- 引数の意味は
x68k.IntVSync
と同様です。
- class
x68k.IntDisable()
- IntDisable オブジェクトを構築します。以下のように
with
ステートメントで使用することで、ブロック内は割り込み禁止状態で実行されます。 x68k.Super()
によってスーパーバイザモードになった状態で実行する必要があります。ユーザモードだった場合には何もしません。
以下の関数による割り込み禁止/許可もできますが、割り込み禁止状態のままプログラムを終了させるとキーボード入力が効かなくなるなどの致命的な問題が発生する場合があるため、できるだけ上記の# ここまでは割り込み許可 with x68k.IntDisable(): # 割り込み禁止状態 # ここからは割り込み許可
with
ステートメントを用いるようにしてください。 - IntDisable オブジェクトを構築します。以下のように
x68k.intDisable()
- 割り込み禁止状態にして、以前の SR レジスタの値を返します。
x68k.intEnable(oldsr)
- 渡された
oldsr
の値を SR レジスタに設定します。
# ここまでは割り込み許可 oldsr = x68k.intDisable() # 割り込み禁止状態 x68k.intEnable(oldsr) # ここからは割り込み許可
- 渡された
str
クラスでの日本語文字列の扱いに対応しています。 オリジナルのMicroPythonは文字列を内部的にUTF-8で扱っていますが、X680x0の文字コードはシフトJISなので、文字列の内部処理に手を入れてシフトJISのまま扱うようになっています。- このため、Python文字列内のエスケープシーケンス '\uXXXX' はUnicodeではなくシフトJISのコード番号を指定します。
str
オブジェクトとbytes
/bytearray
オブジェクトでは日本語文字列を代入したときの扱いが異なります。str
オブジェクトは多バイト文字を文字単位で扱いますが、bytes
/bytearray
オブジェクトではバイトの並びとして扱います。>>> a=str('日本語','') # strオブジェクトを作成 >>> a '\u93fa\u967b\u8cea' >>> len(a) # 文字数は3文字 3 >>> print(a) 日本語 >>> b=bytes('日本語','') # bytesオブジェクトを作成 >>> b b'\x93\xfa\x96{\x8c\xea' >>> len(6) # 6バイト 6 >>> print(b) b'\x93\xfa\x96{\x8c\xea'
- MicroPythonのインラインアセンブラ機能をサポートしています。
@micropython.asm_m68k
デコレータを付けた関数はインラインアセンブラ関数となります。 - 詳細はこちらのドキュメントを参照してください。
- MicroPythonのネイティブ/バイパーコードエミッター機能をサポートしています。
@micropython.native
または@micropython.viper
デコレータを付けた関数では通常のバイトコードの代わりにCPUの機械語コードが出力され、それをCPUが直接実行することで実行速度を高速化します。- 詳細は公式ドキュメントの ネイティブコードエミッター および バイパーコードエミッター を参照してください。
- MicroPython はキーボードやファイルから入力されたプログラムをバイトコードにコンパイルしてから実行するため、特に大きなプログラムでは実行開始までに時間がかかります。
mpyconv.x
はバイトコードへのコンパイルを事前に行うことで、プログラムの実行開始までの時間を短縮することができます。通常のPythonモジュールの.py
ファイルを元に、.mpy
ファイルを生成します。- 例:
mpyconv sample/sprite.py
- sprite.py と同じディレクトリに sprite.mpy を生成します。
- 例:
- (以前のバージョンでは
mpycross.x
という名前でしたが、mpyconv.x
に変更されました。また、ネイティブコードのアーキテクチャはデフォルトでm68k
が設定されます)
- MicroPython v1.21.0 で組み込みモジュールの命名に関するポリシーが変更されたため、v1.20.0 以前向けの既存のソースコードに対する互換性が一部失われています。既存のコードがエラーになる場合は以下の点について確認してみてください。
- v1.20.0 まで、MicroPython の組み込みモジュールの名前には "u" が付いていました(usys, uio, uos 等)。これは通常のPython (CPython) の同名の組み込みモジュールのサブセットであることを表すとともに、CPython との互換性向上のために "u" の付かない名前も別名として import できるという仕様になっていました。
v1.21.0 より、これらの組み込みモジュールの名前はほとんどが "u" の付かないものに変更され、逆に "u" の付く名前の方が別名として扱われるようになりました。 - この変更の唯一の例外が
uctypes
モジュールです。このモジュールは CPython のctypes
モジュールと互換性がないため、従来ctypes
を別名として import することができたのが今回の変更でできなくなりました。
uctypes
モジュールにはバッファオブジェクトのアドレスを取得するaddressof()
関数があり、X68k 版の DOS コール呼び出し等のために使われることが多かったのですが、この変更に伴いimport ctypes
を行っているコードは動作しなくなります。import uctypes
への変更が必要です。 - また v1.21.0 より、組み込みモジュールについては import の際にファイルシステムの同名のディレクトリの検索を行わなくなりました。Human68k システムディスクに
SYS
ディレクトリが存在するため、従来はルートディレクトリでimport sys
を行うと組み込みのsys
モジュールが import されないという問題がありましたが、仕様変更によりこの問題は発生しなくなっています。
- X-BASIC で用いられている外部関数ファイル (*.FNC) の読み込みに対応しました。 読み込んだ外部関数は MicroPython の関数として、Python のコードから直接呼び出すことができるようになります。
- 詳細はこちらのドキュメントを参照してください。
MicroPython 本体は MITライセンスで配布されています。 X680x0ハードウェア固有の実装部分についても、MicroPython 本体のライセンス条件に従います。