Ensamblador - TECLADO POR ENCUESTA

 
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder