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

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

[第216回]


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

しばらくぶりの更新です。
このところいろいろやらねばならないことが重なってしまい、つい更新が後回しになってしまいました。
それといよいよ最後のランダムアクセス関係のファンクションコールがちょいとホネでありまして、仮RAMディスク版から仮想FDD版に移行する段階で、ランダムアクセス関係のプログラム部分には十分なデバッグができてなかったため、案の定トラブッてしまい予想外に時間を食ってしまったことも、更新が遅くなってしまった理由のひとつです。

ファンクションコール22H(ランダムライト)については、最初に[第102回]で説明をしました。
そこで作ったテストプログラムはFTST20です。
仮RAMディスク版としては、[第145回]で説明をしました。

いままでと同じ手順に従えば、[第145回]あたりをベースにして、フルRAM(及び仮想FDD)版についての説明を展開することになるのですけれど。
実は。
仮RAMディスク版は、容量の制約からモデル的に、ランダムアクセスファイルのレコードb本来16ビットのところを8ビットに落としてテストを行ないました。
今回の仮想FDDは2MBと十分過ぎる容量ですから、当然本来の16ビットのレコードbナテストをやりたいところです。
すると[第145回]はそのままでは使えません。
さてどうするか。
あらためてそのあたりを再読してみましたら、[第151回]でレコードb16ビットにしてテストをしておりました。
実は[第106回]が16ビットでのテストを行なった最初でした。
そこで作ったテストプログラムはFTST20−2です。
今回の説明とあわせて、[第106回]及び[第151回][第152回]あたりも再読していただくとより理解が進むことと思います。

今回はFTST20−2を64KBフルRAM用に一部を書き換えてファイル名をVFTST202にしました。
下はそのソースプログラムリストです。

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

; BDOS TEST20-2 function22 random write
;2012/3/4 3/7 4/16 4/17 4/27
;9/15
;
	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)
	LD (FCBR0),A
	LD C,A
	INC HL
	LD A,(HL)
	CP FF
	JP Z,CLOSE
	LD (FCBR1),A
	LD B,A
	INC HL
	PUSH HL
;data fill
	LD HL,DMA
	LD D,40
LOOP2:LD (HL),C
	INC HL
	LD (HL),B
	INC HL
	DEC D
	JP NZ,LOOP2
;
	LD C,22;random write
	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
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
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;$
;

●レコード番号表の作成

16ビットのレコード番号表は[第106回]で作成しました。
CP/M2.2には直接メモリに値を書き込むような機能はありません(アプリケーションのマシン語デバッガ(DDT)を使えばできますが)。
CP/M互換DOSもそれ自体にはそういう機能はありません。
そこで[第106回]で行なったように、ZB3BASICのマシン語コマンドを使ってメモリに直接レコード番号を書くことにしました。

その作業はログファイルでお見せします。
[第106回]ではメモリアドレス8300Hから書き込みましたが、今回は0300Hから書き込みました。

logfile nd80zlog\09152117.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>cm@0300
0300 49-a2
0301 27-01
0302 6D-b5
0303 20-03
0304 66-9e
0305 69-00
0306 6E-44
0307 65-00
0308 2E-b6
0309 54-03
030A 68-a7
030B 61-01
030C 6E-9f
030D 6B-00
030E 20-9a
030F 79-00
0310 6F-b3
0311 75-03
0312 2E-a5
0313 0D-01
0314 0A-98
0315 6E-00
0316 27-47
0317 22-00
0318 0D-42
0319 0A-00
031A 20-ff
031B 20-ff
031C 20-
>cm@0300
0300 A2-
0301 01-
0302 B5-
>

0300HはROMと重なる領域ですからCM@コマンドを使いました。
CM@については[第164回]で説明をしています。
一旦書き込んだあと念の為にもう一度最初の部分を読み出して正しく書き込めたかどうか確認をしました。

●VFTST202の実行

いよいよVFTST202の実行です。
[第152回]をバックにして実行しました。



実行したあと、DIRコマンドでディレクトリを表示させました。
TEST.RAFが作成されました。
でも本当に正しく作成されたかどうか、確認をしてみなければなりません。

VFDUMPを実行して仮想FDDのディレクトリをチェックしてみました。
VFDUMPは[第167回]で説明をしています。

そうしましたら。



TEST.RAFは4個のFCBが作成されています。
それは[第152回]と同じです。
しかし各FCBのブロックアローケーションエリアを見ると、最初のFCBには73というbェ見えますが、そのほかのところは全て00です。
むむ。
おかしい。
どこかにバグがあるようです。
ランダムアクセスのプログラムはかなりこみいっていて、バグ捜しは大変です。
しっかり時間がかかってしまいました。

時間がなくなってしまいましたので、その結果につきましては、次回に説明することにいたします。

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

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