■人騒がせなポート1割り込み仕様の件
DTMFのアイデアの元ネタは、「MSXマガジン」(アスキー)の1991年4月号と5月号です。前回のエンコーダー試作の発声部分は、4月号に掲載されていたBASICプログラムの該当部分をほぼそのままアセンブラに移植したものです。データの与え方はBASICに任せて、汎用性を持たせたつもりです。
さて、次はさっそくデコーダーも5月号からパクリを…と思いましたが、記事に妙なことが書いてありました。
「#15に10000000B(バイナリーコード)を出力すれば、#14にジョイスティックポート1の状態が現れるように思えます。ところが実際にBASICでこれを行ってみると、まったく読み取ることができないのです。これは内部の割り込みに関連して、#15のビット6が0になってくれず、常に1になってしまうためです。つまり、ジョイスティックポート2の状態ならば読めるということなのです。」
だから今回のデータの取り込みにはポート2を使うというのです。
参考までに最終兵器「MSX1アセンブラリスト」を引っ張り出してきました。PSGレジスタ書き込みBIOS「WRTPSG」は、内部ルーチンで割り込み禁止してアキュムレータの示すレジスタに値を書き込んでいますが、割り込み解除してRETしてます。読み込みBIOS「RDPSG」の本体は、わずか
OUT (PSG.LW),A
IN A,(PSG.DR)
RET
これだけで、DI も EI もへったくれもありません。
もしMマガ筆者の言うように途中で割り込みがかかって、#15のビット6が知らん間に「1」に書き換えられていたら、プログラマは原因不明の挙動不審に悩まされるでしょう。
なにぶん割り込みがらみのハナシなので、どこから割り込まれているのか発見には至りませんでした。人騒がせな仕様です。日を改めてホンマかどうか確かめてみます。
実は、この記述に今日まで気が付きませんでした。というのは、これまで工作するときは習慣的にポート2を使っていたのです。ポート1は6及び7端子を出力に使わない、いわばゲーム専用と割り切るのが無難でしょう。
■6及び7端子を出力に使っていいのか?
まだちょっとナゾというか、気になる点があります。
注目はポートBのbit0〜3。先の にゃごすさん版テクハンでは「汎用I/F1又は2の6又は7端子に接続」と書いてありました。
ところが、本家「MSX2テクニカルハンドブック」(アスキー)では「bit0〜3は使用しない」となっています。
「使用しない」となると、6及び7端子は入力専用となります。
実は、にゃごすさん版テクハンは、本家テクハンではなく、「MSX-Datapack」の記述と同じなのです。
「汎用I/F1又は2の6又は7端子に接続」という記述は事実を述べているだけで、「だからどうなの?」と考えてしまいます。
この点について、古典「MSX早わかり事典」(朝日新聞社)は明快です。「出力として使わない場合、「H」レベルにしなければならない。」と書かれてます。
6及び7端子は、「入出力兼用ですから、入力に使う場合には(中略)オープン・コレクター・バッファを入れてポートBからの出力信号を切断します」。なお、デフォルトで「H」になるよう、プルアップ抵抗が入っていると記述されています。確かに、MSX-Datapack の「MSX2+回路例」では、抵抗アレイっぽいものが入っています。
結論、6及び7端子は出力にも使っていい。ただし、ポート1は前述の割り込み問題もあって気を遣う。ポート2の6及び7端子でイタズラするのが無難、というところでしょう。以前から工作にはポート2を使っていたぼくは、結果的に正解だったわけです。エヘン!(笑)
■トリガA・B のタイムラグのナゾ
最後に若干小ネタですが、似非職人工房で有名なつじかわさんの指摘を紹介しておきます。「MMCを使ってみよう」のサイトで触れられていたことです。
「それと今回実験に使用したMSX本体(FS-A1GT)のジョイスティックポートで、妙な挙動を発見しました。
MSXは、PSGレジスタR#15のbit2/3でジョイスティックポートBのトリガA/B出力を設定出来ます。bit2/3を同時に変化させれば、トリガA/Bが同時に変化する事が期待されます。
ところが実際には、トリガAの方がBよりも必ず600ns程度先に変化するのです。MSXエンジン(T9769)を使用したMSXで共通なのかも知れません。」
MSXではあっても、600nsは決して短い時間ではありません。昔、「シリアル通信」でイタズラしていた頃は、ステート数を計算してギリギリと追い込んだものです。簡単に「600ns遅れるよ」と言われると困るのです。この点もGTだけの問題なのか、後日(いつになることやら)確かめてみたいと思います。
というわけで、汎用ポート周辺事情だけで今回は終わってしまいました。ま、DTMFデコーダ用の収穫として、
(1)ポート2をターゲットにハード・ソフトを開発する。
(2)6及び7端子は必要なら出力に使っていい。
というところでしょうか。あ〜疲れた >┼○ バタッ