七転八倒は覚悟し思い付きで製作したハードにソフトを気長に対応させて行こうかと2020/02/22FM-7のZ80スロットを使う拡張カードII実践編PART5当面のまとめになります。・回路図(robotdyn20200220.pdf)https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&cid=6357DCB7DCA88133&id=6357DCB7DCA88133%21243&parId=6357DCB7DCA88133%21108&o=OneUp一部を除き期待通りに動作する回路図です。現状は「ATmega2560」から出力する「QB_OUT」、「EB_OUT」、「RWB_OUT」、及び「データのビット0」の各種の信号を「バッファ:74LS244」の入力に与えてます。信号を「74LS244」を通さず、直接40ピンコネクタ(FM-7のバス)に与えても安定した動作になるなら、「QB_OUT」信号を「D11」ではなく「D10」に変更する可能性はあります。理由は当初予定になかった機能のために空中配線が3本になっていますが上記の変更で空中配線が2本になるからです。「ATmega2560」の「D5」からの出力信号を40ピンコネクタの「REFCH」に与えてます。「QB(_OUT)」信号を「74LS244」を通して40ピンコネクタの「QB」に与えてます。このため一旦(1本)は「QB(_OUT)」と「74LS244」の4番ピンを接続し、「74LS244」の16番ピンと40ピンコネクタの「QB」とを接続するため合計で、この機能のために2本の空中配線が必要になっています。今回製作した基板での実配線では、「QB(_OUT)」と「74LS244」との接続は同じですが「74LS244」の16番ピンの出力は、既に「QB」信号として存在している「ATmega2560」の「D48」ピンとを接続してます。自分は、この実装では半田ではなくワイヤーラッピングで「D48」を通して、40ピンコネクタの「QB」とを接続としました。・Arduino(ATmega2560)のスケッチ(sketch_FM7_ATmega2560.info.ino)回路図と同じリンク先に最新のスケッチがあります。前回も書きましたけど再掲します。loop()の中のswitch-caseの先頭に入れました。規則的な周期でなくても構わないと認識してます。パルス2)メモリへの書き込み「6809」がDRAMに書き込む場合とシーケンスは同一です。最初に自分が製作した回路では「ATmega2560」からの出力を直接40ピンコネクタの「QB」に入れていたので、どう足掻いてもメモリへの書き込みはできませんでした。3個のバッファが必要か現状では残念ながらZ80カードのように必ずしも正常復帰するとは限りませんが「6809」の「HALT」端子に「HIGH」を与えて復帰する時には「HIGH」を与えてから1クロック後になります。6809」に復帰する際は、FM-7上の「ATmega2560」の影響を1クロック以内に消滅する必要があります。(当初は即時と勘違い)また「ATmega2560」から「$FD05、0」的なコードを実行するにはアドレス用として「2ポート」、データ用として「1ポート」、「RWB」用として「1ポート」必要になります。データ用としては0ビットのみの必要となりますので「RWB」と「データ用の0ビット」をまとめて「1ポート」する事も可能です。以上を勘案し「ATmega2560」のソフトのみで1クロック以内に、「3ポート」を出力からFM-7上のバスに影響しない「入力」にすることは不可能です。それがバッファとして3個のTTLを用意した理由になります。逆に「6809」の1クロック以内に「ATmega2560」のマシン語なら1命令は実行できますので、アドレス用の「74LS245」を1個は省力できる可能性があります。TTLの個数は現状のままで、Z80WがLOWの時に書き込み以外にFM-7のメモリの内容を読むこともできる可能性があります。3)loop()の中からコールしてる関数setLAddress()、setData()のみです。他はアセンブラ的になってしまいました。一部アセンブラ自体もあります。三種の神器?、名誉の負傷?20200222因みに「三種の神器?」と言うのはラッピングツール用のツールでラッピングワイヤーの皮膜を100回以上「差し歯」で剥していたら歯肉が炎症し痛くなり、今日の午前中は歯科医院で受診しました。歯科医から「差し歯が割れなくて良かったね」と言われました。割れると抜歯するので、前歯がなくなったら恥ずかしく人前に出ることができなくなると思います。ラッピングワイヤーの皮膜を剥す上手な方法は100円ライター等で焼くことでしょうか。ハードの変更を、もう少し進展させたかったのですが歯肉が炎症したため空中配線を減らす試みを、当面先送りすることにしました。当面はローダーとして整理していきますが、FM-7のメモリが故障してる状態で、故障箇所の特定で役に立ちそうです。未分類2020/02/20FM-7のZ80スロットを使う拡張カードII実践編PART4今回は概要のみの報告ですが、ほぼ自分が納得できる状況になりました。・DRAMのリフレッシュ機能を追加しました。以外で動作させる時には必要のようです。ハードは「ATmega2560」の「D5」ピンからパルスを生成します。中で下のようにしました。規則的な周期でなくて構わないようです。パルスただし周期が長いとDRAMの内容は消失します。その辺りは試行して決めてください。・メモリへの書き込みで基本を疎かにしてました。「Q」、「E」信号を用意をしてましたが重要性を理解してませんでした。「形」だけ真似しただけでしたので、副題の七転八倒的な試行錯誤をしました。結論は(制御信号とも言えるのかは判りませんが)読み・書きで「Q」、「E」はTTLを通して使べきです。プルアップ(ダウン)で代用が利くかも知れませんが桜井様が指摘した「TTLはあった方が良い」の意味を痛感しました。何をしても上手く書き込めないので、出発点の桜井様の回路図を改めて確認すると「Q」もプルダウンされていたので「E」と同様にTTLを通して使ってみました。するとアッサリと書き込みできました。&HFD05,0」的なコードで復帰することもあります。復帰しないこともあって挙動が定まってません。この辺り、FM-7と言うハードの経年劣化がありますので原因は特定できません。・上のコード実行後のホットスタートでの復帰についてほぼ100%復帰してますので、自分が納得できる状況になった次第です。今回の基板で、昨年の前半まで製作していた「FT245RL」用のローダー的な使い方ができたので目的は達成したと考えてます。復帰率がTTLを使わない基板の時は70%でしたが、TTLを使った基板では、ほぼ100%です。リフレッシュ機能を追加してからホットスタートでの復帰で失敗はないです。復帰率は向上するかも知れませんが、現在は確認する予定はないです。・ハード、ソフトとも詳細は次回でソフトは整理しなくてはなりません。当ブログのリンク先として登録している「かべきん」様よりDRAMリフレッシュ機能が必要ではと貴重な情報を頂きました。6800とFLEX」様より数種類のリフレッシュ回路があると言う情報を頂きました。この基板の件でコメントを頂いた「tomi9」様も同様の趣旨を指摘されてます。鈍感な自分もDRAMリフレッシュについて調べました。ググるとFM関連で情報を公開してくれてるハセリン氏のサイトで、Z80カードの動作時にはリフレッシュ用のパルスを生成してることが判りました。Z80カードでは周波数が過剰で「6809」であれば76.8KHzとのことですが同時に30年以上前にFM関連の情報誌でリフレッシュの周波数下げてることも可能的な記事が頭を霞めました。代用が利くのでは考え確かめてみました。結果的に状況は進展しました。6809」には至ってません。「HIGH」に変わる理由が判りました。側の機構で与えるとのことです。情報は技術評論社のプロセッサ誌1988/5月号の下の記事とのことです。情報提供してくれた各氏と情報を公開してくれているハセリン氏に感謝します。戻る確率が大きくなりました。「RESET」)です。(6809が停止します。Z80搭載時にはZ80が動作します。停止させなくてはならないようです。切替の仕組みを調べる必要があります。敵を知り己を知れば、と言う感じで気長に行きます。戻る状況になれば納得できます。「HIGH」に変わります。「6809」の「HALT」も解除されるようです。「6809」の「HALT」が解除された時に「BA」信号が「LOW」になることから判断しました。コードを実行しても「RUN」のまま戻ってきません。(6809が停止します。Z80搭載時にはZ80が動作します。(←ここはシンタックスエラーでも構わないです)ですので「空中配線」の必要はなく、原因は「割り込みの対応」かと考え重点的に調べようと考えてます。(割り込み対応は経験が少ないです)それではまた。コンピュータ・ハード2020/01/26FM-7のZ80スロットを使う拡張カードII実践編PART1・動作確認結果と(中間)報告Z80Wの信号を「LOW」から「HIGH」に変更することはできましたけど目的とする「6809」の「HALT」を解除はできませんでした。踏み込んで言うとトリッキー的な方法を用いて1回だけは「6809」の「HALT」を解除はできました。以上のことから「6809」の「HALT」解除ができない原因は、バッファの有無ではなく他の原因と言うことになりました。桜井様が指摘するようにバッファはある方が解除等でも有用であると考えます。例としては「HALT」を解除した後にバッファの衝突が生じませんので。バスを支配し影響を与えていても不都合は生じないと考えます。・テストした内容(1)先ずは基板に部品を実装しました。↓の画像の1段目と2段目です。https://imgur.com/a/juCn9ORまだまだ(と言うか年齢的に向上の可能性は低いです)半田の腕前は下手ですけど、この程度ならギリギリ良いかと考え公開します。今回のATmega2560用に使うためには、最初は忘れてましたけど基板にコネクタを更に加えなくてはなりません。空中配線については(6)で改めて説明します。(2)この基板をFM-7に装着し動かします、スケッチ(ソース)は↓です。sketch_FM7_ATmega2560.info.inohttps://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21108&cid=6357DCB7DCA88133スケッチを書いた後は一旦はUSBコードを外し、FM-7の電源を入れてから再度USBコードを接続して下さい。(3)回路図とATmega2560のレジスタを見ながらデバッグしました。world-6」を出力します。コードを実行し「Z80W」が「LOW」になったからです。(6809が停止します。Z80搭載時にはZ80が動作します。「6809」の「HALT」を解除する試みをしてます。world-7」は上の操作をするための関数「writeCPUSw()」に入ったことを意味します。切り換え用にしてます。1」のパルスを与えます。world-9」の出力はZ80Wの信号が「LOW」から「HIGH」になった瞬間です。END」は「writeCPUSw()」から戻ったことを意味します。world-6」の出力はZ80Wの信号が「HIGH」に変わったことを意味してます。結果は「6809」の「HALT」を解除できませんでした。入力として使用する「Z80W」の信号線を出力として使い、ATmega2560から「HIGH」を与えました。端子に「HIGH」を与える意味はあるのではと考えました。Z80W_TEST」と「#endif」の間のコードです。(6)基板における空中配線の目的この目的を実行するコードは、まだ実装してません。目的は(5)と同じですが、「Z80W」の信号が「HIGH」にも関わらず「6809」が「HALT」の状態にある時に、74LS244の使ってない回路を使って「Z80W」の信号線を経由して、強制的に「6809」の「HALT」端子に「HIGH」を与える予定です。(無謀なら中止します)すんなり「HALT」解除しない原因をバッファがなくて、バスの衝突だと思いこんでいましたので、設計する時に74LS244の使ってない回路の入力をそのまま「GND」にしたことが悔やまれます。他の使い道を考えて、ATmega2560のD11端子を74LS244の未使用入力端子と接続しておくべきでした。していれば空中配線は1本で済みました。そこまでは気が回らなかったです。追加する等の遊び心に走り、詰めが甘かったです。・今回の件とは全く関係ないですがマンション町内会主催の恒例のアイスキャンドルの風景です。昨年までは製作するアイスが500個を超えてましたけど、マンションも住民も高齢化と言うことで今年は300個程にしました。