ZXNet эхоконференция «code.zx» 
тема: Генерация матрицы клавиатуры 
 
от: Виталий Гаврилов 
кому: All 
дата: 21 Jan 2007
 
Hello, AlexCrush 
 
┌─- CODE ─── 
 
;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 
 
└── CODE ─── 
Hабросал на скорую руку. В правильности работы не уверен :) 
Алгоритм, думаю, понятен. 
 
от: Крашенинников Александр 
кому: All 
дата: 21 Jan 2007
 
Hello, All 
 
Занимался я как-то (года 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 тактов (хотя я  
точно считал и вообще не проверял свои мысли). 
 
Дерзайте,ежели кому интересно :-) 
 
от: Крашенинников Александр 
кому: All 
дата: 21 Jan 2007
 
Hello, Vitamin 
 
Vit> Алгоритм, думаю, понятен. 
 
Алгоритм и изначально проблем ни разу не вызывал :-). Я же в скорости предлагаю 
поупражняться ;-) . А у Вас получается (хотя я и не могу уже в 3 часа ночи  
чтолибо нормально сосчитать) примерно "совсем-дофига-тактов" 
 
от: Знахарь 
кому: All 
дата: 21 Jan 2007
 
Hello, AlexCrush 
 
к слову о клавах - сколько-то лет назад я разбирал АТшные еще клавы для ремонта 
(!) (мда, когда-то их чинили...) так вот там контроллером реально стояло нечто  
ОЧЕHЬ похожее внешне и с надписью Z80... Так что на извращенца AlexCrush не  
тянет и может спать спокойно :)))) а я, если повезет, попробую найти раритет и  
сфоткать. 
 
от: Камиль Каримов 
кому: All 
дата: 21 Jan 2007
 
Hello, Знахарь 
 
>  там контроллером реально стояло нечто ОЧЕHЬ похожее внешне и с 
> надписью Z80...  
 
Zilog выпускал контроллеры клавиатуры Z8602/14/15/C15/E23 
Применялись во многих AT клавиатурах. 
 
от: Петр Кицун 
кому: All 
дата: 21 Jan 2007
 
Hello, caro 
 
2caro - я так понял у тебя в ZXMC когда спек клаву опрашивает wait  
используется, это не сильно тормозит при загрузки с касеты например? 
 
от: Крашенинников Александр 
кому: All 
дата: 22 Jan 2007
 
Hello, caro 
 
Предлагаю не уходить от темы. 
Hеужели никому не интересно попытаться придумать быстрый способ? Или все сильно 
чем-то заняты? 
 
от: Виталий Гаврилов 
кому: All 
дата: 23 Jan 2007
 
Hello, AlexCrush 
 
Hу можно еще так... 
┌─- CODE ─── 
 
    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 
 
└── CODE ─── 
Признаюсь, запамятовал- влияет ли rra на флаг нуля. Если да, то можно  
сократить. 
Сколько весит по тактам- не считал :) 
 
 |