トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第232回]
●命令DECODE回路(22)DECODE5テストプログラム
前回書きましたようにまずはDECODE5回路基板を単独でテストするために、今までと同じようにND80Z3.5を使ってBASICのテストプログラムを作ろうとしたのですが、思っていたよりも面倒であることがわかりました。
いえ。
プログラムが面倒なのではありません。
テストのために82C55から出力するデータがちょいと面倒でした。
まあしかしせっかくコネクタまで準備をしたのですから今更やめるわけにもいきません。
DECODE5に与えるデータを作成するために下の表を作りました。
表の上側には前回お見せしたコネクタ接続図のうちDECODE5の20pinコネクタと82C55側の16pinコネクタの端子の接続関係がわかる部分のみを抜き出して再掲しました。
下側の表はその端子の関係をもとにして82C55から出力するデータを導き出すための表です。
ノートにメモ書きしたものをそのまま表にしただけなので私にはわかりますが、皆様には説明しないとわからないかと思います。
DECODE5に入力される信号の組み合わせによってDECODE5の10pinコネクタから出力される信号のOUT0〜OUT7のうちの1本がLになります。
入力される信号はOP5〜OP3の3bitの組み合わせ000〜111なのでそれを表の一番左に書きました。
理屈の上ではOP5〜OP3の3本のラインがあればよいのですが回路を簡単にするためにそれぞれを反転したOP5_〜OP3_も入力しています。
たとえば000の場合にはOP5=0、OP4=0、OP3=0、OP5_=1、OP4_=1、OP3_=1が入力されます。
その信号はテストなので増設用I/Oボードの82C55から出力します。
そこで表ではOP5〜OP3、OP5_〜OP3_の各信号が出力される82C55のポートの端子名を表の1番上に表示しました。
PB7からはOP5_信号が出力され、PB6からはOP5信号が出力されることを示しています。
残りのOP4、OP4_、OP3、OP3_はBポートではなくてCポートのPC3〜PC0から出力されます。
Bポートからはボードのセレクト信号の9Sと219Sも出力されます。
9SをセレクトするときはPB0が1でPB1が0になります。
逆に219SがセレクトされるときはPB0が0でPB1が1になります。
以上のビットを組み合わせた出力データをPB、PCの欄にまとめました。
たとえばDECODE5回路基板を9S(MYCPU80BのIC9相当の回路)に設定しているときに、OUT0からLを出力させるためにはBポートから81を出力し、Cポートから05を出力します。
下が作成したテストプログラムです。
DECODE5を219Sに設定したときのプログラムです(Bポートからは82、42を出力しています)。
10 OUT $83,$9B 20 OUT $87,$80 30 A%=5:OUT $86,A% 40 B%=$82:OUT $85,B% 50 C%=IN($82) 60 PRINT "000 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 70 A%=6:OUT $86,A% 80 C%=IN($82) 90 PRINT "001 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 100 A%=9:OUT $86,A% 110 C%=IN($82) 120 PRINT "010 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 130 A%=$0A:OUT $86,A% 140 C%=IN($82) 150 PRINT "011 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 160 A%=5:OUT $86,A% 170 B%=$42:OUT $85,B% 180 C%=IN($82) 190 PRINT "100 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 200 A%=6:OUT $86,A% 210 C%=IN($82) 220 PRINT "101 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 230 A%=9:OUT $86,A% 240 C%=IN($82) 250 PRINT "110 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) 260 A%=$0A:OUT $86,A% 270 C%=IN($82) 280 PRINT "111 ",HEX$(A%,2),HEX$(B%,2),HEX$(C%,2),BI$(C%) |
下は実行結果です。
>r. 000 05 82 BF 10111111 001 06 82 7F 01111111 010 09 82 EF 11101111 011 0A 82 DF 11011111 100 05 42 FD 11111101 101 06 42 FE 11111110 110 09 42 F7 11110111 111 0A 42 FB 11111011 |
ND80Z3.5の82C55のCポートから入力されるデータをそのまま表示したのでビットの並びがわかりにくい並びになっています。
82C55のコネクタの端子配列とDECODE5の10pinコネクタの端子配列が異なっているためです。
そこでその部分を見易くするためにデータを変換するサブルーチンをコールするようにプログラムを変更しました。
サブルーチンは以前作ったものをそのままコピーしました。
下が変更後のプログラムです。
10 OUT $83,$9B 20 OUT $87,$80 30 A%=5:OUT $86,A% 40 B%=$82:OUT $85,B% 50 C%=IN($82) 60 GOSUB 380 70 PRINT "000 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 80 A%=6:OUT $86,A% 90 C%=IN($82) 100 GOSUB 380 110 PRINT "001 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 120 A%=9:OUT $86,A% 130 C%=IN($82) 140 GOSUB 380 150 PRINT "010 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 160 A%=$0A:OUT $86,A% 170 C%=IN($82) 180 GOSUB 380 190 PRINT "011 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 200 A%=5:OUT $86,A% 210 B%=$42:OUT $85,B% 220 C%=IN($82) 230 GOSUB 380 240 PRINT "100 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 250 A%=6:OUT $86,A% 260 C%=IN($82) 270 GOSUB 380 280 PRINT "101 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 290 A%=9:OUT $86,A% 300 C%=IN($82) 310 GOSUB 380 320 PRINT "110 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 330 A%=$0A:OUT $86,A% 340 C%=IN($82) 350 GOSUB 380 360 PRINT "111 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 370 STOP 380 'code change PC to d0-d7 390 E%=0 400 IF BIT(C%,6)=1 THEN E%=E%+1 410 IF BIT(C%,7)=1 THEN E%=E%+2 420 IF BIT(C%,4)=1 THEN E%=E%+4 430 IF BIT(C%,5)=1 THEN E%=E%+8 440 IF BIT(C%,1)=1 THEN E%=E%+16 450 IF BIT(C%,0)=1 THEN E%=E%+32 460 IF BIT(C%,3)=1 THEN E%=E%+64 470 IF BIT(C%,2)=1 THEN E%=E%+128 480 RETURN |
下が実行結果です。
>r. 000 05 82 FE 11111110 001 06 82 FD 11111101 010 09 82 FB 11111011 011 0A 82 F7 11110111 100 05 42 EF 11101111 101 06 42 DF 11011111 110 09 42 BF 10111111 111 0A 42 7F 01111111 break in 370 |
DECODE5回路基板を”9S”として使うか”219S”として使うかは基板上のジャンパーピンの設定で行ないます。
上のテストは”219S”に設定して行いました。
ジャンパーピンの設定を変えて”9S”に設定して同じプログラムを実行してみました。
下はその実行結果です。
>r. 000 05 82 FF 11111111 001 06 82 FF 11111111 010 09 82 FF 11111111 011 0A 82 FF 11111111 100 05 42 FF 11111111 101 06 42 FF 11111111 110 09 42 FF 11111111 111 0A 42 FF 11111111 break in 370 |
データが出力されなくなりました。
これはプログラムが”219S”対応だったからです。
そこでプログラムを”9S”対応に変更してみました。
Bポートから出力するデータを82、42から81、41に変更するだけです。
下がそのように変更したプログラムです。
10 OUT $83,$9B 20 OUT $87,$80 30 A%=5:OUT $86,A% 40 B%=$81:OUT $85,B% 50 C%=IN($82) 60 GOSUB 380 70 PRINT "000 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 80 A%=6:OUT $86,A% 90 C%=IN($82) 100 GOSUB 380 110 PRINT "001 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 120 A%=9:OUT $86,A% 130 C%=IN($82) 140 GOSUB 380 150 PRINT "010 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 160 A%=$0A:OUT $86,A% 170 C%=IN($82) 180 GOSUB 380 190 PRINT "011 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 200 A%=5:OUT $86,A% 210 B%=$41:OUT $85,B% 220 C%=IN($82) 230 GOSUB 380 240 PRINT "100 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 250 A%=6:OUT $86,A% 260 C%=IN($82) 270 GOSUB 380 280 PRINT "101 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 290 A%=9:OUT $86,A% 300 C%=IN($82) 310 GOSUB 380 320 PRINT "110 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 330 A%=$0A:OUT $86,A% 340 C%=IN($82) 350 GOSUB 380 360 PRINT "111 ",HEX$(A%,2),HEX$(B%,2),HEX$(E%,2),BI$(E%) 370 STOP 380 'code change PC to d0-d7 390 E%=0 400 IF BIT(C%,6)=1 THEN E%=E%+1 410 IF BIT(C%,7)=1 THEN E%=E%+2 420 IF BIT(C%,4)=1 THEN E%=E%+4 430 IF BIT(C%,5)=1 THEN E%=E%+8 440 IF BIT(C%,1)=1 THEN E%=E%+16 450 IF BIT(C%,0)=1 THEN E%=E%+32 460 IF BIT(C%,3)=1 THEN E%=E%+64 470 IF BIT(C%,2)=1 THEN E%=E%+128 480 RETURN |
そのように変更したプログラムを”9S”に設定したDECODE5基板に対して実行しました。
下が実行結果です。
>r. 000 05 81 FE 11111110 001 06 81 FD 11111101 010 09 81 FB 11111011 011 0A 81 F7 11110111 100 05 41 EF 11101111 101 06 41 DF 11011111 110 09 41 BF 10111111 111 0A 41 7F 01111111 break in 370 |
トランジスタでCPUをつくろう![第232回]
2020.4.27upload
前へ
次へ
ホームページトップへ戻る