146 lines
4.1 KiB
NASM
146 lines
4.1 KiB
NASM
|
||
_TEXT SEGMENT BYTE PUBLIC 'CODE'
|
||
|
||
ASSUME CS:_TEXT
|
||
|
||
PUBLIC DIR_MEM_TECLA
|
||
|
||
DIR_MEM_TECLA DD 0
|
||
|
||
PUBLIC VECTOR_TECLADO
|
||
|
||
VECTOR_TECLADO DD 0
|
||
|
||
PUBLIC GUARDA_VECTORES
|
||
|
||
GUARDA_VECTORES PROC NEAR
|
||
PUSH AX
|
||
PUSH BX
|
||
PUSH ES
|
||
MOV AH,35h ;Guarda el vector del teclado.
|
||
MOV AL,09h
|
||
INT 21h
|
||
MOV WORD PTR CS:[VECTOR_TECLADO],BX
|
||
MOV WORD PTR CS:[VECTOR_TECLADO+2],ES
|
||
POP ES
|
||
POP BX
|
||
POP AX
|
||
RET
|
||
GUARDA_VECTORES ENDP
|
||
|
||
PUBLIC _SET_VECTORES
|
||
|
||
_SET_VECTORES PROC NEAR
|
||
CALL GUARDA_VECTORES
|
||
PUSH BP
|
||
MOV BP,SP
|
||
PUSH AX
|
||
PUSH DS
|
||
PUSH DX
|
||
PUSH SI
|
||
|
||
LDS SI,[BP+4]
|
||
MOV WORD PTR CS:[DIR_MEM_TECLA],SI
|
||
MOV WORD PTR CS:[DIR_MEM_TECLA+2],DS
|
||
|
||
MOV DX,OFFSET CS:TECLADO
|
||
MOV AX,_TEXT
|
||
MOV DS,AX
|
||
MOV AL,09h
|
||
MOV AH,25h
|
||
INT 21h ;Cambia el vector del teclado.
|
||
|
||
POP SI
|
||
POP DX
|
||
POP DS
|
||
POP AX
|
||
POP BP
|
||
RET
|
||
_SET_VECTORES ENDP
|
||
|
||
PUBLIC _UNSET_VECTORES
|
||
|
||
_UNSET_VECTORES PROC NEAR
|
||
PUSH BP
|
||
MOV BP,SP
|
||
PUSH AX
|
||
PUSH DS
|
||
PUSH DX
|
||
|
||
MOV DX,WORD PTR CS:[VECTOR_TECLADO]
|
||
MOV AX,WORD PTR CS:[VECTOR_TECLADO+2]
|
||
MOV DS,AX
|
||
MOV AL,09h
|
||
MOV AH,25h
|
||
INT 21h ;Repone el vector del teclado.
|
||
|
||
POP DX
|
||
POP DS
|
||
POP AX
|
||
POP BP
|
||
RET
|
||
_UNSET_VECTORES ENDP
|
||
|
||
PUBLIC TECLADO
|
||
|
||
TECLADO PROC FAR
|
||
PUSH AX
|
||
PUSH BX
|
||
PUSH DS
|
||
PUSH SI
|
||
LDS SI,CS:[DIR_MEM_TECLA]
|
||
IN AL,60h
|
||
MOV AH,AL
|
||
IN AL,61h
|
||
OR AL,10000000b
|
||
OUT 61h,AL
|
||
AND AL,01111111b
|
||
OUT 61h,AL
|
||
MOV AL,AH
|
||
MOV BL,AL
|
||
MOV BH,00h
|
||
AND BX,007Fh
|
||
CMP AL,00h
|
||
JE TECLEADO
|
||
CMP AL,0E0h
|
||
JE TECLEADO
|
||
CMP AL,0F0h
|
||
JE TECLEADO
|
||
CMP BYTE PTR [SI],0E0h ;<3B>ltima tecla
|
||
JNE NO_DOBLE
|
||
ADD BX,128
|
||
NO_DOBLE: TEST AL,80h
|
||
JZ NO_SOLT
|
||
MOV BYTE PTR [BX+SI],0
|
||
JMP TECLEADO
|
||
NO_SOLT: MOV BYTE PTR [BX+SI],1
|
||
TECLEADO: MOV [SI],AL ;<3B>ltima tecla
|
||
LDS SI,CS:[DIR_MEM_TECLA]
|
||
MOV BYTE PTR [SI+84],0
|
||
MOV BYTE PTR [SI+85],0
|
||
MOV AL,[SI+42]
|
||
OR AL,[SI+54]
|
||
CMP AL,1
|
||
JNE NO_IMPR_PANT
|
||
CMP BYTE PTR [SI+55],1
|
||
JNE NO_IMPR_PANT
|
||
MOV BYTE PTR [SI+84],1
|
||
NO_IMPR_PANT: MOV AL,[SI+29]
|
||
OR AL,[SI+157]
|
||
CMP AL,1
|
||
JNE NO_PAUSA
|
||
CMP BYTE PTR [SI+69],1
|
||
JNE NO_PAUSA
|
||
MOV BYTE PTR [SI+85],1
|
||
NO_PAUSA: MOV AL,20h
|
||
OUT 20h,AL
|
||
POP SI
|
||
POP DS
|
||
POP BX
|
||
POP AX
|
||
IRET
|
||
TECLADO ENDP
|
||
|
||
_TEXT ends
|
||
|
||
end |