Sign in Join
Wiki copytemporary

Hardware Access/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-## Vue d'ensemble
1+## Contents
22
3-Cette page est le début d'un tutoriel sur la manière d'accéder aux périphériques matériels de Lazarus. Ces dispositifs incluent les matériels suivants, mais ne sont pas limités à ceux-ci: ISA, PCI, USB, port parallèle, port série.
3+ * 1 Vue d'ensemble
4+ * 2 Comparaison parallèle et série
5+ * 3 Communication parallèle
6+ * 3.1 Utilisation de inpout32.dll pour Windows
7+ * 3.2 Employer l'assembleur sur Windows 9x
8+ * 3.3 Dépannage sur Windows
9+ * 3.4 Utilisation de ioperm pour accéder à des ports sur Linux
10+ * 3.5 Access général au matériel UNIX
11+ * 4 Communication série
12+ * 5 Liens externes
413
5-L'accès aux périphériques matériels d'une façon complètement multi-plate-forme n'est pas implémenté par la bibliothèque d'exécution de Free Pascal ou par la LCL. Aussi ce tutoriel va fondamentalement couvrir des méthodes d'accès matérielles sur des plates-formes diverses. Le code peut être compilé sur différents environnements en employant la compilation conditionnelle, comme ceci :
14+## Vue d'ensemble
615
7-``` pascal
8- uses
9- Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
10- {$IFDEF WIN32}
11- Windows;
12- {$ENDIF}
13- {$IFDEF Unix}
14- ports;
15- {$ENDIF}
16+Cette page est le début d'un tutoriel sur la manière d'accéder aux périphériques matériels de Lazarus. Ces dispositifs incluent les matériels suivants, mais ne sont pas limités à ceux-ci: ISA, PCI, USB, port parallèle, port série.
17+
18+L'accès aux périphériques matériels d'une façon complètement multi-plate-forme n'est pas implémenté par la bibliothèque d'exécution de Free Pascal ou par la LCL. Aussi ce tutoriel va fondamentalement couvrir des méthodes d'accès matérielles sur des plates-formes diverses. Le code peut être compilé sur différents environnements en employant la compilation conditionnelle, comme ceci :
1619```
20+uses
21+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
22+ {$IFDEF WIN32}
23+ Windows;
24+ {$ENDIF}
25+ {$IFDEF Unix}
26+ ports;
27+ {$ENDIF}
28+```
1729
18-On ne sait pas encore, pour l'instant, si Mac OS X/x86 permettra des accès HW. Il peut le rejeter, quoique dans ce cas je suppose qu'à terme des pilotes de périphériques comme io.dll apparaîtrons.
30+On ne sait pas encore, pour l'instant, si Mac OS X/x86 permettra des accès HW. Il peut le rejeter, quoique dans ce cas je suppose qu'à terme des pilotes de périphériques comme io.dll apparaîtrons.
1931
2032## Comparaison parallèle et série
2133
22-Les cartes ISA, les cartes PCI et le port parallèle communiquent avec l'ordinateur en utilisant un protocole **parallèle**. Le port série et les périphériques USB travaillent avec un protocole **série**. Puisque le processeur et de ce fait les langages de programmation travaillent tous dans une approche parallèle aux données, accéder à ces diverses sortes de protocoles est plus simple à implémenter du coté logiciel. Quand vous accédez par exemple à une variable entière (Integer), vous pouvez accéder à sa valeur par une commande simple. Cependant, avec un protocole série, vous pouvez seulement connaître un bit à la fois et vous devez coller les morceaux ensemble pour comprendre les données.
23-
24-La communication série est difficile à implémenter directement, mais ce peut être assez facile si vous employez un composant tout-prêt. C'est également plus dur du côté matériel, aussi la plupart des périphériques utilisent des circuits intégrés spécialisés ou même des microcontrôleurs pour l'implémenter.
34+Les cartes ISA, les cartes PCI et le port parallèle communiquent avec l'ordinateur en utilisant un protocole **parallèle**. Le port série et les périphériques USB travaillent avec un protocole **série**. Puisque le processeur et de ce fait les langages de programmation travaillent tous dans une approche parallèle aux données, accéder à ces diverses sortes de protocoles est plus simple à implémenter du coté logiciel. Quand vous accédez par exemple à une variable entière (Integer), vous pouvez accéder à sa valeur par une commande simple. Cependant, avec un protocole série, vous pouvez seulement connaître un bit à la fois et vous devez coller les morceaux ensemble pour comprendre les données.
2535
26-Voici une brève comparaison des protocoles d'accès au matériel:
36+La communication série est difficile à implémenter directement, mais ce peut être assez facile si vous employez un composant tout-prêt. C'est également plus dur du côté matériel, aussi la plupart des périphériques utilisent des circuits intégrés spécialisés ou même des microcontrôleurs pour l'implémenter.
2737
28-| | Vitesse | Difficulté d'implémentation matérielle |
29-|----|----|----|
30-| Port série | Très lent (\< E5 bit/s) | Milieu |
31-| Port parallèle | Lent (~ E6 bit/s) | Facile |
32-| Carte ISA | Milieu (~ E7 bit/s) | Milieu |
33-| USB | Milieu (~ E7 bit/s) | Dur |
34-| Carte PCI | Très rapide (\> E9 bit/s) | Très dur |
38+Voici une brève comparaison des protocoles d'accès au matériel:
3539
40+| Vitesse | Difficulté d'implémentation matérielle
41+---|---|---
42+Port série | Très lent (< E5 bit/s) | Milieu
43+Port parallèle | Lent (~ E6 bit/s) | Facile
44+Carte ISA | Milieu (~ E7 bit/s) | Milieu
45+USB | Milieu (~ E7 bit/s) | Dur
46+Carte PCI | Très rapide (> E9 bit/s) | Très dur
47+
3648## Communication parallèle
3749
3850### Utilisation de inpout32.dll pour Windows
3951
40-Windows a différentes manières d'accéder aux périphériques matériels sur les séries 9x et sur les séries NT. Sur les séries 9x (95, 98, Me) les programmes peuvent accéder au matériel directement , juste comme ils faisaient avec le DOS. Les séries de NT (Windows NT et XP), cependant , ne permettent pas cette approche. Sur cette architecture , toute communication avec des ports matériel doit être effectuée au travers d'un pilote de périphérique. C'est un mécanisme de sécurité, mais développer un pilote peut coûter beaucoup trop en termes de temps et d'argent pour de petits projets.
41-
42-Heureusement il y a une bibliothèque qui résout ce problème.Si Windows NT est détecté, il décompresse le noyau du pilote de périphérique HWInterface.sys et l'installe. Si Windows 9x est détecté, il emploie simplement des codes d'opération en assembleur pour accéder au matériel .
52+Windows a différentes manières d'accéder aux périphériques matériels sur les séries 9x et sur les séries NT. Sur les séries 9x (95, 98, Me) les programmes peuvent accéder au matériel directement , juste comme ils faisaient avec le DOS. Les séries de NT (Windows NT et XP), cependant , ne permettent pas cette approche. Sur cette architecture , toute communication avec des ports matériel doit être effectuée au travers d'un pilote de périphérique. C'est un mécanisme de sécurité, mais développer un pilote peut coûter beaucoup trop en termes de temps et d'argent pour de petits projets.
4353
44-Mais comment j'emploie la bibliothèque ? Simple! Il a seulement deux fonctions , Inp32 et Out32, et leur utilisation est tout à fait intuitive .
54+Heureusement il y a une bibliothèque qui résout ce problème.Si Windows NT est détecté, il décompresse le noyau du pilote de périphérique HWInterface.sys et l'installe. Si Windows 9x est détecté, il emploie simplement des codes d'opération en assembleur pour accéder au matériel .
4555
46-Nous chargerons la bibliothèque dynamiquement, ainsi définissons les deux fonctions d'abord :
56+Mais comment j'emploie la bibliothèque ? Simple! Il a seulement deux fonctions , Inp32 et Out32, et leur utilisation est tout à fait intuitive .
4757
48-``` pascal
49- type
50- TInp32 = function(Address: ShortInt): ShortInt; stdcall;
51- TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
58+Nous chargerons la bibliothèque dynamiquement, ainsi définissons les deux fonctions d'abord :
5259```
53-
54-- L'adresse représente l'adresse du port que vous désirez accéder
55-- Out32 envoie des données au port que vous indiquez avec l'adresse
56-- Inp32 renvoie un octet du port que vous indiquez par l'adresse
57-
58-Maintenant nous pouvons charger la bibliothèque. Ceci peut être implémenté dans un endroit comme la méthode OnCreate de fiche principale de votre programme :
59-
60-``` pascal
61- type
62- TMyForm = class(TForm)
63- .........
64- private
65- { private declarations }
66- Inpout32: THandle;
67- Inp32: TInp32;
68- Out32: TOut32;
69- .........
70- implementation
71- .........
72- procedure TMyForm.FormCreate(Sender: TObject);
73- begin
74- {$IFDEF WIN32}
75- Inpout32 := LoadLibrary('inpout32.dll');
76- if (Inpout32 <> 0) then
77- begin
78- // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors
79- Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32'));
80- if (@Inp32 = nil) then Caption := 'Error';
81- Out32 := TOut32(GetProcAddress(Inpout32, 'Out32'));
82- if (@Out32 = nil) then Caption := 'Error';
83- end
84- else Caption := 'Error';
85- {$ENDIF}
86- end;
60+type
61+ TInp32 = function(Address: ShortInt): ShortInt; stdcall;
62+ TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
8763```
8864
89-Si vous chargez la bibliothèque sur OnCreate juste ne pas oublier de le décharger dans OnDestroy:
65+ * L'adresse représente l'adresse du port que vous désirez accéder
66+ * Out32 envoie des données au port que vous indiquez avec l'adresse
67+ * Inp32 renvoie un octet du port que vous indiquez par l'adresse
9068
91-``` pascal
92- procedure TMyForm.FormDestroy(Sender: TObject);
93- begin
94- {$IFDEF WIN32}
95- FreeLibrary(Inpout32);
96- {$ENDIF}
97- end;
69+Maintenant nous pouvons charger la bibliothèque. Ceci peut être implémenté dans un endroit comme la méthode OnCreate de fiche principale de votre programme :
9870```
71+type
72+ TMyForm = class(TForm)
73+ .........
74+ private
75+ { private declarations }
76+ Inpout32: THandle;
77+ Inp32: TInp32;
78+ Out32: TOut32;
79+ .........
80+ implementation
81+ .........
82+ procedure TMyForm.FormCreate(Sender: TObject);
83+ begin
84+ {$IFDEF WIN32}
85+ Inpout32 := LoadLibrary('inpout32.dll');
86+ if (Inpout32 <> 0) then
87+ begin
88+ // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors
89+ Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32'));
90+ if (@Inp32 = nil) then Caption := 'Error';
91+ Out32 := TOut32(GetProcAddress(Inpout32, 'Out32'));
92+ if (@Out32 = nil) then Caption := 'Error';
93+ end
94+ else Caption := 'Error';
95+ {$ENDIF}
96+ end;
97+```
9998
100-Voici un exemple simple de la façon d'employer la fonction Inp32 :
99+Si vous chargez la bibliothèque sur OnCreate juste ne pas oublier de le décharger dans OnDestroy:
100+```
101+procedure TMyForm.FormDestroy(Sender: TObject);
102+ begin
103+ {$IFDEF WIN32}
104+ FreeLibrary(Inpout32);
105+ {$ENDIF}
106+ end;
107+```
101108
102-``` pascal
103- {$IFDEF WIN32}
104- myLabel.Caption := IntToStr(Inp32($0220));
105- {$ENDIF}
109+Voici un exemple simple de la façon d'employer la fonction Inp32 :
106110```
111+{$IFDEF WIN32}
112+ myLabel.Caption := IntToStr(Inp32($0220));
113+ {$ENDIF}
114+```
107115
108-Ce code a été testé avec une carte habituelle ISA sur le port \$0220, en utilisant Lazarus 0.9.10 sous Windows XP. Naturellement, vous devrez avoir Windows sur votre clause d'utilisations afin que ce code s'exécute. Pour le déploiement vous devez seulement inclure "inpout32.dll" dans le même répertoire de notre application .
116+Ce code a été testé avec une carte habituelle ISA sur le port $0220, en utilisant Lazarus 0.9.10 sous Windows XP. Naturellement, vous devrez avoir Windows sur votre clause d'utilisations afin que ce code s'exécute. Pour le déploiement vous devez seulement inclure "inpout32.dll" dans le même répertoire de notre application .
109117
110-C'est la page d'accueil pour la bibliothèque : [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm) *voir la discussion *
118+C'est la page d'accueil pour la bibliothèque : [www.logix4u.net/inpout32.htm](<http://www.logix4u.net/inpout32.htm>) *voir la discussion *
111119
112120### Employer l'assembleur sur Windows 9x
113121
114-Sur Windows 9x vous pouvez également employer le code assembleur . Supposons que vous souhaitez écrire \$CC sur le port \$320 . Le code suivant le fera :
115-
116-``` pascal
117- {$ASMMODE ATT}
118- ...
119- asm
120- movl $0x320, %edx
121- movb $0xCC, %al
122- outb %al, %dx
123- end ['EAX','EDX'];
122+Sur Windows 9x vous pouvez également employer le code assembleur . Supposons que vous souhaitez écrire $CC sur le port $320 . Le code suivant le fera :
124123```
124+{$ASMMODE ATT}
125+ ...
126+ asm
127+ movl $0x320, %edx
128+ movb $0xCC, %al
129+ outb %al, %dx
130+ end ['EAX','EDX'];
131+```
125132
126133### Dépannage sur Windows
127134
128-Une source possible d'ennui dans l'utilisation de matériel parallèle qui ne supporte pas le "Plug And Play" sur Windows est que Windows peut assigner le port utilisé par votre matériel à un autre périphérique. Vous pouvez trouver des instructions sur l'URL ci-dessous concernant la façon de dire à Windows de ne pas assigner l'adresse de votre périphérique aux périphériques "Plug And Play":
135+Une source possible d'ennui dans l'utilisation de matériel parallèle qui ne supporte pas le "Plug And Play" sur Windows est que Windows peut assigner le port utilisé par votre matériel à un autre périphérique. Vous pouvez trouver des instructions sur l'URL ci-dessous concernant la façon de dire à Windows de ne pas assigner l'adresse de votre périphérique aux périphériques "Plug And Play":
129136
130137<http://support.microsoft.com/kb/135168>
131138
132139### Utilisation de ioperm pour accéder à des ports sur Linux
133140
134-La meilleure manière d'accéder au matériel sur Linux est au travers des drivers de périphérique, mais , en raison de la complexité de la création d'un driver, parfois une méthode rapide est très utile .
135-
136-Afin d'employer l'unité "[[doc:rtl/ports|ports]]" sous Linux votre programme doit être exécuté comme root , et IOPerm doit être appelé pour fixer des permissions appropriées sur l'accès au port. Vous pouvez trouver de la documentation au sujet de l'unité "[[doc:rtl/ports|ports]]" [ici](http://www.freepascal.org/docs-html/rtl/ports/index.html).
141+La meilleure manière d'accéder au matériel sur Linux est au travers des drivers de périphérique, mais , en raison de la complexité de la création d'un driver, parfois une méthode rapide est très utile .
137142
138-La première chose à faire est le lien à (g)libc et l'appel de IOPerm. Une unité qui est liée à (g)libc en entier existe sur free pascal, mais cette unité donne des problèmes quand elle est utilisée directement par l'application est être lié statiquement à la bibliothèque (g)libc dans son entier n'est pas une idée très bonne parce qu'il y a souvent des changements entre les versions d'une façon incompatible. Les fonctions comme ioperm, cependant, sont peu susceptible de changer .
143+Afin d'employer l'unité "[ports](<http://lazarus-ccr.sourceforge.net/docs/rtl/ports> "doc:rtl/ports")" sous Linux votre programme doit être exécuté comme root , et IOPerm doit être appelé pour fixer des permissions appropriées sur l'accès au port. Vous pouvez trouver de la documentation au sujet de l'unité "[ports](<http://lazarus-ccr.sourceforge.net/docs/rtl/ports> "doc:rtl/ports")" [ici](<http://www.freepascal.org/docs-html/rtl/ports/index.html>).
139144
140-``` pascal
141- {$IFDEF Linux}
142- function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
143- {$ENDIF}
145+La première chose à faire est le lien à (g)libc et l'appel de IOPerm. Une unité qui est liée à (g)libc en entier existe sur free pascal, mais cette unité donne des problèmes quand elle est utilisée directement par l'application est être lié statiquement à la bibliothèque (g)libc dans son entier n'est pas une idée très bonne parce qu'il y a souvent des changements entre les versions d'une façon incompatible. Les fonctions comme ioperm, cependant, sont peu susceptible de changer .
144146```
145-
146-- "from" représente le premier port à accéder .
147-- "num" est le nombre de ports après le premier à être accédé, ainsi ioperm(\$220, 8, 1) donnera l'accès pour le programme pour tous les ports entre \$220 et \$227 et incluant les valeurs limites .
147+{$IFDEF Linux}
148+ function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
149+ {$ENDIF}
150+```
148151
149-Après la liaison à IOPerm vous pouvez écrire port\[\<Address\>\] pour accéder aux ports.
152+ * "from" représente le premier port à accéder .
153+ * "num" est le nombre de ports après le premier à être accédé, ainsi ioperm($220, 8, 1) donnera l'accès pour le programme pour tous les ports entre $220 et $227 et incluant les valeurs limites .
150154
151-``` pascal
152- {$IFDEF Linux}
153- i := ioperm($220, 8, 1);
154- port[$220] := $00;
155- myLabel.Caption := 'ioperm: ' + IntToStr(i);
156- i := Integer(port[$220]);
157- myOtherLabel.Caption := 'response: ' + IntToStr(i);
158- {$ENDIF}
155+Après la liaison à IOPerm vous pouvez écrire port[<Address>] pour accéder aux ports.
159156```
157+{$IFDEF Linux}
158+ i := ioperm($220, 8, 1);
159+ port[$220] := $00;
160+ myLabel.Caption := 'ioperm: ' + IntToStr(i);
161+ i := Integer(port[$220]);
162+ myOtherLabel.Caption := 'response: ' + IntToStr(i);
163+ {$ENDIF}
164+```
160165
161-Ce code a été testé avec une carte ISA ordinaire sur le port \$0220, en utilisant Lazarus 0.9.10 sur Mandriva Linux 2005 et Damn Small Linux 1.5
166+Ce code a été testé avec une carte ISA ordinaire sur le port $0220, en utilisant Lazarus 0.9.10 sur Mandriva Linux 2005 et Damn Small Linux 1.5
162167
163168### Access général au matériel UNIX
164-
165-``` pascal
166-{$IFDEF Unix}
167-Uses Clib; // rechercher de la bibliothèque libc.
168-{$ENDIF}
169-
169+```
170170{$IFDEF Unix}
171-function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
172-{$ENDIF}
171+ Uses Clib; // rechercher de la bibliothèque libc.
172+ {$ENDIF}
173+
174+ {$IFDEF Unix}
175+ function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
176+ {$ENDIF}
173177```
174178
175-**Note** que FPC fournit une abstraction pour ioperm appelée "fpioperm" dans [[doc:rtl/x86/index.html|unité x86]], et définit également les fonctions out et import.Ces fonctions sont actuellement implémentées pour Linux/x86 et FreeBSD/x86.
179+
180+**Note** que FPC fournit une abstraction pour ioperm appelée "fpioperm" dans [unité x86](<http://lazarus-ccr.sourceforge.net/docs/rtl/x86/index.html> "doc:rtl/x86/index.html"), et définit également les fonctions out et import.Ces fonctions sont actuellement implémentées pour Linux/x86 et FreeBSD/x86.
176181
177-Il n'est pas recommandé de faire la liaison à libc à moins d'une absolue nécessité due aux possibles fonctions de déploiement et de portabilité. En outre un lien manuel à libc (en déclarant ad hoc que libc importe des fonctions qui sont disponible ailleurs) comme fait l'exemple ci-dessus n'est pas recommandé (e.g. la ligne d'importation de libc ci-dessus va échouer inutilement si la bibliothèque standard de C ne s'appelle pas libc, comme e.g. libroot sur BeOS, ou sur les plate-formes avec une mutilation de symboles C non standard).
182+Il n'est pas recommandé de faire la liaison à libc à moins d'une absolue nécessité due aux possibles fonctions de déploiement et de portabilité. En outre un lien manuel à libc (en déclarant ad hoc que libc importe des fonctions qui sont disponible ailleurs) comme fait l'exemple ci-dessus n'est pas recommandé (e.g. la ligne d'importation de libc ci-dessus va échouer inutilement si la bibliothèque standard de C ne s'appelle pas libc, comme e.g. libroot sur BeOS, ou sur les plate-formes avec une mutilation de symboles C non standard).
178183
179-**Note 2** L'utilisation de _unit_ libc n'est pas recommandée dans toutes circonstances autres que la compatibilité avec Kylix. Ceci parce que l'unité est relativement non portable (en raison de l'exposition excessive des structures et d'autres symboles privés ) et doit seulement être modifié le moins possible hors des questions de compatibilité avec Kylix .
184+**Note 2** L'utilisation de _unit_ libc n'est pas recommandée dans toutes circonstances autres que la compatibilité avec Kylix. Ceci parce que l'unité est relativement non portable (en raison de l'exposition excessive des structures et d'autres symboles privés ) et doit seulement être modifié le moins possible hors des questions de compatibilité avec Kylix .
180185
181186## Communication série
182187
183-la section des [[Hardware Access/fr|Liens externes]] a des tutoriels sur les ports série sous UNIX et Windows.
188+la section des [[Hardware Access/fr|Liens externes]] a des tutoriels sur les ports série sous UNIX et Windows.
184189
185190## Liens externes
186191
187-Comparaison de vitesse des protocoles de communication :
192+Comparaison de vitesse des protocoles de communication :
188193
189-1. <http://en.wikipedia.org/wiki/Serial_port#Speed>
190-2. <http://www.lvr.com/jansfaq.htm> - Jan Axelson's Parallel Port FAQ
191-3. <http://en.wikipedia.org/wiki/USB#Transfer_Speed>
192-4. <http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications>
194+ 1. <http://en.wikipedia.org/wiki/Serial_port#Speed>
195+ 2. <http://www.lvr.com/jansfaq.htm> \- Jan Axelson's Parallel Port FAQ
196+ 3. <http://en.wikipedia.org/wiki/USB#Transfer_Speed>
197+ 4. <http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications>
193198
194-Liens de communication série:
199+Liens de communication série:
195200
196-1. Sur UNIX: [1](http://www.easysw.com/~mike/serial/serial.html)
197-2. Sur Windows: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp>
198-3. Composant Synaser : <http://synapse.ararat.cz/>
199-4. paquet Delphi Comport: <http://sourceforge.net/projects/comport/>
201+ 1. Sur UNIX: [[1]](<http://www.easysw.com/~mike/serial/serial.html>)
202+ 2. Sur Windows: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp>
203+ 3. Composant Synaser : <http://synapse.ararat.cz/>
204+ 4. paquet Delphi Comport: <http://sourceforge.net/projects/comport/>
200205
201-Oscilloscope Digital ISA - Un exemple de l'accès au matériel avec les sources complètes incluses :[2](http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/)
206+Oscilloscope Digital ISA - Un exemple de l'accès au matériel avec les sources complètes incluses :[[2]](<http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/>)
202207
203208---
204-*From the Free Pascal wiki, page "Hardware Access/fr", as it stood on 2020-02-16 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
209+*From the Free Pascal wiki, page "Hardware Access/fr", as the Internet Archive kept it on 2023-02-04. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history