2021-02-08 12:16 — asano
カテゴリー:
SBCF8では8251はメモリマップされています。でもF8にはIN
/OUT
命令が存在しますので、何とかI/O空間にマップできないかやってみようと思います。
これF8(F3850)の特殊性を知らないと難しさがわからないと思うので簡単に書いておきます。
まずF3850にはアドレスバスの出力がありません。他の信号とマルチプレクスされているといったレベルではなくありません。
アドレスレジスタも(プログラムカウンタすら)ありません。
プログラムカウンタ(以下PC0
)無しでどうやって動くのかというと、PC0
はメモリ側が持つことになっています。
F3850の最小構成はF3850+F3851ですが、F3851には1kBのマスクROMとそれをアクセスするためのPC0
やDC0
といったアドレスレジスタが内蔵されており、以下の信号でCPU(F3850)と接続されています。
DB0
~DB7
データバス、データのほかアドレスレジスタの半分を転送したりするのに使用します。ROMC0
~ROMC4
CPUから他のデバイスへのコマンドを送るのに使用します。PHI
,WRITE
クロックとタイミング信号です。
この他に割り込み関係の信号などもありますが今回は省略します。
汎用のROMやRAMを使うためにはF3852(DMI)やF3853(SMI)を使用します。これらはアドレスを出力し、CPUREAD(論理が逆ですが一般的なRDに相当)やRAMWRITE(WRに相当)などを出すので汎用メモリが接続できます。当然アドレスレジスタを内蔵しています。
これだけの信号でどうメモリアクセスするのでしょう?
F3850のデータシートからメモリ読み出しするLM
命令の項を抜き出してみます。
Op Code | Operand(s) | Object Code | Cycle | ROMC State | Timing | Status Flags | Interrupt | Function | |||
---|---|---|---|---|---|---|---|---|---|---|---|
O | Z | C | S | ||||||||
LM |
16 | L | 2 | 6 | - | - | - | - | A ← ((DC0)) | ||
S | 0 | 3S | - | - | - | - |
2行あるので2サイクルで実行される命令です。
1サイクル目でROM Stateの欄に2とあるのでCPUはROMC[4:0]に02を出力します。F3851はこれに対して内蔵のDC0
のアドレスのデータをデータバスに出力します。F3853の場合はDC0
のアドレスを出力し、CPUREADをアサートします。データは外部のROM/RAMがデータバスに出力します。CPUはこのデータを読んでA
に格納します。
2サイクル目は次の命令のフェッチです。ROMC[4:0]は00で、PC0
のアドレスに対して同様に読み出しが行われます。その後F3851やF3853などはPC0
をインクリメントします。
DC0
,PC0
を変更する場合はどうでしょう。
Op Code | Operand(s) | Object Code | Cycle | ROMC State | Timing | Status Flags | Interrupt | Function | |||
---|---|---|---|---|---|---|---|---|---|---|---|
O | Z | C | S | ||||||||
DCI |
ii jj | 2A | L | 11 | 2 | - | - | - | - | DC0U ← ii | |
ii | S | 3 | 0 | (increment PC0) | |||||||
jj | L | E | 2 | - | - | - | - | DC0L ← jj | |||
S | 3 | 0 | (increment PC0) | ||||||||
S | 0 | 3S | - | - | - | - |
これは5サイクルと長いですね。
1サイクル目はROMC=11、これはPC0
のアドレスを読み出し、それをDC0
の上位8ビットに入れる指示です。ちなみにF3851を複数とかF3851とF3852を併用とかいう構成も可能で、そのときは読み出しは対象アドレスを担当しているデバイスのみが応答しますが、すべてのデバイスのDC0
が変更されます。
2サイクル目のROMC=3は本来PC0
を読み出してからPC0
をインクリメントする指示ですが、ここでは読み出したデータは無視してインクリメント機能のみを利用しています。
3サイクル目のROMC=Eは1サイクル目と同様ですが、DC0
の下位8ビットが更新されます。
4サイクル目は2サイクル目と同様にPC0
のインクリメント。ROMC=11,Eは他では使っていないようなのでこれにインクリメント機能をつけていれば2サイクル減ると思うのですがなぜかこうなっていますね。
5サイクル目は次命令のフェッチです。
PC0
を変更するJMP
命令も似ていますが、途中でPC0
を変更すると残りのフェッチができないので一旦CPUのA
に入れるところと、ROMC=Cにインクリメント機能があるので却ってサイクル数が少ない点が違います。
このようにメモリにはROMCのデコード・インクリメント付きのアドレスレジスタなどが必要でかなり大変なのですが、F3852/F3853という便利なブリッジが存在するので助かっています。
一方でI/Oにはこのような便利なものが存在しないので専用の物を使うかF3852/F3853の先にメモリマップ接続するのが簡単です。
(続く)
コメントを追加