Важная информация

User Tag List

Показано с 1 по 9 из 9

Тема: Процедура опроса клавиатуры

  1. #1
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    Question Процедура опроса клавиатуры

    Подскажите плз короткую и быструю процедуру опроса клавиш предварительно выбранных игроком. Выходные и входные параметры могут быть любыми.
    Процы ПЗУ просьба не использовать.
    Вот мой вариант, и длинный и медленный:
    Код:
    chkKBD: ;проца
    	LD D,0
    	LD HL,KEYStbl
    	LD C,$FE
    	; LEFT
    	CALL .chk
    	JR Z,$+4
    	SET 4,D
    	; RIGHT
    	CALL .chk
    	JR Z,$+4
    	SET 3,D
    	; DOWN
    	CALL .chk
    	JR Z,$+4
    	SET 2,D
    	; UP
    	CALL .chk
    	JR Z,$+4
    	SET 1,D
    	; FIRE
    	CALL .chk
    	JR Z,$+4
    	SET 0,D
    	;на выходе в D установлены нужные биты
    	RET
    .chk:	LD B,(HL)
    	INC HL
    	IN A,(C)
    	AND (HL)
    	CP (HL)
    	INC HL
    	RET	
    
    KEYStbl:
    	DB $EF,16	;LEFT
    	DB $EF,8	;RIGHT
    	DB $EF,4	;DOWN
    	DB $EF,2	;UP
    	DB $EF,1	;FIRE ;))
    Спасибо
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    18.01.2005
    Адрес
    Ростов-на-Дону
    Сообщений
    577
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    8
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Первое, что приходит в голову хранить адреса рядов и маски клавиш не в таблице, а самом коде. Тогда для каждой клавиши нужно:

    Код:
    	LD A,EF
    	IN A,(FE)
    	AND A,16
    	JR Z,M1 
    	SET 1,D
    M1:

  4. #3
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lion17
    Первое, что приходит в голову хранить адреса рядов и маски клавиш не в таблице, а самом коде. Тогда для каждой клавиши нужно:

    Код:
    	LD A,EF
    	IN A,(FE)
    	AND A,16
    	JR Z,M1 
    	SET 1,D
    M1:
    Оригинально. А при выборе клавиш, их порты и проверяемые биты заносить прямо в код.
    Кто ещё что предложит?
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  5. #4
    Member Аватар для Corpsegrinder
    Регистрация
    19.01.2005
    Адрес
    Chelyabinsk
    Сообщений
    110
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    я делал табличку
    порт, маска, выставляемый бит

    а потом циклом по ней пробегался и считаный порт эндил маской и в результат орил выставляемый бит (или несколько, по желанию)

    если интересно, могу покопаться - процедурку найти

  6. #5
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от aprisobal
    Подскажите плз короткую и быструю процедуру опроса клавишх
    Медленная и здоровая, зато с подавление дребезга и ещё с кое-чем.

    0ой бит - кнопка нажата-не нажата
    7ой - ставится сразу после нажатия на 1 промежуток между опросами, потом снова 0.

    Код:
    KEYS	;YIELDING KEYS
    
    
    KMSK	EQU	3
    
    
    	LD	HL,KEYAD
    
    
    	LD	BC,#7FFE ;SPACE
    	IN	D,(C)
    	CALL	ANTID
    
    
    	LD	B,#BF	;ENTER
    	IN	D,(C)
    	CALL	ANTID
    
    	LD	B,#F7
    	IN	D,(C)
    
    	CALL	ANTID	;1
    	CALL	ANTID
    	CALL	ANTID
    	CALL	ANTID
            CALL	ANTID	;5
            RET
    
    
    ANTID
    	XOR	A
    	RRC	D
    	RRA
    
    	XOR	(HL)
    	JP	P,NONEWKEY
    
    
    	;STATE CHANGED
    
    	XOR	(HL)
    	AND	#80
    	JR	KEYDONE
    
    NONEWKEY
    
    	INC	A
    	AND	KMSK
    	JR	NZ,NOKEY ;CTR INCREMENTS
    
    	;HERE CTR FINISHED, NEWKEY!
    
    	BIT	7,(HL)
    	INC	HL
    	JR	Z,PRESSED
    
    ;NOT PRESSED - CLR KEY
    
    CLRKEY
    	LD	(HL),0
    
    	JR	ENDKEY
    
    
    PRESSED
    	BIT	0,(HL)
    	JR	NZ,PRSD_ALR
    
    	;FIRST PRESSED
    
    	LD	(HL),#81
    	JR	ENDKEY
    
    PRSD_ALR
    	RES	7,(HL)
    
    
    ENDKEY
    	DEC	HL
    	LD	A,KMSK
    
    NOKEY
    	XOR	(HL)
    	AND	KMSK
    	XOR	(HL)
    KEYDONE
    	LD	(HL),A
    
    	INC	HL
    	INC	HL
    
    	RET
    
    
    
    
    
    
    KEYAD
    	db	 0
    KSPC	db	 0
    
    	db	 0
    KENT	db	 0
    
    	db	 0
    K1	db	 0
    
    	db	 0
    K2	db	 0
    
    	db	 0
    K3	db	 0
    
    	db	 0
    K4	db	 0
    
    	db	 0
    K5	db	 0
    Последний раз редактировалось lvd; 16.02.2005 в 12:21.

  7. #6
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо всем.
    Окончательный вариант такой(225 тактов при ненажатых клавишах):
    Код:
    chkKBD:
    	LD D,0
    	;left
    .leftP:	LD A,$EF
    	IN A,($FE)
    .leftB:	AND 16
    	JR NZ,$+4 
    	SET 4,D
    	;right
    .rightP:LD A,$EF
    	IN A,($FE)
    .rightB:AND 8
    	JR NZ,$+4 
    	SET 3,D
    	;down
    .downP:	LD A,$EF
    	IN A,($FE)
    .downB:	AND 4
    	JR NZ,$+4 
    	SET 2,D
    	;up
    .upP:	LD A,$EF
    	IN A,($FE)
    .upB:	AND 2
    	JR NZ,$+4 
    	SET 1,D
    	;fire
    .fireP:	LD A,$EF
    	IN A,($FE)
    .fireB:	AND 1
    	JR NZ,$+4 
    	SET 0,D
    	RET
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  8. #7
    Activist Аватар для Spectre
    Регистрация
    26.01.2005
    Адрес
    Минск
    Сообщений
    294
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от aprisobal
    Спасибо всем.
    Окончательный вариант такой(225 тактов при ненажатых клавишах):
    Код:
    chkKBD:
    	LD D,0
    	;left
    .leftP:	LD A,$EF
    	IN A,($FE)
    .leftB:	AND 16
    	JR NZ,$+4 
    	SET 4,D
    	;right
    .rightP:LD A,$EF
    	IN A,($FE)
    .rightB:AND 8
    	JR NZ,$+4 
    	SET 3,D
    	;down
    .downP:	LD A,$EF
    	IN A,($FE)
    .downB:	AND 4
    	JR NZ,$+4 
    	SET 2,D
    	;up
    .upP:	LD A,$EF
    	IN A,($FE)
    .upB:	AND 2
    	JR NZ,$+4 
    	SET 1,D
    	;fire
    .fireP:	LD A,$EF
    	IN A,($FE)
    .fireB:	AND 1
    	JR NZ,$+4 
    	SET 0,D
    	RET
    И что это за монстр?
    Ты хоть сам попробовал разобраться что она делает? Написал бы сразу, что нужна процедура опроса полуряда "67890", тогда бы тебе сразу дали такую процедуру (полный аналог вышепреведенной твоей, но выполняется не 192 такта, а 29):
    Код:
    LD A,#EF
    IN A,(#FE)
    CPL
    AND #1F

  9. #8
    Activist
    Регистрация
    17.01.2005
    Адрес
    Belarus, Minsk
    Сообщений
    402
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Spectre
    И что это за монстр?
    Ты хоть сам попробовал разобраться что она делает? Написал бы сразу, что нужна процедура опроса полуряда "67890", тогда бы тебе сразу дали такую процедуру (полный аналог вышепреведенной твоей, но выполняется не 192 такта, а 29):
    Код:
    LD A,#EF
    IN A,(#FE)
    CPL
    AND #1F
    А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.

    В первом посте:
    Подскажите плз короткую и быструю процедуру опроса клавиш предварительно выбранных игроком
    наверно немного непонятно выразился.
    Последний раз редактировалось Aprisobal; 19.02.2005 в 16:08.
    ATW4GS / BIN2SNA / SquareMania <ТИ-3> / Ужасм+
    ATM-Turbo 512 v4.50, Commodore 64G + TAC-2, Retro-Bit Super Retro TRIO

  10. #9
    Veteran Аватар для lvd
    Регистрация
    23.01.2005
    Сообщений
    1,113
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от aprisobal
    А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.
    Тогда любители быстрых кодов могут сгенерить код опроса ВЫБРАННЫХ клавиш в буфер и его вызывать.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •