home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 405.lha / AppleII_Emulators_src / src-2 / kbd_handler.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-28  |  1.9 KB  |  111 lines

  1. #include <stdio.h>
  2.  
  3. #define FALSE   0
  4. #define TRUE    1
  5.  
  6. struct
  7. {
  8.    short write_pos,
  9.          read_pos;
  10.    char  keys [0x40];
  11. }  kbd_buffer = {0, 0, ""};
  12.  
  13. show_buffer()
  14. {
  15.    short loop;
  16.  
  17.    printf("key_buffer [");
  18.    for (loop = 0;loop < 20;loop ++)
  19.    {
  20.       printf("%02x", kbd_buffer.keys [loop]);
  21.       if (loop < 19)
  22.          printf(",");
  23.  
  24.    }
  25.    printf("]\n");
  26.  
  27.    for (loop = 0;loop < kbd_buffer.read_pos;loop ++)
  28.       printf("   ");
  29.    printf("             R\n");
  30.  
  31.    for (loop = 0;loop < kbd_buffer.write_pos;loop ++)
  32.       printf("   ");
  33.    printf("             W\n");
  34.  
  35.  
  36. }
  37.  
  38. char char_conv( charackter)
  39. char charackter;
  40. {
  41.    short  bit_8;
  42.  
  43.       bit_8 = charackter & 0x80;
  44.    if ((charackter & 0x7F) > 0x5F)
  45.       charackter -= 0x20;
  46.  
  47.    charackter |= bit_8;
  48.    if (charackter == 0x8A)
  49.       charackter = 0x8D;
  50.  
  51.    return charackter;
  52. }
  53.  
  54. char take_char()
  55. {
  56.    char   charackter;
  57.  
  58.    if (kbd_buffer.write_pos != kbd_buffer.read_pos)
  59.       charackter = kbd_buffer.keys [kbd_buffer.read_pos++];
  60.    else
  61.       charackter = getc( stdin);
  62.  
  63.    kbd_buffer.read_pos &= 0x3F;
  64.  
  65.    return (char_conv( charackter) );
  66. }
  67.  
  68. char_take_back( tkn)
  69. char tkn;
  70. {
  71.  
  72.    kbd_buffer.keys [kbd_buffer.write_pos++] = tkn;
  73.  
  74.    kbd_buffer.write_pos &= 0x3F;
  75. }
  76.  
  77. short char_check()
  78. {
  79.    return (chrcheck() || (kbd_buffer.write_pos != kbd_buffer.read_pos) );
  80. }
  81.  
  82. short touch_char( value)
  83. short *value;
  84. {
  85.    short char_flag;
  86.  
  87.    *value    &= 0x7F;
  88.    char_flag  = FALSE;
  89.    if (char_check() )
  90.    {
  91.       if (kbd_buffer.write_pos != kbd_buffer.read_pos)
  92.          *value = char_conv( kbd_buffer.keys [kbd_buffer.read_pos]) | 0x80;
  93.  
  94.       else
  95.       {
  96.          *value = char_conv( getc( stdin) );
  97.          char_take_back( *value);
  98.       }
  99.  
  100.       char_flag  = TRUE;
  101.    }
  102.    return char_flag;
  103. }
  104.  
  105. skip_if_char()
  106. {
  107.    /* can miss charackter if Pr1me is bissy so don't take chrcheck() */
  108.    if (kbd_buffer.write_pos != kbd_buffer.read_pos)
  109.       take_char();
  110. }
  111.