はじめに
『MSX0 Stack』付属の IoT BASIC サンプルを『Turbo Pascal』へ移植してみます。
TREE.BAS
◆ノードリスト表示
項目 | 説明 |
---|---|
概要 | ノードを再帰的にスキャンしてリスト表示します。 |
ファイル名 | TREE.BAS |
対応デバイス | |
コメント | CALL IOTFIND を利用すると、ノードが持つアイテムの個数や名前のリストを取得できます。 リストの内容が動的に変化するものに対してはアイテムの個数を取得したときにリストの更新が行われます。 |
See also:
MSX0 Stack での挙動
TREE.BAS
をロードして、
実行してみました。
IoT ノードリストが表示されます。
プログラムは〔Ctrl〕+〔Stop〕(リモートコントロールパネルからは〔Ctrl〕+〔F12〕) で中断できます。
Turbo Pascal へ移植
別途、MDL-LIB と SYSUTILS.LIB
、IOT.LIB
が必要です。
program TREE;
{$A-}
type
LibStr = string[255];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
var
Flg: Boolean;
procedure GetNodes(Node: LibStr);
var
List, Last, p: PItem;
CC: Integer;
begin
if Flg then
Exit;
Writeln(Node);
List := nil;
CC := IotFindCount(Node);
IoTFind(Node, List, Last);
p := List;
while (p <> nil) and (not Flg) do
begin
GetNodes(Node + '/' + p^.Data);
p := p^.Next;
Flg := Flg or KeyPressed;
end;
ClearListItem(List);
end;
begin
Flg := False;
GetNodes('host');
GetNodes('device');
GetNodes('msx');
GetNodes('conf');
end.
実行してみました。
IoT ノードリストが表示されます。
任意のキーで中断できます。
解説
再帰
こういうのは再帰で書くのが簡単です。CP/M-80 版『Turbo Pascal』で再帰プログラムを書く時には {$A-}
コンパイル指令を指定します。
See also:
IotFindCount()
最初、BASIC プログラムの 120 行目が何を意味しているか解りませんでした。ノードのアイテム数を変数 CC に入れているのですが、この CC という変数は他で参照されていないからです。
120 _IOTFIND(N$,CC)
ドキュメントを読んで意味が解りました。
リストの内容が動的に変化するものに対してはアイテムの個数を取得したときにリストの更新が行われます。
リストが可変のノードに対しては個数を空読みしてリストを更新する必要があるのですね。
おわりに
今回の移植に関して難しい所は特にありませんでした。
記事に関連しますが、以前 MSX-DOS で Wi-Fi の AP リストを登録するトランジェントコマンド M0SETAP を作った事があります。
同様に、I2C デバイスを検索するトランジェントコマンド M0I2CSCN も作った事があります。