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

  
H8/3664
  
AKI-H8
  
PallarellPort増設
  
VHDL coding

  前の頁  次の頁
こちらに実際に動作を確認したプログラムをアップロードしてあるので、今後はこのコードを参照して、H8へMidiを導入する際の指標としていくことにしよう。 注意して欲しいのは、必ずしも「コレが正解ではない」ということだ。プログラミングが不得意な人間が書いたコードなので、もしかすると二度手間なルーティンを行っていたり、不必要な項目があるかも知れない。他人が行っていることはマズ疑って掛かるクセを付けよう。なにかおかしな場所を見つけた場合は是非レポートをよろしくお願いします。

H8/3048/3052系統の製作例は比較的Webに上がっていることは前ページで書いた。ここはあくまで僕の体験を報告する頁なので、恥を忍んで書いてしまうが、3052から3664にデータを移植するために、正直一年あまりの時間を費やしている。その実態は、邪魔くさくなってホッタラカシにしていたこともあるので、正味の開発期間は1ヶ月ほどではあるが、それにしても「長いお別れ」だったわけだ。ここに来て俄然開発意欲が復活した訳は、このサイトを発見した事による。ココの人は謙遜しているが、なかなかどうして、3664をMidiに応用した製作例を公開している数少ないサイトのひとつなのだから、もっと胸を張って良いと思う。

最近気がついたのだけれども、実際に音楽をやっている人達はプロアマを問わず、特殊な環境に於かれている人を除いて、敢えて金と労力を掛けて機材を作る必要を感じていないのではないか?ということだ。Midiの簡単なデバイスを1万円以下で買えるこのご時世に、マンパワー掛けて材料費1万強を費やす意味があるのか?と、純粋に経済的な疑問を感じるのは極自然なことであろう。 Webに製作例が少ないこともその現れだと思う。ただ、僕はその、「敢えて金と労力を掛ける必要を感じている特殊な環境の人間」なので疑問を感じたことなど全くないのではあるが、、、。

話が脱線してしまったが、Tiny系H8が美味しいのは、その安さとコンパクトな造りにある。しかも、消費電力が小さいので工夫をすれば電池駆動も可能と思える。 ちなみに、世間で見つけることの出来るMidi小物系のデバイスは、機能が限定され過ぎていて痒いところに手が届かないモノが多い。だから、ユニークな使用環境を想定した単機能なニッチ系デバイスと、その正反対の複雑系巨大システムは自作する価値「アリだと思うのだ。

さて、僕は過去に複雑系システムを自作した経験から、コードを書く場合には過剰な拡張性を持たせる傾向があるのだが、Tinyを使う場合は逆に、如何に機能を限定していくかが勝負となる。理由は、チップが持つデータの出入り口の問題で、要するにポートが足りないのである。だから、メモリーの容量に余裕があるからといって、ごっついプログラムを組める訳ではないのだ。複雑な入出力系が必要とされる場合には外部にパーツを拡張せねばならず、これではTinyの持つお手軽さが失われてしまって本末転倒だ。だから、工作の前に頭を絞って機能を必要最小限に限定したダイエットシステムを考えることにしよう。
上位機種のH8からTinyへソフトウエアを移植する上での最初の関門は、ベクターアドレスと、SCIの構造の違いだろう。特にSCIはレジスタの名称や割り込みの仕様が微妙に異なっているために、この箇所で混乱する場合が多いと思う。また、動作モードがアドヴァンストモードには対応していない点にも注意すること。 後述するが、DOS窓でアセンブルを行う際、3048/3052シリーズでは、

   
 [a38h.exe filename.src -cpu=300ha:20]  (a はアドバンストを意味する)

    
と打ち込んでいたところを

    [a38h.exe filename.src -cpu=300Hn]  (n はノーマルを意味する)

    というように、アセンブル時にマイコンの動作モードを変更する必要がある。


では、具体的に3052から3664へコードを移植する過程を解説していこう。


最初に行う必要があるのは、コード本体が参照する.INC(インクルード)ファイルをTiny用に書き換えることだ。INCファイルのコードはこちらにアップロードしてあるが、アドレスはTinyのアンチョコにもあるのでそちらも参照して欲しい。

次に行うのがベクターアドレスの設定である。プログラムの先頭に記述があるので確認しよう。

TinyがH8シリーズと異なる点はまずはこの部分で、

 data.w start
 org h'002e
 data.w int_scr3


1) SCI のエラー発生時に参照するインターラプト用アドレスは h'002e

2) そして、SCI用レジスタの名称がH8とは異なっている点にも注意しよう。

3) 取り敢えずアドレス空間のサイズが16ビットなので、データのアドレス指定はワードサイズで行っている。


当然ながら、この後に記述されているROM及びRAMのエリア開始アドレスもH8と互換性がない。

.section rom,data, locate=h'0034

.section ram,data,locate=h'f780    ;for 3664

RAMの総量が2kバイトと少なめなことも考慮しよう。   

*開発ツール(debugger)使用時には、RAMのユーザーエリアが1kに制限される点に注意!! この場合のRAMエリア開始アドレスは h'fb80 となる。


次にRAM領域へレジスタのアドレスを分配していく。

swtrig .res.b 1

outputs_1 .res.b 1
outputs_2 .res.b 1
outputs_3 .res.b 1
outputs_4 .res.b 1

preset .res.b 1

.org h'f790
rx_fifo .res.b 512


ここで、注意しなければならないのは、
リザーブするバイト数が常に「偶数」でなければならない点だ。例ではバイナリー6バイトと512バイトのデータがリザーブされているが、これがバイナリー7バイトになると、途端に動作がおかしくなる。もし変数が奇数個になった場合は、Align処理を行うか、ダミーを1バイトリザーブすることで、辻褄を合わせる必要がある。

.orgはオーガナイズの意。この場合はMIDI用の受信バッファーを512バイト分設定している。
追記: 後日、Tx機能を追加したより複雑なプログラムを組んで、DOS窓を開いてリンカを使ったところ、
**117 ADDRESS SPACE DUPLICATED というエラーに遭遇した。これは、プログラムのアドレスが重複していることを意味するアラートで、原因が判らず色々と悩んだ結果判明したのが、下記の部分のアドレスの重複だった。

  .section rom,data, locate=
h'0034

  .section program,code,locate=
h'0034

以前MotorMix用にプロブラミングした時はLookUpTableを記憶させたROM領域が存在しなかったために、偶々コンフリクトが回避されていたことに気がつかなかった。その後、ROMの番地を指定するコードを

  
.section rom,data, locate=h'1000

と改ためた後、エラーは解消されている。この場合、データ格納場所は本体のプログラムより後方に置くこと。
つづく→