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

ワンボードマイコンをつくろう!(パソコンの原点はここから始まった) TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます

[第135回]


●ND80ZVをBSに接続する(5)

前回の続きです。

キーボードからのデータは8255のポートAに入っているのは間違いありません。
その8255はモード1を使っているらしいということは、M様からの情報で、それもまず間違いないと思います。
ポートAにキー入力データが入っているにもかかわらず、PC5がHにならないということから、当初私は8255のモード設定に失敗しているのではないか、と考えました。

なにしろTK−80BSが発売されたのは30年以上も前(1977年?)のことです。
8255に関するWEBでの情報によりますと、初期の8255は8080専用で、8085やZ80には合わなかったために、後にその点を改良した8255Aが作られた、とあります。
そういうことならば、ND80ZVのクロックを落としても駄目である可能性があります。
そこでM様には、BSの8255の末尾にAがついているかどうかを確認していただくようにメールをいたしました。

しかしその後にIntelの古いデータブック(8080ファミリー)で確認しましたところ、WEBでの情報にあるような意味では、8085はどうだか知りませんが、ことZ80に限っては、別に8255でも構わないはずだということがわかりました。
すると、M様がTK80BSに接続されているND80ZVは、改造によりクロックが1.5MHzにまで落ちているわけですから、いくら初期の8255だとしても、モード設定でこけるということはちょっと考えられないことになります。

一体どういうことなのでしょうか?

それにしても、もしできることならば、BS上の8255をND80ZVの82C55−2と交換してみれば、原因は不明ながら、問題は解決するかもしれません。
そうは思ったのですが、多分BS上の8255は基板に直接ハンダ付けされているだろうから、それを交換するのは無理と思い、その考えはM様には伝えませんでした。

ところが、どうやらBSの8255はICソケットを使用していたようです。
M様からは次のようなメールが届きました。

1)BSの8255は「D8255C」でした(Aがありませんから、やはり改良前の製品のようです)。
2)手持ちのD8255AC−5と交換しましたが症状は同じでした。
3)たまたまTMP82C55AP−2を持っていたのでそれと交換してみたところ、プロンプトマークが高速で点滅し、たとえば[B]をキー入力すると、画面にBが勝手に次々に表示されていき、次に[A]を入力すると、今度はAが次々に表示されていきます。
4)ND80ZVの82C55と交換してみたところ、キーを入力しない状態ではすぐにスクロール状態になり(スペースが入力される?)、キー入力をすると、3)と同じ状態になります。

うーん。
これは、全く謎です。
正直言って、よくわかりません。
どうも何かまだTK−80を接続したときにBSとつながっていた信号で、ND80ZVでは接続されていないものがあるような気もします。
しかし、たとえそうだとしても、どうすると上のような現象がおきるのか、ちょっと納得がいきません。

キーボードからのデータが読めていることからすると、キーボード回路と8255との間のコミュニケーションは成立しているように思われます。
しかし一方でPC5がHにならないことからは、モード1でのコミュニケーションは失敗していることになります。
さらに、NMOSの8255ではPC5が読めない(=L)らしいのに、CMOSの82C55ではPC5がHになりっばなしのようです(しかしそれならキーボード回路は次のキーデータは出力してこないのでは?)。

実際に実物にさわってみればわかるとは思うのですが…。

●ND80ZVでD8255AC−5をテストする

おお。
そういえば。
さすがに8255は持っていませんが、D8255AC−5なら、確か在庫が若干はあったはず。

それなら、そのD8255AC−5をND80ZVに実装して、モード1でどうなるか、実験してみることができます。
もっともND80ZVの8255回路はメモリマップではなくて、IOマップなので、条件は同じではありませんが。

しかし私のND80ZVのCPUクロックは6MHzのままですから、それでもし動けば、1.5MHzのメモリマップモードでのアクセスタイミングよりもはるかに厳しいはず。

ということで、さっそく実験をしてみました。

このところ書いておりますように、新しい企画のための予備作業で毎日大変なのですけれど、やっと少し先が見えるところまで来ましたし、8255のモード1については今まで余り馴染みがありませんでしたから、こういう機会に確認しておくと、将来何か役に立つかもしれません。

そうは言っても、余り時間をかけてはおれません。
即席でテスト回路を作ることにしました。

