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


PICBASICコンパイラ

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

[第90回]



●SDカードIF(10)ND80Z3.5に接続(3)Sコマンド、Dコマンド

前回はDIRセクタを読み出してその値を表示するところで終りました。
まだファイルをセーブしていないのでDIRは空です。
そこでテストとしてなにか適当なファイルをセーブしてみることにしました。
その前にまずはテストデータつくりです。
そのための簡単なプログラムを即席で作って実行しました。
作ったプログラムはmktdata.binです。
B000番地にロードして実行しました。

mktdata.binは9000番地から9FFF番地に9000から始まる16進数4桁の値を順に書き込むプログラムです。
正しく書き込めているかどうかをDMコマンドで確かめました。
一番最初の値は9000です。
この9000を9000番地に00、次の9001番地に90というように書き込みます。
次の9002番地にはそのアドレスと一致するように9002の02を書き込み9003番地に90を書き込みます。
1セクタは512バイトですからそのようにして作成したデータをセーブすると最初のセクタには9000〜91FEの512バイトがセーブされるはずです。
アドレスでは9000〜91FFの値です。
次の9200からの値は次のセクタに書かれるはずです。
作成したテストデータは次のセクタにも正しい値が書き込めることが確認できる値になっています。
mktdata.binはND80Z3.5に附属の当社オリジナルのZ80アセンブラで作成しました。
ND80Z3.5は超便利なのです。
下がそのアセンブルリストです。
ソースプログラムmktdata.txtはフリーのテキストエディタTeraPadで作成しました。
2023/10/10  8:45  mktdata.txt
END=B00F
              ;;;make test data for sdcd
                ORG $B000
                REENT=$1033
B000 210090     LD HL,$9000
B003 75       LOOP:LD (HL),L
B004 23         INC HL
B005 74         LD (HL),H
B006 23         INC HL
B007 7C         LD A,H
B008 FEA0       CP A0
B00A C203B0     JP NZ,LOOP
B00D C33310     JP REENT
              ;
              ;END
              ;
LOOP         =B003  REENT        =1033  

これで準備ができたのでテストデータファイルをセーブします。
ファイルセーブコマンドは
s filenameです
前回と同様jp a000でSDカードテストプログラムを実行しました。
SDカードテストプログラムは前回A000からロード済みですからjp a000でいつでも実行できます。
最初にiコマンドを実行したあとで
s testd1.bin,9000,9234
を実行しました。

9000〜9234は235H(565)バイトなので2つのセクタにまたがってセーブされるはずです。
のちほどそれを確かめてみます。
コマンドを実行したあとに連続した値が2行表示されています。
プログラムデバッグのために仮にこのような機能を挿入しています。
上の行はPIC18F4550からPIC18F2550に送ったファイル名データをPIC18F2550がエコーとして返信してきたもので、下の行はPIC18F2550が受け取ったファイル名データをDIRの書式に変換したあとで確認のためにPIC18F4550に送信してきたものです。
実はこの(A000〜の)テストプログラムはND80Z3.5のZB3BASIC+マシン語モニタシステムの上で実行しているためキーボードから小文字で入力した文字はND80Z3.5のシステムが大文字のコードに変換して入力バッファに入れます。
そのためそれをPIC18F4550に送信する段階で上の画面のように大文字のコードに変換されてしまっています。
この機能のもとでは残念ながら確認できないのですがPIC18F2550のDOSプログラムには送られてきたファイル名のコードを確認してそれが小文字だった場合には大文字コードに変換する機能が組み込まれています。
DIRのファイル名のルールは昔のMSDOSのルールに従っています。
ファイル名は大文字で記述します。
ファイル名本体は8文字で8文字に満たない場合には8文字になるまでスペース(コード20)が追加されます。
拡張子は3文字で3文字に満たない場合は3文字になるまでスペースが追加されます。
ファイル名本体と拡張子の間の .(ピリオド)は省かれます。
上の2行のファイル名情報はデバッグのためにPIC18F2550のファイル名バッファ(レジスタアドレス30〜3B)のアドレスも合わせて送信されてきています。
たとえば最初の30はPIC18F2550のファイル名バッファの先頭のレジスタアドレスでその次がそこに入るファイル名の最初の文字コード54(’T’)です。
上の行のデータはキーボードから入力されたまま前詰めで .(ピリオド、文字コード2E)も含まれています。
文字列の終わりはアドレス39の4E(’N’)なのでその後ろのアドレス3A、アドレス3Bには関係のない「ゴミ」が入っています。
下はMSDOSのルールに合わせて変換されたファイル名の並びになっています。
実際にDIRに入れられたり、ファイル名サーチなどで使われるファイル名はアドレス30からアドレス3Aまでの11文字(8+3)で最後のアドレス3Bの値は使われません。
2行の文字列データのあとエラーなく処理が進行していることを示す00が18F2550から送られてきます。
18F2550が受け取ったデータ数235(16進数)が18F2550から送られてきて表示されています。

DIR表示コマンドdを実行しました。

ファイル名のTESTD1.BINが表示されました。

ファイルセーブやDIRの読み出しなどを実行するとレジスタバッファ3と4にFATセクタが読み込まれます。
それを確認するためにm 3を実行しました。

m nはレジスタ(メモリ)バッファnの値を表示するコマンドです(前回参照)。
今回はTESTD1.BINファイルをセーブしたため最初のユーザー用クラスタ#2がFFFFになりました。

dコマンド(ディレクトリ表示コマンド)を実行するとDIRエリアのファイル名が書き込まれている最後のセクタの値がレジスタバッファ5と6に読み込まれます。
m 5を実行しました。

DIRセクタには1つのファイルについて32バイトを使ってファイル名やそのほかの必要な情報が記録されます。
そこにはファイル名のほかセクタのアクセスに必要な情報が記録されます。
下の段の後ろから6バイト目と5バイト目にはこのファイルが記録されているクラスタ番号があります。
クラスタ番号は0002です。
そのうしろにはこのファイルのデータ量(バイト数)があります。
16進数の235(10進数の565)バイトです。
ここで読み取ったDIRエリアはDIR表示コマンドを実行したためにレジスタバンク5と6に読み込まれたデータです。
そのときのセクタbワではわかりません。
前回はBPBから読み取った情報によってDIRのセクタ番号が01E8かららしいと推定しましたがまだそれを確認できたわけではありません。
そこでそれを確認するためにセクタbO1E8を実際に読んでみます。

読み込む先はレジスタバンク1と2です。
念のために現在のレジスタバンク1の内容をm 1コマンドを実行して表示させました。

セクタbO000が読み込まれています。

先にrs 01e8を実行し続いてm 1を実行しました。

DIRの先頭のデータが表示されました。
これでDIRの先頭のセクタbェ01e8であることが確認できました。

今回はここまでです。

PICBASICコンパイラ[第90回]
2023.10.18upload

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