2021-02-15 22:37 — asano
カテゴリー:
前回までで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
命令以外でも頻繁に使用されていますから何がラッチされているかわかりません。
この対応にはいくつかのレベルが考えられます。
INS
/OUTS
命令の使用禁止
もっとも簡単な解決法はポートアドレス4~15に対するINS
/OUTS
命令の使用禁止です。
ポートアドレス0,1については誤動作が発生せず、またIN
/OUT
命令が使用できないので例外です。IN
/OUT
のみ対応
F3851などのデバイス用にINS
/OUTS
命令を使用することはできますが、作っている回路へのアクセスはIN
/OUT
のみ使用可能というものです。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フリップフロップを構成しています。
これでINS
/OUTS
命令ではIOR, IOWは出なくなりました。F3853のタイマなどを使う際にはINS
/OUTS
命令を使うことができます。
まだ課題も少し残りますが、当面の目標は達成できているのでこのプロジェクトは一旦終了とします。
コメントを追加