TK80/BSの
シンセシステムを復活/拡張したい〜
その46
SBC8080ボードを使った
TK80BS互換機の作製
TK80BSの修理
2019年
12月28日
TK80BS互換機の続きです。PSoC 5LPを使ったPS/2−>パラレルASCII変換はキーを連続入力していると、途中で動作不良になります。PS/2の同期シリアルのノイズが原因のようで、単独で動作させている時よりFPGAボードに接続した方が不具合が多く出ます。下は’2’を連続で押していますが、途中で’U’に化けています。
プルアップ抵抗を低くしましたが、効果はありませんでした。そこでクロックとデータをプルアップした後で74HC14(シュミット入力)で受けてから、PSoCに入力したところ、不具合が起きなくなりました。クロックのノイズが原因でPSoCのSPISが誤動作してたようです。かなり長い間、連続入力しても正常動作するようになりました。
12月29日
追加で購入したテンキー無し、USBとPS/2兼用キーボードです。本家BSもPS/2キーに変える予定です。
こちらはマルツと秋月で購入した部品です。別プロジェクト用です。
74HC14を載せた子基板です。PSoCに亀の子で接続します。
上記のPSoC 5LPで作ったASCII変換ボードをTK80BS互換機に接続して動作確認を行います。動作良好です。3つある不具合の1つ目が解消しました。
12月30日
2番目の不具合です。FPGA内に実装したVRAMのデータが勝手に書き換わります。ザイリンクスのブロックRAMを使用したDPMのIPですが、今までに分かったことを箇条書きにしてみます。
・外部から8080側のライト信号を禁止しても、不正書込みが起こる。
・ブロックRAMを使った、素のHDLで書いたDPMでも不正書込みが起こる。
・簡易ICEでCPUの動作を止めていると不正書込みは起きない。
・簡易ICEでVRAMをアクセスしても不正書込みは起きない。
・FPGAの前段に付いているレベル変換のアドレスバッファをディゼーブルにすると不正書込みは起きない。
結論:CPU側のアドレスバスが高速に動くと、DPMの内容が不正に書き変ってしまう、と言うことのようです。ザイリンクスのIPには分散RAM(LUT)を使ったDPMもあり、同じ仕様のVRAMを作成してみます。バス幅は8ビット、メモリ長は512に設定し、DPMを選びます。
アドレス、データともレジスタ無しに設定します。
以前と同じ初期化ファイルで初期化します。
分散RAMを使った新しいVRAMでは不正な書き込みは発生しなくなりました。下は数10分経過した状態です。動作良好です。
不具合の出ていた、以前のVRAMです。画面の下側にデータを書くと、パラパラと周辺が勝手に書き変わっていました。
3番
目の不具合はFPGA内に実装した8255のモード1を使った、キー入力が10〜20回に1回くらいの割合で、無反応になるというものです。8255のソースはGitHubにあったものですが、IBF(ACK)に関係する信号を外部に引き出し、ロジアナで確認します。下は正常に動作してIBF(ACK)が正しく出力されているときです。
続いて、動作不良でIBF(ACK)が出力されないときです。IBFをポーリングしてキー入力タイミングを判定してるCPU側はキー入力が検出できません。これがキーが無反応になる原因です。
8255のロジックを確認したところ、外部から入力されるSTB−信号の立下り検出が1段FFで判定されていて、クロックとSTB−のタイミングによっては、検出に失敗す
ることが分かりました。FFを2段にして、正しく動作するようになりました。赤枠が追加した2段目のFFで赤下線が2段目を条件に変更した立下り検出で
す。
FFを2段にしたことで、必ず1クロック分のタイミングが確保でき、STB−信号の立下り検出が正しくできるようになりました。
年内に3つの不具合が解消できてよ良かったです(笑)。続いて、FPGAのロジックにキャラクタジェネレータのモード切替を追加しました。キャラクタジェネレータはJISとASCIIモードの2つがあり、BS内の8255で切り替えます。修正後、ポートをアクセスしてASCIIモードに変更してみます。アルファベットが小文字に変化すれば成功です。
12月31日
本家のTK80BSの上位12Kバイトメモリを62256を使って作り直します。アドレスはA000〜CFFFです。手持ちの74ALS138と74ALS20でアドレスデコーダを作りました。本家のTK80BSで動作確認するのは、分解が面倒なので、SBC8080のバスに接続する拡張ボードを作成し、エッジコネクタに配線します。
FPGAボード、メモリボードを外し、CPUと簡易ICEのみにして、メモリボードの動作確認します。動作良好です。
2020年
1月1日
お正月です。本家のTK80BSは11月頃ろから、調子が悪くなっていました。本体単体で簡易ICEを使って確認します。電源投入時にF000から始まるモニタ領域が00に化けています。時間が経つと、だんだん良くなってきます。
続いて、拡張ボードも接続して確認します。拡張ボードを接続すると、0000〜00FF番地のベクタとフロッピ用IPLが化けて見えなくなります。また、下位の5800番地付近のRAMのメモリエラーも発生しています。
1月2日
5800番地にある6116のRAMを一度ソケットから外して、挿し直して復活しました。ソケットの接触不良が原因と思われます。
0000〜00FF番地のベクタとIPLが見えなくなる件は、赤枠のTK80から引き出した0000〜00FF番地のROMのCS−信号がボードから外れているのが原因でした。
一度、全部分解してTK80を取り出し、外れたCS−信号を半田付けし直します。
上位の12Kバイトメモリボードは62256を使って新規に作成したボードに交換します。
電源投入時にF000から始まるモニタ領域が00に化ける以外の不具合は無くなりました。簡易ICEのチェックサムを計算するCSコマンドでモニタ領域が正しく見えていることを確認すれば、その後システムは正常動作します。フロッピも動作良好です。
1月3日
本家が復活したので、簡易ICE経由でプログラムを互換機にロードして動作確認します。
本家からLevel−2のBASICの平安京エイリアンと機械語のサウンドルーチンを簡易ICEでインテルHEX形式でセーブし、TK80BS互換機にロードして実行します。まだ、音は出ませんが、その他は動作良好です。
元ネタは1980年2月号のI/O誌です。大体40年前です(笑)。
本家TK80BS用のキーボードもPS/2キーに変更します。PSoC用の74HC14のシュミットバッファボードをもう一つ作製しました。
1月5日
ゲーム音やテレタイプを出力するには、TK80に載っているI/Oマップの8255が必要です。FPGAロジックにもう一つ8255を実装します。TK80に載っている8255はフルでコードされておらず、A2をCS−に接続するロジックにします。無事、ゲーム音が出るようになったので、動画を撮ってみました。モアレが出ないグリーンモニタを使います。クリックすると、約7Mバイトのmp4をダウンロードします。
TK80BS互換機にシンセやフロッピを接続する、拡張ボード用I/Fボードを作製します。アドレスとデータのバッファが載っているだけのボードです。データバスの選択信号はFPGAで生成します。
拡張ボードとの接続は40ピンのピンヘッダですが、ピン配置図が無く、制御線の一部が行き先不明です。本家のI/Fボードからピン配置を調査中です。
1月11日
F000から始まるモニタ領域が電源投入時に00で、だんだん良くなる不具合です。パーツBOXにTI社のTMS2532の手持ちがありました。これはモニタROMやBASICの入っているマスクROMのuPD2332互換のUVEPROMです。
イレーザで消してから、ROMライタでモニタプログラムを書き込んでみます。
メーカにTIを選ぶと、2532が選べて、書き込めます。
2732へ変換するアダプタを介して確認します。今まで、2332を読む時に、このアダプタを使っていたので、2332とピン互換で間違いないです。
早速、モニタROMを交換します。筐体から基板を取り出さなくても、TK80とBS間のマザーを外すと、モニタROMが交換できます。ピンセットで2332を抜いて、新しくモニタを書き込んだ2532を実装します。
電源を投入後、簡易ICEでモニタROMの先頭をダンプし、チェックサムを計算すると、正しく読めていることが確認できました。やはりモニタ用の2332マスクROMは壊れているようです。
壊れたと思われる、モニタROMをROMライタで読んでみます。
交換したROMです。先頭のみF3になっていて、他は00です。
以前に調子が悪くなった方のROMです。アドレス不良なのか、データが重複しています。40年以上昔のデバイスなので、文句は言えないですが。
秋月で購入した部品が届きました。TK80BS互換機のFPGAボード用の9VのACアダプタと5V降圧電源ユニットです。右は予備のPSoCとUSBのAコネクタです。
5Vの降圧電源は端子台とポテンショを半田付けして電圧を調整します。
新しい電源でTK80BS互換機の動作確認します。9VはFPGAボードへ、5VはSBC8080ボードへ接続します。動作良好です。
1月12日
PSoC 5LPを使ったPS/2−>パラレルASCII変換に抹消キーを対応させたところ、なぜかカタカナの’マ’が表示されます。デバッグコードを組み込んで、8F、9F、AF、BF、CF、DFのキーコードを出力すると、以下のような表示になりました。8Fと9Fがキーコード表と合っていません。
BSのマニュアルのキーコード表です。抹消のコードは8Fにマップされていますが、ちょっと違和感があります。ASCIIコードではDELが7Fですが、もしかして誤植?試しに7Fに変更したところ抹消の1行削除の動作になりました。キーコード表の間違いでした。そうすると、8Fと9Fはマップされていないはずですが、なぜか8xはCxと、9xはDxと同じ表示になるようです。
続いて、BREAKキーを実装します。まず、本家のBSで波形を確認します。キーボード側に載っている74LS74(D−FF)のQ端子からINT信号を出力された後、約30uSec後にD−FFをクリアするパルスがBS側から出力されます。
クリアパルスの幅は約9.3uSecで、BSのモニタの割り込みルーチンの先頭で8255のポートC6で作っていると思われます。
クリアパルスを出力している割り込みハンドラの先頭部分の逆アセンブルリストです。ポートCのビットセット/リセットを使ってパルスを出力しています。
とりあえず、ESCキーが押されたら、100uSecのINTパルスを出力してみます。
BASICのL1の動作確認も兼ねて動画を撮りました。BASICのL1の時計プログラム実行中にESCキーを押して確認します。モニタの割り込みモードになった後、リターンキーで復帰することを確認しました。動作出来たので、この後、PSoC側にD−FFを実装してクリアパルスでクリアするように変更予定です。クリックすると約4Mバイトのmpgをダウンロードします。
本家BS用に使用するPSoCのPS/2−>パラレルASCII変換のベースボードを作製しました。直接USBコネクタで接続できるように、USB−Aコネクタを実装します。また、プラスチックケースを加工して、仮り組みしました。
1月13日
BSのマニュアルの4穴ファイルが壊れました。40年も経ちビニールが硬くなっていると思います。
100均の2穴ファイルのポリプロピレンシートを使って4穴ファイルを補修しました。シートを金具と共締めして、外れた方をネジで固定しました。
PS/2キーボードはUSB−>PS/2の変換アダプタを使わなくても良いようにUSBから直接PSoCに接続するケーブルを作製しました。
1月14日
互換機はケースに入れる予定です。本家BSに習って、パネルにアドレスとデータ表示のLEDを付ける予定です。LEDドライバボードを作製しました。LED側は34ピンのヘッダを使います。
LEDバッファボードは拡張ボード用I/Fボードと似ています。制御線のバッファが無いだけです。
本家BSの総合動作確認を行いました。リセットでモニタが起動し、簡易ICE、フロッピ、シンセとも動作良好です。
本家BS用のPSoCのPS/2キーボード変換ボードの動作確認をします。本家用のIO電圧は5Vのままの接続すればいいので簡単です。アナログディスカバリのロジアナでパラレル出力にASCIIコードが出力されていることを確認しました。
本家BSに接続してみます。STB−信号だけでは動作せず、正論理のSTBも必要でした。互換機用ではLEDを点灯させていた、正論理のSTB信号をコネクタに接続するとキー入力が出来るようになりました。ただ電源投入時に無効な1文字入力されます。
現在の互換機のブロック図を更新しました。FPGA内のグレーの破線は未実装のテープI/Fの8251です。外部の破線がフロッピなどを接続する拡張I/Fです。
割り込みハンドラを調べていて気が付いた、モニタ先頭の割り込みベクタを設定している部分です。なぜか13DFと20D8番地にも割り込みベクタに飛ぶC3、25、F1を書いています。1xxx番地はμ−DOS、2xxx番地はシンセのデータ入力プログラムがある所ですが、後で詳しく調べてみます。