Home   -   Gallery   Geology   Music   Software   Hiking   Links   Sport   What?  
Projects   Sources   V4   Flightsim   Joystick   Workshop  
1   2   3   4   5   6   7   8   Anl  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O  
Page 354 of 401
 <   > 

Anlage F zum Joystick-Papier

(F)   Quelltextbeispiel joystc.c

Tischer 1992-1995
Joystc.c
Standalone C-Programm für DOS

(1) Demonstriert Verwendung des BIOS-Joystick-Funktionen: Interrupt 15h Funktion 84h, Unterfunktion 0 und 1

Schlüsselpassage:


void GetJoyPos( JSPOS *Js1Ptr, JSPOS *Js2Ptr )
{
 union REGS regs;             /* für Prozessorregister */

 regs.h.ah = 0x84;            /* Funktion 84h */
 regs.x.dx = 1;               /* Unterfunktion 01h */
 int86( 0x15, &regs, &regs ); /* Interrupt 15h aufrufen */
 Js1Ptr->x = regs.x.ax;       /* X-Position Joystick 1 */
 Js1Ptr->y = regs.x.bx;       /* Y-Position Joystick 1 */
 Js2Ptr->x = regs.x.cx;       /* X-Position Joystick 2 */
 Js2Ptr->y = regs.x.dx;       /* Y-Position Joystick 2 */
}

"union REGS" ist eine von manchen Compilern zur Verfügung gestellte Struktur, in der sich die Prozessor-Register unterbringen lassen, eine Komfort-Schnittstelle zum Assembler also.

"int86()" ist eine Funktion, die manche Compiler zur Verfügung stellen, um gesicherte Interrupt-Aufrufe zu ermöglichen. Interrupt-Behandlung ist eine Sache für Assembler - der C-Compiler wrappt den Interrupt.

 


File Joystick.c of Tischer 1992-1995:



/**********************************************************************/
/*                             J O Y S T C                            */
/*--------------------------------------------------------------------*/
/*    Aufgabe        : Demonstriert die Abfrage des Jyosticks  mit    */
/*                     Hilfe des BIOS                                 */
/*--------------------------------------------------------------------*/
/*    Autor          : MICHAEL TISCHER                                */
/*    entwickelt am  : 25.02.1991                                     */
/*    letztes Update : 25.02.1991                                     */
/*--------------------------------------------------------------------*/
/*    (MICROSOFT C)                                                   */
/*    Erstellung     : CL /AS JOYSTC.C                                */
/*    Aufruf         : JOYSTC                                         */
/*--------------------------------------------------------------------*/
/*    (BORLAND TURBO C)                                               */
/*    Erstellung     : ber den Befehl COMPILE / MAKE                 */
/**********************************************************************/

/*== Include-Dateien einbinden =======================================*/

#include <dos.h>
#include <stdio.h>
#include <stdarg.h>

/*== Typdeklarationen ================================================*/

typedef unsigned char BYTE;
typedef struct {           /* beschreibt die Position eines Joysticks */
                int x;
                int y;
               } JSPOS;

/***********************************************************************
*  ClrScr: l"scht den Bildschirm                                       *
**--------------------------------------------------------------------**
*  Eingabe-Parameter: FARBE  = das Attribut fr die Zeichen            *
*  Return-Wert      : keiner                                           *
***********************************************************************/

void ClrScr( BYTE farbe )
{
 union REGS regs;               /* Prozessorregs. fr Interruptaufruf */

 /*-- Bildschirm mit Hilfe der BIOS-Scroll-Funktion l"schen ----------*/

 regs.h.ah = 6;                    /* Funktionsnummer fr Scroll-Down */
 regs.h.al = 0;                 /* um 0 Zeilen scrollen ( = l"schen ) */
 regs.h.bh = farbe;                              /* Farbe der Zeichen */
 regs.x.cx = 0;                            /* obere linke Fensterecke */
 regs.x.dx = ( 24 << 8 ) + 79;           /* untere rechte Fensterecke */
 int86(0x10, &regs, &regs);          /* BIOS-Video-Interrupt aufrufen */

 /*-- Cursor mit Hilfe des BIOS in die obere linke Ecke setzen -------*/

 regs.h.ah = 2;                     /* Funktionsnummer fr Set Cursor */
 regs.h.bh = 0;                /* auf die Bildschirmseite 0 zugreifen */
 regs.x.dx = 0;                          /* obere linke Bildshirmecke */
 int86(0x10, &regs, &regs);              /* BIOS-Video-Intr. aufrufen */
}

