home *** CD-ROM | disk | FTP | other *** search
/ PC Interdit / pc-interdit.iso / noreset / no_rst.asm next >
Assembly Source File  |  1994-10-31  |  3KB  |  97 lines

  1. data segment public
  2. start_message: db 'Plus de Reset possible',0dh,0ah,'$'
  3. buffer:    db 40d               ;taille du buffer d'entrée
  4.            db 40 dup (0)        ;buffer
  5. old_int9   dd 0                 ;ancien gestionnaire d'interruption
  6. data ends
  7.  
  8. code segment public
  9. assume cs:code,ds:data
  10. handler9 proc near              ;nouveau gestionnaire de l'interruption 9
  11.   push ax                       ;sauvegarde les registres exploités
  12.   push bx
  13.   push ds
  14.   push es
  15.   mov ax,data                   ;charge ds
  16.   mov ds,ax
  17.  
  18.   in al,60h                     ;lit les caractères tapés en al
  19.  
  20.   xor bx,bx                     ;es pointe sur le segment 0
  21.   mov es,bx
  22.   mov bl,byte ptr es:[417h]     ;charge en bl l'état du clavier
  23.  
  24.   cmp al,83d                    ;scan code de la touche <Suppr>?
  25.   jne pasde_reset               ;non, pas de reset
  26.  
  27.   and bl,0ch                    ;masque Ctrl et Alt
  28.   cmp bl,0ch                    ;enfoncées simultanément ?
  29.   jne pasde_reset               ;non pas de reset
  30.  
  31. bloque:                         ;Reset ou break, il faut intervenir
  32.   mov al,20h                    ;envoie EoI au contrôleur d'interruption
  33.   out 20h,al
  34.   jmp fini                      ;et quitte l'interruption
  35.  
  36. pasde_reset:                    ;pas de Reset, teste break 
  37.   cmp al,224d                   ;touche étendue  ?
  38.   je evtl_break                 ;oui -> peut-être break
  39.   cmp al,46d                    ;touche 'C' ?
  40.   jne licite                    ;non -> touche licite
  41. evtl_break:
  42.   test bl,4                     ;teste l'état du clavier
  43.   jne bloque                    ;touche Ctrl, alors bloquer
  44.  
  45.  
  46. licite:         ;touche licite -> appeler l'ancien gestionnaire du clavier
  47.   pushf
  48.   call dword ptr [old_int9]     ;gestionnaire d'origine
  49. fini:
  50.   pop es
  51.   pop ds                        ;reprend les registres
  52.   pop bx
  53.   pop ax
  54.   iret
  55. handler9 endp
  56. start proc near
  57.   mov ax,data                  ;initialise ds 
  58.   mov ds,ax
  59.   mov dx,offset start_message  ;met en dx l'offset du message
  60.   mov ah,09h                   ;affiche le message
  61.   int 21h
  62.  
  63.   mov ax,3509h                 ;lis l'ancien vecteur d'interruption
  64.   int 21h
  65.   mov word ptr old_int9,bx     ;et le mémorise
  66.   mov word ptr old_int9 + 2, es
  67.  
  68.   push ds                      ;sauvegarde ds 
  69.   mov ax,cs                    ;et y charge cs 
  70.   mov ds,ax
  71.   mov dx,offset handler9       ;charge aussi l'offset du gestionnaire
  72.   mov ax,2509h                 ;fixe le vecteur 
  73.   int 21h
  74.   pop ds
  75.  
  76. ;-------------------------------------------------------------------------
  77. ; Ici à la place de l'appel DOS vous pouvez mettre un
  78. ; call vers votre programme principal
  79.  
  80.   mov ah,0ah                  ;lis une chaîne de caractères
  81.   lea dx,buffer               ;à titre d'exemple
  82.   int 21h
  83. ;-------------------------------------------------------------------------
  84.  
  85.   push ds
  86.   lds dx,old_int9             ;rétablit l'ancien vecteur
  87.   mov ax,2509h
  88.   int 21h
  89.   pop ds
  90.                               
  91.   mov ax,4c00h                ;met fin au programme  int 21h
  92. start endp
  93.  
  94. code ends
  95. end start
  96.  
  97.