511 lines
16 KiB
Plaintext
511 lines
16 KiB
Plaintext
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
|
||
|
||
;------------------------------------------------------------------------------------ |