PC-8001用 FM音源 YM2203ボードを接続したら、ちょっと前に作ったRTC(リアルタイムクロック)のボードを接続する口が足りなくなりました。YM2203ボードにはGPIO(汎用I/O)のクチを2セット出しておいたので、子基板としてRTCモジュールを接続すればいいんじゃ?とおもってつなげてみました。
シリアルRTCモジュール(AE-RTC-4543SA-V2)
RTCのICは秋月電子通販などでも色々とありますが、プロトコルがシンプルなシリアル接続できるRTC-4543SAのDIP化基板が以前もKZ80マイコンで8255経由などで使った事があったので良いなと思いまして今回使ってみました。接続方法としては、YM2203ボードの子基板としてつなげてみようかと….
回路図はこんな感じ…
秋月電子 RTC-4543SAモジュールと、PC-8001用 YM2203ボードをつなぐ回路はこんな感じです。I/OポートAとBを両方使います。(I/OポートBは下の画像だと写ってませんが….)
シリアルデータをパタパタするのはAポートの0ビット目。それ以外の制御信号線はBポートの4,5,6ビット目を使います。
バックアップ電源としてはこれまた秋月電子通販で買った1F(1ファラド)のスーパーキャパシタ(電気二重層コンデンサ)です。小電力スイッチダイオード(1N4148)でつないで、主電源が落ちたらスーパーキャパシタでの駆動へ切り替えます。ちゃんとしたトランジスタとかの切り替え回路にしたほうが電圧低下が防げますが、まぁ多少の電圧低下はいいかなと。
当初は秋月RTCモジュールのFOEをプルダウンする回路にしてましたが、ここから電流が漏れ漏れになるので、試作したあと外してます。
RTCモジュール1つにI/Oポート2つ使うのは豪奢だなぁという感じではありますが、実はYM2203のI/Oポートは信号線ごとに入力/出力を切り替えできない使用でして、ポート(8本の信号線のかたまり)単位に入力/出力を制御レジスタへ指定するので。なので、RTCモジュールの制御信号線(CLK、WR、CE)とデータ信号線(DATA)は別々のI/Oポートへ接続したのでした。
ちなみに、回路図などはいつものgithubへUPしてます。
制御ソフトの作成
制御ソフトですが、以前KZ80用マシン語モニタ(KZ80Mon)上で8255を使ってRTC-4543SAをコントロールするソフトを作ってましたので、今回の基板用にI/O部分をYM2203のコントロール方法へと変更してマシン語で記述してみました。またPC-8001 N-BASICのマシン語ユーザー関数(USR関数)として呼べるようにインターフェースを変更してます。ソースと使い方はgithubの以下のページを見てみてください。
上記のページにも書いてますが、BASICの呼び出し部分がこんな感じです。まずはRTCからの日時読み出し。機械語サブルーチンをCALLすると文字列で日時(曜日付き)が数字で返ってきます。
10 CLEAR 300,&h9FFF
20 DEFUSR1=&hA100
30 AA$="yymmddYhhmmss"+""
40 DD$=USR1(AA$)
日時書き込みは逆パターンで、文字列(数字)で設定したい日時を渡すとRTCへ設定してくれます。
10 CLEAR 300,&h9FFF
20 DEFUSR2=&hA000
30 AA$="202104107121359"+"" '2021年04月10日(土) 12:13:59
40 DD$=USR2(AA$)
PC-8001のUSR関数(機械語サブルーチン)
PC-8001の機械語サブルーチンの呼び出し方はN-BASICのマニュアルにも出ていますが、文字列を引数として呼び出すと以下のようなストリングディスクリプタという3バイトの領域をZ80のDEレジスタでポイントして機械語サブルーチンに渡ります。
アドレス | 説明 |
00 | 文字列の長さ |
01 | 文字列格納エリアアドレスの下位8bit |
02 | 文字列格納エリアアドレスの上位8bit |
機械語サブルーチンでは、最初の文字列の長さを使って、文字列データが格納されているエリアをHLレジスタなどでなめていくというのが処理の常套手段となるかなと思います。
また、渡された文字列格納エリアを機械語サブルーチンで書き換えるとN-BASIC へ文字列を返すことができます。RTCへの日時設定、RTCから取得した情報を文字列へ変換して返すなどのインターフェースはこの仕組みを使っています。
動かしてみたら…不安定…原因判明!
回路が動くか確認してみるため、ユニバーサル基板に試作して試してみました。そんなに複雑な回路じゃ無いし、すぐ動くかなと思ったのですが、どうも不安定。全部の数値がゼロで読み取れてきたりと安定しませんでした。
ソフトのせいだと思って、タイミングをとるためにNOPをたくさん入れたりと色々とやってみたのですが、どうもうまくいかない….
まずは基本からと思って、YM2203のI/O端子にLEDをぶら下げてOUT命令で制御してみたら、ちゃんと思った通りにビットON/OFFできている感じでした。制御方法に間違いはなさそうです。
実は今回秋月電子RTC-4543SAモジュールに同梱されてきた細ピンヘッダではなく、自分で以前から持っている細ピンヘッダをとりつけまして90度傾けて省スペースにしてみたりしていました。モジュールに問題があった時用に基板には、秋月電子で購入したと思われる1列の丸ピンICソケットを使いました。ガタガタしてるわけでもないし、テスターでちゃんと導通も確認できていたのですが….
もしや??と思って、以前作った別の基板から秋月電子RTC-4543SAモジュールを外して今回の基板へとりつけたところ動くじゃないですか!!!
ちょっと拍子抜けのオチだったのですが、わたしがRTCモジュールにとりつけた細ピンヘッダとユニバーサル基板側の受け口の1列ICソケットの接触不良が原因で正しく動いていなかったようなのです。
こりゃ細ピンヘッダを交換しなきゃと思って、以前の記事でも書きました が ちょうど入手したエンジニアのSS-02でピンヘッダの交換となったわけであります。
ピンヘッダを交換して安定したRTCモジュールからPC-8001に日時データを取り込むため、いつもお世話になってるSD-DOS用にMicroSDにHELLO.CMTというBASIC+マシン語のプログラムを仕込みましてうまく動くようになりました!! 物理的な接触でハマるとは!! 精進が足りませんでした。
本当はI2Cも喋れるボードに…
githubの回路図には、なんちゃってI2Cの回路も書いてありまして、そちらはまだ未検証であります。そのうち気合が復活したら作ってテストしてみたいと思っています。
コメント