home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / keyboard / click / click.asm next >
Encoding:
Assembly Source File  |  1987-07-22  |  6.8 KB  |  204 lines

  1. page ,132 ; ctrl-O codigo para la impresora
  2. ;================================
  3. ;  rutina:    CLICK
  4. ;  version:   3.0
  5. ;  fecha:     15-01-87
  6. ;  A resident program to hear the keyboard
  7. ;  The second time the program run,
  8. ;  free allocated memory and exit itself
  9. ;================================
  10. ;
  11. ; Scan codes de las teclas a controlar
  12. alt       equ    38h
  13. ctrl      equ    1dh
  14. sizq      equ    2ah
  15. sder      equ    36h
  16.  
  17. ; longitud de la cabecera  de identificacion
  18. LCAB      equ   15
  19. ; equs interesantes
  20. TIMER     equ   40H
  21. PORT_B    equ   61H
  22. ; Constante que se suma al scan code de la tecla cuando se
  23. ; detecta que se ha dejado de pulsar
  24.  
  25. const     equ    80h
  26.  
  27. ; Numero de puerto del teclado
  28.  
  29. kbd_port  equ   60H
  30.  
  31.  
  32. ;  estructura donde vamos a guardar el vector de interrupcion
  33. ;--------------------------------
  34. vector  struc
  35.   regip dw      ?
  36.   regcs dw      ?
  37. vector  ends
  38.  
  39. ;--------------------------------
  40. CODE    SEGMENT
  41.  
  42.         ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
  43.  
  44. ;Program Segment Prefix
  45.  
  46.         INCLUDE   PSP.INC
  47.  
  48.  
  49.         START:  jmp     init
  50.  
  51.               ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
  52.  
  53.      vect09  vector  <>
  54.  
  55.  
  56.      cabecera        db      '(C) FJGT - CLKV' ; 15 bytes de cabecera
  57.                                                ; para identificar la
  58.                                                ; rutina
  59.  
  60.  
  61.      ;------------------------
  62.      ;SERVICIO DE INTERRUPCION
  63.      ;------------------------
  64.      SERINT  PROC    FAR
  65.  
  66.      ;salva registros
  67.  
  68.              PUSH            AX
  69.              PUSH            BX
  70.              PUSH            CX
  71.              in      al,kbd_port             ;obtenemos el scan code de la
  72.                                              ;tecla pulsada
  73.              cli                             ;prohibimos las interrupciones
  74.  
  75.              cmp     al,alt                  ;
  76.              jz      salir                   ;
  77.              cmp     al,ctrl                 ; comprobamos que no
  78.              jz      salir                   ; es ninguna de las
  79.              cmp     al,sizq                 ; teclas que no han
  80.              jz      salir                   ; de sonar
  81.              cmp     al,sder                 ;
  82.              jz      salir                   ;
  83.              and     al,const                ;
  84.              jnz     salir                   ;
  85.  
  86.              sti                             ;permitimos las interrupciones
  87.  
  88.      ;  codigo del pitido que se oye al pulsar las teclas
  89.  
  90.           mov     bx,25
  91.           in      al,61h
  92.           push    ax
  93.    mas:   and     al,0fch
  94.           out     61h,al
  95.           mov     cx,50
  96.     l1:   loop    l1
  97.           or      al,2
  98.           out     61h,al
  99.           mov     cx,50
  100.     l2:   loop    l2
  101.           dec     bx
  102.           jnz     mas
  103.           pop     ax
  104.           out     61h,al
  105.  
  106.      ;  fin del pitido
  107.  
  108.      salir:  sti
  109.  
  110.              POP     CX
  111.              POP     BX
  112.              POP     AX
  113.              jmp     vect09                  ;ir a ejecutar la verdadera
  114.                                              ;interrupcion 9
  115.      SERINT  ENDP
  116.  
  117.      INIT    LABEL   NEAR
  118.  
  119.      ;salvar antiguo vector 09h y comprobar que no esta cargada la rutina
  120.  
  121.              push            es
  122.              MOV             AH,035H
  123.              MOV             AL,009H
  124.              int             21h
  125.              assume  es:nothing
  126.              mov             vect09.regip,bx
  127.              mov             vect09.regcs,es
  128.              mov             di,bx
  129.              sub             di,LCAB         ;apunta al comienzo de la cabecera
  130.              mov             cx,LCAB         ;numero de bytes a comparar
  131.                  assume ds:code
  132.              mov             si,offset cabecera
  133.              cld                             ;
  134.      repe    cmpsb
  135.              jcxz            ya_esta
  136.  
  137.  
  138.              pop             es
  139.              assume          es:code
  140.  
  141.        ;Cambiar vector de interrupcion 09H
  142.  
  143.                MOV             AH,025H
  144.                MOV             AL,009H
  145.                mov             dx,offset  serint
  146.                int             21h
  147.  
  148.         ;Liberar memoria cogida al entorno
  149.  
  150.                push            es
  151.                mov             ah,049h      ;funcion para liberar memoria
  152.                mov             es,entorno   ;cogida con la 48H
  153.                assume          es:nothing
  154.                int             021h
  155.                pop             es
  156.                assume          es:code
  157.  
  158.         ;Salida: Termina y permanece residente
  159.  
  160.                 MOV             DX,OFFSET init
  161.                 shr             dx,1               ;dividimos el total
  162.                 shr             dx,1               ;de bytes de la
  163.                 shr             dx,1               ;rutina por 16 para
  164.                 shr             dx,1               ;sacar los parrafos
  165.                 inc             dx                 ;que ocupa
  166.                 add             dx,16              ;PSP  en parrafos
  167.                 MOV             AX,3100H           ; terminar y
  168.                 INT             21H                ; quedar residente
  169.  
  170.         ;Salida: Termina porque ya esta residente la rutina
  171.         ;y repone el anterior vector de interrupcion
  172.         ya_esta:
  173.                  sub             bx,LCAB + 4  ; para que apunte donde esta
  174.                  mov             di,bx        ; guardado el verdadero vector
  175.                  mov             dx,es:word ptr [di]  ;  dx := offset
  176.                  mov             ax,es:word ptr[di + 2]  ; ds := segment
  177.                  push            ds
  178.                  mov             ds,ax
  179.                    assume ds:code
  180.                  MOV             AH,025H   ; funcion para cambiar el vector
  181.                  MOV             AL,009H   ; de interrupcion que esta en AL
  182.                  int             21h
  183.                  pop             ds
  184.                    assume  ds:code
  185.                  push            es
  186.                  mov             ah,049h      ;funcion para liberar memoria
  187.                  mov             es,vect09.regcs   ;cogida con la 48H
  188.                    assume          es:nothing   ; es debe apuntar al comienzo
  189.                  int             021h           ; de la memoria a liberar
  190.                  pop             es
  191.                    assume          es:code
  192.                  mov             dx,offset msg1   ; mostramos el mensaje
  193.                  MOV             AX,0900H         ; por la pantalla
  194.                  int             21h
  195.                  MOV             AH,4CH           ;  terminar proceso
  196.                  INT             21H
  197.  
  198.     ;  variables internas
  199.  
  200.       msg1              db      'Rutina desinstalada',13,10,'$'
  201.  
  202.         CODE    ENDS
  203.                 END start
  204.