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
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, ®s, ®s ); /* 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 fr die Zeichen * * Return-Wert : keiner * ***********************************************************************/ void ClrScr( BYTE farbe ) { union REGS regs; /* Prozessorregs. fr Interruptaufruf */ /*-- Bildschirm mit Hilfe der BIOS-Scroll-Funktion l"schen ----------*/ regs.h.ah = 6; /* Funktionsnummer fr 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, ®s, ®s); /* BIOS-Video-Interrupt aufrufen */ /*-- Cursor mit Hilfe des BIOS in die obere linke Ecke setzen -------*/ regs.h.ah = 2; /* Funktionsnummer fr Set Cursor */ regs.h.bh = 0; /* auf die Bildschirmseite 0 zugreifen */ regs.x.dx = 0; /* obere linke Bildshirmecke */ int86(0x10, ®s, ®s); /* 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 fr VA_... Macros */ union REGS regs; /* Prozessorregs. fr Interruptaufruf */ /*-- Cursor mit Hilfe des BIOS auf Ausgabeposition setzen -----------*/ regs.h.ah = 2; /* Funktionsnummer fr 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, ®s, ®s); /* 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. fr Button 1 / Joystick 1 * * J1B2 = Ptr auf Var. fr Button 2 / Joystick 1 * * J2B1 = Ptr auf Var. fr Button 1 / Joystick 2 * * J2B2 = Ptr auf Var. fr Button 2 / Joystick 2 * * Return-Wert : keiner * * Info : die verschiedenen Variablen nehmen den Wert 1 * * (TRUE) auf, wenn der korrespondierende Joystick- * * Button niedergedrckt 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, ®s, ®s ); /* 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 fr ersten * * Joystick * * JS2PTR = Zeiger auf Joystick-Struktur fr 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, ®s, ®s ); /* 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, /* ausgewhlter 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 */ /*-- zunchst maximale Joystick-Stellung ermitteln ------------------*/ ClrScr( 0x07 ); printf( "Bitte bewegen Sie den Joystick in die obere rechte" \ "Schalter-\nstellung und bettigen Sie einen der beiden "\ "Buttons\n" ); do /* auf Bettigung 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 auswhlen */ 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 bettigen Sie einen der beiden "\ "Buttons\n" ); do /* wieder auf Bettigung 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 fr */ yfaktor = 23.0 / ( maxy - miny + 1 ); /* X- und Y-Achse berechnen */ /*-- Joystick abfragen und Joystick-Position anzeigen, bis beide ----*/ /*-- Tasten bettigt werden ----*/ ClrScr( 0x07 ); printfat( 43, 0, "JOYSTC - (c) 1991 by MICHAEL TISCHER" ); printfat( 0, 24 , "Bettigen 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 vernderter 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" ); }
.