home *** CD-ROM | disk | FTP | other *** search
- /* DRVLIB.INC - Bibliothek der Treiberfunktionen */
- #if sizeof(void *) == 2
- #error Grosses Datenmodell benutzen!
- #endif
- #include <dos.h>
- #include <string.h>
- #include <stdio.h>
- #include <process.h>
- #define DRVLIBINC
-
- #ifndef DOSLIBH
- typedef struct DrvHead /* Struktur eines Gerätetreiber-Kopfes */
- { struct DrvHead far *DNext; /* Zeiger auf den nächsten Treiber */
- unsigned DAttr; /* Geräteattribut, <> Func $4400! */
- unsigned DStrat; /* Offset-Adresse der "Strategy"-Routine */
- unsigned DIntr; /* Offset-Adresse der "Interrupt"-Routine */
- char NameOrUnits[8]; /* Name bzw. Anzahl Laufwerke */
- } DriverHead, far *DriverPointer;
- #endif
-
- DriverPointer GetFirstHeader(void) /* liefert die Adresse von NUL */
- { union REGS Regs;
- struct SREGS SRegs;
-
- /* DOS-Datenbereich ermitteln */
- Regs.h.ah = 0x52; intdosx(&Regs,&Regs,&SRegs);
- if (_osmajor < 3) Regs.x.bx += 0x18;
- else if (_osmajor == 3) Regs.x.bx += 0x28;
- else Regs.x.bx += 0x22;
- return MK_FP(SRegs.es,Regs.x.bx);
- }
-
- /* Sucht die Treiber-Kette von DOS ab und ermittelt das Attribut
- sowie die Aufrufadressen der Strategie- und Interrupt-Routinen.
- Bei Aufruf mit einem Nullstring wird der zuletzt eingebaute
- Blocktreiber lokalisiert, ansonsten gehts um Zeichentreiber.
- */
- #ifndef DOSLIBH
- DriverPointer LocateDriver(const char *DriverName)
- { DriverPointer DHead; /* Zeiger auf den aktuellen Treiberkopf */
- char DName[9]; /* Lokalkopie des Treibernamens */
- int SearchChar,x;
-
- if ((SearchChar = strlen(strcpy(DName,DriverName))) != 0)
- { for (x = SearchChar; x < 9; x++) DName[x] = ' ';
- DName[8] = '\0'; /* Treibernamen auf 8 Zeichen bringen */
- }
-
- DHead = GetFirstHeader(); /* Kopf von NUL ermitteln */
-
- /* Absuchen der Kette nach dem entsprechenden Gerät oder dem
- zuletzt eingebauten Blocktreiber
- */
- while ((SearchChar && strncmp(DHead->NameOrUnits,DName,8))
- || (!SearchChar && (DHead->DAttr & 0x8000)))
- { DHead = DHead->DNext; /* nächster Treiberkopf */
- if (FP_OFF(DHead) == 0xFFFF) /* Kettenende? */
- return (void *)0;
- }
- return DHead;
- }
- #endif
-
- /* Ausgabe der Daten eines Treiberkopfes */
- void ShowDriver(DriverPointer p)
- { int x;
-
- if (!p)
- { printf("Treiber nicht lokalisierbar!\n");
- abort();
- }
- if (p->DAttr & 0x8000)
- { printf("Gerät ");
- for (x = 0; x < 8; x++) putchar(p->NameOrUnits[x]);
- } else printf("Block (%d Lw.)", p->NameOrUnits[0]);
- printf(" - Attr: 0x%04X, Strat: 0x%04X:%04X, Intr: 0x%04X:%04X\n",
- p->DAttr, FP_SEG(p),p->DStrat,FP_SEG(p),p->DIntr);
- }
-
- /* Aufruf der Strategie-Routine, d.h. Übergabe Parameterblock */
- void CallStrategy(DriverPointer Driver, void far *ParmBlock)
- { void far (*DStrategy)(void); /* Adresse der "Strategie"-Routine */
-
- DStrategy = MK_FP(FP_SEG(Driver),Driver->DStrat);
- _BX = FP_OFF(ParmBlock); _ES = FP_SEG(ParmBlock);
- DStrategy();
- }
-
- /* Aufruf der Interrupt-Routine, d.h. Ausführung der Funktion */
- void CallInterrupt(DriverPointer Driver)
- { void far (*DInterrupt)(void); /* Adresse der "Interrupt"-Routine */
-
- DInterrupt = MK_FP(FP_SEG(Driver),Driver->DIntr);
- __emit__(0x1E,0x55); /* asm push ds; push bp */
- DInterrupt();
- __emit__(0x5D,0x1F); /* asm pop bp; pop ds */
- }
-
-