日立 MB-S1 S1-CP/M80にCPMDrvWinのI/Oを移植 その2

Last Updated on 2021年5月2日 by kabekin

TeraTermを相手に動作確認してもうまくいかないのでS1実機で動作確認することにしました。

シリアルポートはS1内蔵のACIAで$FFC4, $FFC5です。

FM7のシリアルカードは最大で19200bpsが設定できるのですがS1では9600bpsが最高速度でした。

S1の通信速度設定ディップスイッチSW1,SW2をオンでSlow=2400bps, Fast=9600bps設定になるそうです。
Windows側でCPMDrvWinをスタンバイさせてから、
仮想ドライブのI/Oを一通り実装したBIOS09に交換してCP/M80を起動してみます

C:\ して通信させてみます
おお!CPMDrvWin反応しました!

CPMDrvWin側も反応しています


しかし、全部で25個のファイルがあるはずなのですが12個しか出ていません
トラック2のセクタ1から15まで2回読みだされているようです。

正しい表示はこんな感じです (S1エミュで直接D88イメージをDIRした場合)

正常に動作しているFM7のBIOS09から上記のD88イメージをDIRすると

一回目はトラック2の1~15の後、再度トラック2の1~4を読みました
2回目はトラック2の1~4のみ読み出し。
この動作が正しい動作のようです。

2回目のDIR C: でも12個しか表示されません
何度やってもダメです・・・

CPMDrvWinも同じくトラック2のセクタ1~15を読み出しましたが2回ではなく1回だけ読みだされているようです。

試しにDUMPコマンドを実行してみると、

トラック7 セクタ9,10を読み出しましたが、そのままフリーズ。

DUMP.COMはトラック7のセクタ9から保存されているようなので読込要求は正常の動作しているっぽいです^^

これはBIOS09内の256バイトのバッファからCP/Mの128バイトバッファに転送する部分のデブロッキングの処理が怪しいです。

デブロッキングの処理はBDOSのセクタ÷2で既にバッファに読み込まれている256バイトのデータを
前半128バイトか後半128バイトを切り替えてBIOS80のDMAバッファに転送しているだけなのでFDCでも仮想ドライブでも影響しないと思っていました^^

	ldx	IO_ADR,X	;6809側バッファ先頭
	lda	SCT
	lsra
	bcc	cpmio_even	;偶数セクタ
	;奇数セクタなので対象Z80領域へのポインタを128バイト進める
	leax	128,X
cpmio_even:
	lda	CMDNO
	cmpa	#13	;REDSECのCMDNO(ReadかWriteかを判定)
	beq	cpmio_TRF
	exg	Y,X	;Write: X:Z80address Y:6809address
	lda	cpmio_buff
	ora	#1
	sta	cpmio_buff	;バッファ変更フラグ(b0)をONにする
cpmio_TRF:		;転送
	ldb	#128	;転送サイズ(CP/Mの1セクタ分)
	.globl	cpmio_ioloop
cpmio_ioloop:	;データ転送処理 X:入力 Y:出力
	lda	,X+
	sta	,Y+
	decb
	bne	cpmio_ioloop

こんな感じで、バッファへの転送はリード後の共通な処理なんです。
ですが、うまくいきません・・・(泣

FDDから1セクタの読込は256バイトをBIOS09内のバッファに読み込んでいます。
仮想ドライブも同様に1セクタ256バイトをBIOS09内のバッファに読み込んでいるだけなので、
バッファの前半、後半を切り替えているデブロッキング、ブロッキングは同じように使えると思っていたのですがそんなに甘くなかったようです^^;;

コードを眺めている感じではおかしくない気もするのですが、正常に動きませんね^^;;;
仮想ドライブのDPBはMSA仕様に合わせてFM/PC8001仕様に合わせています→こちら

何か勘違いしていると思うので、もうしばらく調べてみます^^

しかし、MSX風の青背景に白文字は写真が撮りにくいですね・・・

そんな、何か読めているけど正常に動作しないI/Oドライバ移植中の記録^^;;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください