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

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第221回]



●REGISTER回路(4)テストプログラム

今回はREGISTER試作基板の動作テストです。
今までと同様BASICプログラムを作ってテストします。
プログラムの理解を助けるために前回お見せしたコネクタ接続図を再掲します。

データのWRITE/READ時にポートの向きを切り換えるために82C55にコントロールワードを送ると出力に設定したポートの出力は全ビットが0になってしまいます。
すると書き込み信号、読み出し信号(W0−W7、R0−R7)に出力しているポートの出力(通常は全ビットが1でなければならない)が全ビット0になってしまいます。
これを避けるため動作テストでは上の接続図のように82C55を2個使ってND80Z3.5上の82C55(I/Oアドレスは80−83)のCポートでデータの入出力を行い、増設I/Oボードの82C55(I/Oアドレスは84−87に設定)のCポートをW0−W7、BポートをR0−R7に割り当てます。
テストプログラムではREGISTER基板をbVに設定して、W7=0、R7=0のときにアクティブになる設定で行ないました。
下が作成したテストプログラムのプログラムリストです。

    10 OUT $87,$80
    20 OUT $86,$FF
    30 OUT $85,$FF
    40 A%=0:GOSUB 210
    50 '00000001 to 10000000
    60 A%=1
    70 FOR B%=0 TO 7
    80 GOSUB 210
    90 A%=A%*2
   100 NEXT B%
   110 A%=$FF:GOSUB 210
   120 '11111110 to 01111111
   130 D%=1
   140 FOR B%=0 TO 7
   150 A%=$FF
   160 A%=A%-D%
   170 GOSUB 210
   180 D%=D%*2
   190 NEXT B%
   200 STOP 
   210 'out/in subroutine
   220 OUT $83,$80:'pa-pc out
   230 OUT $82,A%
   240 OUT $87,$0C:'wr=0
   250 OUT $87,$0D:'wr=1
   260 OUT $83,$9B:'PA-PC IN
   270 OUT $85,$BF:'rd=0
   280 C%=IN($82)
   290 PRINT HEX$(A%),BI$(A%),HEX$(C%),BI$(C%)
   300 OUT $85,$FF:'rd=1
   310 RETURN 

Cポートからデータを出力してREGISTER回路に書き込んだあと、Cポートを入力に設定してREGISTER基板からデータを読んで、それを表示します。
出力データを変えながらテストを行なうため、その部分はサブルーチンにしました。
210−310がそのサブルーチンです。
メインプログラムの50−110では最初にテストデータとして’00000000’をA%にセットしてサブルーチンをCALLしたあと’00000001’から’10000000’までデータを左シフトしながらサブルーチンをCALLします。
次に110−200では最初にテストデータとして’11111111’をA%にセットしてサブルーチンをCALLしたあと’11111110’から’01111111’までデータを左シフトしながらサブルーチンをCALLします。
下が実行結果です。

>r.
0            00000000     0            00000000
1            00000001     1            00000001
2            00000010     2            00000010
4            00000100     4            00000100
8            00001000     8            00001000
10           00010000     10           00010000
20           00100000     20           00100000
40           01000000     40           01000000
80           10000000     80           10000000
FF           11111111     FF           11111111
FE           11111110     FE           11111110
FD           11111101     FD           11111101
FB           11111011     FB           11111011
F7           11110111     F7           11110111
EF           11101111     EF           11101111
DF           11011111     DF           11011111
BF           10111111     BF           10111111
7F           01111111     7F           01111111

break in 200

