トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第185回]
●INC/DEC REGISTER(8)試作基板の回路を変更してテスト(2)
前回は手直ししたINC/DEC REGISTER試作基板をND80Z3.5の82C55コネクタに接続して動作テストをするための準備をしました。
82C55は基本的にはマシン語のOUT命令とIN命令を使って入出力制御をします。
ND80Z3.5の82C55はI/Oアドレス80〜83に割り当てられています。
マシン語で制御するためにはマシン語のプログラムを書かなければなりませんが、それは面倒な作業です。
特に今回のように基本的な動作を簡単にテストしたいというときなど、いちいちマシン語のプログラムを書いていたのでは手間がかかってしまいます。
そんなときにND80Z3.5のND80Zモニタの機能を使うと簡単な操作で82C55の入出力制御ができます。
そのことについては前回の終わりに少し書きました。
82C55のAポートを入力に、BポートとCポートを出力に設定するためのコントロールワードは90です。
それをI/Oアドレス83にOUTするには、下のようにキー入力します。
[8][3][ADRSSET][9][0][I/O][OUT]
続いてBポートとCポートに初期値としてFFを出力するには
[READ DEC][F][F][I/O][OUT] −−アドレスを82にしてFFをOUTする
[READ DEC][F][F][I/O][OUT] −−アドレスを81にしてFFをOUTする
と操作します。
マシン語プログラムを書くことに比べればはるかに簡単です。
しかしND80Z3.5の便利さはこんなものではありません。
上の操作はND80Z3.5単独で行なえますから手軽ですが、I/O操作を連続して行なう場合にはND80Z3.5をWindowsパソコンにUSB接続して、ZB3BASICのマシン語モニタコマンドを使うともっと便利です。
今回はND80Z3.5のマシン語モニタコマンドを使って回路動作テストをしてみます。
自画自賛ですけれどZB3BASICのマシン語モニタコマンドはとっても便利です。
下の図は前回もお見せしました。
INC/DEC REGISTER試作基板のコネクタと82C55の入出力コネクタの端子接続図です。
INC/DEC REGISTER試作基板の動作テストはこの接続によって82C55に必要な入出力をすることで行なうことができます。
d0〜d3はINC/DEC REGISTERのデータ入出力回路に接続されています。
トランジスタ版MYCPU80の内部データバスd0〜d7の下位4ビットという位置づけです。
そこには82C55のPA0〜PA3と、ダイオードを介してPB0〜PB3を接続します。
82C55の各ポートは入力または出力に設定することができますが、入出力端子にすることはできません。
そこでAポートを入力に、Bポートを出力にして入出力端子にしています。
Bポートのラインにはダイオードを入れています。
このダイオードによって、d0〜d3の出力がアクティブになったときにPB0〜PB3の出力をHにしておくことで、d0〜d3とPB0〜PB3の出力ショートが避けられます。
QoutとQ_outはd3回路の出力です。
上位ビットd4の入力になります。
その出力を確認するために、QoutをPA4に、Q_outをPA5に接続します。
Qinはd0回路の入力クロックです。
D/U_がHのときにQinをL→Hにすることでカウントダウンが行なわれます。
QinにはPC0を、D/U_にはPC2を接続します。
Q_inもd0回路の入力クロックです。
D/U_がLのときにQ_inをL→Hにすることでカウントアップが行なわれます。
Q_inにはPC1を接続します。
WRがLのときにd0〜d3の値がINC/DEC REGISTER回路に書き込まれます。
WRがL→Hになる直前の値が回路にラッチされます。
RDがLの期間中d0〜d3にはそのときのINC/DEC REGISTER回路の値が出力されます。
RDがHのときd0〜d3はハイインピーダンスです。
試作基板の回路では誤動作を避けるためd0〜d3は10KΩの抵抗でプルアップしてあります。
WRにはPC3を接続します。
RDにはPC4を接続します。
下はND80Z3.5をWindowsパソコンにUSB接続してマシン語モニタコマンドを使って簡単なテストを行なったときのログです。
このようにログがテキストファイルの形で保存されますから、メモなどを取る必要がなくて記録保存に便利という点も特筆すべき機能です。
logfile nd80zlog\12102147.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** ndwr2h.bin loaded,from E23F to E535 >ot 83,90 >ot 82,ff >ot 81,ff >ot 83,08 >in 80 E0 >ot 83,00 >ot 83,01 >in 80 DF >ot 83,00 >ot 83,01 >in 80 DE >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Tue Dec 10 21:59:08 2019 |
最初に
ot 83,90
ot 82,ff
ot 81,ff
を実行しています。
そのあと
ot 83,08
を実行しています。
otはマシン語モニタコマンドのOUT命令です。
ot adrs,data
です。
outではないのは、ここでoutとするとZB3BASICのOUT命令がダイレクトモードで実行されてしまうからです。
ちなみにot 83,08をOUT $83,8と入力するとBASICのダイレクト命令となります。
ot 83,08を実行すると82C55のPC4の出力がLになります(Cポートのその他のビットの出力は変化しません)。
ここでは簡単なテストですからRDをLにしたままにしておきます。
するとd0〜d3の出力が常時アクティブになって、それをAポートに入力することができます。
in 80はマシン語モニタコマンドのIN命令です。
in adrsです。
ちなみにBASICのダイレクト命令で同じこともできますがちょっと複雑な表記になります。
PRINT(HEX$(IN($80)))
です。
さて in 80を実行した結果はE0と表示されています。
Q_out=1、Qout=0、d3〜d0=0000がAポートに読み込まれたことを示しています。
そのあと
ot 83,00
ot 83,01
を連続して実行しています。
ot 83,00を実行すると82C55のPC0の出力がLになります(Cポートのその他のビットの出力は変化しません)。
続いてot 83,01を実行すると82C55のPC0の出力がHになります(Cポートのその他のビットの出力は変化しません)。
最初にot 82,ffを実行してCポートの出力をFFにしましたから、D/U_はHでカウントダウンモードになっています。
その状態でQinをL→Hにすることでカウントダウンが行なわれます。
次にin 80を実行した結果はDFと表示されています。
Q_out=0、Qout=1、d3〜d0=1111がAポートに読み込まれたことを示しています。
0000がカウントダウンされて1111になったことを示しています。
そのあと続いて
ot 83,00
ot 83,01
in 80
を実行した結果はDEと表示されています。
Q_out=0、Qout=1、d3〜d0=1110がAポートに読み込まれたことを示しています。
1111がカウントダウンされて1110になったことを示しています。
そこまで実行したときの試作基板のLED表示です。
4つあるLEDのうち左下だけが消灯して残りの3つは点灯しています。
左下がビット0、その上がビット1、右下がビット2、右上がビット3です。
その部分を拡大しました。
基板が横向きの状態で写真を撮っています。
本当は左が上になります。
そのように置いた向きで見て、LEDの上側(この写真ではLEDの左側)に0、1、2、3の数字が見えます。
ビット0〜ビット3(d0〜d3)の出力の状態を表示しています。
トランジスタでCPUをつくろう![第185回]
2019.12.11upload
前へ
次へ
ホームページトップへ戻る