home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / qc25 / beispiel / tools.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-25  |  3.5 KB  |  106 lines

  1. /* TOOLS - Modul mit mehreren allgemeinen Funktionen, die sich von
  2.  * beliebigen Programmen aus verwenden lassen. TOOLS.H muß dabei als
  3.  * Einfügdatei vorliegen.
  4.  */
  5.  
  6. #include <conio.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <graph.h>
  10. #include <bios.h>
  11. #include "tools.h"
  12.  
  13. /* delay - Hält das Programm für eine bestimmte Anzahl von Mikrosekunden an.
  14.  * Verlangsamt LIFE, indem zwischen Generationen verzögert wird.
  15.  *
  16.  * Parameter: wait - Zeit in Mikrosekondunden
  17.  *
  18.  * Ergebniswert: Keiner
  19.  */
  20. void delay( clock_t wait )
  21. {
  22.  
  23.     clock_t t1, t2;
  24.  
  25.     if( !wait )
  26.         return;
  27.  
  28.     t1 = wait + clock();
  29.     do
  30.     {
  31.         t2 = clock();
  32.     } while( t2 < t1 );
  33. }
  34.  
  35. /* getkey - Holt einen Tastaturanschlag. Es wird dabei zwischen ASCII- und
  36.  * Funktions- bzw. Steuertasten mit unterschiedlichem Umschaltstatus
  37.  * unterschieden. Kann auch mit Kennung verwendet werden, um sofort
  38.  * zurückzukehren, wenn keine Taste verfügbar ist.
  39.  *
  40.  * Parameter:  waitflag - Code zur Angabe, wie der Tastatur-Zwischenspeicher
  41.  *                        zu handhaben ist:
  42.  * NO_WAIT     Ergibt 0 wenn keine Taste im Zwischenspeicher, sonst die
  43.  *             Taste
  44.  * WAIT        Ergibt eine Taste sofern vorhanden, wartet sonst auf Taste
  45.  * CLEAR_WAIT  Evtl. im Zwischenspeicher vorhandene Taste löschen und auf
  46.  *             neue Taste warten
  47.  *
  48.  * Ergebniswert: Einer der folgenden:
  49.  *
  50.  * Tastentyp                         Hochwertiges Byte  Niedrigwertiges Byte
  51.  * ---------                         -----------------  --------------------
  52.  * Keine Taste verfügbar (nur mit NO_WAIT)      0           0
  53.  * ASCII-Wert                                   0        ASCII code
  54.  * F-Taste oder Zahlenblock ohne Umsch.         1        Abtastcode
  55.  * F-Taste oder Zahlenblock mit Umsch.          2        Abtastcode
  56.  * STRG + F-Taste oder Zahlenblock              3        Abtastcode
  57.  * ALT + F-Taste oder Zahlenblock               4        Abtastcode
  58.  *
  59.  * Hinweis:  getkey kann keine Codes für solche Tasten ergeben, die nicht
  60.  * vom BIOS erkannt werden, wie beispielsweise STRG+BILD oder die 5er-Taste
  61.  * auf dem Zahlenblock.
  62.  */
  63. unsigned getkey( int waitflag )
  64. {
  65.     unsigned inkey, shiftstate;
  66.  
  67.     /* Ist CLEAR_WAIT bestimmt, Tastatur-Zwischenspeicher entleeren. */
  68.     if( waitflag == CLEAR_WAIT )
  69.         while( _bios_keybrd( _KEYBRD_READY ) )
  70.             _bios_keybrd( _KEYBRD_READ );
  71.  
  72.     /* Bei NO_WAIT 0 ergeben, wenn keine Taste bereit ist. */
  73.     if( !waitflag && !_bios_keybrd( _KEYBRD_READY ) )
  74.      return FALSCH;
  75.  
  76.     /* Tastencode holen. */
  77.     inkey = _bios_keybrd( _KEYBRD_READ );
  78.  
  79.     /* Ist niedrigwertiges Byte ungleich Null, handelt es sich um eine
  80.      * ASCII-Taste. Abtastcode prüfen, ob sie zum Zahlenblock gehört. Falls
  81.      * nicht, hochwertiges Byte löschen und Wert ausgeben.
  82.      */
  83.     if( inkey & 0x00ff )
  84.         if( (inkey >> 8) < 69 )
  85.             return( inkey & 0x00ff );
  86.  
  87.     /* Ist es eine Funktions- oder Zahlenblocktaste, Abtastecode ins
  88.      * hochwertige und Umschaltstatus ins niedrigwertige Byte geben.
  89.      */
  90.     inkey >>= 8;
  91.     shiftstate = _bios_keybrd( _KEYBRD_SHIFTSTATUS ) & 0x000f;
  92.     switch( shiftstate )
  93.     {
  94.         case 0:
  95.             return( 0x0100 | inkey );  /* Keine (1)    */
  96.         case 1:
  97.         case 2:
  98.         case 3:
  99.             return( 0x0200 | inkey );  /* Umschalt (2)   */
  100.         case 4:
  101.             return( 0x0300 | inkey );  /* Steuerung (3) */
  102.         case 8:
  103.             return( 0x0400 | inkey );  /* Alt (4)     */
  104.     }
  105. }
  106.