最初はND80ZVの8255にもう1枚別のCPU回路からデータを送ることを考えたのですが、前回お見せしました8255のデータシートのモード1の説明図を眺めていましたら、よいことを思いつきました。

8255のモード1には出力と入力があって、しかもグループAとグループBは独立して扱えるとのことです。
それなら、ND80ZVに実装したD8255AC−5をグループAはモード1の入力にして、グループBをモード1の出力にして、ポートBとポートAをつないで、BからAにデータを送ることができるのではないか?

前回お見せした8255のデータシートの説明はモード1の入力についてのものでした。
前に戻って見ていただくのも面倒でしょうから、再掲いたします。







そして、こちらがモード1の出力です。





グループBのOBF(PC1OUT)とACK(PC2IN)をグループAのSTB(PC4IN)とIBF(PC5OUT)にそれぞれ接続すればよいように思えますが、残念なことにACK(PC2IN)とIBF(PC5OUT)は論理が逆になっています。
8255を送信と受信の双方でモード1で使う、という場合も当然出てくるはずですから、それなら論理もちゃんと一致させてくれればよかったのに…。
8255の設計者はそこまで考えなかったのでしょうか。

で。
こういう回路になりました。



74HC04を1ゲート使うだけで、あとはケーブルの結線だけですから、こういう手抜き作業です。

74HC04の部分を拡大しました。

CMOSは未使用入力端子をオープンにしておくのは厳禁です。
面倒ですが仕方がありません。
残りの未使用ゲートの入力は全てGNDにつなぎました。

ND80ZVの8255用コネクタに接続しました。

シャッタースピードが速かったのでLEDが一部しか点灯していないように見えます。

8255の実装部分です。
ND80ZVは本来はCMOSの82C55−2を実装しているのですが、今回はD8255AC−5を実装してのテストです。


テストプログラムは即席で作りました。
こういうときはBASICが簡単で重宝します。
プログラムの入力から実行するまでのログファイルです。
グループAをモード1入力、グループBをモード1出力にモード設定するためのコントロールワードは、BC(またはB4、BD、B5)です。

logfile nd80zlog\01082159.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>10out $83,$bc
>20for a%=0 to 255
>30out $81,a%
>40if and(in($82),$20)=0 goto 40
>50b%=in($80)
>35p.a%;",";
>55p.b%;" ";
>60next a%
>.
    10 OUT $83,$BC
    20 FOR A%=0 TO 255
    30 OUT $81,A%
    35 PRINT A%;",";
    40 IF AND(IN($82),$20)=0 GOTO 40
    50 B%=IN($80)
    55 PRINT B%;" ";
    60 NEXT A%
>r.
0,0 1,1 2,2 3,3 4,4 5,5 6,6 7,7 8,8 9,9 10,10 11,11 12,12 13,13 14,14 15,15 16,16 1
7,17 18,18 19,19 20,20 21,21 22,22 23,23 24,24 25,25 26,26 27,27 28,28 29,29 
30,30 31,31 32,32 33,33 34,34 35,35 36,36 37,37 38,38 39,39 40,40 41,41 42,42 43
,43 44,44 45,45 46,46 47,47 48,48 49,49 50,50 51,51 52,52 53,53 54,54 55,55 56,5
6 57,57 58,58 59,59 60,60 61,61 62,62 63,63 64,64 65,65 66,66 67,67 68,68 69,69 
70,70 71,71 72,72 73,73 74,74 75,75 76,76 77,77 78,78 79,79 80,80 81,81 82,82 83
,83 84,84 85,85 86,86 87,87 88,88 89,89 90,90 91,91 92,92 93,93 94,94 95,95 96,9
6 97,97 98,98 99,99 100,100 101,101 102,102 103,103 104,104 105,105 106,106 107,
107 108,108 109,109 110,110 111,111 112,112 113,113 114,114 115,115 116,116 117,
117 118,118 119,119 120,120 121,121 122,122 123,123 124,124 125,125 126,126 127,
127 128,128 129,129 130,130 131,131 132,132 133,133 134,134 135,135 136,136 137,
137 138,138 139,139 140,140 141,141 142,142 143,143 144,144 145,145 146,146 147,
147 148,148 149,149 150,150 151,151 152,152 153,153 154,154 155,155 156,156 157,
157 158,158 159,159 160,160 161,161 162,162 163,163 164,164 165,165 166,166 167,
167 168,168 169,169 170,170 171,171 172,172 173,173 174,174 175,175 176,176 177,
177 178,178 179,179 180,180 181,181 182,182 183,183 184,184 185,185 186,186 187,
187 188,188 189,189 190,190 191,191 192,192 193,193 194,194 195,195 196,196 197,
197 198,198 199,199 200,200 201,201 202,202 203,203 204,204 205,205 206,206 207,
207 208,208 209,209 210,210 211,211 212,212 213,213 214,214 215,215 216,216 217,
217 218,218 219,219 220,220 221,221 222,222 223,223 224,224 225,225 226,226 227,
227 228,228 229,229 230,230 231,231 232,232 233,233 234,234 235,235 236,236 237,
237 238,238 239,239 240,240 241,241 242,242 243,243 244,244 245,245 246,246 247,
247 248,248 249,249 250,250 251,251 252,252 253,253 254,254 255,255 
>list
    10 OUT $83,$BC
    20 FOR A%=0 TO 255
    30 OUT $81,A%
    35 PRINT A%;",";
    40 IF AND(IN($82),$20)=0 GOTO 40
    50 B%=IN($80)
    55 PRINT B%;" ";
    60 NEXT A%
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sun Jan 08 22:06:45 2012

