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

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

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