MS-DOS PCカードプログラミング(執筆中)

最終更新: 1999.2.9


はじめに

本稿では、筆者が作成したライブラリとアプリケーションを題材として、 DOS環境でPCカード関連のプログラミングを行う方法について解説します。 また、Windows 95/98での適用法についても紹介します。 DOSのプログラミングに関する一般的な知識と、 PCカードのハード・ソフトのアーキテクチャに関する基本的な知識を前提とします。

対象環境は以下の通りです。

DOS用のPCカードサポートソフトは、一般にPC本体やPCカード関連製品に付属していますが、 最近の製品では付属していないことも少なくありません。 確実に入手する方法としては、PC DOS J7.0/V付属のPhoenixCard Managerがあります (PC DOS 2000については未確認)。

環境としてDOSを使用するのは、開発環境の整備が容易であること、 プログラムがシンプルにできること、資料が比較的豊富であること、などです。 参考までに、主要なPC用OSのPCカードサポート状況の比較を示します。


カードサービスライブラリ

カードサービスのインタフェースは、INT 1AHを使い、 パラメータの授受はレジスタ経由で行うことになっているので、 C言語から呼び出すにはint86x()geninterrupt()を使う必要があり繁雑です。 そこで、呼び出しを容易にするためのライブラリを作成しました。

カードサービスライブラリ
ファイル名 内容
typedef.h 一般的な宣言(型名など)
pcmcia.h PCカード全般に関する宣言(タプルIDなど)
cs.h カードサービス固有の宣言(機能コード・エラーコード・構造体・関数)
cs.c カードサービス汎用関数(CardServices())
csclisvc.c カードサービス個別関数 クライアントサービス関数
csresmgt.c リソース管理関数
cscliutl.c クライアントユーティリティ関数
csblkmem.c バルクメモリサービス関数
csadvsvc.c 拡張クライアントサービス関数

本ライブラリでのカードサービスの呼び出し方法は2つあります。 カードサービスの各機能はそれぞれ個別の関数(GetCardServicesInfo()RegisterClient()など)として用意されているので、直接呼び出すことができます。 また、汎用の関数(CardServices())を使って任意の機能を呼び出すこともできます。 前者の方が、引数の形式などが各機能に特化しているので、使いやすいでしょう。 本稿のアプリケーションでも前者の形式を使うことにします。

また、クライアント登録の際にRegisterClient()を使うと、 ユーザーが用意したコールバック関数がそのままカードサービスに通知され、 直接カードサービスから呼ばれます。 このときパラメータはレジスタに入っているので、 アセンブリレベルのコーディングが必要となります。 RegisterClientEx()を使うと、 ライブラリ内部で用意した中継関数(_CallBack())がカードサービスから呼ばれ、 ここでパラメータをスタックにセットしなおしてユーザーのコールバック関数を呼びます。 これにより、ユーザーはコールバック関数を通常のCの関数として記述することができ、 プログラミングの負担が軽減されます。

なお、ソケットサービスライブラリも作成しましたが、 こちらの方はあまり利用することはないと思われるので省略します。

(TBD)


カード情報表示プログラム

ここではまず、クライアント登録を必要としないプログラムの例として、 動作中のカードサービスやクライアント、挿入されているカードに関する情報を 収集して表示するプログラムを作成します。 処理の流れは以下の通りです。

  1. カードサービスの情報を表示
  2. クライアントを列挙し情報を表示
  3. 挿入されているカードについて、名称・コンフィギュレーションなどの情報を表示

利用するカードサービスの機能は以下の通りです。

(TBD)


メモリカードアクセスプログラム

次に、クライアント登録とイベント処理を必要とするプログラムの例として、 SRAMカードやリニアフラッシュカードなどのメモリカードを読み書きするプログラムを作成します。 プログラムの機能は以下の通りです。

利用するカードサービスの機能は以下の通りです。

処理するイベントは以下の通りです。

なお、リニアフラッシュカードは素子によって書き込みや消去のアルゴリズムが異なりますので、使用するカードに対応したMTDが必要です。

(TBD)


Windows 95/98の場合

Windows 95/98(以下95)でPCカードを使う場合、 DOS用のドライバ(「16ビットドライバ」)を使うか、 または95ネイティブのドライバ(「32ビットドライバ」)を使います。 どちらが使われているかは、「コントロールパネル」→「システム」 (または「マイコンピュータ」のプロパティ)の「パフォーマンス」で確認することができます。 性能や安定性の観点から、なるべく32ビットドライバを使うほうがよいとされています。

しかし、32ビットドライバ使用時にカードサービスを呼び出すには、 16ビットのカードサービス呼び出し手順INT 1AHは使えず、 VxD呼び出しを使わなくてはいけません。 そのためにはデバイスドライバかVxDを書く必要があり、 開発負荷が大きくなってしまいます。 ここでは、32ビットドライバ使用時でも、 95のDOSプロンプトからDOSと同じ手順で手軽にカードサービスを呼び出す方法を紹介します。

32ビットドライバ使用時、通常はDOSプロンプトからINT 1AHでカードサービスを呼び出すことはできません。 しかし、INT 1AHのカードサービス呼び出しをエミュレートする (INT 1AH呼び出しと32ビットカードサービスの仲介をする)ドライバ CSMAPPER.SYSが95に標準で付属しており、 これを組み込むと16ビットドライバ使用時と同様に INT 1AHでカードサービスを呼び出すことができます。 CSMAPPER.SYSを組み込むには、 CONFIG.SYSに下記の行を追加して95を再起動します。

DEVICE=C:\WINDOWS\SYSTEM\CSMAPPER.SYS

これで、16ビットドライバ同様にINT 1AHでカードサービスを呼び出すことができます。 ただし、以下の×印のファンクションはUNSUPPORTED_SERVICEエラーになります。

ファンクション 機能コードDOSプロンプトDOSモード
GetClientInfo 03H ×
GetFirstClient 0EH ×
RegisterEraseQueue 0FH
×
RegisterClient 10H ×
RegisterMTD 1AH ×
ReturnSSEntry 23H × ×
DeregisterEraseQueue 25H
×
CheckEraseQueue 26H
×
GetNextClient 2AH ×
AddSocketServices 32H ×
ReplaceSocketServices 33H ×
VendorSpecific 34H
×
AdjustResourceInfo 35H × ×
GetFirstWindow以降 37H〜 × ×

このため、DOSプロンプトでは以下のような制約があります。

クライアントの登録ができないことは大きな制約となります。 PCCard Freeに含まれるVMMAPPER.EXEを併用するとクライアントの登録ができるようになります。 ただし、イベント(コールバック)は、RegisterClientに対する擬似CARD_INSERTIONとREGISTRATION_COMPLETEのみ発生します。 これはVMMAPPERがシミュレートしているものと思われます。 なお、VMMAPPERはCPUの種類によっては組み込み時に謎のエラーを発生して組み込めないことがあります。

余談ですが、95でSRAMカードやリニアフラッシュカードを使うには、ヘルプにもある通り、 CSMAPPER.SYSに加えてCARDDRV.EXEを組み込みます。 CSMAPPER.SYSを必要とすることと、 確保されたドライブが「MS-DOS互換モード」となっていることから考えると、 CARDDRV.EXEは基本的に16ビットドライバだと思われます。 またCSMAPPER.SYSは、このように、 16ビットのカードサービスクライアントを使わざるをえないケースのために用意されたものでしょう。


参考文献・リンク集

文献

WWWページ

ソフトウェア


Copyright (C) 1998 ITO Takayuki, All rights reserved.

伊藤隆幸のホームページ