トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第279回]
●MMU回路(5)動作テスト(その3)全メモリ範囲を対象にしたテストプログラム#2
[第276回]と[第277回]でMMUの動作を確認するプログラムをSLOWモードで実行し、Aレジスタの値が本来の計算結果の下位4ビットになることで回路とプログラムが正しく機能していることを確認しました。
それはそれでよかったのですが、せっかくの4ビットCPUなのですからもう少しプログラムを工夫すれば、計算結果の下位8ビットだけではなくて上位ビットも表示させることができることに気が付きました。
そのときに作ったプログラムではメモリバンクを切り換えるごとにそのメモリバンクのナンバーと同じ数をAレジスタに加算するという計算を行ないました。
バンク0〜バンクF(15)と同じ数を加算しますから、その計算は0+1+2+3+…+14+15=120(78H)となり、Aレジスタには78Hの下位8ビットの8が表示されて終ることを確認しました。
それではその結果の上位ビットの7を表示させるにはどうしたらよいでしょうか?
MYCPU4にはAレジスタのほかにもうひとつBレジスタがあります。
Aレジスタに加算を行なった結果上位桁にキャリーが発生したときだけBレジスタを+1すればよいのです。
ただしBレジスタはただのレジスタで加算機能はありません。
そこでBレジスタを+1するときだけ
1)現在のAレジスタの値をWレジスタに保存する
2)Bレジスタの現在の値をAレジスタにロードする
3)Aレジスタを+1する
4)Aレジスタの値をBレジスタにロードする
5)Wレジスタの値をAレジスタにロードする
という操作を行ないます。
具体的なプログラムは下のようになります。
ADD A,N (Nはこのときのメモリバンクナンバーです)
JNC F
LD W,A
LD A,B
ADD A,1
LD B,A
LD A,W
JMP F
このプログラムを各メモリバンクのアドレス0〜に書きます。
本来はそれぞれのメモリバンクアドレスにそのように書くべきですが、最初のADD A,Nを除いては同じ命令コードになることに着目して、今回もND80Z3.5のZB3BASICでプログラムを組みました。
プログラムが長くなりますので、下にND80Z3.5で実行したときのログを示します。
logfile nd80zlog\12161025.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/load mc4t11b.txt 10 'mycpu4 test 20 'memory write 30 OUT $83,$80 40 OUT $83,3 50 A%=0,B%=$00:GOSUB 290:'LD A,0 55 A%=1,B%=$10:GOSUB 290:'LD B,0 60 C%=$10:'address=n0 70 D%=$61:'ADD A,n 80 E%=0 90 A%=2,B%=$CF:GOSUB 290:'JMP F 100 A%=$0F,B%=$10:GOSUB 290:'JMP $10 110 A%=3,B%=$80:GOSUB 290:'OUT A 120 A%=4,B%=$F0:GOSUB 290:'HLT 130 ' 140 FOR E%=1 TO $0F 150 A%=C% 160 B%=D% 170 GOSUB 290:'A%=x0 ADD A,n 180 A%=A%+1:B%=$DF:GOSUB 290:'A%=x1 JNC xF 181 A%=A%+1:B%=$31:GOSUB 290:'A%=x2 LD W,A 182 A%=A%+1:B%=$20:GOSUB 290:'A%=x3 LD A,B 183 A%=A%+1:B%=$61:GOSUB 290:'A%=x4 ADD A,1 184 A%=A%+1:B%=$30:GOSUB 290:'A%=x5 LD B,A 185 A%=A%+1:B%=$21:GOSUB 290:'A%=x6 LD A,W 190 A%=A%+1:B%=$CF:GOSUB 290:'A%=x7 JMP xF 200 C%=C%+$10 210 B%=C% 220 A%=A%+$08 230 GOSUB 290:'A%=nF JMP(H=n+1,L=0) 240 D%=D%+1 250 NEXT E% 260 A%=$FF,B%=$03:GOSUB 290:'JMP 03 270 STOP 280 ' 290 OUT $80,A% 300 OUT $81,B% 310 OUT $83,1 320 OUT $83,0 330 RETURN 340 ' 350 'memory read 360 OUT $83,$82 370 FOR A%=0 TO 4 380 GOSUB 490 390 NEXT A% 400 A%=$0F:GOSUB 490 410 ' 420 FOR C%=$10 TO $F0 STEP $10 430 A%=C%:GOSUB 490 440 A%=A%+1:GOSUB 490 442 A%=A%+1:GOSUB 490 443 A%=A%+1:GOSUB 490 444 A%=A%+1:GOSUB 490 445 A%=A%+1:GOSUB 490 446 A%=A%+1:GOSUB 490 447 A%=A%+1:GOSUB 490 450 A%=A%+$08:GOSUB 490 460 NEXT C% 470 STOP 480 ' 490 OUT $80,A% 500 B%=IN($81) 510 PRINT HEX$(A%,2),HEX$(B%,2) 520 RETURN data end >r. break in 270 >g.350 00 00 01 10 02 CF 03 80 04 F0 0F 10 10 61 11 DF 12 31 13 20 14 61 15 30 16 21 17 CF 1F 20 20 62 21 DF 22 31 23 20 24 61 25 30 26 21 27 CF 2F 30 30 63 31 DF 32 31 33 20 34 61 35 30 36 21 37 CF 3F 40 40 64 41 DF 42 31 43 20 44 61 45 30 46 21 47 CF 4F 50 50 65 51 DF 52 31 53 20 54 61 55 30 56 21 57 CF 5F 60 60 66 61 DF 62 31 63 20 64 61 65 30 66 21 67 CF 6F 70 70 67 71 DF 72 31 73 20 74 61 75 30 76 21 77 CF 7F 80 80 68 81 DF 82 31 83 20 84 61 85 30 86 21 87 CF 8F 90 90 69 91 DF 92 31 93 20 94 61 95 30 96 21 97 CF 9F A0 A0 6A A1 DF A2 31 A3 20 A4 61 A5 30 A6 21 A7 CF AF B0 B0 6B B1 DF B2 31 B3 20 B4 61 B5 30 B6 21 B7 CF BF C0 C0 6C C1 DF C2 31 C3 20 C4 61 C5 30 C6 21 C7 CF CF D0 D0 6D D1 DF D2 31 D3 20 D4 61 D5 30 D6 21 D7 CF DF E0 E0 6E E1 DF E2 31 E3 20 E4 61 E5 30 E6 21 E7 CF EF F0 F0 6F F1 DF F2 31 F3 20 F4 61 F5 30 F6 21 F7 CF FF 03 break in 470 >ot 83,92 >ot 82,f4 >ot 83,08 >ot 83,09 >ot 83,08 >ot 83,09 >/exit 0000 00C3 - リモート接続を終了しました logfile closed at Wed Dec 16 10:44:59 2020 |
BASICのプログラムは[第277回]で作ったプログラムをもとにして必要な部分を追加、変更して作りました。
ですからそのときのプログラムと機能、動作は基本的には同じです。
次回はこのプログラムを実際に実行した結果を今までと同じように写真でお見せしながら説明することにします。
トランジスタでCPUをつくろう![第279回]
2020.12.18upload
前へ
次へ
ホームページトップへ戻る