TK80/BSの
シンセシステムを復活/拡張したい〜
その53
SBC8080ボードを使った
TK80BS互換機の拡張I/Fの作製
2020年
6月20日
この日は夕方からガレージに来ました。Ebayで購入したVDPが来ていました。けっこう時間がかかりました。パッケージのデートコードは82年、83年でした。
早速、互換機のVDPボードに挿して動作確認します。動作良好です。
6月21日
先週シンセ用のテンポクロックの周波数が半分になっていた件を修正し
ます。カウンタの分周テーブルを変更して40〜250Hzにしました。プログラムは16ステップシーケンサで中心周波数を決め、ボリュームのADC値でプラスマイナスします。互
換機で使っているPSoCのうち、キーボード変換以外でPSoCのプログラムが動いているのは、このPSoCだけです。他は無限ループしているだけです。
テンポクロック用の16ステップのアナログシーケンサ互換部のカウンタのクリアが同期式で、うまくクリアできない件です。元々は4017を使った10ステップアナログシーケンサ用の信号をTKの8255で作っていました。なので、クリアの時にクロックは出力されません。非同期のクリアがあるカウンタはPSoCには無さそうなので、クリア信号で強制的にクロックを発生させるロジックを追加してみました。合成すると、クロックが非同期になるというワーニングがでます。
上記の強制クロックで正常にクリアされるようになりましたが、偶にステップ数が1つ進まず、マイナス1になるので、クロックも同期化しました。正常に動作するようになりました。
現在、本体は9VのACアダプタ、拡張I/F部は12VのACアダプタに分かれているので、12Vに統一します。本体のリアパネルに12V出力を追加し、両端がジャックの電源ケーブルも作製しました。これで、本体のフロントパネルの電源スイッチで拡張I/Fも連動するようになりました。
互換機本体と拡張I/F部は同じ型番のタカチのカスタムサイズのアルミケースですが、微妙にサイズが異なり、カバーが交換できないことが分かりました。下の切り込みの寸法が12mmと13.5mmで違っています。カバーが入れ替えられませんが、特に問題にはなりません。
SC−01の音声信号を本体側へ送り、TK80上のPC1(ゲーム音)と、PS/2キーボード変換のブザー、SC−01の音声の3音をミックスしてリアスピーカから出力します。
互換機本体、拡張I/Fのリア側です。コネクタやボリュームにラベルを貼ります。本体と拡張I/Fは拡張I/F、ETC、DCの3本のケーブルで接続します。ケーブルは長めに作ってあり、左右にも配置できるようになっています。
拡張I/Fのテンポクロックが動くようになったので、MC80+からのテンポクロックをケーブル上で切断しました。そのままケーブルを接続するとテンポクロックがぶつかります。
Am9511(APU)の先週の続きです。Am9511(APU)をVDPボードに取り付けて動作確認します。7C40と41にマップしたチップセレクトが正常に出ていること、PAUSE信号でCPUにWAITがかかることを確認しました。レジスタのアクセスは簡易ICEからではうまくできないようで、次回、BSモニタからアクセスして確認します。
6月25日
手持ちの古い8080のCコンパイラでAm9511のライブラリを作れないか調べてみます。引数、戻り値がfloatの関数subを作成して、アセンブラのソースを生成してみます。まず、メイン関数です。8080とC言語の相性は良くなく、後ろに##の付いたサブルーチンが多用されています。浮動小数点の定数はコード領域にDB文で埋め込まれています。戻り番地はDB文の後なので内部で調整していることが想像できます。浮動小数点は4バイトのIEEE754ではなく、なぜか10バイト確保されています。定数は80ビット浮動小数点で埋め込まれるようです。
目標はAm9511のライブラリ作成なので、呼ばれる方のsubを確認します。下は何もしないで、引数を戻り値にしている場合です。多用されているDAD SPはHL=HL+SPという命令です。
続いて、2.0をかけて戻る例です。ESHL関数で左へ1回シフトしているようです。
続いて、2.5をかけて戻る例です。コード中にDB文で定義して乗算関数EMULを呼んでいます。
続いて、引数が2つある場合です。引数を加算して戻る例です。加算関数EADDを呼んでいます。
続いて、math.hのsin()を読んだ時です。今までと違うコードになりました。ここまでに出てきた内部関数はPUSHEI(定数のE退避)、ETOF(E−>F)、ETOD(E−>D)、FTOE(F−>E)、PUSHF(Fの退避)、POPF(Fの復帰)、PUSHE(Eの退避)、POPE(Eの復帰)、EMUL(Eの乗算)、EADD(Eの加算)です。リンクして実行コードを生成すれば内部関数の処理は分ります。あくまでも推測ですが、Eが80ビット、Fがfloatの32ビット、sin()の時に出てきたるDがdoubleで64ビット?のサイズと思われます。
6月27日
先週からのAm9511の続きです。PAUSE信号とCPUのREADYIN信号の波形を確認します。
左はPAUSE信号をREADYINに接続しないときのチップセレクト、READYIN、MEMRD信号です。右はPAUSEをREADYINに接続した時のチップセレクト、READYIN、MEMRD信号です。リードサイクルが伸びていることが分ります。
チップセレクトとREADYIN信号をオシロで確認します。READYIN信号はフロッピでも使っているのでワイヤードORになっています。4.7Kのプルアップ抵抗をオープンコレクタでLOWにしているので、立ち上がりが遅いですが、問題なさそうです。
Am9511のレジスタはスタック形式になっているので、モニタのコマンドで確認するのはやめて、アセンブラで簡単なプログラムを作ってBASICからアクセスしてみます。コマンドとしては一番簡単なパイの値をデータレジスタにプッシュするコマンドPUPI(1A)を実行してデータレジスタを読んでみます。何回が実行してみましたが、正しく動作する時とダメな時があることが分かりました。右はデータレジスタの先頭がなぜか1A(10進で26)が出てきますが、その後は正しそうな値が読み込まれています。期待されるデータは02、C9、0F、DAです。
Am9511とフォーマットが少し異なるIEEE754の変換サイトでパイを変換してみます。結果は40、49、0F、DAで、仮数部の後半は似ています。
6月28日
データレジスタをバッファへ連続転送するアセンブラで書いたプログラムを実行すると、PAUSE信号が戻らない不具合が発生しました。下は最後の1バイトの読み込みで止まっています。この時はリセットする以外に復帰させることはできませんでした。
Am9511の2MHzのクロックはPSoCで生成しているので、試しにCPUのクロックを接続してみましが、現象は変わりませんでした。Am9511のアクセスが不安定という感じです。
7月2日
Am9511フォーマットの変換プログラムを作成しました。下がAm9511の32ビット浮動小数点フォーマットです。IEEE754と少し違っています。指数部は7ビットでゲタ無しでー64〜63を表します。仮数部は24ビットです。こちらは1未満の小数点でビット数が違うだけです。
16進文字列から実数の文字列への変換プログラムす。
こちらは実数の文字列から16進文字列の変換です。
Am9511のPUPIコマンドで出力された、02C90FDAを変換してみます。3.1415925で小数点以下6桁まで合っています。続いて、3.1415926を16進に変換してみます。02C90FDAで合っています。
7月4日
先週からの続きのAm9511の不具合です。アクセスが不安定で正しい値が読めたり、読めなかったりします。また、PAUSE信号がアクティブになりっぱなしになることもあります。バスのタイミングは問題なさそうです。データレジスタに特定の値を4バイトを書き込み、その後、読み出しして、ベリファイするプログラムを作成して確認しました。書き込むデータによってエラーが発生します。発生しないデータもあります。PAUSE信号を使わないと即エラーになるので、READY制御は有効になっていることが分かります。色々と試して、回避する条件が分かりました。
先週も行ったCPUの2MHzクロックをAm9511に配線し、かつ、CPUを旧ソ連製?からNEC製に交換すると安定動作するようになりました。左は暫定的にクロックを引き出した所、右は交換したNEC製の8080AFC、下がソ連製の8080です。
テストプログラムを作成してAm9511で計算してみます。はじめはsqrt(2)です。PCのAm9511用の変換プログラムで予め、2.0を16進に変換します。02、80、00、00です。
上で変換した2.0をデータレジスタに書き込み、SQRTコマンドを発行、ステータスレジスタを確認後、結果データを4バイト取り出して、バッファエリアに転送します。アセンブラでプログラムを作成して、HEXファイルを簡易ICEでダウンロードします。
スタックを使うので、BSのモニタから実行しました。簡易ICEで停止させ、バッファエリアの内容を確認します。結果は01、B5、04、F3です。
Am9511用変換プログラムで16進データを実数に変換します。1.4142135...で小数点以下7桁まで合っています。
続いて、sin(π/4)を計算してみます。プログラムはPUPIコマンドでπの値をプッシュ、スタックを1段プッシュ、4.0をデータレジスタにライト、FDIVコマンドでπ/4を計算、続いてSINコマンドを実行、結果をバッファに転送します。下はプログラムの抜粋です。
プログラムを実行後、バッファエリアの内容00、B5、04、F2を変換プログラムで実数に変換します。0.7071067...です。
BCで検算します。0.7071067まで合っています。正しく計算できています。
7月5日
Am9511の恒久対策をします。CPUは元々TK80Eに付いていたヒートシンク付きのNECの8080AFCを使いました。2MHzのクロックは33オームを介してピンヘッダに接続し、本体からミニDINコネクタを介して拡張I/FのAm9511へ送ります。
Am9511が無事動作したので、前から気になっていた、モニタ先頭部の必要の無い所へのベクタを書き込みを修正します。赤枠内が13FDと20D8に割り込みベクタを書き込んでいる部分です。
互換機のモニタの入っているUV−EPROMをROMライタで読み込みます。
ROMライタのメモリエディタでベクタを書き込んでいる部分を直接変更してます。
新しいROMに書き込み、簡易ICEで逆アセンブラで確認します。2か所の書き込みをスキップして、間はNOPで埋めておきます。
MC80+互換部の8x9ドットLEDが少し明るいので、制限抵抗を大きくしました。
VDPは高温になるのでヒートシンクを取り付けました。2006年?に買った熱伝導性のエポキシ接着剤を使いましたが、冷蔵庫に保管しておいたので、まだ使えました。
Am9511にもヒートシンクを取付けました。拡張I/Fのカバーは空気の通る穴を開けた方が良さそうです。
拡張I/F部の動作確認を行いました。シンセ、フロッピ、Am9511、VDP、SC−01、パネル表示の動作良好です。
ハードウェアはこれでほぼ完成しました。ブロック図を更新しました。電源投入と同時にSC−01が連続音を発音してまうので、初期化プログラムをモニタに組み込みたいです。