Accès aux ports
L'accès aux ports s'effectue au moyen de deux tableaux (le tableau “Port” pour lire ou écrire un Byte et le tableau PortW pour lire ou écrire un Word) prédéfini dans le langage Pascal. Voici deux exemples:
Valeur := Port[adresse]; { Lit l'état d'un port } Port[adresse] := Valeur; { Place une valeur sur un port }
Il est également possible d'accéder aux ports via quelques instructions en Assembleur “inline”:
FUNCTION InPortB(LePort:WORD):BYTE; { BUT: Lecture de l'état d'un port } VAR Valeur : BYTE; BEGIN ASM PUSH DX MOV DX, LePort IN AL, DX MOV Valeur, AL POP DX END; {ASM} InPortB := Valeur; END; {FUNCTION InPortB} PROCEDURE OutPortB(LePort:WORD; Valeur:BYTE); ASSEMBLER; { BUT: Ecriture sur un port } ASM PUSH DX MOV DX, LePort MOV AL, Valeur OUT DX, AL POP DX END; {PROCEDURE OutPortB}
Sous Turbo Pascal et Delphi 1, les tableaux Port et PortW sont utilisables pour l'accès aux ports. Mais par contre, sous Delphi 2, ces tableaux ont été supprimés, tout comme les tableaux Mem et MemW qui permettaient d'accéder directement à une adresse en mémoire.
La raison de ces suppressions est simple: rendre le système (plus) stable en empêchant les accès bas niveau, et en obligeant les programmeurs à utiliser les fonctions protégées de l'API Windows.
Ce qui veut dire que pour utiliser notre carte sous Windows 95 ou Windows NT, il faudrait écrire un driver et utiliser les fonctions de Windows qui permettent d'accéder à un driver. Mais l'écriture d'un driver est un travail qui nécessite de très bonnes connaissances en assembleur, que l'on connaisse parfaitement les mécanismes d'accès bas niveau de Win32, et quelques mois de travail…
On peut détourner cette protection en utilisant les routines en assembleur, mais c'est aux risques et périls du programmeur, car il n'y a plus aucune sécurité (adieu au logo “Designed for Windows 95”).