Просмотр полной версии : Процедура опроса клавиатуры
Aprisobal
16.02.2005, 00:13
Подскажите плз короткую и быструю процедуру опроса клавиш предварительно выбранных игроком. Выходные и входные параметры могут быть любыми.
Процы ПЗУ просьба не использовать.
Вот мой вариант, и длинный и медленный:
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 ;))
Спасибо
Первое, что приходит в голову хранить адреса рядов и маски клавиш не в таблице, а самом коде. Тогда для каждой клавиши нужно:
LD A,EF
IN A,(FE)
AND A,16
JR Z,M1
SET 1,D
M1:
Aprisobal
16.02.2005, 01:59
Первое, что приходит в голову хранить адреса рядов и маски клавиш не в таблице, а самом коде. Тогда для каждой клавиши нужно:
LD A,EF
IN A,(FE)
AND A,16
JR Z,M1
SET 1,D
M1:
Оригинально. А при выборе клавиш, их порты и проверяемые биты заносить прямо в код.
Кто ещё что предложит?
Corpsegrinder
16.02.2005, 08:26
я делал табличку
порт, маска, выставляемый бит
а потом циклом по ней пробегался и считаный порт эндил маской и в результат орил выставляемый бит (или несколько, по желанию)
если интересно, могу покопаться - процедурку найти
Подскажите плз короткую и быструю процедуру опроса клавишх
Медленная и здоровая, зато с подавление дребезга и ещё с кое-чем.
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
Aprisobal
19.02.2005, 13:09
Спасибо всем.
Окончательный вариант такой(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
Спасибо всем.
Окончательный вариант такой(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
Aprisobal
19.02.2005, 16:06
И что это за монстр?
Ты хоть сам попробовал разобраться что она делает? Написал бы сразу, что нужна процедура опроса полуряда "67890", тогда бы тебе сразу дали такую процедуру (полный аналог вышепреведенной твоей, но выполняется не 192 такта, а 29):
LD A,#EF
IN A,(#FE)
CPL
AND #1F
А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.
В первом посте:
Подскажите плз короткую и быструю процедуру опроса клавиш предварительно выбранных игроком наверно немного непонятно выразился.
А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.
Тогда любители быстрых кодов могут сгенерить код опроса ВЫБРАННЫХ клавиш в буфер и его вызывать.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot