home *** CD-ROM | disk | FTP | other *** search
- /* TOOLS - Modul mit mehreren allgemeinen Funktionen, die sich von
- * beliebigen Programmen aus verwenden lassen. TOOLS.H muß dabei als
- * Einfügdatei vorliegen.
- */
-
- #include <conio.h>
- #include <string.h>
- #include <time.h>
- #include <graph.h>
- #include <bios.h>
- #include "tools.h"
-
- /* delay - Hält das Programm für eine bestimmte Anzahl von Mikrosekunden an.
- * Verlangsamt LIFE, indem zwischen Generationen verzögert wird.
- *
- * Parameter: wait - Zeit in Mikrosekondunden
- *
- * Ergebniswert: Keiner
- */
- void delay( clock_t wait )
- {
-
- clock_t t1, t2;
-
- if( !wait )
- return;
-
- t1 = wait + clock();
- do
- {
- t2 = clock();
- } while( t2 < t1 );
- }
-
- /* getkey - Holt einen Tastaturanschlag. Es wird dabei zwischen ASCII- und
- * Funktions- bzw. Steuertasten mit unterschiedlichem Umschaltstatus
- * unterschieden. Kann auch mit Kennung verwendet werden, um sofort
- * zurückzukehren, wenn keine Taste verfügbar ist.
- *
- * Parameter: waitflag - Code zur Angabe, wie der Tastatur-Zwischenspeicher
- * zu handhaben ist:
- * NO_WAIT Ergibt 0 wenn keine Taste im Zwischenspeicher, sonst die
- * Taste
- * WAIT Ergibt eine Taste sofern vorhanden, wartet sonst auf Taste
- * CLEAR_WAIT Evtl. im Zwischenspeicher vorhandene Taste löschen und auf
- * neue Taste warten
- *
- * Ergebniswert: Einer der folgenden:
- *
- * Tastentyp Hochwertiges Byte Niedrigwertiges Byte
- * --------- ----------------- --------------------
- * Keine Taste verfügbar (nur mit NO_WAIT) 0 0
- * ASCII-Wert 0 ASCII code
- * F-Taste oder Zahlenblock ohne Umsch. 1 Abtastcode
- * F-Taste oder Zahlenblock mit Umsch. 2 Abtastcode
- * STRG + F-Taste oder Zahlenblock 3 Abtastcode
- * ALT + F-Taste oder Zahlenblock 4 Abtastcode
- *
- * Hinweis: getkey kann keine Codes für solche Tasten ergeben, die nicht
- * vom BIOS erkannt werden, wie beispielsweise STRG+BILD oder die 5er-Taste
- * auf dem Zahlenblock.
- */
- unsigned getkey( int waitflag )
- {
- unsigned inkey, shiftstate;
-
- /* Ist CLEAR_WAIT bestimmt, Tastatur-Zwischenspeicher entleeren. */
- if( waitflag == CLEAR_WAIT )
- while( _bios_keybrd( _KEYBRD_READY ) )
- _bios_keybrd( _KEYBRD_READ );
-
- /* Bei NO_WAIT 0 ergeben, wenn keine Taste bereit ist. */
- if( !waitflag && !_bios_keybrd( _KEYBRD_READY ) )
- return FALSCH;
-
- /* Tastencode holen. */
- inkey = _bios_keybrd( _KEYBRD_READ );
-
- /* Ist niedrigwertiges Byte ungleich Null, handelt es sich um eine
- * ASCII-Taste. Abtastcode prüfen, ob sie zum Zahlenblock gehört. Falls
- * nicht, hochwertiges Byte löschen und Wert ausgeben.
- */
- if( inkey & 0x00ff )
- if( (inkey >> 8) < 69 )
- return( inkey & 0x00ff );
-
- /* Ist es eine Funktions- oder Zahlenblocktaste, Abtastecode ins
- * hochwertige und Umschaltstatus ins niedrigwertige Byte geben.
- */
- inkey >>= 8;
- shiftstate = _bios_keybrd( _KEYBRD_SHIFTSTATUS ) & 0x000f;
- switch( shiftstate )
- {
- case 0:
- return( 0x0100 | inkey ); /* Keine (1) */
- case 1:
- case 2:
- case 3:
- return( 0x0200 | inkey ); /* Umschalt (2) */
- case 4:
- return( 0x0300 | inkey ); /* Steuerung (3) */
- case 8:
- return( 0x0400 | inkey ); /* Alt (4) */
- }
- }
-