*このパートは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のデータを示す。

CENTRAL CHANNEL SECTION:
CENTRAL CHANNEL SECTION
L.E.D. ON/BLINK
L.E.D. OFF
MUTE (1 thru 8) B0-0C-(00thru07)-2C-(42/52) B0-0C-(00thru07)-2C-02
SOLO (1 thru 8) B0-0C-(00thru07)-2C-(43/53) B0-0C-(00thru07)-2C-03
BYPASS (1 thru 8) B0-0C-(00thru07)-2C-(44/54) B0-0C-(00thru07)-2C-04
REC/RDY (1 thru 8) B0-0C-(00thru07)-2C-(45/55) B0-0C-(00thru07)-2C-05

表を見て判るように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
つづく→