Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ЗАдача с скан кодами / 14 сообщений из 14, страница 1 из 1
18.12.2006, 21:27
    #34208892
The_answer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Может у ког ониб есть пример как вывести скан код клавиши на assemblere.А то горю с курсовым просто конкретно
...
Рейтинг: 0 / 0
18.12.2006, 23:13
    #34209020
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
The_answerМожет у ког ониб есть пример как вывести скан код клавиши на assemblere.А то горю с курсовым просто конкретно

Резидент?
...
Рейтинг: 0 / 0
18.12.2006, 23:30
    #34209043
The_answer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
НУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?
...
Рейтинг: 0 / 0
18.12.2006, 23:58
    #34209077
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Вот, наклепал, сложного ничего нет. Результат печатается в виде 16 разрядного числа. Младший байт соответствуют скан-коду клавиши, старший - расширенному скан-коду. Т.е., например

1C0D - соответствует клавише Enter (скан-код = 13 (0D)).

Однако, ряд клавиш, которым не назначены отображаемые символы (F1 ... F12, Home, End и т.п.) не имеют скан-кода и при нажатии в буфер засылается расширенный скан-код (обычный скан-код равен 0, => младший байт равен 0).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
	. 286 

code 	segment 'code'
	assume cs:code, ds:data
main	proc
	mov	ax, data
	mov	ds, ax

key_down_loop:
	mov	ah, 10h	
	int     16h		

	; Результат в ax
	cmp 	al,  27   	; Нажата клавиша ESC?
	je	exit		; Да, выходим

	; Преобразуем в текстовую форму
	mov	si, offset buff
	add	si,  3 
	call	hex2str
	
	; Выводим
	mov	ah, 09h
	mov	dx, offset buff
	int	21h		

	jmp	key_down_loop	; На ожидание нажатия
exit:
	mov	ax, 4c00h
	int	21h
main	endp

hex2str proc
	push	bx
	push	cx
	push	dx

	mov	bx, 0F000h
	mov	dx,  12 
	mov 	cx,  4 
convert_loop:
	push	ax
	push	cx
	and	ax, bx
	mov	cx, dx
	shr	ax, cl
	pop	cx
	push 	bx
	mov  	bx, offset tbl_hex
	xlat
	mov  	[si], al
	pop  	bx
	sub	dl,  4 	
	ror	bx,  4 
	inc	si
	pop	ax
	loop	convert_loop
	pop	dx
	pop	cx
	pop	bx
	ret
hex2str endp

code	ends

data 	segment
tbl_hex db '0123456789ABCDEF'
buff    db '-> '
	db  4  dup ('*')
	db  10 ,  13 , '$'
data	ends

	end main

P.S. Эх... Если б я так курсовые писал :)
...
Рейтинг: 0 / 0
19.12.2006, 18:51
    #34211388
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
The_answerНУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?21-ое? Ну разве что для вывода на экран.

Просто читай байт из 60h порта, приводи прочитаный байт в текстовый вид и выводи на экран.
...
Рейтинг: 0 / 0
19.12.2006, 19:06
    #34211423
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
White Owl The_answerНУ просто я нажимаю любую клавишу, а на экране появляется ее скан-код. Наверное нужно использовать 21 прерывание , но как?21-ое? Ну разве что для вывода на экран.

Просто читай байт из 60h порта, приводи прочитаный байт в текстовый вид и выводи на экран.

int 21h - вызов DOS. Для вывода на экран имеется функция 09h и с работой клавиатуры (а тем более с выводом на экран) прерывание не имеет ничего общего. С помощью 21-го прерывания и соответствующей функции считывания скен-кода из буфера ввода, также можно легко решить эту задачу.

Чтение из порта - тоже вариант, однако имеет и недостаток и преимущество. Недостаток - более сложная организация программы. Необходим цикл, в котором нужно будет читать значение из порта и заботится о том, чтобы это значение не считать по новой при следующей итерации. Уж пускай BIOS об этом заботится. Преимущество - выше скорость.

Как правило, чтение из порта удобно применять в обработчике прерываний от клавиатуры (а прерывание, кстати, генерируется как при нажатии, так и при отпускании клавиши).
...
Рейтинг: 0 / 0
19.12.2006, 19:29
    #34211467
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Ruslan.Isbarovint 21h - вызов DOS. Для вывода на экран имеется функция 09h и с работой клавиатуры (а тем более с выводом на экран) прерывание не имеет ничего общего. С помощью 21-го прерывания и соответствующей функции считывания скен-кода из буфера ввода, также можно легко решить эту задачу.ээээ... я не понял, ты с чем споришь? :)

Ruslan.IsbarovЧтение из порта - тоже вариант, однако имеет и недостаток и преимущество. Недостаток - более сложная организация программы. Необходим цикл, в котором нужно будет читать значение из порта и заботится о том, чтобы это значение не считать по новой при следующей итерации. Уж пускай BIOS об этом заботится. Преимущество - выше скорость. Ну не так уж это и сложно. А в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент :)
...
Рейтинг: 0 / 0
19.12.2006, 19:33
    #34211476
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
White Owl21-ое? Ну разве что для вывода на экран.

Вот с этим и спорю. легко решить эту же задачу с помощью 21-го прерывания.

White OwlА в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент

Не читаешь предыдущие посты. Про клавиши, не имеющие ASCII эквивалента я писал выше.
...
Рейтинг: 0 / 0
19.12.2006, 19:50
    #34211500
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Ruslan.Isbarov White Owl21-ое? Ну разве что для вывода на экран.
Вот с этим и спорю. легко решить эту же задачу с помощью 21-го прерывания.Легко, но только в области ASCII клавиш. Большинство расширеных оно уже не возмет.

Ruslan.Isbarov White OwlА в плюсах, самый главный, полный контроль всех клавиш, а не только тех которые имеют ASCII эквивалент
Не читаешь предыдущие посты. Про клавиши, не имеющие ASCII эквивалента я писал выше.Это про Int 16h? Неее... оно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новых. А работа со смещенными-расширеными вообще зависит от версии БИОСа. В общем использовать это можно на одной машине и нельзя на другой. Из порта читать проще - там идут унифицированые данные напрямую с клавиатуры.
...
Рейтинг: 0 / 0
19.12.2006, 19:57
    #34211509
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
White Owlоно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новых

На старых - это каких? Есть пример времен 80286. Работает
...
Рейтинг: 0 / 0
19.12.2006, 20:04
    #34211518
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
p.s. точнее работал в те времена
...
Рейтинг: 0 / 0
19.12.2006, 20:27
    #34211546
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
ладно, не будем спорить, думаю имеют место оба способа. Пускай автор выбирает на свое усмотрение.
...
Рейтинг: 0 / 0
19.12.2006, 22:56
    #34211679
The_answer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Ребята, выручили офигено, спасибо огромное. Просто взял выше приведенный пример.
...
Рейтинг: 0 / 0
20.12.2006, 00:06
    #34211739
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ЗАдача с скан кодами
Ruslan.Isbarov White Owlоно как раз расширеные клавиши отбрасывает на старых БИОСах и показывает на новыхНа старых - это каких? Есть пример времен 80286. Работаетээээ.... хм.... Да, действительно... Чувствую себя недовымершим динозавром :) Тех компов на которых приведеный пример не заработает уже пожалуй и не осталось. Впрочем, в институтах еще возможно есть где-нибудь первые XT-шки :)
С другой стороны, на современном компе уже никто кроме студентов на ассемблере и не пишет а работать с портами для них все равно полезней чем учить прерывания BIOS'а. Порты и на других платформах есть, а биосы там собственные.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / ЗАдача с скан кодами / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]