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の回路図とスケッチは「思い付きハードで七転八倒」さんのブログで公開されます。