「CPUの創りかた」の回路シミュレーション(5) --- p218, 222 PCとI/Oポート

ブラウザで動作してインストール不要の下記の
https://www.falstad.com/circuit/circuitjs.html
回路シミュレータで、「CPUの創りかた」で紹介されていた回路の動作を確認してみました。

今回は p218, 222 の 「プログラムカウンタと I/O ポート」を D レジスタと C レジスタを使って追加しました。
![[cpu218,222]PCとIOポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549839/4ef143b5-ec77-41c3-c728-65d09d090099.png)

◆回路シミュレータの簡単な使用法
- マウスホイールで回路図を拡大縮小できます。
- Altキー + ドラッグで回路図全体を移動できます。
- 回路図の緑色の部分は電圧が+Vcc ( 今回は 5V )、灰色の部分は GND 電位であることを示します。
- LOAD0 ～ LOAD3、RESET、SELECT A、SELECT B のデジタル入力をクリックするたびに H/L が切り替わります。
- 加算器の A0 ～ A1 のデジタル入力をクリックするたびに、1/0 が切り替わります。
- SW0 ～ SW3 をクリックするたびに、on/off が切り替わります。
- I/O ポートの Q0 ～ Q3 が H になると、LED0 ～ LED3 が点灯します。

◆回路の動作確認
- プログラムカウンタ
クロックの立上り時に、Q0 ～ Q3 が 2 進数でカウントアップされます。1111 の次は 0000 に戻ります。
RESET のデジタル入力をクリックして L にすると、Q0 ～ Q3 は 0000 にリセットされます。
したがって ROM のアドレス入力に利用すれば、1 命令ずつ読み出すプログラムカウンタとして使えることになります。
〈 JMP Im 命令の実行方法 〉
① SELECT A/B のデジタル入力をクリックして、SELECT A = H, SELECT B = H に設定する。
② 加算器の A0 ～ A3 のデジタル入力クリックして、1100 ( Im = 3 ) に設定する。
③ LOAD3 のデジタル入力をクリックして L に切り替え、I0 ～ I3 が Q0 ～ Q3 にコピーされたら、もう一度クリックして H に切り替える。
④ Q0 ～ Q3 は 1100 からカウントを再開する。
- I/O ポート
① SELECT A/B のデジタル入力をクリックして、SELECT A = L, SELECT B = H に設定する。
② SW0 ～ SW1 を on/off ( H/L ) すると、4bit バスにその状態が反映される。
③ LOAD3 のデジタル入力をクリックして L に切り替え、I0 ～ I3 が Q0 ～ Q3 にコピーされたら、もう一度クリックして H に切り替える。
④ Q0 ～ Q3 の状態に応じて LED0 ～ LED3 が点灯する。

---

