Borland Delphi2.0/3.0 mit seinen leistungsstarken Funktionen und der komfortablen und schnellen Programmierung
Und von der Mehrheit der Programmierer geliebt. Aber wenn Sie es zum Schreiben industrieller Steuerungsprogramme verwenden, müssen Sie es tun
Das an den Computer angeschlossene externe Gerät arbeitet, das heißt, es liest und schreibt direkt die E/A-Adresse.
Derzeit scheint die Software einige Mängel aufzuweisen.
Als Reaktion auf dieses Problem verwendet der Autor Delphi 2.0/3.0, um in Form einer Inline-Assembly zu schreiben
Es ist ein Modul PORT95.PAS installiert, mit dem direkte Lese- und Schreibvorgänge auf I/O-Adressen problemlos realisiert werden können.
Der Code ist einfach und schnell in der Ausführung.
Wenn Sie es verwenden, fügen Sie einfach PORT95.PAS zur Projektdatei hinzu und fügen Sie Port zu Benutzern hinzu
95 können Sie den I/O-Port direkt in der Anwendung bedienen.
Die spezifische Implementierungsmethode und der Quellcode von PORT95.PAS lauten wie folgt:
Einheit Port95;
Schnittstelle
Funktion PortReadByte(Addr:Word) : Byte;
Funktion PortReadWord(Addr:Word) : Word;
Funktion PortReadWordLS(Addr:Word) : Word;
PROzedur PortWriteByte(Addr:Word; Value:Byte);
procedure PortWriteWord(Addr:Word; Value:Word);
procedure PortWriteWordLS(Addr:Word; Value:Word);
Durchführung
{*
* Port-Lesen-Byte-Funktion
*Parameter:Portadresse
*Rückgabe: Bytewert vom angegebenen Port
*}
Funktion PortReadByte(Addr:Word): Byte-Assembler;
ster;
asm
MOVDX,AX
IN AL,DX
Ende;
{*
* High-Speed-Port-Read-Word-Funktion
* Parameter: Portadresse
* Rückgabe: Wortwert vom angegebenen Port
* Kommentar: Bei einigen Karten und Computern kann es zu Problemen kommen
Ich kann nicht auf das ganze Wort zugreifen, normalerweise funktioniert es.
*}
Funktion PortReadWord(Addr:Word): Word-Assembler;
ster;
asm
MOVDX,AX
IN AX,DX
Ende;
{*
* LOW SPEED Port Read Word-Funktion
* Parameter: Portadresse
*Rückgabe: Wortwert vom angegebenen Port
*Kommentar: In Einzelfällen arbeiten, DELAY nur bei Bedarf anpassen
*}
Funktion PortReadWordLS(Addr:Word) : Word-Assembler;
gister;
const
Verzögerung = 150;
// abhängig von CPU-Geschwindigkeit und Kartengeschwindigkeit
asm
MOVDX,AX
IN AL,DX
// LSB-Port lesen
MOV ECX, Verzögerung
@1:
LOOP @1 //Verzögerung zwischen zwei Lesevorgängen
XCHG AH,AL
INC DX
//Port+1
IN AL,DX //MSB-Port lesen
XCHG AH,AL //Byte-Reihenfolge wiederherstellen
Ende;
{* Port-Write-Byte-Funktion*}
procedure PortWriteByte(Addr:Word; Value:Byte);assemble
r; registrieren;
asm
XCHGAX,DX
OUT DX,AL
Ende;
{*
* High-Speed-Port-Write-Word-Verfahren
* Kommentar: Bei einigen Karten und Computern kann es zu Problemen kommen
Ich kann nicht auf das ganze Wort zugreifen, normalerweise funktioniert es.
*}
procedure PortWriteWord(Addr:word; Value:word);
r; registrieren;
asm
XCHGAX,DX
OUTDX,AX
Ende;
{*
* LOW-SPEED-Port-Write-Word-Verfahren
*}
procedure PortWriteWordLS(Addr:word; Value:word assembl.);
ler; registrieren;
const
Verzögerung = 150;
// abhängig von CPU-Geschwindigkeit und Kartengeschwindigkeit
asm
XCHGAX,DX
OUT DX,AL
MOV ECX, Verzögerung
@1:
LOOP@1
XCHG AH,AL
INC DX
OUT DX,AL
Ende;
Ende. //Ende der Einheit
Der obige PORT95.PAS ist für die Betriebssysteme Delphi 2.0/3.0 und Windows 95 geeignet
.