PDA

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



Aprisobal
16.02.2005, 01: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 ;))
Спасибо

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



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

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



LD A,EF
IN A,(FE)
AND A,16
JR Z,M1
SET 1,D
M1:
Оригинально. А при выборе клавиш, их порты и проверяемые биты заносить прямо в код.
Кто ещё что предложит?

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

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

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

lvd
16.02.2005, 13:12
Подскажите плз короткую и быструю процедуру опроса клавишх

Медленная и здоровая, зато с подавление дребезга и ещё с кое-чем.

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, 14: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

Spectre
19.02.2005, 16:43
Спасибо всем.
Окончательный вариант такой(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, 17:06
И что это за монстр?
Ты хоть сам попробовал разобраться что она делает? Написал бы сразу, что нужна процедура опроса полуряда "67890", тогда бы тебе сразу дали такую процедуру (полный аналог вышепреведенной твоей, но выполняется не 192 такта, а 29):


LD A,#EF
IN A,(#FE)
CPL
AND #1F
А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.

В первом посте:
Подскажите плз короткую и быструю процедуру опроса клавиш предварительно выбранных игроком наверно немного непонятно выразился.

lvd
19.02.2005, 19:12
А если понадобится выбор клавиш? Тогда кодом в 29 тактов не обойтись.


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