2020年7月19日日曜日

2DDドライブ用ステップ2倍化回路のその後

Ready信号生成のためのPICを不要とすることができました

[2020年8月2日画像追加あり]
[2020年8月6日訂正あり]

6月8日の「2DDドライブ用ステップ2倍化回路のプリント基板化」で、FDCカードからFDDへのケーブルの間に挿入する形のステップ2倍化回路基板を紹介しましたが、それは、ステップ2倍化のためのATtiny85とReady信号生成のためのPIC12F675の両方を必要とするものでしたが、3つのICを必要とするのはいかにも大袈裟です。

このPIC12F675を使用せずにReady信号を生成する方法として次の2つを考えました。
(1)FDDを改造して34ピンにReady信号を取り出す。
(2)ATtiny85にReady信号生成のプログラムを追加する。

PIC12F675によるReady信号生成回路はK-ichi's memoさんによるMSXでPC用FDDを使うで紹介されているものをそのまま使用させていただいていましたが、プログラム作成では結構苦労されているようでしたので、まずは(1)による方法を試してみました。


(1)による方法


参考にしたのは、試運転さんによるPC-9821にPC/AT互換機用FDDを接続する(実施編)です。様々なFDDの改造手順が紹介されていますので、手持ちのFDDのうち該当するもの3台について改造してみました。


2種のTEAC FD-235HG


左がFD-235HG A122 (TB6048F)で右がFD-235HG 7304 (TB6022AF)です。
使用している制御ICの種類によってReady信号のピンが異なりますが、34ピンに接続されているDISK CHANGE信号をカットし、ICの該当ピンから34ピンにReady信号線を接続するだけです。


MITSUMI D353T5

D353T5の場合はDCH端子にハンダ付けされているチップ抵抗を、その下のRDY端子に付け替えるだけですので、元に戻すこともできます。(下図の左下の部分)



D353T5の改造部分



2DDドライブ用ステップ2倍化回路の修正は、FDC側のコネクタとFDD側のコネクタの34ピンを直結するだけです。
(下画像では修正線が何本もありますが、あれこれと改造した残骸でして必要なのは最下部の1本のみです。)

2倍化基板の修正(最下部の1本のみ追加)


改造した結果ですが、PIC12F675を外し、ATtiny85のプログラムは変更せずに動作しました。

しかし、FDDを改造するのはいかにも敷居が高いので、次に(2)のATtiny85のプログラムで対応することを試してみました。


(2)による方法


K-ichi's memoさんのブログによれば、MotorOnがアクティブの間、0.5ms毎に2000回(約1s間)Indexをチェックし、その間1度もIndexが出ていなかったらReadyではないと判断するとのことですので、そのアルゴリズムをそのまま使わせていただいてATtiny85のメイン部に追加しました。(K-ichi's memoさんに感謝いたします。)

プログラムリストを下に示します。


[2020年8月6日訂正]上記プログラム中の2000を5000に訂正します。(理由を最後尾に記述しました。)

2DDドライブ用ステップ2倍化回路の修正ですが、ATtiny85のピン配置をPB0:MotorON, PB1:Index, PB3:Readyとしましたので、ATtiny85 pin5,6,2をそれぞれPIC12F675のソケット端子のpin6,5,7に接続します。