/***********************************************************************
*  printfat : gibt einen formatierten String an einer beliebigen Bild- *
*             schirmposition aus                                       *
**--------------------------------------------------------------------**
*  Eingabe-Parameter: SPALTE = die Ausgabeposition                     *
*                     ZEILE                                            *
*                     STRING = Pointer auf den String                  *
*                     ...    = die Argumente wie bei PRINTF()          *
*  Return-Wert      : keiner                                           *
*  Info             : Diese Funktion darf nur aufgerufen werden, nach- *
*                     dem zuvor die Existenz einer EGA- oder VGA-Karte *
*                     festgestellt wurde                               *
***********************************************************************/

void printfat( BYTE spalte, BYTE zeile, char * string, ... )
{
 va_list parameter;              /* Parameter-Liste fr VA_... Macros */
 union REGS regs;               /* Prozessorregs. fr Interruptaufruf */

 /*-- Cursor mit Hilfe des BIOS auf Ausgabeposition setzen -----------*/

 regs.h.ah = 2;                     /* Funktionsnummer fr Set Cursor */
 regs.h.bh = 0;                /* auf die Bildschirmseite 0 zugreifen */
 regs.h.dh = zeile;                                   /* Zeile merken */
 regs.h.dl = spalte;                                 /* Spalte merken */
 int86(0x10, &regs, &regs);              /* BIOS-Video-Intr. aufrufen */

 /*-- String ausgeben ------------------------------------------------*/

 va_start( parameter, string );
 vprintf( string, parameter );
}

/***********************************************************************
*  Funktion         : G E T J O Y B U T T O N                          *
**--------------------------------------------------------------------**
*  Aufgabe          : Liefert die Stellung der Joystick-Buttons        *
*  Eingabe-Parameter: J1B1 = Ptr auf Var. fr Button 1 / Joystick 1    *
*                     J1B2 = Ptr auf Var. fr Button 2 / Joystick 1    *
*                     J2B1 = Ptr auf Var. fr Button 1 / Joystick 2    *
*                     J2B2 = Ptr auf Var. fr Button 2 / Joystick 2    *
*  Return-Wert      : keiner                                           *
*  Info             : die verschiedenen Variablen nehmen den Wert 1    *
*                     (TRUE) auf, wenn der korrespondierende Joystick- *
*                     Button niedergedrckt ist, sonst 0 (FALSE).      *
***********************************************************************/

void GetJoyButton( BYTE *j1b1, BYTE *j1b2, BYTE *j2b1, BYTE *j2b2 )
{
 union REGS regs;                  /* nimmt die Prozessorregister auf */

 regs.h.ah = 0x84;                                    /* Funktion 84h */
 regs.x.dx = 0;                                  /* Unterfunktion 00h */
 int86( 0x15, &regs, &regs );               /* Interrupt 15h aufrufen */
 *j1b1 = (( regs.h.al &  16 ) >> 4) ^ 1;       /* Bit 4 von AL = J1B1 */
 *j1b2 = (( regs.h.al &  32 ) >> 5) ^ 1;       /* Bit 5 von AL = J1B2 */
 *j2b1 = (( regs.h.al &  64 ) >> 6) ^ 1;       /* Bit 6 von AL = J2B1 */
 *j2b2 = (( regs.h.al & 128 ) >> 7) ^ 1;       /* Bit 7 von AL = J2B2 */
}

/***********************************************************************
*  Funktion         : G E T J O Y P O S                                *
**--------------------------------------------------------------------**
*  Aufgabe          : Liefert die Position der beiden Joysticks        *
*  Eingabe-Parameter: JS1PTR = Zeiger auf Joystick-Struktur fr ersten *
*                              Joystick                                *
*                     JS2PTR = Zeiger auf Joystick-Struktur fr zwei-  *
*                              ten Joystick                            *
*  Return-Wert      : keiner                                           *
***********************************************************************/

void GetJoyPos( JSPOS *Js1Ptr, JSPOS *Js2Ptr )
{
 union REGS regs;                  /* nimmt die Prozessorregister auf */

 regs.h.ah = 0x84;                                    /* Funktion 84h */
 regs.x.dx = 1;                                  /* Unterfunktion 01h */
 int86( 0x15, &regs, &regs );               /* Interrupt 15h aufrufen */
 Js1Ptr->x = regs.x.ax;                      /* X-Position Joystick 1 */
 Js1Ptr->y = regs.x.bx;                      /* Y-Position Joystick 1 */
 Js2Ptr->x = regs.x.cx;                      /* X-Position Joystick 2 */
 Js2Ptr->y = regs.x.dx;                      /* Y-Position Joystick 2 */
}

/**********************************************************************/
/**                           HAUPTPROGRAMM                          **/
/**********************************************************************/

