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

  1. #include <stdio.h>
  2.  
  3. char *syntax= "Syntax: ctrlg [-bXXX] on   OR  ctrlg [-bXXX] off\n";
  4. char *pcmcom= "Requires that \"pcmfun.com\" be loaded.\n";
  5. char *helpem= "Turn on or off the \"Control-G Intercept\" feature.\n";
  6. char *pcmnot= "error: pcmfun.com is not loaded.\n";
  7. char *copyright= "ctrlg - v(1.0) - Copyright Media Vision, Inc. 1992\n";
  8. char *programmer= "Bart Crane";
  9.  
  10. main(int argc, char **argv)
  11. {
  12.     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.         _asm
  60.             {
  61.             mov ax, 0101h
  62.             push si
  63.             mov si, 8017h
  64.             or si, boardaddress
  65.             int 94h
  66.             pop si
  67.             }
  68.         }
  69.     else
  70.     if (!stricmp(argv[1], "off"))
  71.         {
  72.         _asm
  73.             {
  74.             mov ax, 0001h
  75.             push si
  76.             mov si, 8017h
  77.             or si, boardaddress
  78.             int 94h
  79.             pop si
  80.             }
  81.         }
  82.     else
  83.         {
  84.         fprintf(stderr, syntax);
  85.         return(1);
  86.         }
  87.  
  88.     return(0);
  89. }
  90.  
  91. checkforsig(int boardaddress)
  92. {
  93.     int status;
  94.     int int94isthere= 0;
  95.  
  96.     _asm
  97.         {
  98.         mov al, 94h
  99.         mov ah, 35h                    ; GETDOSVECTOR
  100.         int 21h
  101.  
  102.         mov ax, es
  103.         or ax, bx
  104.         mov int94isthere, ax
  105.  
  106.         mov bx, 107h                ; offset f_sig in segment holding int 94h
  107.  
  108.         mov ax, es:[bx][0]
  109.         xor ax, 4350h                ; 'CP'
  110.         jnz nodriver
  111.  
  112.         mov ax, es:[bx][2]
  113.         xor ax, 2D4dh                ; '-M'
  114.         jnz nodriver
  115.  
  116.         mov ax, es:[bx][4]
  117.         xor ax, 4853h                ; 'HS'
  118.         jnz nodriver
  119.  
  120.         mov ax, es:[bx][6]
  121.         xor ax, 5241h                ; 'RA'
  122.         jnz nodriver
  123.  
  124.         mov ax, es:[bx][8]
  125.         xor al, 4Bh                    ; 'K'
  126.         jnz nodriver
  127.  
  128.         cbw                            ; ax= 0
  129.  
  130.         cmp boardaddress, 0        ; board specified?
  131.         jz nodriver                
  132.  
  133.         cmp int94isthere, 0        ; 
  134.         jz nodriver
  135.         
  136.         push si
  137.         mov si, 8002h
  138.         or si, boardaddress
  139.         int 94h
  140.         pop si
  141.         or ax, ax                    ; ax= 0 if not at address, !0 if is
  142.         mov ax, 0                    ; ax= 0
  143.         jnz nodriver                ; ax= 0 if driver
  144.         dec ax                        ; ax= !0 if nodriver
  145.  
  146.         nodriver:                    
  147.  
  148.         mov status, ax                ; ax= !0 if nodriver, 0 if driver
  149.         }
  150.  
  151.     return(!status);                // status= 0 if nodriver, !0 if driver
  152. }
  153.  
  154.