|
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" );
}
.