Jump to content
a3deluxe

Desactivar 3 teclas do teclado - Assembly

Recommended Posts

a3deluxe

Boas,

Tenho um programa que roda em ms-dos.

só que precisava de desactivar 3 teclas do teclado antes dele arrancar.

(criar um executável). tem que ser em assembly?? alguém sabe código para criar??

Obrigado

Nelson

Share this post


Link to post
Share on other sites
apocsantos

      Boa noite

      Podes fazer um TSR que actue ao nivel da BIOS e intercepte as teclas que queres "desabilitar", de forma a que os restantes programas as reconheçam quando são pressionadas. Podes fazer em C ou até mesmo em Pascal, ou mesmo em Assembly.

      Deixo-te um link para uma pagina de um bom livro que noutros tempos li, chamado "The Art of Assembly", onde aborda precisamente TSR's e Intercepção de teclas por interacção com a BIOS no interrupt 16h.

http://www.creative.net.au/mirrors/asm/CH20/CH20-3.html

    Espero que ajude, pois tens aqui tudo o que precisas agora é só mesmo programar.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

boa noite.

obrigado amigo

pela ajuda.mas ta difícil.. n tou a conceguir, ;)

queria desactivar as teclas (R,T,P,4 e ESC)

através de um .exe

quanto faz por criar isso para mim? :D

cumprimentos

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Gostaria que esclarecesses algumas coisas sobre este assunto, nomeadamente o que te leva a precisar deste trabalho, e se de facto apenas pretendes a desactivação das teclas em letra maiúscula ou também em minúscula, além da tecla 4 se pretendes desactivada no teclado principal ou também no "mumeric keypad", isto trata-se de um trabalho académico?

    Não tenho habito de fazer trabalhos remunerados pedidos em tópicos que não nos de anúncios de emprego, por isso se pretendes ajuda, para realizar a tarefa, estás no local certo e eu em breve tenciono colocar cá a source em assembly para resolver o dito exercício. De contrario solicita o fecho do tópico aqui e coloca abre nos anúncios de emprego.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Boa noite. :)

Era para um trabalho académico,estou num curso profissional,precisava mesmo de ajuda.

as teclas são para desactivar no MS-DOS e usa las pela porta paralela,quando e executado o exe.

se possível no Windows não desactivar,

E um programa de jogos para maquinas que precisava substituir as teclas do teclado por botões através da porta-paralela.

acha que e possível?podia postar o código,

agradecia imensos.

obrigado.

abracos

Share this post


Link to post
Share on other sites
apocsantos

      Boa noite,

      Se é um trabalho académico mais uma razão para seres tu a fazê-lo, pois assim aprenderias como se faz. Ainda assim coloco-te a ultima questão antes de te deixar a solução ou parte dela, pois dar-ta toda era fazer o teu trabalho e eu não sou muito a favor dessas "soluções", o teclado é USB ou PS/2?

      Em DOS convém ser PS/2, se bem que não me preocupei até ao momento com o USB uma vez que a minha abordagem é fazer constantes scan's à BIOS, em busca dos códigos correspondentes aquelas teclas e caso elas sejam premidas, simplesmente detecte, e faça um reset à leitura do teclado na bios, para re-iniciar a leitura descartando a tecla.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Boas,

o teclado é em PS/2.

gostava de aprender a fazer, mas esta difícil. não estou a chegar la sozinho.

porque alem de desactivar algumas teclas do teclado,queria usar essas mesmas teclas pela Paralela.

A ideia era ligar os botões a ficha de 25pinos da paralela.Quando carrega-se nos botões acciona-se como se fosse o teclado.

Agradecia a ajuda.

:)

obrigado

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Isto tem sido falta de tempo, parte do programa está pronta, parte ainda falta, mas quero ver se amanha como é feriado a acabo. Estou a usar Assembly x86 e o MASM como compilador.

    Para uma tecla está feito, agora falta fazer para a maiúscula da mesma, e pronto apartir daí tudo é fácil.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Devido à falta de tempo que tenho tido não me foi possivel concluir, ainda assim deixo-te aqui um pedaço do que está feito, para ver se te ajuda alguma coisa.

    Este código foi apenas adaptado, de um TSR já antigo, de um manual de 1989 onde mencionava como autor original Donald G. Roy. Como adaptei código esse autor e na ausência de indicações sobre a direitos de autor achei por bem mencionar o nome do autor original.

