トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第216回]
●命令デコード回路(18)DECODE4テストプログラム
前回書きましたようにDECODE4の論理ゲート回路の入力信号はDECODE3に比べて複雑なところがあります。
DECODE4の回路図は[第214回]でお見せしましたが以下の説明の助けにするために再掲します。
左側の入力信号の#1はDECODE1からの信号で、#2はDECODE2からの信号です。
#2の信号をよく見ると#2の後ろに"00”と書かれたものと"11"と書かれたものがあります。
DECODE2はジャンパーピンの設定によって命令コードの上位2ビットが”00”のときに出力がアクティブになる基板として使う場合と、”11”のときにアクティブになる基板として使う場合の2つの異なる回路基板としての役割をもっています。
実はDECODE3との接続のところでは説明してなかったのですが、DECODE3と接続するときはDECODE2は”11”基板として使います。
DECODE3から出力される信号は命令コードの上位2ビットが”11”の命令回路をアクティブにするからです([第209回]の回路図参照)。
それに対して上の回路図でわかるようにDECODE4は上位2ビットが”00”の命令をアクティブにする回路とと”11”の命令をアクティブにする回路が混じっています。
そして”00”の回路には”00”に設定したDECODE2からの出力が入力され、”11”の回路には”11”に設定したDECODE2からの出力が入力されます。
ですからDECODE4の入力用コネクタには”00”に設定したDECODE2からの出力を受けるコネクタ(CN1)と”11”に設定したDECODE2からの出力を受けるコネクタ(CN3)が用意されています。
最終的にはDECODE2基板を2枚用意してそのうちの1枚を”00”基板として、もう1枚を”11”基板としてDECODE4に接続することになります。
しかし今はテストですので1枚のDECODE2基板を”00”と”11”に使い分けて、テストプログラムもそれぞれに合わせて2本に分けて作成することにしました。
今回作成するテストプログラムは命令コードの上位2ビットが”11”の命令に対応する回路のみをテストします。
上の回路図のY0(PUSH)、Y1(POP)、Y3(PCHL)、Y6(SPHL)です。
PUSHの命令コードはC5、D5、E5、F5の4通り、POPの命令コードもC1、D1、E1、F1の4通りありますから、その全てのコードを入力してテストします。
下が作成したテストプログラムです。
[第211回]で作ったDECODE3のテストプログラムをもとにして作りました。
10 OUT $83,$8B 20 D%=$C5:GOSUB 330:OUT $80,A% 30 B%=IN($81):GOSUB 440 40 PRINT "PUSH C5",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 50 D%=$D5:GOSUB 330:OUT $80,A% 60 B%=IN($81):GOSUB 440 70 PRINT "PUSH D5",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 80 D%=$E5:GOSUB 330:OUT $80,A% 90 B%=IN($81):GOSUB 440 100 PRINT "PUSH E5",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 110 D%=$F5:GOSUB 330:OUT $80,A% 120 B%=IN($81):GOSUB 440 130 PRINT "PUSH F5",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 140 D%=$C1:GOSUB 330:OUT $80,A% 150 B%=IN($81):GOSUB 440 160 PRINT "POP C1",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 170 D%=$D1:GOSUB 330:OUT $80,A% 180 B%=IN($81):GOSUB 440 190 PRINT "POP D1",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 200 D%=$E1:GOSUB 330:OUT $80,A% 210 B%=IN($81):GOSUB 440 220 PRINT "POP E1",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 230 D%=$F1:GOSUB 330:OUT $80,A% 240 B%=IN($81):GOSUB 440 250 PRINT "POP F1",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 260 D%=$E9:GOSUB 330:OUT $80,A% 270 B%=IN($81):GOSUB 440 280 PRINT "PCHL E9",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 290 D%=$F9:GOSUB 330:OUT $80,A% 300 B%=IN($81):GOSUB 440 310 PRINT "SPHL F9",HEX$(A%,2),BI$(A%),HEX$(E%,2),BI$(E%) 320 STOP 330 'code change d0-d7 to PA 340 A%=0 350 IF BIT(D%,6)=1 THEN A%=A%+1 360 IF BIT(D%,7)=1 THEN A%=A%+2 370 IF BIT(D%,4)=1 THEN A%=A%+4 380 IF BIT(D%,5)=1 THEN A%=A%+8 390 IF BIT(D%,1)=1 THEN A%=A%+16 400 IF BIT(D%,0)=1 THEN A%=A%+32 410 IF BIT(D%,3)=1 THEN A%=A%+64 420 IF BIT(D%,2)=1 THEN A%=A%+128 430 RETURN 440 'code change PB to out0-out7 450 E%=0 460 IF BIT(B%,6)=1 THEN E%=E%+1 470 IF BIT(B%,7)=1 THEN E%=E%+2 480 IF BIT(B%,4)=1 THEN E%=E%+4 490 IF BIT(B%,5)=1 THEN E%=E%+8 500 IF BIT(B%,2)=1 THEN E%=E%+16 510 IF BIT(B%,3)=1 THEN E%=E%+32 520 IF BIT(B%,0)=1 THEN E%=E%+64 530 IF BIT(B%,1)=1 THEN E%=E%+128 540 RETURN |
下が実行結果です。
>r. PUSH C5 A3 10100011 01 00000001 PUSH D5 A7 10100111 01 00000001 PUSH E5 AB 10101011 01 00000001 PUSH F5 AF 10101111 01 00000001 POP C1 23 00100011 02 00000010 POP D1 27 00100111 02 00000010 POP E1 2B 00101011 02 00000010 POP F1 2F 00101111 02 00000010 PCHL E9 6B 01101011 08 00001000 SPHL F9 6F 01101111 40 01000000 break in 320 |
PUSHのときの出力はY0(ビット0)のみが1になっています。
POPのときはY1が1になっています。
PCHLではY3が、SPHLではY6が1になっています。
ここまでのところはDECODE4の回路は正しく機能していることが確認できました。
トランジスタでCPUをつくろう![第216回]
2020.4.11upload
前へ
次へ
ホームページトップへ戻る