ポケコン(G850)用拡張基板(その4)確認事項3 [ポケコン]
前回の記事で 0000H - 7FFFH バンク(以降、0000Hバンクと記す)と8000H - BFFFHバンク(以降、8000Hバンクと記す)を今回作成したシステムバス接続の拡張基板(Eborsy)に実装した外部メモリにアサインできることが判りました。今回は 0000H - BFFFH の外部メモリで動くプログラムから PC-G850V(以降、G850と記す) のBIOSをコールできるようにします。
G850 は定期的に割込みが掛かっているので、各バンクメモリを外部メモリに切替えた状態でも割込み処理が動くようにする必要があります。初めに確認したいことは G850 の割り込みモードです。G850 の通常時にロジアナで観測した割込み処理の様子が下図です。
割込みを受け付けた部分を拡大したものが下図で "A1"のタイミングマーカー部が M1/ と IORQ/ が同時にアクティブになる Z80 の割込み応答シーケンスの始まりになります。
割り込みモード0の場合は この部分( T3 の立上り)でデータバス上の命令コードを読込みます(下図参照)。モード1の場合はデータバス上のコードは読込まず RST38 の動作を決め打ちで実行します。この直後の MREQ/のアサートはメモリリフレッシュで続けてメモリライトが 2 回発生しています。これはリターンアドレスをスタックに書き込んでいる動作なので モード2の可能性は無くなり、モード0で1バイト命令である RSTxx 命令を読込んだかモード1かの二つの可能性に絞られます。
ここで再度タイミングマーカー部に注目すると D0 が '0' の状態になっています。RSTxx 命令は全て D0 は '1' なので G850 の割り込みモードはモード1と言うことになります。
因みに G850 の RSTxx のエントリ部のコードを確認すると下記のようになっていて 0038H が割込み時の実行アドレスということになります。末尾の 0066H は NMI のエントリですが、何もせずにリターンするようになっています。
割り込みモードが判ったので、0000Hバンクと8000Hバンクを外部メモリに切替えた状態での割込み受付シーケンスを次のように実装しました(下記は概要ですが割込み禁止区間等、実際には注意すべき部分が色々あります)。
また上記と類似なシーケンスで外部メモリ上で動作するプログラムから G850 の BIOS をコールするための受付処理と仲介処理を作りました。
動作確認として、外部メモリ上で動作するプログラムから1文字出力の BIOS コール(0BE62H)を使って "He" の2文字を画面出力する処理を実行し、想定通りの表示になることを確認しました。
今回作成したプログラムのリストを以下に示します。
上記の試験プログラム実行時のロジアナ画面が下図になります。SDCS/ が'0'の部分が試験プログラム実行中の区間です。
下図は試験プログラム実行中に割込みが入った箇所を拡大したものです。"A1"のタイミングマーカー部が割込み開始部分で"A2"マーカー以降が各バンクが内部側に切り替わった後の処理(外部メモリ用の MCS/ がアクティブにならない)になります。
今回は少し短いですがここまでとします。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
G850 は定期的に割込みが掛かっているので、各バンクメモリを外部メモリに切替えた状態でも割込み処理が動くようにする必要があります。初めに確認したいことは G850 の割り込みモードです。G850 の通常時にロジアナで観測した割込み処理の様子が下図です。
G850の通常時の割込み処理の様子 [sampling:25MHz] |
|
割込みを受け付けた部分を拡大したものが下図で "A1"のタイミングマーカー部が M1/ と IORQ/ が同時にアクティブになる Z80 の割込み応答シーケンスの始まりになります。
割込み受付部分の拡大 [sampling:25MHz] |
|
割り込みモード0の場合は この部分( T3 の立上り)でデータバス上の命令コードを読込みます(下図参照)。モード1の場合はデータバス上のコードは読込まず RST38 の動作を決め打ちで実行します。この直後の MREQ/のアサートはメモリリフレッシュで続けてメモリライトが 2 回発生しています。これはリターンアドレスをスタックに書き込んでいる動作なので モード2の可能性は無くなり、モード0で1バイト命令である RSTxx 命令を読込んだかモード1かの二つの可能性に絞られます。
ここで再度タイミングマーカー部に注目すると D0 が '0' の状態になっています。RSTxx 命令は全て D0 は '1' なので G850 の割り込みモードはモード1と言うことになります。
Z80の割込みシーケンス |
|
因みに G850 の RSTxx のエントリ部のコードを確認すると下記のようになっていて 0038H が割込み時の実行アドレスということになります。末尾の 0066H は NMI のエントリですが、何もせずにリターンするようになっています。
0000 : C3 F4 BF JP BFF4H 0008 : C9 RET 0010 : C9 RET 0018 : C9 RET 0020 : C9 RET 0028 : C9 RET 0030 : C3 03 BD JP BD03H 0038 : C3 37 BC JP BC37H 0066 : ED 45 RETN
割り込みモードが判ったので、0000Hバンクと8000Hバンクを外部メモリに切替えた状態での割込み受付シーケンスを次のように実装しました(下記は概要ですが割込み禁止区間等、実際には注意すべき部分が色々あります)。
- 0000Hバンクの外部メモリの0038H から 8000Hバンク外部メモリ上の割込み受付処理にジャンプする
- 割込み受付処理は外部メモリ用スタックを保存し、元のスタックに切替える
- 割込み受付処理は0000Hバンクを内部側に切替え 0000Hバンク内部メモリ内に事前に準備した割込み仲介処理にジャンプする
- 割込み仲介処理は8000Hバンクを内部側に切替え 0038H のジャンプ命令の飛び先(本来の割込み処理)をコールする
- 割込み仲介処理は本来の割込み処理からリターンされたら8000Hバンクを外部側に切替え、8000Hバンク上にある割込み受付処理2にジャンプする
- 割込み受付処理2はスタックを外部メモリ処理用に戻し、0000Hバンクを外部側に切替え後、リターンする
また上記と類似なシーケンスで外部メモリ上で動作するプログラムから G850 の BIOS をコールするための受付処理と仲介処理を作りました。
動作確認として、外部メモリ上で動作するプログラムから1文字出力の BIOS コール(0BE62H)を使って "He" の2文字を画面出力する処理を実行し、想定通りの表示になることを確認しました。
今回作成したプログラムのリストを以下に示します。
外部メモリ上からのBIOSコール試験プログラム(Z80アセンブラ) |
|
上記の試験プログラム実行時のロジアナ画面が下図になります。SDCS/ が'0'の部分が試験プログラム実行中の区間です。
試験プログラム実行時のロジアナ画面 [sampling:25MHz] |
|
下図は試験プログラム実行中に割込みが入った箇所を拡大したものです。"A1"のタイミングマーカー部が割込み開始部分で"A2"マーカー以降が各バンクが内部側に切り替わった後の処理(外部メモリ用の MCS/ がアクティブにならない)になります。
試験プログラム実行中の割込み受付部の拡大 [sampling:25MHz] |
|
今回は少し短いですがここまでとします。
[TOP] [ 前へ ] 連載記事 [ 次へ ]
コメント 0