Cポートのビットの並びとREGISTER基板の10pinコネクタのビットの並びは異なっています(上のコネクタ接続図参照)。
しかし上のプログラムは簡単にするためにCポートから出力、入力するデータのビットの並びは変換しないでそのまま出力し、入力しました。
出力も入力も同じCポートで行なうため実行結果の通り見かけ上は問題はありません。
ただ回路に不具合があってどこかのビットが出力と入力で違っているというようなことが起きた場合、結果のビット並びと実際の基板上のビットの並びが異なっているために、その問題箇所を特定するためにはその時点でビットの並びを考えて実際の場所を特定する必要があります。
まあ、今回は上の実行結果の通り特に問題はないようなのでその点については作成したプログラムのままでもよいわけですけれど。
ことのついでですから、念には念を入れるという意味でビット並びを考慮したプログラムも作りました。
下がデータのビット並びを考慮したテストプログラムです。

    10 OUT $87,$80
    20 OUT $86,$FF
    25 OUT $85,$FF
    30 OUT $83,$80
    40 A%=0:GOSUB 370
    50 GOSUB 250
    60 '00000001 to 10000000
    70 A%=1
    80 FOR B%=0 TO 7
    90 GOSUB 370
   100 GOSUB 250
   110 A%=A%*2
   120 NEXT B%
   130 A%=$FF:GOSUB 370
   140 GOSUB 250
   150 '11111110 to 01111111
   160 D%=1
   170 FOR B%=0 TO 7
   180 A%=$FF
   190 A%=A%-D%
   200 GOSUB 370
   210 GOSUB 250
   220 D%=D%*2
   230 NEXT B%
   240 STOP 
   250 'out/in subroutine
   260 OUT $83,$80:'pa-pc out
   270 OUT $82,X%
   280 OUT $87,$0C:'wr=0
   290 OUT $87,$0D:'wr=1
   300 OUT $83,$9B:'PA-PC IN
   310 OUT $85,$BF:'rd=0
   320 C%=IN($82)
   330 GOSUB 480
   340 PRINT HEX$(A%),BI$(A%),HEX$(E%),BI$(E%)
   350 OUT $85,$FF:'rd=1
   360 RETURN 
   370 'code change a% to PC(d0-d7)
   380 X%=0
   390 IF BIT(A%,5)=1 THEN X%=X%+1
   400 IF BIT(A%,4)=1 THEN X%=X%+2
   410 IF BIT(A%,7)=1 THEN X%=X%+4
   420 IF BIT(A%,6)=1 THEN X%=X%+8
   430 IF BIT(A%,2)=1 THEN X%=X%+16
   440 IF BIT(A%,3)=1 THEN X%=X%+32
   450 IF BIT(A%,0)=1 THEN X%=X%+64
   460 IF BIT(A%,1)=1 THEN X%=X%+128
   470 RETURN 
   480 'code change PC to d0-d7
   490 E%=0
   500 IF BIT(C%,6)=1 THEN E%=E%+1
   510 IF BIT(C%,7)=1 THEN E%=E%+2
   520 IF BIT(C%,4)=1 THEN E%=E%+4
   530 IF BIT(C%,5)=1 THEN E%=E%+8
   540 IF BIT(C%,1)=1 THEN E%=E%+16
   550 IF BIT(C%,0)=1 THEN E%=E%+32
   560 IF BIT(C%,3)=1 THEN E%=E%+64
   570 IF BIT(C%,2)=1 THEN E%=E%+128
   580 RETURN 

370−470が書き込みデータをREGISTER基板のd0−d7入出力10pinコネクタのビット並びに変換するサブルーチンです。
A%がもとのデータで変換後のデータはX%に入れられます。
480−580はそれとは逆にREGISTER基板のd0−d7入出力10pinコネクタから読み込んだデータをCポートのビット並びに変換するサブルーチンです。
C%が入力データでE%が変換後のデータです。
下が実行結果です。

>r.
0            00000000     0            00000000
1            00000001     1            00000001
2            00000010     2            00000010
4            00000100     4            00000100
8            00001000     8            00001000
10           00010000     10           00010000
20           00100000     20           00100000
40           01000000     40           01000000
80           10000000     80           10000000
FF           11111111     FF           11111111
FE           11111110     FE           11111110
FD           11111101     FD           11111101
FB           11111011     FB           11111011
F7           11110111     F7           11110111
EF           11101111     EF           11101111
DF           11011111     DF           11011111
BF           10111111     BF           10111111
7F           01111111     7F           01111111

break in 240

