MAD_DIM | Salut,
J'ai écrit un programme qui affiche l'heure en haut à droite de l'écran lorsque l'on appuye sur Printscreen et qui s'efface si on réappuye dessus.
J'aimerais le mettre résident mais je n'y arrive pas.Le détournement d'interruption fonctionne mais si je veut par exemple aller dans l'EDIT du dos l'heure reste figer et je suis bon pour fermer la fenetre(j'utilise VPC)
Merci
Code :
- .MODEL SMALL
- .STACK 100h
- .DATA
- prtscn DB 0
- ancip DW ?
- ancseg DW ?
- mvideo DB 16 dup(' ')
- taille equ (fin-debut)/16
-
- .CODE
- DEBUT:
- include a:hex2asc.asm
- JMP START
- ROUTINETIMER:
- CLI
- PUSH AX ; SAUVEGARDE DES DIFFÉRENT REGISTRES
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH DS
- PUSH ES
- MOV AX, 0B800h
- MOV ES, AX
- MOV SI, 144
- MOV AH, 02h ; LECTURE DE L'HEURE
- INT 1Ah
- MOV AL, CH ; AFFICHE LES HEURES
- CALL HEX2ASCII
- MOV AH, 07
- MOV AL, ':' ; CARACTÈRE ':'
- MOV ES:[SI], AX
- INC SI
- INC SI
- MOV AL, CL ; AFFICHE LES MINUTES
- CALL HEX2ASCII
- MOV AH, 07
- MOV AL, ':' ; CARACTÈRE ':'
- MOV ES:[SI], AX
- INC SI
- INC SI
- MOV AL, DH ; AFFICHE LES SECONDES
- CALL HEX2ASCII
- POP AX ; RECUPERATION DES DIFFÉRENT REGISTRES
- POP CX
- POP DX
- POP SI
- POP DI
- POP DS
- POP ES
- STI
- IRET
- ROUTINE05h:
- CLI
- MOV AX, @DATA
- MOV DS, AX
- CMP prtscn, 1 ;Flag du printscreen
- JE ECRAN ;Si égale a 1 on affiche l'heure
- MOV AL, 1Ch ;Lire ancien vecteur
- MOV AH, 35h
- CLI
- INT 21h
- MOV ancip, BX ;resultat dans ES:BX
- MOV AX, ES
- MOV ancseg, AX
- PUSH ES
- MOV AX, 0B800h ;Appele memoire video
- MOV ES, AX
- MOV SI, 144 ;Place du curseur
- MOV DI, 0 ;Pointeur du buffer video
- SVGVIDEO1:
- MOV BH, ES:[SI] ;BH contient le premier caractere
- MOV mvideo[DI], BH ;On le place dans le buffer de sauvegarde
- INC DI
- INC SI
- CMP DI, 16 ;Tant que plus petit que 16 on recommence
- JE SUITE
- JMP SVGVIDEO1
- SUITE:
- POP ES
- PUSH DS
- PUSH CS
- POP DS
- LEA DX, ROUTINETIMER ;Appele la routine de l'heure
- MOV AH, 25h
- MOV AL, 1Ch
- CLI
- INT 21h
- STI
- POP DS
- MOV prtscn, 1 ;Affiche l'heure
- JMP FIN1
- ECRAN:
- MOV DX, ancip
- MOV AX, ancseg
- PUSH DS
- MOV DS, AX
- MOV AH, 25h
- MOV AL, 1Ch
- CLI
- INT 21h
- STI
- POP DS
- PUSH ES
- MOV AX, 0B800h
- MOV ES, AX
- MOV SI, 144
- MOV DI, 0
- SVGVIDEO2:
- MOV BH, mvideo[DI]
- MOV ES:[SI], BH ;Affiche l'heure
- CMP DI, 15
- JE SUITE2
- INC DI
- INC SI
- JMP SVGVIDEO2
- SUITE2:
- POP ES
- MOV prtscn, 0
- FIN1:
- STI
- IRET
- START:
- PUSH DS
- PUSH CS
- POP DS
- LEA DX, ROUTINE05h ;Place le programme d'interruption
- MOV AH, 25h
- MOV AL, 05h ;Detourner printscreen
- CLI
- INT 21h
- STI
- POP DS
- FIN:
- mov dx, taille + 100 ;Mise en résident (taille du programme + taille de la pile)
- mov ax, 3100h
- INT 21h
- END START
|
|