From: <Сохранено Windows Internet Explorer 8>
Subject: LK201 Interface
Date: Thu, 16 Apr 2009 19:38:01 +0300
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0025_01C9BECA.DAA6DE50"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0025_01C9BECA.DAA6DE50
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>LK201 Interface</TITLE>
<META content=3D"text/html; charset=3DISO-8859-1" =
http-equiv=3DContent-Type>
<META name=3DGENERATOR content=3D"MSHTML 8.00.6001.18702"><LINK=20
title=3D"Welcome to The NetBSD Project: Of course it runs NetBSD." =
rel=3Dhome=20
href=3D"../../../../."><LINK title=3D"Hardware Documentation - Machines" =
rel=3Dup=20
href=3D"../../../../docs/Hardware/Machines/."><LINK=20
title=3D"Advanced RISC Computing (ARC) Specification for the Advanced =
Computing Environment (ACE)"=20
rel=3Dprevious href=3D"../../../../docs/Hardware/Machines/ARC/."><LINK=20
title=3D"LK201 Keycodes and Keyboard Divisions" rel=3Dnext=20
href=3D"../../../../docs/Hardware/Machines/DEC/lk201_keycodes.html"><LINK=
=20
title=3D"Advanced RISC Computing (ARC) Specification for the Advanced =
Computing Environment (ACE)"=20
rel=3Dfirst href=3D"../../../../docs/Hardware/Machines/ARC/."><LINK=20
title=3D"Hardware Documentation - Machines DEC - VAX hardware reference" =
rel=3Dlast=20
href=3D"../../../../docs/Hardware/Machines/DEC/vax/."><LINK =
rel=3Dstylesheet=20
type=3Dtext/css href=3D"http://www.netbsd.org/global.css"></HEAD>
<BODY class=3Dwebsite>
<DIV class=3Dwebpage><A name=3Ddocs-Hardware-Machines-DEC-lk201></A>
<DIV id=3Dtop><A class=3D"doNotDisplay doNotPrint"=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#mainC=
ontent">Skip=20
to main content.</A></DIV>
<DIV id=3Dheader>
<DIV class=3DtopNavigation><SPAN>=BB&nbsp;</SPAN><A=20
href=3D"http://www.netbsd.org/docs/guide/en/"> The Guide</A> | <A=20
href=3D"http://man.netbsd.org/">Manual pages</A> | <A=20
href=3D"http://www.netbsd.org/mailinglists/">Mailing lists</A> and <A=20
href=3D"http://mail-index.netbsd.org/">Archives</A> | <A=20
href=3D"http://cvsweb.netbsd.org/">CVS repository</A> | <A=20
href=3D"http://www.netbsd.org/cgi-bin/sendpr.cgi?gndb=3Dnetbsd">Report</A=
> or <A=20
href=3D"http://www.netbsd.org/support/query-pr.html">query</A> a bug | =
<A=20
href=3D"http://www.netbsd.org/docs/software/packages.html">Software =
Packages=20
</A></DIV>
<DIV class=3DcentralHeader><A href=3D"http://www.netbsd.org/"><IMG=20
alt=3D"[NetBSD Logo]" =
src=3D"http://www.netbsd.org/images/NetBSD-headerlogo.png"=20
width=3D506 height=3D90></A>
<DIV class=3DheaderTools>
<DIV id=3DheaderSearch>
<FORM method=3Dget action=3Dhttp://www.google.com/custom><INPUT =
class=3DwhiteOnBlack=20
onfocus=3D"if(this.value=3D=3Dthis.defaultValue ) this.value=3D'';" =
value=3DSearch=20
maxLength=3D255 size=3D12 name=3Dq><INPUT=20
value=3DL:http://www.NetBSD.org/images/NetBSD-smaller.png;LH:200;LW:200;A=
H:center;AWFID:4f6b0499f0f58d2c;=20
type=3Dhidden name=3Dcof><INPUT value=3DNetBSD.org type=3Dhidden =
name=3Ddomains><INPUT=20
value=3Dwww.NetBSD.org type=3Dhidden name=3Dsitesearch><INPUT =
value=3DSearch type=3Dsubmit> </FORM></DIV></DIV></DIV>
<DIV class=3DnavBar><SPAN class=3DdoNotDisplay>Navigation: </SPAN><A=20
href=3D"http://www.netbsd.org/">Home</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/about/">About</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/gallery/">Gallery</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/releases/">Download</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/docs/">Documentation</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/support/">Support</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/community/">Community</A>&nbsp;|&nbsp; <A=20
href=3D"http://www.netbsd.org/ports/">Ports</A> </DIV></DIV>
<DIV id=3Dcontent>
<DIV class=3DfullWidth>
<DIV class=3DrowOfBoxes>
<H1>LK201 Interface</H1>
<H2 class=3Dtitle>LK201 Keyboard Interface</H2>
<H3 class=3Dtitle><A name=3D"">Overview</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#intro=
duction">Introduction=20
  and Purpose</A></LI></UL>
<H3 class=3Dtitle><A name=3D"">Electrical Interface</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#elect=
rical">Electrical=20
  Specifications</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#pinou=
t">Connector=20
  Pinout</A> </LI></UL>
<H3 class=3Dtitle><A name=3D"">Communications from the Keyboard to the=20
Computer</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#lk2de=
c">Overview</A>=20

  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#kbdmo=
des">Keyboard=20
  Modes</A> </LI></UL>
<H3 class=3Dtitle><A name=3D"">Communications from the Computer to the=20
Keyboard</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#dec2l=
k">Overview</A>=20

  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#led_c=
ontrol">LED=20
  Control</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#click=
_control">Key=20
  Click Control</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#bell_=
control">Bell=20
  Control</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#key_c=
ontrol">Key=20
  Control</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#ar_co=
ntrol">Autorepeat=20
  Control</A>=20
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#power=
_up">Power-Up=20
  and Self Test</A> </LI></UL>
<H3 class=3Dtitle><A name=3D"">References</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#refer=
ences">Sources=20
  of this Information</A></LI></UL>
<H3 class=3Dtitle><A name=3D"">DISCLAIMER</A></H3>
<UL>
  <LI><A=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#nosmo=
