EXTFSK.DLLのサンプル  このパッケージはEXTFSK.DLLのサンプルです。本来のEXTFSK.DLLはUSBポート、またはユーザがインストールした独自のハードウエアのために作成しますが、このサンプルは既存のCOMポートの中間ドライバとして動作します。元々のEXTFSK.DLLの構成法や利用法については以下のURLを参照して下さい。 http://www.archi.is.tohoku.ac.jp/~ooba/ja7ude このサンプルでは、MMTTY内に実装されているFSK生成コードと異なり、FSKの符号タイミングをCOMポートのボーレートジェネレータを使わずに、マルチメディアタイマによって生成します。したがってFSK信号を、TXDはもちろん、RTSやDTR信号ラインのいずれからでも出力することができ、またその論理も反転できます。 生成されるタイミングはマルチメディアタイマの精度およびCPU処理能力に依存しますが、最近の高性能PCの場合、RTTYでは実用上の精度が得られると思います(Celeron 1.06GHz WindowsXPで実験した場合の符号のジッタは165ms期間で1ms程度でした)。 ========== ◎使用方法 ========== 解凍した「EXTFSK.DLL」を「MMTTY.EXE」が格納されているフォルダにコピーします。  MMTTY設定画面の「送信」ページを開き、PTTポート名に「EXTFSK」を選択します。また「その他」ページの送信ポートは「サウンド+Com TxD (FSK)」または「Com TxD (FSK)」を選択します(USBポート設定は[A:通常の処理]を選択して下さい) EXTFSKの小さなウインドウが開きますので、ポート名や使用する信号,論理などを設定して下さい。設定が完了すれば右上の「_」ボタンを押してウインドウを最小化しておきます。 =========================== LPTパラレルポートを使う場合 =========================== COMポートの代わりにLPTポートを出力ポートにする場合、WindowsNT/2000/XPではDLPORTIOが必要です。DLPORTIOは以下のURLでダウンロードできます。 http://pages.cthome.net/n1mm/html/English/Installation.htm  ダウンロードしたファイルを解凍し、以下の3つのファイルをMMTTYフォルダにコピーして下さい。 Dlportio\dll\TDLPortIO.dll Dlportio\DriverLINX\drivers\DLPORTIO.dll Dlportio\DriverLINX\drivers\DLPORTIO.sys  Windows95/98/SE/MEではDLPORTIOは必要ありません。 ======== ◎注意点 ======== 1)このプログラムの一部で、WindowsAPIの保障外の動作(TimeProcからのEscapeCommFunctionの呼び出し)を行っています。私の所持するパソコン(WindowsXP, 2000)では問題なく動作していますが、動作しない場合があるかも知れないことに留意して下さい。 2)生成される符号のタイミングは、マルチメディアタイマコールバックの時間精度およびCPU処理能力に依存します。 3)このプログラムでは、Baud=45.45, Stop=1.5 しか生成できません。 4)付属しているソースはC++Builder(V3)で書いてあります。改造し再配布しても構いません(連絡は不要です)。 =========================== ◎MMTTYとのインターフェース =========================== EXTFSK.DLLは以下の5つのファンクションをエクスポートしなければなりません。 extern "C" LONG __declspec(dllexport) __stdcall extfskOpen(LONG para) extern "C" void __declspec(dllexport) __stdcall extfskClose(void) extern "C" LONG __declspec(dllexport) __stdcall extfskIsTxBusy(void) extern "C" void __declspec(dllexport) __stdcall extfskPutChar(BYTE c) extern "C" void __declspec(dllexport) __stdcall extfskSetPTT(LONG tx)  各ファンクションは、__stdcall呼び出し規約(ファンクション側でスタックを調整する)で記述され、エクスポートしている名前に修飾があってはいけません。ただし各ファンクションの名前はアンダスコア(_)が1つ付加していても構いません。MMTTYは例えばextfskOpenを探し、それに失敗すると、_extfskOpenを探します。 LONG extfskOpen(LONG para) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] para:上位16ビット 速度(例:45) 下位16ビット b1-b0 Stop (0-1, 1-1.5, 2-2) b5-b2 Length (5, 6, 7, 8) [戻値]  TRUE - 成功, FALSE - 失敗 [解説] ポートをオープンします。Stop2が指定されてもStop1.5でオープンして下さい。 付属のサンプルではパラメータは無視され常にBaud=45.45, Stop=1.5でオープンされます。 void extfskClose(void) ~~~~~~~~~~~~~~~~~~~~~~ [解説] オープンしたポートをクローズします。 LONG extfskIsTxBusy(void) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [戻値]  TRUE - バッファがいっぱい, FALSE - バッファは空きがある [解説] 送信バッファがいっぱいかどうかを返します。 [参考]  快適なDiddle操作を確保するため、送信バッファの個数は可能な限り小さくして下さい。ただし符号の連続タイミングを一定に保つ必要がある場合は最低限1個のバッファが必要です。付属のサンプルは1個のバッファを設けた例です。 void extfskPutChar(BYTE c) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] c:送信するデータ [解説] 送信するデータをバッファに1バイト書き込みます。MMTTYはこのファンクションを呼び出す前に必ずextfskIsTxBusy()を呼び出してバッファに空きがあるかどうかを調査します。 void extfskSetPTT(LONG tx) ~~~~~~~~~~~~~~~~~~~~~~~~~~ [引数] tx b0: 0-受信に切り替え, 1-送信に切り替え b1: 0-画像スキャン停止中, 1-画像スキャン中 (MMSSTVのみ) [解説]  PTTを切り替えます。MMTTYではb0のPTTのみがセットされますが、MMSSTVでは「RTS while SCAN」をONにしている場合、b1の画像スキャン情報もセットされます。 73, Mako