?login_element?

Subversion Repositories NedoOS

Rev

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

  1. ;кодировка 866!
  2. ;notepad++ неправильно определяет кодировку
  3. ;поэтому напишем здесь довольно много текста кириллицей
  4. ;поэтому напишем здесь довольно много текста кириллицей
  5. ;поэтому напишем здесь довольно много текста кириллицей
  6. numlangs=3 ;including graph
  7.  
  8. keyqueuemax=2;5
  9.  
  10. kZ=0 ;ja w e r t y
  11. kJ=0 ;j c u k e n
  12. multikbd=0
  13. kR=1 ;sh w e r t y
  14. NkJ=kZ+kR
  15. ukr=1
  16.  
  17. KEYM0change
  18.         LD (keym0BC),BC
  19.         LD (keym0HL),HL
  20.         ld c,d ;C=very old state
  21.         LD D,A ;D=changes
  22.         LD B,5 ;5 keys in a halfrow
  23. KEYM1   RR D
  24.         jr NC,KEYMnPUT
  25.         LD (keym1BC),BC
  26.         LD (keym1DE),DE
  27. keymshifts=$+1
  28.         LD D,0
  29. ;C0=press(1)/release(0)
  30. ;E=scancode, D=shiftstate
  31. ;D=%00: ext
  32. ;D=%01: cs
  33. ;D=%10: ss
  34. ;D=%11: no shifts
  35.         DEC D
  36.         LD HL,tkeydecodecs
  37.         jr Z,KEYDECODEPASS ;cs+key
  38.         DEC D
  39.         LD HL,tkeydecodess
  40.         JR z,KEYDECODEPASS ;ss+key
  41.         DEC D
  42.         LD HL,tkeydecode
  43.         jr Z,KEYDECODEPASS ;no shifts+key
  44.         LD HL,tkeydecodeext ;ext+key
  45. KEYDECODEPASS
  46.         LD D,0
  47.         ADD HL,DE
  48.         ld A,(HL)
  49.        CP ssnoshifts ;crucial for autorepeat of ssSpace
  50.        jr Z,KEYMPUTSKIP
  51.        CP csnoshifts ;csnoshifts keypress can appear in the same frame as cs6 etc and must be ignored
  52. keym_keyrep
  53.        LD B,E
  54.         CALL NZ,KEYREP ;A=code
  55.                        ;C0=press(1)/release(0)
  56.                        ;B=scancode without shifts
  57. KEYMPUTSKIP
  58. keym1DE=$+1
  59.         LD DE,0
  60. keym1BC=$+1
  61.         LD BC,0
  62. KEYMnPUT
  63.         INC E
  64.         RR C
  65.         DJNZ KEYM1
  66. keym0HL=$+1
  67.         LD HL,0
  68. keym0BC=$+1
  69.         LD BC,0
  70.         jp KEYM0nexthalfrow
  71.  
  72. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  73. KEYSCAN
  74. ;to make shifts always press no later than alphanumerics
  75. ;use old scanchange of alphanumerics and old&new scan of shifts (to make them longer)
  76. ;tkeymatrixstate (even) = old scan
  77. ;tkeymatrixstate+1 (odd) = very old scan
  78.  
  79. KEYMATRIX
  80.         LD HL,tkeymatrixstate +(2*7)
  81.         LD BC,0x7FFE
  82.          ld a,c
  83.          in a,(0xfe) ;cs halfrow
  84.          and (hl) ;old cs halfrow
  85.          ld e,a
  86.         LD HL,tkeymatrixstate
  87.         IN A,(C) ;ss halfrow
  88.          and (hl) ;old ss halfrow
  89.         RRA
  90.         RRA ;ss
  91.         ;LD A,C
  92.         ;IN A,(0xFE)
  93.          ld a,e
  94.         RLA
  95.         AND 3
  96.         LD (keymshifts),A ;A0=ss,A1=cs
  97.         LD E,0 ;scancode ;Space=0, cs=35
  98. KEYM0   ;IN A,(C)
  99.          ld a,(hl) ;old state (to use)
  100.          ini ;current keymatrix for alphanumerics will be used in the next frame
  101.          inc b
  102.          ;inc hl
  103.         LD d,(HL) ;very old state
  104.         ld (HL),A ;old state (to use)
  105.         XOR d ;very old state
  106.          jr nz,KEYM0change
  107.         ld a,e
  108.         add a,5
  109.         ld e,a
  110. KEYM0nexthalfrow
  111.         INC HL
  112.         RRC B ;next halfrow
  113.         jp C,KEYM0
  114.  
  115.         if 1==0
  116. ;current keymatrix for alphanumerics will be used in the next frame
  117.         ld hl,tkeymatrixstate
  118.         LD BC,0x7FFE ;Space=0, cs=35
  119. KEYSCAN0
  120.         IN A,(C)
  121.         ld (hl),a
  122.         inc hl
  123.         ;ini
  124.         ;inc b
  125.         inc hl
  126.         rrc b
  127.         jp c,KEYSCAN0
  128.         endif
  129.        
  130. ;blowing
  131.         ld a,(keyrepcounter)
  132.         OR A
  133.         RET Z
  134.         DEC A
  135.         jr Z,KEYREPSEND
  136. KEYREPSETCNT
  137.         LD (keyrepcounter),A
  138.         RET
  139.  
  140. ;C0=press(1)/release(0)
  141. ;A=code
  142. ;B=scancode without shifts
  143. KEYREP
  144.         IF 1==0
  145.         push af
  146.         push bc
  147.         push de
  148.         push hl
  149.         ld a,b
  150.         add a,'A'      
  151.         ld c,a
  152.         ld b,0
  153.         call KEYQUEUEPUT
  154.         ld a,(keyrepscancode)
  155.         add a,'A'
  156.         ld c,a
  157.         ld b,0
  158.         call KEYQUEUEPUT
  159.         pop hl
  160.         pop de
  161.         pop bc
  162.         pop af
  163.         ENDIF
  164.         RR C ;NC=release
  165.         jr C,KEYREPPRESS
  166. ;CP/M: if this is "ext" (cs or ext release): if keyrepkey was "ext", then make "ext" keypress (and forget "ext" to avoid "ext, cs" work as ext, ext), else make "csnoshifts" keypress (for AltGr)
  167.          cp csss
  168.          jr nz,KEYREPRELEASE
  169. keyrepkey=$+1
  170.         cp 0
  171.         ld a,csnoshifts
  172.         LD (keyrepkey),A ;forget "ext" to avoid "ext, cs" work as ext, ext
  173.         jr nz,KEYREPSEND
  174.         ld a,csss
  175.         jr KEYREPSENDA
  176. KEYREPRELEASE
  177. ;if the repeated key (without shifts) is released
  178. ;then stop key repeat
  179. ;or else ignore
  180.        LD A,B ;scancode without shifts
  181. keyrepscancode=$+1
  182.        SUB -1
  183.         RET NZ
  184.       ;XOR A
  185.        JR KEYREPSETCNT
  186. KEYREPPRESS
  187.         cp cssspress ;=csss
  188.         jr nz,KEYREPPRESSncsss
  189. keyrepcounter=$+1
  190.         LD d,0
  191.         inc d
  192.         dec d
  193.         ret nz ;ext keypress, but another key is already pressed - ignore ext ;to filter out ext keypress in the same frame as ext+3 keypress (ss+PgUp pressed)
  194.         ;z
  195. KEYREPPRESSncsss
  196.        LD (keyrepkey),A
  197.         ret z ;no "ext" keypress, only release
  198.        SUB cs1;'1'-32
  199.        CP 2
  200.        jr C,KEYREPSEND ;no autorep for cs1..2
  201.        LD A,B ;scancode without shifts
  202.        LD (keyrepscancode),A
  203.         LD A,14;10
  204.         LD (keyrepcounter),A
  205. KEYREPSEND
  206.          ld a,(keyrepkey)
  207. KEYREPSENDA
  208.          
  209. ;A = code ;[(cs+1 was encoded as '1'-32)]
  210. ;csnoshifts means CS release
  211. ;idle: cs1..2 start, csnoshifts skip, others pass by
  212. ;working: cs0..9 add, others end (1,2 add cs0)
  213. KEYALTGR
  214. altgrN=$+1
  215.         LD BC,0x100 ;C=AltGr code (0=idle), B=1 (codes)
  216.          ld e,a ;current key
  217.            sub cs0;'0'-32
  218.            jr z,KEYALTGRcs0
  219.         SUB cs1-1 -cs0
  220. KEYALTGRcs0
  221.        LD D,A ;0..9 in good case
  222.        INC C
  223.        DEC C
  224.        jr Z,KEYALTGR_IDLE
  225.         CP 10
  226.        LD A,C
  227.         jr NC,KEYALTGRPUT ;stop AltGr (csnoshifts or wrong key) ;a=final code
  228.         ADD A,A
  229.         ADD A,A
  230.         ADD A,C
  231.         ADD A,A ;D*10
  232.         ADD A,D
  233. KEYALTGRN
  234.         LD (altgrN),A
  235.         RET
  236. KEYALTGR_IDLE
  237. ;A=1..2 in good case
  238.         DEC A
  239.         CP 2 ;CY=1: cs1/cs2
  240.         INC A
  241.         jr C,KEYALTGRN ;start AltGr
  242.          ld a,e ;current key
  243.         jr KEYALTGRPUT_NO1_2 ;for passing extA(=1),extB(=2)
  244. KEYALTGRPUT
  245. ;cs release gives final code here (=1 or 2 for single keypress of cs1 or cs2)
  246.         cp 3
  247.         jr nc,$+5
  248.             add a,cs1-1
  249. KEYALTGRPUT_NO1_2
  250.             inc b ;control keys
  251.         or a;CP csnoshifts
  252.         RET Z ;avoid NOKEY
  253.         LD C,A
  254.        XOR A
  255.        LD (altgrN),A ;idle
  256.  
  257. ;BC=code (B=2 => might be control code) (B=1 means AltGr symbol, for KEYLANG passby)
  258. KEYSWITCH
  259.        DEC B
  260.        jr Z,KEYSWPASS ;B=0 ;AltGr symbol, for KEYLANG passby
  261.         LD A,C
  262.         ;push af
  263.         ;push bc
  264.         ;ld bc,'a'
  265.         ;ld c,a
  266.         ;call KEYQUEUEPUT
  267.         ;pop bc
  268.         ;pop af
  269. keyswstate=$+1
  270.         LD HL,0x100 ;H=язык=1..numlangs (H=numlangs при graph)
  271.                    ;L0=CapsLock
  272.         CP cs2
  273.         jr Z,KEYSWCAPSLOCK
  274.         CP cs1
  275.         jr Z,KEYSWLANG
  276.         CP graphlock;ext1
  277.         jr NZ,KEYSWPASS
  278. KEYSWGRAPH
  279.         LD A,H
  280.         LD H,numlangs
  281.         CP H ;graph уже включен?
  282.         jr NZ,KEYSWOK ;нет - включаем, иначе DEC H
  283. KEYSWLANG
  284.         DEC H
  285.         jr NZ,$+4
  286.         LD H,numlangs-1
  287.         DEC L
  288. KEYSWCAPSLOCK
  289.         INC L
  290. KEYSWOK
  291.         LD (keyswstate),HL
  292. ;pass key to make possible to redraw blinking cursor
  293. KEYSWPASS
  294.  
  295. ;BC=code (B=0 means AltGr symbol, for KEYLANG passby) (B=1 for usual keys)
  296. KEYLANG
  297.         INC B
  298.         DEC B
  299.         jr Z,KEYLANGPASS ;B=0: symbol from ALTGR
  300. ;B=1
  301.         ;CALL KEYQUEUEPUT ;BC=code
  302.         ld (keyqueueput_codenolang),bc
  303. KEYLANG_REPEAT
  304.         LD A,C
  305.         LD (keylangcode),A
  306.          ;sub graphlock;ext1 ;how it worked in ACEdit without this check?
  307.          ;jr z,KEYLANGPASS_A ;B=1 (control key) ;a=0=NOKEY => c
  308.          ;sub cs1-graphlock;ext1 ;how it worked in ACEdit without this check?
  309.          ;jr z,KEYLANGPASS_A ;B=1 (control key) ;a=0=NOKEY => c
  310.          ;sub cs2-cs1 ;how it worked in ACEdit without this check?
  311.          ;jr z,KEYLANGPASS_A ;B=1 (control key) ;a=0=NOKEY => c
  312.          ;SUB 0xff&(32-cs2)
  313.          cp graphlock;ext1 ;how it worked in ACEdit without this check?
  314.          ret z
  315.          cp cs1 ;how it worked in ACEdit without this check?
  316.          ret z
  317.          cp cs2 ;how it worked in ACEdit without this check?
  318.          ret z
  319.          SUB ' '
  320.         CP 95
  321.         jr NC,KEYLANGPASS ;B=1 (control key)
  322. rustrdisp=$+1
  323.        LD DE,0 ;D=0
  324.        INC E
  325.        DEC E
  326.        jr NZ,KEYLANG_SHV2 ;second key of combination?
  327. keylangcode=$+1
  328.         LD BC,0 ;B=0, C=code
  329.         LD DE,(keyswstate)
  330. ;BC=code
  331.         DEC D
  332.         jr Z,KEYL_ENG ;B=0
  333.         DEC D
  334.         jr NZ,KEYL_GRAPH ;B=0
  335. KEYL_RUSTR
  336. ;B=0
  337.        IF multikbd
  338. kmode=$+1
  339.         LD A,1
  340.         CP kR
  341.         jr Z,KEYL_SHVERTY
  342.         CALL RERUS
  343.         JR KEYLANGPUT ;B=0
  344. KEYL_SHVERTY
  345.        ENDIF
  346.         LD A,C
  347.         CP 64
  348.         jr C,KEYLANGPUT ;B=0
  349.         LD HL,tkeyl_rustr
  350.         ADD HL,BC
  351.         LD C,(HL)
  352.         LD A,C
  353.         CP 64
  354.         jr NC,KEYLANGPUT ;B=0
  355.        ;LD (rustrdisp),BC ;B=0
  356.       ;LD A,C
  357.        LD (rustrdisp),A
  358.         ;RET
  359.         ld c,b ;b=0 ;put keylang=0 with current keynolang
  360.         jr KEYLANGQ
  361.        
  362. KEYLANG_SHV2
  363.         LD (rustrNEW),BC
  364.        LD A,C;(rustrNEW)
  365.       ;LD (rustrNEW),A
  366. ;rustrdisp=$+1
  367.        ;LD DE,0 ;D=0
  368.         LD HL,tkeyl_rustrc
  369.         ADD HL,DE
  370.         LD C,(HL) ;len
  371.        LD B,D ;=0
  372.         INC HL
  373.         LD E,C
  374.         CPIR
  375.         LD C,E ;B=0
  376.         ADD HL,BC
  377.         jr Z,KEYLANGCOMBO ;combination entered (such as qq)
  378. ;no such combination - take symbol #len
  379.        LD A,(HL)
  380.        CALL case
  381.        LD C,A
  382.         CALL KEYQUEUEPUT ;B=0
  383. rustrNEW=$+1
  384.        LD BC,0 ;B=0
  385.        XOR A
  386.        LD (rustrdisp),A
  387.          ld h,a
  388.          ld l,a
  389.          ;ld (keyqueueput_codenolang),hl ;no keynolang for 2nd symbol
  390.         JR KEYLANG_REPEAT ;doubling and recoding the 2nd symbol
  391. KEYL_GRAPH
  392. ;B=0
  393. ;'0' -> 0030
  394. ;'1' -> 0031
  395. ;'2' -> 0032
  396. ;'3' -> 0033
  397. ;'4' -> 0034
  398. ;'a' -> 0061
  399. ;do "case" first!!!
  400.        LD A,C
  401.        CALL case
  402.        LD C,A
  403.         LD HL,tkeyl_graph
  404.         ADD HL,BC
  405.         LD C,(HL)
  406.         jr KEYLANGPASS
  407.        
  408. KEYLANGCOMBO
  409.         DEC HL
  410.         LD C,(HL)
  411. KEYL_ENG ;B=0
  412. KEYLANGPUT ;B=0
  413.        LD A,C
  414.        CALL case
  415. ;KEYLANGPASS_A ;A=0
  416.        LD C,A
  417. KEYLANGPASS
  418.        XOR A
  419.        LD (rustrdisp),A
  420. KEYLANGQ
  421.         jp KEYQUEUEPUT
  422.  
  423. tkeydecodeext
  424.         DB key_extspace,ssnoshifts,extM,extN,extB
  425.         DB extenter,extL,extK,extJ,extH
  426.         DB extP,extO,extI,extU,extY
  427.         DB ext0,ext9,ext8,ext7,ext6
  428.         DB ext1,ext2,ext3,ext4,ext5
  429.         DB extQ,extW,extE,extR,extT
  430.         DB extA,extS,extD,extF,extG
  431.         DB cssspress,extZ,extX,extC,extV
  432. tkeydecode
  433.         DB " ",ssnoshifts,"mnb"
  434.         DB key_enter,"lkjh"
  435.         DB "poiuy"
  436.         DB "09876"
  437.         DB "12345"
  438.         DB "qwert"
  439.         DB "asdfg"
  440.         DB csss,"zxcv"
  441. tkeydecodecs
  442.         DB key_esc,ssnoshifts,"MNB"
  443.         DB key_csenter,"LKJH"
  444.         DB "POIUY"
  445.         ;DB '0'-32,'9'-32,'8'-32,'7'-32,'6'-32
  446.         ;DB '1'-32,'2'-32,'3'-32,'4'-32,'5'-32
  447.         db cs0,cs9,cs8,cs7,cs6
  448.         db cs1,cs2,cs3,cs4,cs5
  449.         DB "QWERT"
  450.         DB "ASDFG"
  451.         DB csnoshifts,"ZXCV"
  452. tkeydecodess
  453.         DB key_ssspace,ssnoshifts,".,*"
  454.         DB ssnoshifts,"=+-^"
  455.         DB 34,";",ssI,"]["
  456.         DB "_)('&"
  457.         DB "!@#$%"
  458.         DB ssQ,ssW,ssE,"<>"
  459.         DB "~|",0x5c,"{}"
  460.         DB csss,":`?/" ;in fact csss keypress is taken from tkeydecodeext, csss release from tkeydecodecs
  461. tkeymatrixstate
  462.         ;DS 8,0xFF ;initially nothing pressed
  463.         DS 16,0xFF ;initially nothing pressed
  464.  
  465. tkeyl_graph=$-32
  466.         DB 32,14,34,16,17,18,19,20,"()*+,-./"
  467.         DB 12,1,2,3,4,5,6,7,8,11,":;єўЄ?"
  468.         DB 15,"╠╧╝╣╗╞╪╡▄▀■¤№╛▌▐╔╒╬╤█╘╦╩╕╚[",0x5c,"]^_"
  469.         DB "`├╨┘┤┐╟╫╢─░▒▓√╜║═┌╓┼╥│╙┬┴╖└{|}~"
  470. tkeyl_rustr=$-64
  471.         DB "@АБ",rustrCdisp
  472.         DB "ДЕФГ",rustrHdisp,"И",rustrJdisp
  473.         DB "КЛМНОП",rustrQdisp
  474.         DB "РСТУЖВЬЫЗ[",0x5c,"]^_"
  475.         DB "`аб",rustrcdisp
  476.         DB "дефг",rustrhdisp,"и",rustrjdisp
  477.         DB "клмноп",rustrqdisp
  478.         DB "рстужвьыз{|}~"
  479.  
  480. tkeyl_rustrc=$-1 ;to avoid zero displacements
  481. rustrhdisp=$-tkeyl_rustrc
  482.         DB 1,"h","э","х"
  483. rustrHdisp=$-tkeyl_rustrc
  484.         DB 1,"H","Э","Х"
  485. rustrqdisp=$-tkeyl_rustrc
  486.         DB 1,"q","щ","ш"
  487. rustrQdisp=$-tkeyl_rustrc
  488.         DB 1,"Q","Щ","Ш"
  489. rustrcdisp=$-tkeyl_rustrc
  490.        IF ukr
  491.         DB 2,"gc",0xF3,"ц","ч"
  492.        ELSE
  493.         DB 1,"c","ц","ч"
  494.        ENDIF
  495. rustrCdisp=$-tkeyl_rustrc
  496.        IF ukr
  497.         DB 2,"GC",0xF2,"Ц","Ч"
  498.        ELSE
  499.         DB 1,"C","Ц","Ч"
  500.        ENDIF
  501. rustrjdisp=$-tkeyl_rustrc
  502.        IF ukr
  503.         DB 7,"eyiaouj",0xF5,0xF7,0xF9,"яёюъ","й"
  504.        ELSE
  505.         DB 4,"aouj","яёюъ","й"
  506.        ENDIF
  507. rustrJdisp=$-tkeyl_rustrc
  508.         DISPLAY $-tkeyl_rustrc,"<64"
  509.        IF ukr
  510.         DB 7,"EYIAOUJ",0xF4,0xF6,0xF8,"ЯЁЮЪ","Й"
  511.        ELSE
  512.         DB 4,"AOUJ","ЯЁЮЪ","Й"
  513.        ENDIF
  514.  
  515.        IF kZ
  516. rt
  517.         DB "ЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧъ"
  518.        ENDIF
  519.        IF kJ
  520. rtjcuk
  521.         DB "@ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ[",0x5c,"]^_"
  522.        ENDIF
  523. RERUS
  524. ;in: C=code (32..126), A=kmode
  525. ;out: C=code
  526. ;keeps B
  527.         LD D,C ;code
  528.        IF kZ
  529.         LD HL,rt
  530.        ENDIF
  531.        IF kJ
  532.         IF multikbd
  533.         CP NkJ
  534.         jr NZ,rERUSnJCUK
  535.         ENDIF
  536.         LD HL,rtjcuk
  537.         LD A,D ;code
  538.         LD C,'б'
  539.         CP '!'
  540.         RET Z
  541.         LD C,'ж'
  542.         CP '@'
  543.         RET Z
  544.         LD C,'х'
  545.         SUB '#'
  546.         RET Z
  547.         LD C,'э'
  548.         DEC A ;'$'
  549.         RET Z
  550.         INC C ;'ю'
  551.         DEC A ;'%'
  552.         RET Z
  553. rERUSnJCUK ;
  554.        ENDIF
  555.         LD A,D ;code (32..126)
  556.         LD C,'ё'
  557.         CP '&'
  558.         RET Z
  559.         LD C,D
  560.         BIT 6,D ;code
  561.         RET Z ;code <64 (not letter) - return old code
  562. ;A=code (64..126)
  563.         AND 31
  564.         ADD A,L
  565.         LD L,A
  566.         jr NC,$+3
  567.         INC H
  568.         LD A,(HL) ;capital Russian
  569.         BIT 7,A
  570.         RET Z ;not a letter in the table - return old code
  571.         LD C,A ;capital Russian
  572.         BIT 5,D ;code
  573.         RET Z ;C contained capital letter, return capital
  574.         CALL RECAP
  575.         LD C,A ;small Russian
  576.         RET
  577.  
  578. CHECKCAPSLOCK
  579.         PUSH HL
  580.         LD HL,keyswstate
  581.         BIT 0,(HL)
  582.         POP HL
  583.         RET
  584. case
  585.         CALL CHECKCAPSLOCK
  586.         RET Z
  587. RECAP
  588.         CP 0xf2;je'Є'
  589.         RET NC
  590.         XOR 1
  591.         CP 0xf0;jo'Ё'
  592.         RET NC
  593.         XOR 1
  594.         CP 0xe0;'р'
  595.         jr NC,BECAPRL
  596.         CP 0xb0;'-'
  597.         RET NC
  598.         CP 0xa0;'а'
  599.         jr NC,BECAPOK
  600.         CP 0x90;'Р'
  601.         jr NC,BECAPRL
  602.         CP 0x80;'А'
  603.         jr NC,BECAPOK
  604.         CP '@'
  605.         RET Z
  606.         CP '_'
  607.         RET Z
  608.         CP 'A'
  609.         RET C
  610.         CP '{'
  611.         RET NC
  612.         CP '['
  613.         jr C,$+5
  614.         CP 'a'
  615.         RET C
  616. BECAPOK XOR 80
  617. BECAPRL XOR 0x70
  618.         RET
  619.  
  620.