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

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

[第229回]


●ファンクションコール28H(空きを00で埋めるランダムライト)

ファンクションコール28Hについては[第110回]で説明をしています。
ファンクションコール22H(ランダムライト)と同じ、ランダムなレコードの書き込みです。
ファンクションコール22Hとの違いについては、[第110回]で説明をしていますので、そちらをご参照ください。
仮RAMディスクを使ってCP/M互換DOSでのテストについては[第147回]で説明をしました。

ファンクションコール28Hのためのテストプログラムは[第110回]で作りました。
FTST20−3です。
[第147回]でもそれをそのまま使いました。

今回はそのFTST20−3をフルRAM用に一部を書き換えてファイル名をVFTST204にしました。

●ソースプログラムVFTST204.TXT

; BDOS TEST23 function22 random write with 00 record
;2012/3/4 3/7 4/16 4/17
;4/30
;10/8
;
        ORG $0100
        FCALL=$0005
	NMBRTBL=$0300
        FCB=$005C
	FCBR0=$007D
	FCBR1=$007E
	FCBR2=$007F
        DMA=$0080
;
        LD C,16;make file
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,DFULERR
;
        XOR A
        LD (FCBR2),A
	LD HL,NMBRTBL
	PUSH HL
LOOP:POP HL
	LD A,(HL)
	CP FF
	JP Z,CLOSE
	LD (FCBR0),A
	LD C,A
	XOR A
	LD (FCBR1),A
	INC HL
	PUSH HL
;data fill
	LD HL,DMA
	LD B,80
LOOP2:LD (HL),C
	INC HL
	DEC B
	JP NZ,LOOP2
;
	LD C,28;random write with 00
	LD DE,FCB
	CALL FCALL
	OR A
	JP Z,LOOP
	POP HL
	OR 30
	PUSH AF
	LD DE,ERRT
	CALL MSGOUT
	POP AF
	LD E,A
	LD C,02
	CALL FCALL
	RET
;
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;$
ERRT:"err "
        DB 24;$
;

●ランダムファイルのセクタデータの確認

ファンクションコール28Hは飛び飛びに作成されるレコードによって虫食い状態になったブロック内の、未使用だがランダムファイルのレコードとしてリザーブされたセクタ(レコード)を、00データで埋めます。

VFTST204の実行によってそのようになったかどうかを確認するために、実行前のセクタの状態を調べておくことにします。
[第110回]では仮RAMディスクでのテストでしたので、実行前と実行後の仮RAMディスクの中身をメモリダンプして確認しました。
しかし今回は作成するランダムファイルのサイズもそれなりに大きいですし、1ブロックは16セクタもありますから、全てを表示するのはちょいと大変です。
そこでごく一部を表示して確認することにしました。

ちょうど[第224回]で同じブロック内の2つのレコードの内容をVFDUMPで確認しています。
下に再掲します。
VFDUMPで仮想FDDのAドライブのセクタbP842と1845の中身を表示させています。


[第224回]の説明にありますように、TEST.RAFのレコードbO1A2と01A5が同じブロックbO073Hにあって、そのセクタは先頭を0000とする通しai10進数)で表すと1842と1845になります。
そこで、その間のセクタを表示させてみました。

ご覧の通りセクタbP842と1844の間にあるセクタbP843、1844はいずれも全データがE5Hになっています。
E5が書かれているということはこのセクタが一度も使われたことがないということを示しています。

これでVFTST204を実行する前のTEST.RAFの内容の確認ができました。
それではVFTST204を実行してみます。

●VFTST204の実行



VFTST204.COMをAドライブに保存すると、新しくつくるTEST.RAFのセーブエリアが、いままでのエリアとずれてしまい、せっかく上で確認したのと違うセクタbェ使われてしまいます。
そこでVFTST204.COMはBドライブに保存しました。
すでに作成されているTEST.RAFを一旦削除します。
その上で、VFTST204を実行しました。

その結果なのですが…。


念のためにディレクトリエリアを確認してみましたら。
あれ?
ファイルが作成されていません。
下の3つのTEST.RAFのFCBは先頭にE5が書かれていますから、これは削除されたファイルネームです。

むむ。
どうやらファンクションコール28Hにバグがあるようです。

本日は時間がなくなってしまいました。
いろいろ忙しいなかで、今回みつかったバグをつぶさなければなりません。
うまくバグ退治ができましたら、明日またご報告ができるのですけれど。
さて、どうなりますでしょうか。

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

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