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側も反応しています
しかし、全部で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回だけ読みだされているようです。
トラック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ドライバ移植中の記録^^;;