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

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

[第233回]


●ファンクションコール24H(ランダムレコードアクセスポインタの更新)

ファンクションコール24Hについては[第111回]で説明をしています。
ちょっとどう使うのかよくわからないファンクションです。

そのテストについては、[第111回][第113回]で行なっています。
仮RAMディスクを使ったCP/M互換DOS上でのテストについては[第149回]で説明をしていますが、[第111回][第113回]と同じことをやっているだけのようです。
とはいえかなり時間がたってしまって、もうすっかり忘れてしまいましたから、あらためて[第111回][第113回]を読み直してみました。

しかし、まあ、やっぱりなんだかなあ、という感じのファンクションコールです。
とにかくはテストしないことには終わりませんから、あまり深くは考えないことにして、[第149回]と同様、[第111回][第113回]と同じことをしてみます。

[第111回]ではFTST23.COMを使ってシーケンシャルファイルTEST.SAFを作成しています。
[第112回]ではFTST24.COMを使って、TEST.SAFの内容を読み出しています。
[第113回]ではFTST24.COMにファンクションコール24Hを追加したFTST25.COMを作って、実行しています。

今回も余り時間がありませんから、まずはシーケンシャルファイルTEST.SAFを作成するところまでをやってみることにします。
FTST23をフルRAM用に一部を書き換えてファイル名をVFTST23にしました。

●ソースプログラムVFTST23

; BDOS VFTST23 sequential file make
;ftom ftst5cpy.txt
;2012/3/4 3/7
;2012/4/30
;10/17
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        DMA=$0080
;
	LD C,16;make file
	LD DE,FCB
	CALL FCALL
	INC A;if FFH?
	JP Z,DFULERR
;
        XOR A
        LD (RECNO),A
	LD BC,$0000
;
LOOP:LD E,40
	LD HL,DMA
LOOP1:LD (HL),C
	INC HL
	LD (HL),B
	INC HL
	DEC E
	JP NZ,LOOP1
	PUSH BC
	PUSH DE
	LD C,15;write
	LD DE,FCB
	CALL FCALL
	INC A;if FFH?
	POP DE
	POP BC
	JP Z,DFULERR
	INC BC
	LD A,B
	CP 02
	JP NZ,LOOP
;
CLOSE:LD C,10;close
	LD DE,FCB
	CALL FCALL
	INC A;if FFH?
	JP Z,CLOSERR
	LD DE,OK
	JP MSGOUT
;
DFULERR:LD DE,DFULL
	JP MSGOUT
CLOSERR:LD DE,CANTCLS
MSGOUT:LD C,09
        CALL FCALL
        RET
;
DFULL:"disk"
        " ful"
        "l!"
        DB 0D
        DB 0A
        DB 24;$
CANTCLS:"can'"
        "t cl"
        "ose!"
        DB 0D
        DB 0A
        DB 24;$
OK:"done"
        DB 0D
        DB 0A
        DB 24;$
;
[第111回][第113回]は、簡単なテストでしたからほんの少しのレコードファイルしか作成しませんでしたし、そのあとで行ったランダムアクセスのテストはレコードbェ1バイト8ビットとして行いました。
そこで今回は、後でのランダムアクセスを想定して2バイトのレコードb意識したレコードファイルになるようにプログラムを書き換えました。
とはいっても余りたくさんのデータでは処理に時間がかかってしまいます。
今回のプログラムでは512レコードを作成したところで処理を終了します。
Bレジスタの値が02になったかどうかを確認しているところがその部分です。
カウンタを0000からスタートして0200Hになったら終了します。

●VFTST23の実行

今回も結果を分かりやすくするため、Bドライブをフォーマットし直してから、そこにVFTST23.COMをコピーして、テストを行いました。


シーケンシャルファイルTEST.SAFが作成されました。

●TEST.SAFの中身の確認

VFDUMPを使って、TEST.SAFの中身を確認してみました。
まずはディレクトリの内容の確認です。



TEST.SAFのFCBは4つ作成されています。
ブロックbO003から0022Hまでが使われています。
全部で32ブロックです。
1ブロックは16セクタで、1レコードに1セクタが使われますから、
512/16=32ブロックです。
計算は合っています。

それでは書き込まれたレコードの中身を確認してみます。
最初と最後の数レコードを抽出して確かめてみます。
最初のレコードはブロックbO003の先頭のセクタです。
VFDUMPでのセクタbヘ10進数を与えます。
ブロックbO003の先頭のセクタbヘ、次の計算で求められます(とても簡単です)。

3×16=48

セクタbS8と49の中身を表示させました。



最初のレコードには0000、次のレコードには0001が書き込まれています。
正しく実行されているようです。
最後のデータはどうでしょうか。
最後のブロックbヘ0022Hです。
その先頭のセクタb計算してみます。
22Hを10進数に直します。
34です。

34×16=544

そのブロックの最後のセクタbヘ、35×16−1で求められます(次のブロックの先頭セクタa|1)。
559です。

セクタbT44と559の中身を表示させてみました。



最後まで正しく実行されているようです。

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

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