最近、マイコンのプログラミングをはじめたのですが、相手方の技術者が主張するバンク切り替え方法が腑に落ちないので、この投稿で質問します。
問題はバンク切替えの方法で、CPUは日立64180です。
メモリーの構成は次のようになっています。
┌──┐
│ │主プログラム
│ │のメモリー
│ │
└──┘
┌──┐┌──┐
│BANK││BANK│切替プログラム
│ 0 ││ 1 │のメモリー
│ ││ │
└──┘└──┘
この構成にを前にして、相手側技術者の主張は、次のようなものでした。
BANK-0 BANK-1
┌────┐┌────┐
│ │ ││ │
│ │ ││ │切替プログラム
│切替命令││ │ のメモリー
│ └──┼┼─┐ │
│ ││ ↓ │
│ ││ │
└────┘└────┘
BANK-0のプログラムでBANK-1に切り替える命令を発行すると、直ちにBANK-1に切替わり、BANK-1の同じアドレスの次アドレスからプログラムが続行するというのです。
これだと、BANK-0,BANK-1の先頭番地からプログラムを実行させる方法が思いつきません。
私の考えは、主プログラム側で予め必要なバンクに切替えておき、切替えたバンクの先頭番地に制御を移せば済むと思うのですが、どうなのでしょう?
日立64180アーキテクチャに詳しくないので、反証すらできません。経験された方に確実な回答をお願いする次第です。
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だった場合にはそのようなプログラムの構造ですとちゃんと動きません。
そのような、仕様の細かいところまで確認しなければ動作に確証がもてないようなプログラムを作ることは、好まくないプログラミング手法と呼ばざるを得ません。どうしてもそれ以外の方法がないのであれば仕方がないですが(そういう場合も稀にあります)、他の「安全な方法」があるのにわざわざ危険を冒すのは〇〇(ここに書くと発言を削除されてしまうような不穏当な文言だと思ってください)のすることだと、個人的には思います。
回答ありがとうございます。
MMUはHD64180Z/HD64180R1ですが、全部を読んでいる時間がないのです。
"…an opcode fetch from the newly translated address."
の部分で納得できました。
小さなBIOS+Scheduler部分は2KB程度に納まる予定で、これを二つのBANKの末尾に配置することにします。
回答が増えないのでここで締め切りとしますが、お二方にしか配点できません。AsanoNagiさん、すみません。
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エリア)の末尾に書いておけばいいのではないでしょうか。
確かに機種はHD64180です。
bloomers_daisukiさんの方法は、BANK-0とBANK-1の末尾に同じプログラムを置く方法ですね。そうすると、切り替え後に何らかの作業をしてから0000H番地へ飛ぶように仕組んでおけばいいということになりそうですね。
No.1さんへのお礼も参考にして下さい。
No.1
- 回答日時:
64180 に詳しいわけではありませんが、一般的には、「バンクメモリの中ではバンクを切り替えない」のが基本ですね。
ただ、質問の内容では、あたかも、プログラムの実行中に無秩序にバンクが切り替わるような印象ですが、一定の番地にバンク切り替えのメカニズムに相当するプログラムがあるのなら、それもありかなと思います。
通常は、バンク+飛び先を、パラメータとして受け取るようなロジックを、主プログラム側で持つでしょうけど。
バンク側でバンクを切り替えると、バンク相互の位置関係という、本来考える必要のない事項を管理する必要があるので、普通は、バンク中でバンク切り替えはしませんね。
早速のご回答、ありがとうございます!
私としては、小規模のBIOSを考えていて、これに簡単なタスクスケジューラ機能を付加したかったわけで、その管理をAsanoNagiのおっしゃるとおりの姿でやりたかったのです。
やはり、バンク中でのバンク切り替えでは、複雑になるのですね!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
PICマイコンのコピー(クローン...
-
ドロップダウンリストの文字を...
-
「Outlookが他のプログラムによ...
-
自動クエリとはどういうもので...
-
.cfgファイルについての質問
-
ゲーミングPCに入っているAlris...
-
Excelで4096点以上のFFTの方法
-
読み込み中にアクセス違反が発...
-
クリックするとページ内で説明...
-
VBAにてメール作成した際、一部...
-
寿命
-
CreateObject関数について
-
モジュール、アプリケーション...
-
VBで環境変数をSETする方法
-
エクセルとワードをデスクトッ...
-
プログラムでOSの再起動を遅延...
-
C言語でのaccess violationに...
-
binファイルってiphone専用です...
-
TMBMSRV.exeによるCPU使用率上昇
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
ホームページのプログラムの見...
-
VBAにてメール作成した際、一部...
-
PICマイコンのコピー(クローン...
-
VBAでユーザーフォームが自動的...
-
Excelに埋め込んだVBAのプログ...
-
読み込み中にアクセス違反が発...
-
自動クエリとはどういうもので...
-
未使用の変数を一括検索する方法
-
「Outlookが他のプログラムによ...
-
XnViewにwebpを「いつも開く」...
-
モジュール、アプリケーション...
-
テキストボックスのエンターキ...
-
binファイルってiphone専用です...
-
ドロップダウンリストの文字を...
-
exeファイルしかないプログラム...
-
エクセルとワードをデスクトッ...
-
画像を読み込むのと取り込むの...
-
C言語でのaccess violationに...
おすすめ情報