SpiderScript - Speedups
[tpg/acess2.git] / Kernel / drv / kb.c
index 6577882..b67c8e3 100644 (file)
 #define        USE_KERNEL_MAGIC        1
 
 // === IMPORTS ===
-void   Threads_Dump();
+extern void    Threads_ToggleTrace(int TID);
+extern void    Threads_Dump(void);
+extern void    Heap_Stats(void);
 
 // === PROTOTYPES ===
  int   KB_Install(char **Arguments);
-void   KB_IRQHandler();
+void   KB_IRQHandler(int IRQNum);
 void   KB_AddBuffer(char ch);
 Uint64 KB_Read(tVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Dest);
-void   KB_UpdateLEDs();
+void   KB_UpdateLEDs(void);
  int   KB_IOCtl(tVFS_Node *Node, int Id, void *Data);
 
 // === GLOBALS ===
@@ -44,6 +46,8 @@ Uint8 gbaKB_States[3][256];
  int   giKB_KeyLayer = 0;
 #if USE_KERNEL_MAGIC
  int   gbKB_MagicState = 0;
+ int   giKB_MagicAddress = 0;
+ int   giKB_MagicAddressPos = 0;
 #endif
 //Uint64       giKB_ReadBase = 0;
 //Uint32       gaKB_Buffer[KB_BUFFER_SIZE];    //!< Keyboard Ring Buffer
@@ -53,7 +57,7 @@ Uint8 gbaKB_States[3][256];
 
 // === CODE ===
 /**
- * \fn int KB_Install(char **Arguments)
+ * \brief Install the keyboard driver
  */
 int KB_Install(char **Arguments)
 {
@@ -73,10 +77,10 @@ int KB_Install(char **Arguments)
 }
 
 /**
- * \fn void KB_IRQHandler()
  * \brief Called on a keyboard IRQ
+ * \param IRQNum       IRQ number (unused)
  */
-void KB_IRQHandler()
+void KB_IRQHandler(int IRQNum)
 {
        Uint8   scancode;
        Uint32  ch;
@@ -183,16 +187,39 @@ void KB_IRQHandler()
        {
                switch(ch)
                {
-               case 'd':       __asm__ __volatile__ ("xchg %bx, %bx"); break;
-               case 'p':       Threads_Dump(); break;
+               case '0':       case '1':       case '2':       case '3':
+               case '4':       case '5':       case '6':       case '7':
+               case '8':       case '9':       case 'a':       case 'b':
+               case 'c':       case 'd':       case 'e':       case 'f':
+                       {
+                       char    str[4] = {'0', 'x', ch, 0};
+                       if(giKB_MagicAddressPos == BITS/4)      return;
+                       giKB_MagicAddress |= atoi(str) << giKB_MagicAddressPos;
+                       giKB_MagicAddressPos ++;
+                       }
+                       return;
+               
+               // Instruction Tracing
+               case 't':
+                       Log("Toggle instruction tracing on %i\n", giKB_MagicAddress);
+                       Threads_ToggleTrace( giKB_MagicAddress );
+                       giKB_MagicAddress = 0;  giKB_MagicAddressPos = 0;
+                       return;
+               
+               // Thread List Dump
+               case 'p':       Threads_Dump(); return;
+               // Heap Statistics
+               case 'h':       Heap_Stats();   return;
+               // Dump Structure
+               case 's':       return;
                }
        }
        #endif
 
-       // Is shift pressed
-       // - Darn ugly hacks !(!x) means (bool)x
-       if( !(!gbKB_ShiftState) ^ gbKB_CapsState)
+       // Capitals required?
+       if( (gbKB_ShiftState != 0) != (gbKB_CapsState != 0))
        {
+               // TODO: Move this to the keyboard map header
                switch(ch)
                {
                case 0: break;
@@ -228,10 +255,10 @@ void KB_IRQHandler()
 }
 
 /**
- * \fn void KB_UpdateLEDs()
+ * \fn void KB_UpdateLEDs(void)
  * \brief Updates the status of the keyboard LEDs
  */
-void KB_UpdateLEDs()
+void KB_UpdateLEDs(void)
 {
        Uint8   leds;
 

UCC git Repository :: git.ucc.asn.au