質問: マイコンのバンク切り替え 最近、マイコンのプログラミングをはじめたのですが、相手方の技術者が主張するバンク切り替え方法が腑に落ちないので、この投稿で質問します。 問題はバンク切替えの方法で、cpuは日立64180です。 メモリーの構成は次のようになっています。 ┌──┐ │ │主プログラム │ │のメモリー │ │ └──┘ ┌──┐┌──┐ │bank││bank│切替プログラム │ 0 ││ 1 │のメモリー │ ││ │ └──┘└──┘ この構成にを前にして、相手側技術者の主張は、次のようなものでした。 bank-0 bank-1 ┌────┐┌────┐ │ │ ││ │ │ │ ││ │切替プログラム │切替命令││ │ のメモリー │ └──┼┼─┐ │ │ ││ ↓ │ │ ││ │ └────┘└────┘ bank-0のプログラムでbank-1に切り替える命令を発行すると、直ちにbank-1に切替わり、bank-1の同じアドレスの次アドレスからプログラムが続行するというのです。 これだと、bank-0,bank-1の先頭番地からプログラムを実行させる方法が思いつきません。 私の考えは、主プログラム側で予め必要なバンクに切替えておき、切替えたバンクの先頭番地に制御を移せば済むと思うのですが、どうなのでしょう? 日立64180アーキテクチャに詳しくないので、反証すらできません。経験された方に確実な回答をお願いする次第です。
回答: 確か、hd64180は、z80の拡張マイコンだったと思います。 もし違っていたら、私の回答は間違っていますので無視してください。 bankを切り替えてもpcの値が変化しなければ、アドレスはそのまま続いていきます。 例えば、pc=0x2010の時、bank切り替えの命令を実行するとpc=0x2012(バンク切り替え命令の命令長が2バイトの場合)となり、bankが切り替えられます。 したがって、bank切り替え命令を実行しただけでは、bankが切り替わり、命令のアドレス(=pcの値)はbank切り替え命令の次のアドレスになります。 それを避けて、bank1にbankを切り替えた時にbank1の先頭からプログラムを実行したい時には、 1. bank1にbank切り替えしたい時に、特定のアドレスにjmpする。 2. そのアドレスでbank1にbankを切り替える。 3. bank1のそのアドレスにjmp 0x0000を書いておく。 と言うことになるでしょうか。このような命令は、プログラムエリア(=romエリア)の末尾に書いておけばいいのではないでしょうか。