• ベストアンサー

マイコンのバンク切り替え

最近、マイコンのプログラミングをはじめたのですが、相手方の技術者が主張するバンク切り替え方法が腑に落ちないので、この投稿で質問します。 問題はバンク切替えの方法で、CPUは日立64180です。 メモリーの構成は次のようになっています。   ┌──┐   │  │主プログラム   │  │のメモリー   │  │   └──┘ ┌──┐┌──┐ │BANK││BANK│切替プログラム │ 0 ││ 1 │のメモリー │  ││  │ └──┘└──┘ この構成にを前にして、相手側技術者の主張は、次のようなものでした。   BANK-0   BANK-1 ┌────┐┌────┐ │ │  ││    │ │ │  ││    │切替プログラム │切替命令││    │ のメモリー │ └──┼┼─┐  │ │    ││ ↓  │ │    ││    │ └────┘└────┘ BANK-0のプログラムでBANK-1に切り替える命令を発行すると、直ちにBANK-1に切替わり、BANK-1の同じアドレスの次アドレスからプログラムが続行するというのです。 これだと、BANK-0,BANK-1の先頭番地からプログラムを実行させる方法が思いつきません。 私の考えは、主プログラム側で予め必要なバンクに切替えておき、切替えたバンクの先頭番地に制御を移せば済むと思うのですが、どうなのでしょう? 日立64180アーキテクチャに詳しくないので、反証すらできません。経験された方に確実な回答をお願いする次第です。

質問者が選んだベストアンサー

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

バンク切り替えの方法としてHD64180のMMUを使用しているものと仮定すると、HD64180R/Zのデータシートを読んだところでは、仕様上の問題はないようです。 データシートにはこうあります。 "7.8 MMU Register Access Timing" "When data is written into CBAR, CBR, or BBR, the value will be effective from the cycle immediately following the I/O write cycle which updates these registers." "Observe that the next cycle following MMU register programming will normally be an opcode fetch from the newly translated address." ですので、「私が調べたデータシート」に記載の仕様の上では、相手側技術者の主張は正しいようです。 #注意:たまたま私が調べたデータシートでは上記のとおりでしたが、HD64180にはバリエーションチップがたくさんあり、そのすべてがMMUに関して同一仕様とは限りません。 仕様の上で制限されていないからといって、それを行うべきかどうかはまた別問題です。たまたまそのCPUが「私がデータシートを調べたのと同じCPU」であれば大丈夫ですが、プリフェッチを行うCPUだった場合にはそのようなプログラムの構造ですとちゃんと動きません。 そのような、仕様の細かいところまで確認しなければ動作に確証がもてないようなプログラムを作ることは、好まくないプログラミング手法と呼ばざるを得ません。どうしてもそれ以外の方法がないのであれば仕方がないですが(そういう場合も稀にあります)、他の「安全な方法」があるのにわざわざ危険を冒すのは〇〇(ここに書くと発言を削除されてしまうような不穏当な文言だと思ってください)のすることだと、個人的には思います。

koma1000nin
質問者

お礼

回答ありがとうございます。 MMUはHD64180Z/HD64180R1ですが、全部を読んでいる時間がないのです。 "…an opcode fetch from the newly translated address." の部分で納得できました。 小さなBIOS+Scheduler部分は2KB程度に納まる予定で、これを二つのBANKの末尾に配置することにします。 回答が増えないのでここで締め切りとしますが、お二方にしか配点できません。AsanoNagiさん、すみません。

その他の回答 (2)

回答No.2

確か、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エリア)の末尾に書いておけばいいのではないでしょうか。

koma1000nin
質問者

お礼

確かに機種はHD64180です。 bloomers_daisukiさんの方法は、BANK-0とBANK-1の末尾に同じプログラムを置く方法ですね。そうすると、切り替え後に何らかの作業をしてから0000H番地へ飛ぶように仕組んでおけばいいということになりそうですね。 No.1さんへのお礼も参考にして下さい。

回答No.1

