S1側とZ80Bカードの連携方法を確認するためにテストプログラムを作ってみました
以前教えて頂いたZ80と6809との切り替え方は
①0:0000~Z80のコールドスタートのプログラムを書く
②$FF7Fに$FFを書込む(Z80スタンバイ)
③$FE19に$00を書込む(Z80スタート)
これでZ80がスタートされ6809から拡張メモリを含む全てのスロット上カードへのアクセスができなくなる(バスフローティング状態)
しかし6809は停止していないのでS1の資源だけを利用してZ80と並行動作している。
この状態で6809からスロット上のカードをアクセスする必要が出た時は
④$FE19に$80を書込む(バスリクエスト)
⑤$FE19を読出しMSBが1になるのを待つ
⑥必要な処理を行う
⑦$FE19に$00を書込む(Z80スタート)
④~⑦の繰り返しで処理可能
S1の拡張MPUカードの特徴は6809もZ80も両方とも動作しているということで、
6809側からもZ80側からも見える共通の領域にデータを書き込んでI/O処理のときにデータを参照する仕組みだそうです。
(6809側とZ80側の両側からアクセスできるエリアは物理アドレスで$00000~$7FFFFの512KBでMPC-RA64~512の拡張RAMカードが必要です)
これだと両MPUは常に動作しているので、MPU切替を複雑には考えなくていいようです。
これがS1のフローティングバスの優れた部分だそうで、
Z80カードを作って初めてフローティングバスの恩恵を得られました(^^)
上記①~⑦を図に書いてループバックのソフトを整理してみました。
(フローチャートではないので何だかちょっと変^^)
しかし、この流れでS1のキーボードから入力した文字を共有メモリに書き込んでフラグをセット、Z80側でデータを受け取り、そのまま共有メモリに書いてフラグをセットしZ80⇒6809に切替後6809側で画面出力のループを組んで思った動作をしています。
というわけで、6809とZ80のデータ受渡しと切替はうまくいくようになりました。
割込みは使用していないプログラムですが、動作確認OKだったコードはこちら
これをベースにBIOS09とBIOS80に機能を実装してみたいと思います^^