シミュレーションを実行するには下記の回路ファイルをコピーして、シミュレータの File → Import From Text... で開くパネルに貼り付けてください。
```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
421 48 720 96 720 2048 4 0 0 0 0 0
421 48 432 96 432 2048 4 0 0 0 0 0$ 0 0.000005 10.20027730826997 50 5 50 5e-11
421 48 720 96 720 2048 4 5 0 5 0 0
421 48 432 96 432 2048 4 0 0 0 0 0
421 48 144 96 144 2048 4 0 0 0 0 0
421 48 -144 96 -144 2048 4 0 0 0 0 0
w 48 48 32 48 0
w 32 48 32 336 0
w 32 336 32 624 0
w 32 624 32 912 0
w 32 912 48 912 0
w 32 624 48 624 0
w 32 336 48 336 0
w 176 -176 144 -176 0
w 16 -112 16 176 0
w 16 176 48 176 0
w 16 176 16 464 0
w 16 464 48 464 0
w 16 464 16 752 0
w 16 752 48 752 0
w 48 -144 48 -176 0
w 48 -176 144 -176 0
w 144 -176 144 -144 0
w 16 -112 48 -112 0
g 176 -176 176 -160 0 0
g 176 112 176 128 0 0
w 144 112 144 144 0
w 48 112 144 112 0
w 48 144 48 112 0
w 176 112 144 112 0
g 176 400 176 416 0 0
w 144 400 144 432 0
w 48 400 144 400 0
w 48 432 48 400 0
w 176 400 144 400 0
w 144 688 144 720 0
w 48 688 144 688 0
w 48 720 48 688 0
w 176 720 144 720 0
w 144 -112 192 -112 0
w 192 -112 192 -192 0
w 192 -192 -128 -192 0
w 192 96 -128 96 0
w 192 176 192 96 0
w 192 384 -128 384 0
w 192 464 192 384 0
w 192 672 -128 672 0
w 192 752 192 672 0
w 144 176 192 176 0
w 144 464 192 464 0
w 144 752 192 752 0
L -128 672 -176 672 0 1 false 5 0
L -128 384 -176 384 0 1 false 5 0
L -128 96 -176 96 0 1 false 5 0
L -128 -192 -176 -192 0 1 false 5 0
x -165 -199 -112 -196 6 16 LOAD0
x -161 88 -108 91 6 16 LOAD1
x -166 376 -113 379 6 16 LOAD2
x -164 665 -111 668 6 16 LOAD3
w 48 16 -16 16 0
w 48 -16 -32 -16 0
w 48 -48 -48 -48 0
w 48 -80 -64 -80 0
w 48 208 -64 208 0
w 48 240 -48 240 0
w 48 272 -32 272 0
w 48 304 -16 304 0
w 48 496 -64 496 0
w 48 528 -48 528 0
w 48 560 -32 560 0
w 48 592 -16 592 0
w 48 784 -64 784 0
w 48 816 -48 816 0
w 48 848 -32 848 0
w 48 880 -16 880 0
w -16 16 -16 304 0
w -16 304 -16 592 0
w -16 592 -16 880 0
w -32 -16 -32 272 0
w -32 272 -32 560 0
w -32 560 -32 848 0
w -48 -48 -48 240 0
w -48 240 -48 528 0
w -48 528 -48 816 0
w -64 -80 -64 208 0
w -64 208 -64 496 0
w -64 496 -64 784 0
w -16 16 0 -752 0
w -32 -16 -16 -768 0
w -48 -48 -32 -784 0
w -64 -80 -48 -800 0
w 144 -80 224 -80 0
w 144 -48 240 -48 0
w 144 -16 256 -16 0
w 144 16 544 16 0
w 144 304 336 304 0
w 144 272 320 272 0
w 144 240 304 240 0
w 144 208 288 208 0
w 144 592 208 592 0
w 144 560 208 560 0
w 144 528 208 528 0
w 144 496 208 496 0
184 544 -688 576 -688 0 2
184 544 -464 576 -464 0 2
184 544 -224 576 -224 0 2
184 544 16 576 16 0 2
w 224 -688 224 -80 0
w 608 -528 512 -528 0
w 640 -528 640 -512 0
w 640 -512 496 -512 0
w 640 -288 496 -288 0
w 608 -304 512 -304 0
w 640 -48 496 -48 0
w 608 -64 512 -64 0
w 640 192 496 192 0
w 608 176 512 176 0
w 640 -304 640 -288 0
w 640 -64 640 -48 0
w 640 176 640 192 0
w 512 -528 512 -304 0
w 512 -304 512 -64 0
w 512 -64 512 176 0
w 496 -512 496 -288 0
w 496 -288 496 -48 0
w 496 -48 496 192 0
w 496 192 496 976 0
w 512 944 -128 944 0
w 512 176 512 944 0
w 496 976 -128 976 0
L -128 944 -176 944 0 0 false 5 0
L -128 976 -176 976 0 0 false 5 0
x -166 936 -90 939 4 16 SELECT\sA
x -167 969 -92 972 4 16 SELECT\sB
w 544 -688 224 -688 0
w 288 208 288 -656 0
w 288 -656 544 -656 0
w 352 304 352 -624 0
w 352 -624 544 -624 0
w 416 -592 544 -592 0
w 544 -464 240 -464 0
w 240 -464 240 -48 0
w 304 240 304 -432 0
w 544 -432 304 -432 0
w 368 272 368 -400 0
w 544 -400 368 -400 0
w 416 -368 544 -368 0
w 256 -16 256 -224 0
w 256 -224 544 -224 0
w 320 272 320 -192 0
w 320 -192 544 -192 0
w 384 240 384 -160 0
w 384 -160 544 -160 0
w 416 -128 544 -128 0
w 336 304 336 48 0
w 336 48 544 48 0
w 400 208 400 80 0
w 400 80 544 80 0
w 416 112 544 112 0
w 0 -752 976 -752 0
w -16 -768 960 -768 0
w -32 -784 944 -784 0
w -48 -800 928 -800 0
x 162 54 236 57 4 16 Aレジスタ
x 158 339 232 342 4 16 Bレジスタ
x 158 631 231 634 4 16 I/Oポート
x 160 917 304 920 4 16 プログラムカウンタ
196 816 -720 944 -720 2050 4
L 784 -416 784 -384 2 0 false 5 0
w 672 -688 816 -688 0
w 688 -464 688 -656 0
w 688 -656 816 -656 0
w 672 -224 704 -224 0
w 704 -224 704 -624 0
w 704 -624 816 -624 0
w 672 16 720 16 0
w 720 16 720 -592 0
w 720 -592 816 -592 0
w 672 -464 688 -464 0
w 816 -560 752 -560 0
w 752 -560 752 -416 0
w 816 -528 768 -528 0
w 768 -528 768 -416 0
w 816 -496 784 -496 0
w 784 -496 784 -416 0
w 816 -464 800 -464 0
w 800 -464 800 -416 0
g 816 -720 816 -704 0 0
L 752 -416 752 -384 2 0 false 5 0
L 768 -416 768 -384 2 0 false 5 0
L 800 -416 800 -384 2 0 false 5 0
w 912 -624 928 -624 0
w 928 -624 928 -800 0
w 912 -592 944 -592 0
w 944 -592 944 -784 0
w 912 -560 960 -560 0
w 960 -560 960 -768 0
w 912 -528 976 -528 0
w 976 -528 976 -752 0
155 1024 -464 1056 -464 10 0
w -128 -864 48 -864 0
R -128 -864 -176 -864 1 2 100 2.5 2.5 0 0.5
x -158 -840 -108 -837 6 16 RESET
L -128 -832 -176 -832 0 1 false 5 0
w 32 -832 -128 -832 0
w 32 48 48 -864 0
w 16 -112 32 -832 0
w 416 -592 416 -368 0
w 416 -368 416 -128 0
w 416 -128 416 112 0
g 416 112 416 128 0 0
w 912 -464 1024 -464 0
w 1024 -432 1008 -432 0
w 1008 -432 1008 -864 0
w 1024 -400 992 -400 0
w 992 -400 992 -832 0
w 48 -864 1008 -864 0
w 32 -832 992 -832 0
M 1120 -464 1168 -464 2 2.5
x 1069 -490 1181 -487 4 16 キャリーフラグ
x 829 -419 883 -416 4 18 加算器
M 144 784 192 784 2 2.5
M 144 816 192 816 2 2.5
M 144 848 192 848 2 2.5
M 144 880 192 880 2 2.5
R 176 720 176 688 0 0 40 5 0 0 0.5
x 208 839 420 842 4 20 ROM\sのアドレス入力へ
r 416 208 464 208 0 1000
r 416 272 464 272 0 1000
r 416 304 464 304 0 1000
r 416 240 464 240 0 1000
w 400 208 400 384 0
w 464 208 480 208 0
w 480 208 480 240 0
w 480 240 464 240 0
w 480 240 480 272 0
w 480 272 464 272 0
w 480 272 480 304 0
w 480 304 464 304 0
w 416 208 400 208 0
w 416 240 384 240 0
w 416 272 368 272 0
w 416 304 352 304 0
g 480 304 480 320 0 0
w 384 240 384 352 0
w 368 272 368 336 0
w 352 304 352 320 0
s 400 416 400 384 0 1 false
w 352 320 304 320 0
w 304 320 304 384 0
w 384 352 368 352 0
w 368 352 368 384 0
w 368 336 336 336 0
w 336 336 336 384 0
s 368 416 368 384 0 1 false
s 336 416 336 384 0 1 false
s 304 416 304 384 0 1 false
w 304 416 304 448 0
w 304 448 336 448 0
w 336 448 336 416 0
w 336 448 368 448 0
w 368 448 368 416 0
w 368 448 400 448 0
w 400 448 400 416 0
w 400 448 432 448 0
R 432 448 432 400 0 0 40 5 0 0 0.5
r 208 496 272 496 0 1000
r 208 528 272 528 0 1000
r 208 560 272 560 0 1000
r 208 592 272 592 0 1000
162 272 592 272 656 2 default-led 1 0 0 0.003
162 304 592 304 656 2 default-led 1 0 0 0.003
162 336 592 336 656 2 default-led 1 0 0 0.003
162 368 592 368 656 2 default-led 1 0 0 0.003
w 272 560 304 560 0
w 304 560 304 592 0
w 272 528 336 528 0
w 336 528 336 592 0
w 272 496 368 496 0
w 368 496 368 592 0
w 272 656 304 656 0
w 304 656 336 656 0
w 336 656 368 656 0
g 304 656 304 672 0 0
x 297 488 333 491 4 16 SW0
x 314 467 350 470 4 16 SW1
x 346 487 382 490 4 16 SW2
x 385 470 421 473 4 16 SW3
x 248 679 288 682 4 16 LED3
x 286 706 326 709 4 16 LED2
x 320 679 360 682 4 16 LED1
x 350 698 390 701 4 16 LED0
```