TECLADO POR ENCUESTA
Publicado por Adrian (1 intervención) el 02/05/2006 10:35:10
Hola, tengo que acabar de implementar una rutina en ensamblador. Solo me falta una parte de una subrutina por implementar y no se como hacerla.
La subrutina que falta acabar de implementar es la _LlegirTeclatENQ PROC FAR, agradeceria que alguien me echara una mano, pq me he quedao bloqueado...
KINT_IMR EQU 21h ; Registre de M…scares d'Interrupci¢
; CONTROLADOR DE TECLAT (a partir del 286):
KTECL_DADES EQU 60h ; Registre de DADES del teclat
KTECL_CONTROL EQU 61h ; Registre de CONTROL del teclat
KTECL_ESTAT EQU 64h ; Registre d' ESTAT del teclat (286, ...)
; SUBRUTINES PUBLIQUES D'AQUEST MãDUL:
PUBLIC _IniTeclatENQ
PUBLIC _LlegirTeclatENQ
PUBLIC _FiTeclatENQ
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP _DATA, _BSS
ASSUME cs:TECLAT_ENQUESTA_CODI, ds:DGROUP
TECLAT_ENQUESTA_CODI SEGMENT BYTE PUBLIC 'CODE'
;; *******************************************************************
;; void IniTeclatENQ (void);
;; *******************************************************************
_IniTeclatENQ PROC FAR
push ax ; guardar registres que es modifiquen
pushf ; guardar valor del flag d'interrupci¢
cli ; inhibir TOTES les interrupcions (emmascarables)
in al, KINT_IMR
or al, 00000010b ; desactivar IRQ1 (teclat)
out KINT_IMR, al
popf ; recuperar valor del flag d'interrupci¢ (0 o 1)
pop ax ; recuperar registres modificats
ret
_IniTeclatENQ ENDP
;; *******************************************************************
;; BYTE LlegirTeclatENQ (void);
;; *******************************************************************
_LlegirTeclatENQ PROC FAR
KTECL_ESTAT EQU 64h ; Registre d' ESTAT del teclat
EnquestaTeclat:
in al, KTECL_ESTAT ; Enquesta de teclat (bit 0 Reg. Estat)
test al, 00000001b
jz EnquestaTeclat ; R. Estat(bit 0)=1 Ë Codi disponible a R. Dades.
;;
;; Trozo de codigo que me falta
;;
_LlegirTeclatENQ ENDP
;; *******************************************************************
;; void FiTeclatENQ (void);
;; *******************************************************************
_FiTeclatENQ PROC FAR
push ax ; guardar registres que es modifiquen
pushf ; guardar valor del flag d'interrupci¢
cli ; inhibir TOTES les interrupcions
in al, KINT_IMR
and al, 11111101b ; activar IRQ1 (teclat)
out KINT_IMR, al
popf ; recuperar valor del flag d'interrupci¢
pop ax ; recuperar registres modificats
ret
_FiTeclatENQ ENDP
TECLAT_ENQUESTA_CODI ENDS
END
La subrutina que falta acabar de implementar es la _LlegirTeclatENQ PROC FAR, agradeceria que alguien me echara una mano, pq me he quedao bloqueado...
KINT_IMR EQU 21h ; Registre de M…scares d'Interrupci¢
; CONTROLADOR DE TECLAT (a partir del 286):
KTECL_DADES EQU 60h ; Registre de DADES del teclat
KTECL_CONTROL EQU 61h ; Registre de CONTROL del teclat
KTECL_ESTAT EQU 64h ; Registre d' ESTAT del teclat (286, ...)
; SUBRUTINES PUBLIQUES D'AQUEST MãDUL:
PUBLIC _IniTeclatENQ
PUBLIC _LlegirTeclatENQ
PUBLIC _FiTeclatENQ
_DATA SEGMENT WORD PUBLIC 'DATA'
_DATA ENDS
_BSS SEGMENT WORD PUBLIC 'BSS'
_BSS ENDS
DGROUP GROUP _DATA, _BSS
ASSUME cs:TECLAT_ENQUESTA_CODI, ds:DGROUP
TECLAT_ENQUESTA_CODI SEGMENT BYTE PUBLIC 'CODE'
;; *******************************************************************
;; void IniTeclatENQ (void);
;; *******************************************************************
_IniTeclatENQ PROC FAR
push ax ; guardar registres que es modifiquen
pushf ; guardar valor del flag d'interrupci¢
cli ; inhibir TOTES les interrupcions (emmascarables)
in al, KINT_IMR
or al, 00000010b ; desactivar IRQ1 (teclat)
out KINT_IMR, al
popf ; recuperar valor del flag d'interrupci¢ (0 o 1)
pop ax ; recuperar registres modificats
ret
_IniTeclatENQ ENDP
;; *******************************************************************
;; BYTE LlegirTeclatENQ (void);
;; *******************************************************************
_LlegirTeclatENQ PROC FAR
KTECL_ESTAT EQU 64h ; Registre d' ESTAT del teclat
EnquestaTeclat:
in al, KTECL_ESTAT ; Enquesta de teclat (bit 0 Reg. Estat)
test al, 00000001b
jz EnquestaTeclat ; R. Estat(bit 0)=1 Ë Codi disponible a R. Dades.
;;
;; Trozo de codigo que me falta
;;
_LlegirTeclatENQ ENDP
;; *******************************************************************
;; void FiTeclatENQ (void);
;; *******************************************************************
_FiTeclatENQ PROC FAR
push ax ; guardar registres que es modifiquen
pushf ; guardar valor del flag d'interrupci¢
cli ; inhibir TOTES les interrupcions
in al, KINT_IMR
and al, 11111101b ; activar IRQ1 (teclat)
out KINT_IMR, al
popf ; recuperar valor del flag d'interrupci¢
pop ax ; recuperar registres modificats
ret
_FiTeclatENQ ENDP
TECLAT_ENQUESTA_CODI ENDS
END
Valora esta pregunta
0