32Pスロット拡張基板の第5作目です(ついに最終版?)
拡張コネクタベース基板 |
32Pコネクタ拡張基板 |
拡張コネクタベース基板 |
32Pコネクタ拡張基板 |
2019年10月26日の「FM-7でPC用のフロッピードライブを使う」で紹介しました、PC用の2DDドライブをFM-7等で使うための、FDDに直接装着するタイプのアダプタをプリント基板化しました。
簡単なものですのであえて基板化する必要もないのですが、他の基板を発注する際に、ついでにということで製作してみたものです。
製作したアダプタは下画像のようです。
アダプタのFDD側 |
アダプタのFDC側 |
回路は簡単すぎて、回路図を示すほどのものではありませんが、FDCからのドライブセレクト信号(0あるいは1)をピン12に入れる切り替えスイッチと、ダイオード1個によるReady信号生成回路からなっています。このダイオード1個によるReady信号生成回路は前回同様に、てきとーに。さんの「FM77AV20/40以降のFDD修理というか交換」中のダイオード1個による簡便な変換回路を使わせていただいています。感謝いたします。
![]() |
FDD ADAPTER |
FDDに装着した様子 |
FDDを2台制御できます |
製作した基板 |
2020年7月29日の「2DDドライブ用ステップ2倍化回路のその後」で紹介しましたステップ2倍化回路ですが、ドライブ毎にそれぞれ2倍化基板が必要となるのは煩雑なので、1枚の基板でドライブ2台を制御できるように改良しました。
最初は単純に2回路を1枚の基板に収めたものを製作して使用してみましたが、これは如何にも大きすぎて、扱いにくいものでした。
左:従来のもの 右:最初に製作した2回路版 |
そもそも、よく考えてみるとATtiny85が2個も必要なわけではありませんでした。ということで、回路を見直した結果、現在の基板と同じサイズに収めることができました。
その回路を示します。
![]() |
FDD2台用回路 |
次に製作した2台用基板 |
下画像はGOTEKをドライブ0に、PC用FDDをドライブ1に指定して、自作のFDCカードに接続した様子です。
使用中の様子 |
長いケーブルを使用したので、結構ゴチャゴチャに見えますね...
でも従来の基板と同じサイズのもので2台のFDDが制御できるようになったので、目的は達成できました。
【9月20日訂正】末尾に訂正が一個所あります。
発注しているプリント基板ができあがるまでハードいじりは措いておいて、いつかは直そうと思っていたソフトの修正に取り掛かりました。
まずは6809用のクロスアセンブラですが、以前、「必要に迫られて自作したアセンブラ等のツールソフトの紹介(2021年9月1日)」で紹介したもので、ASSIST09のソースをアセンブルする際にはそのままではアセンブルできず、ソースを修正する必要がありました。
例えばASSIST09のソースの1684行は
FCB 'H,$01,'H,$01,'H,$00,',,$00 --> $48,$01,$48,$01,$48,$00,$2C,$00 になって欲しい
となっていますが、この中の「',」が$2Cとならずに区切り記号と解釈されてしまうのです。ですので、アセンブルする際には「',」を$2Cと置き換えてアセンブルしていました。
ちなみに、使用者が多いと思われるアークピットさんのX6809でもこれは正常にアセンブルされません。アセンブル結果は次のようになります。
$48,$2C,$24,$30,$31,$2C,$00,$01,$48,$2C,$24,$30,$30,$2C,$00,$00
これは、X6809では1文字は「'」で囲んで「','」にしなければならないという仕様になっているからです。
私の自作アセンブラ(6809用、6800用)でも、最初はそのような仕様にしていたのですが、ASSIST09だけではなく他のソースでも後ろの「'」のない書き方が多いようなので、どちらの書き方にも対応するように変更した結果、「',,」が正常に変換されないというバグが発生していました。
もう一つの不具合も FCB疑似命令に関するもので、負数がちゃんと変換されないというもので、FCBのオペランド中での負数の処理にバグがありました。そのため、やはりアセンブル前にソースのFCBのオペランド中の-1を$FF,-2を$FEのように書き換えていました。
上記の2つの不具合はいずれもFCBのオペランド文字列の解釈に関するものでしたので、それを修正したVer1.92を作成しました。これによって「',」でも「','」のどちらでも正しく変換できるようになりました。
Ver1.92でのアセンブル結果 |
WARNINGが出ている |
以上で自作クロスアセンブラでASSIST09をアセンブルできるようになったのですが、実はソースそのものを何箇所か変更する必要があります。
私が以前から使用していたものは、書籍「MC6809-MC6809Eマイクロプロセッサ プログラミング マニュアル」中のソースではなくバイナリを手入力したもので、必要な個所を直接書き換えて使用していました。当時はアセンブラを所有していなかったので、ソースをアセンブルできなかったのです。
その後、ネットからソースを入手しましたが、そのソースが書籍のものと何箇所か異なっていることに気づいてはいましたが、ちゃんとソースを読んでいませんでした。
最近、ソースをアセンブルしてバイナリを得る必要があったので、書籍と見比べた結果、やはり書籍版を使用することにして、書籍版に合わせてネット版ソースを変更しました。
(私は今まで書籍版のバイナリを使い続けており、ネット版をそのままアセンブルしたものを使用したことがありませんので、動作にどんな違いがあるのかは分かりません。)
変更したのは下記の4箇所です。
1.825行からのCIDTAルーチン
2.870行からのCODTAOルーチン
3.1085行のCPX命令は6800の命令なのでCMPXに変更
4.1619行のCBKADDルーチンのDECBを変更
以前は、Direct命令に変更できる場合は常に変更したコードを生成するようにしていたのですが、これではまずい場合がありましたので現在のような仕様にしているのですが、元のソースを書き換える必要があるのは嬉しくないので、変更するかしないかを選択できるようにしたVer1.93を作成しました。プログラムソースをかなり書き換えたので、正常に動作するかどうかをテスト中です。
以前、ASSIST09に関するブログを書いた際には、もう既に移植済みのASSIST09にコマンドを追加したという内容でした。
「ASSIST09に追加したLoad, Saveコマンドを改良しました」(2018年6月27日)
「ASSIST09にLoad, Saveコマンドを追加」(2018年5月26日)
今さらとは思いますが、マイコンなどへの移植はネットでもいくつか見ますが(私も昔から自作マイコンで使用しています)、FM-7への移植はあまり見たことがないので、ここでFM-7へのASSIST09の移植の手順について書いてみたいと思います。
なお、以下の移植の手順についてはインターフェース誌1982年4月号の「ASSIST09の詳細とFM-8への移植(高橋豊)」をほとんどそのままFM-7に適用したものです。高橋豊さんに感謝いたします。
[1]最も簡単な移植(入出力にACIAを使用、領域圧縮なし、拡張ROMなし、アドレス$F800からに配置)
アセンブラが使用できればソースを変更してバイナリを生成できますので、ソースの24行、25行のACIAとPTMのアドレスを変更し、配置するアドレスを20行に書いてアセンブルするだけです。PTMが実装されていない場合はアドレスに$0000を書いておきます。
しかし、これでは2KBのASSIST09の他に6KBもの使われないエリアが生じて無駄が多くなりますし、そもそも、FM-7のようなパソコンの$F800からには移植できません...
[2]簡単な移植(入出力にACIAを使用、領域圧縮なし、拡張ROMなし、任意のアドレスに配置)
任意のアドレスに配置する場合には、20行目のROMBEG(スタートアドレス)を書き換えます。さらに[1]の設定に加えて、SWIやNMIのベクターアドレスをASSIST09用に再設定する必要があります。ベクターアドレスについては直接設定することになります。
[3]未使用領域を圧縮して移植(拡張ROMあり、他は[2]と同様)
拡張ROMを使用する場合は、それを用いて必要な再設定をすることができます。図のFM-7への配置例で示したものでは、$6800~$6FFFにASSIST09を配置し、その下に$100バイトの拡張ROMを置き、その下からがスタック/ワークエリアとしています。ソースの変更箇所はROMBEG(スタートアドレス)とRAMOFS(拡張ROMのオフセット)のみで、他は拡張ROM中で設定できます。
![]() |
ASSIST09の配置例 |
ASSIST09は拡張を容易にするために、自身のアドレスから2KB下に$20,$FE(BRA *)があると、拡張ROMがあるとみなし、ASSIST09の起動前に$20,$FEの次のアドレスにサブルーチンジャンプすることで、ユーザの初期化プログラムなどを実行することができます。図では、2KB下ではなく$100バイト下に設定しています。
この初期化プログラム中で必要な処理を書くわけですが、最小限必要な処理は以下の2つです。
・1文字入力ルーチン、1文字出力ルーチンをFM-7のそれに置き換える。
・SWI、NMIルーチンをASSIST09用に置き換える。
SWIはASSIST09の内部でサブルーチンコールなどのために使用しています。NMIはBREAKキーでF-BASICに戻るために使います。
その他、コマンドの拡張もここで行うことができます。
拡張ROMの例を下に示します。まず最小限のものです。
- 0001 *
- 0002 * ExROM for FM-7 (最小版)
- 0003 *
- 0004 * ASSIST09の詳細とFM-8への移植
- 0005 * 高橋豊 インターフェース 1982年4月号 PP138-162
- 0006 *
- 0007 6800 ROMBEG EQU $6800
- 0008 0100 ROMSIZ EQU $100
- 0009 6700 ROM2OF EQU ROMBEG-ROMSIZ
- 0010 0020 LINSIZ EQU $20
- 0011 67E0 ROMLIN EQU ROMBEG-LINSIZ
- 0012
- 0013 0016 QCIDTA EQU 22
- 0014 001C QCODTA EQU 28
- 0015
- 0016 * ----- USER ROM ------
- 0017
- 0018 6700 ORG ROM2OF
- 0019
- 0020 6700 20 FE BRA * USER ROM MARK
- 0021
- 0022 6702 INIT EQU *
- 0023 * CIDTA==> GETKEY
- 0024 6702 31 8C 0C LEAY <GETKEY,PCR
- 0025 6705 10AF C8 16 STY QCIDTA,U
- 0026 * CODTA==> OUTCRT
- 0027 6709 31 8C 27 LEAY <OUTCRT,PCR
- 0028 670C 10AF C8 1C STY QCODTA,U
- 0029 6710 39 RTS
- 0030
- 0031 * FM-7 HANDLER
- 0032 DB6D GTKEYE EQU $DB6D INPUT 1 CHR
- 0033 D9D9 OTCRTE EQU $D9D9 OUTPUT 1 CHR
- 0034 FBF7 CSRONE EQU $FBF7 CURSOR ON
- 0035 FBEB CSROFE EQU $FBEB CURSOR OFF
- 0036 8684 BASICE EQU $8684 RETURN TO BASIC
- 0037 0313 STPFLG EQU $0313 BREAK FLAG
- 0038
- 0039 6711 GETKEY EQU *
- 0040 6711 34 7C PSHS B,DP,X,Y,U
- 0041 6713 4F CLRA
- 0042 6714 1F 8B TFR A,DP
- 0043 6716 B6 0313 LDA STPFLG
- 0044 6719 27 03 BEQ CONT
- 0045
- 0046 671B 7E 8684 JMP BASICE
- 0047
- 0048 671E BD FBF7 CONT JSR CSRONE
- 0049 6721 BD DB6D JSR GTKEYE
- 0050 6724 1C FE ANDCC #$FE
- 0051 6726 27 09 BEQ GTKYRT
- 0052 6728 34 02 PSHS A
- 0053 672A BD FBEB JSR CSROFE
- 0054 672D 35 02 PULS A
- 0055 672F 1A 01 ORCC #1
- 0056 6731 35 FC GTKYRT PULS B,DP,X,Y,U,PC
- 0057
- 0058 6733 OUTCRT EQU *
- 0059 6733 34 7E PSHS A,B,DP,X,Y,U
- 0060 6735 4F CLRA
- 0061 6736 1F 8B TFR A,DP
- 0062 6738 A6 E4 LDA ,S
- 0063 673A BD D9D9 JSR OTCRTE
- 0064 673D 35 FE PULS A,B,DP,X,Y,U,PC
- 0065
- 0066 67E0 ORG ROMLIN
- 0067
- 0068 *LINK TO FM-7
- 0069 0269 MONTRP EQU $0269 FM-7 MONITOR
- 0070 01D7 SWITRP EQU $01D7 FM-7 SWI
- 0071 01DA NMITRP EQU $01DA FM-7 NMI
- 0072
- 0073 67E0 LINKER EQU *
- 0074 67E0 30 8C 54 LEAX <RESET,PCR
- 0075 67E3 BF 026A STX MONTRP+1
- 0076 67E6 308D 07FE LEAX SWI,PCR
- 0077 67EA BF 01D8 STX SWITRP+1
- 0078 67ED 308D 07FB LEAX NMI,PCR
- 0079 67F1 BF 01DB STX NMITRP+1
- 0080 67F4 86 7E LDA #$7E JMP $****
- 0081 67F6 B7 0269 STA MONTRP
- 0082 67F9 B7 01D7 STA SWITRP
- 0083 67FC B7 01DA STA NMITRP
- 0084 67FF 39 RTS
- 0085
- 0086 6837 RESET EQU ROMBEG+$037 ASSIST09 START
- 0087 6FE8 SWI EQU ROMBEG+$7E8 ASSIST09 SWI
- 0088 6FEC NMI EQU ROMBEG+$7EC ASSIST09 NMI
- 0089
- 0090 END
- 0 error(s), 0 warning(s) is detected.
- Label address
- BASICE 8684 CONT 671E CSROFE FBEB CSRONE FBF7 GETKEY 6711
- GTKEYE DB6D GTKYRT 6731 INIT 6702 LINKER 67E0 LINSIZ 0020
- MONTRP 0269 NMI 6FEC NMITRP 01DA OTCRTE D9D9 OUTCRT 6733
- QCIDTA 0016 QCODTA 001C RESET 6837 ROM2OF 6700 ROMBEG 6800
- ROMLIN 67E0 ROMSIZ 0100 STPFLG 0313 SWI 6FE8 SWITRP 01D7
- 0001 *
- 0002 * ExROM for FM-7 (拡張コマンドあり、ACIA/PTM処理あり)
- 0003 *
- 0004 * ASSIST09の詳細とFM-8への移植
- 0005 * 高橋豊 インターフェース 1982年4月号 PP138-162
- 0006 *
- 0007 6800 ROMBEG EQU $6800
- 0008 0100 ROMSIZ EQU $100
- 0009 6700 ROM2OF EQU ROMBEG-ROMSIZ
- 0010 0020 LINSIZ EQU $20
- 0011 67E0 ROMLIN EQU ROMBEG-LINSIZ
- 0012 0000 PTM EQU $0000
- 0013 0000 ACIA EQU $0000
- 0014
- 0015 000A LF EQU $A
- 0016 000D CR EQU $D
- 0017 0020 SPACE EQU $20
- 0018
- 0019 0003 PDATA EQU 3
- 0020 0009 VCTRSW EQU 9
- 0021
- 0022 0016 QCIDTA EQU 22
- 0023 001C QCODTA EQU 28
- 0024 002A QEXPAN EQU 42
- 0025 002C QCMDL2 EQU 44
- 0026 002E QACIA EQU 46
- 0027 0034 QPTM EQU 52
- 0028
- 0029 009B NUMBER EQU $9B
- 0030
- 0031 * ----- USER ROM -----
- 0032
- 0033 6700 ORG ROM2OF
- 0034
- 0035 6700 20 FE BRA * USER ROM MARK
- 0036
- 0037 6702 INIT EQU *
- 0038 * CIDTA==> GETKEY
- 0039 6702 31 8C 23 LEAY <GETKEY,PCR
- 0040 6705 10AF C8 16 STY QCIDTA,U
- 0041 * CODTA==> OUTCRT
- 0042 6709 31 8C 3E LEAY <OUTCRT,PCR
- 0043 670C 10AF C8 1C STY QCODTA,U
- 0044 * PTM==> USER PTM
- 0045 6710 108E 0000 LDY #PTM
- 0046 6714 10AF C8 34 STY QPTM,U
- 0047 * ACIA==> USER ACIA
- 0048 6718 108E 0000 LDY #ACIA
- 0049 671C 10AF C8 2E STY QACIA,U
- 0050 *SET USER COMMAND TABLE
- 0051 6720 31 8C 33 LEAY <USRCMD,PCR
- 0052 6723 10AF C8 2C STY QCMDL2,U
- 0053 6727 39 RTS
- 0054
- 0055 * FM-7 HANDLER
- 0056 DB6D GTKEYE EQU $DB6D INPUT 1 CHR
- 0057 D9D9 OTCRTE EQU $D9D9 OUTPUT 1 CHR
- 0058 FBF7 CSRONE EQU $FBF7 CURSOR ON
- 0059 FBEB CSROFE EQU $FBEB CURSOR OFF
- 0060 8684 BASICE EQU $8684 RETURN TO BASIC
- 0061 0313 STPFLG EQU $0313 BREAK FLAG
- 0062
- 0063 6728 GETKEY EQU *
- 0064 6728 34 7C PSHS B,DP,X,Y,U
- 0065 672A 4F CLRA
- 0066 672B 1F 8B TFR A,DP
- 0067 672D B6 0313 LDA STPFLG
- 0068 6730 27 03 BEQ CONT
- 0069
- 0070 6732 7E 8684 JMP BASICE
- 0071
- 0072 6735 BD FBF7 CONT JSR CSRONE
- 0073 6738 BD DB6D JSR GTKEYE
- 0074 673B 1C FE ANDCC #$FE
- 0075 673D 27 09 BEQ GTKYRT
- 0076 673F 34 02 PSHS A
- 0077 6741 BD FBEB JSR CSROFE
- 0078 6744 35 02 PULS A
- 0079 6746 1A 01 ORCC #1
- 0080 6748 35 FC GTKYRT PULS B,DP,X,Y,U,PC
- 0081
- 0082 674A OUTCRT EQU *
- 0083 674A 34 7E PSHS A,B,DP,X,Y,U
- 0084 674C 4F CLRA
- 0085 674D 1F 8B TFR A,DP
- 0086 674F A6 E4 LDA ,S
- 0087 6751 BD D9D9 JSR OTCRTE
- 0088 6754 35 FE PULS A,B,DP,X,Y,U,PC
- 0089
- 0090 * USER COMMAND
- 0091 6756 USRCMD EQU *
- 0092 6756 04 FCB 4
- 0093 6757 46 FCC /F/
- 0094 6758 0007 FDB FILL-*
- 0095 675A 04 FCB 4
- 0096 675B 58 FCC /X/
- 0097 675C 0041 FDB XFER-*
- 0098 675E FE FCB -2
- 0099
- 0100 675F FILL EQU *
- 0101 675F 8D 19 BSR GETNUM
- 0102 6761 109E 9B LDY <NUMBER
- 0103 6764 8D 14 BSR GETNUM
- 0104 6766 DE 9B LDU <NUMBER
- 0105 6768 33 41 LEAU 1,U
- 0106 676A 8D 0E BSR GETNUM
- 0107 676C 96 9C LDA <NUMBER+1
- 0108 676E 34 40 PSHS U
- 0109 6770 1F 21 TFR Y,X
- 0110 6772 A7 80 FILNXT STA ,X+
- 0111 6774 AC E4 CMPX ,S
- 0112 6776 26 FA BNE FILNXT
- 0113 6778 35 C0 PULS U,PC
- 0114
- 0115 677A GETNUM EQU *
- 0116 677A 86 2A LDA #QEXPAN
- 0117 677C 8E 0000 LDX #0
- 0118 677F 3F SWI
- 0119 6780 09 FCB VCTRSW
- 0120 6781 AD 84 JSR ,X
- 0121 6783 26 09 BNE ERR
- 0122 6785 81 20 CMPA #SPACE
- 0123 6787 27 04 BEQ RTS
- 0124 6789 81 0D CMPA #CR
- 0125 678B 26 01 BNE ERR
- 0126 678D 39 RTS RTS
- 0127
- 0128 678E ERR EQU *
- 0129 678E 30 8C 04 LEAX <ERRMSG,PCR
- 0130 6791 3F SWI
- 0131 6792 03 FCB PDATA
- 0132 6793 35 90 PULS X,PC
- 0133 6795 45 ERRMSG FCC /ERROR/,CR,LF,4
- 0134
- 0135 679D XFER EQU *
- 0136 679D 8D DB BSR GETNUM
- 0137 679F 109E 9B LDY <NUMBER
- 0138 67A2 8D D6 BSR GETNUM
- 0139 67A4 DE 9B LDU <NUMBER
- 0140 67A6 33 41 LEAU 1,U
- 0141 67A8 8D D0 BSR GETNUM
- 0142 67AA DC 9B LDD <NUMBER
- 0143 67AC 34 66 PSHS D,Y,U
- 0144 67AE A3 62 SUBD 2,S
- 0145 67B0 22 0E BHI BACKWD
- 0146 67B2 35 10 PULS X
- 0147 67B4 1E 12 EXG X,Y
- 0148 67B6 A6 80 FORWD1 LDA ,X+
- 0149 67B8 A7 A0 STA ,Y+
- 0150 67BA AC 62 CMPX 2,S
- 0151 67BC 26 F8 BNE FORWD1
- 0152 67BE 35 B0 PULS X,Y,PC
- 0153 67C0 30 CB BACKWD LEAX D,U
- 0154 67C2 A6 C2 BAKWD1 LDA ,-U
- 0155 67C4 A7 82 STA ,-X
- 0156 67C6 AC E4 CMPX ,S
- 0157 67C8 26 F8 BNE BAKWD1
- 0158 67CA 35 F0 PULS X,Y,U,PC
- 0159
- 0160 67E0 ORG ROMLIN
- 0161 *LINK TO FM-7
- 0162 0269 MONTRP EQU $0269 FM-7 MONITOR
- 0163 01D7 SWITRP EQU $01D7 FM-7 SWI
- 0164 01DA NMITRP EQU $01DA FM-7 NMI
- 0165
- 0166 67E0 LINKER EQU *
- 0167 67E0 30 8C 54 LEAX <RESET,PCR
- 0168 67E3 BF 026A STX MONTRP+1
- 0169 67E6 308D 07FE LEAX SWI,PCR
- 0170 67EA BF 01D8 STX SWITRP+1
- 0171 67ED 308D 07FB LEAX NMI,PCR
- 0172 67F1 BF 01DB STX NMITRP+1
- 0173 67F4 86 7E LDA #$7E JMP $****
- 0174 67F6 B7 0269 STA MONTRP
- 0175 67F9 B7 01D7 STA SWITRP
- 0176 67FC B7 01DA STA NMITRP
- 0177 67FF 39 RTS
- 0178
- 0179 6837 RESET EQU ROMBEG+$037 ASSIST09 START
- 0180 6FE8 SWI EQU ROMBEG+$7E8 ASSIST09 SWI
- 0181 6FEC NMI EQU ROMBEG+$7EC ASSIST09 NMI
- 0182
- 0183 END
- 0 error(s), 0 warning(s) is detected.
- Label address
- ACIA 0000 BACKWD 67C0 BAKWD1 67C2 BASICE 8684 CONT 6735
- CR 000D CSROFE FBEB CSRONE FBF7 ERR 678E ERRMSG 6795
- FILL 675F FILNXT 6772 FORWD1 67B6 GETKEY 6728 GETNUM 677A
- GTKEYE DB6D GTKYRT 6748 INIT 6702 LF 000A LINKER 67E0
- LINSIZ 0020 MONTRP 0269 NMI 6FEC NMITRP 01DA NUMBER 009B
- OTCRTE D9D9 OUTCRT 674A PDATA 0003 PTM 0000 QACIA 002E
- QCIDTA 0016 QCMDL2 002C QCODTA 001C QEXPAN 002A QPTM 0034
- RESET 6837 ROM2OF 6700 ROMBEG 6800 ROMLIN 67E0 ROMSIZ 0100
- RTS 678D SPACE 0020 STPFLG 0313 SWI 6FE8 SWITRP 01D7
- USRCMD 6756 VCTRSW 0009 XFER 679D