Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2011, 23:17   #1
begovik
Пользователь
 
Аватар для begovik
 
Регистрация: 08.03.2010
Сообщений: 48
По умолчанию не разберусь с функцией 01h прерывания 16h

Здравствуйте! Ребят, кто разбирается в прерываниях клавиатуры помогите...
У меня полоска по идее должна идти в одном направлении пока я не нажму клавишу другого и т.д.
Но программа воспринимает только первое направление, а дальше не
слушается.
Я использую функцию 01h прерывания int 16h;
c функцией 0h всё работает правильно, но с 01h не разберусь.
помогите!!!


Код:
code segment
assume cs:code,ds:code
org 100h
go:
;----------------------------входные параметры
      mov ax,0b800h
      mov es,ax
@ramki:  xor cx,cx
      xor dx,dx
      mov ax,04h
      int 10h
;----------------------------проверка нажатий клавиш      
@cikl: ;mov ah,0
	mov ah,01h
	int 16h
         cmp ah,4bh ;left
	   je @left
		cmp ah,4dh ;right
		je @right
         cmp ah,48h ;up
         je @up
		cmp ah,50h ;down
		je @down
         cmp ah,1ch	;Enter
         je @exit
;----------------------------         
		cmp cx,320d	;
		jae @ramki	;
	  cmp dx,200d		;
	  jae @ramki		;
		cmp cx,0	;рамки видеорежима
		js @ramki	;
	  cmp dx,0		;
	  js @ramki		;
;----------------------------

jmp @cikl
;----------------------------направления движения
@left:  dec cx	;движение
      call tochka	;влево
jmp @cikl

@right:	inc cx ;движение
	call tochka	;вправо
jmp @cikl

@down:  inc dx	;движение
      call tochka	;вниз

jmp @cikl

@up:  dec dx		;движение
      call tochka	;вверх

jmp @cikl
;======================
@exit:  mov ax,4c00h ;|
      int 21h		;|
;======================
tochka proc
    mov ax,0c1bh
    int 10h
    call delay
    ret
tochka endp
	delay proc
		push cx
		mov cx,10h
	os: 	nop
		call delay2
		loop os
		pop cx
		ret
	delay endp
		delay2 proc
			push cx
			mov cx,01fffh
		op: 	nop
			loop op
			pop cx
			ret
		delay2 endp
code ends
end go

Последний раз редактировалось Stilet; 17.01.2011 в 10:27.
begovik вне форума Ответить с цитированием
Старый 17.01.2011, 08:33   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Функция 01h не годится для проверки ввода. Она не удаляет символ из очереди, как функция 00h. Я в подобной программе использовал 07h прерывания 21h. Только прерывание нужно вызывать два раза подряд. Тогда не ждёшь нажатия клавиши. И проверять не ah, a al. Предварительно вызывается функция 0bh, и al проверяется на равенство 0ffh. Если да, то можно переходить к проверке кода нажатой клавиши.

Последний раз редактировалось vadimych; 17.01.2011 в 13:29.
vadimych вне форума Ответить с цитированием
Старый 21.01.2011, 21:13   #3
begovik
Пользователь
 
Аватар для begovik
 
Регистрация: 08.03.2010
Сообщений: 48
По умолчанию

Извини vadimych что с запозданием но я разобрался с "01h" просто после каждой проверки нажатия нужно очищать буфер клавиатуры, но всё равно спасибо, а то
я уже недели две назад задавал этот вопрос - никто чё-то не ответил...
begovik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задали такую тему что сам не разберусь pasichnuk.sasha Помощь студентам 6 12.05.2010 16:55
Не разберусь в плохом скане кода fs444 Общие вопросы C/C++ 3 14.01.2010 15:10
Никак не разберусь почему не работает.. CodeExpert Помощь студентам 11 21.12.2009 02:10
DOS Fn 16H (Assembler) Flinka Помощь студентам 2 27.05.2009 22:21