1161 lines
93 KiB
Plaintext
1161 lines
93 KiB
Plaintext
''***************************************
|
|
''* PS/2 Keyboard Driver v1.0.1 *
|
|
''* Author: Chip Gracey *
|
|
''* Copyright (c) 2004 Parallax, Inc. *
|
|
''* See end of file for terms of use. *
|
|
''***************************************
|
|
|
|
{-----------------REVISION HISTORY---------------------------------
|
|
v1.0.1 - Updated 6/15/2006 to work with Propeller Tool 0.96
|
|
------------------------------------------------------------------}
|
|
|
|
{-----------------KEYBOARD LAYOUT HISTORY--------------------------
|
|
2009-08-31 (Y-M-D)
|
|
Patch for german keyboard layout
|
|
Author: oog
|
|
Added german keyboard layout.
|
|
Original layout is commented as keyboard-us-en (US-English).
|
|
German layout is commented as keyboard-de (de = deutsch = "german").
|
|
|
|
Now there are two tables for keys with and without SHIFT-Key.
|
|
It should be easier to implement different international layouts.
|
|
However, it's bigger now and uses more memory.
|
|
|
|
2009-09-05 (Y-M-D)
|
|
Fixed bugs
|
|
- code bug on home-key fixed
|
|
new replace-codes for de_ae, de_ou and de_ue
|
|
|
|
New
|
|
- Documentation of control-key bits
|
|
This should be helpful for translatíons of this driver into
|
|
different languages.
|
|
- table_alt_r
|
|
This table contains characters for the german "AltGr" key.
|
|
- AltGr+F1..F12
|
|
Returns line-characters, selected from $90..$9f
|
|
|
|
2009-09-06 (Y-M-D)
|
|
Fixed bugs
|
|
- patch table_shift for "?"
|
|
|
|
Differences to Parallax driver:
|
|
- Different codes for NumLock, CapsLock and ScrLock to avoid
|
|
conflict with german "ß"
|
|
Codes are defined as constants and easy to change
|
|
- Easy Cursor codes implemented to avoit conflict with the "Ä"-key
|
|
Easy Cursor codes are easy to understand,
|
|
for example "Cursor Left" is the character "←"
|
|
|
|
------------------------------------------------------------------}
|
|
|
|
con
|
|
de_ae = $A6 'replace code - not used on keyboard
|
|
de_oe = $A7 'replace code - not used on keyboard
|
|
de_ue = $A8 'replace code - not used on keyboard
|
|
lock = $BC 'Parallax used codes $DD, $DE and $DF
|
|
'There was a conflict between $DF=NumLock="ß"
|
|
ScrLk = lock
|
|
CpsLk = lock+1
|
|
NumLk = lock+2
|
|
|
|
'
|
|
'Uncomment one of the next constant blocks
|
|
'
|
|
'
|
|
|
|
{{Parallax cursor codes start}}
|
|
{{
|
|
CrsLt = $C0E4
|
|
CrsRt = $C1E6
|
|
CrsUp = $C2E8
|
|
CrsDn = $C3E2
|
|
CrsHm = $C4E7 'Conflict with key "Ä" ($C4)
|
|
CrsEn = $C5E1
|
|
PgUp = $C6E9
|
|
PgDn = $C7E3
|
|
Bksp = $00C8
|
|
Del = $C9EA
|
|
Ins = $CAE0
|
|
Esc = $00CB
|
|
Apps = $CC00
|
|
Power = $CD00
|
|
Sleep = $CE00
|
|
WkUp = $CF00
|
|
}}
|
|
{{Parallax cursor codes end}}
|
|
|
|
|
|
{{Easy cursor codes start}}
|
|
|
|
CrsLt = $02E4 '←
|
|
CrsRt = $03E6 '→
|
|
CrsUp = $04E8 '↑
|
|
CrsDn = $05E2 '↓
|
|
CrsHm = $06E7 '◀
|
|
CrsEn = $07E1 '▶
|
|
PgUp = $A0E9 '
|
|
PgDn = $A2E3 '
|
|
Bksp = $00C8 'È
|
|
Del = $BAEA '
|
|
Ins = $BBE0 '
|
|
Esc = $001B '
|
|
Apps = $CC00 'Ì
|
|
Power = $CD00 'Í
|
|
Sleep = $CE00 'Î
|
|
WkUp = $CF00 'Ï
|
|
|
|
{{Easy cursor codes end}}
|
|
|
|
VAR
|
|
|
|
long cog
|
|
|
|
long par_tail 'key buffer tail read/write (19 contiguous longs)
|
|
long par_head 'key buffer head read-only
|
|
long par_present 'keyboard present read-only
|
|
long par_states[8] 'key states (256 bits) read-only
|
|
long par_keys[8] 'key buffer (16 words) read-only (also used to pass initial parameters)
|
|
|
|
|
|
PUB start(dpin, cpin) : okay
|
|
|
|
'' Start keyboard driver - starts a cog
|
|
'' returns false if no cog available
|
|
''
|
|
'' dpin = data signal on PS/2 jack
|
|
'' cpin = clock signal on PS/2 jack
|
|
''
|
|
'' use 100-ohm resistors between pins and jack
|
|
'' use 10K-ohm resistors to pull jack-side signals to VDD
|
|
'' connect jack-power to 5V, jack-gnd to VSS
|
|
''
|
|
'' all lock-keys will be enabled, NumLock will be initially 'on',
|
|
'' and auto-repeat will be set to 15cps with a delay of .5s
|
|
|
|
okay := startx(dpin, cpin, %0_000_000, %01_01000)
|
|
|
|
|
|
PUB startx(dpin, cpin, locks, auto) : okay
|
|
|
|
'' Like start, but allows you to specify lock settings and auto-repeat
|
|
''
|
|
'' locks = lock setup
|
|
'' bit 6 disallows shift-alphas (case set soley by CapsLock)
|
|
'' bits 5..3 disallow toggle of NumLock/CapsLock/ScrollLock state
|
|
'' bits 2..0 specify initial state of NumLock/CapsLock/ScrollLock
|
|
'' (eg. %0_001_100 = disallow ScrollLock, NumLock initially 'on')
|
|
''
|
|
'' auto = auto-repeat setup
|
|
'' bits 6..5 specify delay (0=.25s, 1=.5s, 2=.75s, 3=1s)
|
|
'' bits 4..0 specify repeat rate (0=30cps..31=2cps)
|
|
'' (eg %01_00000 = .5s delay, 30cps repeat)
|
|
|
|
stop
|
|
longmove(@par_keys, @dpin, 4)
|
|
okay := cog := cognew(@entry, @par_tail) + 1
|
|
|
|
|
|
PUB stop
|
|
|
|
'' Stop keyboard driver - frees a cog
|
|
|
|
if cog
|
|
cogstop(cog~ - 1)
|
|
longfill(@par_tail, 0, 19)
|
|
|
|
|
|
PUB present : truefalse
|
|
|
|
'' Check if keyboard present - valid ~2s after start
|
|
'' returns t|f
|
|
|
|
truefalse := -par_present
|
|
|
|
|
|
PUB key : keycode
|
|
|
|
'' Get key (never waits)
|
|
'' returns key (0 if buffer empty)
|
|
|
|
if par_tail <> par_head
|
|
keycode := par_keys.word[par_tail]
|
|
par_tail := ++par_tail & $F
|
|
|
|
|
|
PUB getkey : keycode
|
|
|
|
'' Get next key (may wait for keypress)
|
|
'' returns key
|
|
|
|
repeat until (keycode := key)
|
|
|
|
|
|
PUB newkey : keycode
|
|
|
|
'' Clear buffer and get new key (always waits for keypress)
|
|
'' returns key
|
|
|
|
par_tail := par_head
|
|
keycode := getkey
|
|
|
|
|
|
PUB gotkey : truefalse
|
|
|
|
'' Check if any key in buffer
|
|
'' returns t|f
|
|
|
|
truefalse := par_tail <> par_head
|
|
|
|
|
|
PUB clearkeys
|
|
|
|
'' Clear key buffer
|
|
|
|
par_tail := par_head
|
|
|
|
|
|
PUB keystate(k) : state
|
|
|
|
'' Get the state of a particular key
|
|
'' returns t|f
|
|
|
|
state := -(par_states[k >> 5] >> k & 1)
|
|
|
|
|
|
DAT
|
|
|
|
'******************************************
|
|
'* Assembly language PS/2 keyboard driver *
|
|
'******************************************
|
|
|
|
org
|
|
'
|
|
'
|
|
' Entry
|
|
'
|
|
entry movd :par,#_dpin 'load input parameters _dpin/_cpin/_locks/_auto
|
|
mov x,par
|
|
add x,#11*4
|
|
mov y,#4
|
|
:par rdlong 0,x
|
|
add :par,dlsb
|
|
add x,#4
|
|
djnz y,#:par
|
|
|
|
mov dmask,#1 'set pin masks
|
|
shl dmask,_dpin
|
|
mov cmask,#1
|
|
shl cmask,_cpin
|
|
|
|
test _dpin,#$20 wc 'modify port registers within code
|
|
muxc _d1,dlsb
|
|
muxc _d2,dlsb
|
|
muxc _d3,#1
|
|
muxc _d4,#1
|
|
test _cpin,#$20 wc
|
|
muxc _c1,dlsb
|
|
muxc _c2,dlsb
|
|
muxc _c3,#1
|
|
|
|
mov _head,#0 'reset output parameter _head
|
|
'
|
|
'
|
|
' Reset keyboard
|
|
'
|
|
reset mov dira,#0 'reset directions
|
|
mov dirb,#0
|
|
|
|
movd :par,#_present 'reset output parameters _present/_states[8]
|
|
mov x,#1+8
|
|
:par mov 0,#0
|
|
add :par,dlsb
|
|
djnz x,#:par
|
|
|
|
mov stat,#8 'set reset flag
|
|
'
|
|
'
|
|
' Update parameters
|
|
'
|
|
update movd :par,#_head 'update output parameters _head/_present/_states[8]
|
|
mov x,par
|
|
add x,#1*4
|
|
mov y,#1+1+8
|
|
:par wrlong 0,x
|
|
add :par,dlsb
|
|
add x,#4
|
|
djnz y,#:par
|
|
|
|
test stat,#8 wc 'if reset flag, transmit reset command
|
|
if_c mov data,#$FF
|
|
if_c call #transmit
|
|
'
|
|
'
|
|
' Get scancode
|
|
'
|
|
newcode mov stat,#0 'reset state
|
|
|
|
:same call #receive 'receive byte from keyboard
|
|
|
|
cmp data,#$83+1 wc 'scancode?
|
|
|
|
if_nc cmp data,#$AA wz 'powerup/reset?
|
|
if_nc_and_z jmp #configure
|
|
|
|
if_nc cmp data,#$E0 wz 'extended?
|
|
if_nc_and_z or stat,#1
|
|
if_nc_and_z jmp #:same
|
|
|
|
if_nc cmp data,#$F0 wz 'released?
|
|
if_nc_and_z or stat,#2
|
|
if_nc_and_z jmp #:same
|
|
|
|
if_nc jmp #newcode 'unknown, ignore
|
|
'
|
|
'
|
|
' Translate scancode and enter into buffer
|
|
'
|
|
test stat,#1 wc 'lookup code with extended flag
|
|
rcl data,#1
|
|
mov data_s,data 'keyboard-de: store scancode for next table lookup with shift
|
|
call #look
|
|
|
|
cmp data,#0 wz 'if unknown, ignore
|
|
if_z jmp #newcode
|
|
|
|
mov t,_states+6 'remember lock keys in _states
|
|
|
|
mov x,data 'set/clear key bit in _states
|
|
shr x,#5
|
|
add x,#_states
|
|
movd :reg,x
|
|
mov y,#1
|
|
shl y,data
|
|
test stat,#2 wc
|
|
:reg muxnc 0,y
|
|
|
|
if_nc cmpsub data,#$F0 wc 'if released or shift/ctrl/alt/win, done
|
|
if_c jmp #update
|
|
|
|
mov y,_states+7 'get shift/ctrl/alt/win bit pairs
|
|
shr y,#16
|
|
|
|
cmpsub data,#$E0 wc 'translate keypad, considering numlock
|
|
if_c test _locks,#%100 wz
|
|
if_c_and_z add data,#@keypad1-@table
|
|
if_c_and_nz add data,#@keypad2-@table
|
|
if_c call #look
|
|
if_c jmp #:flags
|
|
|
|
'for keyboard-de changed #$DD to #lock
|
|
'in next code segment
|
|
|
|
cmpsub data,#lock wc 'handle scrlock/capslock/numlock
|
|
if_c mov x,#%001_000
|
|
if_c shl x,data
|
|
if_c andn x,_locks
|
|
if_c shr x,#3
|
|
if_c shr t,#29 'ignore auto-repeat
|
|
if_c andn x,t wz
|
|
if_c xor _locks,x
|
|
if_c add data,#lock
|
|
if_c_and_nz or stat,#4 'if change, set configure flag to update leds
|
|
|
|
{{ for keyboard-us-en start }}
|
|
{{
|
|
|
|
test y,#%11 wz 'get shift into nz
|
|
'
|
|
'Translate scan-codes $5B..$60 with characters from table "shift1"
|
|
'
|
|
if_nz cmp data,#$60+1 wc 'check shift1
|
|
if_nz_and_c cmpsub data,#$5B wc
|
|
if_nz_and_c add data,#@shift1-@table
|
|
if_nz_and_c call #look
|
|
if_nz_and_c andn y,#%11
|
|
|
|
'
|
|
'Translate scan-codes $27..$3D with characters from table "shift2"
|
|
'
|
|
if_nz cmp data,#$3D+1 wc 'check shift2
|
|
if_nz_and_c cmpsub data,#$27 wc
|
|
if_nz_and_c add data,#@shift2-@table
|
|
if_nz_and_c call #look
|
|
if_nz_and_c andn y,#%11
|
|
|
|
test _locks,#%010 wc 'check shift-alpha, considering capslock
|
|
muxnc :shift,#$20
|
|
test _locks,#$40 wc
|
|
if_nz_and_nc xor :shift,#$20
|
|
cmp data,#"z"+1 wc
|
|
if_c cmpsub data,#"a" wc
|
|
:shift if_c add data,#"A"
|
|
if_c andn y,#%11
|
|
}}
|
|
{{ for keyboard-us-en end }}
|
|
|
|
{{ for keyboard-de start }}
|
|
|
|
cmp data,#de_ae wz 'replace ae
|
|
if_z mov data,#"ä"
|
|
cmp data,#de_oe wz 'replace oe
|
|
if_z mov data,#"ö"
|
|
cmp data,#de_ue wz 'replace ue
|
|
if_z mov data,#"ü"
|
|
|
|
'
|
|
'Documentation of control-key bits
|
|
'
|
|
' test y,#%00000011 wz 'get SHIFT into nz
|
|
' test y,#%00000100 wz 'get CTRL-L into nz
|
|
' test y,#%00001000 wz 'get CTRL-R into nz
|
|
' test y,#%00010000 wz 'get ALT-L into nz
|
|
' test y,#%00100000 wz 'get ALT-R into nz
|
|
' test y,#%01000000 wz 'get WIN-L into nz
|
|
' test y,#%10000000 wz 'get WIN-R into nz
|
|
|
|
|
|
'
|
|
'Translate scan-codes with characters from "table_shift"
|
|
'
|
|
|
|
test y,#%00000011 wz 'get shift into nz
|
|
test _locks,#$40 wc
|
|
if_nz_and_nc mov data,data_s 'reload scancode
|
|
if_nz_and_nc call #look_shift 'translate by table_shift
|
|
|
|
|
|
'
|
|
'Translate scan-codes with characters from "table_alt_r"
|
|
'
|
|
|
|
test y,#%00100000 wz 'get ALT-R (AltGr) into nz
|
|
if_nz mov data,data_s 'reload scancode
|
|
if_nz call #look_alt_r 'translate by table_alt_r
|
|
|
|
|
|
{{ for keyboard-de end }}
|
|
|
|
|
|
:flags ror data,#8 'add shift/ctrl/alt/win flags
|
|
mov x,#4 '+$100 if shift
|
|
:loop test y,#%11 wz '+$200 if ctrl
|
|
shr y,#2 '+$400 if alt
|
|
if_nz or data,#1 '+$800 if win
|
|
ror data,#1
|
|
djnz x,#:loop
|
|
rol data,#12
|
|
|
|
rdlong x,par 'if room in buffer and key valid, enter
|
|
sub x,#1
|
|
and x,#$F
|
|
cmp x,_head wz
|
|
if_nz test data,#$FF wz
|
|
if_nz mov x,par
|
|
if_nz add x,#11*4
|
|
if_nz add x,_head
|
|
if_nz add x,_head
|
|
if_nz wrword data,x
|
|
if_nz add _head,#1
|
|
if_nz and _head,#$F
|
|
|
|
test stat,#4 wc 'if not configure flag, done
|
|
if_nc jmp #update 'else configure to update leds
|
|
'
|
|
'
|
|
' Configure keyboard
|
|
'
|
|
configure mov data,#$F3 'set keyboard auto-repeat
|
|
call #transmit
|
|
mov data,_auto
|
|
and data,#%11_11111
|
|
call #transmit
|
|
|
|
mov data,#$ED 'set keyboard lock-leds
|
|
call #transmit
|
|
mov data,_locks
|
|
rev data,#-3 & $1F
|
|
test data,#%100 wc
|
|
rcl data,#1
|
|
and data,#%111
|
|
call #transmit
|
|
|
|
mov x,_locks 'insert locks into _states
|
|
and x,#%111
|
|
shl _states+7,#3
|
|
or _states+7,x
|
|
ror _states+7,#3
|
|
|
|
mov _present,#1 'set _present
|
|
|
|
jmp #update 'done
|
|
|
|
{{ for keyboard-de start }}
|
|
'
|
|
' Lookup byte in table_shift
|
|
'
|
|
look_shift ror data,#2 'perform lookup
|
|
movs :reg,data
|
|
add :reg,#table_shift
|
|
shr data,#27
|
|
mov x,data
|
|
:reg mov data,0
|
|
shr data,x
|
|
and data,#$FF 'isolate byte
|
|
look_shift_ret ret
|
|
|
|
'
|
|
' Lookup byte in table_alt_r
|
|
'
|
|
look_alt_r ror data,#2 'perform lookup
|
|
movs :reg,data
|
|
add :reg,#table_alt_r
|
|
shr data,#27
|
|
mov x,data
|
|
:reg mov data,0
|
|
shr data,x
|
|
and data,#$FF 'isolate byte
|
|
look_alt_r_ret ret
|
|
|
|
{{ for keyboard-de end }}
|
|
|
|
'
|
|
'
|
|
' Lookup byte in table
|
|
'
|
|
look ror data,#2 'perform lookup
|
|
movs :reg,data
|
|
add :reg,#table
|
|
shr data,#27
|
|
mov x,data
|
|
:reg mov data,0
|
|
shr data,x
|
|
|
|
jmp #rand 'isolate byte
|
|
'
|
|
'
|
|
' Transmit byte to keyboard
|
|
'
|
|
transmit
|
|
_c1 or dira,cmask 'pull clock low
|
|
movs napshr,#13 'hold clock for ~128us (must be >100us)
|
|
call #nap
|
|
_d1 or dira,dmask 'pull data low
|
|
movs napshr,#18 'hold data for ~4us
|
|
call #nap
|
|
_c2 xor dira,cmask 'release clock
|
|
|
|
test data,#$0FF wc 'append parity and stop bits to byte
|
|
muxnc data,#$100
|
|
or data,dlsb
|
|
|
|
mov x,#10 'ready 10 bits
|
|
transmit_bit call #wait_c0 'wait until clock low
|
|
shr data,#1 wc 'output data bit
|
|
_d2 muxnc dira,dmask
|
|
mov wcond,c1 'wait until clock high
|
|
call #wait
|
|
djnz x,#transmit_bit 'another bit?
|
|
|
|
mov wcond,c0d0 'wait until clock and data low
|
|
call #wait
|
|
mov wcond,c1d1 'wait until clock and data high
|
|
call #wait
|
|
|
|
call #receive_ack 'receive ack byte with timed wait
|
|
cmp data,#$FA wz 'if ack error, reset keyboard
|
|
if_nz jmp #reset
|
|
|
|
transmit_ret ret
|
|
'
|
|
'
|
|
' Receive byte from keyboard
|
|
'
|
|
receive test _cpin,#$20 wc 'wait indefinitely for initial clock low
|
|
waitpne cmask,cmask
|
|
receive_ack
|
|
mov x,#11 'ready 11 bits
|
|
receive_bit call #wait_c0 'wait until clock low
|
|
movs napshr,#16 'pause ~16us
|
|
call #nap
|
|
_d3 test dmask,ina wc 'input data bit
|
|
rcr data,#1
|
|
mov wcond,c1 'wait until clock high
|
|
call #wait
|
|
djnz x,#receive_bit 'another bit?
|
|
|
|
shr data,#22 'align byte
|
|
test data,#$1FF wc 'if parity error, reset keyboard
|
|
if_nc jmp #reset
|
|
rand and data,#$FF 'isolate byte
|
|
|
|
look_ret
|
|
receive_ack_ret
|
|
receive_ret ret
|
|
'
|
|
'
|
|
' Wait for clock/data to be in required state(s)
|
|
'
|
|
wait_c0 mov wcond,c0 '(wait until clock low)
|
|
|
|
wait mov y,tenms 'set timeout to 10ms
|
|
|
|
wloop movs napshr,#18 'nap ~4us
|
|
call #nap
|
|
_c3 test cmask,ina wc 'check required state(s)
|
|
_d4 test dmask,ina wz 'loop until got state(s) or timeout
|
|
wcond if_never djnz y,#wloop '(replaced with c0/c1/c0d0/c1d1)
|
|
|
|
tjz y,#reset 'if timeout, reset keyboard
|
|
wait_ret
|
|
wait_c0_ret ret
|
|
|
|
|
|
c0 if_c djnz y,#wloop '(if_never replacements)
|
|
c1 if_nc djnz y,#wloop
|
|
c0d0 if_c_or_nz djnz y,#wloop
|
|
c1d1 if_nc_or_z djnz y,#wloop
|
|
'
|
|
'
|
|
' Nap
|
|
'
|
|
nap rdlong t,#0 'get clkfreq
|
|
napshr shr t,#18/16/13 'shr scales time
|
|
min t,#3 'ensure waitcnt won't snag
|
|
add t,cnt 'add cnt to time
|
|
waitcnt t,#0 'wait until time elapses (nap)
|
|
|
|
nap_ret ret
|
|
'
|
|
'
|
|
' Initialized data
|
|
'
|
|
'
|
|
dlsb long 1 << 9
|
|
tenms long 10_000 / 4
|
|
'
|
|
'
|
|
' Lookup table
|
|
' ascii scan extkey regkey ()=keypad
|
|
'
|
|
|
|
{{keyboard-us-en start}}
|
|
{{
|
|
table
|
|
'
|
|
'$00 --- F9 --- F5 F3 F1 F2 F12
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D8,$0000,$00D4,$00D2,$00D0,$00D1,$00DB
|
|
|
|
'
|
|
'$08 --- F10 F8 F6 F4 TAB ` ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D9,$00D7,$00D5,$00D3,$0009,$0060,$0000
|
|
|
|
' ALT-R Left CTRL-R
|
|
'$10 --- ALT-L SHIFT --- CTRL_L q 1 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$F5F4,$00F0,$0000,$F3F2,$0071,$0031,$0000
|
|
|
|
' WIN-L
|
|
'$18 --- --- z s a w 2 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$007A,$0073,$0061,$0077,$0032,$F600
|
|
|
|
' WIN-R
|
|
'$20 --- c x d e 4 3 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0063,$0078,$0064,$0065,$0034,$0033,$F700
|
|
|
|
' Apps
|
|
'$28 --- Spc v f t r 5 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0020,$0076,$0066,$0074,$0072,$0035,$CC00
|
|
|
|
' Power
|
|
'$30 --- n b h g y 6 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$006E,$0062,$0068,$0067,$0079,$0036,$CD00
|
|
|
|
' Sleep
|
|
'$38 --- --- m j u 7 8 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$006D,$006A,$0075,$0037,$0038,$CE00
|
|
|
|
'
|
|
'$40 --- , k i o 0 9 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$002C,$006B,$0069,$006F,$0030,$0039,$0000
|
|
|
|
' (/)
|
|
'$48 --- . / l } p + ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$002E,$EF2F,$006C,$003B,$0070,$002D,$0000
|
|
|
|
'
|
|
'$50 --- --- { --- [ = --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0027,$0000,$005B,$003D,$0000,$0000
|
|
|
|
' CAPS Right (ENTER) Wk.up
|
|
'$58 LOCK SHIFT ENTER ] --- \ --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $00DE,$00F1,$EB0D,$005D,$0000,$005C,$CF00,$0000
|
|
|
|
'
|
|
'$60 --- --- --- --- --- --- BkSpc ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000,$00C8,$0000
|
|
|
|
' End Left Home
|
|
'$68 --- (1) --- (4) (7) --- --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$C5E1,$0000,$C0E4,$C4E7,$0000,$0000,$0000
|
|
|
|
' Ins Del Down --- Right Up
|
|
'$70 (0) (.) (2) (5) (6) (8) Esc NumLock
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $CAE0,$C9EA,$C3E2,$00E5,$C1E6,$C2E8,$00CB,$00DF
|
|
|
|
' PgDn PrScr PgUp
|
|
'$78 F11 (+) (3) (-) (*) (9) ScrLock ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $00DA,$00EC,$C7E3,$00ED,$DCEE,$C6E9,$00DD,$0000
|
|
|
|
'
|
|
'$80 --- --- --- F7
|
|
' ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$00D6
|
|
|
|
|
|
keypad1 byte $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, "+-*/"
|
|
|
|
keypad2 byte "0123456789.", $0D, "+-*/"
|
|
|
|
'
|
|
'Table "shift1" for scan-codes $5B..$60
|
|
'
|
|
shift1 byte "{|}", 0, 0, "~"
|
|
|
|
'
|
|
'Table "shift1" for scan-codes $27..$3D
|
|
'
|
|
shift2 byte $22, 0, 0, 0, 0, "<_>?)!@#$%^&*(", 0, ":", 0, "+"
|
|
}}
|
|
{{keyboard-us-en end}}
|
|
|
|
|
|
{{keyboard-de start}}
|
|
|
|
table
|
|
'
|
|
'$00 --- F9 --- F5 F3 F1 F2 F12
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D8,$0000,$00D4,$00D2,$00D0,$00D1,$00DB
|
|
|
|
'
|
|
'$08 --- F10 F8 F6 F4 TAB _^_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D9,$00D7,$00D5,$00D3,$0009,$005E,$0000
|
|
|
|
' ALT-R Left CTRL-R
|
|
'$10 --- ALT-L SHIFT --- CTRL_L q 1 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$F5F4,$00F0,$0000,$F3F2,$0071,$0031,$0000
|
|
|
|
' WIN-L
|
|
'$18 --- --- _y_ s a w 2 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0079,$0073,$0061,$0077,$0032,$F600
|
|
|
|
' WIN-R
|
|
'$20 --- c x d e 4 3 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0063,$0078,$0064,$0065,$0034,$0033,$F700
|
|
|
|
' Apps
|
|
'$28 --- Spc v f t r 5 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0020,$0076,$0066,$0074,$0072,$0035,Apps
|
|
|
|
' Power
|
|
'$30 --- n b h g _z_ 6 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$006E,$0062,$0068,$0067,$007A,$0036,Power
|
|
|
|
' Sleep
|
|
'$38 --- --- m j u 7 8 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$006D,$006A,$0075,$0037,$0038,Sleep
|
|
|
|
'
|
|
'$40 --- , k i o 0 9 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$002C,$006B,$0069,$006F,$0030,$0039,$0000
|
|
|
|
' (/)
|
|
'$48 --- . _-_ l _oe_ p _sz_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$002E,$EF2D,$006C,de_oe,$0070,$00DF,$0000
|
|
|
|
'
|
|
'$50 --- --- _ae_ --- _ue_ _'_ --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,de_ae,$0000,de_ue,$0060,$0000,$0000
|
|
|
|
' CAPS Right (ENTER) Wk.up
|
|
'$58 LOCK SHIFT ENTER _+_ --- # --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word CpsLk,$00F1,$EB0D,$002B,$0000,$0023,WkUp ,$0000
|
|
|
|
'
|
|
'$60 --- _<_ --- --- --- --- BkSpc ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$003C,$0000,$0000,$0000,$0000,BkSp ,$0000
|
|
|
|
' End Left Home
|
|
'$68 --- (1) --- (4) (7) --- --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,CrsEn,$0000,CrsLt,CrsHm,$0000,$0000,$0000
|
|
|
|
' Ins Del Down --- Right Up
|
|
'$70 (0) (.) (2) (5) (6) (8) Esc NumLock
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word Ins , Del ,CrsDn,$00E5,CrsRt,CrsUp, Esc ,NumLk
|
|
|
|
' PgDn PrScr PgUp
|
|
'$78 F11 (+) (3) (-) (*) (9) ScrLock ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $00DA,$00EC,PgDn ,$00ED,$DCEE,PgUp ,ScrLk,$0000
|
|
|
|
'
|
|
'$80 --- --- --- F7
|
|
' ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$00D6
|
|
|
|
|
|
keypad1 byte $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, "+-*/"
|
|
|
|
keypad2 byte "0123456789.", $0D, "+-*/"
|
|
|
|
|
|
table_shift
|
|
'
|
|
'$00 --- F9 --- F5 F3 F1 F2 F12
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D8,$0000,$00D4,$00D2,$00D0,$00D1,$00DB
|
|
|
|
'
|
|
'$08 --- F10 F8 F6 F4 TAB _°_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$00D9,$00D7,$00D5,$00D3,$0009,$00B0,$0000
|
|
|
|
' ALT-R Left CTRL-R
|
|
'$10 --- ALT-L SHIFT --- CTRL_L Q ! ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$F5F4,$00F0,$0000,$F3F2,$0051,$0021,$0000
|
|
|
|
' WIN-L
|
|
'$18 --- --- _Y_ S A W " ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0059,$0053,$0041,$0057,$0022,$F600
|
|
|
|
' WIN-R
|
|
'$20 --- C X D E $ SHF+3 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0043,$0058,$0044,$0045,$0024,$0014,$F700
|
|
|
|
' Apps
|
|
'$28 --- Spc V F T R % ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0020,$0056,$0046,$0054,$0052,$0025,Apps
|
|
|
|
' Power
|
|
'$30 --- N B H G _Z_ & ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$004E,$0042,$0048,$0047,$005A,$0026,Power
|
|
|
|
' Sleep
|
|
'$38 --- --- M J U / ( ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$004D,$004A,$0055,$002F,$0028,Sleep
|
|
|
|
'
|
|
'$40 --- ; K I O _=_ ) ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$003B,$004B,$0049,$004F,$003D,$0029,$0000
|
|
|
|
' (/)
|
|
'$48 --- : ___ L _OE_ P _sz_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$003A,$EF5F,$004C,$00D6,$0050,$003F,$0000
|
|
|
|
'
|
|
'$50 --- --- _AE_ --- _UE_ _'_ --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$00C4,$0000,$00DC,$0060,$0000,$0000
|
|
|
|
' CAPS Right (ENTER) Wk.up
|
|
'$58 LOCK SHIFT ENTER _*_ --- _'_ --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word CpsLk,$00F1,$EB0D,$002A,$0000,$0027,WkUp ,$0000
|
|
|
|
'
|
|
'$60 --- _>_ --- --- --- --- BkSpc ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$003E,$0000,$0000,$0000,$0000,BkSp ,$0000
|
|
|
|
' End Left Home
|
|
'$68 --- (1) --- (4) (7) --- --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,CrsEn,$0000,CrsLt,CrsHm,$0000,$0000,$0000
|
|
|
|
' Ins Del Down --- Right Up
|
|
'$70 (0) (.) (2) (5) (6) (8) Esc NumLock
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word Ins , Del ,CrsDn,$00E5,CrsRt,CrsUp, Esc ,NumLk
|
|
|
|
' PgDn PrScr PgUp
|
|
'$78 F11 (+) (3) (-) (*) (9) ScrLock ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $00DA,$00EC,PgDn ,$00ED,$DCEE,PgUp ,ScrLk,$0000
|
|
|
|
'
|
|
'$80 --- --- --- F7
|
|
' ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$00D6
|
|
|
|
|
|
|
|
table_alt_r
|
|
'
|
|
'$00 --- F9 --- F5 F3 F1 F2 F12
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0097,$0000,$0090,$009D,$009F,$009E,$0094
|
|
|
|
'
|
|
'$08 --- F10 F8 F6 F4 TAB _^_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0096,$0093,$0091,$009C,$0009,$0000,$0000
|
|
|
|
' ALT-R Left CTRL-R
|
|
'$10 --- ALT-L SHIFT --- CTRL_L q 1 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$F5F4,$00F0,$0000,$F3F2, "@", "¹", $0000
|
|
|
|
' WIN-L
|
|
'$18 --- --- _y_ s a w 2 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000, "²", $F600
|
|
|
|
' WIN-R
|
|
'$20 --- c x d e 4 3 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000, "€", $0000, "³", $F700
|
|
|
|
' Apps
|
|
'$28 --- Spc v f t r 5 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000,$0000,Apps
|
|
|
|
' Power
|
|
'$30 --- n b h g _z_ 6 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000,$0000,Power
|
|
|
|
' Sleep
|
|
'$38 --- --- m j u 7 8 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000, "µ", $0000,$0000, "{" , "[" ,Sleep
|
|
|
|
'
|
|
'$40 --- , k i o 0 9 ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000, "}", "]", $0000
|
|
|
|
' (/)
|
|
'$48 --- . _-_ l _oe_ p _sz_ ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000, "\", $0000
|
|
|
|
'
|
|
'$50 --- --- _ae_ --- _ue_ _'_ --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
|
|
|
|
' CAPS Right (ENTER) Wk.up
|
|
'$58 LOCK SHIFT ENTER _+_ --- # --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word CpsLk,$00F1,$EB0D, "~", $0000,$0000,WkUp ,$0000
|
|
|
|
'
|
|
'$60 --- _<_ --- --- --- --- BkSpc ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000, "|", $0000,$0000,$0000,$0000,BkSp ,$0000
|
|
|
|
' End Left Home
|
|
'$68 --- (1) --- (4) (7) --- --- ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0000,CrsEn,$0000,CrsLt,CrsHm,$0000,$0000,$0000
|
|
|
|
' Ins Del Down --- Right Up
|
|
'$70 (0) (.) (2) (5) (6) (8) Esc NumLock
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word Ins , Del ,CrsDn,$00E5,CrsRt,CrsUp, Esc ,NumLk
|
|
|
|
' PgDn PrScr PgUp
|
|
'$78 F11 (+) (3) (-) (*) (9) ScrLock ---
|
|
' ===== ===== ===== ===== ===== ===== ===== =====
|
|
word $0095,$00EC,PgDn ,$00ED,$DCEE,PgUp ,ScrLk,$0000
|
|
|
|
'
|
|
'$80 --- --- --- F7
|
|
' ===== ===== ===== =====
|
|
word $0000,$0000,$0000,$0092
|
|
|
|
|
|
{{keyboard-de end}}
|
|
|
|
'
|
|
'
|
|
' Uninitialized data
|
|
'
|
|
dmask res 1
|
|
cmask res 1
|
|
stat res 1
|
|
data res 1
|
|
data_s res 1 'Scancode-Storage (for keyboard-de)
|
|
x res 1
|
|
y res 1
|
|
t res 1
|
|
|
|
_head res 1 'write-only
|
|
_present res 1 'write-only
|
|
_states res 8 'write-only
|
|
_dpin res 1 'read-only at start
|
|
_cpin res 1 'read-only at start
|
|
_locks res 1 'read-only at start
|
|
_auto res 1 'read-only at start
|
|
|
|
''
|
|
''
|
|
'' _________
|
|
'' Key Codes
|
|
''
|
|
'' 00..DF = keypress and keystate
|
|
'' E0..FF = keystate only
|
|
''
|
|
''
|
|
'' 09 Tab
|
|
'' 0D Enter
|
|
'' 20 Space
|
|
'' 21 !
|
|
'' 22 "
|
|
'' 23 #
|
|
'' 24 $
|
|
'' 25 %
|
|
'' 26 &
|
|
'' 27 '
|
|
'' 28 (
|
|
'' 29 )
|
|
'' 2A *
|
|
'' 2B +
|
|
'' 2C ,
|
|
'' 2D -
|
|
'' 2E .
|
|
'' 2F /
|
|
'' 30 0..9
|
|
'' 3A :
|
|
'' 3B ;
|
|
'' 3C <
|
|
'' 3D =
|
|
'' 3E >
|
|
'' 3F ?
|
|
'' 40 @
|
|
'' 41..5A A..Z
|
|
'' 5B [
|
|
'' 5C \
|
|
'' 5D ]
|
|
'' 5E ^
|
|
'' 5F _
|
|
'' 60 `
|
|
'' 61..7A a..z
|
|
'' 7B {
|
|
'' 7C |
|
|
'' 7D }
|
|
'' 7E ~
|
|
''
|
|
'' 80-BF (future international character support)
|
|
''
|
|
'' C0 Left Arrow
|
|
'' C1 Right Arrow
|
|
'' C2 Up Arrow
|
|
'' C3 Down Arrow
|
|
'' C4 Home
|
|
'' C5 End
|
|
'' C6 Page Up
|
|
'' C7 Page Down
|
|
'' C8 Backspace
|
|
'' C9 Delete
|
|
'' CA Insert
|
|
'' CB Esc
|
|
'' CC Apps
|
|
'' CD Power
|
|
'' CE Sleep
|
|
'' CF Wakeup
|
|
''
|
|
'' D0..DB F1..F12
|
|
'' DC Print Screen
|
|
'' DD Scroll Lock
|
|
'' DE Caps Lock
|
|
'' DF Num Lock
|
|
''
|
|
'' E0..E9 Keypad 0..9
|
|
'' EA Keypad .
|
|
'' EB Keypad Enter
|
|
'' EC Keypad +
|
|
'' ED Keypad -
|
|
'' EE Keypad *
|
|
'' EF Keypad /
|
|
''
|
|
'' F0 Left Shift
|
|
'' F1 Right Shift
|
|
'' F2 Left Ctrl
|
|
'' F3 Right Ctrl
|
|
'' F4 Left Alt
|
|
'' F5 Right Alt
|
|
'' F6 Left Win
|
|
'' F7 Right Win
|
|
''
|
|
'' FD Scroll Lock State
|
|
'' FE Caps Lock State
|
|
'' FF Num Lock State
|
|
''
|
|
'' +100 if Shift
|
|
'' +200 if Ctrl
|
|
'' +400 if Alt
|
|
'' +800 if Win
|
|
''
|
|
'' eg. Ctrl-Alt-Delete = $6C9
|
|
''
|
|
''
|
|
'' Note: Driver will buffer up to 15 keystrokes, then ignore overflow.
|
|
|
|
{{
|
|
|
|
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
|
│ TERMS OF USE: MIT License │
|
|
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
|
|
│Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation │
|
|
│files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, │
|
|
│modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software│
|
|
│is furnished to do so, subject to the following conditions: │
|
|
│ │
|
|
│The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.│
|
|
│ │
|
|
│THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE │
|
|
│WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR │
|
|
│COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, │
|
|
│ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │
|
|
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
|
}} |