2020年3月28日土曜日

FM-7の40Pスロットで動作するArduinoMega2560カードの紹介

FM-7の40Pスロットで動作するArduinoMega2560カードを紹介します


オリジナルのカード

このカードを着想されオリジナルを製作されたのは「FS-Micro」さんで、FM-7のROMの内容を読み出すために考案されたものです。
FS-Microさんはこのカードを用いて、FM-7本体をいじることなくメインROM,サブROMの内容を読み出しておられます。

FS-Microさん考案のカード


改造したカード

そのカードを見て「思い付きハードで七転八倒」さんがFM-7のRAMへの書き込みができるのではないかと着想し、その機能の実現のために必要な改造を施しました。

思い付きハードで七転八倒さん改造のカード

改造の要点は、アドレス線、制御線にバッファを入れ、リード/ライトに合わせて制御することです。


RAMにデータを書き込めました

その結果、FM-7のF-BASICからアドレス$FD05に1を書きこんで、Mega2560に切り替え、Mega2560に書き込んだ「思い付きハードで七転八倒」さんが作成されたプログラムによってメインRAMに必要なデータを書き込むことができましたが、書き込み後にMega2560側で$FD05に0を書き込んでもF-BASICに戻ってきませんでした。
ただし、FM-7をホットスタートすることで、F-BASICに戻って書き込んだデータを利用することができますので当初の目的は達成されました。
「思い付きハードで七転八倒」さんは、このカードを用いて、自作のFT-245RL利用の高速転送カードでFM-7とパソコン間の通信をするための、FM-7側のプログラムを送り込むために利用しておられます。


そのカードをいただきましたので

ちょうどその頃、私もZ80カードを製作しており、6809とZ80 カードとの切り替えに興味を持っているときでしたが、そのカードを頂きましたので、Mega2560のソフトをそのまま利用させていただいて、何とか$FD05に0を書き込んでF-BASICに戻ってくるようにできないものかと考えました。

Z80カードの製作経験から、FM-7のメインDRAMのリフレッシュが関係しているだろうと感じていましたし、6809系の経験が豊富な「カベキン」さんからもDRAMのリフレッシュが必要というアドバイスをいただいていましたので、Mega2560のソフトにリフレッシュルーチンを追加することで何とか実現できないかと試みました。
なお、以下は「思い付きハードで七転八倒」さんの構想による回路とMega2560のプログラムを元にして、度重なるアドバイスをいただきながら私が何とかリフレッシュルーチンをでっち上げることができたという、2人の共同作業による結果です。

リフレッシュ信号(もどき)の作成

まずは、FM-7本体のリフレッシュのタイミングをロジアナで観測してみました。


ロジアナでのタイミング観測


FM-7のF-BASIC動作中リフレッシュ信号を確認しました。
時間軸は0.2us/divです。


F-BASIC動作中のリフレッシュ信号

それを真似てリフレッシュ信号(もどき)を作成してみました。
時間軸は10us/divです。

Mega2560のリフレッシュ信号

ソフトで作成している信号ですので、形は似ていても速度がかなり異なりますが、これ以上は速くできませんでした。
2ms毎にデータをRAMに書き込むのを中断して、上記のリフレッシュ信号(もどき)をリフレッシュアドレス$00から$FFまで256回繰り返しています。

その結果は

その結果、RAMにデータを書き込んだ後、一応、F-BASICに戻ってくるようになりましたが、エラーメッセージが出ることがあります。
しかも不思議なことにそのエラーメッセージが毎回同じではありません。

エラーメッセージ

上のエラーメッセージは5回繰り返して実行したものですが、エラーが3回出ていますし、そのエラーメッセージが意味不明です。

とりあえずここまで

エラーメッセージが出たりするものの、一応、F-BASICに戻ってくるようになったので、これで良しとしようと思います。
ソフトでDRAMのリフレッシュ信号を生成しているつもりですが、時間的には本来のリフレッシュ信号とはかなり異なっていますので、リフレッシュ動作というよりもただRAMを読んでいるだけかもしれません。(そうであってもRAMの値が保持されれば良いわけですが...)
そもそもソフトでリフレッシュしようという方法が間違っている可能性もありますし、
こんな方法があるよというアドバイスなどをいただけたらありがたいです。

なお、Mega2560の回路図とスケッチは「思い付きハードで七転八倒」さんのブログで公開されます。

6 件のコメント:

  1. 桜井です。私の作成したFM7Intruderですが、リフレッシュをすっかり忘れていて、申し訳ありませんでした。秋田様にも連絡しましたが、ハード的にリフレッシュを追加しましたので、ご報告します。回路は

    http://fs-micro.com/images/fig256-3.png

    このようなもので、今回はロジアナ用端子は取り除いてしまいましたが、記事を拝見するとアダプタを作成されているようなので、有ったほうが良いでしょうか。
    ちなみにリフレッシュはDRAMの仕様をみると、2msecに128カラムをアクセスするのだったと思います。refreshパルスにより内部アドレスカウンタが進むので、64KHzでパルスを入れてやれば良いと思います。

    返信削除
  2. 桜井様 コメントありがとうございます。
    私のような素人の試みに対して、プロの方からコメントをいただけるとは思ってもいませんでした。大昔、4116使用の16KBメモリボードの製作に失敗して以来DRAMには近づかないことにしていましたので、DRAMのことも良く分かっていない状態での試行錯誤でした。勘違いや技術的な間違いなどあると思いますので、いろいろご指摘いただけるとありがたいです。
    この試みの中で、私もソフトのみでリフレッシュを完全に行うのはタイミング的に無理ではないかなという感触を得ていましたが、具体的にどうすれば良いのかは思いつきませんでした。

    返信削除
  3. 近日中にブログを書く予定ですが、Z80側ではメインDRAMであるMB8265-15に対してRFSHリフレッシュという方式を用います。データシートは、以下から入手できます。
    https://4donline.ihs.com/images/VipMasterIC/IC/FUJM/FUJMD038/FUJMD038-1-54.pdf?hkey=FB3F1F3F2A09A989A6BF9D772C3B8264
    タイミングはデータシートにあるとおりです。これを守れば良いのですが、ソフトでは困難だと判断し、タイマーを搭載しました。

    返信削除
  4. コメントありがとうございます。
    RFSHリフレッシュというものを私は知らなかったのですが、次の完結編に書きましたように、tomi9さまから教えていただきましたので、その方式でリフレッシュしようとしてみました。それらしい結果は得られたものの、ソフトでデータシート通りのタイミングに合わせるのは無理ではないかと、私も思いました。

    返信削除
  5. 桜井です。リフレッシュを停める実験をしましたので、お時間があればご覧ください。
    https://fs-micro.com/post/show/id/257.html
    また、連絡先をお知らせいただけますでしょうか。
    sakurai@pugpug.orgまで、お願いします。

    返信削除
  6. 桜井さま 実験のお知らせをありがとうございます。
    早速見せていただきました。根拠もなく、リフレッシュが中断しても少しの間は大丈夫なのかなと何となく思っていましたが、やはり規格通り2ms以内にリフレッシュしなければならないのですね。データシートについては関係ありそうな箇所だけを斜め読みすることが多いのですが、反省しました。

    返信削除