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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第145回]


●ファンクションコール22H(ランダムライト)

ファンクションコール22Hについては[第102回]で説明をしています。
ランダムなレコードの書き込みです。
レコードb指定して、128バイトのデータをそのレコードbノよって算出されるセクタに書き込みます。
CP/M2.2は良く言えば柔軟、悪く言えば原始的なつくりをしています。
CP/M2.2のランダムファイルは1レコードが128バイトの固定長です。
つまり1レコード=1セクタです。
どこが柔軟やねん、といわれるかも知れませんが、ものは考えようで、そういう構造だからこそ、料理がし易いとも言えます。
完全調理済で、それを別の味に仕立てようとすると思いっきり苦労してしまう、Windowsアプリなどに比べますと、もう素材そのもの、といった感じです。
ですから料理の仕方次第でBASICでもFORTRANでもなんでも出来てしまいます。

[第102回]では、「シーケンシャルライトではレコードbフ指定ができなくて順番に書いていくことしかできないが、ランダムライトはレコードb指定することによって、ランダムなレコードの書き込みができる」、と書きましたが、ウソでありました。
それはあくまで一般論でありまして、CP/M2.2はそうではなかったのです。
ランダムライトとはちょっと仕組みは異なりますが、シーケンシャルライトでもレコードb指定して、ランダムな書き込みをすることができます。
それはランダムアクセスについての作業を進めていくなかで明らかになってきたことです。
このことにつきましては[第114回]のあたりで書いておりますのでご参照願います。

さてランダムライトそのものにつきましても、回を進めるごとに少しずつその仕組みが明らかになってきたのでありますが、今回はCP/M互換DOSとしては最初のランダムライトのテストですから、まずは[第102回]で行なったテストと同じことをして、その動作を確認してみることにします。
[第102回]ではテストプログラムFTST20を作成しました。
また、あらかじめレコード番号表を8300H〜に作成しました。
このあたりも全て[第102回]と同じようにします。

実際に行なった作業とその結果につきましては、いつものようにログファイルをもとに説明を致します。

>/ld fille5.bin,8100
loading FILLE5.BIN ...0010(16)bytes loaded,from 8100 to 810F
>jp 8100
>/ld ftst20.bin,8100
loading FTST20.BIN ...00a5(165)bytes loaded,from 8100 to 81A4
>jp d233

A>save 1 ftst20.com

A>ftst20 test.raf
done

A>ftst20 b:test.raf
done

A>end of ZBDOS
>dm 8800,883f
8800  00 46 54 53 54 32 30 20-20 43 4F 4D 00 00 00 02  .FTST20  COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 00  .TEST    RAF....
8830  08 00 00 03 06 07 00 00-04 02 05 00 00 00 00 00  ................
>dm a000,a01f
A000  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 00  .TEST    RAF....
A010  07 00 00 02 05 06 00 00-03 01 04 00 00 00 00 00  ................
>

仮RAMディスクが手狭ですので、FILLE5.BINを使って仮RAMディスクを再フォーマット(クリア)しました。
FILLE5.BINは[第38回]で説明をしました。

そのあと、CP/M互換DOSを起動して、まずはAドライブで、次にBドライブでもFTST20を実行して、ランダムファイルTEST.RAFを作成しました。

[Ctrl]+[D]を入力してCP/M互換DOSを終了後、DMコマンドでAドライブとBドライブのディレクトリエリアを表示させました。
何回も書いておりますが、ND80ZVの実メモリ上に仮RAMディスクを設けていますから、こういう芸当が簡単にできてしまいます。
これが通常の外部RAMなどに設けたRAMディスクだったりしますと、こうはいきません。
それなりのツール(プログラム)が必要になります。

メモリダンプの中味をみますと。
おお。
うまくいったようです。
TEST.RAFのFCBが作成されていて、そのブロックアローケーションエリア(FCBの17バイト目から16バイト)には、ブロックbェ記入されています。

同じことは[第102回]でしています。
そのときのダンプリストです。

>dm 8300,830f
8300  26 0F 22 27 29 0E 11 12-16 03 0D FF EB 65 B7 DF  &."')........eキ゚
>dm 8800,883f
8800  00 46 54 53 54 32 30 20-20 43 4F 4D 00 00 00 02  .FTST20  COM....
8810  01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8820  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 2A  .TEST    RAF...*
8830  08 00 00 03 06 07 00 00-04 02 05 00 00 00 00 00  ................
>dm a000,a01f
A000  00 54 45 53 54 20 20 20-20 52 41 46 00 00 00 2A  .TEST    RAF...*
A010  07 00 00 02 05 06 00 00-03 01 04 00 00 00 00 00  ................
>

同じですね。
実は。
よく見ると同じではありませんでした(どこが違うかおわかりになりますでしょうか)。
私は、うかつにも、このときは気が付きませんでした。
そのことにつきましては、後の回で説明をいたします。

ディレクトリの内容につきましてはそういうことですので、ちょいと後の説明にゆずることにいたしまして、さて、実際にデータが正しくセーブされたかどうかも確認してみなければなりません。
ランダムファイルのブロックaAレコードbニ、そのレコードの値が実際にセーブされるセクタbニの関係につきましては、[第103回]で説明をいたしました。
そのときと同じようにセクタの内容もメモリダンプしてみました。
[第103回]では各セクタの128バイトを全て表示していますが、各セクタの128バイトはそれぞれ同じ値なので、Aドライブ、Bドライブとも最初の2セクタについては128バイト全部を表示し、その他のセクタはそれぞれ32バイト分を表示しました。

