Newer
Older
ubixos-pre / src / sys / isa / atkbd.c
@reddawg reddawg on 18 Jun 2004 27 KB UbixOS PreRelease
/*****************************************************************************************
 Copyright (c) 2002 The UbixOS Project
 All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this list of
conditions, the following disclaimer and the list of authors.  Redistributions in binary
form must reproduce the above copyright notice, this list of conditions, the following
disclaimer and the list of authors in the documentation and/or other materials provided
with the distribution. Neither the name of the UbixOS Project nor the names of its
contributors may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 $Id$

*****************************************************************************************/

#include <isa/atkbd.h>
#include <isa/8259.h>
#include <sys/idt.h>
#include <sys/gdt.h>
#include <sys/io.h>
#include <sys/video.h>
#include <lib/kmalloc.h>
#include <lib/kprintf.h>
#include <ubixos/types.h>
#include <ubixos/sched.h>
#include <ubixos/vitals.h>

static unsigned int keyMap = 0;
static unsigned int ledStatus = 0;

static unsigned int keyboardMap[][8] = {
/*           Ascii,  Shift,   Ctrl,    Alt,    Num,   Caps, Shift Caps, Shift Num */
          {      0,      0,      0,      0,      0,      0,          0,         0},
/* ESC */ {   0x1B,   0x1B,   0x1B,   0x1B,   0x1B,   0x1B,       0x1B,      0x1B},
/* 1,! */ {   0x31,   0x21,      0,      0,   0x31,   0x31,       0x21,      0x21},
/* 2,@ */ {   0x32,   0x40,      0,      0,   0x32,   0x32,       0x40,      0x40},
/* 3,# */ {   0x33,   0x23,      0,      0,   0x33,   0x33,       0x23,      0x23},
/* 4,$ */ {   0x34,   0x24,      0,      0,   0x34,   0x34,       0x24,      0x24},
/* 5,% */ {   0x35,   0x25,      0,      0,   0x35,   0x35,       0x25,      0x25},
/* 6,^ */ {   0x36,   0x5E,      0,      0,   0x36,   0x36,       0x5E,      0x5E},
/* 7,& */ {   0x37,   0x26,      0,      0,   0x37,   0x37,       0x26,      0x26},
/* 8,* */ {   0x38,   0x2A,      0,      0,   0x38,   0x38,       0x2A,      0x2A},
/* 9.( */ {   0x39,   0x28,      0,      0,   0x39,   0x39,       0x28,      0x28},
/* 0,) */ {   0x30,   0x29,      0,      0,   0x30,   0x30,       0x29,      0x29},
/* -,_ */ {   0x2D,   0x5F,      0,      0,   0x2D,   0x2D,       0x5F,      0x5F},
/* =,+ */ {   0x3D,   0x2B,      0,      0,   0x3D,   0x3D,       0x2B,      0x2B},
/*  14 */ {   0x08,   0x08,    0x8,    0x8,   0x08,   0x08,       0x08,      0x08},
/*  15 */ {   0x09,      0,      0,      0,      0,      0,          0,         0},
/*     */ {   0x71,   0x51,      0,      0,      0,      0,          0,         0},
/*     */ {   0x77,   0x57,      0,      0,      0,      0,          0,         0},
/*     */ {   0x65,   0x45,      0,      0,      0,      0,          0,         0},
/*     */ {   0x72,   0x52,      0,      0,      0,      0,          0,         0},
/*     */ {   0x74,   0x54,      0,      0,      0,      0,          0,         0},
/*     */ {   0x79,   0x59,      0,      0,      0,      0,          0,         0},
/*     */ {   0x75,   0x55,      0,      0,      0,      0,          0,         0},
/*     */ {   0x69,   0x49,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6F,   0x4F,      0,      0,      0,      0,          0,         0},
/*     */ {   0x70,   0x50,      0,      0,      0,      0,          0,         0},
/*     */ {   0x5B,   0x7B,      0,      0,      0,      0,          0,         0},
/*     */ {   0x5D,   0x7D,      0,      0,      0,      0,          0,         0},
/*     */ {   0x0A,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/* a,A */ {   0x61,   0x41,   0x41,      0,      0,      0,          0,         0},
/*     */ {   0x73,   0x53,      0,      0,      0,      0,          0,         0},
/*     */ {   0x64,   0x44,      0,      0,      0,      0,          0,         0},
/*     */ {   0x66,   0x46,      0,      0,      0,      0,          0,         0},
/*     */ {   0x67,   0x47,      0,      0,      0,      0,          0,         0},
/*     */ {   0x68,   0x48,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6A,   0x4A,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6B,   0x4B,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6C,   0x4C,      0,      0,      0,      0,          0,         0},
/*     */ {   0x3B,   0x3A,      0,      0,      0,      0,          0,         0},
/*     */ {   0x27,   0x22,      0,      0,      0,      0,          0,         0},
/*     */ {   0x60,   0x7E,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2A,    0x0,      0,      0,      0,      0,          0,         0},
/*     */ {   0x5C,   0x3C,      0,      0,      0,      0,          0,         0},
/*     */ {   0x7A,   0x5A,      0,      0,      0,      0,          0,         0},
/*     */ {   0x78,   0x58,      0,      0,      0,      0,          0,         0},
/* c,C */ {   0x63,   0x43,    0x3,      0,      0,      0,          0,         0},
/*     */ {   0x76,   0x56,      0,      0,      0,      0,          0,         0},
/*     */ {   0x62,   0x42,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6E,   0x4E,      0,      0,      0,      0,          0,         0},
/*     */ {   0x6D,   0x4D,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2C,   0x3C,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2E,   0x3E,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2F,   0x3F,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {   0x20,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/* F1  */ { 0x3001,      0,      0, 0x3000,      0,      0,          0,         0},
/*     */ { 0x3C00,      0,      0, 0x3001,      0,      0,          0,         0},
/*     */ { 0x3D00,      0,      0, 0x3002,      0,      0,          0,         0},
/*     */ { 0x3E00,      0,      0, 0x3003,      0,      0,          0,         0},
/*     */ { 0x3F00,      0,      0, 0x3004,      0,      0,          0,         0},
/*     */ { 0x4000,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4100,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4200,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4300,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4400,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4700,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4800,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4900,      0,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2D,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4B00,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4C00,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4D00,      0,      0,      0,      0,      0,          0,         0},
/*     */ {   0x2B,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x4F00,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x5000,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x5100,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x5200,      0,      0,      0,      0,      0,          0,         0},
/*     */ { 0x5300,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      1,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0},
/*     */ {      0,      0,      0,      0,      0,      0,          0,         0}
  };

/************************************************************************

Function: int initKeyboard

Description: This function is used to turn on the keyboard

Notes:

02/20/2004 - Approved for quality

************************************************************************/
int keyboardInit() {

  /* Insert the IDT vector for the keyboard handler */
  setVector(&keyboardISR, mVec+1, dPresent + dInt + dDpl3);

  /* Set the LEDS to their defaults */
  setLED();

  /* Turn on the keyboard vector */
  outportByte(mPic, eoi);
  outportByte(sPic, eoi);
  irqEnable(0x1);
  outportByte(mPic, eoi);
  outportByte(sPic, eoi);

  /* Print out information on keyboard */
  kprintf("atkbd0 - Address: [0x%X]\n",&keyboardISR);

  /* Return so we know everything went well */
  return(0x0);
  }

/*
 * 2-23-2004 mji  I think the pusha/popa should be pushal/popal
 */

asm(
  ".globl keyboardISR     \n"
  "keyboardISR:           \n"
  "  pusha                \n" /* Save all registers           */
  "  call keyboardHandler \n"
  "  popa                 \n"
  "  iret                 \n" /* Exit interrupt               */
  );

void keyboardHandler() {
  unsigned int key = inportByte(0x60);
  kTask_t *tmpTask = 0x0;

  tmpTask = schedFindTask(0);
  if (tmpTask->oInfo.stdin == 0x0) {
    tmpTask->oInfo.stdin = (char *)kmalloc(256);
    }
  /* Control Key */
  if (key == 0x1D && !(tmpTask->oInfo.controlKeys & controlKey)) {
    tmpTask->oInfo.controlKeys |= controlKey;
    }
  if (key == 0x80 + 0x1D) {
    tmpTask->oInfo.controlKeys &= (0xFF - controlKey);
    }
  /* ALT Key */
  if (key == 0x38 && !(tmpTask->oInfo.controlKeys & altKey)) {
    tmpTask->oInfo.controlKeys |= altKey;
    }
  if (key == 0x80 + 0x38) {
    tmpTask->oInfo.controlKeys &= (0xFF - altKey);
    }
  /* Shift Key */
  if ((key == 0x2A || key == 0x36) && !(tmpTask->oInfo.controlKeys & shiftKey)) {
    tmpTask->oInfo.controlKeys |= shiftKey;
    }
  if ((key == 0x80 + 0x2A) || (key == 0x80 + 0x36)) {
    tmpTask->oInfo.controlKeys &= (0xFF - shiftKey);
    }
  /* Caps Lock */
  if (key == 0x3A) {
    ledStatus ^= ledCapslock;
    setLED();
    }
  /* Num Lock */
  if (key == 0x45) {
    ledStatus ^= ledNumlock;
    setLED();
    }
  /* Scroll Lock */
  if (key == 0x46) {
    ledStatus ^= ledScrolllock;
    setLED();
    }
  /* Pick Which Key Map */
  if (tmpTask->oInfo.controlKeys == 0) { keyMap = 0; }
  else if (tmpTask->oInfo.controlKeys == 1) { keyMap = 1; }
  else if (tmpTask->oInfo.controlKeys == 2) { keyMap = 2; }
  else if (tmpTask->oInfo.controlKeys == 4) { keyMap = 3; }
  /* If Key Is Not Null Add It To Handler */
  if (((uInt)(keyboardMap[key][keyMap]) > 0) && ((uInt32)(keyboardMap[key][keyMap]) < 0xFF)) {
    switch ((uInt32)keyboardMap[key][keyMap]) {
      case 8:
        backSpace();
        tmpTask->oInfo.stdin[tmpTask->oInfo.stdinSize] = keyboardMap[key][keyMap];
        tmpTask->oInfo.stdinSize++;
        break;
      case 0x3:
        schedEndTask(tmpTask->id);
        break;
      default:
        tmpTask->oInfo.stdin[tmpTask->oInfo.stdinSize] = keyboardMap[key][keyMap];
        tmpTask->oInfo.stdinSize++;
        break;
      }
    }
  else {
    switch ((keyboardMap[key][keyMap] >> 8)) {
      case 0x30:
        kprintf("Changing Consoles[0x%X:0x%X],Free Pages: [%i]\n",_current->id,_current,systemVitals->sysUptime);//schedFindTask(0x0),);
        /* changeConsole((keyboardMap[key][keyMap] & 0xFF)); */
        break;
      default:
        break;
      }
    }
  outportByte(mPic, eoi);
  outportByte(sPic, eoi);
  /* Return */
  return;
  }

void setLED() {
  outportByte(0x60, 0xED);
  while(inportByte(0x64) & 2);
  outportByte(0x60, ledStatus);
  while(inportByte(0x64) & 2);
  }

/* Temp */
unsigned char getch() {
  uInt8   retKey   = 0x0;
  uInt32  i        = 0x0;
  kTask_t *tmpTask = 0x0;

  tmpTask = schedFindTask(0);

  while (tmpTask->oInfo.stdinSize == 0);
  retKey = tmpTask->oInfo.stdin[0];
  tmpTask->oInfo.stdinSize--;

  for (i=0x0;i<tmpTask->oInfo.stdinSize;i++) {
    tmpTask->oInfo.stdin[i] = tmpTask->oInfo.stdin[i+0x1];
    }
  return(retKey);
  }

/***

 $Log$
 Revision 1.5  2004/06/17 14:49:14  reddawg
 atkbd: converted some variables to static

 Revision 1.4  2004/06/04 10:19:42  reddawg
 notes: we compile again, thank g-d anyways i was about to cry

 Revision 1.3  2004/05/19 04:07:42  reddawg
 kmalloc(size,pid) no more it is no kmalloc(size); the way it should of been

 Revision 1.2  2004/05/10 02:23:24  reddawg
 Minor Changes To Source Code To Prepare It For Open Source Release

 Revision 1.1.1.1  2004/04/15 12:07:09  reddawg
 UbixOS v1.0

 Revision 1.19  2004/04/13 16:36:33  reddawg
 Changed our copyright, it is all now under a BSD-Style license

 END
 ***/