表示された結果は先ほどの変更前のプログラムの実行結果と変わりません。
これでよいはずなのですけれど。
ちょっと心配です。
実はREGISTER基板にはビットのデータの状態を表示するLED回路がついています。
LEDの点灯状態を確認すれば正しいデータが出力されているかどうかを確認することができるのですけれど。
プログラムが速すぎてあっという間に終ってしまうためその確認ができません。
そこでもう一工夫です。
上のプログラムにウェイトルーチンを挿入してみました。
下がそのように変更したプログラムリストです。

    10 OUT $87,$80
    20 OUT $86,$FF
    25 OUT $85,$FF
    30 OUT $83,$80
    40 A%=0:GOSUB 370
    50 GOSUB 250
    60 '00000001 to 10000000
    70 A%=1
    80 FOR B%=0 TO 7
    90 GOSUB 370
   100 GOSUB 250
   110 A%=A%*2
   120 NEXT B%
   130 A%=$FF:GOSUB 370
   140 GOSUB 250
   150 '11111110 to 01111111
   160 D%=1
   170 FOR B%=0 TO 7
   180 A%=$FF
   190 A%=A%-D%
   200 GOSUB 370
   210 GOSUB 250
   220 D%=D%*2
   230 NEXT B%
   240 STOP 
   250 'out/in subroutine
   260 OUT $83,$80:'pa-pc out
   270 OUT $82,X%
   280 OUT $87,$0C:'wr=0
   290 OUT $87,$0D:'wr=1
   300 OUT $83,$9B:'PA-PC IN
   310 OUT $85,$BF:'rd=0
   320 C%=IN($82)
   330 GOSUB 480
   340 PRINT HEX$(A%),BI$(A%),HEX$(E%),BI$(E%)
   350 OUT $85,$FF:'rd=1
   355 FOR T=0 TO 1000:NEXT T
   360 RETURN 
   370 'code change a% to PC(d0-d7)
   380 X%=0
   390 IF BIT(A%,5)=1 THEN X%=X%+1
   400 IF BIT(A%,4)=1 THEN X%=X%+2
   410 IF BIT(A%,7)=1 THEN X%=X%+4
   420 IF BIT(A%,6)=1 THEN X%=X%+8
   430 IF BIT(A%,2)=1 THEN X%=X%+16
   440 IF BIT(A%,3)=1 THEN X%=X%+32
   450 IF BIT(A%,0)=1 THEN X%=X%+64
   460 IF BIT(A%,1)=1 THEN X%=X%+128
   470 RETURN 
   480 'code change PC to d0-d7
   490 E%=0
   500 IF BIT(C%,6)=1 THEN E%=E%+1
   510 IF BIT(C%,7)=1 THEN E%=E%+2
   520 IF BIT(C%,4)=1 THEN E%=E%+4
   530 IF BIT(C%,5)=1 THEN E%=E%+8
   540 IF BIT(C%,1)=1 THEN E%=E%+16
   550 IF BIT(C%,0)=1 THEN E%=E%+32
   560 IF BIT(C%,3)=1 THEN E%=E%+64
   570 IF BIT(C%,2)=1 THEN E%=E%+128
   580 RETURN 

355がウェイトルーチンです。
LEDの表示が0.5秒ほど止まって見えます。


LED表示を見ることでプログラムに間違いが無いことが確認できました。
下は画面に表示された実行結果です。

>r.
0            00000000     0            00000000
1            00000001     1            00000001
2            00000010     2            00000010
4            00000100     4            00000100
8            00001000     8            00001000
10           00010000     10           00010000
20           00100000     20           00100000
40           01000000     40           01000000
80           10000000     80           10000000
FF           11111111     FF           11111111
FE           11111110     FE           11111110
FD           11111101     FD           11111101
FB           11111011     FB           11111011
F7           11110111     F7           11110111
EF           11101111     EF           11101111
DF           11011111     DF           11011111
BF           10111111     BF           10111111
7F           01111111     7F           01111111

break in 240

こちらのほうは変更前のプログラムの表示結果と変わりません。

以上でREGISTER試作基板のとりあえずの動作テストが完了しました。

トランジスタでCPUをつくろう![第221回]
2020.4.16upload

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