Files
ZiFi/_src/ps2keys.a80
T
2026-08-31 21:04:48 +03:00

511 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
call _ps2Init
;---------------------------------------
; PentEvo Configuration API Header
;---------------------------------------
peNvRamAccess equ #eff7 ; управление доступом к ячейкам NvRam
; i: A
; [7]: Разрешить(1) / Запретить(0) доступ
peNvRamLocation equ #dff7 ; задать номер ячейки NvRam с которой будет вестись работа
; i: A - номер ячейки (от 0 - 255)
peNvRamData equ #bff7 ; работа с данными ячеек NvRam
; i: A - прочитать данные из ячейки заданной в peNvRamLocation
; o: A - записать данные в ячейку заданную в peNvRamLocation
;---------------------------------------------
; PS/2 Keyboard driver
;---------------------------------------------
_ps2Init call _ps2SelectNvram
xor a
ld (ps2Status),a
_ps2Init_00 ld (ps2RepeatMode),a
ld a,(ps2RepeatDefaut)
add a,a
ld (ps2RepeatCounter),a
jp _ps2ResetAll
;---------------------------------------
_ps2SelectNvram ld a,#f0 ; отсылаем #02 -> #f0 (включить режим чтение ps/2)
ld bc,peNvRamLocation
out (c),a
ld a,#02
ld bc,peNvRamData
out (c),a
ret
;---------------------------------------
_ps2PrepareScanCode
call ps2SetKeyStatus
ld a,(ps2Status) ; Вызывается каждое прерывание
cp #04 ; Данные подготовлены и ожидают, что их заберут
ret z
cp #00 ; Если статус ≠ #00, то продолжаем обработку
jr nz,ps2Status01
;---------------
ps2Status00 ld a,(ps2RepeatMode)
cp #01
jp z,checkRepeatMode ; Если включен режим автоповтора, то проверяем статус готовности
;---------------
call ps2ReadOneCode ; Читаем 0й скан код
cp #00
jr nz,ps2Status00B
ps2Status00A ld a,(ps2RepeatMode) ; Если скан код = #00, то проверяем режим автоповтора
cp #01
jr z,ps2Status00H
ret
ps2Status00B ld (ps2ScanCode),a
cp #f0 ; Если скан код #f0 (клавишу отпустили), отключить режим автоповтора
jr z,ps2Status00D
cp #e0 ; Если скан код = #e0, установить статус #01 и выйти
jr nz,ps2Status00E
ps2Status00C ld a,#01
ld (ps2Status),a
ret
ps2Status00D call ps2RepeatDisable
jr ps2Status00C
ps2Status00E xor a ; В противном случае выставить последующие коды 1,2,3 как #00
ld (ps2ScanCode+1),a
ps2Status00F xor a
ld (ps2ScanCode+2),a
ps2Status00G xor a
ld (ps2ScanCode+3),a
ps2Status00H call ps2RepeatEnable ; Включить режим автоповтора
ps2Status00I ld a,#04 ; Установить статус данные готовы — можно забирать
ld (ps2Status),a
ret
;---------------
ps2Status01 cp #01 ; Если статус ≠ #01, то продолжаем обработку
jr nz,ps2Status02
call ps2ReadOneCode ; Читаем 1й скан код
cp #00 ; Данные не готовы — выход
ret z
ld (ps2ScanCode+1),a
cp #f0
jr nz,ps2Status01A
call ps2RepeatDisable
ld a,#02
ld (ps2Status),a
ret
ps2Status01A ld a,(ps2ScanCode)
cp #f0
jr nz,ps2Status00F
xor a
ld (ps2ScanCode+2),a
ld (ps2ScanCode+3),a
jr ps2Status00I
;---------------
ps2Status02 cp #02 ; Если статус ≠ #02, то заканчиваем обработку
ret nz ; в противном случае — выход
call ps2ReadOneCode ; Читаем 2й скан код
cp #00 ; Данные не готовы — выход
ret z
ld (ps2ScanCode+2),a
ld a,(ps2ScanCode+1)
cp #f0
jr nz,ps2Status00G
xor a
ld (ps2ScanCode+3),a
jr ps2Status00I
;---------------
checkRepeatMode call ps2ReadOneCode
cp #00 ; Если новый код ≠ #00, то останавливаем повтор
jp nz,ps2Status00B
ld a,(ps2RepeatCounter)
cp #00 ; Если задержка повтора нажатой клавиши = #00 выставляем режим #04
jr nz,decRepeatMode
ld a,(ps2RepeatDefaut)
ld (ps2RepeatCounter),a
jr ps2Status00I
decRepeatMode dec a
ld (ps2RepeatCounter),a
ret
;---------------
ps2ReadOneCode ld a,#f0
jp _nvRamGetData+1 ; читаем скан-код
;---------------
ps2RepeatEnable ld a,#01
jp _ps2Init_00
ps2RepeatDisable push af
xor a
call _ps2Init_00
pop af
ret
;---------------
_ps2GetScanCodeT ; Забрать данные, но не снимать флаг!
ld a,(ps2Status)
cp #04
jr nz,_ps2NoScanCode
jr _ps2YepScanCode
_ps2GetScanCode ld a,(ps2Status)
cp #04
jr z,scanCodeReady ; Если #04, данные готовы — можно забирать
_ps2NoScanCode ld hl,#0000
ld de,#0000
ld a,#ff ; A=#FF Ошибка.Данные не готовы
ret
scanCodeReady xor a
ld (ps2Status),a ; данные забраны, можно подготовить следующие
_ps2YepScanCode ld hl,(ps2ScanCode)
ld de,(ps2ScanCode+2)
ret
;---------------
_ps2ResetKeyboard
ld a,#0c
call _nvRamGetData
and %00000010 ; 1-й бит сохраняем статус Caps Lock
or %00000001 ; 0-й бит cброс буфера клавиатуры
_ps2ResKbd ex af,af'
ld a,#0c
call _nvRamSetData
ret
_ps2ResetAll ld a,%00000001 ; 0-й бит cброс буфера клавиатуры
jr _ps2ResKbd
;---------------
ps2SetKeyStatus ld hl,(ps2ScanCode)
ld de,(ps2ScanCode+2)
ld a,h ; скан код пустой — выход
or l
ret z
ld a,l
cp #e0
jr nz,setKeyStatus00
ld l,h
ld h,e
ld de,keyStatusE0
jr setKeyStatus01
setKeyStatus00 ld de,keyStatus
setKeyStatus01 ld a,l ; скан код (#11 - alt)
cp #f0 ; если #f0 значит отпустили
jr nz,setKeyStatus03
ld l,h
ld h,#00
xor a
jr setKeyStatus04
setKeyStatus03 ld a,#01
setKeyStatus04 add hl,de
ld (hl),a
ret
_nvRamGetData ex af,af'
ld bc,peNvRamLocation
out (c),a
_nvRamGetData0 ld bc,peNvRamData
in a,(c)
ret
_nvRamSetData ex af,af'
; push af
ld bc,peNvRamLocation
out (c),a
ld bc,peNvRamData
ld a,l
out (c),a
ret
;---------------------------------------
; CLi² (Command Line Interface) parameters
; 2013,2015 © breeze/fishbone crew
;---------------------------------------
ps2Status db #00
ps2RepeatDefaut db #03
ps2RepeatCounter db #00
ps2RepeatMode db #00
ps2ScanCode db #00,#00,#00,#00 ; текущий скан-код ps/2 клавиатуры (обновляется 1 код за прерывание)
keyStatus ds 131, #00
altStatusB db #00 ; для сохранения статуса клавиши ALT
ctrlStatusB db #00 ; для сохранения статуса клавиши CTRL
checkShiftKey db #01 ; проверять нажата ли клаша шифт
keyInsOver db #01 ; переключение режима ввода строки Insert (#00) / Overwrite (#01)
keyStatusE0 ds 125, #00
keyLayoutSwitch db #00 ; переключение раскладки 0 - EN, 1 - RU
; x8 x0 x9 x1 xA x2 xB x3 xC x4 xD x5 xE x6 xF x7
keyMap_E0
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 0x Таблица расширенных клавиш
; db #00, #00, #00, #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 1x
; db #00, #00, #00, #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 2x
; db #00, #00, #00, #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 3x
; db #00, #00, #00, #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 4x
; db #00, #00, "/", #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 5x
; db #00, #00, #00, #00, #00, #00, #00, #00
; db #00, #00, #00, #00, #00, #00, #00, #00 ; 6x
db #00, aEnd, #00, aCurLeft, aHome, #00, #00, #00
db aInsert,aDelete, aCurDown,#00,aCurRight,aCurUp, #00, #00 ; 7x
db #00, #00, aPageDown, #00, #00, aPageUp, #00, #00
; x8 x0 x9 x1 xA x2 xB x3 xC x4 xD x5 xE x6 xF x7
keyMap_0A db #00, aF9, #00, aF5, aF3, aF1, aF2, #00 ; 0x Таблица обычных клавиш
db #00, aF10, aF8, aF6, aF4, aTab, "`", #00
db #00, #00, #00, #00, #00, "q", "1", #00 ; 1x
db #00, #00, "z", "s", "a", "w", "2", #00
db #00, "c", "x", "d", "e", "4", "3", #00 ; 2x
db #00, " ", "v", "f", "t", "r", "5", #00
db #00, "n", "b", "h", "g", "y", "6", #00 ; 3x
db #00, #00, "m", "j", "u", "7", "8", #00
db #00, ",", "k", "i", "o", "0", "9", #00 ; 4x
db #00, ".", "/", "l", ";", "p", "-", #00
db #00, #00, "'", #00, "[", "=", #00, #00 ; 5x
db #00, #00, aEnter, "]", #00, "\\", #00, #00
db #00, #00, #00, #00, #00, #00,aBackspace, #00 ; 6x
db #00, "1", #00, "4", "7", #00, #00, #00
db "0", ".", "2", "5", "6", "8", aEsc, #00 ; 7x
db aF11, "+", "3", "-", "*", "9", #00, #00
db #00, #00, #00, aF7, #00, #00, #00, #00 ; 8x
; db #00, #00, #00, #00, #00, #00, #00, #00
; x8 x0 x9 x1 xA x2 xB x3 xC x4 xD x5 xE x6 xF x7
keyMap_0B db #00, aF9, #00, aF5, aF3, aF1, aF2, #00 ; 0x Таблица клавиш + shift
db #00, #00, aF8, aF6, aF4, aTab, "~", #00
db #00, #00, #00, #00, #00, "Q", "!", #00 ; 1x
db #00, aF10, "Z", "S", "A", "W", "@", #00
db #00, "C", "X", "D", "E", "$", "#", #00 ; 2x
db #00, " ", "V", "F", "T", "R", "%", #00
db #00, "N", "B", "H", "G", "Y", "^", #00 ; 3x
db #00, #00, "M", "J", "U", "&", "*", #00
db #00, ",", "K", "I", "O", ")", "(", #00 ; 4x
db #00, ">", "?", "L", ":", "P", "_", #00
db #00, #00, "\"", #00, "{", "+", #00, #00 ; 5x
db #00, #00, aEnter, "}", #00, "|", #00, #00
db #00, #00, #00, #00, #00, #00,aBackspace, #00 ; 6x
db #00, #00, #00, #00, #00, #00, #00, #00
db #00, #00, #00, #00, #00, #00, aEsc, #00 ; 7x
db aF11, "+", #00, "-", "*", #00, #00, #00
db #00, #00, #00, aF7, #00, #00, #00, #00 ; 8x
; db #00, #00, #00, #00, #00, #00, #00, #00
; x8 x0 x9 x1 xA x2 xB x3 xC x4 xD x5 xE x6 xF x7
keyMap_1A db #00, aF9, #00, aF5, aF3, aF1, aF2, #00 ; 0x Таблица обычных клавиш (русская раскладка)
db #00, aF10, aF8, aF6, aF4, aTab, re1, #00
db #00, #00, #00, #00, #00, rii, "1", #00 ; 1x
db #00, #00, rya, ryi, rf, rc, "2", #00
db #00, rs, rch, rv, ru, "4", "3", #00 ; 2x
db #00, " ", rm, ra, re, rk, "5", #00
db #00, rt, ri, rr, rp, rn, "6", #00 ; 3x
db #00, #00, rmzn, ro, rg, "7", "8", #00
db #00, rb, rl, rsh, rsch, "0", "9", #00 ; 4x
db #00, ryu, ".", rd, rzh, rz, "-", #00
db #00, #00, re2, #00, rh, "=", #00, #00 ; 5x
db #00, #00, aEnter, rtzn, #00, "\\", #00, #00
db #00, #00, #00, #00, #00, #00,aBackspace, #00 ; 6x
db #00, "1", #00, "4", "7", #00, #00, #00
db "0", ",", "2", "5", "6", "8", aEsc, #00 ; 7x
db aF11, "+", "3", "-", "*", "9", #00, #00
db #00, #00, #00, aF7, #00, #00, #00, #00 ; 8x
; db #00, #00, #00, #00, #00, #00, #00, #00
; x8 x0 x9 x1 xA x2 xB x3 xC x4 xD x5 xE x6 xF x7
keyMap_1B db #00, aF9, #00, aF5, aF3, aF1, aF2, #00 ; 0x Таблица обычных клавиш (русская раскладка) + shift
db #00, aF10, aF8, aF6, aF4, aTab, rE1, #00
db #00, #00, #00, #00, #00, rII, "!", #00 ; 1x
db #00, #00, rYA, rYI, rF, rC, "\"", #00
db #00, rS, rCH, rV, rU, ";", rNN, #00 ; 2x
db #00, " ", rM, rA, rE, rK, "%", #00
db #00, rT, rI, rR, rP, rN, ":", #00 ; 3x
db #00, #00, rMZN, rO, rG, "?", "*", #00
db #00, rB, rL, rSH, rSCH, ")", "(", #00 ; 4x
db #00, rYU, ".", rD, rZH, rZ, "_", #00
db #00, #00, rE2, #00, rH, "+", #00, #00 ; 5x
db #00, #00, aEnter, rTZN, #00, "/", #00, #00
db #00, #00, #00, #00, #00, #00,aBackspace, #00 ; 6x
db #00, #00, #00, #00, #00, #00, #00, #00
db #00, #00, #00, #00, #00, #00, aEsc, #00 ; 7x
db aF11, "+", #00, "-", "*", #00, #00, #00
db #00, #00, #00, aF7, #00, #00, #00, #00 ; 8x
; db #00, #00, #00, #00, #00, #00, #00, #00
fKeysSize equ 16 ; Количество байт отведённых под 1 команду
fKeys db "help\n" ; F1
ds 11,#00
db "ls\n" ; F2
ds 13,#00
db "type " ; F3
ds 11,#00
db "edit " ; F4
ds 11,#00
db "cd " ; F5
ds 13,#00
db "rename " ; F6
ds 9,#00
db "mkdir " ; F7
ds 10,#00
db "delete " ; F8
ds 9,#00
db "find " ; F9
ds 11,#00
db "sh " ; F10
ds 13,#00
db "pwd\n" ; F11
ds 12,#00
rA equ 128
rB equ 129
rV equ 130
rG equ 131
rD equ 132
rE equ 133
rE1 equ 240
rZH equ 134
rZ equ 135
rI equ 136
rII equ 137
rK equ 138
rL equ 139
rM equ 140
rN equ 141
rO equ 142
rP equ 143
rR equ 144
rS equ 145
rT equ 146
rU equ 147
rF equ 148
rH equ 149
rC equ 150
rCH equ 151
rSH equ 152
rSCH equ 153
rTZN equ 154
rYI equ 155
rMZN equ 156
rE2 equ 157
rYU equ 158
rYA equ 159
ra equ 160
rb equ 161
rv equ 162
rg equ 163
rd equ 164
re equ 165
re1 equ 241
rzh equ 166
rz equ 167
ri equ 168
rii equ 169
rk equ 170
rl equ 171
rm equ 172
rn equ 173
ro equ 174
rp equ 175
rr equ 224
rs equ 225
rt equ 226
ru equ 227
rf equ 228
rh equ 229
rc equ 230
rch equ 231
rsh equ 232
rsch equ 233
rtzn equ 234
ryi equ 235
rmzn equ 236
re2 equ 237
ryu equ 238
rya equ 239
rNN equ 252 ; çíàê ¹
;-------------------------------------------------------------------------------------
; equ #01 ; псевдо-коды ASCII для маппинга расширенных клавиш
aInsert equ #02
aDelete equ #03
aHome equ #04
aEnd equ #05
aPageUp equ #06
aPageDown equ #07
aCurLeft equ #08
aCurRight equ #09
aCurDown equ #0a
aCurUp equ #0b
; equ #0c
aEnter equ #0d
aBackspace equ #0e
aTab equ #0f
aEsc equ #10
aF1 equ #11
aF2 equ #12
aF3 equ #13
aF4 equ #14
aF5 equ #15
aF6 equ #16
aF7 equ #17
aF8 equ #18
aF9 equ #19
aF10 equ #1a
aF11 equ #1b
;------------------------------------------------------------------------------------