現在地

F8 I/Oボード(その1: F8のメモリアクセス)


テーマ:

カテゴリー:

SBCF8では8251はメモリマップされています。でもF8にはIN/OUT命令が存在しますので、何とかI/O空間にマップできないかやってみようと思います。

これF8(F3850)の特殊性を知らないと難しさがわからないと思うので簡単に書いておきます。

まずF3850にはアドレスバスの出力がありません。他の信号とマルチプレクスされているといったレベルではなくありません。

アドレスレジスタも(プログラムカウンタすら)ありません。

プログラムカウンタ(以下PC0)無しでどうやって動くのかというと、PC0はメモリ側が持つことになっています。

F3850の最小構成はF3850+F3851ですが、F3851には1kBのマスクROMとそれをアクセスするためのPC0DC0といったアドレスレジスタが内蔵されており、以下の信号でCPU(F3850)と接続されています。

  1. DB0DB7
    データバス、データのほかアドレスレジスタの半分を転送したりするのに使用します。
  2. ROMC0ROMC4
    CPUから他のデバイスへのコマンドを送るのに使用します。
  3. PHI, WRITE
    クロックとタイミング信号です。

この他に割り込み関係の信号などもありますが今回は省略します。

汎用のROMやRAMを使うためにはF3852(DMI)やF3853(SMI)を使用します。これらはアドレスを出力し、CPUREAD(論理が逆ですが一般的なRDに相当)やRAMWRITEWRに相当)などを出すので汎用メモリが接続できます。当然アドレスレジスタを内蔵しています。

これだけの信号でどうメモリアクセスするのでしょう?

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の先にメモリマップ接続するのが簡単です。

(続く)

参考文献・関連図書: 
F3850データシート, Fairchild.
F3851/F3856データシート, Fairchild.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。