*このパートは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共にマッピング出力が可能となっている。
  1. digital_check:

  2.  sub.l er1,er1
  3.  sub.l er3,er3
  4.  sub.l er2,er2
  5.  mov.b r2l,@port_counter

  6. _dc_loop:

  7.  mov.b @pdr5,r0h ; r0h is current port data

  8.  mov.b @(ports_01,er1),r2l ; r2l is previous port data
  9.  mov.b r0h,@(ports_01,er1)
  10.  xor.b r0h,r2l ; r2l is now update flag

  11.  mov.b #0,r2h ; r2h is a counter

  12.  bra _check_bits

  13. _dc_loop_2:

  14.  mov.b @pdr8,r0h ; r0h is current port data

  15.  mov.b @(ports_01,er1),r2l ; r2l is previous port data
  16.  mov.b r0h,@(ports_01,er1)
  17.  xor.b r0h,r2l ; r2l is now update flag

  18.  mov.b #0,r2h ; r2h is a counter

  19.  bra _check_bits

  20. ;>>>>> inner loop top

  21. _check_bits:

  22.  btst r2h,r2l ; checking the update flag
  23.  beq _next_bit

  24.  sub.l er3,er3
  25.  mov.b r2h,r3l
  26.  mov.b @port_counter,r0h
  27.  add.b r0h,r3l

  28.  mov.b @(setsw,er3),r0h ; uploading sw setting
  29.  cmp.b #0,r0h ; checking the data flag
  30.  bne _program_cng ; branch when z flag = zero
  31.  bra _control_cng

  32. _control_cng:

  33.  mov.b @cc,r0l ; sending controll change status
  34.  jsr @tx_fifo_set

  35.  mov.b @(setcnt,er3),r0l ; uploading control change default number


  36.  mov.b @ccnum,r0h ; uploading preset cc number
  37.  add.b r0h,r0l ; plus offset preset number
  38.  jsr @tx_fifo_set

  39.  mov.b @(ports_01,er1),r0h
  40.  btst r2h,r0h ; checking the bit"n" sw status

  41.  beq __set_off
  42.  mov.b #h'7f,r0l ; set 127 value
  43.  bra __set_st
  44. __set_off:
  45.  mov.b #h'00,r0l ; set 0 value
  46. __set_st:
  47.  jsr @tx_fifo_set
  48.  bra _next_bit

  49. _program_cng:
  50.  mov.b @pgm,r0l ; sending program change status
  51.  jsr @tx_fifo_set

  52.  mov.b @(setcnt,er3),r0l ; sending program change number
  53.  mov.b @pgnum,r0h
  54.  dec.b r0h
  55.  add.b r0h,r0l ; plus offset preset number
  56.  jsr @tx_fifo_set

  57. _next_bit:
  58.  add.b #1,r2h ; counter plus 1
  59.  cmp.b #8,r2h ; detecting full count
  60.  bne _check_bits

  61. ;>>>>> inner loop end

  62. _next_port:
  63.  mov.b @port_counter,r0h
  64.  add.b r0h,r2h
  65.  mov.b r2h,@port_counter
  66.  sub.b r2h,r2h
  67.  add.l #4,er1
  68.  cmp.l #4,er1
  69.  beq _dc_loop_2

  70. ;<<< outer loop end

  71.  rts


つづく→