2020.12.18
前へ
次へ
ホームページトップへ戻る

トランジスタで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

前へ
次へ
ホームページトップへ戻る