以前ハムフェアで100円で入手したENEのCB-1410があったのでAprivaに入れてみました。
いろいろ探してみたところDOS(16Bit)でPCI BIOSをアクセスするサンプルコードがありました。watcomのコンパイラーとnasmでビルドできるようなので、環境はすでに構築済みです。
ENEはデーターシートを公開していないようなのですが、FreeBSDのコードを見ているとTIの製品と同じように処理できるようなので、TIのPCI1410のデータシートを参考にすることにします。型番からして、コンパチ製品なのかもしれません。
ENEはかなり後になってから製品を出していて、DOSのサポートはまったく無かったようです。
とりあえずcardbusは後にしてPCMCIAをいじってみます。
レジスタの44HにIOアドレスを設定してそこを使って処理できるようです。
その処理内容はここに書かれてありました。すごいです。
コードはここでいじります。
とりあえずPCMCIAカードをISA空間に貼り付けることを目標にします。
こういうのって、物理マシンじゃないと楽しめないですね。
FreeBSDの上でビルドして自分で作ったmTCPのtftpでexeをコピーして試しています。
DOSのメモリやIOはこのようになっていました。
8086は8080由来のメモリとIOが別々のアドレス空間で使えました。
メモリ空間は20bitで1Mバイトで前半はプログラムの実行などに利用するRAMですが後半はVGAなどのデバイスで使われていました。
IO空間は8080は8bitで256でしたが8086では16bitになり、64kになりました。
デバイスは以下のパターンがありました。
- IO空間だけ利用
- メモリ空間だけ利用
- IO空間と割り込みを利用
- メモリ空間と割り込みを利用
- IO空間とメモリ空間と割り込みを利用
PCMCIAの場合アドレス空間はメモリー空間が2つとIO空間が1つあります。メモリー空間の一つは属性やコンフィグレーションを行う空間で、もう一つは実際のメモリー空間です。カード情報(CIS)は属性空間にあり、これを読む必要があります。もし事前にCISを読んでindexやCCORのアドレスを決め打ちで設定するにしても、属性空間にあるCCORへの書き込みは必須になります。
初期のISAのカードはディップスイッチでIOアドレスなどを代えるようになっていました。たとえばシリアルのカードはデフォルトが0x3F8(COM1)か0x2F8(COM2)になっていたと思われます。内蔵でCOM1,COM2がある場合はこれ以外に代える必要があります。
PCMCIAのコンフィグレーション機構はISAのPnPとは違っているようです。USBのコンフィグレーションのプロトタイプのような感じもします。
DOSで常駐型のプログラムにする必要があるのはAPIを提供するか、または割り込みの処理を行う場合です。これ以外の場合は常駐型にする必要はないので、カードの抜き差しの検知をしなければ、普通のアプリでもカードの設定はできると思います。
PCMCIAカードで16Bitマイコンなどを搭載してホストからファームをダウンロードするタイプのカードもありました。おそらくこれらはメモリー空間にカードのメモリをマップして書き込んで、その後マイコンを動かすような仕組みだったのではないかと想像されます。
昔の情報を調べていると、カードサービスに対応したドライバーが一般的だが、それ以外に直接82356を叩くスタンドアローンのドライバや設定プログラムもあったよいうだ。
結局CardBus Socket/ExCA Base Address(10h)を使って0xb0000-0xb0fffに貼り付けて、メモリウインドウを0xb1000-0xb1fffにして処理するようにしました。
どうにかCISが見えるようになったのですが、CISに含まれるConfiguration map(0x1a)にCCORのオフセットがあるので、CISのConfiguration entry(0x1b)の設定するindexをそこに書き込むとそのアドレスが、有効になります。
4KのCISのメモリウインドウにCCORもあればそのままいけるが、4Kより上にある場合は貼り付けなおさなければいけない。