3チップ構成68Kマイコンの構想(その12)Blocking/Deblocking [68K]
前回の記事でプリント基板化のためのパターン設計について書きましたが、プリント基板製造をSeeedさんに注文し待ち状態です^^
今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。
SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
今回の対応で変更したワークエリアは
の変更を行いました。
BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。
ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。
文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
(ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)
参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。
BIOS内ブロッキング/デブロッキング処理
ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。
対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。
★2018/10/17 追記
コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。
CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。
下のキャプチャがロジアナ波形のBefore/After比較になります。
対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。
改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。
今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。
CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回はCP/M-68KのSDカードアクセス時のブロッキング/デブロッキング処理を追加しました。
3チップ構成のCP/M-80の時はCP/Mのメモリサイズを最大の64KBにしたいこともあってSDカードアクセス処理でブロッキング/デブロッキング処理には対応していませんでした。
今回のCP/M-68KではBIOSのメモリサイズをあまり気にしなくてもいいこと、及びコマンドのサイズがCP/M-80と比較して大きめなのでコマンド実行時に少し待ち時間が発生してしまうのでブロッキング/デブロッキング処理に対応しました。
SDカードのブロック長は512バイトなのでCP/Mのセクタ(128バイト)の4つ分に該当します。
今回の対応で変更したワークエリアは
- PICと68K間のSDデータ渡し用の領域(SDバッファ)を128バイトから512バイトに変更
- SDバッファ内のデータがSDに書き込み済みでない場合の変更フラグを追加
- SDバッファの属性としてsector番号での管理をSDのブロック番号の管理に変更
の変更を行いました。
BIOS内のWriteSectorコール時にD1レジスタに下記の情報が渡されます。
- d1.w = 0 : normal write
- d1.w = 1 : write to a directory sector
- d1.w = 2 : write to first sector of new block
WriteSector処理での追加処理としては最初にSDバッファがヒット(今回の書込みセクタが含まれている)場合はSDの先読みは不要で含まれていない場合は変更フラグがオンならSDバッファをSDに書き込み後、先読みが必要か判断します。
3)の場合は先読み不要でそれ以外の場合は先読みが必要になります。
DMAの内容をSDバッファに書き込み、変更フラグをオンにし、2)の場合は即座にSDバッファ内容をSDに書き込みます(変更フラグはオフにする)。
ReadSector処理に関してはSDバッファにヒットしている場合はSDバッファからセクタ内容を読み取り、ヒットしない場合は変更フラグがオンの場合SDバッファを書込んだ後、必要なSDブロックの内容をSDバッファに読込みます。
SDバッファにヒットした場合、変更フラグがオンでもSDへの書込みは不要ですが、今回は長時間変更フラグがオンになる(その間、電源断等が発生すると書込み情報が失われる)のを避けるため、ReadSector処理ではありますがSDへの書込みを行うようにしました。
文章で書くと少しややこしいですが、プログラム的には若干の追加で対応可能です。
(ワークエリアはSDバッファが4倍に増えるけどプログラムコードのサイズはあまり増えない)
参考に今回対応したBIOSのReadSectorとWriteSectorの部分の抜粋を以下に貼っておきます。
|
ブロッキング/デブロッキング対処後の動作例として「XMODEMアプリの作成」の記事で載せたxmodemでのファイル送信中のロジアナ波形のbefore/Afterを貼っておきます。
Before |
|
対処後は下図の赤丸部分に示すようにSDカードのアクセス回数が減少しています。
After |
|
★2018/10/17 追記
コメントに書いたようにCP/MからBIOSのWriteSectorには新たに確保したブロックの最初のセクタ書込み(D1レジスタ=2)であるという情報が渡されています。
今回はCP/Mのブロックサイズを2048バイトにしているので、この情報からSDカードの4ブロック分(SDカードのブロックサイズは512バイト)、先読み無しで書込んでも問題ないはずなので改善してみました。
ワークエリアとして新たに先読み不要カウンタと先読み無しで書込んだブロック番号の保存用ワークを追加して、念のためにSDカードのブロック番号が連番であることも確認するようにしています。
また、ワークエリアを絶対アドレス指定でアクセスするとコード効率が悪くなるのでアドレスレジスタとのオフセットでアクセスするように一部変更しました。
CP/Mの2ブロック分をバイナリモードで単純に書き込むテストプログラムを作りSDカードへの書込み動作を確認してみました。新規ファイルへの書込み動作のみを確認するためにファイルオープン後の書込み開始前と書込み終了後のファイルクローズ前にキー入力処理を入れることでファイルへの書込み中の波形をロジアナで確認しました。
下のキャプチャがロジアナ波形のBefore/After比較になります。
対処前はCP/Mブロックの最初の書込みだけ先読みがない状態なのでSDへの書込みの4回に3回は先読みが発生しています。
Before |
|
改善後は新規書込みの場合、常に先読み無しでSDカードへの書込みが行われていて想定通りの動作になっています。
After |
|
今回、CPM.SYSを何度か変更して評価するにあたり、CP/M-68Kで採用されているCP/Mローダのおかげで、AドライブのCPM.SYSファイルを入れ替えてCP/Mを再立ち上げするだけでいいので効率的に作業が出来ました。
CP/Mのファイルセットに含まれているサイズが大きめのDDT68000.68K(431セクタ、54KB)のファイルをpipコマンドで空ディスクにコピーする時間を計ってみたところ 5.2秒から4.9秒に改善されました(あまり変わらないですねw)
[TOP] [ 前へ ] 連載記事 [ 次へ ]
今回、CP/Mのディスク定義でblocksizeを2048にしているのでBIOSのWriteSectorがコールされた際、「d1.w = 2 : write to first sector of new block」であれば、SDのブロックが連番で4ブロックの書込みであれば、4ブロック分先読み無しで行けそうですね。
by skyriver (2018-10-15 23:01)
上のコメントに書いたように新規書込みの場合、先読み無しになるように改善し、記事に追記しました。
by skyriver (2018-10-17 00:36)