home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / driver / drvlib.inc < prev    next >
Encoding:
Text File  |  1992-04-06  |  3.3 KB  |  99 lines

  1. /* DRVLIB.INC - Bibliothek der Treiberfunktionen */
  2. #if sizeof(void *) == 2
  3. #error Grosses Datenmodell benutzen!
  4. #endif
  5. #include <dos.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <process.h>
  9. #define DRVLIBINC
  10.  
  11. #ifndef DOSLIBH
  12. typedef struct DrvHead   /* Struktur eines Gerätetreiber-Kopfes */
  13.  { struct DrvHead far *DNext; /* Zeiger auf den nächsten Treiber */
  14.    unsigned DAttr;      /* Geräteattribut, <> Func $4400! */
  15.    unsigned DStrat;     /* Offset-Adresse der "Strategy"-Routine */
  16.    unsigned DIntr;      /* Offset-Adresse der "Interrupt"-Routine */
  17.    char NameOrUnits[8]; /* Name bzw. Anzahl Laufwerke */
  18.  } DriverHead, far *DriverPointer;
  19. #endif
  20.  
  21. DriverPointer GetFirstHeader(void)  /* liefert die Adresse von NUL */
  22. { union REGS Regs;
  23.   struct SREGS SRegs;
  24.  
  25.   /* DOS-Datenbereich ermitteln */
  26.   Regs.h.ah = 0x52; intdosx(&Regs,&Regs,&SRegs);
  27.   if (_osmajor < 3) Regs.x.bx += 0x18;
  28.    else if (_osmajor == 3) Regs.x.bx += 0x28;
  29.    else Regs.x.bx += 0x22;
  30.   return MK_FP(SRegs.es,Regs.x.bx);
  31. }
  32.  
  33. /* Sucht die Treiber-Kette von DOS ab und ermittelt das Attribut
  34.    sowie die Aufrufadressen der Strategie- und Interrupt-Routinen.
  35.    Bei Aufruf mit einem Nullstring wird der zuletzt eingebaute
  36.    Blocktreiber lokalisiert, ansonsten gehts um Zeichentreiber.
  37. */
  38. #ifndef DOSLIBH
  39. DriverPointer LocateDriver(const char *DriverName)
  40. { DriverPointer DHead;    /* Zeiger auf den aktuellen Treiberkopf */
  41.   char DName[9];          /* Lokalkopie des Treibernamens */
  42.   int SearchChar,x;
  43.  
  44.   if ((SearchChar = strlen(strcpy(DName,DriverName))) != 0)
  45.    { for (x = SearchChar; x < 9; x++) DName[x] = ' ';
  46.      DName[8] = '\0';  /* Treibernamen auf 8 Zeichen bringen */
  47.    }
  48.  
  49.   DHead = GetFirstHeader();  /* Kopf von NUL ermitteln */
  50.  
  51.   /* Absuchen der Kette nach dem entsprechenden Gerät oder dem
  52.      zuletzt eingebauten Blocktreiber
  53.   */
  54.   while ((SearchChar && strncmp(DHead->NameOrUnits,DName,8))
  55.     || (!SearchChar && (DHead->DAttr & 0x8000)))
  56.    { DHead = DHead->DNext; /* nächster Treiberkopf */
  57.      if (FP_OFF(DHead) == 0xFFFF) /* Kettenende? */
  58.       return (void *)0;
  59.    }
  60.   return DHead;
  61. }
  62. #endif
  63.  
  64. /* Ausgabe der Daten eines Treiberkopfes */
  65. void ShowDriver(DriverPointer p)
  66. { int x;
  67.  
  68.   if (!p)
  69.    { printf("Treiber nicht lokalisierbar!\n");
  70.      abort();
  71.    }
  72.   if (p->DAttr & 0x8000)
  73.    { printf("Gerät ");
  74.      for (x = 0; x < 8; x++) putchar(p->NameOrUnits[x]);
  75.    } else printf("Block (%d Lw.)", p->NameOrUnits[0]);
  76.   printf(" - Attr: 0x%04X, Strat: 0x%04X:%04X, Intr: 0x%04X:%04X\n",
  77.          p->DAttr, FP_SEG(p),p->DStrat,FP_SEG(p),p->DIntr);
  78. }
  79.  
  80. /* Aufruf der Strategie-Routine, d.h. Übergabe Parameterblock */
  81. void CallStrategy(DriverPointer Driver, void far *ParmBlock)
  82. { void far (*DStrategy)(void);   /* Adresse der "Strategie"-Routine */
  83.  
  84.   DStrategy = MK_FP(FP_SEG(Driver),Driver->DStrat);
  85.   _BX = FP_OFF(ParmBlock); _ES = FP_SEG(ParmBlock);
  86.   DStrategy();
  87. }
  88.  
  89. /* Aufruf der Interrupt-Routine, d.h. Ausführung der Funktion */
  90. void CallInterrupt(DriverPointer Driver)
  91. { void far (*DInterrupt)(void);  /* Adresse der "Interrupt"-Routine */
  92.  
  93.   DInterrupt = MK_FP(FP_SEG(Driver),Driver->DIntr);
  94.   __emit__(0x1E,0x55);            /* asm push  ds; push bp  */
  95.   DInterrupt();
  96.   __emit__(0x5D,0x1F);            /* asm pop   bp; pop ds   */
  97. }
  98.  
  99.