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