Raspberry Pi PicoでPicoMite(MMBasic)を使う〜ライブラリとフラッシュスロットの利用

# はじめに

MMBasicにも他のプログラミング言語にもある自作の関数やサブルーチンを標準の関数やコマンドのように他のプログラムから利用できるようにするライブラリ機能や大きなプログラムを分割して保存し、分割したプログラムをまとめて実行できるようにするフラッシュスロットという機能がある。ここではそれらの使い方をまとめた。

# ライブラリ機能

ライブラリは、作成した関数やサブルーチンをフラッシュメモリ内の特定の領域に保存して標準の関数やライブラリと同じように利用できる機能のことである。

PicoMite（MMBasic）ではライブラリは次の手順で作成する。

1. ライブラリにする関数やサブルーチンを作成し、正しく動作するかをテストする
2. プログラムメモリにライブラリにするプログラムだけにし、それ以外のプログラムを削除する
3. `LIBRARY SAVE`コマンドでプログラムメモリのプログラムをライブラリに追加します。この操作でプログラムメモリは空になる

プログラムメモリ内にはライブラにした関数やサブルーチンと同じ名前の関数やサブルーチンがあるとが実行時に名前の重複エラー（Error : Duplicate name）が発生するので注意する。

ライブラリに保存されたコードは余分な空白、コメント、空白行などを削除して圧縮されて領域を効率的に使用します。

ライブラリはRaspberry Pi Picoのフラッシュメモリ内に専用の領域に保存されます。ライブラリの使用状況は`MEMORY`コマンドで確認できます。

```
> MEMORY
Program:
   1K ( 0%) Program (41 lines)
 127K (100%) Free

Library:            ← ライブラリの領域
   1K ( 1%) Library
 127K (99%) Free

Saved Variables:
  16K (100%) Free

RAM:
   0K ( 0%) 0 Variables
   0K ( 0%) General
 156K (100%) Free
>
```

