2023.10.25
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第93回]



●SDカードIF(13)ND80Z3.5に接続(6)RO、RB、C、RCコマンド

今回の見出しのコマンド名ですがこれだけではよくわからないコマンド名です。
マシン語のプログラムですのでプログラムの負荷を軽くするために1〜3文字で略記したコマンド名にしてあります。
ROはRead file Openです。
RBは Read Byteです。
CはCloseです。
RCコマンドはあとで説明します。
前回までSDカードにファイルをSAVE、LOADするときのコマンドとしてD(Directry read)、S(Save file)、L(Load file)について説明してきました。
各機能はファイルアクセスについてごく普通のものですがPICBASICコンパイラにSDカードIFボードを接続することを考えるとこのままでは「普通に」使うことはできません。
そのことについては前回ちょっとだけ説明しました。
そこではPICBASICコンパイラボードを単独で独立して(スタンドアローンで)使う場合にはSAVE/LOADはキー入力も画面表示もないので使えないと説明しました。
今あらためて考えてみるとそれはシステムが用意すべき機能の問題でキーボードがないから使えないとか画面表示がないから使えないというのはちょいと乱暴な表現でした。
「PICBASICコンパイラの機能として考えてみた場合には」という但し書きをつけて説明すべきでありました。
しかし私としてはDIR、SAVE、LOADは前回書いたような機能として考えています。
あくまで主にデバッグ的な使い方のときに使う機能です。

それじゃあPICBASICコンパイラボードとしてはどういう機能があるといいのか、という話になります。
それがRO、RB、Cコマンドです(RCコマンドはやはりデバッグ専用のコマンドです)。
私としてはFILEからデータを読む機能としてはBASICプログラムでは次のようなものにしたいと思っています。
まずはファイルをREAD MODEでオープンして(READ OPEN)
そのファイルから1バイトのデータを読んでそれをある変数に入れ(READ BYTE)
その変数について何らかの処理をしてからREAD BYTEを繰り返し
ファイルエンドになるか終了条件になったらファイルアクセスを終了する(CLOSE FILE)

そのように考えたときには前回説明したLコマンドでは都合が悪いのです。
Lコマンドはファイルオープンから最後のクローズまでをひとつのコマンドとして実行してしまいます。
もっとも機能として工夫すれば上に書いたようなこともできないことは無いのですが。
たとえばLコマンドをBASICプログラムの中で使えるようにした場合そこでLOAD先として配列を指定するようにすればなんとか使えるかもしれません。
しかしその場合でも全部のデータを読み終わって最後のCLOSEが完了したあとでなければREADしたデータにさわることはできません。
それを可能にするにはさらにLOAD命令に機能を追加して一度に読み込むデータ数を指定するなどが必要になります。
何でもパラメータで指定することで機能を拡張する手法はBASICというよりはC(C++)的であります。
好みの問題なのでしょうけれど、私はどうもそうやって1つに集約する手法は好きではありません。
BASIC的というかマシン語的な機能にしたいとつい考えてしまいます。

あれこれ言葉で説明するよりは実際に使うところをお見せしたほうが理解が早いと思います。
いつものようにZB3BASICを起動してデバッグプログラムにエントリしました。

念のためDコマンドでディレクトリを表示したあとROコマンドを実行しました。
ro test13.bin
で前回作成してLコマンドのテストに使ったtest13.txtをファイルオープンしました。
前回のテストからほんのわずかしか経っていないのですけれどその間もデバッグ作業は続いています。
前回はTEST13.BINが最後に作成したファイルでしたが今はTEST22.BINまで作成しています。

RBコマンドを実行しました。

RBコマンドを1回実行するごとにオープンしたファイルの先頭から順にデータが1バイトずつSDカードIFボードから送られてきます。

ファイルの最後まで読まなければならないということはありません。

途中でデータの読み取りを終了する場合にはC(Close)コマンドを入力します。
ファイルを最後まで読んだ場合でもCコマンドを実行します。
そうしないとROコマンドでオープンした情報が生きていて他のファイルをオープンすることができません。
ROコマンドを実行してからCコマンドを入力するまでの間は他のファイルをオープンすることができませんがそのほかのコマンド、たとえばDコマンドとかMコマンドなどは自由に使うことができます。

RBコマンドは1バイトしか読み取れないのでこれでは使い物にならないじゃないかと思われるかもしれません。
今はデバッグ中なのでコマンドとして使っていますが実際にBASICコンパイラに組み込んだ場合にはBASIC命令として使うことになると思います。
その場合には
a=rbyte
というような使い方になると思います(詳細は未定です)。

しかしデバッグ中だとしても確かにこれではいかにも不自由です。
そこでデバッグを楽に進めるという目的でRCコマンドを作りました。
RCコマンドは最初にROコマンドを実行したときに取得したファイルサイズ(データバイト数)をカウンタに入れてカウントすることでファイルの最初から最後まで連続してRBコマンドを実行します。
test13.binではバイト数が多すぎてRCコマンドのテストには不向きです。
そこでデータ数の少ないファイルを新たに作成しました。

SコマンドでND80Z3.5のRAMの8000〜8020のデータをtest23.binというファイル名でセーブしました。
RAMの8000〜8020には前回のテストで作成したデータがそのまま残っていますからそれを利用しました。
セーブしたデータは21(10進数では33)バイトです。

Dコマンドを実行してディレクトリを確認しました。

TEST23.BINが新たに追加表示されました。

ROコマンドでTEST23.BINをオープンします。

次にRCコマンドを入力します。

RC[Enter]の入力でRCコマンドが実行されました。
コマンドは小文字と大文字のどちらでも入力できます。

test23.binに記録されているデータが順に読み込まれました。
RCコマンドはLコマンドと同様ファイルの最後まで読んでしまいますので最後まで読み終わったあとでCコマンドが実行されます。
ですからRBコマンドのように最後にCコマンドを実行する必要はありません。

PICBASICコンパイラ[第93回]
2023.10.25upload

前へ
次へ
ホームページトップへ戻る