ソケットって何よ?


EmuZ-2000で、DLLという方式を使って、拡張ボードを実現していることはお話しました。
どんなDLLでもEmuZ-2000は拡張ボードとして認識するのか?と言うと、答えは「No」です。

例えば、見ず知らずの人と待ち合わせをしているとします。
お互い携帯電話など連絡を取り合える手段が無かったとしたら、目印や特徴をお互いに知っておかなければ
ならないですよね。
そうでないと、全く違う人に話し掛けたり、そのまま飲みに行ったり、別れ際に別人だったと気づいたりしてしまいます。

だから、あらかじめEmuZ-2000の拡張ボードDLLは、目印を付けお話が出来る窓口を共通化しているのです。
それがソケットと言われる方式なのです。

ATマシンやATXマシンを自分で組み立てたことがある人なら、ソケットと言う単語には聞き覚えがありますよね。
マザーボードメーカーと、電源メーカーが申し合わせをして、「電源とマザーボードはこのソケットで繋ぐように共通化しよう」
と言うことになっているので、組み立てる人は惑わされずに安心して組み立てられるのです。
(まあ、ATの電源コネクタは2つになっていて、黒が内側!って知っておかなければはまりますが・・・)

さて、話がそれてしまいました。
具体的にどのようなやり取りが行われるのでしょうか?
MZ-1R12.DLLを使用して解説しましょう。

EmuZ-2000は起動すると、[EmuZ2000IoBox.INI]ファイルを開き、中に書かれている
[ExtBoard0=mz_1r12.dll]
という行を見つけます。
ここで、EmuZ-2000が「ダイナミックにDLLファイルをリンク」します。そうです、ここで初めてDLLがロードされるのです。

EmuZ-2000は、「拡張ボードDLLには、BoardInfomationService関数があるはずだ!これに応答しないのは俺の求めるライブラリではない!」
という勢いでDLL内部の関数を呼び出します。
もし、その関数が無かったり、応答できなかったりすると、EmuZ-2000は「さようなら〜」と言って、DLLをパージ(切り離し)してしまいます。
え?関数が無かったら呼べないじゃないかって?エラーが起きて赤バッテンダイアログが出て「不正な処理〜」が表示されるはずだって?
そのとおりです。ごもっともです。
ですから、EmuZ-2000は、あらかじめその関数があるかどうかを調べるのです。
まるで、飛行機に乗る前にボディチェックを受けるようなものですね。
搭載していない関数がある場合には、無用なトラブルを避けるために、EmuZ-2000内部に拡張ボードDLLと同じ関数が用意されていて、そこをコール
するようになっています。
全て失敗で返す関数ですが・・・これをStub(スタブ)と言います。
色々なシステムで、このスタブというからくりに出会うことが出来ます。DirectXなども採用しています。

砕けた会話表現でこの流れを書くと、
EmuZ-2000(E):「ねぇねぇ、お名前なんて〜の?」
DLL(D):「あら、私の名前はねぇ、MZ-1R12って言うのよ」
E:「へぇ、で趣味とか特技とかは?」
D:「私ってばS-RAMカードなのよ。しかも32KByteよ、ダイアログだって表示できるんだから!」
E:「それはすごひ!でも、なんか君とは初めて会う気がしないよ」
D:「何それ?そんな古い手には引っかからないわよ。でも、私もあなたに会うために生まれてきたのかもしれない」
E:「じゃあさ、君が僕を呼ぶときには1って番号付けて呼んでくれるかな、そしたら君って直ぐわかるから!」
D:「ありがと、じゃ私の思い出を、あなたの手帳に何時でも書けるようにしといてね。"31DD2499-F757-481b-9BCA-F0C60733368B"って
  ページに書いてあげる。これって私の識別番号だから忘れないでね。」

E:「了解、で、俺が君にして上げられることは何かな?」
D:「そうねぇ、IOアクセスされたときに私を呼んでくれれば嬉しいわ。アドレスは$F8〜$FA、または$04〜$06よ」
E:「今はどっちかな?」
D:「今はねぇ、$F8〜かな」
E:「判った。そうするよ。じゃ、次に会うときはイニシャライズだね!」
D:「えぇ、待ってるわ」

・・・・・・なんじゃこりゃ・・・アホか俺は・・・

とまあ、BoardInfomationService関数では、概ねこんなやり取りがされているようです。

このBoardInfomationService関数のやり取りから、拡張ボードとのインタフェースは始まります。
ここのやり取りさえ出来てしまえば、確実にボードとして認識されますので、お約束として覚えておきましょう。

最後にもう一度言うと、こういう取り決めがされたインタフェースを持ったDLLをダイナミックにリンクできる方式をソケットと言います。
判りました?

(ソケットのイメージは、EmuZ-2000のボードの絵を参照して下さい。下の方の部分です)

これです!