KEYSCAN
ret
;--------------------------------------------------
keyqueueput_codenolang
GETKEY
.KEY_MODE_NONE = 0x00
.KEY_MODE_SHIFT = 0x01
.KEY_MODE_ALT = 0x02
.KEY_MODE_CTRL = 0x04
.KEY_MODE_RUS = 0x08
.KEY_MODE_UP = 0x10
.KEY_MODE_E0 = 0x20
.bKEY_MODE_SHIFT = 0x00
.bKEY_MODE_ALT = 0x01
.bKEY_MODE_CTRL = 0x02
.bKEY_MODE_RUS = 0x03
.bKEY_MODE_UP = 0x04
.bKEY_MODE_E0 = 0x05
;out: ha=key (NOKEY=none), bc=keynolang keeps de,l
;H0=1 for control codes, H0=0 for symbols
;TODO где-то в H добавить биты регистра клавиатуры
ld hl,(.redrawkey)
ld a,l
or a
jr z,.noredraw
ld bc,0x0000
ld (.redrawkey),bc
ld c,a
ld b,h
ret
.noredraw
ld bc,0xdef7 ;todo перенести в init
out (c),c ;
ld b,0xbe ;
ld a,2 ;
out (c),a ;
;ld bc,0xdef7 ;раскоментить
;out (c),c
ld b,0xbe
in a,(c)
.noredraw1
ld h,a
ld b,h
ld c,a
ret z ;a=nokey, h=0, bc=0
cp 0xff
jr nz,.decode
ld bc,0xdef7 ;переполнено
ld a,0x0c ;сбросить буфер
out (c),a
ld b,0xbe
ld a,1
out (c),a
xor a
jr .noredraw1
.decode
.mode=$+1
ld l,0x00
bit .bKEY_MODE_UP,l
jp nz,.keypressmode
cp 0xf0
jr nz,.noF0
ld a,.KEY_MODE_UP
.savemode_or
or l
.savemode
ld (.mode),a
jr .noredraw
.noF0
cp 0xe0
jr nz,.noE0
ld a,.KEY_MODE_E0
jr .savemode_or
.noE0
add 0xff&.scodes
ld e,a
ld a,0
adc 0xff&(.scodes>>8)
ld d,a
ld a,(de)
or a
jr z,.noredraw ;кнопка не поддерживается
cp 0x12
jr nz,.no12
.yes59
ld a,l
or .KEY_MODE_SHIFT
and ~.KEY_MODE_E0
bit .bKEY_MODE_ALT,a
jr z,.savemode
.chruslat
xor .KEY_MODE_RUS
jr .savemode
.no12
cp 0x59
jr z,.yes59
cp 0x11
jr nz,.no11
ld a,l
or .KEY_MODE_ALT
and ~.KEY_MODE_E0
bit .bKEY_MODE_SHIFT,a
jr z,.savemode
jr .chruslat
.no11
bit .bKEY_MODE_E0,l
jr z,.noE0mod
ld a,l
and ~.KEY_MODE_E0
jr .savemode
.noE0mod
add 0xff&.scodes
ld e,a
ld a,0
adc 0xff&(.scodes>>8)
ld d,a
ld a,(de)
or a
jr z,.noredraw1
cp 68+1
jr c,.noUniv
.retsymb
ld c,a
ld b,1
ld h,b
ret
.noUniv
cp 47+1
jr c,.noUnmod
add 0xff&.unmod
ld e,a
ld a,0
adc 0xff&(.unmod>>8)
ld d,a
ld a,(de)
jr .retsymb
.noUnmod
ex af,af'
ld a,l
and .KEY_MODE_RUS|.KEY_MODE_SHIFT
jr nz,.notModenone
ex af,af'
cp 27
jr nc,.modenone1
add 'a'-1
jr .retsymb
.modenone1
cp 38
jr c,.modenone2
add '0'-38
jr .retsymb
.modenone2
add 0xff&.stand
ld e,a
ld a,0
adc 0xff&(.stand>>8)
ld d,a
ld a,(de)
jr .retsymb
.notModenone
cp .KEY_MODE_SHIFT
jr nz,.notModeShift
ex af,af'
cp 27
jr nc,.modeshift1
add 'A'-1
jr .retsymb
.modeshift1
add 0xff&.stand_sh
ld e,a
ld a,0
adc 0xff&(.stand_sh>>8)
ld d,a
ld a,(de)
jr .retsymb
.notModeShift
cp .KEY_MODE_RUS
jr nz,.isModeRusShift
ex af,af'
cp 38
jr nc,.moderus1
add 0xff&.rust
ld e,a
ld a,0
adc 0xff&(.rust>>8)
ld d,a
ld a,(de)
jr .retsymb
.moderus1
add '0'-38
jr .retsymb
.isModeRusShift
ex af,af'
add 0xff&.rust_sh
ld e,a
ld a,0
adc 0xff&(.rust_sh>>8)
ld d,a
ld a,(de)
jr .retsymb
.keypressmode
cp 0xe0
jp z,.noredraw
ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_SHIFT)
cp 0x12
jr z,.keypressend
cp 0x59
jr z,.keypressend
ld h,~(.KEY_MODE_UP|.KEY_MODE_E0|.KEY_MODE_ALT)
cp 0x11
jr z,.keypressend
ld h,~(.KEY_MODE_UP|.KEY_MODE_E0)
.keypressend
ld a,h
and l
ld (.mode),a
xor a
jp .noredraw1
;.mode defb 0
.redrawkey
DEFW 0
.scodes
; 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf
; 0, F9, 0, F5, F3, F1, F2,F12, 0,F10, F8, F6, F4,TAB,'`', 0
defb 0, 76, 0, 72, 70, 68, 69, 79, 0, 77, 75, 73, 71, 67, 33, 0 ;0x00
; 0, 0, 0, 0, 0,'q','1', 0, 0, 0,'z','s','a','w','2', 0
defb 0, 0, 0, 0, 0, 17, 39, 0, 0, 0, 26, 19, 1, 23, 40, 0 ;0x10
; 0,'c','x','d','e','4','3', 0, 0,' ','v','f','t','r','5', 0
defb 0, 3, 24, 4, 5, 42, 41, 0, 0, 48, 22, 6, 20, 18, 43, 0 ;0x20
; 0,'n','b','h','g','y','6', 0, 0, 0,'m','j','u','7','8', 0
defb 0, 14, 2, 8, 7, 25, 44, 0, 0, 0, 13, 10, 21, 45, 46, 0 ;0x30
; 0,',','k','i','o','0','9', 0, 0,'.','/','l',';','p','-', 0
defb 0, 31, 11, 9, 15, 38, 47, 0, 0, 32, 35, 12, 29, 16, 36, 0 ;0x40
; 0, 0, ', 0,'[','=', 0, 0, 0, 0,ENT,']', 0, \, 0, 0
defb 0, 0, 30, 0, 27, 37, 0, 0, 0, 0, 49, 28, 0, 34, 0, 0 ;0x50
; 0, 0, 0, 0, 0, 0, BS, 0, 0,'1', 0,'4','7', 0, 0, 0
defb 0, 0, 0, 0, 0, 0,key_backspace, 0, 0, 51, 0,248, 57, 0, 0, 0 ;0x60
; '0','.','2','5','6','8',ESC, 0,F11,'+','3','-','*','9', 0, 0
defb 50, 65,249, 55,251,250, 66, 0, 78, 64, 53, 63, 62, 59, 0, 0 ;0x70
; 0, 0, 0, F7
defb 0, 0, 0, 74
.unmod=$-48
defb " \r0123456789 /*-+.",0x1b,"\t",0x08
.stand=$-27
defb "[];\',.`\\/-="
.stand_sh=$-27
defb "{}:\"<>~|?_+)!@#$%^&*("
.rust=$-1
defb "фисвуапршолдьтщзйкыегмцчняхъжэбюё\\.-="
.rust_sh=$-1
defb "ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯХЪЖЭБЮЁ/,_+)!\"№;%:?*("
KEY_PUTREDRAW
;чистим очередь клавиатуры
call GETKEY
or c
jr nz,KEY_PUTREDRAW
ld bc,key_redraw
ld (GETKEY.redrawkey),bc
ret
;jp KEYQUEUEPUT ;если переключились на неактивную задачу, то некому прочитать код!!