home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / sndbords / proaudio / funsrc / funsrc.arj / RNDSND.C < prev    next >
C/C++ Source or Header  |  1993-03-16  |  3KB  |  169 lines

  1. #include <stdio.h>
  2.  
  3. char *syntax= "Syntax: rndsnd [-bXXX] on mindelay maxdelay  OR  rndsnd [-bXXX] off\n";
  4. char *pcmcom= "Requires that \"pcmfun.com\" be loaded.\n";
  5. char *helpem= "Turn on or off the \"random sound\" feature.\n";
  6. char *pcmnot= "error: pcmfun.com is not loaded.\n";
  7. char *copyright= "rndsnd - v(1.0) - Copyright Media Vision, Inc. 1992\n";
  8. char *programmer= "Bart Crane";
  9.  
  10. main(int argc, char **argv)
  11. {
  12.     unsigned int boardaddress= 0;
  13.  
  14.     if (argc < 2)
  15.         {
  16.         fprintf(stderr, syntax);
  17.         fprintf(stderr, pcmcom);
  18.         fprintf(stderr, helpem);
  19.         return(1);
  20.         }
  21.  
  22.     if (argv[1][0] == '-' && argv[1][1] == 'b')
  23.         {
  24.         char *b= &argv[1][2];
  25.  
  26.         while (isxdigit(*b))
  27.             {
  28.             boardaddress*= 16;
  29.             if (*b >= '0' && *b <= '9') boardaddress+= *b- '0';
  30.             else
  31.             if (*b >= 'A' && *b <= 'F') boardaddress+= *b- 'A'+ 10;
  32.             else
  33.             if (*b >= 'a' && *b <= 'f') boardaddress+= *b- 'a'+ 10;
  34.             b++;
  35.             }
  36.  
  37.             {
  38.             int i= 1;
  39.  
  40.             while (i < argc- 1)
  41.                 {
  42.                 argv[i]= argv[i+ 1];
  43.                 i++;
  44.                 }
  45.             argv[i]= NULL;
  46.             }
  47.  
  48.         boardaddress<<= 4;
  49.         }
  50.  
  51.     if (!checkforsig(boardaddress))
  52.         {
  53.         fprintf(stderr, pcmnot);
  54.         return(2);
  55.         }
  56.  
  57.     if (!stricmp(argv[1], "on"))
  58.         {
  59.         int mindelay= 0;
  60.         int maxdelay= 0;
  61.  
  62.         if (argc < 4)
  63.             {
  64.             fprintf(stderr, syntax);
  65.             return(1);
  66.             }
  67.  
  68.         mindelay= atoi(argv[2]);
  69.         maxdelay= atoi(argv[3]);
  70.  
  71.         _asm
  72.             {
  73.             mov ax, 0104h
  74.             mov cx, mindelay
  75.             mov dx, maxdelay
  76.  
  77.             push si
  78.             mov si, 8017h
  79.             or si, boardaddress
  80.             int 94h
  81.             pop si
  82.             }
  83.         }
  84.     else
  85.     if (!stricmp(argv[1], "off"))
  86.         {
  87.         _asm
  88.             {
  89.             mov ax, 0004h
  90.             push si
  91.             mov si, 8017h
  92.             or si, boardaddress
  93.             int 94h
  94.             pop si
  95.             }
  96.         }
  97.     else
  98.         {
  99.         fprintf(stderr, syntax);
  100.         return(1);
  101.         }
  102.  
  103.     return(0);
  104. }
  105.  
  106. checkforsig(int boardaddress)
  107. {
  108.     int status;
  109.     int int94isthere= 0;
  110.  
  111.     _asm
  112.         {
  113.         mov al, 94h
  114.         mov ah, 35h                    ; GETDOSVECTOR
  115.         int 21h
  116.  
  117.         mov ax, es
  118.         or ax, bx
  119.         mov int94isthere, ax
  120.  
  121.         mov bx, 107h                ; offset f_sig in segment holding int 94h
  122.  
  123.         mov ax, es:[bx][0]
  124.         xor ax, 4350h                ; 'CP'
  125.         jnz nodriver
  126.  
  127.         mov ax, es:[bx][2]
  128.         xor ax, 2D4dh                ; '-M'
  129.         jnz nodriver
  130.  
  131.         mov ax, es:[bx][4]
  132.         xor ax, 4853h                ; 'HS'
  133.         jnz nodriver
  134.  
  135.         mov ax, es:[bx][6]
  136.         xor ax, 5241h                ; 'RA'
  137.         jnz nodriver
  138.  
  139.         mov ax, es:[bx][8]
  140.         xor al, 4Bh                    ; 'K'
  141.         jnz nodriver
  142.  
  143.         cbw                            ; ax= 0
  144.  
  145.         cmp boardaddress, 0        ; board specified?
  146.         jz nodriver                
  147.  
  148.         cmp int94isthere, 0        ; 
  149.         jz nodriver
  150.         
  151.         push si
  152.         mov si, 8002h
  153.         or si, boardaddress
  154.         int 94h
  155.         pop si
  156.         or ax, ax                    ; ax= 0 if not at address, !0 if is
  157.         mov ax, 0                    ; ax= 0
  158.         jnz nodriver                ; ax= 0 if driver
  159.         dec ax                        ; ax= !0 if nodriver
  160.  
  161.         nodriver:                    
  162.  
  163.         mov status, ax                ; ax= !0 if nodriver, 0 if driver
  164.         }
  165.  
  166.     return(!status);                // status= 0 if nodriver, !0 if driver
  167. }
  168.  
  169.