PDA

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



AlexCrush
21.01.2007, 00:09
Занимался я как-то (года 4 назад) созданием контроллера PS/2 клавиатуры на базе второго спека ;-). Контроллер был без-wait-овый за счет чтения кода клавиши основным спеком прямо из памяти спека-контроллера (да,я, наверное, извращенец :) ). Следовательно, стояла задача генерации 256-байтной таблицы клавиатуры. Т.е., 0й байт - то что основной спек получит при чтении из порта #00FE, 1й - #01FE... И т.д..
Если кто не знает, каждый байт в этой таблице рассчитывается как AND тех рядов клавиатуры, номера которых в номере данного байта нулевые.
Т.е значение ячейки с номером #D6= %11010110 равняется ANDу 0го,3го и 5го рядов клавиатуры. Значение последней ячейки - порта #FFFE, есс-но = #FF

Так вот, предлагаю (в качестве этюда, чтоли), написать процедуру для рассчета такой таблицы. Естесственно хочется, чтобы процедура была как можно быстрее. Входные данные - 8 байт (ряды клавы, имеют значения только 5 младших бит, но это вроде как побоку), выход - 256 байт. Больше ограничений - никаких.

P.S. Помнится у меня получился результат около 7000 тактов. Сегодняшние раздумия позволяют вроде как бы сократить это число до ~4500 тактов (хотя я точно считал и вообще не проверял свои мысли).

Дерзайте,ежели кому интересно :-)

Vitamin
21.01.2007, 00:34
;SRC - source map
;DST - destination map, 256-aligned
ld de,SRC
ld hl,DST
fillloop:
ld (hl),-1
inc l
jr nz,fillloop
ld c,1 ;step
cpyloop:
ld a,c
cpl
ld l,a
ld b,c
fillal:
ld a,(de)
and (hl)
ld (hl),a
dec l
djnz fillal
ld a,l
sub c
ld l,a
jr nc,fillal
inc de
rl c
jr nc,cpyloop


Набросал на скорую руку. В правильности работы не уверен :)
Алгоритм, думаю, понятен.

AlexCrush
21.01.2007, 01:15
Алгоритм, думаю, понятен.
Алгоритм и изначально проблем ни разу не вызывал :-). Я же в скорости предлагаю поупражняться ;-) . А у Вас получается (хотя я и не могу уже в 3 часа ночи чтолибо нормально сосчитать) примерно "совсем-дофига-тактов"

Знахарь
21.01.2007, 10:22
к слову о клавах - сколько-то лет назад я разбирал АТшные еще клавы для ремонта (!) (мда, когда-то их чинили...) так вот там контроллером реально стояло нечто ОЧЕНЬ похожее внешне и с надписью Z80... Так что на извращенца AlexCrush не тянет и может спать спокойно :)))) а я, если повезет, попробую найти раритет и сфоткать.

AlexCrush
22.01.2007, 12:58
Предлагаю не уходить от темы.
Неужели никому не интересно попытаться придумать быстрый способ? Или все сильно чем-то заняты?

Vitamin
23.01.2007, 15:32
Ну можно еще так...


ld de,dst
allkc:
ld hl,src
ld a,-1
exa
ld a,e
cpl
keyc:
and a
jr z,nokey
rra
jr nc,nochk
exa
and (hl)
exa
nochk:
inc l ;??
jr keyc
nokey:
exa
ld (de),a
inc e
jr nz,allkc

Признаюсь, запамятовал- влияет ли rra на флаг нуля. Если да, то можно сократить.
Сколько весит по тактам- не считал :)