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

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