*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
|
||||||
関連項目: H8/3664 AKI-H8 PallarellPort増設 VHDL coding 前の頁 次の頁 |
||||||
さて、ここからはようやく受信判定の項目に戻ることになる。話が前後したので、ここでRxDについておさらいをしておこう。2段目で受信アドレスを比較、一致がない場合、レジスタを初期化してアドレスを読み込みんだ後、シリアルポートからrx_fifoに取りこまれたデータを読み出している。データを読んだ後、受信アドレスを1つ進めつつ、オーヴァーフローを監視し、レジスタに更新された受信アドレスを格納している。(15段目) 次に受信データの判定が始まる。受信されたデータは [r0h] に格納されているので、この内容を判定していく。最初に行うデータの選別は、SystemExclusiveMessageの排除である。ご覧のようにSysExのヘッダーはHex表示で Fx となっているので、LSB4ビットをマスクする意味でBls分岐命令(BlanchLessThan)を使って全てのSysExを撥ねている。このプログラムではTxDが存在しないので直接関係はないが、MIDIアウトにはSysExは流れないことになる。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; MIDI sw data Receive ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; rx_data_receive: cmp.w r5,e5 ;r5: rx1_top, e5: rx1_end bne initialize rts initialize: sub.l er1,er1 mov.w e5,r1 ;rx data address data_Read: mov.b @(rx_fifo,er1),r0h ; rx data -> [r0h] inc.w #1,r1 bclr #1,r1h ; rx buffer 512 mov.w r1,e5 ; reWrite rx data address cmp.b #h'F0,r0h ; sysex data thru bls ditector rts 以下がMIDIメッセージの判定部分となる。このプログラムはMotorMixというMIDIフェーダーをリモートコントロールするために出力されているデータのうち、LEDの制御を行うためのモノを選別して復調し、結果を出力ポートに反映するものである。従って、コーディングの前にまず行うことはMotorMixに対応したMIDIプロトコルの入手だ。以下に公表されているMotorMixのデータを示す。 表を見て判るようにMotorMixのコントロールデータのヘッダーは B0 というCC(コントロール・チェンジ・ステイタス)と同じヘッダーを使用しているが、これは、MotorMixが常にMIDI/CH01のCCを占有することを意味する。当然ながら、MotorMix使用時には他のMIDI機器のチャンネル設定は必ず#01以外を選択しなければならないことになる。 ディテクターではまずデータ受信時にB0をより分け、その後に続くデータを取りこんでその都度フラッグを立てながら判定していく。表には「B0-0C の後、LEDのアドレスが来てその後 -2C- を受信した後にLEDのオンオフ情報が送信される」とあるので、その仕様に合わせたデータ判定システムを構築していく。以下に示す例はデータ判定の窓口部分である。9段目でB0のデータ判定を行っているが、その下流でさらに判定を重ね、その結果をフラッグに返している。窓口ではこのフラッグを判定することで、データをより分けていく。 ditector: btst #3,r4h ; detecting 4th data flag =>r4h bne data_store2 btst #2,r4h ; detecting 3rd data flag bne detector_2 btst #1,r4h ; detecting 2nd data flag bne data_store btst #0,r4h ; detecting 1st data flag bne next_flag cmp.b #h'B0,r0h ; data header reading from MotorMix beq data_set1 btst #6,r4h ; detecting second ping flag bne trigger_out btst #5,r4h ; detecting first ping flag bne next_flag2 cmp.b #h'90,r0h ; ping header flag beq receive_flag1 rts |
||||||
つづく→ | ||||||