2019/12/07
前回の「Z80インタフェース用基板」と拙作の「FT245RL用基板」とのコラボです。
「FT245RL用基板」を製作した目的は早晩使えなくなるFDDの対策であるとは、既に
言及してますが、現在FM-7で最初のプログラムを動作させるためにデータレコードを
使ってます。しかしこれも早晩使えなくなる可能性があります。前回紹介させて頂いた
桜井様はそもそもFM-7に補助記憶装置がなくてもFM-7のメモリへの読み書きを目的と
して製作したそうです。そうならFM-7の起動コードを桜井様製作の基板でFM-7の
メモリに書き込み、その後、制御がFM-7に戻れば既製品の補助記憶装置がなくても
FM-7のユーティリティやアプリが動くのではないかと考え、その機能を目指しました。
それができたら拙作の「FT245RL用基板」は必要なくなるかと言うと、そうではなく
ユーティリティやアプリが16進数の生データであれば自在に送受信できる、拙作の
「FT245RL用基板」も有用と考えてます。なお、Arduinoを自在に操作できる方は
ArduinoだけでFM-7と自在に送受信できる可能性を否定する訳ではありません。
例によって前置きが長くなりましたけど使い方を説明し、Arduinoの「sketch」を
公開します。なお「sketch」とはArduinoで動作するプログラムのことです。
C/C++がベースだそうですけどアセンブラも使えます。今回の機能の実現のために
自分も使ったかも知れません。(先月末から使い始めたので詳しくは知りません)
そう言う状況なので、間違いがある時は優しく御指摘して頂けば嬉しいです。
<使い方>
1)「sketch」を書く(前回、説明してます)時は基板をFM-7に装着しても
FM-7の電源は入れないでください。「sketch」を書いた後は自分はGTKtermで
「Hello world-5」「Hello world-6」等が不規則に出力することを確認
してます。(FM-7の電源はオフ)なお「sketch」は下にあります。
「sketch_FM7FT245RL20191202arduino.info.ino」
https://onedrive.live.com/?authkey=%21Aln7kHlkHDL28EE&id=6357DCB7DCA88133%21113&cid=6357DCB7DCA88133
また同じサイトの「ReLease」の下に拙作のFT245RLで使うFM-7用のコードと
対応するWindowsの実行形式があります。その他 KiCAD で書いた回路図もあります。
eagle で作成した回路図と仕様が変わった訳ではありません。ご指摘を受けて
見易く修正しました。
2)USBケーブル(ATmega2560はマイクロBのスマホ用です)を一旦抜いた後に
FM-7の電源を入れ、再度USBケーブルを接続すると6809が動作してますので
「Hello world-2」の次に「Hello world-6」が連続して出力します。
(自分はGTKtermで確認)
3)AUTO コマンドでFM-7上で下のBASICコードを作成して下さい。
10 POKE &HFD05,1 (6809が停止します。Z80搭載時にはZ80が動作します。)
20 AUTO LIST (←ここはシンタックスエラーで構わないです)
4)上記のBASICコードを「RUN」して下さい。
6809が停止しFM-7のバスを明け渡しますのでATmega2560が自由にFM-7の
メモリにアクセスできます。この後「sketch」に書いてる[loop]内の
「Z80w == LOW」のコードを実行し、最後にFM-7の「&HFD05」に「0」を
書き込み所定の処理を終えた、約1.7μ秒後にATmega2560はFM-7のバスを
明け渡します。(この間2秒以内)40ピンのインターフェース&Z80に詳しい人の
見解があればと考えますけど、FM-7の「&HFD05」に「0」を書き込んだ直後から
6809は動き出し、この時はまだATmega2560はバスを明け渡しておらずバスの衝突は
発生してると考えます。しかしバスの衝突時間が極めて短ければ、その後の6809の
動作に大きくは影響しないと期待しました。結果は期待した通りになりました。
GTKtermで確認すると「Hello world-2」の次に「Hello world-6」が連続
して出力し、「POKE &HFD05,1」を実行した時は「Hello world-3」の次に
「Hello world-4」が現れ、その後「Hello world-6」が連続します。
5)このままの状態ではFM-7は停止したままですが、ホットスタートにより
FM-7 に制御が戻ります。ホットスタートをするには先ずは「BREAK」を押し続け
リセットボタンを短時間押し、ゆっくりとリセットボタンを離し、その後
ゆっくりと「BREAK」を離してください。
6)このFM-7に書き込まれたコードを直ぐ実行したい所ですけど支障なく
動くコマンドとリセットがかかるコマンドがあります。直後の EXEC は
リセットがかかるコマンドでした。モニタの「D」コマンドはOKですが
「G」コマンドはNGでした。モニタの D 7800 でメモリをダンプします。
それで FM-7 に制御が戻った時は慌てず「LIST」コマンドをして下さい。
そうすると(3)で作成したリストが出ます。(普通の使い方をしてる訳で
ないので当然と思わないで下さい)この後、実は「sketch」にある
exec_data[] ですが、拙作基板のコードが使える状況になります。
exec &H7812 <リターン> として改めて、どこか他のアドレスに
「読み書き」コードを展開するとか。因みに exec_data[] にある
コードはローダ部分(読み)だけです。
その他、自作のちょっとしたユーティリティをロードする時に使えるのでは
と考えます。
7)補足
桜井様より基板を譲り受ける際に本来はバッファを入れると良いと説明を
受けてます。これが、すんなり制御が戻らないことと関係してるのではと
考えます。「FM-7のシステム仕様書1-66」で動作してるCPU(MPU)は
左下にあるフリップフロップ(恐らく74LS74)で管理・保持してると
考えますが、Z80カードであればZ80が停止した直後にバスの出力を停止
させる仕様と考えますけど、今回の基板は簡略化のために省いています。
ですので 6809 が再動作した後も1.7μ秒(アセンブラ5命令分)間は
ATmega2560 もFM-7のバスにいて衝突するのではと考えてます。
何かありました御意見お待ちしてます、御質問は判る範囲で応えます。
ただし勘違いで間違う時があることを御了承して下さい。
それではまた。
<訂正・追加>2019/12/09(月) 12:40
1)「POKE &HFD05,1」を実行した後に「Hello world-6」が連続して
出力するまでの時間を「5秒以内」 → 「2秒以内」と訂正しました。
2)アセンブラ5命令の実行時間「75ナノ秒」 → 「1.7μ秒」と訂正しました。
また、その根拠は「Arduino処理速度とメモリー使用改善の策」とします。
http://cammy.co.jp/technical/2016/01/17/arduino_003/
digitalWriteは1行で44サイクル、約4~5μ秒かかりますが、
ポート直接制御では1行で3サイクルしかかかりません。
上を根拠に (5/44)*3 = 1.7(μ秒)