;Inicia a execução para modo TSR
;
INITIALIZE	PROC	NEAR
	MOV	AH,35H			
	MOV	AL,9
	INT	21H
	MOV	AH,25H			
	MOV	AL,9
	INT	21H

	MOV AX,ENVIRON	
	MOV ES,AX
	MOV AH,73	
	INT 21H		
;
	MOV	DX,OFFSET INITIALIZE
	INT	27H
INITIALIZE	ENDP
;
CODE	ENDS
END	BEGIN

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

      Voltei a pegar no exemplo, mas apenas fiz para uma tecla, e não tive oportunidade de testar, pois não tenho de momento nenhuma maquina com MS-DOS. Já para fazer isto tive de ir "desenterrar" apontamentos. Tal como no exemplo que te deixei no post ultimo este programa baseia-se no mesmo exemplo que tenho num velho livro, com apontamentos, que indica como autor do exemplo original Donald G. Roy . Talvez se pesquisares um pouco encontres exemplos para fazer o resto que te falta. Aqui tens para a tecla "r".

Cordiais cumprimentos,

Apocsantos

KB_DATA		EQU	60H		
KB_CTRL		EQU	61H		
EOI		EQU	20H		
INT_CTRL_PORT	EQU	20H		
R_KEY		EQU	83		; codigo para a tecla "r"

;
CODE		SEGMENT PARA PUBLIC 'CODE'
	ASSUME	CS:CODE
	ORG 44			
ENVIRON		DW 	?		
	ORG	100H
BEGIN:		JMP	INITIALIZE	

OLD_INT_9H	LABEL	DWORD		
OLD_KBD_INT	DW	2 DUP (?)

;
CTRLALT		PROC	NEAR
	STI			
	PUSH	AX		
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	PUSH	DS
	PUSH	ES
	IN	AL,KB_DATA	
	CMP	AL,R_KEY	
	JNE	CA4		
	MOV	AH,2	
	INT	16H		
	JNE	EXIT	
	MOV	AH,2	
	INT	16H		
	JE	EXIT		

;
	CALL	KB_RESET	
;
	MOV	AH,25H			
	MOV	AL,9			
	MOV	DX,OLD_KBD_INT[2]
	MOV	DS,DX			
	MOV	DX,OLD_KBD_INT
	INT	21H			
	JMP	DONE			
;
EXIT:		POP	ES		
	POP	DS
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	JMP	OLD_INT_9H	
;
CA5:		CALL	KB_RESET	
DONE:		POP	ES		
	POP	DS
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	IRET			;
CTRLALT		ENDP
;
KB_RESET	PROC	NEAR
	IN	AL,KB_CTRL	
	MOV	AH,AL		
	OR	AL,80H		
	OUT	KB_CTRL,AL	
	MOV	AL,AH		
	OUT	KB_CTRL,AL	
	CLI			
	MOV	AL,EOI		
	OUT	INT_CTRL_PORT,AL	
	STI			
	RET
KB_RESET	ENDP


INITIALIZE	PROC	NEAR


	MOV	AH,35H			
	MOV	AL,9
	INT	21H
	MOV	OLD_KBD_INT,BX	
	MOV	OLD_KBD_INT[2],ES
	MOV	AH,25H			
	MOV	AL,9
	LEA	DX,CTRLALT		
	INT	21H
;
	MOV AX,ENVIRON	
	MOV ES,AX
	MOV AH,73	
	INT 21H		
;
	MOV	DX,OFFSET INITIALIZE
	INT	27H
INITIALIZE	ENDP
;
CODE	ENDS
END	BEGIN


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Boa noite.

Muito obrigado pela ajuda.

