CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

VFDドライブ

VFDを制御するファームをPICに書き込みました。8桁をダイナミックドライブするためにステートマシンを組み、タイマ割込みごとにインクリメントするカウンタのmod8の値で桁指定、その桁に表示するセグメント情報を出力するようにします

 

 

割込み周期をどれくらいにするかは、これは目視でカット&トライ、ちらつきが無くなる程度とします。やってみると1桁当たり50Hz位で良さそうなので8桁分400Hzの割込みが発生するようタイマ0を設定しました。

点灯時の1桁分のグリッド電位の波形です。スキャン周波数50Hz、1桁あたりの点灯時間は2.5ms。約26Vのパルスが出ています

 

最終的には表示する値をシリアルで送り込むI/Fを作りますが、まず単体テストとして内部の自走カウンタを表示させています。専用電源のためきれいにムラなく発光してます。

 

緑色のフィルタをかぶせるとさらにくっきりします

 

モニタ搭載

考えてみるとレジスタも32ビット幅になってレジスタ表示を修正する必要あるし。コマンドの引数も4バイト対応しなければならないので直すところは結構あります。ここはいつものようにシリアルからRAMへのロード’L’とプログラム先頭番地へのジャンプ’G’の2つの機能だけ持つ原始モニタだけ作ることにします。

 

プログラムの本体はこれだけ。一見Z80のコードですがLD (XHL),A という32ビットレジスタ間接アドレッシングが目新しいです。

シリアルの受信は最初の1キャラのみ永久待ち、2キャラ以降はタイムアウトさせプログラム転送終了でコマンドプロンプトに戻るようになってます

コマンドは引数無し。ユーザプログラムは外付けした128kbyteSRAMの先頭0x20000番地からロード、実行として、中途半端に広い内蔵RAM32kbyteはBSS領域、STACK領域専用にしておきます

これらのコマンドさえあれば統合環境CMPLDRVにも登録できます

 

モニタが初期化した環境下で再度無限ループ JR $ を実行してみると周期は1.6MHzとなり一気にデフォルト環境の24倍速になりました

 

 

部品取付け完了

VFD制御基板の部品取付けほぼ完了しました。基板表側にVFD、裏側に電源基板が付きますがお互いにハンダ個所の上に被ってしまい、両方直付けしようとすると破綻するのでVFDは交換も考えソケットで実装することにします

 

 

ところでここで少し方針転換。この基板はNEC製の蛍光表示多桁管7セグ9桁のLD8118と16セグ8桁のFIP8A5Rの両方に使える設計にしていました。

最初の1枚目はLD8118と自作VFD電源の組合せにしようとしていましたがうっかりセグメントドライブのトランジスタアレイTD62783を2個(16ビット分)くっ付けてしまい結果的にFIP8A5Rで動作確認することになりました。その際、VFD電源はそれ専用の既製品TDKCD1681Pが手持ちであるのでそれを使うことにします。その方が動作も確実だし電源基板も自作品と既製品の両用設計にしてあるのでどちらでもOKです

 

 

VFD制御基板

寄せ集め基板から切り出したVFD制御基板にも部品付け始めました

 

 

コントローラにPIC18F4550を載せていて外部からUART/SPI/I2Cで制御するようにしてみました

QFPの実装ですが0.8mmピッチでTMP92CM22の0.5mmに比べると格段に楽ちん。ハンダ付けの練習のつもりでこれくらいハンダ増し増しでやってみます

 

 

ハンダ吸い取り線で一発で決まりました。

若干周囲のスルーホールにハンダが流れ込んでしまった感がありますが、耐熱テープで養生しておけばよかったかもです

 

モニタ移植

1文字入出力ができればモニタの搭載は簡単です。しかも以前TLCS-90のモニタを作ってますからそのソースをそっくり持ってくることができます。

ターゲットCPUとインクルードファイルの指定を修正。1文字入出力ルーチンをさしかえ、ROM配置に合わせエントリーポイントを00000HからF80000Hに変更してアセンブルしました。

 

すんなり通るかと思いきやまた山のようにエラーが出てしまいました。ただこれはZ80→TLCS-90への移植でやったように1行1行エラーを潰していけばいいはずです

