現在地

F8 I/Oボード(その5: INS/OUTS対応)


テーマ:

カテゴリー:

前回まででIN/OUT命令で8251にアクセスできるようになりました。これで実用上困ることはありませんが、F8にはさらにポートアドレスが0,1,4~15の場合にのみ使える短縮命令INS/OUTSがあります。

Op Code Operand(s) Object Code Cycle ROMC State TIming Status Flags Interrupt Function
O Z C S
INS 0 or 1 A0, A1 S 1C 0 0 1/0 0 1/0 A ← (I/O Port 0 or 1)
S 0 3S - - - -
INS 4 thru 15 A4 thru AF L 1C 0 0 1/0 0 1/0 DB ← Port address (4 thru 15)
L 1B 6 - - - -
S 0 3S - - - - A ← (Port 4 thru 15)
OUTS 0 or 1 B0, B1 S 1C 0 - - - - I/O Port 0 or 1 ← (A)
S 0 3S - - - -
OUTS 4 thru 15 B4 thru BF L 1C 0 - - - - DB ← Port address (4 thru 15)
L 1A 1 - - - -
S 0 3S - - - - Port (4 thru 15) ← (A)

ポートアドレスが0か1の場合はF3850内部で動作が完結するので問題はありませんが、4~15の場合はROMC=1B/1Aが存在します。(その2)で紹介したGALの論理ではROMC=1B/1Aの時は最後のROMC=3でラッチしたアドレスのポートに対して入出力を行なってしまいます。ROMC=3はIN/OUT命令以外でも頻繁に使用されていますから何がラッチされているかわかりません。

この対応にはいくつかのレベルが考えられます。

  1. INS/OUTS命令の使用禁止
    もっとも簡単な解決法はポートアドレス4~15に対するINS/OUTS命令の使用禁止です。
    ポートアドレス0,1については誤動作が発生せず、またIN/OUT命令が使用できないので例外です。
  2. IN/OUTのみ対応
    F3851などのデバイス用にINS/OUTS命令を使用することはできますが、作っている回路へのアクセスはIN/OUTのみ使用可能というものです。
  3. INS/OUTS命令への完全対応
    作っている回路もアドレスを4~15の範囲に設定すればINS/OUTS命令が使用できます。もちろんIN/OUT命令でもアクセスできます。

現状は1.です。F3853の割り込みやタイマがポートアドレス12~15に割り当てられていますが、これらへのアクセスにINS/OUTS命令は使用できません。

2.は比較的簡単です。ROMC=3でセットされ、ROMC=0でリセットされるフリップフロップを用意します。IOR/IOWの生成条件にセットされていることを加えます。これならGALの論理を書き換えるだけで対応できます。

3.を実現するにはROMC=3だけでなくROMC=0でもALEを出し、ROMC=0の場合はアドレスラッチの上位4ビットの入力を"0000"にすれば良さそうです。74LS157などを追加する必要があります。

他にもROMC=3とROMC=0でALEを出しておき、アドレスの下位4ビットのみデコードするとか、アドレスA4~AF,B4~BFを避けるなどの手もあります。

前者では使えるアドレスがわずかになりますがGAL変更のみで3.を実現できます。IN/OUT命令を必要とするポートアドレスを捨てることになります。アドレスラッチも4ビットで済みますし、ハードもソフトもコンパクトにしたい時はいいかもしれません。

後者は2.ですがフリップフロップが要らないのでGALに余裕ができます。他の回路もGALに同居させたい時には有効かもしれません。

私はフリップフロップを使う方法を試してみました。

Name            f8io;
Partno          GAL16V8B;
Date            2021/02/13;
Revision        4;
Designer        asano;
Company         Electrelic;
Assembly        F8IO;
Location        f8io;
Device          G16V8;

/* Input */

Pin 1 = PHI;
Pin 2 = WRITE;

Pin 3 = ROMC0;
Pin 4 = ROMC1;
Pin 5 = ROMC2;
Pin 6 = ROMC3;
Pin 7 = ROMC4;

Pin 11 = !OE;

/* Output */

Pin 17 = ST0;
Pin 18 = ST1;
Pin 19 = ST2;

Pin 16 = !ALE;
Pin 15 = !IOR;
Pin 14 = !IOW;

Pin 13 = !EN;
Pin 12 = !DS;

/*  */

ST0.d = !WRITE & !ST0;
ST1.d = !WRITE & ((ST1 & !ST0) # (!ST1 & ST0));
ST2.d = !WRITE & (ST2 # (ST1 & ST0));

c00 = !ROMC4 & !ROMC3 & !ROMC2 & !ROMC1 & !ROMC0;   /* 00 */
c03 = !ROMC4 & !ROMC3 & !ROMC2 &  ROMC1 &  ROMC0;   /* 03 */
c1a =  ROMC4 &  ROMC3 & !ROMC2 &  ROMC1 & !ROMC0;   /* 1A */
c1b =  ROMC4 &  ROMC3 & !ROMC2 &  ROMC1 &  ROMC0;   /* 1B */

fetch = c00 & WRITE;
ALE = c03 & WRITE;
IOR = c1b & WRITE & EN;
IOW = c1a & WRITE & EN;

EN = ALE # !DS;
DS = fetch # !EN;

追加のフリップフロップはマクロセルの機能ではなくEN, DSでRSフリップフロップを構成しています。

ST0ST2を使わずに済んでいるのでこれを外せば、ピン1, 11, 17~19が解放されSimple Modeになります。それを考えてあえてGALのレジスタは使用しませんでした。

これでINS/OUTS命令ではIOR, IOWは出なくなりました。F3853のタイマなどを使う際にはINS/OUTS命令を使うことができます。

まだ課題も少し残りますが、当面の目標は達成できているのでこのプロジェクトは一旦終了とします。

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

コメントを追加

Plain text

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