TK80/BSの
シンセシステムを復活/拡張したい〜
その47
SBC8080ボードを使った
TK80BS互換機の作製
2020年
1月18日
秋月で購入したTK80BS互換機の部品が届きました。2WのD級アンプとパネル取り付け用の部品です。DCジャック、RCAコネクタ、3.5mmジャック、USB−Aコネクタなどです。互換機をケースに入れるときに使う部品です。
ゲーム音用のD級アンプはスピーカの後ろに両面テープで取り付けました。ボリュームを取り付けて、動作確認を行いました。
Vivadoの調子が悪いです。ログ上ではプログラムが終了しているのに、ウインドの右上の矢印が回って、終了する気配がありません。以前にも何度か同じ現象が起きたのですが、そのときはVivadoの再起動で復活していましたが、今回はPCを再起動しても直りません。この日はこのトラブルでほとんど作業ができませんでした。
1月19日
Vivadoの不具合ですが、BIOSでハイパースレッドをディゼーブルにしたところ、直りました。さくさくコンパイルできます。先週まで動作良好だったので不思議です。
Vivadoの調子が戻ったので、8251を使ってテープI/Fを実装します。GitHubから探してここが見つかりました。de0_uart.vが”simplified 8251”となっています。ボーレートを1200bps、ストップビットを2に設定しました。モニタのSTコマンドを使って動作確認しましたが、シリアル出力が始まりません。
verilogのロジックを確認したところ、ステータスレジスタのビット定義がオリジナルの8251と異なっていました。8251のデータシートを参考に下のように変更しました。8251のデータシートはここにあります。
ステータスレジスタを修正するとSTコマンドが動作するようになりました。このコマンドはシリアルポートにインテルHEX形式でデータが出力され、同時に画面にも表示されます。
テープI/Fといっても変調/復調回路は無く、TTLレベルのUARTです。TeraTermで受信します。表示されたインテルHEXをテキストにコピーして、HEXファイルにします。
今度はHEXファイルをLTコマンドで読み込んでみます。TeraTermのファイル転送を使います。
即、リードエラーになりまた。何十年かぶりに、この悪夢の”テープ リード エラー”のメッセージを見ました(笑)。STコマンドをテープレコーダに録音した時と、データをファイル転送した場合では文字間の遅延時間が異なるため、エラーになっていると思われます。TeraTermのシリアルポートの設定で送信時のバイ
ト毎のディレイ(30mSec)と改行時のディレイ(30mSec)を設定すると、読み込みに成功しました。
しかし、長いデータでは途中でエラーとなりました。TeraTerm側のディレイ値を大きくしても、エラーは無くならないので、別の原因と思われます。継続して調査します。
続
いて、キーボードのBREAKキーの続きです。先週はBREAKキーが押されたら単にINTパルスを出すだけでしたが、本家と同じく、D−FFを使って割り込み
のクリアを行ってみます。PSoC内にD−FFを実装して、BSからのパルスでクリアするように変更しました。動作確認をすると、制御レジスタからのBREAKは出ているのにINTが出ません。D−FFの仕様を確認するとCLR端子は正論理でした。
CLR端子のインバータを削除して、以下のように修正しました。D−FFからINTが出るようになりました。
割
り込みルーチンの先頭でポートCの6ビットでクリアパルスが出力されるはずですが、出力されていませんでした。8255のロジックを確認すると、モード1の
ポートAが入力の時にポートCの上位の設定が出力に設定されず、入力のままとなっていました。赤枠のように修正しました。
修正後、割込から約30uSec後にクリアパルスが正常に出るようになりました。
クリアパルスの幅は約9uSecです。
PSoCのIO電源はVDDIO2のみ3.3Vに改造してあるので、赤枠のみFPGAに接続できます。INT出力とクリア入力はP12の4と5に変更しました。
1月25日
デジカメを変更しました。2003年ころに買ったDSC−F828からハンディカムに変えました。DSC−F828は動画がVGAしか撮れないので、流石に古いです(笑)。
PSoC5LPのPS/2キーボード変換にヒストリ機能を実装します。Bashを参考に、Ctrl−pとCtrl−nで過去に入力したキー入力を引き戻せるようにします。
1月26日
完成したヒストリ機能の動作確認を行います。2つのコマンドを入力した後で〜
Ctrl−n入力でヒストリを進みます。”:01”はヒストリ番号です。
Ctrl−pで戻ります。”:00”はヒストリ番号です。
エンターキーでヒストリ番号が消え、もう一度エンターキーで実行されます。赤枠が引き戻したコマンドです。この時バックスペースを使って入力を変更できます。使える制御コードが抹消とバックスペースのみなので、ヒストリのリスト表示などはできません。
TK80BS
互換機用のアルミケースを購入しました。タカチのフリーサイズのアルミケースです。サイズは1mm単位で指定可能です。互換機のボードは90度左に回転させて
組込みます。フロントパネルが単体にならないので、レーザー刻印は使えません。コーナーに弾力性のあるガード兼足が付いています。
先週のテープI/Fのロード時のエラーの続きです。セーブとロードの転送速度を確認しておきます。はじめにセーブ時(互換機−>PC)のタイミングです。9ビットで7.523mSecです。
セーブ時の転送速度は1196bpsです。
続いて、ロード時(PC−>互換機)のタイミングです。9ビットで7.427mSecです。
ロード時の転送速度は1212bpsです。セーブとロードの誤差は98.7%で、調歩式は4%くらいまで許容するので問題無いです。
モニタの逆アセンブルリストでテープリードエラーを出すコードを確認します。ステータスレジスタを回転させてキャリーにフラグを出して確認しています。
8251
のステータスレジスタを確認します。オーバランとフレーミングエラーが起きた時にエラーとなっています。どちらが起きたかは現状では判定不可能です。モニタをRAM上で実行させられれば、RST命令を入れて判
定可能です。FPGAのロジックを再確認します。
本家のBSのキーボードもPSoC5LPを使って、ヒストリ機能が使えるようにしました。
2月1日
TK80BS
互換機の8251のテープインターフェースのリードエラーの続きです。モニタROMをRAMにマップすることにより、RST7命令でプログラムをリアルタイ
ムで停止できます。FPGAのROMとRAMの選択ロジックを修正して、FPGAボード上のスライドスイッチでモニタエリアをROM/RAMに切り替えられるようにしました。
モニタをROMで起動し、モニタ全体のF000〜FFFFを例えば9000にムーブした後、RAMに切り替えて、再度9000〜9FFFをF000にムーブすれば、その後はモニタがRAMでが動作します。停止したいアドレスのコードをRST7(FF)にすれば、ソフトウェア割り込みが発生して、モニタの管理下で停止します。
RAMに変更後は任意の命令に変更可能なので、テープのリードプログラムを修正して、フレーミングエラーとオーバーランエラーの分岐先を変えて、その先のコードをRST7(FF)にします。
ASCIIの’0’のみのHEXファイルを作成してLTコマンドでテストします。複数回、8009番地の表示で停止しました。これは8008番地のRST7の次の番地を表していて、この番地はフレーミングエラーが発生した時です。
2月2日
リードエラーの原因はフレーミングエラーと分かったので、関係していそうな8251ロジックの内部信号をFPGAの外に出して、アナログディスカバリのロジアナで確認します。
下はエラー無しの時の波形で、ステータスレジスタをポーリングし、受信データがあればデータをリードし、D_READYが下がっています。
下はエラーの時の波形です。ロジアナのトリガはオーバーランですが、エラーの発生は1つ前のリードです。エラー発生で受信データのリードを行わないので8251_CSが出ていません。
上記を拡大してみます。D_READYもデータレジスタのリードで0に戻るので、クリアされず1のままです。
その後の1バイト転送でオーバーランが立ち、ロジアナのトリガが成立しています。フレーミン
グエラーの元になるD_FRAME信号は10ピット(スタートビット:1、データ:8、ストップビット:1の合計10ビット)読んだと
ころで0になっていて、フレーミン
グエラーは発生していません。
ROMライタ用のノートPCをネット通販で購入しました。今使っているXPのノートが最近立ち上がらない時があり、シリアルポートの付いている中古を探しました。HPのビジネスモデルのようで、テンキーが付いています。キートップは結構剥がれていて、バッテリも完全に充電不可です。
Win7の32ビットです。メモリ4G、ディスク320Gです。1万2千円でした。交換用のキーボードとバッテリはヤフオクで発注済みです。
こちらは、TK80BS互換機のパネルのレタリング用シールシートです。A4サイズのつや消し透明のレーザプリンタ用です。
互換機をケースに入れる時に使う、ボードガイドを作製します。アクリル棒にフライス盤で2mmの溝を入れます。6個作製しました。
アクリル棒は以前に産業廃棄物で捨てられていた部品で、コの字部分を切り取って、棒状にしました。
テー
プリードエラーの続きです。8251がフレーミン
グエラーになるのはロジックの不具合ではなさそうなので、他の部分のロジックを再確認したところ、データバス出力の条件がアドレスのみになっていて、肝心のところがコメントに落ちていました。これを修正したところ、正常動作するようになりました。平安京エイリアン
(8800〜9b2f番地)もTaraTermからエラー無しでロード可能になりました。ただ、画面のスクロールに35mSec程度掛かっているので、TeraTermの
1文字送信間隔も35mSecに設定する必要があり、セーブ時に比べて、かなり遅いです。
テー
プのHEXファイルは途中に改行が入っていても普通に読めることが分かりました。TeraTermの1文字送信時の待ち
時間設定を1mSecにして、改行時を35mSecにすると、かなり高速化できます。次回、2400/4800bpsも動作確認してみます。
現状のブロック図です。このうち、完成していないのはグレー破線の拡張インターフェース部のみです。