ke">No=20
  Fault</A></LI></UL>
<HR>

<H3 class=3Dtitle>Overview</H3>
<H4 class=3Dtitle><A name=3Dintroduction></A>Introduction and Purpose =
(<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>This page is intended to detail the DEC LK201 keyboard interface. If =
anything=20
on this page is unclear or incorrect, please contact <A class=3Dulink=20
href=3D"mailto:dmcmahill@NetBSD.org" target=3D_top>me</A> and I will do =
my best to=20
clarify and/or correct the document.</P>
<HR>

<H3 class=3Dtitle>Electrical Interface</H3>
<H4 class=3Dtitle><A name=3Delectrical></A>Electrical Specifications (<A =

href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>This section describes the electrical interface between the LK201 =
Keyboard=20
and the computer. Some of these specifications came from publication=20
EK-366AA-OG-002 "DECstation 5000, Model 200 Hardware Operator's Guide, =
April=20
1990". The rest of the items in this section were experimentally =
determined=20
(like the pin outs).</P>
<P>The LK201 is powered from a 12 Volt supply generated by the computer. =
The=20
keyboard and the computer communicate via a fairly standard serial =
interface.=20
The key specifications are listed here:</P>
<DIV class=3Ditemizedlist>
<UL type=3Ddisc>
  <LI>Bidirectional asynchronous serial communication: 4800 baud, 8N1.=20
  <LI>Serial interface levels: EIA RS 423 (ie signals swing +/- 5 =
Volts).=20
  <LI>Power input: 4.2 Watts Max. 350 mA @ 11.8 Volts +/- 6%. (NOTE: =
This is the=20
  value quoted in the manual, but I measured 30 mA on a working LK201. =
Perhaps=20
  the 350 mA is the maximum the computer can supply?) </LI></UL></DIV>
<H4 class=3Dtitle><A name=3Dpinout></A>Connector Pinout (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The pinout of the connector on the LK201 and on the computer in jpeg =
and=20
postscript form are linked below.</P>
<DIV class=3Ditemizedlist>
<UL type=3Ddisc>
  <LI><A class=3Dulink=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_connector.=
jpg"=20
  target=3D_top>LK201 Connector Diagram (jpeg 29k)</A>=20
  <LI><A class=3Dulink=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_connector.=
ps"=20
  target=3D_top>LK201 Connector Diagram (postscript 12k)</A> =
</LI></UL></DIV><PRE class=3Dprogramlisting>
    |----- data -&lt; -------------------------------------------|
    |    |-------- &gt;- Power -----------------------------|    |
    |    |    |------------- GND -------------------|    |    |
    |    |    |    |------------- &lt;- data -----|    |    |    |
   -------------------                        -------------------
  | "    "    "    "  |                      | "    "    "    "  |
  | L    V    G    D  |                      | D    G    V    L  |
  | K    +    N    E  |                      | E    N    +    K  |
  | -&gt;        D    C  |                      | C    D         -&gt; |
  | D             -&gt;  |                      | -&gt;             D  |
  | E              L  |                      | L              E  |
  | C              K  |                      | K              C  |
   --               --                        --               --
     |             |                            |             |
      --         --                              --         --
        |       |                                  |       |
         -------                                    -------

     Looking into the                       Looking into the DECstation
     LK201 Connector                                 Connector
   (Socket on keyboard)                        (Socket on DECstation)

</PRE>
<HR>

<H3 class=3Dtitle>Communications from the Keyboard to the Computer</H3>
<H4 class=3Dtitle><A name=3Dlk2dec></A>Overview (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The next two sections will refer to the following table and/or =
diagram:</P>
<DIV class=3Ditemizedlist>
<UL type=3Ddisc>
  <LI><A class=3Dulink=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201_keycodes.h=
tml"=20
  target=3D_top>LK201 Keycode and Keyboard Division Table (html)</A>=20
  <LI><A class=3Dulink=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_large_keyc=
odes.jpg"=20
  target=3D_top>LK201 Keycode and Keyboard Division Chart (in color) =
(jpg 67k)</A>=20

  <LI><A class=3Dulink=20
  =
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_keycode.ps=
"=20
  target=3D_top>LK201 Keycode and Keyboard Division Chart (postscript =
136k)</A>=20
  </LI></UL></DIV>
<P>(I had a hard time getting a jpeg version which was legible so please =
bear=20
with me on the postscript format for now.)</P>
<H4 class=3Dtitle><A name=3Dkbdmodes></A>Keyboard Modes (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The LK201 keyboard has its keys divided into 14 distinct groups. =
These groups=20
are indicated on the <A class=3Dulink=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#lk2de=
c"=20
target=3D_top>LK201 Keycode and Keyboard Division Chart/Table</A>. Each =
of the=20
groups is separately programmed for its behaviour with respect to =
keycode=20
generation. There are three operating modes to select from.</P>
<DIV class=3Ditemizedlist>
<UL type=3Ddisc>
  <LI><CODE class=3Dcode>LK_DOWN</CODE> mode: In this mode, the code =
indicated on=20
  the keycode chart is transmitted by the keyboard when the =
corresponding key is=20
  pressed. If held down, the key does <SPAN =
class=3Demphasis><EM>not</EM></SPAN>=20
  repeat and no further codes are generated.=20
  <LI><CODE class=3Dcode>LK_AUTODOWN</CODE> mode: In this mode, the code =
indicated=20
  on the keycode chart is transmitted by the keyboard when the =
corresponding key=20
  is pressed. If held down the LK201 transmits the <CODE=20
  class=3Dcode>LK_REPEAT</CODE> value, <CODE =
class=3Dcode>0xB4</CODE>,repeatedly at=20
  the key repeat rate. It is up to the computer to know what key is =
being=20
  repeated.=20
  <LI><CODE class=3Dcode>LK_UPDOWN</CODE> mode: In this mode, the code =
indicated=20
  on the keycode chart is transmitted by the keyboard when the =
corresponding key=20
  is pressed. In addition, a code is generated when the key is released. =
The=20
  release code is determined by the following rule. If no other keys in =
<CODE=20
  class=3Dcode>LK_UPDOWN</CODE> mode are pressed in addition to the one =
being=20
  released, the <CODE class=3Dcode>LK_ALLUP</CODE>, <CODE =
class=3Dcode>0xB3</CODE>=20
  is generated. If there is another key currently pressed which has been =

  programmed for <CODE class=3Dcode>LK_UPDOWN</CODE> mode, the code =
indicated on=20
  the keycode chart is used for the key release code. If held, the key =
does=20
  <SPAN class=3Demphasis><EM>not</EM></SPAN> repeat. <CODE=20
  class=3Dcode>LK_UPDOWN</CODE> mode is used for keys such as <SPAN=20
  class=3Demphasis><EM>SHIFT</EM></SPAN>, and <SPAN=20
  class=3Demphasis><EM>CONTROL</EM></SPAN>. The computer recognizes that =
the <SPAN=20
  class=3Demphasis><EM>SHIFT</EM></SPAN> (or other "modifying" key) has =
been=20
  pressed and not released. In this manner, the computer knows to use =
the=20
  shifted character set. Once released, the computer sees the release =
code and=20
  switches back to the normal character set. </LI></UL></DIV>
<HR>

<H3 class=3Dtitle>Communications from the Computer to the Keyboard</H3>
<H4 class=3Dtitle><A name=3Ddec2lk></A>Overview (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The LK201 accepts a handful of commands from the computer. These =
commands=20
include programming the operational mode of each of the 14 groups of =
keys,=20
control of the 4 LED's, control of the bell, and control of =
keyclicks.</P>
<P>Commands are send to the keyboard as either single byte commands or =
as a=20
command byte followed by one data byte. Once again, the communication is =
4800=20
baud serial.</P>
<H4 class=3Dtitle><A name=3Dled_control></A>LED Control (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The 4 LED's on the LK201 are controlled by the computer. Either the =
command=20
<CODE class=3Dcode>LK_LED_ENABLE</CODE> or <CODE =
class=3Dcode>LK_LED_DISABLE</CODE>=20
is sent followed by 1 byte which indicates which of the 4 LED's are =
affected.=20
The lower 4 bits of the data byte correspond to the 4 LED's. For =
example, to=20
turn on the caps lock LED, the following two bytes would be =
sent:</P><CODE=20
class=3Dcode>LK_LED_ENABLE LED_LOCK </CODE>
<P>A sample code fragment which defines the LED control codes is shown =
here.</P><PRE class=3Dprogramlisting>/* requires LED number data */=20
#define LK_LED_ENABLE   0x13            /* light LED        */=20
#define LK_LED_DISABLE  0x11            /* turn off LED     */=20

#define LED_WAIT        0x81            /* Wait LED         */=20
#define LED_COMP        0x82            /* Compose LED      */=20
#define LED_LOCK        0x84            /* Lock LED         */=20
#define LED_HOLD        0x88            /* Hold Screen LED  */=20
#define LED_ALL         0x8F            /* All LED's        */
</PRE>
<H4 class=3Dtitle><A name=3Dclick_control></A>Key Click Control (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The LK201 accepts several commands relating to key clicks.</P><PRE =
class=3Dprogramlisting>/* Requires volume data byte */
#define LK_CL_ENABLE    0x1B   /* keyclick enable.  Requires volume   */
                               /* byte.  This does not affect the     */
			       /* SHIFT key.  The CTRL key requires   */
                               /* LK_CL_ENABLE and LK_CCL_ENABLE to   */
			       /* have been sent before it clicks.    */
			       /* All other keys are only controlled  */   =20
			       /* by LK_CL_ENABLE.                    */
    =20
#define LK_CCL_ENABLE   0xBB   /* Enable keyclicks for the CTRL key.  */
                               /* The CTRL keyclick volume is set to  */
			       /* be the same as the rest of the keys */
			       /* LK_CCL_ENABLE sets a flag in the    */
			       /* keyboard with is logically AND'ed   */
			       /* with the LK_CL_ENABLE flag to enable*/
			       /* CTRL key keyclicks.                 */

#define LK_CL_DISABLE   0x99   /* keyclick disable                    */
#define LK_CCL_DISABLE  0xB9   /* CTRL key keyclick disable           */

#define LK_SOUND_CLICK  0x9F   /* causes the LK201 to sound a keyclick*/

/* max volume is 0, lowest is 0x7 */
#define LK_PARAM_VOLUME(v)              (0x80|((v)&amp;0x7))
</PRE>
<P>For example, to enable keyclicks at full volume, the following data =
would be=20
sent to the keyboard:</P><CODE class=3Dcode>LK_CL_ENABLE =
LK_PARAM_VOLUME(0x00)=20
</CODE>
<H4 class=3Dtitle><A name=3Dbell_control></A>Bell Control (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The keyboard bell control commands work in the same manner as the =
keyclick=20
commands. The keyboard never generates a bell sound on its own. A bell =
sound is=20
always at the command of the computer.</P><PRE class=3Dprogramlisting>/* =
requires bell volume data */=20
#define LK_BELL_ENABLE  0x23   /* enable the keyboard bell.  Requires */
                               /* volume data byte.                   */

#define LK_BELL_DISABLE 0xA1   /* disable the keyboard bell.          */

#define LK_RING_BELL    0xA7   /* ring the keyboard bell              */ =


/* max volume is 0, lowest is 0x7 */=20
#define LK_PARAM_VOLUME(v)              (0x80|((v)&amp;0x7))
</PRE>
<H4 class=3Dtitle><A name=3Dkey_control></A>Key Control (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The LK201 provides 3 different operating modes for the keys. In =
addition, the=20
keyboard is divided into 14 different groups which are shown in the <A=20
class=3Dulink=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/LK201_keycode.ps=
"=20
target=3D_top>LK201 Keycode and Keyboard Division Chart (postscript =
136k)</A> and=20
also in the <A class=3Dulink=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201_keycodes.h=
tml"=20
target=3D_top>LK201 Keycode and Keyboard Division Table (html)</A>. The =
three=20
operating modes are discussed in <A class=3Dulink=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#lk2de=
c"=20
target=3D_top>2. Communications from the Keyboard to the =
Computer</A>.</P>
<P>Programming of the keyboard mode is accomplished via 1 byte per group =
of keys=20
on the keyboard. The macro <CODE class=3Dcode>LK_CMD_MODE()</CODE> is =
used to form=20
the command. For example, to set division 2 (the numeric keypad) to =
LK_AUTODOWN=20
mode, we would transmit:</P><CODE =
class=3Dcode>LK_CMD_MODE(LK_AUTODOWN,2)</CODE>=20
<P>Upon successful receipt of the command, the LK201 responds with <CODE =

class=3Dcode>LK_MODECHG_ACK</CODE>. The macros and constants used for =
key mode=20
programming are listed below.</P>
<P>The details of the meaning of each bit in the mode command are listed =

below.</P><PRE class=3Dprogramlisting>bit 7:      PARAM bit.
            1 =3D no parameter to follow
            0 =3D parameter will follow

bits 3-6:   keyboard division

bits 1-2:   mode  (00 =3D down, 01=3Dautodown, 11=3Dupdown)

bit 0:      "type"  don't know what that means, but should be set to 0.
</PRE>
<P>In the examples below, the PARAM bit is set to 1 meaning that no =
parameter=20
will follow.</P><PRE class=3Dprogramlisting>#define LK_UPDOWN           =
0x86=20
#define LK_AUTODOWN         0x82=20
#define LK_DOWN             0x80=20

#define LK_CMD_MODE(m,div)  ((m)|((div)&lt;&lt;3))=20

#define LK_MODECHG_ACK      0xBA    /* sent by the keyboard to =
acknowledge a  */
                                    /* successful mode change.           =
     */


#define LK_PFX_KEYDOWN      0xB9    /* indicates that the next byte is a =
key- */
                                    /* code for a key already down in a  =
     */
                                    /* division that has been changed to =
     */
                                    /* LK_UPDOWN.  I think this means =
that if */
                                    /* for example, the 'a' key is in =
LK_DOWN */
                                    /* mode and the key is being held =
down and*/
                                    /* division 1 is switched to =
LK_UPDOWN    */
                                    /* mode, the keyboard will produce =
the    */
                                    /* byte LK_PFX_KEYDOWN followed by =
0xC2   */
                                    /* (KEY_A).                          =
     */

#define LK_CMD_RPT_TO_DOWN  0xD9    /* This command causes all divisions =
which */
                                    /* are programmed for LK_AUTODOWN =
mode to  */
                                    /* be switched to LK_DOWN mode.      =
      */


#define LK_CMD_ENB_RPT      0xE3    /* enables auto repeat on the keys   =
      */
                                    /* which are in LK_AUTODOWN mode     =
      */

#define LK_CMD_DIS_RPT      0xE1    /* disables auto repeat on all keys, =
but   */
                                    /* does not change the mode that the =
      */
                                    /* divisions are programmed to.      =
      */

#define LK_CMD_TMP_NORPT    0xD1    /* temporary auto repeat disable.  =
This    */
                                    /* command disables auto repeat for =
the key*/
                                    /* which is currently pressed down.  =
Auto  */
                                    /* repeat is re-enabled when another =
key is*/
                                    /* pressed.                          =
      */


#define LK_INPUT_ERROR      0xB6    /* sent by the keyboard if it =
receives an  */
                                    /* invalid command.                  =
      */
</PRE>
<P>The LK201 contains 4 autorepeat registers. Each autorepeat register =
controls=20
how quickly keys repeat and if repeating is enabled. The 4 autorepeat =
registers=20
are independent. Each keyboard division can be associated with 1 of the =
4=20
registers. To associate a keyboard division with a particular autorepeat =

register, use the same command as setting the key division mode except =
set the=20
PARAM bit to 0 and send a second byte which controls which autorepeat =
register=20
is selected. The format of the second byte is:</P><PRE =
class=3Dprogramlisting>bit7:      1

bits 2-6:  0

bits 0-1:  number of the autorepeat register 00,01,10,11
</PRE>
<P>For example, to set division 2 (the numeric keypad) to LK_AUTODOWN =
mode, and=20
associate it with autorepeat register number 2, we would transmit: <CODE =

class=3Dcode>LK_CMD_MODE_AR(LK_AUTODOWN,2) 0x82</CODE> where the macro =
<CODE=20
class=3Dcode>LK_CMD_MODE_AR</CODE> is defined below.</P><PRE =
class=3Dprogramlisting>#define LK_CMD_MODE_AR(m,div,arreg)  (0x7F &amp; =
((m)|((div)&lt;&lt;3)) )
</PRE>
<H4 class=3Dtitle><A name=3Dar_control></A>Autorepeat Control (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>The autorepeat rate is programmed by a 3 byte command.</P><PRE =
class=3Dprogramlisting>first byte:
bit7:      0  (means more bytes to come after this one)

bits 3-6:  1 (means we're calling the rate change command)

bits 1-2:  number of autorepeat register (00,01,10,11)

bit 0:     "type" set to 0

second byte:

bit7:      0  (more bytes to come after this one)

bits0-6:   time out value (how long to wait before beginning to =
autorepeat)
           this is in 5 ms increments.  allowed range is 5 ms-630 ms. =20

note:  don't send 635ms, 0111 1111 is a reserved for internal use code.
note:  don't send 0ms,   0000 0000 is illegal.

third byte:

bit7:      1 (no more bytes after this one)

bits0-6:   autorepeat rate in number of generated key presses/second.
           lowest rate is 12 Hz. =20

note:  125Hz  (1111 1101) must not be sent (its identical to the powerup
       command)
</PRE>
<H4 class=3Dtitle><A name=3Dpower_up></A>Power-Up and Self Test (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>This section details the self test features and the power up sequence =
of the=20
keyboard. Upon power-up, the keyboard performs a self test in 70 ms or =
less. The=20
results are sent to the computer. The power-up self test results consist =
of 4=20
bytes.</P><PRE class=3Dprogramlisting>Byte 1:    Keyboard ID stored in =
the keyboard firmware.  On
           my LK201, this is 0x01.

Byte 2:    Keyboard ID read from hardware jumpers.  The documentation
           I have doesn't seem to quite match my keyboard (the docs say
           that the keyboard uses an 8051 microcontroller while mine
           uses a 68HC05C4).  Anyway, the docs and my keyboard both say
           the result is 0x00.

Byte 3:    Error code.  This byte indicates the result of the self test.
           Possible values are:

                               0x00    No Error
#define    LK_KDOWN_ERROR      0x3D    /* Key down on powerup error     =
*/
#define    LK_POWER_ERROR      0x3E    /* Keyboard failure on pwrup tst =
*/

Byte 4:    Keycode.  This byte contains the keycode of which key (if =
any)
           was pressed down on powerup.  If no keys were pressed, this
           byte is 0x00.
</PRE>
<P>If the keyboard passes all power up tests with no error, the =
resulting=20
sequence sent to the computer is:</P><PRE class=3Dprogramlisting>0x01 =
0x00 0x00 0x00 </PRE>
<P>If the keyboard finds a key down on the first scan, it continues to =
look for=20
an all up condition. When all keys are released, the keyboard transmits =
the=20
correct 4 byte sequence (0x01 0x00 0x00 0x00).</P>
<P>Additional test commands are listed below.</P><PRE =
class=3Dprogramlisting>#define LK_CMD_POWER_UP     0xFD    /* This =
command initiates the keyboard    */
                                    /* power up sequence.                =
     */=20

#define LK_CMD_REQ_ID       0xAB    /* This command requests the 2 byte  =
     */
                                    /* keyboard ID.  The keyboard =
responds    */
                                    /* with the same Byte1 and Byte2 as =
in    */
                                    /* the power up self test.           =
     */

#define LK_CMD_SET_DEFAULTS 0xD3    /* Restores the keyboard to its =
default   */
                                    /* state.  This command sets the:    =
     */
                                    /* division mode settings,           =
     */
                                    /* auto-repeat interval and timeout =
rate, */
                                    /* auto-repeat buffer selections,    =
     */
                                    /* audio volume,                     =
     */
                                    /* ctrl key keyclick setting,        =
     */
                                    /* to their power up defaults.       =
     */

#define LK_CMD_TEST_MODE    0xCB    /* causes the keyboard to enter the  =
     */
                                    /* factory test mode.  This command  =
     */
                                    /* should not be used.  If received, =
the  */
                                    /* keyboard responds with =
LK_TESTMODE_ACK */
                                    /* By sending a 0x80, the keyboard =
will   */
                                    /* leave factory test mode and jump =
to the*/
                                    /* power up sequence.                =
     */

#define LK_TESTMODE_ACK     0xB8    /* sent by the keyboard in response =
to    */
                                    /* the LK_CMD_TEST_MODE command.     =
     */
</PRE>
<P><A name=3Dmystery></A>The following are some additional keyboard =
control=20
commands which didn't seem to fit anywhere else.</P><PRE =
class=3Dprogramlisting>#define LK_CMD_INHIBIT      0xB9    /* This =
command suspends transmission     */
                                    /* the keyboard to the computer.  =
The     */
                                    /* keyboard responds with =
LK_KBDLOCK_ACK  */
                                    /* and turns on the LOCK LED.        =
     */

#define LK_KDBLOCK_ACK      0xB7    /* send by the keyboard in response =
to    */
                                    /* the LK_CMD_INHIBIT command.       =
     */

#define LK_CMD_RESUME       0x8B    /* Resumes normal keyboard operation =
after*/
                                    /* the LK_CMD_INHIBIT command.       =
     */

#define LK_OUTPUT_ERROR     0xB5    /* If any keystrokes were lost while =
the  */
                                    /* keyboard was locked =
(LK_CMD_INHIBIT),  */
                                    /* then LK_OUTPUT_ERROR is generated =
by   */
                                    /* the keyboard when LK_CMD_RESUME =
is     */
                                    /* received.                         =
     */
</PRE>
<HR>

<H3 class=3Dtitle>References</H3>
<H4 class=3Dtitle><A name=3Dreferences></A>Sources of this Information =
(<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>Much of this information came from NetBSD sources from mid-March, =
1998. In=20
particular, the files <CODE class=3Dcode>lk201.h</CODE> and <CODE=20
class=3Dcode>lk201.c</CODE> from <CODE =
class=3Dcode>src/sys/arch/pmax/dev/</CODE> is=20
the source of most of the code fragments on this page. Additional hints =
came=20
from the X11R5 Xserver code for <A class=3Dulink =
href=3D"http://www.openbsd.org/"=20
target=3D_top>OpenBSD</A> (I think the OpenBSD and NetBSD Xserver's are =
largely=20
the same, at least with respect to the keyboard stuff). I also got some =
good=20
hints and a few <CODE class=3Dcode>#define</CODE>'s from an unknown =
version of=20
Mach from Carnegie Mellon. The files in the Mach source I looked at were =
also=20
called <CODE class=3Dcode>lk201.h</CODE> and <CODE =
class=3Dcode>lk201.c</CODE>, but=20
were not the same as the NetBSD files of the same names.</P>
<P>In addition to poking around the various pieces of code mentioned =
above, I=20
hooked an LK201 up to the serial port on a NetBSD/mac68k machine and =
spent some=20
time experimenting with the keyboard and the various control sequences. =
This is=20
how I convinced myself of what the 14 keyboard divisions are. This test =
setup=20
was invaluable for seeing exactly what the keyboard produces and how it =
reacts=20
to known commands.</P>
<P>The text version of the keycodes and keyboard divisions was sent to =
me by <A=20
class=3Dulink href=3D"mailto:djv@bedford.net" target=3D_top>Dave</A>. My =
brother, <A=20
class=3Dulink href=3D"http://www.cs.cmu.edu/~jmcm/" =
target=3D_top>Jeff</A>, was also a=20
big help in answering many <CODE class=3Dcode>C</CODE> questions and =
pointing me=20
towards the Mach code.</P>
<P>In addition, I got a copy rather late in the writing of this page of =
what=20
could be considered the "real" document for all this stuff. "VCB02 Video =

Subsystem Technical Manual" DEC Educational Services, AZ-GLGAB-MN, =
February 1986=20
The appendix of this document cleaned out most of the remaining =
mysteries.</P>
<HR>

<H3 class=3Dtitle>DISCLAIMER</H3>
<H4 class=3Dtitle><A name=3Dnosmoke></A>No Fault (<A=20
href=3D"http://www.netbsd.org/docs/Hardware/Machines/DEC/lk201.html#">top=
</A>)=20
</H4>
<P>Any software and documentation here is provided "as is", no warranty, =
use at=20
your own risk. Please do not hook up your LK201 and/or computer =
backwards and=20
blame me!</P></DIV></DIV></DIV>
<DIV class=3Dnavfoot></DIV>
<DIV id=3Dfooter>
<DIV id=3DfooterContent>
<CENTER><SPAN class=3Dfootfeed><A=20
href=3D"http://www.netbsd.org/cgi-bin/feedback.cgi">Contact</A> | =
</SPAN><SPAN=20
class=3Dfootcopy><A=20
href=3D"http://www.netbsd.org/about/disclaimer.html">Disclaimer</A> | =
<SPAN=20
class=3Dcopyright>Copyright =A9 1994-2009 The NetBSD Foundation, Inc. =
</SPAN>ALL=20
RIGHTS RESERVED.<BR>NetBSD<SUP>=AE</SUP> is a registered trademark of =
The NetBSD=20
Foundation, Inc.</SPAN> </CENTER></DIV></DIV></DIV></BODY></HTML>

------=_NextPart_000_0025_01C9BECA.DAA6DE50
Content-Type: image/png
Content-Transfer-Encoding: base64
Content-Location: http://www.netbsd.org/images/NetBSD-headerlogo.png

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
QCAQCASCX/n/gEfJKx2XhPMAAAAASUVORK5CYII=

------=_NextPart_000_0025_01C9BECA.DAA6DE50
Content-Type: text/css;
	charset="koi8-r"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.netbsd.org/global.css

BODY {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: #ffffff; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; FONT-FAMILY: Tahoma, =
sans-serif; COLOR: #000000; FONT-SIZE: small; PADDING-TOP: 0px
}
ACRONYM {
	BORDER-BOTTOM: rgb(61,92,122) 1px dotted; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; CURSOR: help; PADDING-TOP: =
0px
}
.titleTip {
	BORDER-BOTTOM: rgb(61,92,122) 1px dotted; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; CURSOR: help; PADDING-TOP: =
0px
}
IMG {
	BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; BORDER-TOP: =
medium none; BORDER-RIGHT: medium none
}
A:link {
	COLOR: #b84e0d; TEXT-DECORATION: none
}
A:hover {
	COLOR: #f26711; TEXT-DECORATION: underline
}
A:visited {
	COLOR: #880000; TEXT-DECORATION: none
}
A:hover:visited {
	COLOR: #f26711; TEXT-DECORATION: underline
}
H3 {
	COLOR: #777777
}
H4 {
	COLOR: #777777
}
.doNotDisplay {
	DISPLAY: none !important
}
.topNavigation {
	BORDER-BOTTOM: #777777 1px dotted; PADDING-BOTTOM: 0.5ex; MARGIN: 0px; =
PADDING-LEFT: 5px; PADDING-RIGHT: 5px; COLOR: #555555; PADDING-TOP: =
0.5ex
}
.topNavigation SPAN {
	COLOR: #b84e0d
}
.topNavigation SMALL {
	FONT-SIZE: 80%
}
.topNavigation A:link {
	PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0.25ex; COLOR: #555555; TEXT-DECORATION: none; PADDING-TOP: 0px
}
.topNavigation A:hover {
	COLOR: #000000; TEXT-DECORATION: underline
}
.topNavigation A:visited {
	COLOR: #555555; TEXT-DECORATION: none
}
.topNavigation A:hover:visited {
	COLOR: #000000; TEXT-DECORATION: underline
}
.centralHeader {
	BACKGROUND-COLOR: #ffffff; MARGIN: 0px; PADDING-LEFT: 10px
}
.headerTools {
	POSITION: absolute; MARGIN: 0px; TOP: 40px; RIGHT: 1em
}
#headerLangs A {
	PADDING-BOTTOM: 0.5ex; BACKGROUND-COLOR: transparent; MARGIN: 0px; =
PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; TEXT-DECORATION: =
none; PADDING-TOP: 0px
}
#headerLangs A:hover {
	BACKGROUND-COLOR: transparent; COLOR: #f26711; TEXT-DECORATION: =
underline
}
#headerLangs {
	POSITION: absolute; WHITE-SPACE: nowrap; TOP: 2.5em; RIGHT: 1em
}
#headerSearch {
	POSITION: absolute; TOP: 40px; RIGHT: 0px
}
#headerSearch FORM {
	TEXT-ALIGN: right; MARGIN: 0px; WHITE-SPACE: nowrap
}
#headerSearch INPUT {
	BORDER-BOTTOM: #d4d4d4 1px solid; BORDER-LEFT: #d4d4d4 1px solid; =
PADDING-BOTTOM: 1px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 5px; =
WIDTH: 5em; PADDING-RIGHT: 5px; COLOR: #555555; FONT-SIZE: small; =
BORDER-TOP: #d4d4d4 1px solid; BORDER-RIGHT: #d4d4d4 1px solid; =
PADDING-TOP: 1px
}
.whiteOnBlack {
	BACKGROUND-COLOR: #ffffff !important; COLOR: #000000 !important
}
#headerMirrors SELECT {
	FONT-SIZE: 12px
}
#headerMirrors INPUT {
	BORDER-BOTTOM: #d4d4d4 1px solid; BORDER-LEFT: #d4d4d4 1px solid; =
PADDING-BOTTOM: 1px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 5px; =
WIDTH: 5em; PADDING-RIGHT: 5px; COLOR: #555555; FONT-SIZE: small; =
BORDER-TOP: #d4d4d4 1px solid; BORDER-RIGHT: #d4d4d4 1px solid; =
PADDING-TOP: 1px
}
.navBar {
	BORDER-BOTTOM: #777777 2px dotted; BACKGROUND-COLOR: #777777; MARGIN: =
0px; PADDING-LEFT: 25px; COLOR: #ffffff; PADDING-TOP: 2px
}
.navBar SPAN {
	COLOR: #ffffff
}
.navBar A {
	PADDING-BOTTOM: 0px; BACKGROUND-COLOR: transparent; MARGIN: 0px; =
PADDING-LEFT: 0px; PADDING-RIGHT: 0.25ex; COLOR: #ffffff; FONT-WEIGHT: =
bold; TEXT-DECORATION: none; PADDING-TOP: 0px
}
.navBar A:hover {
	TEXT-DECORATION: none
}
.navBar A:visited {
	COLOR: #ffffff
}
.sideBarLeft P {
	CLEAR: both
}
.iconsLeft IMG {
	FLOAT: left
}
.iconsRight IMG {
	FLOAT: right
}
.featureList {
	CLEAR: both
}
.featureList H2 {
	MARGIN-BOTTOM: 1em !important
}
#content {
	MARGIN: 0px; CLEAR: left
}
#content H1 {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: transparent; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; =
PADDING-TOP: 1ex
}
#content H2 {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: transparent; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; =
PADDING-TOP: 1ex
}
#content H3 {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: transparent; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; =
PADDING-TOP: 1ex
}
#content H4 {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: transparent; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; =
PADDING-TOP: 1ex
}
#content H5 {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; BACKGROUND-COLOR: transparent; =
MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; COLOR: #777777; =
PADDING-TOP: 1ex
}
#content P {
	PADDING-BOTTOM: 0px; LINE-HEIGHT: 1.3em; MARGIN: 1em 0px 1.5em; =
PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
#platinumDonorLogo {
	TEXT-ALIGN: left; PADDING-LEFT: 1em; WIDTH: 150px
}
.buttons {
	TEXT-ALIGN: center; LINE-HEIGHT: 3em; MARGIN-TOP: 2em
}
.buttons IMG {
	MARGIN: 1ex
}
.buttons FORM {
	MARGIN: 1ex
}
#news {
	FONT-STYLE: italic; COLOR: #777777
}
#news UL {
	PADDING-BOTTOM: 0px; LIST-STYLE-TYPE: none; MARGIN: 1em 0px 0px; =
PADDING-LEFT: 1em; PADDING-RIGHT: 0px; PADDING-TOP: 0px
}
#news LI {
	PADDING-BOTTOM: 1em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; PADDING-TOP: 0px
}
#news LI A {
	FONT-STYLE: normal
}
#news IMG {
	MARGIN-TOP: 1em
}
.more {
	PADDING-BOTTOM: 0.5em; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: =
0px; WHITE-SPACE: nowrap; PADDING-TOP: 0.5em
}
.more A {
	BACKGROUND-COLOR: transparent; MARGIN: 0px; COLOR: #f26711; =
FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.more LI A {
	BACKGROUND-COLOR: transparent; MARGIN: 0px; COLOR: #f26711; =
FONT-WEIGHT: bold; TEXT-DECORATION: none
}
.more A:hover {
	COLOR: #f26711; TEXT-DECORATION: underline
}
.rowOfBoxes {
	CLEAR: both
}
.quarter {
	BORDER-LEFT: rgb(204,204,204) 1px solid; MARGIN: 1em 0px; FLOAT: left
}
.oneThird {
	BORDER-LEFT: rgb(204,204,204) 1px solid; MARGIN: 1em 0px; FLOAT: left
}
.half {
	BORDER-LEFT: rgb(204,204,204) 1px solid; MARGIN: 1em 0px; FLOAT: left
}
.twoThirds {
	BORDER-LEFT: rgb(204,204,204) 1px solid; MARGIN: 1em 0px; FLOAT: left
}
.fullWidth {
	BORDER-LEFT: rgb(204,204,204) 1px solid; MARGIN: 1em 0px; FLOAT: left
}
.quarter {
	PADDING-LEFT: 1em; WIDTH: 17%; PADDING-RIGHT: 1em
}
.oneThird {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 1em; WIDTH: 28%; PADDING-RIGHT: 1em; =
PADDING-TOP: 0px
}
.half {
	TEXT-ALIGN: justify; PADDING-BOTTOM: 0px; PADDING-LEFT: 2em; WIDTH: =
50%; PADDING-RIGHT: 2em; PADDING-TOP: 0px
}
.twoThirds {
	PADDING-BOTTOM: 0px; PADDING-LEFT: 1em; WIDTH: 63%; PADDING-RIGHT: 1em; =
PADDING-TOP: 0px
}
.fullWidth {
	BORDER-LEFT: medium none; PADDING-BOTTOM: 0px; PADDING-LEFT: 1.2em; =
WIDTH: 96%; PADDING-RIGHT: 1.2em; PADDING-TOP: 0px
}
.filler {
	BORDER-BOTTOM: white 1px solid; BORDER-LEFT: white 1px solid; =
BORDER-TOP: white 1px solid; BORDER-RIGHT: white 1px solid
}
.noBorderOnLeft {
	BORDER-LEFT: medium none
}
.BorderOnRight {
	BORDER-RIGHT: #d4d4d4 1px solid
}
.dividingBorderAbove {
	BORDER-TOP: rgb(204,204,204) 1px solid
}
.greyLink A {
	COLOR: #777777; TEXT-DECORATION: none
}
.greyLink A:hover {
	TEXT-DECORATION: underline
}
.greyLink A:visited {
	COLOR: #777777; TEXT-DECORATION: none
}
.greyLink A:hover:visited {
	COLOR: #777777; TEXT-DECORATION: underline
}
#footer {
	BORDER-BOTTOM: #d4d4d4 1px solid; TEXT-ALIGN: center; LINE-HEIGHT: =
1.25em; BACKGROUND-COLOR: #f2f2f2; MARGIN: 2em 0px 0px; COLOR: #777777; =
CLEAR: both; BORDER-TOP: #d4d4d4 1px solid
}
#footer A {
	BACKGROUND-COLOR: transparent; COLOR: #777777; TEXT-DECORATION: =
