HD64180Compact(その5)割込み動作の確認 [Z80]
前回の記事で書いたようにディバッグモニタを導入し、本記事の末尾に記載したように CP/M の起動までできました。そこで、当初の目的でもあった割込み対応について検討してみましたので記録しておきます。
初回の記事に書いたように今回の HD64180Compact では従来(Z80PicCompact)の IORQ 信号により WAIT 状態になることに対してマスクする機能を追加しています。この目的としては
a)については内部I/Oの場合、WAIT 信号は無視され WAIT 状態にならないので処理が止まらないことが判りました(実は弊害があり対処内容を後述します)。
b)は追加 I/O の実行前に IORQ による WAIT をマスクすればいいだけの話です。
c)について HD64180 内蔵のタイマを使った割込みで今回確認しましたので以下に記載します。
今回、割込み動作試験用に作成したタイマ0を使い割込みを発生させる試験プログラムのソースを以下に示します。ベクタ方式の割込みで割込み処理のアドレス指定方法は Z80 のモード2の割込みとほぼ同じです。割込み処理(INTTM0)ではタイマ0割込みのフラグをクリアするためのレジスタ読み込みとカウンタ用ワークの値を 200ms 毎にインクリメントしています。EnPic は IORQ により WAIT 状態になることを可能にするマクロです。
HD64180 の内部割込み及び外部の INT1、INT2 の割込みはベクタ方式の割込みとなります。参考としてデータシートのタイミングチャートが下図になります。割込み応答時に IORQ がアクティブにならないので上述のように WAIT 状態になる心配はありません。
ベクタ割込みの開始を捉えるためにトリガー条件として ST 立下りかつLIRがhighとした際のロジアナ波形例が下図になります。STは各命令の1バイト目のアクセス時にアクティブになるのでこれを目印にマーカーで区切り、実行している命令のニーモニックを図中に追記しました。
上記のタイマー割込み起動プログラムを起動後に GAME 言語で作成した下記のカウント値が変化した際に画面表示するプログラムを起動しました。
実行した際の画面キャプチャが下図です。"Cw30"と表示されていますが、これは PIC 側が未定義コマンドである 0x30 を受信したことを示しています。このように HD64180 内部レジスタへのアクセス時に発生する短い IORQ を PIC が稀に検出してエラーが発生しています。
今回の割込み動作試験で次の問題があることが判りました。
1項は上記の画面での"Cw30"の表示のことですが、PIC側で IORQ を検出する際、6回連続で IORQ がアクティブな場合に検出するように変更しました(4回チェックでは問題事象が発生したのでマージン込みで6回にした)。
2項についてはキー入力時に直接データ入力していたところをキー入力有無をステータスでチェック後、キー入力ありの場合にデータ入力するようにしました。
対処後のカウントチェック画面のキャプチャも貼っておきます。数十分継続してみましたが上記の問題事象は発生しませんでした。
以上、割込み動作試験での問題と対処について記載しましたが、これにより手持ちの Z80 ボードでは難しかった割込みを使った動作実験ができる環境ができました。
[補足]
CP/M が動作するようになるまでに発生した問題や対処などを以下にメモとして残しておきます。
初めに下の写真が今回作成した HD694180 と USB 機能を有する 20 ピンの PIC を使った手配線のボードです。
最初は SD 初期化での CMD0 コマンドに対しての応答が無い状態でした。これはハードウェアの問題で PIC 側が SD からの応答を読み取れず、SD から応答がまだ出ていないのに応答を受け取ってしまっている状態でした。
チップ抵抗を交換して応答が正常に受け取れるようになりました。
今回の HD64180Compact では今後機能追加し易いように SD の初期化を従来のように電源投入時ではなく、Z80 からの要求により実行するようにしました。このため、PIC 側の SD の初期化完了の際に Z80 側とのタイミング合せがうまく行かなくなってしまいました。原因は SD に送信するコマンド間の SDCS が非アクティブになる期間、Z80 側の WAIT が解除され処理が進むことだったので、初期化コマンド期間は連続して SDCS をアクティブにするように変更しました。結果として初期化を完了するまで Z80 が WAIT 状態のままなので双方のタイミングずれは発生しなくなりました。
初期化時のロジアナ波形を記録として貼っておきます。下図は初期化全体のロジアナ波形です。ほとんどの時間は CMD41(0x69)に対する Ok 応答(0x00)が来るまでリトライしている部分になります。
下図は CMD41(0x69)に対して Ng 応答を受けた部分のズームです。
下図は CMD41(0x69)に対して Ok 応答を受け取り、CMD58(0x7a)を発行して初期化を終了している部分です。
初めて CP/M が起動できた際の画面も記念に貼っておきます。但し、この時は HI-TECH C でのコンパイル時に固まり、不安定な要素が残存していました。
この時の CP/M の起動方法はディバッグモニタで BootLoader の Hex ファイルを読み込んで起動し、BootLoaderが SD から IPL を読み込み起動することで IPL がメモリ上に CP/M 本体をロードし BIOS の boot にジャンプすることで CP/M が起動されます。SD 自体は Z80PicCompact と同じものを使用していますが、MBASIC や BDS C は動きましたが HI-TECH C でのコンパイルで固まるのでまだ不安定要素がありました。
今回、HD64180は6MHz(USB用の12MHzからの流用)で動いていてBIOS部分はZ80の16MHzと20MHzで動作実績のあるものです。遅くなって動かなくなる部分は全く思い当たらないと思っていましたが原因はハードでした^^;
修正して安定に動作しHitech-Cのコンパイラも元気に動きました。
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]
初回の記事に書いたように今回の HD64180Compact では従来(Z80PicCompact)の IORQ 信号により WAIT 状態になることに対してマスクする機能を追加しています。この目的としては
- 内部I/O(レジスタ)アクセス時のWAIT防止
- 将来追加した外部I/Oアクセス時のWAIT防止
- 割込み時のIORQでのWAIT防止
a)については内部I/Oの場合、WAIT 信号は無視され WAIT 状態にならないので処理が止まらないことが判りました(実は弊害があり対処内容を後述します)。
b)は追加 I/O の実行前に IORQ による WAIT をマスクすればいいだけの話です。
c)について HD64180 内蔵のタイマを使った割込みで今回確認しましたので以下に記載します。
今回、割込み動作試験用に作成したタイマ0を使い割込みを発生させる試験プログラムのソースを以下に示します。ベクタ方式の割込みで割込み処理のアドレス指定方法は Z80 のモード2の割込みとほぼ同じです。割込み処理(INTTM0)ではタイマ0割込みのフラグをクリアするためのレジスタ読み込みとカウンタ用ワークの値を 200ms 毎にインクリメントしています。EnPic は IORQ により WAIT 状態になることを可能にするマクロです。
タイマ割込みソース(Z80アセンブラ) |
|
HD64180 の内部割込み及び外部の INT1、INT2 の割込みはベクタ方式の割込みとなります。参考としてデータシートのタイミングチャートが下図になります。割込み応答時に IORQ がアクティブにならないので上述のように WAIT 状態になる心配はありません。
ベクタ方式の割込みタイミング |
|
ベクタ割込みの開始を捉えるためにトリガー条件として ST 立下りかつLIRがhighとした際のロジアナ波形例が下図になります。STは各命令の1バイト目のアクセス時にアクティブになるのでこれを目印にマーカーで区切り、実行している命令のニーモニックを図中に追記しました。
タイマ割込み時のロジアナ波形例 |
|
上記のタイマー割込み起動プログラムを起動後に GAME 言語で作成した下記のカウント値が変化した際に画面表示するプログラムを起動しました。
カウント値チェックプログラム(GAME言語) |
---|
10 A=$00FE 20 D=A(0) 30 ;=D<>A(0) / D=A(0) ??=A ":" ??=D 40 #=30 |
実行した際の画面キャプチャが下図です。"Cw30"と表示されていますが、これは PIC 側が未定義コマンドである 0x30 を受信したことを示しています。このように HD64180 内部レジスタへのアクセス時に発生する短い IORQ を PIC が稀に検出してエラーが発生しています。
カウント値チェック結果 |
|
今回の割込み動作試験で次の問題があることが判りました。
- 内部レジスタのアクセスをPICが検出してしまう
- 入力待ちの際WAIT状態が継続し割込みが入らない
1項は上記の画面での"Cw30"の表示のことですが、PIC側で IORQ を検出する際、6回連続で IORQ がアクティブな場合に検出するように変更しました(4回チェックでは問題事象が発生したのでマージン込みで6回にした)。
2項についてはキー入力時に直接データ入力していたところをキー入力有無をステータスでチェック後、キー入力ありの場合にデータ入力するようにしました。
対処後のカウントチェック画面のキャプチャも貼っておきます。数十分継続してみましたが上記の問題事象は発生しませんでした。
カウント値チェック結果(対処後) |
|
以上、割込み動作試験での問題と対処について記載しましたが、これにより手持ちの Z80 ボードでは難しかった割込みを使った動作実験ができる環境ができました。
[補足]
CP/M が動作するようになるまでに発生した問題や対処などを以下にメモとして残しておきます。
初めに下の写真が今回作成した HD694180 と USB 機能を有する 20 ピンの PIC を使った手配線のボードです。
手配線の開発用ボード |
|
最初は SD 初期化での CMD0 コマンドに対しての応答が無い状態でした。これはハードウェアの問題で PIC 側が SD からの応答を読み取れず、SD から応答がまだ出ていないのに応答を受け取ってしまっている状態でした。
CMD0 への応答なし |
|
チップ抵抗を交換して応答が正常に受け取れるようになりました。
CMD0 と CMD8 への正常応答あり |
|
今回の HD64180Compact では今後機能追加し易いように SD の初期化を従来のように電源投入時ではなく、Z80 からの要求により実行するようにしました。このため、PIC 側の SD の初期化完了の際に Z80 側とのタイミング合せがうまく行かなくなってしまいました。原因は SD に送信するコマンド間の SDCS が非アクティブになる期間、Z80 側の WAIT が解除され処理が進むことだったので、初期化コマンド期間は連続して SDCS をアクティブにするように変更しました。結果として初期化を完了するまで Z80 が WAIT 状態のままなので双方のタイミングずれは発生しなくなりました。
初期化時のロジアナ波形を記録として貼っておきます。下図は初期化全体のロジアナ波形です。ほとんどの時間は CMD41(0x69)に対する Ok 応答(0x00)が来るまでリトライしている部分になります。
SD 初期化時のロジアナ波形例(全体) |
|
下図は CMD41(0x69)に対して Ng 応答を受けた部分のズームです。
SD 初期化時のロジアナ波形例(NG応答受信時) |
|
下図は CMD41(0x69)に対して Ok 応答を受け取り、CMD58(0x7a)を発行して初期化を終了している部分です。
SD 初期化時のロジアナ波形例(OK応答受信時) |
|
初めて CP/M が起動できた際の画面も記念に貼っておきます。但し、この時は HI-TECH C でのコンパイル時に固まり、不安定な要素が残存していました。
この時の CP/M の起動方法はディバッグモニタで BootLoader の Hex ファイルを読み込んで起動し、BootLoaderが SD から IPL を読み込み起動することで IPL がメモリ上に CP/M 本体をロードし BIOS の boot にジャンプすることで CP/M が起動されます。SD 自体は Z80PicCompact と同じものを使用していますが、MBASIC や BDS C は動きましたが HI-TECH C でのコンパイルで固まるのでまだ不安定要素がありました。
初の CP/M 起動画面 |
|
今回、HD64180は6MHz(USB用の12MHzからの流用)で動いていてBIOS部分はZ80の16MHzと20MHzで動作実績のあるものです。遅くなって動かなくなる部分は全く思い当たらないと思っていましたが原因はハードでした^^;
修正して安定に動作しHitech-Cのコンパイラも元気に動きました。
HI-TECH C でのコンパイル画面 |
|
[TOP] [ 前へ ] 連載記事一覧 [ 次へ ]