void main()
{
 JSPOS jsp[2];                          /* aktuelle Joystick-Position */
 int   maxx, maxy,                      /* maximale Joystick-Position */
       minx, miny,                      /* minimale Joystick-Position */
       x, y,                          /* aktuelle Bildschirm-Position */
       xold, yold;                      /* letzte Bildschirm-Position */
 BYTE  aktstick,                             /* ausgew„hlter Joystick */
       j1but[2],                     /* Button 1 auf Joystick 1 und 2 */
       j2but[2];                     /* Button 2 auf Joystick 1 und 2 */
 float xfaktor, yfaktor;               /* Umrechnungsfaktoren X und Y */


 /*-- zun„chst maximale Joystick-Stellung ermitteln ------------------*/

 ClrScr( 0x07 );
 printf( "Bitte bewegen Sie den Joystick in die obere rechte" \
         "Schalter-\nstellung und bet„tigen Sie einen der beiden "\
         "Buttons\n" );

 do                     /* auf Bet„tigung einer Joystick-Taste warten */
  GetJoyButton( &j1but[0], &j2but[0], &j1but[1], &j2but[1] );
 while ( ( j1but[0] | j2but[0] | j1but[1] | j2but[1] ) == 0 );

 aktstick = ( j1but[0] | j2but[0] ) ? 0 : 1;    /* Joystick ausw„hlen */

 GetJoyPos( &jsp[0], &jsp[1] );                  /* Position abfragen */
 maxx = jsp[aktstick].x;                         /* und merken        */
 miny = jsp[aktstick].y;

 do                           /* warten, bis Taste wieder losgelassen */
  GetJoyButton( &j1but[0], &j2but[0], &j1but[1], &j2but[1] );
 while ( ( j1but[aktstick] | j2but[aktstick] ) != 0 );

 /*-- jetzt minimale Position ermitteln ------------------------------*/

 printf( "\n\nBitte bewegen Sie den Joystick jetzt in die untere linke"\
         " Schalter-\nstellung und bet„tigen Sie einen der beiden "\
         "Buttons\n" );

 do                       /* wieder auf Bet„tigung einer Taste warten */
  GetJoyButton( &j1but[0], &j2but[0], &j1but[1], &j2but[1] );
 while ( ( j1but[aktstick] | j2but[aktstick] ) == 0 );

 GetJoyPos( &jsp[0], &jsp[1] );                  /* Position abfragen */
 minx = jsp[aktstick].x;                         /* und merken        */
 maxy = jsp[aktstick].y;

 xfaktor = 80.0 / ( maxx - minx + 1 );    /* Umrechnungsfaktoren fr  */
 yfaktor = 23.0 / ( maxy - miny + 1 );    /* X- und Y-Achse berechnen */

 /*-- Joystick abfragen und Joystick-Position anzeigen, bis beide ----*/
 /*-- Tasten bet„tigt werden                                      ----*/

 ClrScr( 0x07 );
 printfat( 43, 0, "JOYSTC - (c) 1991 by MICHAEL TISCHER" );
 printfat( 0, 24 , "Bet„tigen Sie beide Joystick-Tasten, um das " \
                   "Programm zu beenden" );

 xold = yold = 0;                           /* alte Position vorgeben */
 do
  {
   GetJoyPos( &jsp[0], &jsp[1] );                /* Position abfragen */

   /*-- neue X-Position des Joysticks berechnen ----------------------*/

   x = (int) ( xfaktor * (float) ( jsp[aktstick].x - minx + 1 ) );
   if ( x < 0 )
     x = 0;
   if ( x > 79 )
     x = 79;

   /*-- neue Y-Position des Joysticks berechnen ----------------------*/

   y = (int) ( yfaktor * (float) ( jsp[aktstick].y - miny + 1 ) );
   if ( y < 0 )
     y = 0;
   if ( y > 22 )
     y = 22;

   /*-- bei ver„nderter Position neue Position anzeigen --------------*/

   if ( x != xold  ||  y != yold )
    {
     printfat( (BYTE) xold, (BYTE) (yold+1), " " );
     printfat( (BYTE) x, (BYTE) (y+1), "X" );
     xold = x;
     yold = y;
    }

   printfat( 0, 0, "(%3d,%3d)", jsp[aktstick].x, jsp[aktstick].y );
   GetJoyButton( &j1but[0], &j2but[0], &j1but[1], &j2but[1] );
  }
 while (!( j1but[aktstick] == 1  && j2but[aktstick] == 1 ));
 ClrScr( 0x07 );
 printf( "Das war's\n" );
}

.