?login_element?

Subversion Repositories NedoOS

Rev

Rev 1242 | Blame | Compare with Previous | Last modification | View Log | Download

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