[2020年8月2日追加」必要な追加配線を示す画像を追加しました。




改造した結果ですが、PIC12F675なしで無事に動作しましたので、FDDの改造が不要なこちらの方法の方が良いようです。

[2020年8月6日追加」上記のプログラムリストは2000回(約1秒間)チェックするというものですが、実は、このプログラムではOS-9Level1やLevel2のFDは正常に起動しません。起動時のメッセージを見ていると、どうも起動中の処理に時間がかかりすぎているようですので、2000回を5000回に変えてみたところ、OS-9も正常に起動するようになりました。
ということで、上記プログラムの2000を5000に訂正します。


2020年7月18日土曜日

ArduinoMega2560カードの紹介その後のその後

4月10日に紹介した「ArduinoMega2560カードの紹介その後(完結編)」で完結したつもりでしたが、その後行ったいくつかの試みを紹介します。
(1)部品配置を多少変更した新しい基板を製作しました。
(2)リフレッシュの方法を変更してみました。
(3)任意のファイルを指定してArduino2560からFM-7に送り込めるようにしました。

(1)ですが、USBケーブルを挿入しやすくするためにArduino2560カードの位置を少し左に移動し、カード上のリセットボタンが押しにくかったので基板上にリセットボタンを新設しました。
(2)ですが、リフレッシュ法を桜井さまが試された方法に変更してみました。
オリジナルのカードの考案者であるFS-Micro Corporationの桜井さまはDRAMのリフレッシュについて2つの方法を試みられました。
一つ目はMega2560の割り込みを用いる方法で、これはリフレッシュの仕様を完全には満たすことができない上にCPUがほとんどリフレッシュにかかりきりになってしまうので実用的ではないとのことです。二つ目はPICを増設しそれによってハード的にリフレッシュ信号を作るというもので、これは完全にリフレッシュの仕様を満たすことができ、CPUにも余裕があるので良い方法だそうです。

参考までに、桜井さまから頂いたPICを使用した基板を示します。


PIC使用の基板



しかし、FM-7上でArduino2560を動作させてメモリデータを読み出したり、データやプログラムを送り込んだりさせたいと考えていた思い付きハードでソフトに七転八倒のshujiakitaさんや私にとっては、殆どのCPU時間をリフレッシュに取られるにしても、残りのわずかな時間にデータ等の読み書きができて、その後6809に戻れれば良いので、ソフトのみでリフレッシュを行う手法もそれなりに有用だと考えました。

(3)ですが、任意のファイルをArduino2560が読み込んでFM-7のメモリに書き込めるようにスケッチを変更しました。

ということで、PICの追加なしでソフトのみでD-RAMのリフレッシュを行なうArduino2560カードを、WindowsとFM-7の間でプログラムやデータのやり取りを行うツールとして製作しました。


新基板
新基板


使い方ですが、Arduino2560へのスケッチの書き込みに使用したポートをそのまま使用しますので、TeraTermのポートをそのポートに指定し(もちろん、ArduinoIDEのポート指定はずらしておきます)、バイナリ指定をしてファイル送信を実行します。
送信するファイルの先頭には保存アドレス(2バイト)、ファイルサイズ(2バイト)を付けておきます。

動作中の様子


下のFM-7の画面で分かりますように、RUN直後にArduino2560に切り替わり、処理が終了した後、6809に戻り20行のLISTを実行しています。もちろん、複数回実行してもちゃんと6809に戻ってきます。


転送後に6809に戻っている


TeraTermの実行画面です。
データファイルの先頭4文字の保存アドレス、転送バイト数を読み取り、以降のデータを指定アドレスに書き込み、その後、そのデータを読み出しています。
続いてBOOT ROMの内容を読み出した後、6809に戻っています。


転送結果


以上、動作的には以前の割り込みを使用しないソフトでのリフレッシュ法の場合とそれほど違ってはいないように見えますが、不完全かもしれませんが正式のリフレッシュ法を用いているという安心感が得られました。

なお、割り込みによるリフレッシュ法の詳細とその適用結果については、FS-Micro Corporationの桜井さまがブログのArticle#256~265の10回に亘って詳細に解説されていますので、そちらをご参照ください。本稿に直接関係するのはArticle#261です。


2020年6月26日金曜日

FM-7/77用拡張PIAボードとP-ROMライタ

FM-7/77用拡張PIAボードとP-ROMライタの製作


P-ROMライタは持っているので、まれに必要になる2716のような古いデバイスも書き込みができるのですが、古い機種(ADVANTESTのR4945A)ですのでパソコンとの通信速度が9600baudと遅く、4MbitのROMを焼くときには読み込みに時間がかかりすぎて使う気になれません。
ということで、昨年TL866ⅡPLUSを購入しました。これは実に優秀で使い易くてしかも安いので言うことなしと言いたいのですが、残念なことに2764以前には対応していません(メーカーによりますが)。
大昔は自作の8ビット機用にROMライタボードを製作して使用していたこともあり、いつかは作ろうと思ってはいましたが実行する機会がありませんでした。
先日、プリント基板をまとめて発注することになり、ついでにということでROMライタ基板も作成しました。

元にしたのはマイコンピュータ「OS-9活用テクノロジー」(CQ出版社)中の「P-ROMライタ/エディタの製作(阿部英志著)」です。これは、2716から27512までに対応していますが使用するROMに応じてジャンパプラグを差し替えるというもので、その分簡素な回路になっています。

FM-7/77からはPIA(68B21)ひとつで制御するようになっているので、この部分を切り離して汎用の拡張PIAボードとし、フラットケーブルでROMライタボードと接続する形にしました。
(一体化して10x10cmのサイズに収めたもののプリント基板も一緒に作りましたが、製作の予定は今のところありません。)

回路図


拡張PIAボード


拡張PIAボードはFM-7/77の32Pコネクタに接続して使用するもので、FM-7では未使用のアドレス$FD9CにPIAのポートAを割り当てています。

P-ROMライタ

P-ROMライタはVPPの25V, 21V, 12.5VをTL497Aで作り出し、D-FFのLS273でアドレスとデータをコントロールしています。(TL497Aというのがいかにも古いという感じですが、幸い手持ちがありましたし、何と今でも入手可能なデバイスのようです。)


製作した基板


下左:拡張PIA基板 下右:P-ROMライタ基板
上:一体化した基板(製作予定なし)


いつもどこかでドジをする私ですが、今回は2SC1815のフットプリントが2.54mmピッチでなく1.27mmピッチであったことに気づかずにそのまま利用したり、ピッチが5.08mmの270uHや220uFのピッチを2.54mmにしたので、ハンダ付けがとてもしにくい部分がありましたが、配線パターンのミスはなかったようです。(部品を入手してから基板の設計をすべきなのですが、大体が逆のパターンになってしまいます...)


拡張PIA基板の動作テスト


まず拡張PIA基板を製作し、動作テストのつもりで、以前紹介した、PIAを用いてI2C通信によってRTCから時刻の読み出し/書き込みをするアセンブラプログラムを走らせてみました。


拡張PIA基板の動作テスト



Flex9上でRTCを読み書き


正常に読み書きできましたので、このPIAボードが正常に機能していることが確認できました。


P-ROMライタ基板の製作


続いてP-ROMライタ基板を仕上げ、ジャンパプラグも2716用、2732用、2764用、27256用の4種類を作成しました。20Pの丸穴ICソケットを利用しています。



完成した基板

ジャンパプラグ
(左から2716, 2732, 2764, 27256用)


動作風景


試しにP-ROM 27C256を書き込んでみましたが、正常に書き込むことができました。
ただ、今のところ2716にはうまく書き込めていません。(手持ちの2716が古すぎるせいなのかも...)


ドライバソフト


このROMライタのドライバソフトはOS-9上で動作するもので、コマンドも多く、データのスクリーンエディットもできるなど機能豊富なものですが、OS-9は一般的ではないので、他のOS(?)に移植しなければなりません。
とりあえずそのままOS-9上で動作させるということでしばらく触れていなかったOS-9を走らせてみましたが、使い方をかなり忘れてしまっていて、思い出すのに苦労しています。
(でも

2020年6月10日水曜日

FM-7用Z80カードの第3作を製作

富士通の回路を10x8㎝に収めたCP/Mカードを作ってしまいました

3月13日のブログ「FM-7用Z80カードの第2作などを製作」で紹介したI/O誌の記事を元にしたZ80カードでは富士通のCP/M-80が動作しましたし、特に不満はなかったのですが、実は、「F-BASIC解析マニュアル フェーズ2」に掲載されている富士通純正のCP/Mカードの回路図も、いずれ製作するつもりでKiCadで回路図を作成してありました。

しかし、IC数が19個と多いので10x10㎝の格安基板には収まりそうもなく(富士通純正のCP/Mカードのサイズは124x78mmです)、製作費を考えて二の足を踏んでいました。
でも10x10㎝以内のサイズに無理やり押し込んでみたらどうなるかと試してみたところ、何とか10x8cmのサイズに入りましたので、作ってみることにしました。

いつもですと電源ラインだけは太い線で手配線し、残りはFreeRouting.exeに任せるのですが、今回は電源ラインも太くする余裕もありませんし、また、いつも全ICにつけているパスコンもオリジナル回路を忠実に再現するということで少なくなっているので、安定して動作するかという点では不安がありますがとにかく作ってみたものが下の画像です。


製作した基板と完成基板


ICの配置はオリジナルと同じにしてありますし、他の部品もできる限り同じ配置になるようにしてあります。ご覧のように、これ以上は小さくできないというサイズです。

左:純正基板 右:製作した基板


左が純正のZ80カードで、右が製作したコンパクトサイズのZ80カードです。高さは同じ8cmで幅が10㎝と狭くなっています。


動作中の様子1



動作中の様子2


動作中の様子です。私としては珍しくミスがなく、組み立てたらすんなりと富士通のCP/M-80が動作しました。
まだ十分にテストしていませんが、今のところ純正基板と同様に動作しているように思えます。しかし上記しましたように、安定動作するかどうかはまだまだ確認する必要があります。

ということで、2種類のZ80基板を作ってしまいましたが、余った基板は現在発注してある40Pコネクタと共に配布する予定です。
(40Pコネクタが届くのが待ち遠しいです。今回は、以前作った基板から40Pコネクタを外して使用しました。)

2020年6月8日月曜日

2DDドライブ用ステップ2倍化回路のプリント基板化

いくつかプリント基板化した製作物がありますので何回かに分けて紹介していきます。

まずは2DDドライブ用ステップ2倍化回路のプリント基板化です。

2月28日のブログ「2DDドライブと2Dドライブの混在の工夫」で紹介しました、FDCのステップ信号を2倍化して2DDドライブを使用する回路ですが、その目的はタイトル通りで、2DDドライブと2Dドライブを混在させることでした。

その前作である2019年12月31日のブログ「FM-7でPC用のフロッピードライブを使う」ではFDCのSTEP信号をMB8877Aから出た直後に2倍化していましたが、この形では全ドライブが2Dか2DDのどちらかになってしまうということで、それぞれのドライブの直前のケーブルの途中に挿入して別々に選択できるようにしたわけです。

2月28日には手配線したもので動作したという紹介をしましたが、複数枚必要ということで今回それをプリント基板化しました。
2月28日の回路を用いていますが、書き忘れていた7438の11番ピンの1kΩでのプルアップを追加してあります。またソフトについてはFDC基板の中での2倍化はSTEP信号が正信号でしたが、基板の外では負信号ですので、STEP信号の立ち下がりで割り込みが入るように変更しています。

他の基板を発注する際に、ついでにということで慌てて作ったためかKiCadのフットプリントを間違えてしまい、そのため電源用コネクタの一つが5Pになっていたうえにパターンカットが2箇所必要になりました。さらにドライブ番号切り替えスイッチのシルク印刷がDR0とDR1と逆になっていましたが、配線変更等はなかったので良しとします。

製作したプリント基板と組み立てた完成基板です。

製作した基板



FM-7で使用している様子です。MITSUMIのD359M3DとTEACのFD235HGの2台を接続しています。




ハード、ソフトのテストのために先日入手したFM77AV1で使用している様子です。このように使用したいというのが製作の動機でした。(サイズが合わず、ちゃんと固定できていないので多少見苦しいですが...)




これで古い8ビット機のFDDの故障等の心配をすることなく、安心して使用し続けることができます。(と言っても、フロッピーそのものがいつまで使用できるかが問題ですが...)

2020年5月16日土曜日

FM-7用 58K CP/M-80が一応出来上がりました

RAMモードで動作する58K CP/M-80が一応出来上がりました


Z80カードを製作した勢いでつい手をだしてしまって、もっと簡単にできると思ったのに意外に手間取ってしまい、一ヶ月ほどもかかってしまいましたが、FM-7用のCP/Mが一応できあがりました。
まだまだ直すべき箇所が多々ありますので完成とは言いすぎですが、切りがないので一応の区切りとします。

実行画面


仮想ドライブ画面



装置全景(左がFM-7用のディスプレイ)



メモリマップ


前回のブログで紹介したのはROMモードで$0000~$7FFFの範囲で動作する26K CP/Mでしたが、BIOSを使用せずSubSystemを使用することで、下図のメモリマップのように$0000~$EFFFの範囲で動作する58K CP/Mとなりました。



  58K CP/M-80



3つのファイルから構成されています。


(1)CP/M本体
  サイト「The Unofficial CP/M Web site」中のソース cpm22.z80 を使用しました。
  中日電工さんのサイトに説明されている通りにソースのバグを修正し、ドライブ名の表示を大文字に変更しただけで、あとはオリジナル通りです。58K CP/Mとしてアセンブルしました。
(2)BIOS80
  BIOSのZ80部分で、BIOSのジャンプテーブル、DISKパラメータの他はほぼパラメータをセットしてコマンド番号を6809に送っているだけです。
(3)BIOS09
  BIOSの6809部分で、FM-7のBIOSは用いず、FDD関係はFDC (MB8877A) を直接コントロールし、それ以外はSubSystemを使用しています。


CP/Mとしての機能


CP/Mとしての機能はベーシックなもので、エスケープシーケンスなども実装していませんが、仮想ドライブは実装してありますので、フロッピーが2台、仮想ドライブが2台の計4台です。
ドライブA, Bがフロッピー、C, DがWindows上の仮想ドライブです。以前紹介したRS232Cカードを用いて38400baudで通信しています。



構成図

RS232Cのドライバも実装しているのでPUNCHとREADERも使えるのですが、実際にはまず使用することはなく、もっぱらWindows上のエディタでファイルを作成し、ドライブCかDにセットしたCP/Mのイメージファイル(.77または.DSK形式)にドラッグ&ドロップしてCP/Mでアセンブルしたり、必要があればフロッピーにコピーしたりして使用しています。


機能不足や不具合など


相変わらずブロッキング/デブロッキング機能は実装していませんので、ディスクアクセスは速くはありませんが、そのうちにということで今回はパス。(そもそもブロッキング/デブロッキングについては良く分かっていないので。)

現在分かっている不具合がいくつかあります。
(1)カーソルが表示されない。
  もちろん、SubSystemのCONSOLE CONTROLでカーソル表示をONにしていますが、6809側では表示されますが、Z80側に切り替わるとカーソルが消えます。
今のところ原因が分からず、直せていないので結構不便です。

(2)スタート時にドライブを指定する必要がある。
  スタート直後にディレクトリを表示させると、DIRやDIR A:は表示されるのですが、DIR B:などはダメです。最初にドライブチェンジのB:やC:などを一回実行しておけば以降は普通に表示できるのですが、なぜでしょうか。BIOSがおかしいのは間違いないのですが。


制作した2つのソフト


下にBIOS80とBIOS09を置いておきます。80系の知識がほとんどない私が作ったものなのでおかしな点が多々あるかと思いますが、おかしな箇所や不具合の原因などをご指摘いただけるとありがたいです。

◎BIOS80です。中日電工さんのブログで紹介されているZASM1.64でアセンブルしています。

 


 ◎BIOS09です。自作のクロスアセンブラでアセンブルしています。

 

上記のソフトはまだ制作途中ということで、エラー処理などは不十分ですのでディスクアクセスに失敗などするとハングアップしたりします。

ということで、不具合はありますが何とか使える状態なので、今は、最近入手した「応用CP/M 村瀬康治著」中のシステムコールの実習を一つずつ走らせて確認しているところです。

なお、仮想ドライブ構築ソフトCpmDrvWin.exeですが、もうしばらく使用して不具合が出ないかを確認してから公開する予定です。



2020年5月2日土曜日

CP/M用の仮想ドライブの構築ソフト(その2)

仮想ドライブ構築ソフトCpmDrvWin.exeをCP/Mに接続してみました。


前回報告したCpmDrvWin.exeをCP/Mに接続してみました。
書き直したのは、CP/MのBIOSの6809側のルーチンのみで、DrvNoが0(A:),1(B:)の時は従来のFDDアクセスルーチンのままで、2(C:),3(D:)の場合にはRS232Cを通してCpmDrvWinと通信して仮想ドライブ中のファイルを読み書きします。

具体的には、ファイルを読む場合にはCpmDrvWinに対して’R',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を、書き込む場合には’W',DrvNo,TrkNo,SctNo(+チェックサム)という文字列を送って、その結果を受け取るだけです。



ディレクトリを表示

ドライブA:はフロッピーディスクで、ドライブC:とD:が仮想ドライブです。
まだテスト中ですので、BaudRateを4800baudと遅くしてありますが、完成時には38400baudになります。


ドライブC:のディレクトリ表示時

右のテキストボックスは受信したコマンド列を表示しています。
Trk2,Sct1から始まって、各2回ずつ読んでいるのが分かりますが、これはブロッキング・デブロッキングをちゃんと行っていないためです。(何とかしなければ...)


ドライブD:のディレクトリ表示時

ディレクトリの範囲はTrk2のSct1~16なのですが、ドライブD:の場合のように、ファイル数が少なくても、その範囲のセクタを全て読んで、空を表示しています。(これはBDOSの仕様なのか、それとも自作BIOSの責任なのか...)

前回のブログで書きましたように、左のリストボックス中にWindows上のファイルをドラッグ&ドロップしてファイルを追加すれば、CP/Mからそのファイルにアクセスすることができます。

また、CP/MとWindows上のCpmDrvWinとの間の通信部分は、Flex9用、F-Basic用などと共通で、8251A使用のRS232Cカードや以前発表した拡張I/Oボード上の6850(ACIA)使用の場合の通信ルーチンが使用できますが、FM-7でも6850(ACIA)の方はあっさりと38400baudで動いています。

未だ完成ではありませんが、とりあえずこの程度でできるのだというサンプルとして、BIOSに追加した仮想ドライブアクセスルーチンを記しておきます。

*================================================
*read windows virtual drive
RDWDRV EQU *
*read 256bytes
 BSR READSUB2
 LBRA RE0

*read 256bytes
READSUB2 EQU *
RDS0 CLR CSUM
 LDA #'R
 LBSR SNDCH read cmd
 BSR ADDCS
 LDA DRVNO
 LBSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 LBSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 LBSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 LBSR SNDCH csum
*wait receive ACKorNAKorESC
*  if NAK then re-send 'R',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
RDS1 LBSR RCVCH
 CMPA #NAK
 BEQ RDS0
 CMPA #ESC
 BNE RDS2
 LDA #$FF *error
 RTS *error end
*
RDS2 CMPA #ACK
 BNE RDS1
* send ACK
 LBSR SNDCH ACK
*receive data(256bytes),csum
*  data is saved to Buffer(X)
*  if csum error then send NAK
*  if csum ok then send ACK and to next process
RDS3 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
RDSLOP LBSR RCVCH data
 STA ,X+
 BSR ADDCS
 DECB
 BNE RDSLOP
 LBSR RCVCH csum
 CMPA CSUM
 BEQ RDS4
 LDA #NAK
 LBSR SNDCH NAK
 BRA RDS3
*
RDS4 LDA #ACK
 LBSR SNDCH ACK
*wait receive ACK
RDS5 LBSR RCVCH
 CMPA #ACK
 BNE RDS5
 RTS
*
*return A:sct,BUFHL:0or1
SETSCT2 EQU *
 CLR BUFHL
 LDA SCTADR ;sct
 BITA #$01
 BEQ SE21
 DECA
 INC BUFHL ;0:even, 1:odd
SE21 LSRA
 INCA
 RTS
*
*--------------------
*add check sum
ADDCS EQU *
 ADDA CSUM
 STA CSUM
 RTS
*--------------------
*write windows virtual drive
WRWDRV EQU *
*read 256bytes
 LBSR READSUB2
*set write data
 BSR WRDTSET
*write
WRW2 CLR CSUM
 LDA #'W
 BSR SNDCH write cmd
 BSR ADDCS
 LDA DRVNO
 BSR SNDCH drv
 BSR ADDCS
 LDA TRKADR
 BSR SNDCH trk
 BSR ADDCS
 LDA SCTADR
 BSR SETSCT2
 BSR SNDCH sct
 BSR ADDCS
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send 'W',Drv,Trk,Sct,csum
*  if ESC then error return
*  if ACK then next
WRW3 BSR RCVCH
 CMPA #NAK
 BEQ WRW2
 CMPA #ESC
 BNE WRW4
 LDA #$FF  *error
 BRA WRW7 *error end
*
WRW4 CMPA #ACK
 BNE WRW3
*send data(256bytes),csum
*data is in Buffer(X)
WRW5 LDX #RCBBUF
 CLRB counter(256)
 CLR CSUM
WRWLOP2 LDA ,X+
 BSR SNDCH data
 BSR ADDCS
 DECB
 BNE WRWLOP2
 LDA CSUM
 BSR SNDCH csum
*wait receive ACKorNAK
*  if NAK then re-send data(256bytes),csum
*  if ACK then next
WRW6 BSR RCVCH
 CMPA #NAK
 BEQ WRW5
 CMPA #ACK
 BNE WRW6
 CLRA *no error
WRW7 STA PTOZ80
 LBRA TOZ80
*
*======================================

ということで、あちこちに不備があってまだまだ修正の必要がありますが、CP/M用の仮想ドライブのプロトタイプがとりあえずできたという報告でした。