Exemple de la bible PC partiel, à adapter au besoin (merci M. Tischer..).
//INT 16H Fonction 02 : Teste l'?tat de certaines touches et modes d'entr?e
// Appel avec 2 dans le registre AH, ?tat clavier retourn? dans AL
// Bit 0 : Touche SHIFT de droite actionn?e
// Bit 1 : Touche SHIFT de gauche actionn?e
// Bits 2, 3 ? 7 : CTRL, ALT, Scroll Lock, Num Lock, Caps Lock, Insert
// INT 16H Fonction 1 : teste le clavier sans retirer du buffer le caract?re
// INT 16H Fonction 0 : si un caract?re dans le buffer clavier, il est retir? pour ?tre transmis au prog
// sinon attend qu'un caract?re soit entr? et rends alors la main au prog d'appel
#include <dos.h>
#include <stdio.h>
#define CR 13
#define F1 315
#define VRAI 1
#define FAUX 0
void IniKey(void);
unsigned int GetKey(void);
int KeyReady(void);
void main()
{
unsigned long Touche;
printf("CLAVIER M. Tischer, LA BIBLE PC, Micro-Applications 1989\n\n" );
IniKey();
do
{
Touche = GetKey();
if (Touche < 256) // lire touche
printf("%c", (char)Touche); // sortir si normal
}
while (!(Touche == CR || Touche == F1));
printf("\n" );
}
void IniKey(void)
{
// Initialise les flags clavier (purge ?tat d'avant)
union REGS Register;
Register.h.ah = 2;
int86(0x16, &Register, &Register); // INT clavier du BIOS
}
unsigned int GetKey(void)
{
// Lire un caract?re et sortir l'?tat du flag
// Retourne : < 256 si touche normale
// >= 256 si touche ?tendue
//
union REGS Register;
do
{
Register.h.ah = 2;
int86(0x16, &Register, &Register);
if (Register.h.al & 2) // 1 : SHIFT DROIT, 2 : SHIFT GAUCHE, 4 : CTRL
printf("SHIFT\n" );
}
while (! KeyReady()); // R?p?te jusqu'? touche pr?te
Register.h.ah = 0; // num?ro fonction pour lire touche
int86(0x16, &Register, &Register);
return ((Register.h.al) ? Register.h.al : Register.h.ah | 256);
}
int KeyReady(void)
{
// Examine si une touche clavier est pr?te
// Retourne TRUE si oui, sinon FALSE
#ifdef __TURBOC__
struct REGPACK Register;
Register.r_ax = 1 << 8; // num de fonction : touche pr?te ?
intr(0x16, &Register); // INT clavier du BIOS
return (!(Register.r_flags & 64)); // Renvoyer le flag z?ro
#else
return (_bios_keybrd(_KEYBRD_READY));
#endif
}
Dans l'aide BorlandC DOS, y a un exemple pour la fonction _bios_keybrd() qui semble "encpsuler" l'INT 16H. Si pas trouvable, je peux l'envoyer.
Pour les applis DOS invendables, j'en ai acheté une dernièrement : System Commander pour faire du Multi-Boot. Courage, ça se vend encore !