#include <stdio.h>

#define FALSE   0
#define TRUE    1

struct
{
   short write_pos,
         read_pos;
   char  keys [0x40];
}  kbd_buffer = {0, 0, ""};

show_buffer()
{
   short loop;

   printf("key_buffer [");
   for (loop = 0;loop < 20;loop ++)
   {
      printf("%02x", kbd_buffer.keys [loop]);
      if (loop < 19)
         printf(",");

   }
   printf("]\n");

   for (loop = 0;loop < kbd_buffer.read_pos;loop ++)
      printf("   ");
   printf("             R\n");

   for (loop = 0;loop < kbd_buffer.write_pos;loop ++)
      printf("   ");
   printf("             W\n");


}

char char_conv( charackter)
char charackter;
{
   short  bit_8;

      bit_8 = charackter & 0x80;
   if ((charackter & 0x7F) > 0x5F)
      charackter -= 0x20;

   charackter |= bit_8;
   if (charackter == 0x8A)
      charackter = 0x8D;

   return charackter;
}

char take_char()
{
   char   charackter;

   if (kbd_buffer.write_pos != kbd_buffer.read_pos)
      charackter = kbd_buffer.keys [kbd_buffer.read_pos++];
   else
      charackter = getc( stdin);

   kbd_buffer.read_pos &= 0x3F;

   return (char_conv( charackter) );
}

char_take_back( tkn)
char tkn;
{

   kbd_buffer.keys [kbd_buffer.write_pos++] = tkn;

   kbd_buffer.write_pos &= 0x3F;
}

short char_check()
{
   return (chrcheck() || (kbd_buffer.write_pos != kbd_buffer.read_pos) );
}

short touch_char( value)
short *value;
{
   short char_flag;

   *value    &= 0x7F;
   char_flag  = FALSE;
   if (char_check() )
   {
      if (kbd_buffer.write_pos != kbd_buffer.read_pos)
         *value = char_conv( kbd_buffer.keys [kbd_buffer.read_pos]) | 0x80;

      else
      {
         *value = char_conv( getc( stdin) );
         char_take_back( *value);
      }

      char_flag  = TRUE;
   }
   return char_flag;
}

skip_if_char()
{
   /* can miss charackter if Pr1me is bissy so don't take chrcheck() */
   if (kbd_buffer.write_pos != kbd_buffer.read_pos)
      take_char();
}
