Obligement - L'Amiga au maximum

Mercredi 19 décembre 2018 - 07:16  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : C - Console.device
(Article écrit par Max et extrait d'Amiga News Tech - mars 1991)


Le port IDCMP (Intuition Direct Communication Message Port) de toute fenêtre Intuition est un moyen simple mais pas très efficace de recevoir des caractères en provenance du clavier et d'en écrire dans ladite fenêtre.

En effet, le drapeau "RAWKEY" ne renvoie que les codes clavier des touches, nous obligeant pour la conversion en ASCII à l'emploi de tables minimisant la compatibilité internationale du programme, et le drapeau "VANILLAKEY" renvoie bien le code ASCII, mais oublie au passage de prendre en compte les touches spéciales telles que F1-F10 ou encore Help. La seule solution lorsque l'on désire traiter la console avec tous les égards qu'elle mérite consiste donc à utiliser le périphérique logique qui lui est dédié, autrement dit le console.device.

Device ? Vous avez dit "device" ?

Avant tout, un bref rappel de ce qu'est un périphérique logique (device) semble s'imposer. Un périphérique logique a la même structure qu'une bibliothèque : il est composé d'un bloc de données et d'un bloc de sauts à des routines internes. Vous trouverez la définition de la structure Device dans le fichier "exec/devices.h" pour les programmeurs en C, et "exec/devices.i" pour les 68000eurs.

Pour communiquer avec un quelconque périphérique logique, on utilise une autre structure définie dans "exec/io.h" (resp. "exec/io.i") :

C

Il est à noter que certains périphériques logiques utilisent des structures IO étendues : c'est le cas du trackdisk.device par exemple, qui utilise une structure nommée IOExtTD et définie dans "devices/trackdisk.h".

La structure Message est celle qui permet au périphérique logique de communiquer avec la tâche qui l'a ouvert. La première étape à l'ouverture d'un périphérique logique est donc la création d'un "message port". La fonction CreatePort() de l'Amiga.lib fait ça très bien pour nous :

C

Ce qui donne en assembleur :

C
C

Il ne faudra pas oublier de détruire ce port une fois qu'on n'en aura plus besoin :

C

La seconde étape consiste à initialiser correctement une structure IOStdReq - ou une structure IO étendue pour les périphériques logiques en utilisant une - ce qui se fait au moyen de la fonction CreateExtIO() d'amiga_lib :

C

Cette structure devra elle aussi être éliminée lorsqu'on n'en aura plus besoin :

C

Ce n'est qu'alors que l'on pourra appeler la fonction OpenDevice() d'exec.library :

C

  • nom.du.device décrit devinez quoi ? Le nom du périphérique logique que l'on veut ouvrir, oui. Ce peut être "trackdisk_device", "console.device", "keyboard.device", etc.
  • unit désigne l'unité concernée. Par exemple, le trackdisk.device contrôle quatre unités, à savoir DF0: à DF3:. Le keyboard.device, lui, n'en contrôle qu'une (et pour cause : l'Amiga ne possède qu'un seul clavier !). Dans le cas du console.device, l'unité pourra être 0 ou -1.
  • request est le pointeur sur la structure IOStdReq - ou bien, encore une fois, sur une structure IO étendue - créée plus tôt.
  • flags sera les trois quarts du temps mis à 0.
Console !

"Le terme "console" désigne en informatique le ou les périphérique(s) destiné(s) au dialogue homme/machine, généralement le clavier pour les entrées et l'écran pour les sorties" (Petit Robert, édition 1991).

Le console.device permet donc la saisie de caractères depuis le clavier et leur édition à l'écran, plus précisément dans une fenêtre Intuition - car n'oublions pas que toute fenêtre est créée et gérée par Intuition, même les CON:, RAW: et autres NEWCON:.

Un programme peut désirer ne prendre connaissance que des entrées et effectuer les sorties lui-même au travers de la graphics.library et de la fonction Text(). C'est le cas de ProWrite ou de GenAm2, l'éditeur du Devpac, par exemple. Dans ce cas, on ouvre l'unité -1. Mais il est également possible de laisser le console.device éditer le texte dans la fenêtre. Dans ce dernier cas, il faudra initialiser deux structures IOStdReq et deux message-ports, un pour chaque sens de la communication.

Pour lire le console.device :

C
C

Pour écrire dans le console.device :

C

On ouvre ensuite la fenêtre, puis le console.device lui-même :

C

Pour terminer, on relie les deux requêtes ensemble sur le même périphérique logique :

C

Partant de là, on peut commencer la lecture le port "readPort" et l'écriture sur le port "writePort".

Opérations d'entrées/sorties

Quel que soit le périphérique logique concerné, deux types d'échanges sont possibles : d'une part l'échange "synchrone" (le périphérique logique ne rend la main qu'une fois sa mission accomplie) et d'autre part l'échange "asynchrone" (le périphérique logique travaille parallèlement au programme, en multitâche). Cette dernière possibilité est particulièrement utile lorsque, par exemple, on veut animer une présentation à l'écran tout en chargeant des données depuis le disque. La tâche incombe toutefois au programme de se renseigner auprès du périphérique logique s'il a terminé son travail.

Pour en revenir au console.device, il est préférable d'effectuer les sorties (c'est-à-dire l'édition de caractères) en mode synchrone. Les entrées (lecture de caractère(s) en provenance du clavier) peuvent être faites en n'importe quel mode, suivant que l'on désire attendre un caractère ou simplement le lire "au vol". Dans ce dernier cas, il faudra déjà avoir lancé une requête asynchrone de façon à pouvoir examiner le port. Les fonctions C suivantes peuvent être utilisées :

Lancement d'une requête asynchrone :

C

Lecture "au vol" d'un caractère (sans attente retourne -1 si aucun caractère n'a été frappé) :

C
C

Lecture d'un caractère (avec attente) :

C

Écriture d'un caractère sur la console :

C

Écriture d'une chaîne de caractères (terminée par un "\0") :

C

Écriture d'un tampon mémoire de "lenght" caractères sur la console :

C

A suivre...

Voilà. La deuxième et dernière partie de cet article traitera des commandes particulières du console.device, mais en attendant, je vous propose un petit programme de démonstration très largement inspiré de l'exemple publié dans les RKM.

C
C
C
C


[Retour en haut] / [Retour aux articles] [Article suivant]