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


PICBASICコンパイラ

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

[第94回]



●SDカードIF(14)ND80Z3.5に接続(7)WO、WB、WCコマンド

前回はRO(read open)、RB(read byte)などSDカードにセーブしたファイルからデータを読み出すコマンドについて説明しました。
今回はその逆の働きをするコマンドです。
ファイルセーブについてはSコマンド([第90回]参照)がありますが、PICBASICコンパイラプログラムの命令としては使うことはできません。
デバッグ用のコマンドであるということについて前々回、前回書きました。
そこではファイルロードコマンド(Lコマンド)について書いていますがSコマンドについても全く同じことが言えます。
Lコマンドの機能をBASIC命令として使えるようにということでRO、RB、RC、Cコマンドを作りました。
今回はそれと全く同様の理由でSコマンドの機能をBASIC命令として使えるものとしてWO(write open)、WB(write byte)およびWCコマンドを作りました。
WCコマンドは前回のRCコマンドと同様のコマンドです。
C(close)コマンドはread file、write fileで共通です。

ZB3BASICを起動して、デバッグプログラムPSDIF4U3.BINをロードしました。
前回まで使っていたプログラムを一部修正したためプログラムを再ロードしました。
今回の説明のための修正です。

デバッグプログラムを実行する前に念のためにテストに使うメモリ領域の内容を確認しました。
ZB3BASICのマシン語モニタコマンドのDMコマンドでND80Z3.5のRAMエリア8000〜803Fと9000〜903Fの内容を表示しました。
ZB3BASICはBASICだけではなくていくつかの便利なマシン語モニタコマンドをいつでも使うことができます。
そこまで準備してからJP A000でデバッグプログラムにエントリしました。

前回同様まずはDコマンドでディレクトリを表示しました。

前回までのテストで作成したTEST23.BINまでのファイル名が表示されました。
WO TEST24.BIN[Enter]
を実行してWriteモードで新規ファイルTEST24.BINをオープンしました。
コマンドやファイル名は大文字でも小文字でもどちらでも入力できます。
今はまだデバッグ中なのでSDカードIFボードからエコーデータの返信を表示しています。
表示はエラーなく新規ファイルがオープンされたことを示しています。
そのあとWBコマンドを入力しました。
WBコマンドを実行するたびにND80Z3.5のRAMエリアから1バイトのデータが読み出されてそのデータがSDカードIFボードに送出されます。
これも今はデバッグ中なので読み出すデータの先頭アドレスはあらかじめプログラム内で9000からに設定してあります。
そのデータを確認するために今回のはじめのところでND80Z3.5のRAMの9000〜の内容を表示したのです。

前回のRBコマンドはROコマンドを実行した時点でファイルサイズ(バイト数)を取得しているのでファイルエンドで読み取りを終わることができます。
しかしWOコマンドは新規ファイルをオープンしますからその時点ではファイルサイズは未定です。
WBコマンドを実行するごとにSDカードIFボードの側でファイルサイズのカウントは進みますがファイルエンドにはなりません。
ファイルエンドにするにはC(ファイルクローズ)コマンドの実行が必要です。

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

WBコマンドを実行した結果を確認するためにDコマンドを実行してディレクトリを表示しました。

TEST24.BINが追加されました。
LコマンドでTEST24.BINをロードしました。
WBコマンドを6回実行したあとファイルクローズしましたからファイルサイズは6になっています。
現在はデバッグ中なのでロードしたデータはND80Z3.5のメモリアドレス8000から始まるメモリエリアに書き込まれます。
6バイトのデータを読み込みましたからそれを書き込んだ最後のメモリアドレスが8005と表示されました。
実際にそれを確認するために一旦Eコマンドでデバッグプログラムを終了してZB3BASICに戻ったあとDMコマンドで8000〜の中身が書き換わっていることを確認しました。
Eコマンドはデバッグプログラムを終了してZB3BASICに戻るためのコマンドです。

前回はデバッグのためにRBコマンドを繰り返し実行するためのコマンドとしてRCコマンドを紹介しました。
ファイルセーブ用にも同様の機能のコマンドとしてWCコマンドを用意しました。
WCコマンドのテストです。

さきほどはWBコマンドのテストのためにWOコマンドでTEST24.BINを新規オープンしました。
今度はWCコマンドのテストのためにWOコマンドでTEST25.BINファイルを新規オープンしました。
WBコマンドのところで書きましたがRO(リードファイルオープン)と違いWO(ライトファイルオープン)は新規ファイルオープンなのでその時点ではファイルサイズはきまっていません。
WCコマンドの場合にはそのままでは終了することなくどこまでも実行が続くことになってしまい不都合なのでテスト用にプログラムでファイルサイズを設定しました。
動作テストですから前回のRB、RCコマンドのときと同じように21(10進数では33)バイトに設定しました。

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

デバッグのためSDカードIFボードに送出したデータを表示させています。
その値からND80Z3.5のメモリのアドレス9000〜9020の33バイトがSDカードIFボードに送られたことがわかります。
WCコマンドの場合には指定したバイト数を送出するとそこで実行を終了しますからそのときにプログラムによってC(クローズ)コマンドが実行されます。
ですからあらためてCコマンドを実行する必要はありません。
確認のためDコマンドを実行しました。
TEST25.BINが追加されています。

これも確認のためLコマンドでTEST25.BINをロードしました。

ファイルサイズは21(10進数33)、ロードされた最終メモリアドレスは8020と表示されました。

念のためEコマンドでデバッグプログラムを終了してZB3BASICに戻ってDMコマンドでRAMのアドレス8000からのメモリ内容を確認しました。

細かいことを言いますとこの場合アドレス8020については書き換わったかどうかは不確定です。
さらに言うと8000、8002…など偶数アドレスの値はもともとの値と同じですからこれも本当に書き変わったのかどうかはわからないことになります。
テストなどをするときにはこういうところに気をつけないとバグを見逃してしまう可能性があります。
本当は事前に8000〜の中身をFFで埋めておいてからテストをすべきでした。
今回は手抜きをしてしまいましたが、実際にはRCコマンドを作成するときのデバッグでそのようにして正常動作することを確認済みです。

PICBASICコンパイラ[第94回]
2023.10.27upload

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