2023年1月29日日曜日

FT245通信カード用のディスクイメージ転送専用ソフト

 FT245通信カード用のディスクイメージ転送専用ソフトの紹介

FT245を用いた通信カードは非常に高速ですので、もうRS232Cカードを使うことはなくなり、もっぱらこればかり使用しています。

このカードを使用するためのドライバソフトとしては、カードを考案された「思い付きハードでソフトに七転八倒」さんが作成された専用ソフト FDDIMG_RW77.exe があります。(https://vehwk3yxv7hw.blog.fc2.com/blog-entry-73.htmlで入手できます。)

これは特定のセクタの読み書きができたり、ディスクの検査ができるなどの機能を持ち、さらにRAMディスクのドライバも内蔵しているという多機能のものですが、私の用途ではFMとWindowsPCの間でFDのディスクイメージを丸ごと転送することがほとんどです。

ということで、FMとWindowsPC間での転送専用のソフトを作成しました。常用機がFM77AV40SXですので、2Dのみでなく2DDディスクにも対応させました。

使用しているFT245通信カードです。私は通常、このようにFT245通信カードと自作のFDCカードを32Pスロット拡張基板に装着して使用しています。


使用しているFT245通信カード

作成したソフトの構成図です。

なお、転送時のデータの処理方法が異なるため、FDDIMG_RW77.exeとは互換性がありませんので混用はできません。FM側FT245DRV(とFTDRV11o)、Windows側 ft245drv.exe のペアで使用することになります。



構成図

FM側の機械語サブルーチンをロードする間の起動画面です。


FM側の起動画面

FM側のメインメニュー画面です。

FM側のメインメニュー画面

メニューの1と2で転送方向を選択します。

3,4,5はオプション設定で、3でドライブ番号の選択(0~3の範囲)、4でディスクのタイプの選択(2Dか2DD)、5でFMからWindowsへの転送時にFT245RLのTXE(TX Enable)機能を使用するかしないかを選択します。使用する場合はFT245通信カード上のスライドスイッチを右(USBコネクタ側)に、使用しない場合は左(バッテリ側)にセットします。このスライドスイッチがないカードの場合にはTXE機能をOFFにします。


WindowsPC側のメニュー画面を示します。

Windows PC側のメニュー画面


起動後にまず、COMポート番号を選択します。使用可能な番号のみが表示されますのでその中から選択します。もし希望の番号が表示されていない場合は「COMポートスキャン」ボタンを押してから選択します。

次に読み書きするファイル名を選択します。直接入力もできますがディレクトリまで入力するのは面倒ですので、「ファイル選択」ボタンを押して希望のディレクトリを表示させれば既存のDATファイルが一覧表示されます。ファイルを選択した後でそのファイル名を直接修正することもできます。
最後にディスクの種別(2D,2DD)を選択します。もちろん、FM側の設定と同じでなければなりません。
以上で、FMからの読み込み、FMへの書き込みが実行できます。
オプション機能として、転送で使用されるDAT形式のファイル(各セクタの先頭に16バイトのヘッダがついた形式)を通常のDSK形式やD77(D88)形式に変換する機能もあります。


動作中の画面


画像のように、転送動作中にはプログレスバーと処理したトラック番号が表示されますので進行状態が分かります。
蛇足ですが、この表示部分が最も苦労したところで、この表示のためにスレッドとタイマー機能を用いることになりましたが、結果、転送中に他の操作をしても表示が止まることがなくなりました。
作成にあたっては下記の書籍に大変お世話になりました。感謝いたします。
 参考にした書籍 「かんたん Visual C++(堀義博著)技術評論社」

もしディスクに不良セクタがあると、正常に読み書きできるまで繰り返すため、最悪の場合にはそこでハングアップしてしまいます。この場合には、USBケーブルを抜いて止めることになります。(エラーが生じた場合には、不正なデータを転送するよりも中断した方が良いと考えて、このような仕様にしています。)

なお、転送時間は2Dで1分、2DDで2分ぐらいですが、不良セクタがあるディスクの場合にはこれ以上の時間がかかることがあります。

参考までに、FM側の機械語サブルーチンを示しておきます。

  1. 0001 *
  2. 0002 * FTDRV for 2D/2DD DISK COPY PROGRAM
  3. 0003 *
  4. 0004 * FT245 :RD# : read data (L:data enable, L->H:data fetch)
  5. 0005 * WR : write data (H->L:write data to buffer)
  6. 0006 * RXF# : Rx fill (L:received data in buffer, H:read data prohibited)
  7. 0007 * TXE# : Tx enable (L:enable data send, H:inhibited data send)
  8. 0008 *
  9. 0009 * $FDFE bit7:RXF, bit6:TXE
  10. 0010 * $FDFD bit1:WR, bit0:RD
  11. 0011 *
  12. 0012 6000 STTADR EQU $6000
  13. 0013
  14. 0014 FDFE RGDAT EQU $FDFE
  15. 0015 FDFE RGSTS EQU $FDFE
  16. 0016 FDFD RGCMD EQU $FDFD
  17. 0017 FBFA BIOS EQU $FBFA
  18. 0018 FD1E CHGFDD EQU $FD1E bit6:0-2DD(default), 1-2D
  19. 0019
  20. 0020 6000 ORG STTADR
  21. 0021
  22. 0022 6000 16 0071 RDFM LBRA RDFM0
  23. 0023 6003 16 00D8 WRFM LBRA WRFM0
  24. 0024
  25. 0025 6006 00 DPSV FCB 0 ;save DP
  26. 0026 6007 00 TRK FCB 0
  27. 0027 6008 01 SCT FCB 1
  28. 0028 6009 01 DRV FCB 1
  29. 0029 600A 00 DRVTYP FCB 0 0:2D,1:2DD
  30. 0030 600B 01 TXEMOD FCB 1 0:OFF,1:ON
  31. 0031 600C 28 MAXTRK FCB 40 2D:40,2DD:80
  32. 0032
  33. 0033 * RCB for Read/Write
  34. 0034 600D 00 RCBRW FCB $00,$00,$00,$00,$00,$00,$00,$00
  35. 0035 6015 08 RCBRST FCB $08,$00,$00,$00,$00,$00,$00,$00
  36. 0036 *
  37. 0037 *--------------------------------------------------
  38. 0038 *initialize for read FM
  39. 0039 601D INIRD EQU *
  40. 0040 601D 86 0A LDA #$0A DREAD
  41. 0041 601F 20 02 BRA INI2
  42. 0042
  43. 0043 *initialize for write FM
  44. 0044 6021 INIWR EQU *
  45. 0045 6021 86 09 LDA #$09 DWRITE
  46. 0046 6023 INI2
  47. 0047 6023 34 02 PSHS A
  48. 0048 6025 1F B8 TFR DP,A
  49. 0049 6027 A78D FFDB STA >DPSV,PCR
  50. 0050 602B 1F 50 TFR PC,D
  51. 0051 602D 1F 8B TFR A,DP
  52. 0052 60 SETDP $60
  53. 0053 602F 35 02 PULS A
  54. 0054
  55. 0055 6031 30 8C D9 LEAX RCBRW,PCR
  56. 0056 6034 A7 84 STA ,X
  57. 0057 6036 318D 01C6 LEAY BUFF,PCR
  58. 0058 603A 10AF 02 STY 2,X
  59. 0059 603D CC 0001 LDD #$0001 TRK:0,SCT:1
  60. 0060 6040 ED 8C C4 STD TRK,PCR
  61. 0061 6043 ED 04 STD 4,X
  62. 0062 6045 4F CLRA
  63. 0063 6046 A7 06 STA 6,X SIDE:0
  64. 0064 6048 A6 8C BE LDA DRV,PCR
  65. 0065 604B A7 07 STA 7,X DRV for DREAD/DWRITE
  66. 0066 604D A7 0F STA 15,X DRV for RESTORE
  67. 0067
  68. 0068 *change to 320KB/640KB FDD
  69. 0069 604F B6 FD1E LDA CHGFDD
  70. 0070 6052 E6 8C B5 LDB DRVTYP,PCR
  71. 0071 6055 26 04 BNE INI3
  72. 0072 6057 8A 40 ORA #$40 bit6=1 set 320KB
  73. 0073 6059 20 02 BRA INI4
  74. 0074 605B 84 BF INI3 ANDA #$BF bit6=0 set 640KB
  75. 0075 605D B7 FD1E INI4 STA CHGFDD
  76. 0076 *set MAXTRK
  77. 0077 6060 5D TSTB
  78. 0078 6061 26 04 BNE INI5
  79. 0079 6063 86 28 LDA #40
  80. 0080 6065 20 02 BRA INI6
  81. 0081 6067 86 50 INI5 LDA #80
  82. 0082 6069 A7 8C A0 INI6 STA MAXTRK,PCR
  83. 0083
  84. 0084 606C 30 8C A6 LEAX RCBRST,PCR RESTORE
  85. 0085 606F AD9F FBFA JSR [BIOS]
  86. 0086 6073 39 RTS
  87. 0087
  88. 0088 *--------------------------------------------------
  89. 0089 * read sct data from FM, write to WindowsPC
  90. 0090 *
  91. 0091 6074 RDFM0 EQU *
  92. 0092 *set init for read
  93. 0093 6074 8D A7 BSR INIRD
  94. 0094
  95. 0095 *write to PC from FM
  96. 0096 6076 SND1 EQU *
  97. 0097 6076 6F 8C 98 CLR RCBRW+4,PCR trk:0
  98. 0098 6079 SND11 EQU *
  99. 0099 6079 8D 1A BSR SND12
  100. 0100 607B 6C 8C 93 INC RCBRW+4,PCR trk+1
  101. 0101 607E A6 8C 8B LDA MAXTRK,PCR
  102. 0102 6081 A1 8C 8D CMPA RCBRW+4,PCR end trk?
  103. 0103 6084 22 F3 BHI SND11
  104. 0104 *dp return
  105. 0105 6086 A68D FF7C LDA DPSV,PCR
  106. 0106 608A 1F 8B TFR A,DP
  107. 0107 *reset to 640KB FDD
  108. 0108 608C B6 FD1E LDA CHGFDD
  109. 0109 608F 84 BF ANDA #$BF bit6=0
  110. 0110 6091 B7 FD1E STA CHGFDD
  111. 0111 6094 39 RTS
  112. 0112
  113. 0113 *read 16scts data from FM, write to PC (for side 0)
  114. 0114 6095 SND12 EQU *
  115. 0115 6095 CC 0100 LDD #$0100 sct:1,side:0
  116. 0116 6098 ED8D FF76 STD RCBRW+5,PCR
  117. 0117 609C SND13 EQU *
  118. 0118 609C 8D 22 BSR RFMWPC
  119. 0119 609E 6C8D FF70 INC RCBRW+5,PCR sct+1
  120. 0120 60A2 86 10 LDA #16
  121. 0121 60A4 A18D FF6A CMPA RCBRW+5,PCR
  122. 0122 60A8 2A F2 BPL SND13
  123. 0123 *read 16scts data from FM, write to PC (for side 1)
  124. 0124 60AA CC 0101 LDD #$0101 sct:1,side:1
  125. 0125 60AD ED8D FF61 STD RCBRW+5,PCR
  126. 0126 60B1 SND14 EQU *
  127. 0127 60B1 8D 0D BSR RFMWPC
  128. 0128 60B3 6C8D FF5B INC RCBRW+5,PCR sct+1
  129. 0129 60B7 86 10 LDA #16
  130. 0130 60B9 A18D FF55 CMPA RCBRW+5,PCR
  131. 0131 60BD 2A F2 BPL SND14
  132. 0132 60BF 39 RTS
  133. 0133
  134. 0134 *read 1sct data from FM, write to PC
  135. 0135 60C0 RFMWPC EQU *
  136. 0136 *write header to PC
  137. 0137 60C0 308D FF49 LEAX RCBRW,PCR
  138. 0138 60C4 C6 10 LDB #16
  139. 0139 60C6 17 00AB LBSR SNDCH
  140. 0140 *read sct data from FM
  141. 0141 60C9 308D FF40 LEAX RCBRW,PCR
  142. 0142 60CD AD9F FBFA RBLOP1 JSR [BIOS]
  143. 0143 60D1 A6 01 LDA 1,X
  144. 0144 60D3 26 F8 BNE RBLOP1
  145. 0145
  146. 0146 *write sct data to PC
  147. 0147 60D5 308D 0127 LEAX BUFF,PCR
  148. 0148 60D9 5F CLRB counter:256
  149. 0149 60DA 17 0097 LBSR SNDCH
  150. 0150 60DD 39 RTS
  151. 0151
  152. 0152 *
  153. 0153 *--------------------------------------------------
  154. 0154 * read sct data from WindowsPC, write to FM
  155. 0155 *
  156. 0156 60DE WRFM0 EQU *
  157. 0157 *set init for write
  158. 0158 60DE 17 FF40 LBSR INIWR
  159. 0159
  160. 0160 *read from PC, write to FM
  161. 0161 60E1 READ1 EQU *
  162. 0162 60E1 6F8D FF2C CLR RCBRW+4,PCR trk:0
  163. 0163 60E5 READ11 EQU *
  164. 0164 60E5 8D 1D BSR READ12
  165. 0165 60E7 6C8D FF26 INC RCBRW+4,PCR trk+1
  166. 0166 60EB A68D FF1D LDA MAXTRK,PCR
  167. 0167 60EF A18D FF1E CMPA RCBRW+4,PCR end trk?
  168. 0168 60F3 22 F0 BHI READ11
  169. 0169 *dp return
  170. 0170 60F5 A68D FF0D LDA DPSV,PCR
  171. 0171 60F9 1F 8B TFR A,DP
  172. 0172 *reset to 640KB FDD
  173. 0173 60FB B6 FD1E LDA CHGFDD
  174. 0174 60FE 84 BF ANDA #$BF bit6=0
  175. 0175 6100 B7 FD1E STA CHGFDD
  176. 0176 6103 39 RTS
  177. 0177
  178. 0178 *read 16scts data from PC, write to FM (for side 0)
  179. 0179 6104 READ12 EQU *
  180. 0180 6104 CC 0100 LDD #$0100 sct:1,side:0
  181. 0181 6107 ED8D FF07 STD RCBRW+5,PCR
  182. 0182 610B READ13 EQU *
  183. 0183 610B 8D 22 BSR RPCWFM
  184. 0184 610D 6C8D FF01 INC RCBRW+5,PCR sct+1
  185. 0185 6111 86 10 LDA #16
  186. 0186 6113 A18D FEFB CMPA RCBRW+5,PCR
  187. 0187 6117 2A F2 BPL READ13
  188. 0188 *read next 16scts data from PC, write to FM (for side 1)
  189. 0189 6119 CC 0101 LDD #$0101 sct:1,side:1
  190. 0190 611C ED8D FEF2 STD RCBRW+5,PCR
  191. 0191 6120 READ14 EQU *
  192. 0192 6120 8D 0D BSR RPCWFM
  193. 0193 6122 6C8D FEEC INC RCBRW+5,PCR sct+1
  194. 0194 6126 86 10 LDA #16
  195. 0195 6128 A18D FEE6 CMPA RCBRW+5,PCR
  196. 0196 612C 2A F2 BPL READ14
  197. 0197 612E 39 RTS
  198. 0198
  199. 0199 *read 1sct data from PC, write to FM
  200. 0200 612F RPCWFM EQU *
  201. 0201 *read sct data from PC
  202. 0202 612F 308D 00CD LEAX BUFF,PCR
  203. 0203 6133 5F CLRB counter:256
  204. 0204 6134 8D 12 DRD1 BSR RCVCH
  205. 0205 6136 A7 80 STA ,X+
  206. 0206 6138 5A DECB
  207. 0207 6139 26 F9 BNE DRD1
  208. 0208 *write data to sct of FM
  209. 0209 613B 308D FECE LEAX RCBRW,PCR
  210. 0210 613F AD9F FBFA WBLOP1 JSR [BIOS]
  211. 0211 6143 A6 01 LDA 1,X error?
  212. 0212 6145 26 F8 BNE WBLOP1
  213. 0213 6147 39 RTS
  214. 0214
  215. 0215 *
  216. 0216 *===== receive 1 chr =====
  217. 0217 * 1st received byte : bit7,6(located on bit5,4)
  218. 0218 * 2nd received byte : bit5-0
  219. 0219 * return A:input chr
  220. 0220 *
  221. 0221 6148 RCVCH EQU *
  222. 0222 6148 34 04 PSHS B
  223. 0223 614A 8D 20 BSR WTRDEN wait RXF=L
  224. 0224 614C C6 01 LDB #$01 read cmd(D0=H)
  225. 0225 614E 8D 12 BSR GETDAT get 1st byte
  226. 0226 6150 84 30 ANDA #$30 get bit5,4
  227. 0227 6152 48 ASLA
  228. 0228 6153 48 ASLA to bit7,6
  229. 0229 6154 34 02 PSHS A save bit7,6 of chr
  230. 0230 6156 8D 14 BSR WTRDEN wait RXF=L
  231. 0231 6158 8D 08 BSR GETDAT get 2nd byte
  232. 0232 615A 84 3F ANDA #$3F get bit5-0
  233. 0233 615C AB E4 ADDA ,S bit7,6+bit5-0
  234. 0234 615E 32 61 LEAS 1,S returns the SP
  235. 0235 6160 35 84 PULS B,PC
  236. 0236
  237. 0237 *get data
  238. 0238 * return A:input data
  239. 0239 6162 F7 FDFD GETDAT STB RGCMD write cmd
  240. 0240 6165 B6 FDFE LDA RGDAT get data
  241. 0241 6168 7F FDFD CLR RGCMD set RD#=L
  242. 0242 616B 39 RTS
  243. 0243 *
  244. 0244 * wait RXF enable
  245. 0245 * RXF L:data exist, H:not exist
  246. 0246 * RGSTS bit7:RXF
  247. 0247 *
  248. 0248 616C WTRDEN EQU *
  249. 0249 616C B6 FDFE RDE1 LDA RGSTS
  250. 0250 616F 84 80 ANDA #$80
  251. 0251 6171 26 F9 BNE RDE1 RXF=L?
  252. 0252 * CLR RGCMD set RD#=L
  253. 0253 6173 39 RTS
  254. 0254
  255. 0255 *
  256. 0256 *===== send 1 chr =====
  257. 0257 *send sct data from buf to ft245
  258. 0258 * write to ft245 at WR:H->L
  259. 0259 *
  260. 0260 * B:counter
  261. 0261 * X:adr of buff
  262. 0262 *
  263. 0263 6174 SNDCH EQU *
  264. 0264 6174 34 02 PSHS A
  265. 0265 6176 SNDD1
  266. 0266 6176 8D 12 BSR WTWREN wait TXE=L
  267. 0267 6178 86 02 LDA #2
  268. 0268 617A B7 FDFD STA RGCMD bit1=1(WR=H)
  269. 0269 617D A6 80 LDA ,X+
  270. 0270 617F B7 FDFE STA RGDAT set DATA
  271. 0271 6182 7F FDFD CLR RGCMD bit1=0(WR=H->L)
  272. 0272 6185 5A DECB
  273. 0273 6186 26 EE BNE SNDD1
  274. 0274 6188 35 82 PULS A,PC
  275. 0275
  276. 0276 *
  277. 0277 * wait Tx enable
  278. 0278 * TXE L:enable, H:disable
  279. 0279 * RGSTS bit6:TXE
  280. 0280 *
  281. 0281 618A WTWREN EQU *
  282. 0282 618A 34 02 PSHS A
  283. 0283 618C A68D FE7B LDA TXEMOD,PCR
  284. 0284 6190 27 07 BEQ WRE2
  285. 0285 6192 B6 FDFE WRE1 LDA RGSTS
  286. 0286 6195 84 40 ANDA #$40
  287. 0287 6197 26 F9 BNE WRE1 bit6=0?
  288. 0288 6199 35 82 WRE2 PULS A,PC
  289. 0289
  290. 0290 6200 ORG STTADR+$200
  291. 0291
  292. 0292 6200 FF BUFF RMB 256
  293. 0293
  294. 0294
  295.  
  296. 0 error(s), 2 warning(s) is detected.
  297.  
  298. Label address
  299. BIOS FBFA BUFF 6200 CHGFDD FD1E DPSV 6006 DRD1 6134
  300. DRV 6009 DRVTYP 600A GETDAT 6162 INI2 6023 INI3 605B
  301. INI4 605D INI5 6067 INI6 6069 INIRD 601D INIWR 6021
  302. MAXTRK 600C RBLOP1 60CD RCBRST 6015 RCBRW 600D RCVCH 6148
  303. RDE1 616C RDFM 6000 RDFM0 6074 READ1 60E1 READ11 60E5
  304. READ12 6104 READ13 610B READ14 6120 RFMWPC 60C0 RGCMD FDFD
  305. RGDAT FDFE RGSTS FDFE RPCWFM 612F SCT 6008 SND1 6076
  306. SND11 6079 SND12 6095 SND13 609C SND14 60B1 SNDCH 6174
  307. SNDD1 6176 STTADR 6000 TRK 6007 TXEMOD 600B WBLOP1 613F
  308. WRE1 6192 WRE2 6199 WRFM 6003 WRFM0 60DE WTRDEN 616C
  309. WTWREN 618A
 


以上ですが、作成したソフトなどをOneDriveに上げておきます。
内容は、
・Windows側
  ft245drv.exe(64ビット版ですので32ビットOSでは動作しません)
・FM側
 メニューソフト FT245DRV(F-BASIC)
 サブルーチン FTDRV11o(機械語)ソースリストとバイナリ
・FMへの転送用DATファイル FT245DRIVER2.DAT(上記の2ソフトを収めてある)
・以上のソフトの使用説明書
・ユーティリティ
 イメージファイル処理ソフト FBasDrvWin.exe
 (以前紹介したものをDAT形式ファイルを扱えるように拡張したもの。
  FT245通信カードと関係なく、イメージファイルを処理するソフトとして使用可能。)
です。