2020.11.4
前へ
次へ
ホームページトップへ戻る

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第258回]



●動作テスト(2)RAMの書き込みテスト

HCMOSIC版MYCPU4の動作テストです。
[第256回]で書きましたようにND80Z3.5と接続して動作テストを行ないます。
ND80Z3.5の82C55入出力コネクタとMEMORY/CLOCK回路基板の26pinコネクタをフラットケーブルで接続します。
ND80Z3.5と接続している写真は[第248回]でお見せしました。

まずはRAMの書き込みテストです。
82C55のAポートがRAMのアドレスラインに、Bポートがデータラインにつながります(前回の回路図参照)。
前回説明しましたようにRAMのA4〜A7はメモリバンクセレクト回路につながっているため複雑な回路になっていますが82C55のPC2をLにするとPA4〜PA7の出力が選択されます。
またA0〜A3は、A4〜A7と同様にPC2の出力がLのときにはPA0〜PA3の出力が選択されます。
A0〜A3はPC2の出力がHかまたは82C55が接続されていないときはCPU回路のPC(プログラムカウンタ)の出力が選択されます。
PC1はRAMのOEにつながっています。
RAMからデータを読み出すときはPC1をLにします。
書き込み時にはPC1をHにします。
PC0の出力をL→H→Lのように変化させることでRAMにデータが書き込まれます。
RAMへの書き込み信号(WR)はLアクティブなのですが、82C55にはちょっと困ったところがあってLアクティブにはできないためPC0の出力をインバータ(74HC04)で反転させてRAMのWR(pin27)に接続します。
KEYSW回路基板を接続したときにはRAMのWRラインにはRAM書き込みのためのプッシュスイッチからの出力がつながるため、74HC08のNOR回路を通しています。
前回書きましたようにKEYSW回路もND80Z3.5の82C55入出力コネクタと同じピン配列にしているため、82C55と接続するときには使用しないPC7のコネクタ端子にKEYSW回路のWRITE信号ラインをつないでいます。
そのためND80Z3.5を接続して82C55を使ってRAMにプログラムを書き込むときにはSP2のジャンパピンの設定でPC7のラインを接続しない側にします。

WR信号出力のための82C55のPC0をLアクティブにできなくてHアクティブで使わなければならない理由を説明します。
データの書き込み時にはBポートの向きは出力に設定します。
しかし書き込み後のベリファイの時にはRAMからデータを読み出すためにBポートの向きを入力に設定し直さなければなりません。
向きを変えるのはBポートだけなのですが、それでも82C55ではAポート、Cポートも同時に再設定しなければなりません。
困ったことに82C55では出力に設定するとそのポートの出力はLになってしまいます(再設定でも同じ)。
WRラインに直接PC0を接続して(Bポートの)入出力の切換えのためにモードの設定を行なうとその直後にはCポートもAポートも全ビットが0になってしまいます。
もちろんPC0も0になりますからもしPC0をダイレクトにRAMのWRラインに接続していると、WRラインもLになってそのときRAMに対する予期せぬ書き込みが行なわれてしまいます。
それを避けるためにはRAMのWR信号ラインに接続する82C55の出力はH出力の時にWRラインがアクティブになるようにしなければなりません。

下はRAMの書き込み読み出しテストの画像です。

左側はBASICのプログラムリストです。
RAMのアドレス0〜Aにアドレスと同じ0〜Aを書き込みます。
ND80Z3.5の82C55のアドレスは$80〜$83です。
$80がAポート、$81がBポート、$82がCポート、$83がコントロールワードです。
行番号30で全ポートを出力に設定します。
35でPC1の出力をHにします。
80〜120が書き込みサブルーチンです。
AポートとBポートに同じ変数Aの値を出力したあとPC0の出力をHにしてそのあとすぐにLにします。
変数Aの値を0〜10までカウントアップさせながら11回繰り返したあとプログラムを終了します。
正しく書き込まれているかどうかを確認するためのプログラムは行番号200〜330です。
210でBポートの向きを入力に設定します。
300〜330は読み出しサブルーチンです。
画面右側は左のプログラムを実行したところです。
BASICプログラムを使うとI/Oの制御もこのように簡単にできてしまいます。

下は上のプログラムを実行したときの写真です。

左下がRAM/CLOCK基板です。
青色LEDがアドレスA7〜A0で赤色LEDがD7〜D0です。
青色の発光ダイオードは赤色などに比べて輝度がかなり高いです。
普通に写真に撮ると強く光り過ぎて隣とくっついてしまいビットの表示が読みにくくなります。
それでは説明のための写真としては不向きですので全体にトーンが落ちる感じに撮影しました。
写真がシャープではないのはそういう理由からです。

プログラムを実行した結果アドレスもデータも0A(00001010)になっています。
まだCPU回路(上側の2枚の基板)は動作していませんが、RAMのデータラインがCPU回路に反映されています。
実はたまたまデータラインの00001010はLD A,1010のマシン語命令コードになっています。
まだCLKが進んでいないためAレジスタに書き込みは行なわれていませんが外部データバスラインD0〜D3がBレジスタと外部データをセレクトする回路の出力に反映されていて上の写真の右側のREGISTER回路基板上のD3〜D0の赤色LEDが1010になっています。
REGISTER回路基板のLEDの配置は[第248回]の写真を参照してください。
また回路については[第251回]の回路図を参照してください。
上の写真の左上のDECODE回路基板のBdselの青色LEDも点灯しています。
DECODE回路基板のLEDの配置についても[第248回]の写真を参照してください。
Bレジスタと外部データは命令コードによってどちらかが選択されます。
LD A,1010(命令コード00001010)は外部データを選択するためBdsel回路がHになります。
上の写真の右上の基板(REGISTER回路基板)ではALUの出力(上側の赤色LED)も1010の表示になっています(LEDの配置は[第248回]の写真を参照してください。また回路図は[第251回]を参照してください)。
LD命令ではALU回路は関係ないのですが、ALUは命令コードに関係なくそのときのAレジスタとBレジスタまたはd(定数データ)の値のADDが常時出力されます。
上の写真ではAレジスタが0000(ALU出力LEDの左側の青色LED)で、その値(0000)とd(定数データ)の値1010が加算された結果がただちにALUの出力になっています。

トランジスタでCPUをつくろう![第258回]
2020.11.4upload

前へ
次へ
ホームページトップへ戻る