Vous n'êtes pas identifié.
Voila alors je voudrai savoir comment faire un prog résident, par exemple ke je puisse faire kelkechose n'importe ou à l'aide d'une touche...
De plus je c ke l'on peut désactiver une interruption en la faisant pointer sur une vide mais je voudrai savoir si on peut la remplacer par une fonction personnel (ex: a chak rafraichissement de l'écran ba on rafraichi l'écran et en plus on fait autre chose...)
Merci !
Hors ligne
ben pr les interrpuptions rien de plus simple:
exemple avec l'int du clavier: int 0x9
void interrupt (*int9)(void); void interrupt vide(void); void disable9(void) { int9=_dos_getvect(0x9); _dos_setvect(0x9,vide); }
et pr la réarmer:
void enable9(void) { _dos_setvect(0x9,int9); }
pour le rafraichissement c l'int 53:
void interrupt (*int53)(void); void interrupt new53(void) { // fais ce ke tu veux ici } void disable53(void) { int53=_dos_getvect(0x9); _dos_setvect(0x9,new53); }
même technique pr la réarmer!
Hors ligne
Merci si ca marche je v bien m'éclater...
Hors ligne
pour le rafraichissement c l'int 53:Code:
void interrupt (*int53)(void); void interrupt new53(void) { // fais ce ke tu veux ici } void disable53(void) { int53=_dos_getvect(0x9); _dos_setvect(0x9,new53); }même technique pr la réarmer!
oui mais la ca va plu rafraichir si j'enleve l'interup? moi je ve ke ca fasse un truc et ke ca rafraichisse (ajouter un bou de code koi !)
Hors ligne
Et ca donne quoi en traduction assembleur?
Hors ligne
eh ben tu fais ça à la technique de whyp (et de tonton1664), c'est à dire que tu rediriges l'int53 vers une int vide et que tu mets tes fonx. Regarde ça:
(c du tuto de whyp modifié)
void interrupt int53Maison(void); // prototype d'interruption void interrupt (*int53Reelle)(void); // pointeur vers interruption void Modif(void) { int53Relle = _dos_getvect(0x53); setvect(5,int53Reelle); _dos_setvect(0x53,int53Maison); } void interrupt int53Maison(void) //La nouvelle interruption { /*LA TU METS CE QUE TU VEUX*/ asm int 5; //On appelle le rafraichissement de l'ecran. } void UnModif(void) { setvect(0x53,int53Reelle); //l'int 53h reprend son adresse de depart }
et en asm ben je sais pas si je suis autorisé par tonton1664 à montrer son code!
Hors ligne
OK merci je v tester ca !
Hors ligne
ouais g relu ce que g écrit, c'est bon y'a pas de pbs apparents!
Hors ligne
Dsl g pa encore trouvé le temps de test en + ce we je sui pa la mé dé ke je test je te di !!
Hors ligne
Marche pa (tré inatendu !) Je te mp la source méga recherchée !!
Hors ligne
Le principe est simple. Au debut de la ram, adresse 0h:0h, ya la zone des vecteurs d'interruptions. Ces vecteurs sont stock" sur 4 octets, et yen a FFh. Le premier packet de 4 octets, c'est l'adresse de l'int 0h, le second (a l'adresse 0h:0004h) c'est l'int 1h etc...
Ces 4 octets sont un couple segment - offset chacun sur 2 octets. A chaque fois que tu appel une int, le proc charge son adresse qu'il trouve dans la table des vecteurs d'interruptions, et il saute directement a cette adresse. La il y execute le code.
Donc si tu veut faire pointer ton programme vers une fonction vide, tu ecrit la mnemonique IRET qq part en memoire, et tu ecrit son adresse dans la table de vecteurs. Pour faire executer une fonction perso, pareil, tu fait pointer la bonne int vers ta fonction, qui se termine par un iret, sinon le processeur revient pas au programme principal.
En asm, c tout con.
Après en C, tu peut le faire avec les fonction que t'as donné C@siomax, mais manitenant tu sais ce qu'il faut faire au niveau systeme.
@+
Hors ligne
OK merci bcp !! Ca fai tro plaisir de te revoir par la je testerai ca a mes heures (é)perdues ....
Hors ligne
bon ben marche tjrs pa mm avec le coup de l'"asm iret" : chge rien tan pi...
Hors ligne
beh garde le code que je t'ai dit
simplement, mets tout en inline!
forcément, lorske tu kittes ton prog il est cleared de la ram donc ton proto de la fonx invscreen n'est plus existant, donc t'appelles un truc inexistant! :arrow: plantage
donc mets tout en inline sans d'autres fonx et avec toutes les vars déclarées dans l'int, sinon ...
Hors ligne
au fait, pr le remplacement du rafraichissement, c pas la peine d' appeller l' ancienne fonction ( asm int 5 ca marche sans !
Hors ligne
ok je v test....
sinon vs avé rep ka la moitié de mon topic :
komment kon fai les prg résident en C/++ ?????
Hors ligne
Ca il fo se documenter sur le net, ou bien demander a ceux qui en ont déjà fait, comme roeoender !
Hors ligne
je pense ki fo faire de l'asm...
Hors ligne
heu int 5 x-th t vrément sûr ? car normalement elle est vide! ou bien c'est toi qui n'a pas replacé l'int à sa place !! 8O
Hors ligne
Non !
regarde ton propre code :
void interrupt int53Maison(void); // prototype d'interruption
void interrupt (*int53Reelle)(void); // pointeur vers interruption
void Modif(void)
{
int53Relle = _dos_getvect(0x53);
setvect(5,int53Reelle);
_dos_setvect(0x53,int53Maison);
}
void interrupt int53Maison(void) //La nouvelle interruption
{
/*LA TU METS CE QUE TU VEUX*/
asm int 5; //On appelle le rafraichissement de l'ecran. PAS OBLIGATOIRE CA
// MARCHE SANS !!!
}
void UnModif(void)
{
setvect(0x53,int53Reelle); //l'int 53h reprend son adresse de depart
}
Tu voie? c ce que je fait !
au fait, ya t' il une interruption qui est appelé plus rapidement que celle ci?
Hors ligne
ça y est KTr j'ai trouvé comment résoudre ton pb!!
utilise "keep" et "_dos_keep"
regarde l'aide dans TC y'a un bon exemple!!
Hors ligne
ok jirai voir apres mon oral de fr !!
Hors ligne
mon moral de fer ARFFFF
au fait personne n' a trouvé une int qui est appellé plus rapidement que celle ci?
Hors ligne