underline
}
#footer A:hover {
	TEXT-DECORATION: none
}
#footerContent {
	PADDING-BOTTOM: 1ex; PADDING-LEFT: 10px; PADDING-RIGHT: 10px; =
PADDING-TOP: 1ex
}
#footerLogo {
	TEXT-ALIGN: right; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; =
WIDTH: 100px; PADDING-RIGHT: 0px; FLOAT: right; PADDING-TOP: 0px
}
#hackathonBox {
	TEXT-ALIGN: left; PADDING-BOTTOM: 1em; MARGIN: 1em 2em; PADDING-LEFT: =
2em; PADDING-RIGHT: 2em; BACKGROUND: #f26711; COLOR: #ffffff; =
PADDING-TOP: 1em
}
#hackathonBox A {
	COLOR: #ffffff; TEXT-DECORATION: underline
}
#warnBox {
	TEXT-ALIGN: center; PADDING-BOTTOM: 5px; MARGIN: 5px; PADDING-LEFT: =
5px; PADDING-RIGHT: 5px; BACKGROUND: #f26711; COLOR: #ffffff; =
FONT-WEIGHT: bold; PADDING-TOP: 5px
}
#warnBox A {
	COLOR: #ffffff; TEXT-DECORATION: underline
}
TABLE {
	BORDER-RIGHT-WIDTH: 0em; BORDER-TOP-WIDTH: 0em; BORDER-BOTTOM-WIDTH: =
0em; FONT-SIZE: 100%; BORDER-LEFT-WIDTH: 0em
}
TABLE TD {
	PADDING-BOTTOM: 3pt; PADDING-LEFT: 3pt; PADDING-RIGHT: 3pt; =
FONT-FAMILY: Tahoma, Verdana, sans-serif; PADDING-TOP: 3pt
}
.centered {
	WIDTH: 90%; MARGIN-LEFT: auto; MARGIN-RIGHT: auto
}
.strikethrough {
	TEXT-DECORATION: line-through
}
.programlisting {
	BORDER-BOTTOM: #d4d4d4 thin solid; BORDER-LEFT: #d4d4d4 thin solid; =
PADDING-BOTTOM: 5pt; LINE-HEIGHT: 1.2em; BACKGROUND-COLOR: #f5f5f5; =
PADDING-LEFT: 5pt; WIDTH: 90%; PADDING-RIGHT: 5pt; MARGIN-LEFT: auto; =
BORDER-TOP: #d4d4d4 thin solid; MARGIN-RIGHT: auto; BORDER-RIGHT: =
#d4d4d4 thin solid; PADDING-TOP: 5pt
}
TR {
	VERTICAL-ALIGN: top
}
TD {
	VERTICAL-ALIGN: top
}
TH {
	PADDING-BOTTOM: 5pt; BACKGROUND-COLOR: #f8f8f8; PADDING-LEFT: 5pt; =
PADDING-RIGHT: 5pt; VERTICAL-ALIGN: middle; FONT-WEIGHT: bold; =
PADDING-TOP: 5pt
}
TD.theader {
	PADDING-BOTTOM: 5pt; BACKGROUND-COLOR: #f8f8f8; PADDING-LEFT: 5pt; =
PADDING-RIGHT: 5pt; VERTICAL-ALIGN: middle; FONT-WEIGHT: bold; =
PADDING-TOP: 5pt
}
TD.developerslist {
	PADDING-BOTTOM: 0.3em; PADDING-LEFT: 0.3em; PADDING-RIGHT: 0.3em; =
WHITE-SPACE: nowrap; PADDING-TOP: 0.3em
}
TD.developerslistwrap {
	PADDING-BOTTOM: 0.3em; PADDING-LEFT: 0.3em; PADDING-RIGHT: 0.3em; =
WHITE-SPACE: normal; PADDING-TOP: 0.3em
}
TABLE.developerslist {
	BORDER-RIGHT-WIDTH: 0em; BORDER-TOP-WIDTH: 0em; BORDER-BOTTOM-WIDTH: =
0em; MARGIN-LEFT: 0.5em; BORDER-LEFT-WIDTH: 0em; MARGIN-RIGHT: 0.5em
}
.center {
	TEXT-ALIGN: center; VERTICAL-ALIGN: middle
}
TT.filename {
	LINE-HEIGHT: 1.3em; COLOR: #aa0000
}
TT.varname {
	LINE-HEIGHT: 1.3em; COLOR: #2222aa
}
.note {
	BORDER-BOTTOM: #d4d4d4 thin solid; BORDER-LEFT: #d4d4d4 thin solid; =
PADDING-BOTTOM: 5pt; BACKGROUND-COLOR: #f5f5f5; PADDING-LEFT: 5pt; =
PADDING-RIGHT: 5pt; BORDER-TOP: #d4d4d4 thin solid; BORDER-RIGHT: =
#d4d4d4 thin solid; PADDING-TOP: 5pt
}
.head {
	FONT-FAMILY: Arial, Verdana, Helvetica, sans-serif; COLOR: #777777; =
FONT-SIZE: 120%; FONT-WEIGHT: bold
}
.subhead {
	FONT-FAMILY: Arial, Verdana, Helvetica, sans-serif; COLOR: #777777; =
FONT-SIZE: 90%; FONT-WEIGHT: bold
}
.newsindex {
	FONT-FAMILY: Geneva, "Lucida Grande", Arial, Verdana, sans-serif; =
FONT-SIZE: 80%; FONT-WEIGHT: normal
}
.webtoc {
	FONT-FAMILY: "Lucida Grande", Geneva, Arial, Verdana, sans-serif
}
.foothome {
	LINE-HEIGHT: 1em; VERTICAL-ALIGN: middle
}
.footfeed {
	LINE-HEIGHT: 1em
}
.footcopy {
	LINE-HEIGHT: 1em
}
.foottag {
	LINE-HEIGHT: 1em
}
.pkgname {
	LINE-HEIGHT: 1.3em; FONT-STYLE: italic; FONT-FAMILY: "Arial", =
"Helvetica", "Courier New", "Courier", "fixed", monospace; =
TEXT-DECORATION: none
}
.gnatspr {
	FONT-WEIGHT: bold
}
.warning {
	COLOR: red
}
.book {
	MARGIN: 2em
}
.preface {
	MARGIN: 2em
}
.chapter {
	MARGIN: 2em
}
.appendix {
	MARGIN: 2em
}

------=_NextPart_000_0025_01C9BECA.DAA6DE50--
