RE:instrucciones de teclado para pacman en pascal
____________________________________________________________
saludos Aliasyo.
Ahí va una unidad Casera del teclado de proposito General ,y mas abajo
como se usa la UNIT , hay mas funciones y otras que he quitado , el tecldo funciona perfectamente .
En el ejemplo solo he usado algunas teclas para que entiendas su funcionamiento , si observas el código verás que puedes usar la unidad
de varias formas.
He preservado las del joystic por si quieres reutilizar el codigo ,pero XP
ya no lo soporta , incluso el tecldo veras que si pulsas mas de 5 veces la
tecla Shif (derecha) el windows XP lo intercepta activando un programilla
llamado Stickykeys - tener en cuenta el efecto secundario de algunas teclas
a la hora bajo el S.O que utilices.
Si tienes dudas postea aquí , solo respondo a los mensajes si no han
pasado mucho tiempo
Saludos MICROPAIS.
____________________________________________________________
{ MICROPAIS 2006 - }
UNIT UTECLA;
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
INTERFACE {.......... * simbolos publicos *..........................}
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
const
{ teclas de funcion }
f1=59;f2=60;f3=61;f4=62;f5=63;f6=64;f7=65;f8=66;f9=67;F10=68;
f11=87;f12=88;
impr_pant=42;
bloq_despl=70;
pausa=29;
{ teclas de cursor }
arriba_izquierda=71;
arriba =72;
arriba_derecha =73;
izquierda =75;
centro =76;
derecha =77;
abajo_izquierda =79;
abajo =80;
abajo_derecha =81;
colocar =82;{ insertar hace interferencias con func insert ??? }
suprimir =83;
escape = 1;
retroceso =14;
tabulador =15;
intro =28;
control =29;
alternativa=56;
espaciador =57;
{ para usar con tecla_pulsada }
{ ejemplo: if teclado[tecla_pulsada]<>'þ' then
cad:=cad+teclado[tecla_pulsada]
else cad:='';}
teclado1:array[0..57]of char=#0+'þ1234567890''þ'+
'þQWERTYUIOP`+þ'+
'þASDFGHJKL¥''§'+
'þ€ZXCVBNM,._þþþ ';
teclado2:array[0..57]of char=#0+'þ!"ú$%&/()=?¨þ'+
'þqwertyuiop^*þ'+
'þasdfghjkl¤ù€'+
'þ€zxcvbnm;:-þþþ ';
var
estado:integer; {actualiza_togle}
insertar,Capslock,Numlock,Scrollock,Alt,Ctrl,
Shifizquierda,ShifDerecha:Boolean;
tec:byte;
procedure actualiza_toggle; { actualiza el estado de las teclas de cambio}
function tecla_pulsada:byte;
{...........................................................................}
var
_cenxx:byte;
_cenyy:byte;
_izq,_der,_arr,_aba:byte;
_bo1,_bo2,_bo3,_bo4:byte;
function init_joypad:boolean;
procedure get_joystick_gamepad;
{////////////////////////////////////////////////////////////////////////////}
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
IMPLEMENTATION {.......... * simbolos privados *......................... }
{°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°}
uses crt,windos;
var regs:tregisters;
procedure actualiza_toggle;
begin
estado:=mem[$40:$17]; { estado de las teclas modificadoras shif y toggle }
if estado and 1=1 then Shifderecha :=TRUE else Shifderecha :=FALSE;
if estado and 2=2 then ShifIzquierda:=TRUE else ShifIzquierda:=FALSE;
if estado and 4=4 then Ctrl :=TRUE else Ctrl :=FALSE;
if estado and 8=8 then Alt :=TRUE else Alt :=FALSE;
if estado and 16=16 then Scrollock :=TRUE else Scrollock :=FALSE;
if estado and 32=32 then NumLock :=TRUE else NumLock :=FALSE;
if estado and 64=64 then CapsLock :=TRUE else CapsLock :=FALSE;
if estado and 128=128 then insertar :=TRUE else insertar :=FALSE;
{falta estado de insert (colocar) and 128=128 then }
end;
{...........................................................................}
{* mantenido para compatibildad de programas antiguos ,ya no hace falta }
{ borrar el buffer del teclado bios despues de una llamada a tecla_pulsada }
procedure borra_buffer;
begin
asm cli end;
mem[$40:$1a]:=mem[$40:$1c];
asm sti end;
end;
{...........................................................................}
{ actualizado 22-7-2001 ahora soporta equipos portatiles con bola mouse que}
{ mandan un codigo al puerto 60h del teclado cuando este se mueve }
{ interfiriendo con el teclado ahora se separa este mediante un codigo del }
{ puerto 64h cod 28=teclado cod 60=bola trackball }
function tecla_pulsada:byte;assembler;
asm
in al,64h
test al,100000b
je @ok1
xor ax,ax
jmp @fin
@ok1:
in al,60h
cmp al,128
jbe @ok2
xor ax,ax
jmp @fin
@ok2:
cli
push es
xor bx,bx
mov es,bx
mov bl,es:[41ah]
mov es:[41ch],bl
pop es
sti
@fin:
end;
{...........................................................................}
{////////////////////////////////////////////////////////////////////////////}
function init_joypad:boolean;assembler;
asm
mov ah,84h
mov dx,1
int 15h
mov _cenyy,bl
mov _cenxx,al
cmp al,0
je @error1
cmp bl,0
je @error2
mov ax,0ffffh
jmp @fin
@error1:
mov ax,0
jmp @fin
@error2:
mov ax,0
@fin:
end;
{////////////////////////////////////////////////////////////////////////////}
{ get_joystick_gamepad: }
{ carga _izq,_der,_arr,_aba_,bo1,bo2,bo3,bo4 de un joystick o gamepad }
procedure get_joystick_gamepad;
{////////////////////////////////////////////////////////////////////////////}
{ joypad: }
{ devuelve un byte con el contenido del las direcciones y botones de un }
{ joystick o de un gamepad en el sigiente orden }
{ izq, der, arr, aba, bo1, bo2, bo3, bo4 }
{ nota:izq=bit0 bo4=bit7 }
{ llamado por get_joystick_gamepad; }
{ SUBFUNCION joypad /////////////////////////////////////////////////////}
function joypad:byte;assembler;
var centrox,centroy:byte;
asm
mov ah,84h
mov dx,1
int 15h
mov dl,_cenxx
mov centrox,dl
mov dl,_cenyy
mov centroy,dl
xor dl,dl
sub centrox,16
cmp al,centrox
ja @no_izq
or dl,1b
@no_izq:
add centrox,32
cmp al,centrox
jb @no_der
or dl,10b
@no_der:
sub centroy,16
cmp bl,centroy
ja @no_arr
or dl,100b
@no_arr:
add centroy,32
cmp bl,centroy
jb @no_aba
or dl,1000b
@no_aba:
mov bl,dl
{ guardamos las direcciones en bl }
{ obtenemos los botones 1,2,3,4 en al }
mov dx,201h
in al,dx
not al
and al,11110000b
or al,bl
end;
{///////////////////////////////////////////////////////////////////////}
var padxy:byte;
begin
padxy:=joypad;
_izq:=padxy and 1 ;
_der:=padxy and 2 shr 1;
_arr:=padxy and 4 shr 2;
_aba:=padxy and 8 shr 3;
_bo1:=padxy and 16 shr 4;
_bo2:=padxy and 32 shr 5;
_bo3:=padxy and 64 shr 6;
_bo4:=padxy and 128 shr 7;
end;
{////////////////////////////////////////////////////////////////////////////}
END.
___________________________________________________________________
***********************************************************
{ MICROPAIS 2006 Prueba de algunas funciones de la unidad Uteclal }
uses crt,utecla;
begin
clrscr;
writeln('Pulsa en las teclas de direccion - Pulsa ESC para salir');
repeat
gotoxy(1,10);
case tecla_pulsada of
arriba_izquierda:write('Arriba Izquierda');
arriba :write('Arriba ');
arriba_derecha :write('Arriba Derecha ');
izquierda :write('Izquierda ');
centro :write('Centro ');
derecha :write('Derecha ');
abajo_izquierda :write('Abajo Izquierda');
abajo :write('Abajo ');
abajo_derecha :write('Abajo derecha ');
colocar :write('Insertar ');
suprimir :write('Suprimeir ');
{------ ejemplo de algunas teclas ------- }
f1 :write(' Funcion 1 ');
f2 :write(' Funcion 2 ');
f12 :write(' Funcion 12 ');
end;
gotoxy(1,12);
actualiza_toggle; { interceptar los cambios de estado de las teclas exp. }
if Shifizquierda then writeln(' Shif IZQ pulsada') else
writeln(' Shif IZQ no pulsada');
if ShifDerecha then writeln(' Shif DER pulsada ') else
writeln(' Shif DER no pulsada');
until tecla_pulsada= escape;
end.