home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Programmierung / SOURCE.mdf / programm / msdos / c / dmkit / flat / loader.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-31  |  5.7 KB  |  266 lines

  1. //** LOADER ->    DIGPAK and MIDPAK dynamic loader.
  2. //**                        Include this header file to support dynamic loading of
  3. //**                        the real-mode DIGPAK and MIDPAK drivers.    If you only
  4. //**                        want DIGPAK suppor then set MIDPAK_LOADER to false, if
  5. //**                        you just want MIDPAK support then set DIGPAK_LOADER to false.
  6. //**                        Requires: SUPPORT.C SUPPORT.H  basic file i/o memory managment.
  7. //**                                            VECTOR.ASM VECTOR.H  Hook and unhook the realmode
  8. //**                                            VECTOR.COM                     vector manager, VECTOR.COM.
  9. //**                                            DOSCALLS.ASM DOSCALLS.H, real-mode 1mb memory
  10. //**                                                                                     allocation and management.
  11. //**                                            DIGPLAY.ASM DIGPLAY.H DigPak API link layer.
  12. //**                                            MIDPAK.ASM MIDPAK.H  MidPak API link layer.
  13. //**                                            STDIO.H STDLIB.H    C standard file support functions.
  14. /*                                                                                                                                                     */
  15. /*        Written by John W. Ratcliff (c) 1994                                                                     */
  16. /*             Compuserve: 70253,3237                                                                                          */
  17. /*             Genie: J.RATCLIFF3                                                                                                  */
  18. /*             BBS: 1-314-939-0200                                                                                                 */
  19. /*             Addresss:                                                                                                                     */
  20. /*                     747 Napa Lane                                                                                                     */
  21. /*                     St. Charles, MO 63304                                                                                     */
  22. /*                                                                                                                                                     */
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25.  
  26. #include "loader.h"  // loader prototypes.
  27. #include "support.h" // Include header file for access to common DOS routines.
  28. #include "vector.h"
  29.  
  30. #if DIGPAK_LOADER
  31. #include "digplay.h" // Include header for DIGPAK functions.
  32. static int    HaveDigPak=0; // True if DigPak driver currently loaded.
  33. static int    DigPakOn=0;     // True if loaded DigPak driver is initialized.
  34. static char *DigPakLoad=0; // DigPak Load address.
  35. static int DIGPAKTSR=0; // DigPak resident as a TSR.
  36. #endif
  37. #if MIDPAK_LOADER
  38. #include "midpak.h"  // Include header for MIDPAK functions.
  39. static int HaveMidPak=0; // True if MidPak driver is loaded.
  40. static int MidPakOn=0;     // True if MidPak driver is initialized.
  41. static char *MidPakLoad=0; // MidPak load address.
  42. static char *MidPakAdv;  // MidPak ADV driver.
  43. static char *MidPakAd;     // MidPak AD file.
  44. static int MIDPAKTSR=0;  // MidPak resident as a TSR
  45. #endif
  46.  
  47. static char *vector=0;
  48. int StartVector(void);
  49.  
  50. #if DIGPAK_LOADER
  51. int LoadDigPak(char *fname)
  52. {
  53.     long int siz;
  54.  
  55.     if ( HaveDigPak ) return(0); // DigPak is allready loaded, trying to load it twice!
  56.     if ( CheckIn() )
  57.     {
  58.         DIGPAKTSR = 1;
  59.         HaveDigPak = 1;
  60.         #if MIDPAK_LOADER
  61.         if ( !CheckMidiIn() )  // MIDPAK must be loaded resident if DIGPAK
  62.         {                                          // have been loaded resident.
  63.             DIGPAKTSR = 0;
  64.             HaveDigPak = 0;
  65.             return(0);
  66.         }
  67.         #endif
  68.         return(1);
  69.     }
  70.     DigPakLoad = floadlow(fname,&siz);
  71.     if ( DigPakLoad )
  72.     {
  73.         HaveDigPak = 1; // driver was loaded. not yet initialized though.
  74.     }
  75.     return(HaveDigPak);
  76. }
  77.  
  78. int InitDigPak(void)
  79. {
  80.     int bad = 0;
  81.  
  82.     if ( HaveDigPak )
  83.     {
  84.         if ( DIGPAKTSR )
  85.             DigPakOn = 1;
  86.         else
  87.         {
  88.             if ( StartVector() ) // Bootstrap vector.
  89.                 DigPakOn = InitDP(DigPakLoad);
  90.             else
  91.                 DigPakOn = 0;
  92.         }
  93.     }
  94.     if ( DigPakOn )
  95.     {
  96.         if ( ReportVersionNumber() < 340 ) bad = 1; // Version number too old.
  97.         if ( AudioCapabilities() & USESTIMER ) bad = 2; // We don't support timer based drivers.
  98.         if ( bad )
  99.             DeInitDigPak();
  100.         else
  101.             SetDPMIMode(1);
  102.     }
  103.     return(DigPakOn);
  104. }
  105.  
  106. int DeInitDigPak(void)
  107. {
  108.     if ( DigPakOn )
  109.     {
  110.         SetDPMIMode(0);
  111.         if ( DIGPAKTSR )
  112.             DIGPAKTSR = 0;
  113.         else
  114.             DeInitDP(DigPakLoad);
  115.         DigPakOn = 0;
  116.         return(1);
  117.     }
  118.     return(0);
  119. }
  120.  
  121. int UnLoadDigPak(void)
  122. {
  123.     if ( HaveDigPak )
  124.     {
  125.         if ( DigPakOn ) DeInitDigPak();
  126.         if ( DigPakLoad ) realfree(DigPakLoad);
  127.         DigPakLoad = 0;
  128.         HaveDigPak = 0;
  129.         return(1);
  130.     }
  131.     return(0);
  132. }
  133. #endif
  134.  
  135. #if MIDPAK_LOADER
  136. int LoadMidPak(char *fname,char *adv,char *ad)
  137. {
  138.     long int siz;
  139.  
  140.     if ( HaveMidPak ) return(0); // MidPak is allready loaded, trying to load it twice!
  141.     if ( CheckMidiIn() )
  142.     {
  143.         MIDPAKTSR = 1;
  144.         HaveMidPak = 1;
  145.         return(1);
  146.     }
  147.     MidPakLoad = floadlow(fname,&siz);
  148.     if ( MidPakLoad )
  149.     {
  150.         MidPakAdv = floadlow(adv,&siz);
  151.         if ( !MidPakAdv )
  152.         {
  153.             realfree(MidPakLoad);
  154.             MidPakLoad = 0;
  155.             return(0);
  156.         }
  157.         if ( ad )
  158.         {
  159.             MidPakAd = floadlow(ad,&siz);
  160.             if ( !MidPakAd )
  161.             {
  162.                 realfree(MidPakAdv);
  163.                 realfree(MidPakLoad);
  164.                 MidPakLoad = 0;
  165.                 return(0);
  166.             }
  167.         }
  168.         else
  169.             MidPakAd = 0;
  170.         HaveMidPak = 1; // driver was loaded. not yet initialized though.
  171.     }
  172.     return(HaveMidPak);
  173. }
  174.  
  175. int InitMidPak(void)
  176. {
  177.     int ret;
  178.  
  179.     if ( HaveMidPak )
  180.     {
  181.         if ( MIDPAKTSR )
  182.             MidPakOn = 1;
  183.         else
  184.         {
  185.             if ( StartVector() ) // Bootstrap vector manager.
  186.             {
  187.                 ret = InitMP(MidPakLoad,MidPakAdv,MidPakAd);
  188.                 if ( ret )
  189.                     MidPakOn = 0;
  190.                 else
  191.                     MidPakOn = 1;
  192.             }
  193.             else
  194.                 MidPakOn = 0;
  195.         }
  196.     }
  197.     return(MidPakOn);
  198. }
  199.  
  200. int DeInitMidPak(void)
  201. {
  202.     if ( MidPakOn )
  203.     {
  204.         MidiStop(); // Stop any playing midi sequence
  205.         if ( MIDPAKTSR )
  206.             MIDPAKTSR = 0;
  207.         else
  208.             DeInitMP(MidPakLoad);
  209.         MidPakOn = 0;
  210.         return(1);
  211.     }
  212.     return(0);
  213. }
  214.  
  215. int UnLoadMidPak(void)
  216. {
  217.     if ( HaveMidPak )
  218.     {
  219.         if ( MidPakOn ) DeInitMidPak();
  220.         if ( MidPakLoad )
  221.         {
  222.             if ( MidPakAd ) realfree(MidPakAd);
  223.             realfree(MidPakAdv);
  224.             realfree(MidPakLoad);
  225.         }
  226.         MidPakLoad = 0;
  227.         HaveMidPak = 0;
  228.         return(1);
  229.     }
  230.     return(0);
  231. }
  232. #endif
  233.  
  234. // Install vector manager if not allready installed.
  235. int StartVector(void)
  236. {
  237.     long int siz;
  238.  
  239.     if ( !vector )
  240.     {
  241.         vector = floadlow("VECTOR.COM", &siz);
  242.         if ( vector )
  243.         {
  244.             if ( !InstallVector(vector) )
  245.             {
  246.                 realfree(vector);
  247.                 vector = 0;
  248.             }
  249.         }
  250.     }
  251.     if ( vector )
  252.         return(1);
  253.     else
  254.         return(0);
  255. }
  256.  
  257. void RemoveVectorLoader(void)
  258. {
  259.     if ( vector )
  260.     {
  261.         realfree(vector);
  262.         vector = 0;
  263.         RemoveVector();
  264.     }
  265. }
  266.