おお。
全く問題無く動きました。
CPUクロック6MHzでも、ご覧の通りです。
あ。
こちらは実行中の画面です。


しかしまさかPC5がHになりっぱなし、なのでは…。
ちょっと気になりましたので、オシロで確認をしてみました。


上がPC4(STB)で下はPC5(IBF)です。
おお。
PC5はちゃんとLとHが出ています。
しかし。
PC4がHになりっぱなしなのでは?

そんなことはありませんでした。

時間軸を拡大してみましたら、PC4にも信号がありそうです。

そうですよねえ。
PC4の入力がトリガになって、PC5が出力されるはずなのですから。

うむむ。
しかし。
これじゃあちょっとよくわからんではありませんか。
BASICは便利なのですけれど、実行速度が遅いのが難点です。

結局覚悟を決めて、機械語でプログラムを書きました。
といっても、アセンブラですけれど。
PC4のLの期間がかなり幅の狭いパルスのようなので、機械語のプログラムはできるだけ間をつめるようにするために、入力、出力は機械的にOUT、INするだけにしました。

2012/1/8  23:7  mode1tst.txt
END=8015
              ;8255 mode1 test
              ;12/1/8
              ;
              	ORG $8004
8004 3EBC     	LD A,BC
8006 D383     	OUT (83),A
8008 D381     LOOP1:OUT (81),A
800A DB82     LOOP2:IN A,(82)
800C E620     	AND 20
800E CA0A80   	JP Z,LOOP2
8011 DB80     	IN A,(80)
8013 C30880   	JP LOOP1
              ;END
              
LOOP1        =8008  LOOP2        =800A  

これが実行結果です。
これでも、まだPC4のパルスは松葉のようにしか見えません。



もう少し拡大してみました。


PC4(STB)パルスが入力されて、PC5(IBF)が立ち上がる様子がわかります。

この実験によって、D8255AC−5はND80ZV(クロック6MHz)でも、ちゃんとモード1でデータを受取れるということが確認できました。
とすると。
BSと接続したND80ZVでは、なぜモード1でうまくデータが受取れないのか?
現時点では全く謎です。

M様は、BSの回路を徹底して解明すべく努力してみえるとのことです。
そのうち何か手がかりをつかまれるかも知れません。
朗報に期待いたしましょう。
あ。
読者の皆様で、何か情報をお持ちの方がいらっしゃいましたら、ぜひご一報いただきますようお願いいたします。

[2016.4.10注記]
ND80ZVをご購入いただいたお客様からこのページの記述が間違っているのではありませんか?というメールをいただきました。
確認してみましたところ、ご指摘いただいた通り、記述が間違っていました。
オシロスコープで信号を確認するところの説明で、上側の信号をPC2(STB)としていましたが、ご指摘の通り、PC4(STB)の間違いでした。
そのあとずっと終わりまでPC2と書いていましたが、完全に思い違いをしたまま書いてしまったようです。
さっそく訂正をいたしました。
現在のページは訂正済みです。
ご指摘いただいた長野県のY様、ご協力有難うございました。
今後ともよろしくお願いいたします。

ワンボードマイコンをつくろう![第135回]
2012.1.9upload
2016.4.10注記

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