agora tenho que usar um compilador para criar um .exe?

para criar as outras teclas e copiar e substituir a linha de codigo da tecla r?

cumprimentos ;)

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Aqui deixo-te as linhas que precisas acrescentar para cada tecla:

TEST	AL,4_KEY	;a tecla foi primida?
JE	EXIT		;nao? segue.

E no inico onde são iniciadas as variaveis e seus valores:

4_KEY		EQU	4		;codigo numerico da tecla

    O compilador é o MASM, vai ao google! ;) Como escrevi em teoria isto funciona, não tenho maquina com MS-DOS nem compilei, adaptei um velho exercício de um livro com apontamentos, foi mais também para recordar matéria de outra época! :) Em teoria dá para teclados PS/2 e faz a intercepção dos pedidos do teclado à BIOS, a baixo nível. Acima de tudo espero que aprendas alguma coisa sobre Assembly x86! :D

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Bom dia Apocsantos. ;)

Mais uma vez obrigado pela ajuda.

Já testei o código, e dá-me erro.(EMM386 detectou erro nº12 é um aplicativo, endereço de memoria 125b:0105. EMM386 interprete para diminuir a chance de perda de dados.consulte o arquivo LEIME.)

aqui esta o AUTOEXEC do meu programa:

-------------------------------------------

echo off

DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF

DOS=HIGH,UMB

rem DEVICE=C:\DOS\RAMDRIVE.SYS 16384 512 1024 /E

SWITCHES=/F /K /N

SHELL=d:\H.EXE /P /E:1024

c:

cd\

tlp.exe ----------»1º arranca este, tudo OK, depois carrega o key.exe, e dá erro.

key.exe -------------» ficheiro que criei para anular a tecla R

D:

cls

COPY C:\PACK\forte.exe D:\

forte

------------------------------

queria que depois de ler o ficheiro que criei (KEY.EXE) ele corresse logo para o programa.

é o ficheiro (FORTE)

Ou tenho que fazer algum código para ele arrancar para o ficheiro FORTE

cumprimentos

Share this post


Link to post
Share on other sites
apocsantos

    Bom dia,

    Para responder a isso nem preciso de apontamentos, mostra-me o config.sys que está em c:\ . Se tiveres dificuldade em ver esse ficheiro usa o

dir /a

pois ele teve estar com atributos de "read-only" e "system", ainda assim com um

edit config.sys

ou

type configig.sys

consegues listar o ficheiro.

