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

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


[第259回]



●動作テスト(3)LD A,d、LD B,d、ADD A,B、OUT A、HLT

前回に続いて今回もZB3BASICを使ってテストプログラムをRAMに書き込みます。
今回はいよいよCPUの動作確認のためのテストを行ないます。
LD、ADD、OUT、HLTの各命令のテストです。

画像左側にBASICのプログラムリストを示します。
A%にRAMのアドレス、B%にRAMに書き込むMYCPU4の命令コードを入れたうえでRAM書き込みサブルーチンをCALLします。
RAM書き込みサブルーチンは行番号90〜130です。
書き込みサブルーチンは前回のプログラムのサブルーチンの変数名を変えただけです。
プログラム実行後念のため正しく書き込まれているかどうか確認をします。
ベリファイサブルーチンも前回のテストプログラムと基本的には同じサブルーチンです。
画面右側は左側の書き込みプログラムを実行したあと
GOTO 140[Enter]
を実行して正しく書き込まれていることを確認したところです。
そのあとZB3BASICのマシン語モニタ機能を使って82C55にデータを出力します。
ot 83,92
は82C55のコントロールワードアドレス(83H)に92H(Aポート、Bポートは入力、Cポートは出力)を設定するマシン語モニタコマンドです。

「ot」はマシン語のout命令を実行するコマンドです。
「OUT」とするとBASICのOUT命令がダイレクトモードで実行されてしまいます。
ot 83,92
の場合83、92は16進数ですが
OUT 83,92
とするとBASICのダイレクト命令になるため83、92は10進数とみなされてしまいます。
BASICの場合には
OUT $83,$92
と表記しなければ正しい結果が得られません。

RAMに書き込むときにはAポートはアドレス、BポートはデータなのでA、B、Cとも全部出力に設定します。
またRAMからデータを読み出すときにはBポートを入力に設定します。
ステップ動作ではRAMアドレスはPC(プログラムカウンタ)からの出力になるためAポートを入力にします。
またデータバスはRAMからの出力データになるためBポートも入力に設定します。

次の
ot 82,f4
はCポートのPC0、PC1、PC3を0にしてその他のビットを1にします。
PC0=0でRAMのWRがHになります。
またPC1=0でRAMのOEがLになります([第257回]の回路図参照)。
PC3はCLKです。
PC3を0にするとCLKがLになりPC3を1にするとCLKがHになります。

その次の
ot 83,08
ot 83,09
でPC4を0にしてから1にします。
PC4はRESETです。
PC4=0でCPU回路をリセットします([第252回]の回路図参照)。

これでステップ動作の準備ができました。
ステップ動作を82C55で行なうにはPC3に0、1を交互に出力します。
上に書きましたようにPC3の出力はCLKにつながっているのでPC3に0、1を交互に出力するとCLKがL、Hと交互に変化しそれによってCPUボードがステップ動作をすることになります。
CLKがL、H、L、Hと2回L、Hを繰り返すことでMYCPU4のマシンサイクルが1回実行されそのときRAMから出力されているマシン語コードが実行されます。
ここまでの82C55の出力によってMYCPU4はリセットされてCLKは最初のLで停止しています。
下は上の操作まで進んだときのCPU基板の写真です。



リセット信号を出力した結果アドレスは00(00000000)、データは03(00000011)になっています。
左下がRAM/CLOCK基板です。
青色LEDがアドレスA7〜A0で赤色LEDがD7〜D0です。
ステップモードなので現在のCLKの状態で停止しています。
現在はリセット直後のCLK=Lの状態です。
写真上側の2枚の基板がCPU基板です。
左側がDECODE回路基板で右側がREGISTER回路基板です。
RAMのデータラインがCPU回路に反映されています。

前回はCPU基板のLEDの配置は[第248回]の写真を参照してくださいと書きましたが、図のほうが見易いのでシルク図を下に示します。
下の図をプリントしてそれを見ながら説明を読んでいただくとわかり易いかと思います。
回路については[第251回]の回路図を参照してください。

命令コード03はLD A,0011です。
データバスの下位4ビット(0011)がBレジスタ/定数セレクト出力(B/d)LEDにも表示されています。
そして同じ値をAレジスタに書き込むため内部バスにも出力されています。
AレジスタとBレジスタが1111になっていますがこれはたまたまそうなっているだけで、まだAレジスタの値もBレジスタの値も未設定です(いつも1111になるとは限りません)。

上の写真の左上のDECODE回路基板のBdselの青色LEDが点灯しています。
Bレジスタと外部データは命令コードによってどちらかが選択されます。
LD A,0011(命令コード00000011)は外部データを選択するためBdsel信号がHになります(Bレジスタを選択するときはLになります)。
そしてその値を内部バスに出力するためDECODE回路基板のBdoutの青色LEDも点灯しています。

上の写真の右上の基板(REGISTER回路基板)ではALUの出力(上側の赤色LED)が0010の表示になっています。
前回も書きましたがLD命令ではALU回路は関係ないのですが、ALU回路からは命令コードに関係なくそのときのAレジスタとBレジスタまたはd(定数データ)の値のADDが常時出力されます。
上の写真ではAレジスタが1111(ALU出力LEDの左側の青色LED)で、その値(1111)とd(定数データ)の値0011が加算された結果がただちにALUの出力になっています。
1111+0011=0010です。
上位桁へのキャリーがONになりますがキャリーフラグのLED表示はありません。
キャリーフラグも表示できるとよかったのですがちょっと基板に余裕がなくてつけられませんでした。

下はレジスタ回路基板のシルク図です。

何を表示するLEDかがよくわかるように赤でその名称を書き込みました。

下はデコード回路基板のシルク図です。

こちらはLEDのところに信号名を記していますからどの信号のLEDかがわかると思います。

まだステップ動作の説明に入ったばかりのところですが、本日は時間がなくなってしまいました。
続きは次回にいたします。

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

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