*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
関連項目:

  
H8/3664
  
AKI-H8
  
PallarellPort増設
  
VHDL coding

  前の頁  次の頁
前項で解説した、スイッチ用の参照データと、そのハンドリング・ルーティンを紹介する。まず、参照するポートデータはいろいろと試行錯誤した結果、このように記述している。手間は掛かるが、単純にデータを順に置いていくだけなので、混乱がなく、コードの配置次第では、視覚的な視認性も良好となる。この例で、0,1はスイッチの状態、数字はポート番号のオフセットである。数値の配置は、実際のスイッチの構造に準拠している。これらはあくまで僕がオリジナルに設計したフットスイッチのためのデータであるが、他の用途に対しても応用が利くので、一つの指針として活用すればよいだろう。
  1. swaddr00: .data.b 0, 0, 0, 0, 0, 0, 0, 0
  2.        .data.b 0, 0, 0, 0, 0, 0, 0, 0
  3.        .data.b 0, 0, 0, 0, 0, 0, 0, 0
  4.        .data.b 0, 0, 0, 0, 0, 0, 0, 0

  5. swaddr01: .data.b 0, 0, 0, 0, 0, 0, 0, 0
  6.        .data.b 0, 0, 0, 0, 1, 1, 1, 1
  7.        .data.b 0, 0, 0, 0, 0, 0, 0, 0
  8.        .data.b 0, 0, 0, 0, 0, 0, 0, 0

  9. swaddr02: .data.b 0, 0, 0, 0, 0, 0, 0, 0
  10.        .data.b 1, 1, 1, 1, 1, 1, 1, 1
  11.        .data.b 0, 0, 0, 0, 0, 0, 0, 0
  12.        .data.b 0, 0, 0, 0, 0, 0, 0, 0

  13. swaddr03: .data.b 0, 0, 0, 0, 1, 1, 1, 1
  14.        .data.b 1, 1, 1, 1, 1, 1, 1, 1
  15.        .data.b 0, 0, 0, 0, 0, 0, 0, 0
  16.        .data.b 0, 0, 0, 0, 0, 0, 0, 0



  17. swnum00: .data.b 1, 2, 3, 4, 5, 6, 7, 8
  18.        .data.b 9,10,11,12,13,14,15,16
  19.        .data.b 17,18,19,20,21,22,23,24
  20.        .data.b 25,26,27,28,29,30,31,32

  21. swnum01: .data.b 1, 2, 3, 4, 5, 6, 7, 8
  22.        .data.b 9,10,11,12, 1, 2, 3, 4
  23.        .data.b 13,14,15,16,17,18,19,20
  24.        .data.b 21,22,23,24,25,26,27,28

  25. swnum02: .data.b 1, 2, 3, 4, 5, 6, 7, 8
  26.        .data.b 1, 2, 3, 4, 5, 6, 7, 8
  27.        .data.b 9,10,11,12,13,14,15,16
  28.        .data.b 17,18,19,20,21,22,23,24

  29. swnum03: .data.b 1, 2, 3, 4, 1, 2, 3, 4
  30.        .data.b 5, 6, 7, 8, 9,10,11,12
  31.        .data.b 5, 6, 7, 8, 9,10,11,12
  32.        .data.b 13,14,15,16,17,18,19,20
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;; set the number from look up table
  3. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  4. load_sw_num:

  5.     mov.b @swptn,r3l
  6.     cmp.b #3,r3l
  7.     beq sw_01
  8.     cmp.b #0,r3l
  9.     beq sw_00
  10.     rts

  11. sw_00:

  12.     sub.l er0,er0
  13.     sub.l er1,er1
  14.     sub.l er2,er2

  15. num_data_load00:

  16.     mov.b @(swnum00,er0), r1h
  17.     mov.b r1h, @(setcnt,er0)
  18.     add.l #1,er0

  19.     cmp.l #31,er0
  20.     ble num_data_load00

  21.     sub.l er0,er0
  22.     sub.l er1,er1
  23.     sub.l er2,er2

  24. sw_data_load00:

  25.     mov.b @(swaddr00,er0), r1h
  26.     mov.b r1h, @(setsw,er0)
  27.     add.l #1,er0

  28.     cmp.l #31,er0
  29.     ble sw_data_load00

  30.     rts

  31. sw_01:

  32.     sub.l er0,er0
  33.     sub.l er1,er1
  34.     sub.l er2,er2

  35.     num_data_load01:

  36.     mov.b @(swnum01,er0), r1h
  37.     mov.b r1h, @(setcnt,er0)
  38.     add.l #1,er0

  39.     cmp.l #31,er0
  40.     ble num_data_load01

  41.     sub.l er0,er0
  42.     sub.l er1,er1
  43.     sub.l er2,er2

  44. sw_data_load01:

  45.     mov.b @(swaddr01,er0), r1h
  46.     mov.b r1h, @(setsw,er0)
  47.     add.l #1,er0

  48.     cmp.l #31,er0
  49.     ble sw_data_load01


  50.     rts

  51. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  52. load_sw_num2:

  53.     mov.b @swptn,r3l
  54.     cmp.b #1,r3l
  55.     beq sw_03
  56.     cmp.b #2,r3l
  57.     beq sw_02
  58.     rts

  59. sw_02:

  60.     sub.l er0,er0
  61.     sub.l er1,er1
  62.     sub.l er2,er2

  63. num_data_load02:

  64.     mov.b @(swnum02,er0), r1h
  65.     mov.b r1h, @(setcnt,er0)
  66.     add.l #1,er0

  67.     cmp.l #31,er0
  68.     ble num_data_load02

  69.     sub.l er0,er0
  70.     sub.l er1,er1
  71.     sub.l er2,er2

  72. sw_data_load02:

  73.     mov.b @(swaddr02,er0), r1h
  74.     mov.b r1h, @(setsw,er0)
  75.     add.l #1,er0

  76.     cmp.l #31,er0
  77.     ble sw_data_load02

  78.     rts

  79. sw_03:

  80.     sub.l er0,er0
  81.     sub.l er1,er1
  82.     sub.l er2,er2

  83. num_data_load03:

  84.     mov.b @(swnum03,er0), r1h
  85.     mov.b r1h, @(setcnt,er0)
  86.     add.l #1,er0

  87.     cmp.l #31,er0
  88.     ble num_data_load03

  89.     sub.l er0,er0
  90.     sub.l er1,er1
  91.     sub.l er2,er2

  92. sw_data_load03:

  93.     mov.b @(swaddr03,er0), r1h
  94.     mov.b r1h, @(setsw,er0)
  95.     add.l #1,er0

  96.     cmp.l #31,er0

  97.     ble sw_data_load03


  98.     rts
上記の例は、Tinyシリーズ用にダウンサイジングしたテーブル参照用のルーティンである。Tinyシリーズの問題点は16ビットというアドレス空間の狭さにある。H8では、何も考えずにCMPを使って条件分岐を行えるが、Tinyシリーズでは分岐先に更に分岐があるような場合にアドレス管理に破綻を来してアセンブル時にエラーが報告されてしまう。エラーを最小限に食い止めるためには、作業を構造化して細分化し、手間は掛かっても各パートで作業を完結し、条件に漏れたモノは下流に流すという手法をとる必要がある。つまり、サブルーティンの階層を減らすことが、トラブル滅却の第一歩となるのだ。
つづく→