6 |
6809の改造 - HALT端子の追加 (2) |
前稿のコードを追加し、シミュレーションしたところ、HALTをアサートしてもHALTステートへの遷移ができないことが判りました。前稿のコードのように、外部信号により内部フラグを立て、内部フラグが立っていたらすぐにstateをHALTステートに遷移させたのですが、別の要因によりstateが上書きされてしまうようです。
そこで、同種と思われるNMIのコードのように、HALTステート遷移を「NMIの内部フラグを見てNMIステートに遷移する場所」に移動したところ、正しく動作しました。シミュレーション結果を見ると、HALTがかかっても直ちにstateを遷移するのではなく、継続したバスサイクルを終了した命令の切れ目でHALTがかかっていることがわかります。
つまり、前稿のようにすぐにstate遷移させても上書きされてしまい、NMIのように命令の切れ目で判定して遷移させるのが正しいということです。
HALTREQがアサートされてから、次のサイクルで内部フラグが立ちますが、数サイクル遅延した後にHALTステートに入っています。その後HALTACKが出力されます。
一方、HALTREQがネゲートされると、次のサイクルで内部フラグが落ち、次のサイクルでHALTACKが落ちると同時にHALTステートに入る前に保存されていたステートから再開します。こちらは遅延していません。