トランジスタで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
前へ
次へ
ホームページトップへ戻る