Vous n'êtes pas identifié.
Un de plus ..
ce week end comme j'avais rien a foutre (juste un Dm de math et un exposé en anglais lol) g fait un ti programme pour notre chère g100...
En fait c'était pour en apprendre un peu plus et en le fesant g apris comment marchent les TSR (terminate and stay resident).
voila le code :
void interrupt newint1C() { asm int 0xD9; //apelle l'int D9 (vraie int 1C) asm push ax; //sauvegarde ax asm xor al,al; //met 0 dans ax asm in al,1Dh; //récupère les secondes actuelles asm cmp al,30; //compare avec 30 asm jne fin; //si c'est different saute à fin asm int 51h; //sinon eteint la calto! fin: asm pop ax; //restaure ax, il faut garder à l'esprit que c'ette interuption va être exécutée pendant que d'autres programmes tournent il faut donc garder le contenu des registres intacts } void main() { int adr1C_segment,adr1C_offset,adrD9_segment,adrD9_offset; //sauvegarde le vect de l'int 1Ch asm xor ax, ax; asm mov es, ax; asm mov ax, 0x001C * 4; asm mov di, ax; asm mov ax, es:[di]; asm mov adr1C_segment, ax; asm mov ax, es:[di + 2]; asm mov adr1C_offset, ax; //la mé ds l'int D9h asm xor ax, ax; asm mov es, ax; asm mov ax, 0x00D9 * 4; asm mov di, ax; asm mov ax, adr1C_segment; asm mov es:[di], ax; asm mov ax, adr1C_offset asm mov es:[di + 2], ax; //remplace l'int 1Ch par la notre _dos_setvect(0x1C, newint1C); asm mov ah,0x31; //fonction 31h asm int 21h; //l'histoire du TSR : termine le programme sans libérer la mémoire allouée à celui-ci ce qui permet de garder notre interruption intacte pendant l'execution de d'autres programmes. }
voila! vous avez surrement compris ce qu'il fait : il éteint la calculatrice chaque minute à la 30ème seconde.
pratique pour faire un farce!
pour ce petit bout de code je me doit de citer X-th pour m'avoir ouvert les yeux sur certaines conneries que j'avais faite et surtout pour avoir été patient!lol et a mastermage car l'idée du départ m'est venue de son Hardware counter
je pense que ce petit bout de code peut-être utile pour d'autres choses que des farces c pour sa que je le met la ...
voici l'exe :
P.S. : pour l'instant tout à l'air de marcher à part Touche....
Hors ligne
oué...
un reboot de la caltos et ca annule tout...
la farce se finis vite car en général qd ya un prob la plupart se jette sur le P derrière la caltos
Hors ligne
Interressant comme technique, je vois pas trop d'applications super utiles pour le moment mais ca peut toujours venir
Sinon vu les instructions en asm y'aurait moyen de se passer des fonctions _dos_setvect et compagnie: quelqu'un aurait-il les instructions asm pour remplacer l'int 1C par newint1C() (avec un ptr sur fonx sans doute) ? Ca éviterait les appels à ces fonctions...
Hors ligne
bin moi j'avais essayé de les remplacer...
je crois que j'avais réussi a remplcaer _dos_setvect mais pas _dos_getvect a cause du retour de type interrupt ... enfin un truc dans le genre, ca fait longtemps
Hors ligne
je lé laiC passque je n'arrivait pas à le faire justement ...
je voulais faire sa :
asm xor ax, ax; asm mov es, ax; asm mov ax, 0x001C * 4; asm mov di, ax; asm mov ax, ...................; asm mov es:[di], ax; asm mov ax, offset newint1C asm mov es:[di + 2], ax;
mais je ne sais pas quoi mettre à la place des .......
(j'ai des connaissances assez limitées en asm)
Hors ligne
petite modification :
ds la doc de TC3 il y a marqué qu'en utilisant le mot clé interrupt, tout les registres sont sauvés au Dbut et restorés à la fin (et qu'elle se termine par un iret)
donc pas besoin du push ax et du pop ax
pour l'histoire du _dos_setvect(0x1C, newint1C); ,le fait de l'écrire entièrement en asm permetrait de faire passer sa taille d'environ 4ko à quelque 100ènes d'octets ... ce qui pour un programme résident en mémoire est une bonne chose ...
Hors ligne
void setvect (void interrupt (*fonction)(void),int vecteur) { asm { xor ax, ax mov es, ax ; es = 0 mov di, vecteur shl di, 2 ; di = vecteur * 4 mov ax, fonction mov es:[di], ax mov ax, cs mov es:[di+2], ax } }
ce genre de chose ca devrait fonctionner, non ? (non testé et fait a l'arrache sur demande de f4kill)
Hors ligne
je V tester sa si ma calto veut bien remarcher correctement!
(tout à l'heure g fé mumuse à Dsactiver pas mal d'interruptions p voir se que sa fait ... et maintenant me retrouve avec mon vieu menu et le même bug qu'après avoir tesT linux pour g100 : mes lecteurs son décalés) ex : il faut que je mette LINL.EXE sur le N: si je l'appelle ds une icone sur le lecteur :? pas cool
Hors ligne
rectification ... il faut que je le mette sur les lecteurs M ET N ......
sinon au prochain reboot sa me dit :Not ready error reading drive M abort, Retry, Fail?
vive la logique ... bon je V continuer a bidouiller dans tout les sens pour voir si sa remarche....
si g pas ma calto en état de marche pour demain (sans mes jeux quoi) je V me faire chier moi !
Hors ligne
nan
c'était aprés le reset sa :mrgreen:
par contre g rempli tout les lecteurs de vide (enfin presque juste un ti prog) et maintenant c bon g retrouV mes 6 lecteurs
Hors ligne
bon ba la fonction à mastermage ne marche pas!
(même après correction (le segment et l'offset sont inversés))
...
Hors ligne
g besoin des pros de l'asm ....
(passke moi je suis qu'un pauvre débutant lol)
ORG 100h start: jmp install newInt1C: pushf push ax int 0xD9; xor al,al; in al,1Dh; cmp al,30; jne fin; int 51h; fin: pop ax popf IRET dat: adr1C_segment dw 0 adr1C_offset dw 0 install: ;sauvegarde le vect de l'int 1C xor ax, ax mov es, ax mov ax, 0x001C * 4 mov di, ax mov ax, [es:di] mov [adr1C_segment], ax mov ax, [es:di + 2] mov [adr1C_offset], ax ;la mé ds l'int D9 xor ax, ax mov es, ax mov ax, 0x00D9 * 4 mov di, ax mov ax, [adr1C_segment] mov [es:di], ax mov ax, [adr1C_offset] mov [es:di+2], ax ;mé la nvle ds l'int 1C xor ax, ax mov es, ax mov ax, 0x001C * 4 mov di, ax mov ax, cs mov [es:di], ax mov ax, newInt1C mov [es:di+2], ax mov dx,install int 27h ; mov ah,0x31 ; int 21h
sa marche pas ... pourtant g bo le lire et le relire je voi rien qui va pas ...
(sa freeze)
(assemblé avec FASM mais pour que sa marche avec NASM c pas trés compliqué)
Hors ligne
l'adresse SEG:OFF doit être mise en little endian c'est à dire poids faible en tête donc l'offset avant le segment.
mov ax, [adr1C_segment]
mov [es:di], ax
mov ax, [adr1C_offset]
mov [es:di+2], ax
=>
mov ax, [adr1C_segment]
mov [es:di+2], ax
mov ax, [adr1C_offset]
mov [es:di], ax
Hors ligne
mais dans mon premier programme sa marche très bien sa!
[edit]
Ba si sa marche!!!
Bravo! et merci bcp!
mais c bizarre parceque dans le prog en C sa marche dans l'autre sens ...
Hors ligne
dans le prog en C ca marche parce qu tu te sert des variables uniquement pour déplacer un vercteur d'interruption et tu appel _dos_setvect pour installer la nouvelle.
dans ton exemple en ASM tu fait toi même l'instal en inversant les 2 valeurs.
(en fait y'a que la fin qui buggait, le reste c'est une histoire de noammge de variable.)
Hors ligne
a oui je vien de comprendre
en fait je m'était l'offset dans la variable segment et vice versa mais au final sa marchai...
ba en tout k c cool maintenant ia plus que 32octets qui restent en mémoire ... (o lieu de 4000 et dés poussière)
Hors ligne
lol
en fait c pas totalement inutile .. pour moi en tout cas puissque dans l'histoire g apris des truc et je me suis remi a l'asm...
d'ailleur g déjà entrepris 2 ou 3 trucs en asm la ...
Hors ligne