User Tag List

Показано с 1 по 10 из 1128

Тема: ЭТЮДЫ

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10

    Регистрация
    10.01.2010
    Адрес
    Смоленская обл.
    Сообщений
    556
    Спасибо Благодарностей отдано 
    187
    Спасибо Благодарностей получено 
    197
    Поблагодарили
    100 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Destr Посмотреть сообщение
    На реале всегда так, если зажать некоторые комбинации клавиш - будет читатся что зажат например весь полуряд.
    Это из-за буферизации что-ли (или её отсутствия).
    Электронщики объясняли как-то почему такой баг и даже как-то пытались фиксить.
    SpeccyWiki:
    Аппаратно кнопки клавиатуры представляют собой матрицу восемь на пять линий — восемь полурядов по пять кнопок. В зависимости от адреса, использованного при обращении к порту клавиатуры, в младших пяти битах возвращается состояние клавиш одного из восьми полурядов. Такая схема создаёт "эффект матрицы" (matrix effect) — при нажатии двух клавиш (одного полуряда) одновременно с третьей клавишей (в одном столбце с первой) возникает паразитное нажатие в полуряду третьей клавиши, соответствующее столбцу второй. Этот эффект можно ликвидировать размещением диода на каждой клавише.

    Цитата Сообщение от ALKO Посмотреть сообщение
    Да, надо опросить одновременно три клавиши.
    A+K+J
    И вторая комбинация
    D+K+J

    А эта прога не детектит, если A (D) +K нажаты, то нажатие J игнорит.
    Понять как работает прога по приведённому огрызку вообще нереально. Я удивлён что вообще как-то работает ))
    Прежде всего неясно почему таблица берётся со стека, но это ладно может там всё продумано, а дальше ...
    По (hl) вначале читается старший байт порта, затем читается порт, а следующий байт по (hl) инверсное выделение бита клавиатуры. Затем вы кидаете в (_KEYPRESSED) : 0 - не нажата, 1 - нажата, и уходите на адрес обработки который тоже берётся из таблицы.
    Что и как у вас прописано по таблице фиг его знает.
    Показанный элемент может работать корректно только с одной кнопкой, как вы обрабатываете несколько этим куском кода не описывается ))

    - - - Добавлено - - -

    А пардон ступил, не из таблицы, у вас вызов проги с указанием за вызовом старшего байта порта и выделения бита )))
    Не понятно только почему используется паразитный inc hl за съёмом адреса со стека
    Но то же самое, это только для одной клавиши

    - - - Добавлено - - -

    Наваял на вскидку, за отсутствие ляпов не поручусь ))

    Код:
    KEYTEST3     pop hl      ; проверка 3-х портов клавиатуры;
                 call KEYTEST_
                jr z,1F
                 inc hl
                 inc hl
                jr 2F
    
    KEYTEST2     pop hl       ; проверка 2-х портов клавиатуры
    1            call KEYTEST_
                jr z,1F
    2            inc hl
                 inc hl
                jr 2F
                 
    KEYTEST      pop hl         ; проверка порта клавиатуры
    1            call KEYTEST_
    2            ld (_KEYPRESSED),a
                jp (hl)
    
    KEYTEST_
                 ld a,(hl)  ; старший байт порта 
                 inc hl
                 in a,(#FE)
                 or #E0
                 cp (hl)    ; проверка нажатия одной или нескольких клавиш в одном полуряде
                 inc hl
                 ld a,1
                ret z
                 xor a
                ret
     
    _KEYPRESSED defw 0
    Применение:

    Код:
          call KEYTEST3
             DB #XX , # YY  ; #XX - старший байт адреса порта, #YY - код одной или нескольких клавиш в полуряде ( бит 0 - клавиша нажата бит 1 -нет )
             DB #XX , # YY
             DB #XX , # YY
          ; дальнейшие инструкции
    
           call KEYTEST2
             DB #XX , # YY
             DB #XX , # YY
         ; дальнейшие инструкции
    
           call KEYTEST
             DB #XX , # YY
        ; дальнейшие инструкции

    Для вашего случая KEYTEST3 не нужен, у вас две клавиши в одном полуряде, только соответственный параметр нужен.

    Да ещё момент, при опросе не стоит в старшем байте порта использовать больше одного нуля. Есть контроллеры PC клавы такие (по крайней мере у меня был) которые понимают либо 0 во всех разрядах сразу, либо только в одном. Поэтому у меня на профике некоторые игры не слушались управления ))
    Последний раз редактировалось Dart Alver; 21.06.2020 в 16:03.

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

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

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

Похожие темы

  1. Этюды: как бы написать поизящнее.
    от AndTorp в разделе Программирование
    Ответов: 5
    Последнее: 17.03.2008, 00:43
  2. Ответов: 0
    Последнее: 18.08.2006, 22:40
  3. Этюды: печать шрифтом 5x5...
    от breeze в разделе Программирование
    Ответов: 12
    Последнее: 27.03.2005, 05:21

Метки этой темы

Ваши права

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