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

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 14

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    DimkaM
    Гость

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

    Нужна процедура опроса клавиатуры, желательно наиболее полная, висящая на прерывании, а если будет с буфером, то вообще супер.

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

  3. #2
    Banned
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    и мне одну, пожалуйста!

  4. #3
    Veteran Аватар для Лас
    Регистрация
    18.11.2008
    Адрес
    пос.Полярный, ЯНАО
    Сообщений
    1,078
    Спасибо Благодарностей отдано 
    5
    Спасибо Благодарностей получено 
    9
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

  5. #4
    DimkaM
    Гость

    По умолчанию

    а по русски нет ни у кого?

    ---------- Post added at 16:01 ---------- Previous post was at 16:00 ----------

    Цитата Сообщение от psb Посмотреть сообщение
    и мне одну, пожалуйста!
    Можешь по сылке Лас'а забрать, мне не жалко.

  6. #5
    Banned
    Регистрация
    25.01.2005
    Адрес
    Miass, Chelyabinsk region
    Сообщений
    4,094
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от DimkaM Посмотреть сообщение
    Можешь по сылке Лас'а забрать, мне не жалко.
    они без буфера.

  7. #6
    DimkaM
    Гость

    По умолчанию

    Для IS-DOS по симпатичней выглядит, без СР/Мовских заморочек.
    У Кворума получается лишний порт клавиатуры присутствует?!
    Последний раз редактировалось DimkaM; 08.10.2010 в 18:23.

  8. #7
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Процедура из TFM instrument editor. Возвращает код нажатия, код отжатия (с установленным 7-м битом) или признак нажатия BREAK (NC). Учитывает дребезг клавиатуры и возможность того, что сложные клавиши дадут нажатие буквы/цифры раньше, чем нажатие CS или SS.

    Процедура KEYB должна висеть на прерываниях. Имеется буфер на keybfsz нажатий.

    IYKEY
    IY0
    HALT ;чтобы клава не тормозила из-за KBoff
    CALL GETKEY
    IYJR JZ IY0 ;для FNDNXT
    IYKQ LD A,40,(IYJR),A
    CALL 8020
    LD A,(23560)
    RET

    REUNI
    BIT 2,(IY+48)
    RET Z
    RECAP CP "Є
    RET NC
    XOR 1
    CP "Ё
    RET NC
    XOR 1
    CP "р
    JNC BECAPRL
    CP "░
    RET NC
    CP "а
    JNC BECAPOK
    CP "Р
    JNC BECAPRL
    CP "А
    JNC BECAPOK
    CP "@
    RET Z
    CP "_
    RET Z
    CP "A
    RET C
    CP "{
    RET NC
    CP "[
    JC $+5
    CP "a
    RET C
    BECAPOK XOR 80
    BECAPRL XOR #70
    RET


    ;#205: "BHY6..." (39 байт, SS=#E)
    ssSpc=1;32
    csEnt=2;13
    ssEnt=3;13
    ;CS+3=4
    ;CS+4=5
    ;CS+2=6
    ;CS+1=7
    ;CS+5=8
    ;CS+8=9
    ;CS+6=10
    ;CS+7=11
    ;CS+0=12
    ;Ent=13
    ;SS+CS=14
    ;CS+9=15
    csSpc=16;32
    ;Ext+key=CS+key

    KEYB
    ;для autosav и моргания ovr
    LD HL,(23672)
    INC HL
    LD (23672),HL
    KBoff
    NOP
    ;сканировать клавиатуру
    LD HL,OLDSCAN
    LD BC,#FEFE
    KEYBSC LD D,(HL)
    IN A,(C)
    LD (HL),A
    INC HL
    LD (HL),D ;старый скан
    INC HL
    RLC B
    JC KEYBSC

    ;время CS и SS
    tss=$+1
    tcs=$+2
    LD BC,0
    ;если нажат CS+SS, то OK (у CS код 14)
    ;если нажат только CS, то снимаем его из матрицы
    ;SS снимаем с матрицы всегда
    XOR A
    LD HL,OLDSCAN+14
    BIT 1,(HL) ;ss
    SET 1,(HL) ;снимаем ss
    JNZ freess ;ss отжат
    INC C
    JNZ okss ;max=255
    DEC C
    JR okss
    freess LD C,A ;=0
    okss
    LD HL,OLDSCAN
    BIT 0,(HL) ;cs
    JNZ freecs ;cs отжат
    INC C
    DEC C
    JNZ $+3 ;ss нажат => EXT
    INC (HL) ;снимаем cs, когда нет ss
    INC B
    JNZ okcs ;max=255
    DJNZ okcs ;DEC B:JR всегда
    freecs LD B,A ;=0
    okcs
    LD (tss),BC

    ;ВСЕ события пишем в буфер (чтобы не терять одновременные)
    LD DE,#00D8
    LD C,32
    KEYBX LD HL,OLDSCAN+15
    RRC C
    LD B,8
    KEYBX1 LD A,(HL) ;было отжато=1
    ;CPL ;0
    DEC HL
    ;OR (HL) ;нажато=0
    XOR (HL)
    AND C
    ;JNZ KEYBX1N
    JZ KEYBX1N
    LD A,(HL)
    AND C ;Z=нажатие
    PUSH BC
    PUSH HL
    LD BC,(tss)
    ;E=#D8..#FF
    ;пребразовать скан-код E в код клавиши D
    LD D,0
    JZ KBpress ;Z=нажатие
    LD HL,TCURKEYS-#D8
    ADD HL,DE
    LD D,(HL) ;под каким кодом была нажата эта клавиша
    SET 7,D ;признак отжатия в коде клавиши
    XOR A
    LD (KBcode),A ;выкл. автоповтор
    JR KBpressQ
    KBpress
    LD HL,#205-#D8
    XOR A
    CP C
    JZ $+5
    LD HL,TSSKEYS-#D8
    CP B
    JZ $+5
    LD HL,TCSKEYS-#D8 ;ex#=cs#
    ADD HL,DE
    LD A,(HL) ;код клавиши
    LD HL,TCURKEYS-#D8
    ADD HL,DE
    LD (HL),A ;для отжатия - под каким кодом нажата клавиша
    LD D,A
    LD (KBcode),A
    LD (KBbc),BC
    LD A,15
    LD (KBtime),A
    KBpressQ
    CALL PUTKEY
    KBpressQQ
    POP HL
    POP BC
    KEYBX1N
    INC E
    DEC HL
    DJNZ KEYBX1
    JNZ KEYBX

    ;INC D
    ;DEC D
    ;RET NZ ;что-то изменилось - нет автоповтора

    LD HL,OLDSCAN
    LD A,-1
    LD B,8
    AND (HL) ;"что-то нажато" (SS снят с матрицы, "CS"=EXT)
    INC HL,HL
    DJNZ $-3
    CPL
    AND 31
    RET Z ;ничего не нажато
    ;нажата старая(?) кнопка
    KBtime=$+1
    LD A,15
    DEC A
    JZ YEpKEYauto ;автоповтор (старые D,B,C)
    ;автоповтору не время
    LD (KBtime),A ;постепенно убавляем до 1
    ;и после 1 больше не попадем на убавление
    ;а сразу на повтор
    RET
    YEpKEYauto
    KBbc=$+1
    LD BC,0
    KBcode=$+1
    LD D,0
    PUTKEY
    GKEYADR=$+1
    LD HL,KEYBUFF ;адрес конца списка
    LD A,D
    OR A
    RET Z ;нет события
    CP 32
    JNC YEpNUPR
    ;не складировать автоповтор cs3, cs4, cs9, cs0!
    ;вообще управляющие клавиши
    DEC HL,HL,HL
    CP (HL)
    RET Z ;еще старую копию не забрали!
    INC HL,HL,HL
    YEpNUPR
    ;есть ли место в буфере?
    LD A,L
    CP KEYBUFFEND
    RET Z ;нет места!
    LD (HL),D
    INC HL
    LD (HL),C
    INC HL
    LD (HL),B
    INC HL
    LD (HL),0 ;маркер конца списка
    LD (GKEYADR),HL
    IFN sobyt
    LD HL,(SOBYTS)
    INC HL
    LD (SOBYTS),HL
    ENDIF
    SET 5,(IY+1)
    RET

    GETKEY
    ;возвращает A,B<->C,ничего не портит
    ;Z=no keys
    PUSH HL
    LD HL,KBoff
    LD (HL),201 ;запрет опроса клавы
    ;если запрет на изменение буфера, то можно потерять событие
    LD HL,KEYBUFF
    LD A,(HL)
    OR A
    JZ GETKpop ;no keys in buff
    LD A,(HL)
    PUSH DE
    LD D,H,E,L
    INC HL
    LD B,(HL);в обр.порядке для совместимости
    INC HL
    LD C,(HL)
    INC HL
    PUSH BC
    LD BC,keybfsz-1*3
    LDIR
    EXD
    LD (HL),B
    LD HL,(GKEYADR)
    DEC HL,HL,HL
    LD (GKEYADR),HL
    PUSH AF
    LD A,L
    CP KEYBUFF
    JZ $+6
    SET 5,(IY+1)
    POP AF
    ;CALL RECAP
    INC B ;NZ
    POP BC
    POP DE
    GETKpop
    LD HL,KBoff
    LD (HL),0
    POP HL
    LD (23560),A
    RET

    TCURKEYS
    ;таблица для отжатия - кем является каждая клетка матрицы
    ;т.е. под каким кодом она нажата
    DS 40

    TCSKEYS
    ;a-la #205
    DB "bhy",10,8,"tgv"
    DB "nju",11,5,"rfc"
    DB "mki",9,4,"edx"
    DB 0,"lo",15,6,"wsz"
    DB csSpc,csEnt,"p",12,7,"qa",14
    TSSKEYS
    ;a-la #205
    DB "*^[&%>}/"
    DB ",-]'$<{?"
    DB ".+",ssI,"(#",ssE,"\`"
    DB 0,"=",";",")@",ssW,"|:"
    DB ssSpc,ssEnt,34,"_!",ssQ,"~"
    ;CS+SS ищется в TCSKEYS

    DISPLAY $

    ;за 3 байта до KEYBUFF должен быть симв>=32
    KEYBUFF
    DS 3*keybfsz ;key,tss,tcs
    KEYBUFFEND
    DB 0 ;конец самого буфера (после кнопки кладут 0)
    OLDSCAN
    DS 16,-1;от CS.. до Spc..
    ;новая,старая,новая,...
    Вложения Вложения
    Последний раз редактировалось alone; 27.06.2011 в 13:05.

  9. #8
    Veteran
    Регистрация
    08.01.2007
    Адрес
    г. Красноярск
    Сообщений
    1,262
    Спасибо Благодарностей отдано 
    264
    Спасибо Благодарностей получено 
    1,404
    Поблагодарили
    277 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Процедура попроще:

    XOR A
    LD (23560),A
    LD IY,#5C3A
    RST 56

    Вешается на прерывания. Последнюю нажатую клавишу можно получить из ячейки по адресу 23560.

    По адресам 23561 и 23562 можно изменить задержку опроса клавиш.

    Автор процедуры Fyrex/Mayhem.

  10. #9
    DimkaM
    Гость

    По умолчанию

    Немного не то. Нужна с буфером.

  11. #10
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,609
    Спасибо Благодарностей отдано 
    2,173
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    99 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от DimkaM Посмотреть сообщение
    Нужна процедура опроса клавиатуры, желательно наиболее полная, висящая на прерывании, а если будет с буфером, то вообще супер.
    Буферизованный опрос клавиатуры, реализованный для ZXDev. Коды клавиш берутся из LAST_K, соответственно, работает автоповтор клавиш. Исходник оформлен для сборки компилятором SDCC.

    Код:
    #define KeyBufSize 8
    
    // Возвращает количество клавиш в буфере.
    unsigned char Input_Available (void);
    
    // Возвращает код нажатой клавиши.
    // Если нажатых клавиш нет, ожидает.
    char Input_Read (void);
    
    // Вызывайте из обработчика прерываний IM 2.
    void Input_RunMe50Hz (void);
    
    /*--------------------------------- Cut here ---------------------------------*/
    char Input_keyBuf [KeyBufSize];
    
    /* Закономерно считаем, что более актуальны клавиши, нажатые позднее,
       поэтому при переполнении буфера будем удалять из него нажатые ранее.
       Эта стратегия кажется более удачной, чем игнорирование всех клавиш,
       нажатых после переполнения буфера (как в контроллере клавиатуры IBM PC). */
    
    char Input_Read (void) {
    __asm
    LOOPrptbuf$:
      LD   HL,#_Input_keysAvailable+1
      LD   A,(HL)
      OR   A
      JR   Z,LOOPrptbuf$
      DEC  (HL)
    .globl _Input_keyOut
    _Input_keyOut:           ; Read a key:
      LD   HL,#_Input_keyBuf ; key := keyBuf[keyOut];
      LD   C,(HL)
      INC  HL                ; keyOut := (keyOut+1) MOD KeyBufSize;
      LD   A,L
      SUB  #<_Input_keyBuf+KeyBufSize
      JR   NZ,Save_keyOut$
      LD   HL,#_Input_keyBuf
    Save_keyOut$:
      LD   (_Input_keyOut+1),HL
      LD   L,C               ; RETURN key
    __endasm;
    } //Input_Read
    
    void Input_RunMe50Hz (void) __naked {
    __asm
      LD   IY,#0x5C3A
      RST  0x38
      BIT  5,1(IY)
      RET  Z
      RES  5,1(IY)
    _Input_keyIn:
      LD   HL,#_Input_keyBuf ; Add a key:
      LD   A,-50(IY)         ; keyBuf[keyIn] := CHR(keyCode);
      LD   (HL),A
      INC  HL
      LD   A,L
      SUB  #<_Input_keyBuf+KeyBufSize
      JR   NZ,Save_keyIn$
      LD   HL,#_Input_keyBuf
    Save_keyIn$:
      LD   (_Input_keyIn+1),HL
    .globl _Input_keysAvailable
    _Input_keysAvailable:
      LD   A,#0              ; Check overflow:
      CP   #8                ; IF keysAvailable > 8 THEN keysAvailable := 8 END;
      ADC  #0
      LD   (_Input_keysAvailable+1),A
      RET  C
      JR   _Input_keyOut
    __endasm;
    } //Input_RunMe50Hz
    
    /*--------------------------------- Cut here ---------------------------------*/
    unsigned char Input_Available (void) {
    __asm
      LD   HL,(_Input_keysAvailable+1)
    __endasm;
    } //Input_Available
    Вопросы, предложения, критика?

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

  1. процедура загрузки с диска
    от necroTrue в разделе Программирование
    Ответов: 18
    Последнее: 18.08.2011, 17:18
  2. нужна процедура умножения 16b*8b
    от DimkaM в разделе Программирование
    Ответов: 0
    Последнее: 16.04.2010, 10:29
  3. Глюк опроса клавиатуры
    от POIND в разделе Устройства ввода
    Ответов: 15
    Последнее: 20.06.2005, 16:03
  4. Процедура детекта TurboSound.
    от Shiru в разделе Программирование
    Ответов: 21
    Последнее: 27.05.2005, 18:45
  5. Процедура опроса клавиатуры
    от Aprisobal в разделе Программирование
    Ответов: 8
    Последнее: 19.02.2005, 18:12

Ваши права

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