CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

データビット入れ替え

何故かこういう失敗がよくあります。/RD/WRとか・・

今回は連番で並んでいる信号線をよく見ないで上から順番にラベルを付けちゃったみたいです。

問題の個所は19ビットのadrsの値を8ビットづつ分離してPORTA,PORTB,PORTEに出力しているところで

void set_adrs(unsigned long adrs)
{
    PORTA=(adrs & 0xff);
    PORTB=((adrs >>8 ) & 0xff);
    PORTE=((adrs >>16) & 0x07);
}

 

ユニバーサル基板にUEWで組み立てているならハード的に配線を直しちゃうのが簡単ですがもうパタンで固定されているのでソフト的にbit6とbit7を抽出、シフトして入れ替えてしまえばいいでしょう。

void set_adrs(unsigned long adrs)
{
    PORTA=(adrs & 0x3f) | ((adrs & 0x40)<<1) | ((adrs & 0x80)>>1);
    PORTB=((adrs >>8 ) & 0xff);
    PORTE=((adrs >>16) & 0x07);
}

 

ところでこのように信号を入れ替える場合、一般的にいえば次のような2入力2出力のロジック回路にこのような真理値表の結果が求められる時、中がどうなっているか?というネタを思い出しました

f:id:O3I:20220403181135j:plain

これは先にネタばらしすると左のようにハード的に信号線が交差している・・でよいのですが、もし「交差する」ということを許さないという場合はどうするか、さらに云うと高さとか厚みの概念が無く線が「交差する」ことがあり得ない2次元世界でコンピュータが作れるかということがA.K.デュードニーのプラニバースで議論されていて、その解が右の回路でした。

f:id:O3I:20220403181150j:plain

いや、ゲートの内部回路とかICの電源はどうすんだというのは置いておいて。