Author: wmb
Date: 2008-01-24 06:43:01 +0100 (Thu, 24 Jan 2008)
New Revision: 788
Modified:
dev/olpc/keyboard/selftest.fth
Log:
OLPC keyboard selftest - Changed from scanset 2 to scanset 1, so that
game key reports, which are always in scanset 1, don't confuse the
up/down handler.
Modified: dev/olpc/keyboard/selftest.fth
===================================================================
--- dev/olpc/keyboard/selftest.fth 2008-01-22 08:59:25 UTC (rev 787)
+++ dev/olpc/keyboard/selftest.fth 2008-01-24 05:43:01 UTC (rev 788)
@@ -87,13 +87,202 @@
5 0 do make-single-key loop
;
-\ Keyboard top row: key entries 0-0x18
-\ next row: key entries 0x19-0x26
-\ next row: key entries 0x27-0x31
-\ next row: key entries 0x35-0x41
-\ next row: key entries 0x42-0x4f
-\ next row: key entries 0x50-0x58
+0 [if]
+hex
+\ This is indexed by the IBM key number (the physical key number as
+\ shown on language-independent drawings of the keyboard layout since
+\ the original IBM documentation). The values are scanset1 codes.
+create (ibm#>scan1)
+\ 0 1 3 3 4 5 6 7 8 9
+ 00 c, 29 c, 02 c, 03 c, 04 c, 05 c, 06 c, 07 c, 08 c, 09 c, \
+ 0a c, 0b c, 0c c, 0d c, 00 c, 0e c, 0f c, 10 c, 11 c, 12 c, \ 1x
+ 13 c, 14 c, 15 c, 16 c, 17 c, 18 c, 19 c, 1a c, 1b c, 2b c, \ 2x
+ 3a c, 1e c, 1f c, 20 c, 21 c, 22 c, 23 c, 24 c, 25 c, 26 c, \ 3x
+ 27 c, 28 c, 00 c, 1c c, 2a c, 56 c, 2c c, 2d c, 2e c, 2f c, \ 4x
+ 30 c, 31 c, 32 c, 33 c, 34 c, 35 c, 73 c, 36 c, 1d c, 00 c, \ 5x
+ 38 c, 39 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ 6x
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ 7x
+ 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, 00 c, \ 8x
+ 45 c, 47 c, 4B c, 4F c, 00 c, 00 c, 48 c, 4C c, 50 c, 52 c, \ 9x
+ 37 c, 49 c, 4D c, 51 c, 53 c, 4A c, 4E c, 00 c, 1c c, 00 c, \ 1
+ 01 c, 00 c, 3b c, 3c c, 3d c, 3e c, 3f c, 40 c, 41 c, 42 c, \ 11x
+ 43 c, 44 c, 57 c, 58 c, 00 c, 46 c, 00 c, 00 c, 00 c, 00 c, \ 12x
+ 79 c, 00 c, 00 c, 5c c, 73 c, 6e c, 00 c, 00 c, 00 c, 00 c, \ 13x (analog intermediates)
+ 00 c, 00 c, 00 c, 00 c, 00 c, \ 14x
+\ A program to invert the table above. We used the inverted form.
+h# 80 buffer: sc1
+: invert-ibm ( -- )
+ sc1 h# 80 erase
+ d# 145 0 do
+ (ibm#>scan1) i + c@ ?dup if i swap sc1 + c! then
+ loop
+
+ h# 80 0 do
+ ." ( " i 2 u.r ." ) "
+ i 8 bounds do
+ sc1 i + c@ push-decimal 3 u.r pop-base ." c, "
+ loop
+ cr
+ 8 +loop
+;
+[then]
+
+\ This table is indexed by the (unescaped) scanset1 code, giving
+\ an IBM physical key number.
+
+decimal
+create (scan1>ibm#)
+\ 0/8 1/9 2/a 3/b 4/c 5/d 6/e 7/f
+( 0 ) 0 c, 110 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, \ 01 is esc
+( 8 ) 8 c, 9 c, 10 c, 11 c, 12 c, 13 c, 15 c, 16 c,
+( 10 ) 17 c, 18 c, 19 c, 20 c, 21 c, 22 c, 23 c, 24 c,
+( 18 ) 25 c, 26 c, 27 c, 28 c, 43 c, 58 c, 31 c, 32 c, \ 1d is ctrl, 1c is Enter
+( 20 ) 33 c, 34 c, 35 c, 36 c, 37 c, 38 c, 39 c, 40 c,
+( 28 ) 41 c, 1 c, 44 c, 29 c, 46 c, 47 c, 48 c, 49 c,
+( 30 ) 50 c, 51 c, 52 c, 53 c, 54 c, 55 c, 57 c, 100 c,
+( 38 ) 60 c, 61 c, 30 c, 112 c, 113 c, 114 c, 115 c, 116 c,
+( 40 ) 117 c, 118 c, 119 c, 120 c, 121 c, 90 c, 125 c, 91 c,
+( 48 ) 96 c, 101 c, 105 c, 92 c, 97 c, 102 c, 106 c, 93 c,
+( 50 ) 98 c, 103 c, 99 c, 104 c, 0 c, 0 c, 45 c, 122 c,
+( 58 ) 123 c, 59 c, 0 c, 0 c, 133 c, 0 c, 0 c, 0 c, \ scan h# 59 is Fn - ibm# d# 59
+( 60 ) 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c,
+( 68 ) 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 135 c, 0 c,
+( 70 ) 0 c, 0 c, 0 c, 56 c, 0 c, 0 c, 0 c, 0 c,
+( 78 ) 0 c, 130 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c,
+
+\ This should be a lookup table. It would be smaller that way
+: e0-scan1>ibm# ( scancode -- ibm# )
+ case
+ h# 38 of d# 62 endof \ R ALT
+
+\ For a standard PC keyboard
+\ h# 1c of d# 64 endof \ Numeric enter
+\ h# 1d of d# 64 endof \ R CTRL
+\ h# 52 of d# 75 endof \ Insert
+\ h# 53 of d# 76 endof \ Delete
+\ h# 47 of d# 80 endof \ Home
+\ h# 4f of d# 81 endof \ End
+\ h# 49 of d# 85 endof \ PageUp
+\ h# 51 of d# 86 endof \ PageDown
+
+ h# 3b of d# 112 endof \ Fn 1
+ h# 3c of d# 113 endof \ Fn 2
+ h# 3d of d# 114 endof \ Fn 3
+ h# 3e of d# 115 endof \ Fn 4
+ h# 3f of d# 116 endof \ Fn 5
+ h# 40 of d# 117 endof \ Fn 6
+ h# 41 of d# 118 endof \ Fn 7
+ h# 42 of d# 119 endof \ Fn 8
+ h# 43 of d# 120 endof \ Fn 9
+ h# 44 of d# 121 endof \ Fn 10
+ h# 57 of d# 122 endof \ Fn 11
+ h# 58 of d# 123 endof \ Fn 12
+
+ h# 4b of d# 79 endof \ Left Arrow
+ h# 48 of d# 83 endof \ Up Arrow
+ h# 50 of d# 84 endof \ Down Arrow
+ h# 4d of d# 89 endof \ Right Arrow
+
+\ OLPC-specific
+ h# 47 of d# 79 endof \ Home
+ h# 4f of d# 89 endof \ End
+ h# 49 of d# 83 endof \ PageUp
+ h# 51 of d# 84 endof \ PageDown
+ h# 78 of d# 135 endof \ Fn View Source
+ h# 79 of d# 135 endof \ View Source
+ h# 77 of d# 136 endof \ Fn 1.5
+ h# 76 of d# 137 endof \ Fn 2.5
+ h# 75 of d# 138 endof \ Fn 3.5
+ h# 74 of d# 139 endof \ Fn 5.5
+ h# 73 of d# 140 endof \ Fn 6.5
+ h# 72 of d# 141 endof \ Fn 7.5
+ h# 71 of d# 142 endof \ Fn 9.5
+ h# 70 of d# 143 endof \ Fn 10.5
+ h# 6f of d# 144 endof \ Fn 11.5
+
+ h# 64 of d# 145 endof \ Fn Chat
+ h# 6e of d# 145 endof \ Chat
+
+ h# 01 of d# 110 endof \ Fn Esc
+ h# 5a of d# 129 endof \ Fn Frame
+ h# 5d of d# 129 endof \ Frame
+ h# 53 of d# 15 endof \ Fn Erase
+ h# 52 of d# 57 endof \ Fn R-shift
+ h# 7e of d# 56 endof \ Language
+
+ h# 5b of d# 127 endof \ L grab
+ h# 56 of d# 61 endof \ Fn space
+ h# 5c of d# 128 endof \ F grab
+
+ ( default ) 0 swap \ Not recognized
+ endcase
+;
+
+: scan1>ibm# ( scancode1 esc? -- ibm# )
+ if e0-scan1>ibm# else (scan1>ibm#) + c@ then
+;
+
+\ "key#" is a physical location on the screen
+\ "ibm#" is the key number as shown on the original IBM PC documents
+\ These keynum values are from the ALPS spec "CL1-matrix-20060920.pdf"
+decimal
+create ibm#s
+ \ Top row, key#s 0x00-0x18
+ 110 c, 135 c, \ ESC, view source
+ 112 c, 136 c, 113 c, 137 c, 114 c, 138 c, 115 c, \ Left bar
+ 116 c, 139 c, 117 c, 140 c, 118 c, 141 c, 119 c, \ Middle bar
+ 120 c, 142 c, 121 c, 143 c, 122 c, 144 c, 123 c, \ Right bar
+ 145 c, 129 c, \ chat, frame
+
+ \ Number row - key#s 0x19-0x26
+ 1 c, 2 c, 3 c, 4 c, 5 c, 6 c, 7 c, 8 c, 9 c, 10 c, 11 c, 12 c, 13 c, 15 c,
+
+ \ Top alpha row - key#s 0x27-0x34
+ 16 c, 17 c, 18 c, 19 c, 20 c, 21 c, 22 c, 23 c, 24 c, 25 c, 26 c, 27 c, 28 c, 43 c, \ tab, chars, enter
+
+ \ Middle alpha row - key#s 0x35-0x41
+ 58 c, 31 c, 32 c, 33 c, 34 c, 35 c, 36 c, 37 c, 38 c, 39 c, 40 c, 41 c, 29 c, \ ctrl, chars
+
+ \ Bottom alpha row - key#s 0x42-0x4f
+ 44 c, 46 c, 47 c, 48 c, 49 c, 50 c, 51 c, 52 c, 53 c, 54 c, 55 c, 57 c, 83 c, 56 c, \ shift, chars, shift, up, times
+
+ \ Function row - key#s 0x50 - 0x58
+ 59 c, 127 c, 60 c, 61 c, 62 c, 128 c, 79 c, 84 c, 89 c, \ Fn, lgrab, alt, space, altgr, rgrab, left, down, right
+here ibm#s - constant /ibm#s
+
+: ibm#>key# ( ibm# -- true | key# false )
+ /ibm#s 0 ?do ( ibm# )
+ dup ibm#s i + c@ = if
+ drop i false unloop exit
+ then
+ loop ( ibm# )
+ drop true
+;
+
+0 [if]
+\ This is a program to invert the ibm#s table
+d# 145 buffer: sc2
+: invert-key ( -- )
+ sc2 d# 145 erase
+ h# 59 0 do
+ i ibm#s i + c@ sc2 + c!
+ loop
+
+ d# 145 0 do
+ ." ( " i push-decimal 3 u.r pop-base ." ) "
+ i d# 10 bounds do
+ sc2 i + c@ push-hex 2 u.r pop-base ." c, "
+ loop
+ cr
+ d# 10 +loop
+;
+[then]
+
+0 [if]
+\ These are maps from scanset 2 to key position numbers.
+\ They are no longer used
+hex
create raw-scancode
( -0 ) -1 c, 10 c, 0d c, 09 c, 06 c, 02 c, 04 c, 16 c,
( 08 ) -1 c, 12 c, 0f c, 0b c, 08 c, 27 c, 19 c, 50 c,
@@ -131,13 +320,20 @@
( 78 ) 14 c, -1 c, 57 c, -1 c, -1 c, 4e c, -1 c, -1 c,
raw-scancode value cur-sc-table
+[then]
h# 07ff constant pressed-key-color
h# 001f constant idle-key-color
h# ffff constant kbd-bc
-: scancode->key ( scancode -- key# ) cur-sc-table + c@ ;
+0 value esc?
+: scan1->key# ( scancode -- true | key# false )
+ esc? scan1>ibm#
+ ?dup 0= if true exit then
+ ibm#>key#
+;
+
: draw-key ( key# color -- )
swap
key-adr >r
@@ -158,33 +354,31 @@
;
false value verbose?
-false value exit-selftest?
-false value up-key?
-: process-raw ( scan-code -- )
+: process-raw ( scan-code -- exit? )
verbose? if dup u. then
- dup h# f0 = if
- true to up-key? drop
- else
dup h# e0 = if
- e0-scancode to cur-sc-table drop
+ true to esc?
else
- scancode->key dup h# ff = if
- drop
- else
- up-key? if dup 0= to exit-selftest? key-up else key-down then
+ dup h# 7f and scan1->key# if ( scan )
+ drop ( )
+ else ( scan key# )
+ swap h# 80 and if ( key# )
+ dup key-up ( key# )
+ 0= if true exit then ( )
+ else ( key# )
+ key-down ( )
+ then ( )
then
- false to up-key?
- raw-scancode to cur-sc-table
- then then
+ false to esc?
+ then
+ false
;
: selftest-keys ( -- )
- raw-scancode to cur-sc-table
- false to exit-selftest? false to up-key?
+ false to esc?
begin
- get-data? if process-raw then
- exit-selftest?
+ get-data? if process-raw else false then ( exit? )
until
;
@@ -194,9 +388,12 @@
open 0= if true exit then
make-keys
cursor-off draw-keyboard
- toss-keys " translation-off" $call-parent
+\ toss-keys " translation-off" $call-parent
+ true to locked?
selftest-keys
- " translation-on" $call-parent toss-keys cursor-on
+ false to locked?
+\ " translation-on" $call-parent toss-keys
+ cursor-on
screen-ih iselect erase-screen iunselect
page
close