статус клавиш num, caps и scroll lock

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

17 апр 2008, 19:45

Здравствуйте, уважаемые участники форума!
Подскажите, пожалуйста, как изменять статус клавиш num lock, caps lock и scroll lock
(ну и лампочки заодно).
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

18 апр 2008, 00:13

----------
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

18 апр 2008, 19:49

К сожалению не все понял изсказанного вами.

1. Какое отношение к программе будет иметь адрес 0040:0017

2. Что значит
ждать ACK (FAh)
3.
послать данные байт в 64h, три младших бита это скрол(0), нан(1), капс (2), 1-вкл, 0-выкл
Это что-то вроде

Код: Выделить всё


mov 	ax,1b
out 	64,ax ;scroll

mov 	ax,10b
out 	64,ax ;num

mov 	ax,100b
out 	64,ax ;caps

?

Или нет?
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

19 апр 2008, 00:13

Код: Выделить всё

.model small
.stack 100h
.data
flag db 111b

.code 
.startup

wait1:
	; ожидание возможности посылки команды
	in	al,64h	; прочитать слово состояния
	test	al,10b	; бит 1 установлен?
	jnz	wait1; если нет ждем
	
	mov	al,0EDh
	out	60h,al	; команда клавиатуры EDh

wait2:
	; ожидание возможности посылки команды
	in	al,64h	; прочитать слово состояния
	test	al,10b	; бит 1 установлен?
	jnz	wait2; если нет ждем,
	
	mov	al,flag
	out	60h,al	; новое состояние светодиодов
    
    not flag
    and flag,111b
    
mov ax,0700h ; ожидаем нажатие на клавишу
int 21h
cmp al,27;Esc
jne wait1

mov ax,4c00h
int 21h
end 
запуск чистый дос
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

19 апр 2008, 17:59

airyashov, что-то прога ничего не делает...
Что значит
ожидание возможности посылки команды
?
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

20 апр 2008, 22:53

Под чистый дос, под винду не пашет!
1 бит в 64h порте - проверка готовности клавы принять данные.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

21 апр 2008, 12:23

Вообще-то, как это ни может показаться невероятным, для "зажигания"/"тушения" клавиш достаточно изменить соответсвующие биты в в соответствующем байте в области данных BIOS (40h:17h)

Например, следующий код "тушит" NumLock:

Код: Выделить всё

      .model tiny
      .Code
      Org  100h
Start:
      Xor  Ax,Ax
      Mov  Es,Ax
      And  byte ptr Es:[0417h],(not 20h)
      Ret
End  Start

Биты, сответсвующие клавишам:

Код: Выделить всё

 Bit  Val  Meaning
  7   $80  Insert on
  6   $40  Caps Lock on
  5   $20  Num Lock on
  4   $10  Scroll Lock on
  3   $08  <Alt> depressed
  2   $04  <Ctrl> depressed
  1   $02  <LeftShift> depressed
  0   $01  <RightShift> depressed
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

21 апр 2008, 12:39

Весело, Я всегда считал что они отражают состояние клавиш, но не управляют.
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

21 апр 2008, 14:05

airyashov писал(а):Весело, Я всегда считал что они отражают состояние клавиш, но не управляют.
Я тоже когда-то так считал. Потом вдруг опытным путем ообнаружил, что и на смену значения бита клавиша (и "огонек") тоже реагируют.
Возможно, эта "фигня" началась с AT-шек. Т.е., возможно, на XT такой фокус не проходил. Но наверняка уже не скажу. Дааавно здесь сидим (c) :)
Аватара пользователя
Alex_Burn
Сообщения: 145
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

21 апр 2008, 17:46

Хм...
BBB, а ваш код тоже под винду не пашет?
А то созданная программа никак не влияет на индикаторы клавы. :(
Ответить