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ポートスキャン」ボタンを押してから選択します。
動作中の画面 |
- 0001 *
- 0002 * FTDRV for 2D/2DD DISK COPY PROGRAM
- 0003 *
- 0004 * FT245 :RD# : read data (L:data enable, L->H:data fetch)
- 0005 * WR : write data (H->L:write data to buffer)
- 0006 * RXF# : Rx fill (L:received data in buffer, H:read data prohibited)
- 0007 * TXE# : Tx enable (L:enable data send, H:inhibited data send)
- 0008 *
- 0009 * $FDFE bit7:RXF, bit6:TXE
- 0010 * $FDFD bit1:WR, bit0:RD
- 0011 *
- 0012 6000 STTADR EQU $6000
- 0013
- 0014 FDFE RGDAT EQU $FDFE
- 0015 FDFE RGSTS EQU $FDFE
- 0016 FDFD RGCMD EQU $FDFD
- 0017 FBFA BIOS EQU $FBFA
- 0018 FD1E CHGFDD EQU $FD1E bit6:0-2DD(default), 1-2D
- 0019
- 0020 6000 ORG STTADR
- 0021
- 0022 6000 16 0071 RDFM LBRA RDFM0
- 0023 6003 16 00D8 WRFM LBRA WRFM0
- 0024
- 0025 6006 00 DPSV FCB 0 ;save DP
- 0026 6007 00 TRK FCB 0
- 0027 6008 01 SCT FCB 1
- 0028 6009 01 DRV FCB 1
- 0029 600A 00 DRVTYP FCB 0 0:2D,1:2DD
- 0030 600B 01 TXEMOD FCB 1 0:OFF,1:ON
- 0031 600C 28 MAXTRK FCB 40 2D:40,2DD:80
- 0032
- 0033 * RCB for Read/Write
- 0034 600D 00 RCBRW FCB $00,$00,$00,$00,$00,$00,$00,$00
- 0035 6015 08 RCBRST FCB $08,$00,$00,$00,$00,$00,$00,$00
- 0036 *
- 0037 *--------------------------------------------------
- 0038 *initialize for read FM
- 0039 601D INIRD EQU *
- 0040 601D 86 0A LDA #$0A DREAD
- 0041 601F 20 02 BRA INI2
- 0042
- 0043 *initialize for write FM
- 0044 6021 INIWR EQU *
- 0045 6021 86 09 LDA #$09 DWRITE
- 0046 6023 INI2
- 0047 6023 34 02 PSHS A
- 0048 6025 1F B8 TFR DP,A
- 0049 6027 A78D FFDB STA >DPSV,PCR
- 0050 602B 1F 50 TFR PC,D
- 0051 602D 1F 8B TFR A,DP
- 0052 60 SETDP $60
- 0053 602F 35 02 PULS A
- 0054
- 0055 6031 30 8C D9 LEAX RCBRW,PCR
- 0056 6034 A7 84 STA ,X
- 0057 6036 318D 01C6 LEAY BUFF,PCR
- 0058 603A 10AF 02 STY 2,X
- 0059 603D CC 0001 LDD #$0001 TRK:0,SCT:1
- 0060 6040 ED 8C C4 STD TRK,PCR
- 0061 6043 ED 04 STD 4,X
- 0062 6045 4F CLRA
- 0063 6046 A7 06 STA 6,X SIDE:0
- 0064 6048 A6 8C BE LDA DRV,PCR
- 0065 604B A7 07 STA 7,X DRV for DREAD/DWRITE
- 0066 604D A7 0F STA 15,X DRV for RESTORE
- 0067
- 0068 *change to 320KB/640KB FDD
- 0069 604F B6 FD1E LDA CHGFDD
- 0070 6052 E6 8C B5 LDB DRVTYP,PCR
- 0071 6055 26 04 BNE INI3
- 0072 6057 8A 40 ORA #$40 bit6=1 set 320KB
- 0073 6059 20 02 BRA INI4
- 0074 605B 84 BF INI3 ANDA #$BF bit6=0 set 640KB
- 0075 605D B7 FD1E INI4 STA CHGFDD
- 0076 *set MAXTRK
- 0077 6060 5D TSTB
- 0078 6061 26 04 BNE INI5
- 0079 6063 86 28 LDA #40
- 0080 6065 20 02 BRA INI6
- 0081 6067 86 50 INI5 LDA #80
- 0082 6069 A7 8C A0 INI6 STA MAXTRK,PCR
- 0083
- 0084 606C 30 8C A6 LEAX RCBRST,PCR RESTORE
- 0085 606F AD9F FBFA JSR [BIOS]
- 0086 6073 39 RTS
- 0087
- 0088 *--------------------------------------------------
- 0089 * read sct data from FM, write to WindowsPC
- 0090 *
- 0091 6074 RDFM0 EQU *
- 0092 *set init for read
- 0093 6074 8D A7 BSR INIRD
- 0094
- 0095 *write to PC from FM
- 0096 6076 SND1 EQU *
- 0097 6076 6F 8C 98 CLR RCBRW+4,PCR trk:0
- 0098 6079 SND11 EQU *
- 0099 6079 8D 1A BSR SND12
- 0100 607B 6C 8C 93 INC RCBRW+4,PCR trk+1
- 0101 607E A6 8C 8B LDA MAXTRK,PCR
- 0102 6081 A1 8C 8D CMPA RCBRW+4,PCR end trk?
- 0103 6084 22 F3 BHI SND11
- 0104 *dp return
- 0105 6086 A68D FF7C LDA DPSV,PCR
- 0106 608A 1F 8B TFR A,DP
- 0107 *reset to 640KB FDD
- 0108 608C B6 FD1E LDA CHGFDD
- 0109 608F 84 BF ANDA #$BF bit6=0
- 0110 6091 B7 FD1E STA CHGFDD
- 0111 6094 39 RTS
- 0112
- 0113 *read 16scts data from FM, write to PC (for side 0)
- 0114 6095 SND12 EQU *
- 0115 6095 CC 0100 LDD #$0100 sct:1,side:0
- 0116 6098 ED8D FF76 STD RCBRW+5,PCR
- 0117 609C SND13 EQU *
- 0118 609C 8D 22 BSR RFMWPC
- 0119 609E 6C8D FF70 INC RCBRW+5,PCR sct+1
- 0120 60A2 86 10 LDA #16
- 0121 60A4 A18D FF6A CMPA RCBRW+5,PCR
- 0122 60A8 2A F2 BPL SND13
- 0123 *read 16scts data from FM, write to PC (for side 1)
- 0124 60AA CC 0101 LDD #$0101 sct:1,side:1
- 0125 60AD ED8D FF61 STD RCBRW+5,PCR
- 0126 60B1 SND14 EQU *
- 0127 60B1 8D 0D BSR RFMWPC
- 0128 60B3 6C8D FF5B INC RCBRW+5,PCR sct+1
- 0129 60B7 86 10 LDA #16
- 0130 60B9 A18D FF55 CMPA RCBRW+5,PCR
- 0131 60BD 2A F2 BPL SND14
- 0132 60BF 39 RTS
- 0133
- 0134 *read 1sct data from FM, write to PC
- 0135 60C0 RFMWPC EQU *
- 0136 *write header to PC
- 0137 60C0 308D FF49 LEAX RCBRW,PCR
- 0138 60C4 C6 10 LDB #16
- 0139 60C6 17 00AB LBSR SNDCH
- 0140 *read sct data from FM
- 0141 60C9 308D FF40 LEAX RCBRW,PCR
- 0142 60CD AD9F FBFA RBLOP1 JSR [BIOS]
- 0143 60D1 A6 01 LDA 1,X
- 0144 60D3 26 F8 BNE RBLOP1
- 0145
- 0146 *write sct data to PC
- 0147 60D5 308D 0127 LEAX BUFF,PCR
- 0148 60D9 5F CLRB counter:256
- 0149 60DA 17 0097 LBSR SNDCH
- 0150 60DD 39 RTS
- 0151
- 0152 *
- 0153 *--------------------------------------------------
- 0154 * read sct data from WindowsPC, write to FM
- 0155 *
- 0156 60DE WRFM0 EQU *
- 0157 *set init for write
- 0158 60DE 17 FF40 LBSR INIWR
- 0159
- 0160 *read from PC, write to FM
- 0161 60E1 READ1 EQU *
- 0162 60E1 6F8D FF2C CLR RCBRW+4,PCR trk:0
- 0163 60E5 READ11 EQU *
- 0164 60E5 8D 1D BSR READ12
- 0165 60E7 6C8D FF26 INC RCBRW+4,PCR trk+1
- 0166 60EB A68D FF1D LDA MAXTRK,PCR
- 0167 60EF A18D FF1E CMPA RCBRW+4,PCR end trk?
- 0168 60F3 22 F0 BHI READ11
- 0169 *dp return
- 0170 60F5 A68D FF0D LDA DPSV,PCR
- 0171 60F9 1F 8B TFR A,DP
- 0172 *reset to 640KB FDD
- 0173 60FB B6 FD1E LDA CHGFDD
- 0174 60FE 84 BF ANDA #$BF bit6=0
- 0175 6100 B7 FD1E STA CHGFDD
- 0176 6103 39 RTS
- 0177
- 0178 *read 16scts data from PC, write to FM (for side 0)
- 0179 6104 READ12 EQU *
- 0180 6104 CC 0100 LDD #$0100 sct:1,side:0
- 0181 6107 ED8D FF07 STD RCBRW+5,PCR
- 0182 610B READ13 EQU *
- 0183 610B 8D 22 BSR RPCWFM
- 0184 610D 6C8D FF01 INC RCBRW+5,PCR sct+1
- 0185 6111 86 10 LDA #16
- 0186 6113 A18D FEFB CMPA RCBRW+5,PCR
- 0187 6117 2A F2 BPL READ13
- 0188 *read next 16scts data from PC, write to FM (for side 1)
- 0189 6119 CC 0101 LDD #$0101 sct:1,side:1
- 0190 611C ED8D FEF2 STD RCBRW+5,PCR
- 0191 6120 READ14 EQU *
- 0192 6120 8D 0D BSR RPCWFM
- 0193 6122 6C8D FEEC INC RCBRW+5,PCR sct+1
- 0194 6126 86 10 LDA #16
- 0195 6128 A18D FEE6 CMPA RCBRW+5,PCR
- 0196 612C 2A F2 BPL READ14
- 0197 612E 39 RTS
- 0198
- 0199 *read 1sct data from PC, write to FM
- 0200 612F RPCWFM EQU *
- 0201 *read sct data from PC
- 0202 612F 308D 00CD LEAX BUFF,PCR
- 0203 6133 5F CLRB counter:256
- 0204 6134 8D 12 DRD1 BSR RCVCH
- 0205 6136 A7 80 STA ,X+
- 0206 6138 5A DECB
- 0207 6139 26 F9 BNE DRD1
- 0208 *write data to sct of FM
- 0209 613B 308D FECE LEAX RCBRW,PCR
- 0210 613F AD9F FBFA WBLOP1 JSR [BIOS]
- 0211 6143 A6 01 LDA 1,X error?
- 0212 6145 26 F8 BNE WBLOP1
- 0213 6147 39 RTS
- 0214
- 0215 *
- 0216 *===== receive 1 chr =====
- 0217 * 1st received byte : bit7,6(located on bit5,4)
- 0218 * 2nd received byte : bit5-0
- 0219 * return A:input chr
- 0220 *
- 0221 6148 RCVCH EQU *
- 0222 6148 34 04 PSHS B
- 0223 614A 8D 20 BSR WTRDEN wait RXF=L
- 0224 614C C6 01 LDB #$01 read cmd(D0=H)
- 0225 614E 8D 12 BSR GETDAT get 1st byte
- 0226 6150 84 30 ANDA #$30 get bit5,4
- 0227 6152 48 ASLA
- 0228 6153 48 ASLA to bit7,6
- 0229 6154 34 02 PSHS A save bit7,6 of chr
- 0230 6156 8D 14 BSR WTRDEN wait RXF=L
- 0231 6158 8D 08 BSR GETDAT get 2nd byte
- 0232 615A 84 3F ANDA #$3F get bit5-0
- 0233 615C AB E4 ADDA ,S bit7,6+bit5-0
- 0234 615E 32 61 LEAS 1,S returns the SP
- 0235 6160 35 84 PULS B,PC
- 0236
- 0237 *get data
- 0238 * return A:input data
- 0239 6162 F7 FDFD GETDAT STB RGCMD write cmd
- 0240 6165 B6 FDFE LDA RGDAT get data
- 0241 6168 7F FDFD CLR RGCMD set RD#=L
- 0242 616B 39 RTS
- 0243 *
- 0244 * wait RXF enable
- 0245 * RXF L:data exist, H:not exist
- 0246 * RGSTS bit7:RXF
- 0247 *
- 0248 616C WTRDEN EQU *
- 0249 616C B6 FDFE RDE1 LDA RGSTS
- 0250 616F 84 80 ANDA #$80
- 0251 6171 26 F9 BNE RDE1 RXF=L?
- 0252 * CLR RGCMD set RD#=L
- 0253 6173 39 RTS
- 0254
- 0255 *
- 0256 *===== send 1 chr =====
- 0257 *send sct data from buf to ft245
- 0258 * write to ft245 at WR:H->L
- 0259 *
- 0260 * B:counter
- 0261 * X:adr of buff
- 0262 *
- 0263 6174 SNDCH EQU *
- 0264 6174 34 02 PSHS A
- 0265 6176 SNDD1
- 0266 6176 8D 12 BSR WTWREN wait TXE=L
- 0267 6178 86 02 LDA #2
- 0268 617A B7 FDFD STA RGCMD bit1=1(WR=H)
- 0269 617D A6 80 LDA ,X+
- 0270 617F B7 FDFE STA RGDAT set DATA
- 0271 6182 7F FDFD CLR RGCMD bit1=0(WR=H->L)
- 0272 6185 5A DECB
- 0273 6186 26 EE BNE SNDD1
- 0274 6188 35 82 PULS A,PC
- 0275
- 0276 *
- 0277 * wait Tx enable
- 0278 * TXE L:enable, H:disable
- 0279 * RGSTS bit6:TXE
- 0280 *
- 0281 618A WTWREN EQU *
- 0282 618A 34 02 PSHS A
- 0283 618C A68D FE7B LDA TXEMOD,PCR
- 0284 6190 27 07 BEQ WRE2
- 0285 6192 B6 FDFE WRE1 LDA RGSTS
- 0286 6195 84 40 ANDA #$40
- 0287 6197 26 F9 BNE WRE1 bit6=0?
- 0288 6199 35 82 WRE2 PULS A,PC
- 0289
- 0290 6200 ORG STTADR+$200
- 0291
- 0292 6200 FF BUFF RMB 256
- 0293
- 0294
- 0 error(s), 2 warning(s) is detected.
- Label address
- BIOS FBFA BUFF 6200 CHGFDD FD1E DPSV 6006 DRD1 6134
- DRV 6009 DRVTYP 600A GETDAT 6162 INI2 6023 INI3 605B
- INI4 605D INI5 6067 INI6 6069 INIRD 601D INIWR 6021
- MAXTRK 600C RBLOP1 60CD RCBRST 6015 RCBRW 600D RCVCH 6148
- RDE1 616C RDFM 6000 RDFM0 6074 READ1 60E1 READ11 60E5
- READ12 6104 READ13 610B READ14 6120 RFMWPC 60C0 RGCMD FDFD
- RGDAT FDFE RGSTS FDFE RPCWFM 612F SCT 6008 SND1 6076
- SND11 6079 SND12 6095 SND13 609C SND14 60B1 SNDCH 6174
- SNDD1 6176 STTADR 6000 TRK 6007 TXEMOD 600B WBLOP1 613F
- WRE1 6192 WRE2 6199 WRFM 6003 WRFM0 60DE WTRDEN 616C
- WTWREN 618A