home *** CD-ROM | disk | FTP | other *** search
- page ,132 ; ctrl-O codigo para la impresora
- ;================================
- ; rutina: CLICK
- ; version: 3.0
- ; fecha: 15-01-87
- ; A resident program to hear the keyboard
- ; The second time the program run,
- ; free allocated memory and exit itself
- ;================================
- ;
- ; Scan codes de las teclas a controlar
- alt equ 38h
- ctrl equ 1dh
- sizq equ 2ah
- sder equ 36h
-
- ; longitud de la cabecera de identificacion
- LCAB equ 15
- ; equs interesantes
- TIMER equ 40H
- PORT_B equ 61H
- ; Constante que se suma al scan code de la tecla cuando se
- ; detecta que se ha dejado de pulsar
-
- const equ 80h
-
- ; Numero de puerto del teclado
-
- kbd_port equ 60H
-
-
- ; estructura donde vamos a guardar el vector de interrupcion
- ;--------------------------------
- vector struc
- regip dw ?
- regcs dw ?
- vector ends
-
- ;--------------------------------
- CODE SEGMENT
-
- ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE
-
- ;Program Segment Prefix
-
- INCLUDE PSP.INC
-
-
- START: jmp init
-
- ASSUME CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
-
- vect09 vector <>
-
-
- cabecera db '(C) FJGT - CLKV' ; 15 bytes de cabecera
- ; para identificar la
- ; rutina
-
-
- ;------------------------
- ;SERVICIO DE INTERRUPCION
- ;------------------------
- SERINT PROC FAR
-
- ;salva registros
-
- PUSH AX
- PUSH BX
- PUSH CX
- in al,kbd_port ;obtenemos el scan code de la
- ;tecla pulsada
- cli ;prohibimos las interrupciones
-
- cmp al,alt ;
- jz salir ;
- cmp al,ctrl ; comprobamos que no
- jz salir ; es ninguna de las
- cmp al,sizq ; teclas que no han
- jz salir ; de sonar
- cmp al,sder ;
- jz salir ;
- and al,const ;
- jnz salir ;
-
- sti ;permitimos las interrupciones
-
- ; codigo del pitido que se oye al pulsar las teclas
-
- mov bx,25
- in al,61h
- push ax
- mas: and al,0fch
- out 61h,al
- mov cx,50
- l1: loop l1
- or al,2
- out 61h,al
- mov cx,50
- l2: loop l2
- dec bx
- jnz mas
- pop ax
- out 61h,al
-
- ; fin del pitido
-
- salir: sti
-
- POP CX
- POP BX
- POP AX
- jmp vect09 ;ir a ejecutar la verdadera
- ;interrupcion 9
- SERINT ENDP
-
- INIT LABEL NEAR
-
- ;salvar antiguo vector 09h y comprobar que no esta cargada la rutina
-
- push es
- MOV AH,035H
- MOV AL,009H
- int 21h
- assume es:nothing
- mov vect09.regip,bx
- mov vect09.regcs,es
- mov di,bx
- sub di,LCAB ;apunta al comienzo de la cabecera
- mov cx,LCAB ;numero de bytes a comparar
- assume ds:code
- mov si,offset cabecera
- cld ;
- repe cmpsb
- jcxz ya_esta
-
-
- pop es
- assume es:code
-
- ;Cambiar vector de interrupcion 09H
-
- MOV AH,025H
- MOV AL,009H
- mov dx,offset serint
- int 21h
-
- ;Liberar memoria cogida al entorno
-
- push es
- mov ah,049h ;funcion para liberar memoria
- mov es,entorno ;cogida con la 48H
- assume es:nothing
- int 021h
- pop es
- assume es:code
-
- ;Salida: Termina y permanece residente
-
- MOV DX,OFFSET init
- shr dx,1 ;dividimos el total
- shr dx,1 ;de bytes de la
- shr dx,1 ;rutina por 16 para
- shr dx,1 ;sacar los parrafos
- inc dx ;que ocupa
- add dx,16 ;PSP en parrafos
- MOV AX,3100H ; terminar y
- INT 21H ; quedar residente
-
- ;Salida: Termina porque ya esta residente la rutina
- ;y repone el anterior vector de interrupcion
- ya_esta:
- sub bx,LCAB + 4 ; para que apunte donde esta
- mov di,bx ; guardado el verdadero vector
- mov dx,es:word ptr [di] ; dx := offset
- mov ax,es:word ptr[di + 2] ; ds := segment
- push ds
- mov ds,ax
- assume ds:code
- MOV AH,025H ; funcion para cambiar el vector
- MOV AL,009H ; de interrupcion que esta en AL
- int 21h
- pop ds
- assume ds:code
- push es
- mov ah,049h ;funcion para liberar memoria
- mov es,vect09.regcs ;cogida con la 48H
- assume es:nothing ; es debe apuntar al comienzo
- int 021h ; de la memoria a liberar
- pop es
- assume es:code
- mov dx,offset msg1 ; mostramos el mensaje
- MOV AX,0900H ; por la pantalla
- int 21h
- MOV AH,4CH ; terminar proceso
- INT 21H
-
- ; variables internas
-
- msg1 db 'Rutina desinstalada',13,10,'$'
-
- CODE ENDS
- END start