ライブラに保存されたプログラムはLISTやEDITコマンドでは表示できないのでライブラリのプログラムのリストを表示する`LIBRARY LIST`コマンドを使用する。
以下に実行例を示す。[3軸加速度センサー＋3軸ジャイロセンサーのデータを取得する](https://qiita.com/ksakabe/items/e06d706218792b3efcb9)で作成した関数が保存されているのが確認できます。

```
> LIBRARY LIST
Function ReadWordToSigned16(ADDR As Integer, REG As Integer) As Integer
 Local data%(2), tmp
 I2C WRITE ADDR, 0, 1, REG
 I2C READ ADDR, 0, 2, data%()
 tmp = data%(0) << 8 Or data%(1)
 If tmp >= &H8000 Then tmp = tmp - &H10000
 ReadWordToSigned16 = tmp
End Function
```

## ライブラリ操作コマンド

ライブラリ操作コマンドを次の表に示します。

|コマンド     |内容|
|-------|---|
|LIBRARY SAVE|プログラムメモリにあるコードの冗長なデータを削除してライブラリ領域に保存する|
|LIBRARY DELETE|ライブラリを削除し、フラッシュスロット3を開放します|
|LIBRARY LIST|ライブラリの内容を一覧表示する|
|LIBRARY LIST ALL|ページ確認なしにライブラリの内容を一覧表示する|
|LIBEARY DISK SAVE fname$|現在のライブラリをファイルfname$として保存する|
|LIBEARY DISK LOAD fname$|ライブラリファイルfname$をライブラリメモリにロードする|

### ライブラリをファイルとして保存

ライブラリを保存、復元、配布できるようにするには'LIBRARY SAVE'コマンドを使います。このコマンドを使うとライブラリをファイルとしてフラッシュファイルシステムに保存します。

ライブラリファイルの拡張子は`lib`になる。拡張子を省略した場合には自動的に付加される。
ファイル化することでXMODEMなどのシリアル通信でMacなどのコンピュータに転送できます。

ライブラリ保存の実行例を示します。FILESコマンドでフラッシュファイルのファイルのリストを取得できます。

```
> LIBRARY DISK SAVE "ReadWordToSigned16"
> FILES "*.lib"
A:/
19:37 15-05-2025        252  ReadWordToSigned16.lib
0 directories, 1 file, 634880 bytes free
>
```

# フラッシュスロット

PicoMiteにはプログラムメモリのプログラムとは完全に異なるプログラムや作業中のプログラムの以前のバージョンを保存できるフラッシュスロットという領域が3つ用意されています。

フラッシュスロットを使うとプログラムメモリの内容や変数と設定を保持したままでフラッシュスロットに保存されている別のプログラムを読み込んで実行できます。この機能を`チェーン`といいます。
チェーン機能を使うとプログラムメモリに格納できない大きなプログラムを分割して保存し、まとめて実行できるようになります。

## フラッシュスロットコマンド

フラッシュスロット操作コマンドを次の表に示します。

|コマンド|機能|
|-|-|
|FLASH SAVE n|プログラムメモリ内のプログラムをフラッシュスロットnに保存する|
|FLASH LOAD n|フラッシュスロットnのプログラムをプログラムメモリに読み込む|
|FLASH RUN n |フラッシュスロットnからプログラムを実行する。すべての変数はクリアされるが、プログラムメモリの内容は保持される|
|FLASH LIST  |フラッシュスロット内のプログラムの最初の行とフラッシュスロットの一覧を表示する|
|FLASH LIST n[, ALL]|フラッシュスロットnに保存されているプログラムをページ区切りで一覧表示。ALLを指定するとページ区切りしない|
|FLASH ERASE n|フラッシュスロットnの内容を消去する|
|FLASH ERASE ALL|すべてのフラッシュスロットの内容を消去する|
|FLASH CHAIN n|すべての変数をそのままに、フラッシュスロットnのプログラムを実行する|
|FLASH OVERWRITE n|フラッシュスロットnの内容を消去し、プログラムメモリの内容をそのスロットに保存する|
|FLASH DISK LOAD f$ [, O[VERWRITE]]|LIBRARY DISK SAVEコマンドで作成されたバイナリファイルを作成されたバイナリファイルをフラッシュスロットに読み込む。Oを指定するとスロットを上書きする|

## FLASHコマンドの利用例

ライブラリを利用しているだけの状態（スロット3をライブラリに使用）で`FLASH LIST`コマンドの実行例を以下に示します。

スロット1と2は空で利用可能なことがわかります。

```
> FLASH LISR
 Slot 1 available
 Slot 2 available
 Slot 3 in use: Library
```

次のプログラムを使ってフラッシュスロットの利用を試してみます。

```BASIC:for1to10.bas
' Print 1 -> 10
For i = 1 To 10
  Print i;
Next i
Print
```


### プログラムメモリの内容をフラッシュスロット1に保存

上記のプログラムを`FLASH SAVE`コマンドを使ってフラッシュスロット1に保存します。フラッシュスロットにファイルを保存してもプログラムメモリの内容は消えません。

```
> FLASH SAVE 1
```

### フラッシュスロットのリスト表示

`FLASH LIST`コマンドでフラッシュスロットのリスト表示を表示できます。保存されているプログラムの1行目のみが表示されます。

```
> FLASH LIST
 Slot 1 in use: "' Print 1 -> 10"     ← プログラムが保存されている
 Slot 2 available
 Slot 3 in use: Library
```

###  フラッシュスロット1のプログラムのリスト表示

フラッシュスロットのプログラムを表示するには`FLASH LIST n`コマンドを使います。nはスロットの番号です。

```
> FLASH LIST 1
' Print 1 -> 10
For i = 1 To 10
  Print i;
Next i
Print
```

###  フラッシュスロット1のプログラムの実行

フラッシュスロットに保存されているプログラムは`FLASH RUN n`コマンドで実行できます。
フラッシュスロット1のプログラムを実行した例を示します。

```
> FLASH RUN 1
 1 2 3 4 5 6 7 8 9 10
```

## チェーンの利用例

チェーンの機能を利用するために次のようにプログラムメモリの内容を変更して実行してみます。
最後の行の`FLASH CHAIN 1`コマンドでフラッシュスロット1のプログラムを続けて実行するように指定しています。

```BASIC:chain-example.bas
' Print 11 -> 20
For i = 11 To 20
  Print i;
Next i
Print

Flash Chain 1
```

実行するとチェーンしているプログラムも実行されていることがわかります。

```
> RUN
 11 12 13 14 15 16 17 18 19 20
	 1 2 3 4 5 6 7 8 9 10          ←　フラッシュスロット1のプログラムの実行結果
```

チェーンしたプログラムの実行が終わるとそれ以降にプログラムがあっても継続されないので注意する。

# 参考サイトなど

- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)