ずばりは、
「ハードウェアは規格化されているのに、ソフトウェアは規格化されていないから」
という単純な理由に他ならない。
そもそも、赤外線リモコンをいじくる事はそうそう難しい事ではないはずだ。やろうと思えば誰にだって出来るはず。ただ、管理するとなると話しは変わってくる。将来を見越して設計したソフトウェア体系が必要になってくるのだ。既存の規格なんてものは存在しない。どうせ作るなら最初から美しい規格を!
…というわけで今回めでたくIRCS規格を発表する運びになった。
IRCSの特徴としては、
IRCSは3つの階層からなり、
・IRD(ランレングス形式)
そこで、ランレングスで符号化したものをIRDとして定義する。実際の定義としては次のようになる。
_IRD struc ; assembler _on dw ? _off dw ? _IRD ends struct _IRD { /* C */ word _on; word _off; };上の構造体をIRD構造体として定義する。即ち、最初のワードにビット1の個数が入り、次のワードにビット0の個数が入る。ここで云うところの個数とは、生データでいうところのビット数に他ならない。
ハードウェアドライバに対するアクセスはこのデータ形式を用いる。一見簡単ではあるが、このIRD構造体の定義こそがIRCSにおいて最も重要な定義なのだ。
・ドライバの構造 一般的なDOSのキャラクタデバイスという形式をとる。インストールするには、CONFIG.SYS内に DEVICE=ステートメントで記述すれば良い。ADDDRV等でのインストールも可能だ。デバイスドライバの構造そのものの情報に関しては膨大な量に及ぶので既刊の解説誌等を参照されたし。
・APIエントリの取得
DOSを介したアクセスでは何かしら不便な現場に遭遇するので、IRCSでは独自のAPI(Application Programming Interface)を搭載している。このAPIを呼び出すには、まず呼び出すためのエントリアドレスを取得しなければならない。具体的にC言語でのソースを例に挙げてみよう。
handle = open("IRCS",O_RDONLY); ioctl(handle, 2, APIentry, 4); close(handle);デバイス IRCS をオープンし、そのハンドルに対する4バイトの READ IOCTL を実行すればエントリアドレスが得られる。あとはハンドルをクローズして終了。勿論、実際にインプリメントする際にはエラーチェックも忘れてはならない。
・IRCS APIのアクセス法
APIには _IRCS(IRCS Control Structure) という制御構造体が用意されている。その構造体へのポインタをスタックに積み、APIエントリを呼び出せば良い。
APIエントリはC言語インターフェースになっているので、ダイレクトにC言語からの呼び出しが可能である。アセンブラコードでは次の4命令に相当する。なお、呼び出し後のレジスタ、フラグは全て呼び出し前の値が帰ってくる事が保証される。
push ds push offset IRCSstruct call dword ptr APIentry add sp, +4・IRCS 制御構造体
_IRCS struc _APIcmd db ? db ? ; alignment adjust _APIcount dw ? _APIsrcptr dd ? _APIdstptr dd ? _APIstatus dw ? _IRCS ends struct _IRCS { byte _APIcmd; byte _APIdummy; /* alignment adjust */ word _APIcount; IRD far* _APIsrcptr; IRD far* _APIdstptr; word _APIstatus; };・IRCS API ファンクション詳細
00000000 C5 00 25 00 37 00 26 00-36 00 27 00 63 00 28 00 %.7.&.6.'.c.(. 00000010 62 00 29 00 34 00 29 00-62 00 29 00 61 00 2B 00 b.).4.).b.).a.+. 00000020 31 00 2B 00 32 00 2B 00-60 00 2B 00 32 00 2B 00 1.+.2.+.`.+.2.+. 00000030 32 00 2B 00 60 00 2B 00-32 00 2B 00 60 00 23 06 2.+.`.+.2.+.`.#. 00000040 BC 00 2C 00 31 00 2C 00-31 00 2B 00 60 00 2C 00 ,.1.,.1.+.`.,. 00000050 5F 00 2C 00 31 00 2C 00-5F 00 2D 00 5E 00 2E 00 _.,.1.,._.-.^... 00000060 2E 00 2F 00 2E 00 2E 00-5D 00 2F 00 2E 00 2E 00 ../.....]./..... 00000070 2F 00 2E 00 5D 00 2E 00-2E 00 2F 00 5D 00 00 00 /...]...../.]...・IRDD.COM (IRD Decoder)
・IRRC.COM
ubora 氏作。メモリに常駐して、ホットキーで起動する普通のリモコンみたいなもの。半年経ってまだ完成してない。なんとかしてくださいね:)
・MKS.EXE
ZORK氏作。カラオケ曲リストから選択して一発送信出来るデータベース検索ソフトみたいなもの。一応の完成はしているのだが実用に耐えないので改良を求む。
・IRLIB.EXE
thomas仙人作。ライブラリ・言語翻訳処理サーバ。IRCSでは中核を成す非常に大事な部分。…なのだが、本人多忙により完成していない(泣)
・MDINPUT.COM
SONYのMiniDiscのタイトル入力を簡便にするために作成した、即興作成アプリケーション。ファイルからの情報取得など、ちょっと面倒な事をしているが、ネタ的には余り面白くないソフトだ。しかし実用性は◎。
・MKSINPUT.COM
各社通信カラオケの曲番号入力を一元的に管理するために作られた。解析データを自前で組み立てる事によって小型化を実現している。結果的に、歪みの無いデータを送信する事が出来るのも特徴。メーカーモジュールという概念の前身になったソフトウェアでもある。
・TERM.COM
G-HAL 氏作。IRCSを用いてデータ通信をしようという試み。別紙で解説されていると思う。現在試験段階だが、実用化は近いかもしれない。
・IRD.COM
後述する Advanced IRD に対応したエンコーダ兼デコーダ。メーカーモジュールを結合する事により、将来的な拡張性が保証される。メーカーモジュールの概念を初めて取り入れたアプリケーション。メーカーモジュールはIRCSの中核を成すべくして作られた。thomas仙人のサーバが完成しないのでそれに対抗して製作を始めたもの。
ここで、赤外線データというのは何等かのデータに変調をかけたものである、という事実に基づき、データを直接バイナリデータとして扱うための手法を用意した。
「Advanced IRD」がそれである。
現在のところ IRD.COMというエンコーダ・デコーダが供給されているがこれは、メーカーユニークな信号を解析・保存・復元するための「メーカーモジュール」を結合する事により、各社データの解析等を行っている。
実際に IRD.COMは、メーカーモジュールの結合・IRCSの管理・共通ユーザーインターフェースを供給するためだけに存在しており、実際のデータ解析・構築処理などは全てメーカーモジュールが行う設計になっている。
ユーザーに手間をかけさせないのはプログラミングの基本中の基本であり、気の利い たプログラムと呼ばれるものはこの辺がしっかりしているはずだ。
さて、次を参照していただきたい。
offset 00h: db 'IRCS IMM' offset 08h: offset build_start offset 0Ah: offset build_repeat offset 0Ch: offset build_end offset 0Eh: offset analyze build_start: retf build_repeat: retf build_end: retf analyze: retfファイル先頭には 'IRCS IMM' という8バイトの識別子が存在する。この識別子により、このファイルがメーカーモジュールであるという決定的な証しとなる。
○メーカーモジュールの仕様
proc build_start ; ボタンを押した時のデータを構築する ; entry : ds:si=data ptr, cx=byte count, es:di=buf ptr ; return : cx = _IRD count, (ax=sign)=error ; broken : ax, cx proc build_repeat ; ボタンを押し続けた時のデータを構築する ; entry : ds:si=data ptr, cx=byte count, es:di=buf ptr ; return : cx = _IRD count, (ax=sign)=error ; broken : ax, cx proc build_end ; ボタンを離した時のデータを構築する ; entry : ds:si=data ptr, cx=byte count, es:di=buf ptr ; return : cx = _IRD count, (ax=sign)=error ; broken : ax, cx proc analyze ; IRD データを解析・構築する。 ; entry : ds:si=data ptr, cx=_IRD count, es:di=buf ptr ; return : cx = byte count, (ax=sign)=error ; broken : all (but segment register)○NEC.IMM
このモジュールは、NECのチップをトータルにサポートする。
NECのチップはカスタムコードと呼ばれる16ビットのベンダユニークなデータを含んでいるため、カスタムコードを変えるだけでコンフリクトのないデータを簡単に作成する事が可能である。この手軽さ故に、NECのチップを使用した一般家電メーカーはかなりの数に及んでおり、事実、このモジュールを適用可能なメーカーは相当な数にのぼる。
・データ解析
先頭に($2AC,$156) のリーダがあり、それに続いて16ビットのカスタムコード、8ビットのデータコード、データコードのビット反転8ビット、ストップビットが並ぶ。_IRDの個数は占めて34個。
エラー検出は正論理と負論理のデータを比較する事で行う。ただし、エラー訂正能力は無いので受信に失敗する可能性はある。
・対応メーカー
東芝, PIONEER, SANYO, 日立, 通信カラオケ各社, その他このモジュールでカバー出来るメーカーは予想以上に多い。PIONEER は独自拡張を施しているがそのデータにも対応している。
○SONY.IMM
このモジュールはSONYの赤外線リモコン全般をサポートする。
・データ解析
先頭に($C0,$30) のリーダがあり、それに続いて6ビットのデータコード、6ビットの機器コードが並ぶ。このデータを3つ連続して並べた物。_IRDの個数は占めて39個。データ自体にエラー検出・訂正能力はないが、繰り返して送信する事でエラー訂正を行っている。
エラー検出が出来ないので誤信号を受信してしまう可能性はあるが、受光部は単発データでは動作しないので、誤動作する可能性は無いに等しい。
・対応メーカー
SONY全製品。但し、ごく一部のデータに対してはこのモジュールは適用出来ない。
○VICTOR.IMM
このモジュールはVICTORの赤外線リモコンをサポートする。
・データ解析
先頭に($28E,$140) のリーダがあり、それに続いて8ビットの機器コード、8ビットのデータコードが並ぶ。このデータを2つ連続して並べた物。_IRDの個数は占めて35個。
データ自体にエラー検出・訂正能力はないが、繰り返して送信する事でエラー訂正を行っている。エラー検出が出来ないので、誤信号を受信する可能性はある。
・対応メーカー
VICTORの一部の製品に適用。
○PANASONI.IMM
このモジュールは Panasonic のごく一部のリモコンをサポートする。
・データ解析
先頭に($115,$105) のリーダがあり、それに続いて5ビットの機器コード、6ビットのデータコード、負論理機器コード、負論理データコード、最終ストップビットが並ぶ。_IRDの個数は占めて24個。
データのエラー検出は正論理と負論理のデータを比較する事で行う。ただしエラー訂正能力は無いので、受信に失敗する可能性はある。
・対応メーカー
Panasonic, 松下 の一部の製品に適用。
○SHARP3.IMM, SHARP5.IMM
このモジュールは SHARPのリモコンをサポートする。
・データ解析(SHARP3)
リーダ無し。3ビットの機器コード、9ビットのデータコード、トレーラ、3ビットの機器コード、9ビットの負論理データコード、トレーラ、の順に並ぶ。このデータを2回送信。_IRDの個数は占めて52個。
データのエラー検出は正論理と負論理のデータを比較する事で行う。エラー訂正は複数回送信する事により実現されている。
・データ解析(SHARP5)
リーダ無し。5ビットの機器コード、10ビットのデータコード、トレーラ、5ビットの機器コード、10ビットの負論理データコード、トレーラ、の順に並ぶ。このデータを2回送信。_IRDの個数は占めて64個。
データのエラー検出は正論理と負論理のデータを比較する事で行う。エラー訂正は複数回送信する事により実現されている。
・対応メーカー
SHARP 全製品に適用。…のはず。
○FUNAI1.IMM
このモジュールはフナイの一部のリモコンをサポートする。
・データ解析
先頭に($150,$150) のリーダがあり、それに続いて8ビットのカスタムコードが2つ、8ビットのデータコード、データコードのビット反転8ビット、ストップビットが並ぶ。_IRDの個数は占めて34個。
データのエラー検出は正論理と負論理のデータを比較する事で行う。ただしエラー訂正能力は無いので、受信に失敗する可能性はある。リピートコードは ($150,$150),($2B,$80),($2B,$1CE0)。
リーダとリピートコードを除けば NECのチップアーキテクチャに酷似している事に気がつく。少なからず何等かの影響は受けているだろう。
・対応メーカー
フナイの一部の製品に適用。
○FUNAI2.IMM
このモジュールはフナイの一部のリモコンをサポートする。
・データ解析
先頭に($260,$130) のリーダがあり、それに続いて8ビットの機器コード、トレーラ、8ビットのデータコード、トレーラ、の順に並ぶ。このデータを2回送信。_IRDの個数は占めて38個。
データのエラー検出は出来ない。エラー訂正は複数回送信する事により実現されている。エラー検出が出来ないので、誤信号を受信してしまう可能性はある。
・対応メーカー
フナイの一部の製品に適用。
この言語が完成すれば、指定時間に指定機器の電源を入れる、などの応用は朝飯前に出来るようになる。送信系・ファイル処理系・時間処理系、この3つがあれば、当分は遊べる言語になるかな。