> error: undefined operand size
     EX    AF,AF'

  これはZ80ではアキュームレータAとフラグレジスタFはレジスタペアで扱えましたがTLCS-900ではAレジスタのパートナーはWレジスタになってしまいました。なので EX A,A';EX F,F'; とバラせば同じ動きになります

 

> error: unknown instruction
    EXX
  TLCS-900では裏レジスタが拡張されて4バンク構成になりました。単純に裏と表を ひっくり返すだけのEXX命令は無くなったようです

    SLAA   /   SRLA

  レジスタのシフトはシフト数も指定できるようになりました。それぞれ    SLA 1,A/SRL 1,Aと書き直せます

・・という具合に単純にニーモニックを差し替えていけばいけると思っていたのですが本質的にまずいところが見つかりました

 

> error: addressing mode not allowed here
     LD    A,(HL)   /   LD    (HL),A

  (HL),(BC),(DE)というようなレジスタペアによるレジスタ間接アドレッシングができなくなりました。アドレス空間は24ビットあるので当然16ビットでは足らない訳でそれぞれ(XHL),(XBC),(XDE)というように32ビットレジスタで指定してやればいいのですが代入しているところも直さなければならず、当りが大きそうです。たとえばアドレステーブルのデータ埋めこみもワード幅のDW疑似命令だとエラーが出ています

 

> error: range overflow
     DW    PRINT

 

 

VFD電源

寄せ集め基板は到着したあと放置してましたがやっと開封しました。こちらは普通の緑色レジストです。表示器のバックになるので黒色レジストにしてみようかとも思ったのですが、製造仕様によると黒はどうもカーボンが含まれるようで絶縁抵抗が高くないとのことでやめておきました。

 

まず左上の基板を切り出しました。蛍光表示管に使う20Vくらいのプレート電圧とヒータ用の数Vp-pの交流を発生するDCDCコンバータです

 

さっそく部品を実装。特に今回は基板の中央にあるVFD用トランスが手に入ったのでこれを活用するプロジェクトです。

2石の自励式プッシュプルでトランスをドライブし2次巻線を全波整流平滑してプレート用DC22V、もう1組の2次巻線でセンタータップをDC3Vでバイアスさせたヒータ用ACを出力します。

 

ヒータ出力の波形ですが無負荷で約5Vp-p。発振周波数は意外に高く480kHzになりました

 

シリアル入出力

このボードもモニタを載せるためにシリアル入出力ルーチンの作りこみをやっていきます

先ずプログラムの先頭部分の疑似命令ですがインクルードファイルSTDDEF900H.INCTMP92CM22の内部レジスタの定義を記述した自作ファイル(ネット上で探せばどこかにあるかも)、MAXMODE ONは16Mバイト空間にプログラムコードを配置する宣言です。さらに今回追加したSUPMODE ONはCPUがスーパバイザモードになっていることを示しています。

ところがTLCS-900/H1のマニュアルを読んでみるとMAX/MINモード、SYSTEM/NORMALモード(=スーパバイザ/ユーザモード)の切替えがあるのはTMP96C141(TLCS-900無印)特有の機能のようでTLCS-900/H1でははじめからMAXモード、SYSTEMモード固定で切替ができなくなっていました。

つまりこれらの宣言は本来不要なのですがTLCS-900無印アセンブラを流用する以上入れておかないと64kbyte以上のコード領域や特権命令である割込み関係の命令でワーニングが出てしまいます。

 

この環境下でコーディングしていきますが、シリアルコントローラは以前いじったTLCS-90と同じで、送受信は割込みで駆動するようになっています。また苦手な割込みですがこれはTLCS-90に倣って記述しました。

まずベクタエリアはFFFF00HからFFFFFFHの256バイトにリセットを含む64タイプの割込みアドレスが並んでいますがここに受信割込みINTRX、送信割込みINTTXのアドレスをセットします

 

割込みサービスルーチンはRAM上の仮想的なフラグ(受信レディRXRDY、送信バッファエンプティTXEMPTY)をセットするだけです

 

このフラグを参照することであたかもハード的なステータスレジスタをポーリングするような1文字入出力ルーチンが用意できました