双方向パラレルポードを制御した〜い
■ このスレッドは過去ログ倉庫に格納されています
0001むっち
NGNGVC++で、conio.hをインクルードして_inpや_outpを使い
PCの双方向パラレルポートを制御するためには、
具体的にどのようなプロトコルに沿ってパラレルポートを
制御すればいいのかわかりません。
パラレルポートのアドレスは、0x378です。
知っている方がいたら教えてください。
読み取りの方法を特に知りたいのです
また、ひょっとしてプロトコルなどはなくポートのアドレスに対して、
いきなり_inpや_outpとか入出力できるんでしょうか?
あと以前「Win32APIのOpenPrinterやReadPrinterも使える」
とかいうのをどこかの掲示板で見かけましたが、そこでは、
「ECPプロトコルに沿ったハンドシェークが必要」
とあったと思います。
ECPプロトコルについてのHPはどこにあるんでしょうか?
小耳に挟んだことで、質問の内容とは直接関係ありませんが
PC-98シリーズの双方向パラレルは、双方向にするための
なにかコマンドが必要らしいです。
0002むっち
NGNG自己レスさせていただきます。
_outp(0x37a@` 0x01);
_outp(0x378@` 0x80);
_outp(0x37a@` 0x00);
とすれば、0x80がポートに出力されるようです。
しかし、0x37aに出力しているのが何を意味するのか
はっきりしません(^^;
また、ポートを使ったあとには、
_outp(0x37a@` 0x01);
_outp(0x378@` 0x00);
_outp(0x37a@` 0x00);
としておくのだそうです。
0003Winでやるなら
NGNGなんとなく、ECP以前にPIOの使い方調べたほうが良いと思う。
それに、双方向で動かすなら、割り込み使わんとまともに動かんと思うが。
0004質問者
NGNGPIOについても調べてみます。
私的にラジコンのプロポ等を制御とモニターをしたいだけなんです。
プロポの変わりにジョイスティック使って(^^;
さらに、ラジコンにCCDとビデオトランスミッター付けて
PC側にはビデオキャプチャーカードつけて...
ほら、なんだか面白そうじゃないですか。(爆
こういった用途に使う予定なんです。
特にストリームデータを転送するわけではなく、
定期的にモニターしたいだけなので割りこみは特に必要ないかと思います。
ところで、
いろいろやってみたら、なんとなく5bit分は読めるようになりました。
普通のパラレルクロスケーブルが5bit分しか繋がっていないのかな?
または、ただやり方が間違っているのかな?、それはちょっと不明です。
一方で出力後、0x379(LPTポートが0x378の時)を
RetVal = _inp(0x379);
とかすれば読めます。ただ、ビットが多少入れ替わってますけど(^^;
そういえば、パラレルポートにスーファミのコントローラー
を繋げて遊ぶというDirectPadというのがあるようですが、
たしか、一個のパラレルポートにつき5台のコントローラーまでしか
使えなかったと思うので、これと関係がありそうです。
関係無かったら、すいません。
では。
0005>4
NGNGDOSならVDMがエミュレーションしてくれるはずだからいいけど
それ本当にI/Oポート読めてるの?
本当は、PIOのコントロールレジスタ制御したり、ステータスレジスタ見たりしなきゃいけないんだけど。
Win32アプリなら、特権命令(inp@`outpなど)使った時点でエラーなんだとおもったけど、捨てられてるのかな?
基本的には、デバイスファイル("LPT1"とか)をオープンして
後は、ReadFileとWriteFileでやるのがスジでしょ。
0006IOアクセス
NGNG0007daive
NGNGそのものズバリは、無いけれど、OCXが
WIN32?? I/O制御
とか何とかで、いくつか登録されていたはずです。
00085>6
NGNGでも、I/Oポートはいじくらないほうが良いと思う。
自分で作ったPIOボードなら別だけど。
0009むっち
NGNG私の環境ではちゃんと読めています
・読み込み用に使ったパラレルポートは、
Aptiva770というちょっと昔のマシンのマザーにオンボードに
なっているパラレルポートです。アドレスは0x378でした。
・書き込み用のためのパラレルポートは、
Aptiva770にISA非PnPのマルチI/Oカードを増設してやり、
そのポートを使っています。アドレスは、0x278でした。
・さらに二つのポートどうしを、クロスケーブルで繋げてやったんです
・使用したOSは、Win98でした。言い遅れて申し訳ありませんでした
同じマシンのポートで実験しているため、
I/Oを直接叩いた時、ケーブルを伝わったのではなく
ただ他のアドレスに影響を与えて読めたと勘違いしている
かどうかをはっきりさせるため、クロスケーブルが
"あり"と"なし"で実験しましたところ、
"なし"の時、まったく読めませんでした-->ちゃんと読めてる(!?)
私の環境では、何故か運良くうまくいったようですが、
5番さんのおっしゃるとおり、ちゃんと手順をふんでコントロール
していないので、不安要素たっぷりです。(笑
Z80のPIOで8212のようにコントロールワードが必要で無いものもありましたよね?
私の環境では、8212のように気軽に扱うことも可能のようです。
(そもそも、たとえも悪い.....)
7番さんのおしゃられることは、よくわかります。
しかし、I/O制御のコンポーネントを使ったとしても、
パラレルポートの制御は自動で行ってくれないの
ではないでしょうか?そこがちょっとわからないです。
>でも、I/Oポートはいじくらないほうが良いと思う。
8番さん、ご忠告ありがとうございますっ。
CreateFile@`WriteFile@`ReadFile等のAPIを使ったものへ変更しようと思います
方法についてはWin32APIのヘルプを見たら、わかりました。
最後に、あまり関係ないので恐縮ですが、
調べているうちにわかったことを書かせて頂きます。(間違っているかもしれないけど)
0x37aに出力していたものは、どうやらSTBパルスのようです。
プリンタに文字を出力するときは必要っぽいですが、私のような用途に使いたい場合は、
0x378に直接_outpしてもうまくいくようです。(!!環境依存してる可能性大!!)
では!
00105>9
NGNGそれが良いと思います。
たぶん、それなりに、データが流れたのは、既に、Winのドライバか、
BIOSによって、初期化されていたためでしょうね。
I/OポートもPNPで変わっちゃう可能性も有るんで。
0011不良プログラマ
NGNGその目的ならば、IO直たたきの方が楽だと思います。
PIOのベースアドレスが0x378の場合、
0x378:データレジスター
0x379:ステータスレジスター
0x37A:コントロールレジスター
です。
で、0x379は、
Bit 0-1 予約
Bit 2 割り込みステータス
Bit 3 /ERROR Pin15の入力信号
Bit 4 SLCT Pin13の入力信号
Bit 5 PE Pin12の入力信号
Bit 6 /ACK Pin10の入力信号
Bit 7 BUSY Pin11の入力信号
です。
また、0x378にデータを書けば、Pin2-9にデータが出力されます。
で、外部に繋いだ回路で、そのデータをSTROBEのエッジでラッチを
かけて使います。
0x379は
Bit0 STROBE
Bit1 AUTO FEED
Bit2 /INIT
Bit3 SLCT IN
Bit4 割り込み許可
Bit5 Direction
Bit6-7 予約
です。全部0を書いておけば良いでしょう。
それじゃ、がんばってね。
0012もしかして、
NGNGリモートマシンのパラレルをアクセス出来るのかな?
■ このスレッドは過去ログ倉庫に格納されています