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

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


[第195回]



●命令デコード回路(3)テストプログラム

前回紹介しましたフラットケーブルを利用して、ND80Z3.5の82C55を使って命令デコード回路試作基板をテストするプログラムをBASICで作りました。
下が前回お見せしたフラットケーブルの結線図です。

前回も書きましたが、本当は0〜7を合わせて結線すればよいのですが、そうすると線を切ってつなぎ直さなければならないのでうんと手間がかかります。
とりあえずはテストができればよいので、そこのところはプログラムで対処することにします。
というように書きましたが、これがたとえば製品に附属するプログラムなどでしたら、そこはやっぱりプログラムのなかできちんとビット列を変換して見かけ上はきれいな並びの出力が得られるようにすべきでありましょう。
でも早い話が、どうせ試作品の回路が正しいかどうかをテストするだけのテストプログラムですから、その確認ができればよいのです。
ということで結局手抜きのプログラムを即席で作ってしまいました。
前にも書きましたが、こういうときにBASICは実に便利です。
即席で作ってしまったプログラムリストはあとで紹介することにして、まずはその実行結果を先にお見せします。

>r.
11xxxb2b1b0
000          03           00000011     BF           10111111
001          23           00100011     7F           01111111
010          13           00010011     EF           11101111
011          33           00110011     DF           11011111
100          83           10000011     FB           11111011
101          A3           10100011     F7           11110111
110          93           10010011     FE           11111110
111          B3           10110011     FD           11111101
xxb5b4b3xxx
000          00           00000000     BF           10111111
001          40           01000000     7F           01111111
010          04           00000100     EF           11101111
011          44           01000100     DF           11011111
100          08           00001000     FD           11111101
101          48           01001000     FE           11111110
110          0C           00001100     F7           11110111
111          4C           01001100     FB           11111011
end

これだけでは何をやっているのかよくわかりませんでしょう。
出力の先頭にありますように、前半は11xxxbbb回路のテストで後半はxxbbbxxxのテストです。
bbbは000〜111を示していてxは1でも0でもよいことを示します。
テストではx=0のデータを与えています。
そのような組み合わせのデータをbbb=000〜111の順に82C55のAポートから出力して、回路から得られる出力結果を前半はBポートから入力し、後半はCポートから入力します。
表の左端にbbbのビット列を表示しています。
その右側には回路への出力データを、そしてさらにその右側には回路から得られる入力データを、それぞれ16進数と2進数で示しました。

データの解読には上の結線図を頭に入れておく必要があります。
まずは前半の11xxxbbb回路について考えます。
回路への出力はCN2にAポートからの出力を与えます。
CN2のD7〜D0のうち、D7とD6が1、D5、D4、D3が0で、D2、D1、D0がb2、b1、b0になるような値をAポートから出力します。
Aポートの各ビットをA7〜A0の順に並べて、そこにD7〜D0を上の結線図に従って当てはめると次のようになります。
D2、D3、D0、D1、D5、D4、D7、D6
ここに出力データを当てはめます。
すると下のようになります。
b2、0、b0、b1、0、0、1、1
ここにb2、b1、b0=0、0、0〜1、1、1を当てはめますから、結局下のような出力データを与えればよいことになります(面倒なので「、」は省きます)。
00000011(03)
00100011(23)
00010011(13)
以下は省略しますが表の左側のデータがそうなっていることが確認できると思います。

次に回路から得られる結果について考えます。
回路からの出力はCN4で、それは82C55のBポートに入力されます。
これも上の説明にならって、B7〜B0にs7〜s0を当てはめます。
s1、s0、s3、s2、s5、s4、s7、s6
この回路からの出力はbbb=000の入力に対してs0=0、bbb=001に対してs1=0、bbb=010に対してs2=0のようになります。
そのときそれぞれ残りのビットからの出力は1です。
この動作は74HC138に相当します。
これを上に示したs1〜s6の並びに置き換えると下のようになります。
10111111(BF)
01111111(7F)
11101111(EF)
以下は省略しますが表の右側のデータがそうなっていることが確認できると思います。

上の出力表の後半はxxbbbxxx回路についてのテスト結果ですが、これも上で説明した考え方と全く同じです。
説明については省略しますが、正しい出力結果が得られていることは確認済みです。
下はプログラムリストです。

    10 OUT $83,$8B
    20 PRINT "11xxxb2b1b0"
    30 A%=3:OUT $80,A%
    40 B%=IN($81)
    50 PRINT "000 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
    60 A%=$23:OUT $80,A%
    70 B%=IN($81)
    80 PRINT "001 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
    90 A%=$13:OUT $80,A%
   100 B%=IN($81)
   110 PRINT "010 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   120 A%=$33:OUT $80,A%
   130 B%=IN($81)
   140 PRINT "011 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   150 A%=$83:OUT $80,A%
   160 B%=IN($81)
   170 PRINT "100 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   180 A%=$A3:OUT $80,A%
   190 B%=IN($81)
   200 PRINT "101 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   210 A%=$93:OUT $80,A%
   220 B%=IN($81)
   230 PRINT "110 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   240 A%=$B3:OUT $80,A%
   250 B%=IN($81)
   260 PRINT "111 ",HEX$(A%,2),BI$(A%),HEX$(B%,2),BI$(B%)
   270 PRINT "xxb5b4b3xxx"
   280 A%=$00:OUT $80,A%
   290 C%=IN($82)
   300 PRINT "000 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   310 A%=$40:OUT $80,A%
   320 C%=IN($82)
   330 PRINT "001 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   340 A%=$04:OUT $80,A%
   350 C%=IN($82)
   360 PRINT "010 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   370 A%=$44:OUT $80,A%
   380 C%=IN($82)
   390 PRINT "011 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   400 A%=$08:OUT $80,A%
   410 C%=IN($82)
   420 PRINT "100 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   430 A%=$48:OUT $80,A%
   440 C%=IN($82)
   450 PRINT "101 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   460 A%=$0C:OUT $80,A%
   470 C%=IN($82)
   480 PRINT "110 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   490 A%=$4C:OUT $80,A%
   500 C%=IN($82)
   510 PRINT "111 ",HEX$(A%,2),BI$(A%),HEX$(C%,2),BI$(C%)
   520 PRINT "end"

リストだけを見ると随分手間なことをやっているように思えるかもしれません。
そりゃあ上の各行をいちいち全部入力したりしたら手間でしょう。
そんな面倒なことはしませんです。
最初に雛形になる数行を書いておいて、あとはそのコピーに対して行番号部分と変更が必要な部分のみを書き換えて追加していくという方法で作りましたので、ちょいちょいという感じでできてしまいました。
この作業はND80Z3.5のZB3BASICに標準で備わっているスクリーンエディタを利用すると実に簡単にできてしまいます。
まあ目的によりますけれど、今回のように簡単な出力と入力を得るためのプログラムを書くのでしたら、BASICに勝る言語はないと思います。
そして自画自賛、手前味噌の宣伝ですけれど、
いゃあ、ND80Z3.5って、ほんとうに便利です。

次回に続きます。

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

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