*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
|
|||||||||
関連項目: H8/3664 AKI-H8 PallarellPort増設 VHDL coding 前の頁 次の頁 |
|||||||||
今頁ではスイッチの入力をスキャンし、それをMIDI/TxDに出力するルーティンの解説を行う。 スイッチの状態は入力ポートに取りこまれたデータビットのオン/オフとして表現されるが、データ処理の都合上、8ビットを1グループとして取り扱うと、プログラム内部でのハンドリングが楽になる。H8シリーズではポートアドレス1番から4番まで8ビット幅を持つ入力が連続しているので、32個のスイッチ・ステイタスをカウンタをグルグルと回して一気に取りこむことが出来るのだが、Tinyシリーズの場合、8ビット入力はポート5とポート8の2つしか存在せず、ポートアドレスも飛び地となってしまう。そのため、データ取得にあたってH8シリーズ行っていた手法とは若干異なるアプローチが必要となる。 では、プログラムの構造を解説しよう。 まず、プログラム作成の前に、スイッチの仕様を決定する必要があるが、今回はオリジナルのH8版で採用したスタイルを踏襲している。 16個あるスイッチ入力に相当するビットには連番が振られる。唯一開始番号のみがプリセット可能で、個別に番号設定を行うことは出来ない。これらのスイッチは4×4のグループに分割され、グループ単位でCC/PGMのどちらかに属性を選択する。コントロールユニットの煩雑化を避けるため、これらのパラメーターは使用する頻度の高そうなパターン別にプリセット化され、LookUpTable としてROMに格納される。システムは立ち上げ時に選択されたパターンを参照し、スイッチの属性がプログラムされる。 冒頭にも解説したが、スイッチ入力は1ポート当たり8ビットであることが望ましいので、Tinyを使用する場合の選択肢は、ポート5とポート8のみに限られてしまう。(ADインプットを使用しない場合はポートBも選択が可能) これらのポートアドレスが連番の場合は、ポートアドレスのコールを自動化して一気にデータを吸い上げることが出来るが、Tinyの場合は、個別にポート・アドレスを指定してデータを格納しなければならない。 プログラムが多少煩雑になっている理由は、入力ポート拡張に対応しやすいように読み出しルーティンを構造化しているためだ。入力ポートを増やす場合は、outer loop に _dc_loop_n を追加し、プログラム末尾のカウンターの設定( add.l #4,er1 以降、ロングワードに対応するために、番地は4カウント毎進める)と、カウンターの数値に対応して、ポートを選別するための判定機構を改変すればよいだろう。 さて、アップロードされたポートデータは以前の状態を記録した ports_01 レジスタと照合され、不一致点のフラッグが r2l に反映される。ports_01 レジスタはメモリーマッピングの時点で、ロングワードに設定すること。最新のポートデータを ports_01 にアップデートした後、ポートの状態をビット単位でチェックするルーティンにジャンプする。ここでは、ループが8巡する間、読み出しカウンタに対応するビットの状態を検査し、不一致点のフラッグが立っているビットのみ、プリセットされている対応MIDIステイタスデータを確認した後、ポートの状態を参照して、MIDI送信ルーティン @tx_fifo_set にデータを転送する。1ポート分/8カウントを完了後、直ちに @port_counter に +8 を加算して次のルーティンに向けてローカルカウンタの内容を更新、ポートの状態変化を参照する ports_01 レジスタ用のカウンタを進めて、次のポートを読み出すルーティンに移行する。 ポートを増設する場合は、空きビット(必ず1が読み出される)への対応が必要なので、その点に注意すること。具体的には and.b などを使って対応ビットにマスクを掛ければよいだろう。 7月18日現在、ようやくTiny系にTxD系の実装が完了した。AD系の動作が不安定なので、コレをフィックスするのに時間が掛かりそうではあるが、とりあえずCC/PGM共にマッピング出力が可能となっている。 |
|||||||||
|
|||||||||
つづく→ | |||||||||