TK80/BSの
シンセシステムを復活/拡張したい〜
その56
互換機の設置、テレタイプの紙テープ、
SC−01チップ購入など
2020年
8月15日
モノタロウで購入したシンセ接続用の34芯のフラットケーブルと30ピンのレセプタクルです。右はついでに購入した照光スイッチの電球互換のLEDです。価格は結構高く、1個500円くらいします。本家TK80BSの電源を交換したために6.3VのAC出力が無くなりました。5Vの電球互換のLEDです。色はアンバを選びました。
照光スイッチの電球をLEDに交換して、点灯確認をすると2つの内、1つしか点灯しませんでした。電球互換用のLEDですが極性があり、そのままでは点灯しない場合もあります。
点灯しないLEDの配線は入れ替えて、点灯するようにします。リセットスイッチは押した時のみ点灯します。
Ebayで購入したテレタイプ用の5単位の紙テープです。70〜80年の旧ソ連製とのことで、ラトビアから届きました。
テレタイプ用なので、コアのサイズも合っています。右の白テープは日本製で8単位用を幅を狭くして使用してます。新しいテープにテストパンチしてみました。矢印がないのが残念です。
互換機とシンセ間を繋ぐフラットケーブルを作製します。長さは1.5mにして、両端にコネクタを圧接しました。
早速、新しく作製したフラットケーブルで動作確認しました。動作良好です。
拡張I/FのシンセのLED表示に不具合が見つかりました。赤枠の8チャンネルのゲートが点灯しない時があります。本家のMC80+では正しく表示しているので、新しく作製したケーブルとは無関係です。簡易ICEのポートアクセスでは問題ないので、以前にもあったタイミングの不具合です。
8月16日
近所のホームセンタでTK80BS互換機を置くワイヤラックを購入して設置しました。今まで使っていたラックは後ろに写っているプリンタ台にしました。互換機の下はFPGAシンセのパラメータ設定器を置きました。
LED表示のゲートのLEDの不具合はPSoCで駆動しているダイナミック点灯LEDドライブ回路のデータ/アドレスの同期クロックを100KHzから1MHzに変更したところ直りました。
フロッピエミュレータの赤と青のLEDが他とLEDと比べて明るいです。
フロッピエミュレータをケースから外して、LEDの電流制限抵抗を大きくしました。バランスが良くなりました。
先週に続いて、テレタイプのラインフィードを調整します。プラテンにラインフィードの進みが分かるように油性ペンで線を入れて、調整しやすくします。
8月17日
テレタイプの製造年月が分かる情報がここにありました。裏側のシールの横に捺印されているようです。このサイトはASR−33ですが、32にも刻印されていると思われます。次回確認してみます。
8月22日
Am9511ライブラリ作成の予備調査の続きです。eTK−80のデバッガの使い方を備忘録として書いておきます。下は以前から使っている、浮動小数点を使ったソースとコンパイル結果です。0.25を引数にsub関数を呼び、引数をそのまま戻り値にして、結果をグローバル変数のバッファに文字として変換します。
eTK−80のデバッガはコマンドリファイルを実行できます。テキストファイルにコマンドを記述します。下の例ではHEXファイル、シンボルファイルを読んで、PC(プログラムカウンタ)をメイン関数の先頭番地main_に設定します。
デバッガを起動して、上記のコマンドファイルを実行します。その後、メイン関数の先頭から逆アセンブルします。PUSHEIは関数の下のコード領域に埋め込まれた即値10バイト(80ビットの8087フォーマット)の浮動小数点をスタック領域にコピーする関数です。赤枠内が10バイトの即値です。デバッガの逆アセンブラはDB文を区別はできないので、このような表示になります。この関数は普通にRET命令では戻れないので、関数の最後でPCHL命令でDB文の次の番地に戻ってきます。80ビットの浮動小数点フォーマットはここにあります。ここに80ビットの浮動小数点をバイナリに変換するソースコードがあります。
eTK−80のデバッガにはG(プログラムカウンタから実行)、G add(プログラムカウンタから実行しaddでブレイク)、P(ステップオーバ)、T(ステップイン)の実行関係のコマンドがあります。また、BPはブレイクポイント設定、BCはクリアのコマンドです。
P(ステップオーバ)は素早く関数を実行できて便利ですが、上記のPUSHEI関数ようにCALLの次の番地に戻らない関数は正しく動作しません。デバッガ内でCALLの次のアドレスにブレイク設定をしてGO実行するので、このアドレスに到達しない場合は停止しません。下はPUSHEI関数のステップオーバで停止せず、ESCキーで強制停止したところです。
この場合は面倒ですが、PUSHEI関数の戻り番地を直接指定して実行します。下の例ではG 9023で9023番地でブレイクさせています。
PUSHEI関数の他にコード内の即値を埋め込む関数としてLAUTO関数が見つかりました。LAUTO関数は2バイトの即値を使います。この関数もPコマンドは使えず、2バイト先にブレイク設定を行います。
PUSHEI関数の動作を確認します。終了時のSP(スタックポインタ)は85e4で、スタックをダンプすると、コードに埋め込まれた10バイトの即値がスタックにコピーされてることが分かります。
そのまま、次のETOF関数をPコマンドでステップオーバして、動作確認します。この関数は普通に次の番地に戻ってくるので、Pコマンドが使えます。終了時のSP(スタックポインタ)は85eaで、スタックをダンプすると、10バイトの浮動小数点がfloat(4バイトIEEE754単精度フォーマット)に変換されていることが分かります。ETOF関数は名前の通り、E型(10バイト)からfloat型(4バイト)への変換であることが分かります。4バイトの浮動小数点フォーマットはここにあります。また、数値から4/8バイトの内部コードに変換するページがここにあります。
8月23日
アパートからRCAのビデオセレクタを持ってきました。TK80BS互換機のBSビデオとVDPビデオの切り替えに使います。
TK80BS互換機がひと段落したので、ARTYボードのDDRを使ったウェーブテーブルを再開します。大分前なので、すっかり忘れています。テストポイントに出力されているDMAとFIFOの制御信号をアナログディスカバリに接続して動作確認を行います。
現状のブロックです。自作のHLSのRep_DMAとFIFO、デルタシグマDACを接続していましす。いずれもAXI−Streamです。FIFOの読み出しクロックは以前作製したFPGAトーンジェネレータのIPを組み込んでいます。ソフトコアのマイクロブレーズからDDRがアクセスできるところまで確認済みです。ただ、FIFOの読み出しは動作クロック1パルスで1ワード転送なので、このブロック図は正しくないです。
世の中はVitisに移行しているようですが、PCのメモリも16Gは必要なようで、当分SDKで継続します。マイクロブレーズのプログラムで初期化後、DMAの実行を開始するStartAPIを呼びます。
StartAPIでが実行されると、DDRからデータがFIFOに書き込みが開始されるはずです。DMAから次段のFIFOに対するTVALID信号が出力されるはずですが、Lowのままです。FIFO側は受け取り可能なステータスのTREADYがHighになって、準備ができていることが分かります。DMAが開始されていようです。
FIFOジェネレータでOverflowとUnderflowの信号線を追加してみます。双方ともaxis_が付きます。なぜかOverflowが立っています。DMAからFIFOへのTVALIDが立っていないので、FIFOにはデータが入っていなはずです。日本語のFIFOジェネレータのドキュメントがここにありました。axis_OverflowはFull、axis_UnderflowはEmptyでないようです。もう少し調査が必要です。
8月29日
Ebayで購入した8インチフロッピのクリーニングキットが来ました。ビンテージのIBMのS/36用とのことです。乾式だと思ったのですが、予めクリーニング液の浸み込ませたディスクが封印されているタイプの湿式でした。1枚開封してみましたが、クリーニング液のアルコール?が残っているようです。湿式ならビンテージじゃない方がいいです。
セカイモン経由のEbayで購入のピンボール用SC−01の載った音声ボードも届きました。
早速、互換機の拡張I/FのSC−01と差し替えてみます。デートコードは8113と8114です。たぶん、1981年の13週と14週と思われます。
動作良好です。
先週のHLSのRep_DMAが動かない調査の続きです。余分な部分を取って、単純なDMAに修正しました。512ワードをメモリから読んでストリーム出力するHLSです。メモリアクセスの引数はvolatileを付けています。
ループの内側にPIPELINEの指定をして、C/RTLコシミュレーションでは512ワードを転送して、正しく動作しています。
VivadoでIPを入れ替えて、合成、インプリします。
SDKを起動し、XDma_Start()前まで進め、DDRの初期化を確認して、XDma_Start()を実行します。
テストポイントの波形をアナログディスカバリで確認にします。FIFOからDMAへのTREADYのみイネーブルになっています。相変わらず、DMAは開始されていませんが、FIFOが動作しなのは正解です。ネット上のリードDMAのストーム出力のサンプルを探して、試してみます。
8月30日
SMF(MIDIファイル)を変換して、TK80BSのシンセを鳴らすことができます。Cygwin上で作ったmidiconvを使います。ネット上のbwv0572.mid(幻想曲ト長調)を変換してみます。MIDIファイルを引数にプログラムを実行します。
変換経過が表示され、最後に同じチャンネル内に和音が使われているという警告が出ます。旧デジタル・アナログ混在シンセもHLSで作成してたFPGAシンセも、1チャンネル内に和音を含めることはできません。チャンネル5の192、チャンネル6の217小節目に和音があることが分かります。
MIDIファイルをドミノで確認します。チャンネル5の192小節目に和音がありました。
続いて、チャンネル6の217小節目にも和音がありました。
この場合、他のチャンネルが空いていれば、余分な音を移動すことで、データを損なわず変換できます。8チャンネルすべて使われている場合はあきらめます(笑)。今回は他のチャンネルに空きがあるので、移動します。下のように和音があるブロックを空きチャンネルにコピー・ペーストします。
192小節目からの和音の部分だけに注目してみます。同時に鳴っているのは2声です。チャンネルを分けるときに、分かりやすいように色付けしておきます。
和音部分から下側音程を削除して、赤枠の上側だけに修正します。
続いて、コピーした新しいチャンネルの方は青枠の下側のみにします。
チャンネル6の217小節目から始まる、曲の最後の和音の部分です。4声が同時に鳴っているので、それぞれ別のチャンネルに分けます。
ドミノ上で修正したファイルを再度、midiconvで再変換します。トラック内に和音が無くなったことが分かります。このプログラムはTK80BSで使っている1音3バイト(音程、音長、ゲート長)のバイナリに変換して、その後、インテルHEXを生成します。HEXファイルは簡易ICEのファイルロード機能を使って、TK80BSのメモリにダウンロードできます。
早速、確認すると、上手く変換できていないことが判明しました。曲データの先頭に2バイトの余分なデータが入っていて、全体が2バイトずれていました。これはmidiconvプログラムの不具合で何かの拍子にデグレードし
てしまったようです。BSモニタのメモリ移動コマンドで2バイトを削除すれば、鳴らすことができました。ただ、この曲は3部構成になっているのですが、
MIDIデータではテンポが自由に変えられますが、TK80BSでは曲内でテンポは変更できません。そのままでは3部の”Lentment”のテンポが早すぎでした。ドミノ上で曲を3つに分けると回避できます。
テレタイプの後ろのシールの横にあるはずのデートコードは見つかりませんでした。