Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: 0x0309 en 18 Julio 2009, 01:38 am



Título: Ayuda código detección si se presionó tecla
Publicado por: 0x0309 en 18 Julio 2009, 01:38 am
Hola, quiero conseguir emular la función kbhit() de conio.h pero para dos.
Conseguí el siguiente código en este libro (1001 trucos para DOS y PC y 111 Trucos más de DOS 6 - Kris Jamsa)

que se ensambla con el debug.exe así:

Código:
N CHECKKEY.COM

A 100
MOV AH,B
INT 21
AND AL,1
MOV AH,4C
INT 21

R CX
A
W
Q



Funciona, pero el problema es que tengo es que no me reconoce las teclas de las flechas. Alguien que sepa de ensamblador podría por favor ayudarme con el código de arriba, qué le falta para que me detecte las teclas de las flechas.


Yo lo construyo así dentro de cmd:
Código:
debug.exe < arhivo.txt

y lo pruebo con este batch:

Código:
@ECHO OFF
:ini
cls
CHECKKEY.COM
if errorlevel 1 echo.Presiono una tecla&pause
goto ini

Cuando presiono una tecla como las del abecedario, el espacio, cambia el errorlevel, pero cuando presiono las flechas o las teclas insertar, avanzar página no las detecta, y se marea para seguir detectando.


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: Eternal Idol en 18 Julio 2009, 08:58 am
No me parece una forma muy util realmente ... para probar lo logico seria hacer un bucle y ensamblar el codigo.

Esto es lo que estas usando:
http://www.ctyme.com/intr/rb-2565.htm

Y con estas dos si funcionan todas las teclas:
http://www.ctyme.com/intr/rb-1755.htm
http://www.ctyme.com/intr/rb-1754.htm

Primero haces el check y si hay tecla entonces la lees, sino la siguiente vez te dira que hay tecla por la anterior.

La logica de la funcion vendria a ser algo asi:

Código
  1. kbhit:
  2.  mov ah, 01h
  3.  int 16h ;llamamos a la BIOS para comprobar si alguna tecla fue pulsada
  4.  pushf ;el resultado esta en el flag Z, sexto bit del registro de flags
  5.  pop ax
  6.  and ax, 64
  7.  ret
  8.  


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: YST en 18 Julio 2009, 19:16 pm
No se si es mas o menos a si lo que quieres .

Código
  1. org 100h
  2. bucle:
  3. mov ah,00h
  4. int 16h
  5. cmp al,13
  6. jne @f
  7. mov dx,intro
  8. jmp imprimir
  9. @@:
  10. cmp ah,'M'
  11. jne @f
  12. mov dx,Right
  13. jmp imprimir
  14. @@:
  15. cmp ah,'K'
  16. jne @f
  17. mov dx,left
  18. jmp imprimir
  19. @@:
  20. cmp ah,'H'
  21. jne @f
  22. mov dx,up
  23. jmp imprimir
  24. @@:
  25. cmp ah,'P'
  26. jne @f
  27. mov dx,down
  28. jmp imprimir
  29. @@:
  30. mov byte[Cadena],al
  31. mov dx,Cadena
  32. imprimir:
  33. mov ah,09h
  34. int 21h
  35. jmp bucle
  36. Right db "->",13,10,24h
  37. left db "<-",13,10,24h
  38. up db "[UP]",13,10,24h
  39. down db "[Down]",13,10,24h
  40. intro db '[Intro]',13,10,24h
  41. Cadena db 0,13,10,24h      


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: Eternal Idol en 18 Julio 2009, 20:27 pm
No YST, mejor consulta la documentacion sobre kbhit.


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: YST en 19 Julio 2009, 00:39 am
No YST, mejor consulta la documentacion sobre kbhit.
Tienes toda la razón , no lei esa parte o cuando lei el post no estaba
Citar
« Última modificación: Ayer a las 01:58 por 0x0309 »
EDIT:
Según entendi por esta explicación :
Citar
La función kbhit retorna 0 si no se ha registrado una pulsada de tecla; si hay una disponible, entonces el valor retornado es distinto a cero
La función seria algo a si :P
Código
  1. kbhit:
  2. mov ah, 01h
  3. int 16h
  4. jz a1
  5. xor ax,ax
  6. jmp a1.salir
  7. a1:
  8. mov ax,1
  9. .salir:
  10. ret    


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: Eternal Idol en 19 Julio 2009, 10:14 am
Tienes toda la razón , no lei esa parte o cuando lei el post no estaba

Siempre estuvo, en la primera oracion del hilo.

La función seria algo a si

Ahora si, aunque me gusto mas la forma que use para el valor de retorno.


Título: Re: Ayuda código detección si se presionó tecla
Publicado por: YST en 19 Julio 2009, 18:02 pm
Tienes toda la razón , no lei esa parte o cuando lei el post no estaba

Siempre estuvo, en la primera oracion del hilo.
Entonces ya es hora que me compre lentes :xD