?login_element?

Subversion Repositories NedoOS

Rev

Rev 1308 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. keybfsz=4
  2.  
  3. ssSpc=1;32
  4. csEnt=2;13
  5. ssEnt=3;13
  6. ;CS+3=4
  7. ;CS+4=5
  8. ;CS+2=6
  9. ;CS+1=7
  10. ;CS+5=8
  11. ;CS+8=9
  12. ;CS+6=10
  13. ;CS+7=11
  14. ;CS+0=12
  15. ;Ent=13
  16. ;SS+CS=14
  17. ;CS+9=15
  18. csSpc=16;32
  19. ;Ext+key=CS+key
  20.  
  21. KEYB
  22. ;для autosav и моргания ovr
  23.        ;LD HL,(23672)
  24.        ;INC HL
  25.        ;LD (23672),HL
  26. KBoff
  27.         NOP ;/ret
  28. ;сканировать клавиатуру
  29.        ld a,0xff
  30.         LD HL,OLDSCAN
  31.         LD BC,#FEFE
  32. KEYBSC  LD D,(HL) ;старый скан
  33.         IN e,(C)
  34.         LD (HL),e
  35.         INC HL
  36.         LD (HL),D ;старый скан
  37.        and d
  38.         INC HL
  39.         RLC B
  40.         jr C,KEYBSC
  41.        cpl
  42.        and 0x1f
  43.        ld (iskeypressed),a
  44.  
  45. ;время CS и SS
  46. tss=$+1
  47. tcs=$+2
  48.         LD BC,0
  49. ;если нажат CS+SS, то OK (у CS код 14)
  50. ;если нажат только CS, то снимаем его из матрицы
  51. ;SS снимаем с матрицы всегда
  52.         XOR A
  53.          LD HL,OLDSCAN+14
  54.         BIT 1,(HL) ;ss
  55.         SET 1,(HL) ;снимаем ss
  56.         jr NZ,freess ;ss отжат
  57.         INC C
  58.         jr NZ,okss ;max=255
  59.         DEC C
  60.         JR okss
  61. freess  LD C,A ;=0
  62. okss
  63.          LD HL,OLDSCAN
  64.         BIT 0,(HL) ;cs
  65.         jr NZ,freecs ;cs отжат
  66.        INC C
  67.        DEC C
  68.        jr NZ,$+3 ;ss нажат => EXT
  69.         INC (HL) ;снимаем cs, когда нет ss
  70.         INC B
  71.         jr NZ,okcs ;max=255
  72.         DJNZ okcs ;DEC B:JR всегда
  73. freecs  LD B,A ;=0
  74. okcs
  75.         LD (tss),BC
  76.  
  77. ;ВСЕ события пишем в буфер (чтобы не терять одновременные)
  78.         LD DE,#00D8
  79.         LD C,32
  80. KEYBX   LD HL,OLDSCAN+15
  81.         RRC C
  82.         LD B,8
  83. KEYBX1  LD A,(HL) ;было отжато=1
  84.        ;CPL                   ;0
  85.         DEC HL
  86.        ;OR (HL) ;нажато=0
  87.        XOR (HL)
  88.         AND C
  89.        ;JNZ KEYBX1N
  90.        jr Z,KEYBX1N
  91.         LD A,(HL)
  92.         AND C ;Z=нажатие
  93.        PUSH BC
  94.        PUSH HL
  95.        LD BC,(tss)
  96. ;E=#D8..#FF
  97. ;пребразовать скан-код E в код клавиши D
  98.         LD D,0
  99.        jr Z,KBpress ;Z=нажатие
  100.         ;LD HL,TCURKEYS-#D8
  101.         ;ADD HL,DE
  102.         ;LD D,(HL) ;под каким кодом была нажата эта клавиша
  103.         ;SET 7,D ;признак отжатия в коде клавиши
  104.        POP HL
  105.        POP BC
  106.        ret
  107.         XOR A
  108.         LD (KBcode),A ;выкл. автоповтор
  109.         JR KBpressQ
  110. KBpress
  111.         LD HL,TPLAINKEYS-#D8
  112.         XOR A
  113.         CP C
  114.         jr Z,$+5
  115.         LD HL,TSSKEYS-#D8
  116.         CP B
  117.         jr Z,$+5
  118.         LD HL,TCSKEYS-#D8 ;ex#=cs#
  119.         ADD HL,DE
  120.         LD A,(HL) ;код клавиши
  121.         LD HL,TCURKEYS-#D8
  122.         ADD HL,DE
  123.         LD (HL),A ;для отжатия - под каким кодом нажата клавиша
  124.         LD D,A
  125.         LD (KBcode),A
  126.         LD (KBbc),BC
  127.         LD A,15
  128.         LD (KBtime),A
  129. KBpressQ
  130.         CALL PUTKEY
  131. KBpressQQ
  132.        POP HL
  133.        POP BC
  134. KEYBX1N
  135.         INC E
  136.         DEC HL
  137.         DJNZ KEYBX1
  138.         jr NZ,KEYBX
  139.  
  140.        ;INC D
  141.        ;DEC D
  142.        ;RET NZ ;что-то изменилось - нет автоповтора
  143.  
  144.          LD HL,OLDSCAN
  145.         LD A,-1
  146.         LD B,8
  147.         AND (HL) ;"что-то нажато" (SS снят с матрицы, "CS"=EXT)
  148.         INC HL,HL
  149.         DJNZ $-3
  150.         CPL
  151.         AND 31
  152.         RET Z ;ничего не нажато
  153. ;нажата старая(?) кнопка
  154. KBtime=$+1
  155.         LD A,15
  156.         DEC A
  157.         jr Z,YEpKEYauto ;автоповтор (старые D,B,C)
  158.       ;автоповтору не время
  159.         LD (KBtime),A ;постепенно убавляем до 1
  160.                       ;и после 1 больше не попадем на убавление
  161.                       ;а сразу на повтор
  162.         RET
  163. YEpKEYauto
  164. KBbc=$+1
  165.         LD BC,0
  166. KBcode=$+1
  167.         LD D,0
  168. PUTKEY
  169.         LD HL,(GKEYADR);KEYBUFF ;адрес конца списка
  170.         LD A,D
  171.        OR A
  172.        RET Z ;нет события
  173.         CP 32
  174.         jr NC,YEpNUPR
  175. ;не складировать автоповтор cs3, cs4, cs9, cs0!
  176. ;вообще управляющие клавиши
  177.         DEC HL,HL,HL
  178.         CP (HL)
  179.         RET Z ;еще старую копию не забрали!
  180.         INC HL,HL,HL
  181. YEpNUPR
  182. ;есть ли место в буфере?
  183.         LD A,L
  184.         CP KEYBUFFEND&0xff
  185.         RET Z ;нет места!
  186.         LD (HL),D
  187.         INC HL
  188.         LD (HL),C
  189.         INC HL
  190.         LD (HL),B
  191.         INC HL
  192.         LD (HL),0 ;маркер конца списка
  193.         LD (GKEYADR),HL
  194.        ;IFN sobyt
  195.        ; LD HL,(SOBYTS)
  196.        ; INC HL
  197.        ; LD (SOBYTS),HL
  198.        ;ENDIF
  199.        ;SET 5,(IY+1)
  200.       ;ld a,1
  201.       ;ld (keyreceived),a
  202.         RET
  203.  
  204. keyscan_getkey
  205. ;возвращает A,B<->C,ничего не портит
  206. ;Z=no keys
  207.         PUSH HL
  208.         LD HL,KBoff
  209.         LD (HL),201 ;запрет опроса клавы
  210.      ;если запрет на изменение буфера, то можно потерять событие ;TODO циклическую очередь
  211.         LD HL,KEYBUFF
  212.         LD A,(HL)
  213.        OR A
  214.        jr Z,GETKpop ;no keys in buff
  215.         LD A,(HL)
  216.         PUSH DE
  217.         LD D,H
  218.         ld E,L
  219.         INC HL
  220.         LD B,(HL);в обр.порядке для совместимости
  221.         INC HL
  222.         LD C,(HL)
  223.         INC HL
  224.         PUSH BC
  225.         LD BC,+(keybfsz-1)*3
  226.         LDIR
  227.         ex de,hl
  228.        LD (HL),B
  229.         LD HL,(GKEYADR)
  230.         DEC HL,HL,HL
  231.         LD (GKEYADR),HL
  232.        ; PUSH AF
  233.        ;LD A,L
  234.        ;CP KEYBUFF
  235.        ;jr Z,$+6
  236.        ;SET 5,(IY+1)
  237.        ; POP AF
  238.       ;CALL RECAP
  239.        INC B ;NZ
  240.         POP BC
  241.         POP DE
  242. GETKpop
  243.         LD HL,KBoff
  244.         LD (HL),0
  245.         POP HL
  246.        ;LD (23560),A
  247.         RET
  248.  
  249. TCURKEYS
  250. ;таблица для отжатия - кем является каждая клетка матрицы
  251.                       ;т.е. под каким кодом она нажата
  252.         DS 40
  253.  
  254. TPLAINKEYS
  255. ;a-la #205
  256. ;#205: "BHY6..." (39 байт, SS=#E)
  257.         db "BHY65TGV"
  258.         db "NJU74RFC"
  259.         db "MKI83EDX"
  260.         db 0,"LO92WSZ"
  261.         db 32,10,"P01QA",0
  262. TCSKEYS
  263. ;a-la #205
  264.         DB "bhy",27,8,"tgv"
  265.         DB "nju",26,15,"rfc" ;15 = pgdn = лат
  266.         DB "mki",25,14,"edx" ;14 = pgup = рус
  267.         DB 0,"lo",26, 6 ,"wsz" ;26 = del = сдвижка в строке
  268.         DB 3,21,"p",24, 7 ,"qa",20 ;3 = break = КТ
  269. TSSKEYS
  270. ;a-la #205
  271.         DB "*^[&%>}/"
  272.         DB ",-]'$<{?"
  273.         DB ".+", 15 ,"(#",ssE,'\\',"`"
  274.         DB 0,"=;)@",19,"|:"
  275.         DB 14,ssEnt,34,"_!",ssQ,"~"
  276.        ;CS+SS ищется в TCSKEYS
  277.  
  278. ;за 3 байта до KEYBUFF должен быть симв>=32
  279. KEYBUFF
  280.         DS 3*keybfsz ;key,tss,tcs
  281. KEYBUFFEND
  282.         DB 0 ;конец самого буфера (после кнопки кладут 0)
  283. OLDSCAN
  284.         DS 16,-1;от CS.. до Spc..
  285.                ;новая,старая,новая,...
  286.  
  287.