Dentro dele deve estar uma referência ao EMM386.exe, o erro que me indicas-te é o EMM386 é um gestor de memória extendida (tudo o que fica acima dos 640kbytes do DOS. O programa deve ocupar algo tipo uns 40 a 50 kbytes, por isso não deviam estar em conflito.

Provavelmente se desactivares ou alterares as configurações do EMM386 isso fica resolvido, mas mostra-me o file que eu vejo isso.

P.S.: O google continua a ser um gajo muita porreiro! Não come, não dorme, trabalha 24/7!

Cordiais cumprimentos

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

aqui esta o config.sys

----------------------------

DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF

DEVICE=C:\DOS\EMM386.EXE NOEMS

BUFFERS=80,0

FILES=200

DOS=UMB

LASTDRIVE=E

FCBS=4,0

rem 16384 512 1024 /E

DEVICEHIGH /L:2,6000 =C:\DOS\RAMDRIVE.SYS 24576 512 1024 /E

DOS=HIGH

SWITCHES=/F /K /N

SHELL=D:\h.exe /P /E:1024

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

    Não chegas-te a ir ao google... Acho que já deixei claro que não "ofereço peixes, prefiro dar canas de pesca e ensinar a pescar". Aqui tens o config.sys modificado. (Não testado pois não tenho maquina com MS-DOS).

DEVICE=C:\DOS\HIMEM.SYS /TESTMEM:OFF
DEVICE=C:\DOS\EMM386.EXE NOEMS
STACKS=16,256
BUFFERS=80,0
FILES=200
DOS=UMB
LASTDRIVE=E
FCBS=4,0
rem 16384 512 1024 /E
DEVICEHIGH /L:2,6000 =C:\DOS\RAMDRIVE.SYS 24576 512 1024 /E
DOS=HIGH
SWITCHES=/F /K /N
SHELL=D:\h.exe /P /E:1024

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Boa tarde.

Já corri o programa e da-me um erro novamente: 1359:0105

cumprimentos

obrigado

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Removi o pedaço de codigo que limitava o uso de memória a 80kb. Penso que assim resolvas o problema. Aqui fica o codigo modificado:

KB_DATA		EQU	60H		
KB_CTRL		EQU	61H		
EOI		EQU	20H		
INT_CTRL_PORT	EQU	20H		
R_KEY		EQU	83		; codigo para a tecla "r"

;
CODE		SEGMENT PARA PUBLIC 'CODE'
	ASSUME	CS:CODE
	ORG 44			
ENVIRON		DW 	?		
	ORG	100H
BEGIN:		JMP	INITIALIZE	

OLD_INT_9H	LABEL	DWORD		
OLD_KBD_INT	DW	2 DUP (?)

;
CTRLALT		PROC	NEAR
	STI			
	PUSH	AX		
	PUSH	BX
	PUSH	CX
	PUSH	DX
	PUSH	SI
	PUSH	DI
	PUSH	DS
	PUSH	ES
	IN	AL,KB_DATA	
	CMP	AL,R_KEY	
	JNE	CA4		
	MOV	AH,2	
	INT	16H		
	JNE	EXIT	
	MOV	AH,2	
	INT	16H		
	JE	EXIT		

;
	CALL	KB_RESET	
;
	MOV	AH,25H			
	MOV	AL,9			
	MOV	DX,OLD_KBD_INT[2]
	MOV	DS,DX			
	MOV	DX,OLD_KBD_INT
	INT	21H			
	JMP	DONE			
;
EXIT:		POP	ES		
	POP	DS
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	JMP	OLD_INT_9H	
;
CA5:		CALL	KB_RESET	
DONE:		POP	ES		
	POP	DS
	POP	DI
	POP	SI
	POP	DX
	POP	CX
	POP	BX
	POP	AX
	IRET			;
CTRLALT		ENDP
;
KB_RESET	PROC	NEAR
	IN	AL,KB_CTRL	
	MOV	AH,AL		
	OR	AL,80H		
	OUT	KB_CTRL,AL	
	MOV	AL,AH		
	OUT	KB_CTRL,AL	
	CLI			
	MOV	AL,EOI		
	OUT	INT_CTRL_PORT,AL	
	STI			
	RET
KB_RESET	ENDP


INITIALIZE	PROC	NEAR


	MOV	AH,35H			
	MOV	AL,9
	INT	21H
	MOV	OLD_KBD_INT,BX	
	MOV	OLD_KBD_INT[2],ES
	MOV	AH,25H			
	MOV	AL,9
	LEA	DX,CTRLALT		
	INT	21H

;
	MOV	DX,OFFSET INITIALIZE
	INT	27H
INITIALIZE	ENDP
;
CODE	ENDS
END	BEGIN

O codigo que tens de remover no teu programa "já feito para as letras que queres é o seguinte:

	MOV AX,ENVIRON	;point to environment
	MOV ES,AX
	MOV AH,73	
	INT 21H		

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Boas!  :P

ao compilar da-me 1 erro:

Assembling:key.asm

key.asm(31) : ERROR a2006: undefined symbol :CA4

Obrigado

Cumprimentos

Share this post


Link to post
Share on other sites
apocsantos

    Bom dia,

    Estás a compilar em dos ou em windows 2K ou superior? Qual o compilador que estás a utilizar? Se puderes posta o código todo, para ser mais fácil ver o que pode estar na origem desse erro.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
a3deluxe

Estou a usar o Masm32 de 16bits

usei o seguinte compilador

c:\masm32\bin>ML/c key.asm

link16 key.obj

o que me aconselha a fazer?

cumprimentos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.