64180 に詳しいわけではありませんが、一般的には、「バンクメモリの中ではバンクを切り替えない」のが基本ですね。 ただ、質問の内容では、あたかも、プログラムの実行中に無秩序にバンクが切り替わるような印象ですが、一定の番地にバンク切り替えのメカニズムに相当するプログラムがあるのなら、それもありかなと思います。 通常は、バンク+飛び先を、パラメータとして受け取るようなロジックを、主プログラム側で持つでしょうけど。 バンク側でバンクを切り替えると、バンク相互の位置関係という、本来考える必要のない事項を管理する必要があるので、普通は、バンク中でバンク切り替えはしませんね。

koma1000nin
質問者

お礼

早速のご回答、ありがとうございます! 私としては、小規模のBIOSを考えていて、これに簡単なタスクスケジューラ機能を付加したかったわけで、その管理をAsanoNagiのおっしゃるとおりの姿でやりたかったのです。 やはり、バンク中でのバンク切り替えでは、複雑になるのですね!

関連するQ&A

  • フリーズ、

    どうしてパソコンはフリーズするのでしょうか? 予想としては主記憶装置にプログラムを置けなくなった、 と考えています。CPUのプログラムカウンタがプログラムをとってこいと 命令しすぎって主記憶装置上におけなくなるからだと思います。 あってる??? たしかプログラムカウンタって次に命令するアドレスの番地を おいてあるんだっけ、、、、、 間違ってたら大恥です。 教えてください。

  • アキュムレータに格納される数値は・・・?

    次の問題の解き方をできるだけ詳しく教えてください。 主記憶装置の100番地~104番地の内容は以下のようであるとき、LD/(102)を実行した結果アキュムレータに格納される数値は? LD命令は指定した有効アドレスの内容をアキュムレータに格納するめいれいであり、(X)は間接アドレス指定である。すなわちX番地の内容を 有効アドレスにするという意味である。 103     102    100    101    104 100番地   101番地  102番地  103番地  104番地

  • 多重処理下のメモリ

    一つのメモリ(0番地からMAX番地まで)に複数のプログラムを 置くと、番地はどうなるんですか? 特に、変数の番地やジャンプの命令の飛び先番地が、2つ目以降 のプログラムの場合どうなるんですか? 問題が起きた場合どういった解決方法があるのですか?

  • JUNO-DS DAWからのパフォーマンス切り替え

    下記の内容で質問があります。回答をいただけると助かります。よろしくお願いします! ▼製品名(例:JUNO-DS) 曲の最初に、その曲で使用するパフォーマンスをバンクセレクト+プログラムチェンジやシステムエクスクルーシブデータをDAWからJUNO-DSにMIDIで流し、自動であらかじめ保存してあるパフォーマンスに切り替わるようにする方法を調べています。 パフォーマンスを構成するパッチの切り替えではなく、パフォーマンス自体の切り替えです。 マニュアルもダウンロードしてみましたが、見つけることができませんでした。 マニュアルのどこかにあるはずと思っていますが、マニュアルの記載ページや方法をご存知の方、教えていただけますと幸いです。 ※OKWAVEより補足:「電子楽器メーカーローランド製品、ボス製品」についての質問です。

  • 戻り番地を逃がしておくの意味が分かりません

    いつもお世話になっております。独学で情報処理の勉強をしています。昨日CASLIIをキャスルツーと読むことを知ったぐらいです。「なるべく専門用語を使わないで答えてくださる方」よろしくお願いします。 基本情報午後の選択はCASLIIがいいと思って参考書を読んでみたのですが、とても難しく、ネットで検索していたら理解を深めるための記事みたいのがあったのですが、【主プログラムから副プログラムのデータの受け渡し】ということで以下のことが書かれてます。 LAD  GR1,123     ;GR1に123を格納する(主プログラムの先頭)   PUSH   0,GR1 ;123をスタックに格納する     LAD   GR2,456 ;GR2に456を格納する     PUSH   0,GR2 ;456をスタックに格納する     CALL   SUB1  ;副プログラムSUB1を呼び出す     POP   GR3    ;加算結果をスタックからGR3に取り出す        :   ;これ以降の処理は省略する  SUB1 POP   GR4   ;戻り番地を逃がしておく  ←これ!!    POP   GR1    ;GR1に456を取り出す(副プログラムの先頭)   POP   GR2   ;GR2に123を取り出す     ADDA  GR1,GR2 ;GR1とGR2の加算結果をGR1に格納する      PUSH   0,GR1 ;加算結果をスタックに格納する      PUSH   0,GR4 ;戻り番地を元通りにする  ←ここも!!     RET      ;主プログラムに戻る(副プログラムの末尾) の、戻り番地を逃がしておくが意味がよく分かりません。なので、戻り番地を元通りにするもよく分かりません。 よろしくお願いします。

  • プログラムのあるPC自身の10/100BASEの切り替え

    プログラムのあるPC自身の10/100BASEの切り替えはVisual Basicのプログラムでできるのでしょうか? 「ネットワークとダイアルアップ接続」の「ローカルエリア接続」のプロパティを開くと、Ethernetカードの「構成」ボタンで出てくるネットワークアダプタのダイアログボックスの「詳細設定」タブに、「Media Type」というのがあります。 10/100の切り替えができるネットワークアダプタだと、「AutoScan」や「10BASET」「10BASETX FullDuplex」などが選べます。 これをVBのプログラムからいじる方法をご存知でしたらお教えいただきたく。 ソフト上から可能でも、ネットワークアダプタによっては切り替えできないなど、ハードウェアの制限などについてもお教えいただきたく。 よろしくお願いします。

  • マイコンのメモリマップについて

    マイコンに限った話ではないかとは思いますが、現在マイコンプログラムの勉強をしておりますが、マイコンのデータシートのメモリマップを見ると先頭番地からフラッシュメモリのマッピングがあり、その次に各種レジスタやRAMのマッピングがなされています。 (1)このメモリマップというものは論理アドレスと物理アドレスの対応表のようなものだと解釈しておりますが、この対応表自体はRAMの一部に格納されているのでしょうか? (2)例えばフラッシュメモリの物理アドレスが00~FFまであり、RAMの物理アドレスも00~FFだった場合で且つ フラッシュメモリの後ろにRAMのマップを作る場合、メモリマップの中の論理アドレスは00~2FFまでで物理アドレスはフラッシュメモリの部分は00~FF,RAMのブツリアドレスも00~FFになるという理解で良いですか? ひょっとするとかなり見当違いをしている質問かもしれません。 よろしくお願いします。

  • ワンボードマイコンMP-Z80を用いたプログラミング

    今、ワンボードマイコンMP-Z80でプログラミングの勉強をしています。 まだ、基本的なところなんですが、次の問題がわかりません。 1)8100H番地から81FFH番地までの100Hバイト分のRAM領域を0とする プログラムを作成せよ。 2)1から10までの整数の和を求め、8100H番地に格納せよ。 3)8100H番地から810FH番地に格納されているデータを8ビットの符号付 絶対値表現とみなしたとき、各データを2の補数表現に変換し、8200H番地から格納せよ。 この三つの問題なんですが、1)は全部に0を入れるということでしょうか? これらの問題は繰り返し命令の範囲の問題なので、繰り返し命令を 使うそうです。ヒントだけでも教えてください。

  • 情報処理概論

    今情報処理概論という勉強をしています。教科書をよんでもわからないので2つ質問です。 1.プログラムカウンタと命令レジスタ  例えばプログラムカウンタが”2256040”であるとき、次のフェッチサイクルではこの番地からはじまる命令が命令レジスタに移され移された命令が4バイト命令であれば、プログラムカウンタには4が加えられる。、と教科書に書いてあるのですがチンプンカンプンです。誰かわかりやすいように説明していただけますか? 2.演算装置について  例えば”01001010 11001101”と表記されている命令は、あるコンピュータでは”1010 11001101”にある16ビット符号付整数を演算装置のレジスタ(アキュムレーター)の内容に加え、その結果(和)をアキュムレーターにセットすることを意味する。、と教科書に書いてあります。まったく意味不明なので誰かわかりやすく説明できる人回答お願いします。 ながくなりましてすいません。よろしくお願いします。

  • skype.exe”アプリケーションエラーが出ます”0x0000000

    skype.exe”アプリケーションエラーが出ます”0x00000004の命令を0x00000004のメモリーを参照しました。メモリーが"read”になることができませんでした。 次のプログラムが実行中です。 skypeでのプログラムによりシャットダウンできません。 ちなみにskypeは実行していませんでした。 よろしくお願いします。