強力な機能と便利で高速なプログラミングを備えた Borland Delphi2.0/3.0
そして大多数のプログラマーに愛されています。ただし、これを使用して産業用制御プログラムを作成する場合は、次のことが必要です。
コンピュータに接続された外部デバイスは、I/O アドレスを直接読み書きして動作します。
現時点では、このソフトウェアにはいくつかの欠陥があるようです。
この問題に対応するため、著者は Delphi 2.0/3.0 を使用してインライン アセンブリの形式で記述しています。
I/Oアドレスの直接読み書きを簡単に実現できるモジュールPORT95.PASを搭載しています。
コードはシンプルで実行速度が速いです。
使用する場合は、プロジェクトファイルにPORT95.PASを追加し、ユーザーにPortを追加するだけです。
95 を使用すると、アプリケーション上で I/O ポートを直接操作できます。
PORT95.PASの具体的な実装方法とソースコードは以下のとおりです。
ユニットポート95;
インタフェース
関数 PortReadByte(Addr:Word) : バイト;
関数 PortReadWord(Addr:Word) : Word;
関数 PortReadWordLS(Addr:Word) : Word;
Procedure PortWriteByte(Addr:Word; Value:Byte);
プロシージャ PortWriteWord(Addr:Word; Value:Word);
プロシージャ PortWriteWordLS(Addr:Word; Value:Word);
実装
{*
* ポートリードバイト機能
*パラメータ:ポートアドレス
*戻り値: 指定されたポートからのバイト値
*}
関数 PortReadByte(Addr:Word) : バイト レジスタ;
スター;
アズム
MOVDX、AX
AL、DXで
終わり;
{*
* HIGH SPEEDポートリードワード機能
* パラメータ: ポートアドレス
* 戻り値: 指定されたポートからのワード値
* コメント:一部のカードやコンピュータでは問題が発生する可能性があります。
単語全体にはアクセスできませんが、通常は機能します。
*}
関数 PortReadWord(Addr:Word) : Word アセンブラ;
スター;
アズム
MOVDX、AX
AX、DXで
終わり;
{*
* LOW SPEEDポートリードワード機能
* パラメータ: ポートアドレス
*Return:指定されたポートからのワード値
*コメント: 必要に応じて DELAY を調整するためだけに作業します。
*}
関数 PortReadWordLS(Addr:Word) : Word アセンブラ;
レジスター。
定数
遅延 = 150;
// CPU 速度とカード速度に応じて
アズム
MOVDX、AX
AL、DXで
//LSBポートを読み取る
MOV ECX、遅延
@1:
LOOP @1 //2 つの読み取り間の遅延
XCHG ああ、AL
株式会社DX
//ポート+1
IN AL,DX //MSBポートを読み取る
XCHG AH,AL //バイト順序を復元する
終わり;
{* ポート書き込みバイト関数*}
プロシージャ PortWriteByte(Addr:Word; Value:Byte);
r; 登録する。
アズム
XCHGAX、DX
アウトDX、AL
終わり;
{*
※HIGH SPEEDポート書き込みワード手順
* コメント:一部のカードやコンピュータでは問題が発生する可能性があります。
単語全体にはアクセスできませんが、通常は機能します。
*}
プロシージャ PortWriteWord(Addr:word; Value:word);
r; 登録する。
アズム
XCHGAX、DX
アウトDX、AX
終わり;
{*
※LOW SPEEDポートのWrite Word手順
*}
プロシージャ PortWriteWordLS(Addr:word; Value:word);
登録します。
定数
遅延 = 150;
// CPU 速度とカード速度に応じて
アズム
XCHGAX、DX
アウトDX、AL
MOV ECX、遅延
@1:
ループ@1
XCHG ああ、AL
株式会社DX
アウトDX、AL
終わり;
// ユニットの終了
上記の PORT95.PAS は、Delphi 2.0/3.0 および Windows 95 オペレーティング システムに適しています。
。