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

User Tag List

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

Тема: Генерация матрицы клавиатуры

  1. #1
    Member
    Регистрация
    02.03.2005
    Адрес
    Екатеринбург
    Сообщений
    83
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Генерация матрицы клавиатуры

    Занимался я как-то (года 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 тактов (хотя я точно считал и вообще не проверял свои мысли).

    Дерзайте,ежели кому интересно :-)
    Последний раз редактировалось AlexCrush; 21.01.2007 в 01:12.

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

  3. #2
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,057
    Благодарностей: 1437
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    ;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
    Набросал на скорую руку. В правильности работы не уверен
    Алгоритм, думаю, понятен.

  4. #3
    Member
    Регистрация
    02.03.2005
    Адрес
    Екатеринбург
    Сообщений
    83
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  5. #4
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    464
    Благодарностей: 14
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  6. #5
    Member
    Регистрация
    02.03.2005
    Адрес
    Екатеринбург
    Сообщений
    83
    Благодарностей: 7
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #6
    Vitamin C++ Аватар для Vitamin
    Регистрация
    14.01.2005
    Адрес
    Таганрог, Россия
    Сообщений
    4,057
    Благодарностей: 1437
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну можно еще так...
    Код:
        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 на флаг нуля. Если да, то можно сократить.
    Сколько весит по тактам- не считал

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

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

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

Похожие темы

  1. Генерация лабиринтов
    от TomCaT в разделе Программирование
    Ответов: 90
    Последнее: 26.06.2012, 09:59
  2. Корпуса и клавиатуры
    от Sonic в разделе Устройства ввода
    Ответов: 110
    Последнее: 07.10.2010, 22:27
  3. Контроллер клавиатуры для Скорпиона
    от Nikolaj Amosov (500:812/02.26) в разделе Устройства ввода
    Ответов: 1
    Последнее: 16.11.2005, 00:05
  4. Процедура опроса клавиатуры
    от Aprisobal в разделе Программирование
    Ответов: 8
    Последнее: 19.02.2005, 19:12

Ваши права

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