/**********************************************************************/ /* P L I N K C . C */ /*--------------------------------------------------------------------*/ /* Aufgabe : bertragen von Dateien ber die parallele */ /* Schnittstelle */ /*--------------------------------------------------------------------*/ /* Autor : Michael Tischer */ /* entwickelt am : 27.09.1991 */ /* letztes Update: 28.11.1991 */ /*--------------------------------------------------------------------*/ /* Speichermodell: SMALL */ /**********************************************************************/ /*== Include-Dateien einbinden =======================================*/ #include #include #include #include #include #include #include /* Directory-Funktionen einbinden */ #include /* fr toupper() */ /*== Typdefinitionen =================================================*/ typedef unsigned char BYTE; /* definiere ein Byte */ typedef unsigned int WORD; /* wir basteln uns ein WORD */ typedef struct { /* Header zum šbertragen von Bl”cken */ BYTE Token; unsigned int Len; } BHEADER; /*== Funktionen aus dem Assembler-Modul ==============================*/ extern void INTRINSTALL( int far * escape_flag, int far * sec_flag ); extern void INTRREMOVE( void ); extern void EscapeDirekt( int ausloesen ); /*== Konstanten ======================================================*/ #define TRUE ( 0 == 0 ) #define FALSE ( 0 == 1 ) /*== Makros ==========================================================*/ #ifdef MK_FP /* Makro MK_FP schon definiert? */ #undef MK_FP /* Ja, dann Makro l”schen */ #endif #define MK_FP(seg,ofs) ((void far *) ((unsigned long) (seg)<<16|(ofs))) /*== Globale Variablen ===============================================*/ int EinPort; /* Adresse des Eingabeports */ int AusPort; /* Adresse des Ausgabeports */ int Escape = 0; /* kein ESCAPE gedrckt */ int SecFlag = 0; /* wird jede sekunde gesetzt */ int SecCount = 0; /* wird hochgezaehlt */ /**********************************************************************/ /* GetPortAdr: Initialisiert die Portadressen einer parallelen */ /* Schnittstelle in den globalen Variablen EINPORT und */ /* AUSPORT */ /* Eingabe : NUMMER = Nummer der parallelen Schnittstelle (1-4) */ /* Ausgabe : TRUE, wenn Schnittstelle gltig */ /* Globale Var. : EinPort/W, AusPort/W */ /* Info : Die Basisadressen der bis zu 4 parallelen Schnitt- */ /* stellen stehen in den vier Speicherworten */ /* beginnend bei 0040:0008 */ /**********************************************************************/ int GetPortAdr( int Nummer ) { /* Portadresse aus BIOS-Variablen-Segment auslesen */ AusPort = *( WORD far * ) MK_FP( 0x0040, 6 + Nummer * 2 ); if ( AusPort != 0 ) /* Schnittstelle vorhanden? */ { /* Ja */ EinPort = AusPort + 1; /* Adresse fr Eingaberegister */ outportb(AusPort,0x00); return TRUE; /* Ende ohne Fehler */ } else return FALSE; /* Fehler: Schnittstelle nicht vorhanden */ } wait_1sec() { SecFlag=0; while (!SecFlag); SecFlag=0; while (!SecFlag); } exit_prog(char *msg) { printf("%s\n",msg); outportb(AusPort,0x00); exit(0); } /**********************************************************************/ /* H A U P T P R O G R A M M */ /**********************************************************************/ void main( int argc, char *argv[] ) { float fl_tmp, fl_disc, nc_ah; int i, Nummer; if ( argc!=1 ) if ( strcmp( argv[ 1 ], "?" ) == 0 ) /* nur Syntax ausgeben? */ exit_prog("use: nc_ah\n"); /*-- Defaultwerte setzen und Kommmandozeile auswerten ---------------*/ Nummer = 2; /* Default ist LPT2 */ /*-- šbertragung starten --------------------------------------------*/ if ( GetPortAdr(Nummer) == FALSE ) /* existiert die Schnittstelle */ exit_prog("LPT2 existiert nicht !"); printf("LPT-adr: %04x\n",AusPort); INTRINSTALL( &Escape, &SecFlag ); /* Interrupt-Handler init */ /* reset counter */ outportb(AusPort,0x0a); wait_1sec(); outportb(AusPort,0x00); /* set to 2.5 Ampere */ for (i=0;i<10;i++) { outportb(AusPort,0x01); outportb(AusPort,0x00); } printf("2.5 Ampere - "); fl_disc=2.5; /* set to 7 Volt */ for (i=0;i<7;i++) { outportb(AusPort,0x04); outportb(AusPort,0x00); } printf("7 Volt\n"); wait_1sec(); outport(AusPort,0x80); /* start discharge */ SecFlag=0; SecCount=0; while ( (inportb(EinPort)&0x08)==0 && !Escape ) { if (SecFlag) { SecFlag=0; SecCount++; fl_tmp=(float)SecCount; fl_tmp/=3600.0; nc_ah=fl_tmp*fl_disc; printf("\r Capacity : %10.3f ",nc_ah); } } INTRREMOVE(); exit_prog("Alles ok"); }