>dm 8d00,8dff
8D00  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D10  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D20  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D30  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D40  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D50  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D60  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D70  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
8D80  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8D90  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DA0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DB0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DC0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DD0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DE0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
8DF0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
>dm 8e80,8e9f
8E80  0D 0D 0D 0D 0D 0D 0D 0D-0D 0D 0D 0D 0D 0D 0D 0D  ................
8E90  0D 0D 0D 0D 0D 0D 0D 0D-0D 0D 0D 0D 0D 0D 0D 0D  ................
>dm 8f00,8f1f
8F00  0E 0E 0E 0E 0E 0E 0E 0E-0E 0E 0E 0E 0E 0E 0E 0E  ................
8F10  0E 0E 0E 0E 0E 0E 0E 0E-0E 0E 0E 0E 0E 0E 0E 0E  ................
>dm 8f80,8f9f
8F80  0F 0F 0F 0F 0F 0F 0F 0F-0F 0F 0F 0F 0F 0F 0F 0F  ................
8F90  0F 0F 0F 0F 0F 0F 0F 0F-0F 0F 0F 0F 0F 0F 0F 0F  ................
>dm 9100,911f
9100  22 22 22 22 22 22 22 22-22 22 22 22 22 22 22 22  """"""""""""""""
9110  22 22 22 22 22 22 22 22-22 22 22 22 22 22 22 22  """"""""""""""""
>dm 9280,929f
9280  29 29 29 29 29 29 29 29-29 29 29 29 29 29 29 29  ))))))))))))))))
9290  29 29 29 29 29 29 29 29-29 29 29 29 29 29 29 29  ))))))))))))))))
>dm 9480,949f
9480  11 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11  ................
9490  11 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11  ................
>dm 9500,951f
9500  12 12 12 12 12 12 12 12-12 12 12 12 12 12 12 12  ................
9510  12 12 12 12 12 12 12 12-12 12 12 12 12 12 12 12  ................
>dm 9700,971f
9700  16 16 16 16 16 16 16 16-16 16 16 16 16 16 16 16  ................
9710  16 16 16 16 16 16 16 16-16 16 16 16 16 16 16 16  ................
>dm 9980,999f
9980  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
9990  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
>dm a300,a3ff
A300  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A310  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A320  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A330  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A340  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A350  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A360  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A370  26 26 26 26 26 26 26 26-26 26 26 26 26 26 26 26  &&&&&&&&&&&&&&&&
A380  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A390  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3A0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3B0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3C0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3D0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3E0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
A3F0  27 27 27 27 27 27 27 27-27 27 27 27 27 27 27 27  ''''''''''''''''
>dm a480,a49f
A480  0D 0D 0D 0D 0D 0D 0D 0D-0D 0D 0D 0D 0D 0D 0D 0D  ................
A490  0D 0D 0D 0D 0D 0D 0D 0D-0D 0D 0D 0D 0D 0D 0D 0D  ................
>dm a500,a51f
A500  0E 0E 0E 0E 0E 0E 0E 0E-0E 0E 0E 0E 0E 0E 0E 0E  ................
A510  0E 0E 0E 0E 0E 0E 0E 0E-0E 0E 0E 0E 0E 0E 0E 0E  ................
>dm a580,a59f
A580  0F 0F 0F 0F 0F 0F 0F 0F-0F 0F 0F 0F 0F 0F 0F 0F  ................
A590  0F 0F 0F 0F 0F 0F 0F 0F-0F 0F 0F 0F 0F 0F 0F 0F  ................
>dm a700,a71f
A700  22 22 22 22 22 22 22 22-22 22 22 22 22 22 22 22  """"""""""""""""
A710  22 22 22 22 22 22 22 22-22 22 22 22 22 22 22 22  """"""""""""""""
>dm a880,a89f
A880  29 29 29 29 29 29 29 29-29 29 29 29 29 29 29 29  ))))))))))))))))
A890  29 29 29 29 29 29 29 29-29 29 29 29 29 29 29 29  ))))))))))))))))
>dm aa80,aa9f
AA80  11 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11  ................
AA90  11 11 11 11 11 11 11 11-11 11 11 11 11 11 11 11  ................
>dm ab00,ab1f
AB00  12 12 12 12 12 12 12 12-12 12 12 12 12 12 12 12  ................
AB10  12 12 12 12 12 12 12 12-12 12 12 12 12 12 12 12  ................
>dm ad00,ad1f
AD00  16 16 16 16 16 16 16 16-16 16 16 16 16 16 16 16  ................
AD10  16 16 16 16 16 16 16 16-16 16 16 16 16 16 16 16  ................
>dm af80,af9f
AF80  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
AF90  03 03 03 03 03 03 03 03-03 03 03 03 03 03 03 03  ................
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Jun 01 20:25:45 2012

各セクタのアドレス、内容は、[第103回]のメモリダンプの内容と一致しました。

ワンボードマイコンでCP/Mを![第145回]
2012.6.9upload

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