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

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
    Guru Аватар для caro
    Регистрация
    14.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,721
    Спасибо Благодарностей отдано 
    16
    Спасибо Благодарностей получено 
    134
    Поблагодарили
    87 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Драйвер клавиатуры для IS-DOS под расширенную клавиатуру Кворумов.
    Опрос на прерываниях и с буфером на 32 байта.
    Вложения Вложения
    • Тип файла: zip TTYKBD.zip (3.9 Кб, Просмотров: 178)

  7. #6
    DimkaM
    Гость

    По умолчанию

    Цитата Сообщение от caro Посмотреть сообщение
    Драйвер клавиатуры для IS-DOS под расширенную клавиатуру Кворумов.
    Опрос на прерываниях и с буфером на 32 байта.
    Супер, то что нужно, а на русскую расскладку я даже и не расчитывал.

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

    По умолчанию

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

  9. #8
    DimkaM
    Гость

    По умолчанию

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

  10. #9
    DimkaM
    Гость

    По умолчанию

    Цитата Сообщение от caro Посмотреть сообщение
    Драйвер клавиатуры для IS-DOS под расширенную клавиатуру Кворумов.
    Опрос на прерываниях и с буфером на 32 байта.
    Периодически пытаюсь осилить, но никак не получается.
    Например непонятен кусок:
    LB1FC: LD HL,FLGKBD
    INC HL
    Сразу нельзя LD HL,FLGKBD+1 сделать?

    LB1D9: LD HL,TKBDD-'0' ;В СИСТЕМНОЙ ОБЛАСТИ
    BIT 4,B ;+CAPS SHIFT ?
    JR NZ,LB1E6 ;ДА
    TKBDD это что за таблица?

    И непонятны переменные:
    BUF_KB
    FLGKBD
    KSTAT0
    KSTAT4
    LASTK
    REPDEL
    REPPER
    Какого типа они должны быть(сколько вешать в байтах)?

  11. #10
    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.

Страница 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

Ваши права

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