トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第279回]
●MMU回路(5)動作テスト(その3)全メモリ範囲を対象にしたテストプログラム#2
[第276回]と[第277回]でMMUの動作を確認するプログラムをSLOWモードで実行し、Aレジスタの値が本来の計算結果の下位4ビットになることで回路とプログラムが正しく機能していることを確認しました。
それはそれでよかったのですが、せっかくの4ビットCPUなのですからもう少しプログラムを工夫すれば、計算結果の下位4ビットだけではなくて上位ビットも表示させることができることに気が付きました。
そのときに作ったプログラムではメモリバンクを切り換えるごとにそのメモリバンクのナンバーと同じ数をAレジスタに加算するという計算を行ないました。
バンク0〜バンクF(15)と同じ数を加算しますから、その計算は0+1+2+3+…+14+15=120(78H)となり、Aレジスタには78Hの下位4ビットの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
前へ
次へ
ホームページトップへ戻る