home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / sndbords / proaudio / funsrc / wpcmcom.c < prev   
C/C++ Source or Header  |  1993-04-01  |  9KB  |  373 lines

  1. #include <stdio.h>
  2. #include <bios.h>
  3.  
  4. typedef unsigned char uchar;
  5. typedef unsigned int uint;
  6. typedef unsigned long ulong;
  7.  
  8. #define F92STATE     0
  9. #define F92BKGD    1
  10. #define I10TIMER    2
  11. #define I08STATE     3
  12.  
  13. struct f92buf
  14. {
  15.     int snum;
  16.     uint xmsh;
  17.     long xmso;
  18.     long xmss;
  19.     long rate;
  20.     uint chan;
  21.     uint comp;
  22.     uint dsiz;
  23.     char name[16];
  24. };
  25.  
  26. struct f92state
  27. {
  28.     uint pasdmaoff;
  29.     uint pasdmaseg;
  30.     uint pasdmasize;
  31.     uint pasdmadivs;
  32.     uint pasdivsize;
  33.     uint sbdmaoff;
  34.     uint sbdmaseg;
  35.     uint sbdmasize;
  36.     uint sbdmadivs;
  37.     uint sbdivsize;
  38.     uint ourdmaoff;
  39.     uint ourdmaseg;
  40.     uint ourdmasize;
  41.     uint ourdmadivs;
  42.     uint ourdivsize;
  43.     struct f92buf recbuf;
  44.     struct f92buf playbuf[256];
  45. };
  46.  
  47. struct xmsmove
  48. {
  49.     long msiz;
  50.     uint srch;
  51.     long srco;
  52.     uint trgh;
  53.     long trgo;
  54. };
  55.  
  56. struct f92bkgd
  57. {
  58.     struct xmsmove xmsm;
  59.  
  60.     uint f92buf;
  61.     long byteleft;
  62.     uint xmsh;
  63.     long xmso;
  64.     uint blocks;
  65.     uint statflag;
  66.  
  67.     uint pasf92buf;
  68.     long pasbyteleft;
  69.     uint pasxmsh;
  70.     long pasxmso;
  71.     uint pasblocks;
  72.     uint passtatflag;
  73.  
  74.     uint sbf92buf;
  75.     long sbbyteleft;
  76.     uint sbxmsh;
  77.     long sbxmso;
  78.     uint sbblocks;
  79.     uint sbstatflag;
  80.  
  81.     uint sem;
  82.     uint savess;
  83.     uint savesp;
  84.  
  85.     uint functable;
  86.     uint cardmask;
  87.     uint pasfunctable[8];
  88.     uint sbfunctable[8];
  89.  
  90.     char stackdata[];
  91. };
  92.  
  93. struct i10timer
  94. {
  95.     uint control;
  96.     uint noacttime;
  97.     uint noactnokey;
  98.     uint noactkeys;
  99.     uint randomtime;
  100.     uint randomval;
  101.     uint randomsnd;
  102.     uint randommin;
  103.     uint randommax;
  104.  
  105.     char timercontrol[64/ 8];
  106.     long timertime[64];
  107.     long timerval[64];
  108.     void (far *timerfunc[64])();
  109.     long timerreset[64];
  110. };
  111.  
  112. struct i08state
  113. {
  114.     uint keys;
  115.     uint nokey;
  116.     uint keytime;
  117.     uint saving;
  118. };
  119.  
  120. char *syntax= "Syntax: wpcmcom [-bXXX]\n";
  121. char *pcmcom= "Requires that \"pcm.com\" or \"pcmfun.com\" be loaded.\n";
  122. char *pcmnot= "error: no pcm driver is loaded.\n";
  123. char *copyright= "wpcmcom - v(1.0) - Copyright Media Vision, Inc. 1992\n";
  124. char *programmer= "Bart Crane";
  125.  
  126. main(int argc, char **argv)
  127. {
  128.     unsigned int boardaddress= 0;
  129.     unsigned int pcmstatus;
  130.  
  131.     struct f92bkgd far *f92bkgd;
  132.     struct f92state far *f92state;
  133.     struct i10timer far *i10timer;
  134.     struct i08state far *i08state;
  135.  
  136.     if (argv[1][0] == '-' && argv[1][1] == 'b')
  137.         {
  138.         char *b= &argv[1][2];
  139.  
  140.         while (isxdigit(*b))
  141.             {
  142.             boardaddress*= 16;
  143.             if (*b >= '0' && *b <= '9') boardaddress+= *b- '0';
  144.             else
  145.             if (*b >= 'A' && *b <= 'F') boardaddress+= *b- 'A'+ 10;
  146.             else
  147.             if (*b >= 'a' && *b <= 'f') boardaddress+= *b- 'a'+ 10;
  148.             b++;
  149.             }
  150.  
  151.             {
  152.             int i= 1;
  153.  
  154.             while (i < argc- 1)
  155.                 {
  156.                 argv[i]= argv[i+ 1];
  157.                 i++;
  158.                 }
  159.             argv[i]= NULL;
  160.             }
  161.  
  162.         boardaddress<<= 4;
  163.         }
  164.  
  165.     if (!checkforsig(boardaddress))
  166.         {
  167.         fprintf(stderr, pcmnot);
  168.         return(2);
  169.         }
  170.  
  171.  
  172.         {
  173.         _asm
  174.             {
  175.             push si
  176.  
  177.             mov al, 0
  178.             mov si, 8018h
  179.             int 94h
  180.             mov word ptr f92state[0], ax
  181.             mov word ptr f92state[2], dx
  182.  
  183.             mov al, 1
  184.             mov si, 8018h
  185.             int 94h
  186.             mov word ptr f92bkgd[0], ax
  187.             mov word ptr f92bkgd[2], dx
  188.  
  189.             mov al, 2
  190.             mov si, 8018h
  191.             int 94h
  192.             mov word ptr i10timer[0], ax
  193.             mov word ptr i10timer[2], dx
  194.  
  195.             mov al, 3
  196.             mov si, 8018h
  197.             int 94h
  198.             mov word ptr i08state[0], ax
  199.             mov word ptr i08state[2], dx
  200.  
  201.             pop si
  202.             }
  203.         }
  204.  
  205.     printf("%c[2J", 0x1B);
  206.     again:
  207.     printf("%c[H", 0x1B);
  208.  
  209.     if (f92state->recbuf.snum)
  210.         {
  211.         printf("%c[K", 0x1B);
  212.         printf("%4d REC %4X - %7ld - %7ld - %6ld/%1d/%1d/%1d - %16s\n", f92state->recbuf.snum,
  213.             f92state->recbuf.xmsh, f92state->recbuf.xmso, f92state->recbuf.xmss,
  214.             f92state->recbuf.rate, f92state->recbuf.chan, f92state->recbuf.comp, f92state->recbuf.dsiz,
  215.             f92state->recbuf.name);
  216.         }
  217.  
  218.         {
  219.         int i;
  220.  
  221.         for (i= 0; i < 64; i++)
  222.             {
  223.             if (f92state->playbuf[i].snum)
  224.                 {
  225.                 printf("%c[K", 0x1B);
  226.                 printf("%4d %3s %4X - %7ld - %7ld - %6ld/%1d/%1d/%1d - %16s\n", i, f92state->playbuf[i].snum& 0x4000 ? "SB" : "PAS",
  227.                     f92state->playbuf[i].xmsh, f92state->playbuf[i].xmso, f92state->playbuf[i].xmss,
  228.                     f92state->playbuf[i].rate, f92state->playbuf[i].chan, f92state->playbuf[i].comp, f92state->playbuf[i].dsiz,
  229.                     f92state->playbuf[i].name);
  230.                 }
  231.             }
  232.         }
  233.  
  234.     printf("%c[K", 0x1B);
  235.     printf("Background Operations: %4X\n", i10timer->control);
  236.     printf("%c[K", 0x1B);
  237.     printf("Control-G intercept:     ");
  238.         printf("%3s\n", i10timer->control& 0x01 ? "On" : "Off");
  239.     printf("%c[K", 0x1B);
  240.     printf("Double-Shift Key Detect: ");
  241.         printf("%3s\n", i10timer->control& 0x02 ? "On" : "Off");
  242.     printf("%c[K", 0x1B);
  243.     printf("Random Sounds:           ");
  244.         printf("%3s %5u/%5u/%5u/%5u/%5u\n", i10timer->control& 0x04 ? "On" : "Off", 
  245.             i10timer->randomtime, i10timer->randomval, i10timer->randomsnd, i10timer->randommin, i10timer->randommax);
  246.     printf("%c[K", 0x1B);
  247.     printf("No-Activity Detections:  ");
  248.         printf("%3s %5u/%5u/%5u\n", i10timer->control& 0x08 ? "On" : "Off", 
  249.             i10timer->noacttime, i10timer->noactnokey, i10timer->noactkeys);
  250.  
  251.     printf("%c[K", 0x1B);
  252.     printf("Timer Controls:\n");
  253.         {
  254.         int i;
  255.         int timer;
  256.         for (i= 0, timer= 0; i < 8 && timer < 64; i++)
  257.             {
  258.             int mask;
  259.             for (mask= 0x01; mask& 0xFF; mask<<= 1, timer++)
  260.                 if (i10timer->timercontrol[i]& mask || i10timer->timerval[timer] || i10timer->timertime[timer])
  261.                     {
  262.                     printf("%c[K", 0x1B);
  263.                     printf("%4d %3s %7ld - %7ld - %7d - %Fp\n", timer, i10timer->timercontrol[i]& mask ? "On" : "Off", i10timer->timertime[timer], i10timer->timerval[timer], i10timer->timerreset[timer], i10timer->timerfunc[timer]);
  264.                     }
  265.             }
  266.         }
  267.  
  268.     printf("%c[K", 0x1B);
  269.     printf("Background Status:\n");
  270.     printf("%c[K", 0x1B);
  271.     printf("PAS DMA: %4X:%04X - %4u*16B / %2u : %u\n",
  272.         f92state->pasdmaseg, f92state->pasdmaoff, f92state->pasdmasize, f92state->pasdmadivs, f92state->pasdivsize);
  273.  
  274.     printf("%c[K", 0x1B);
  275.     printf("SB  DMA: %4X:%04X - %4u*16B / %2u : %u\n",
  276.         f92state->sbdmaseg, f92state->sbdmaoff, f92state->sbdmasize, f92state->sbdmadivs, f92state->sbdivsize);
  277.  
  278.     printf("%c[K", 0x1B);
  279.     printf("CUR DMA: %4X:%04X - %4u*16B / %2u : %u\n",
  280.         f92state->ourdmaseg, f92state->ourdmaoff, f92state->ourdmasize, f92state->ourdmadivs, f92state->ourdivsize);
  281.  
  282.     printf("%c[K", 0x1B);
  283.     printf("Current     F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->f92buf,
  284.         f92bkgd->byteleft, f92bkgd->xmsh, f92bkgd->xmso, f92bkgd->blocks, f92bkgd->statflag);
  285.  
  286.     printf("%c[K", 0x1B);
  287.     printf("Current PAS F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->pasf92buf,
  288.         f92bkgd->pasbyteleft, f92bkgd->pasxmsh, f92bkgd->pasxmso, f92bkgd->pasblocks, f92bkgd->passtatflag);
  289.  
  290.     printf("%c[K", 0x1B);
  291.     printf("Current SB  F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->sbf92buf,
  292.         f92bkgd->sbbyteleft, f92bkgd->sbxmsh, f92bkgd->sbxmso, f92bkgd->sbblocks, f92bkgd->sbstatflag);
  293.  
  294.     printf("%c[K", 0x1B);
  295.     printf("Status Flags - PAS: %4u    SB: %4u   CUR: %4u\n", f92bkgd->passtatflag, f92bkgd->sbstatflag, f92bkgd->statflag);
  296.     printf("%c[K", 0x1B);
  297.     printf("Semaphore: %4X   Saved Stack Pointer: %4X:%04X   Function Table: %4X\n", f92bkgd->sem, f92bkgd->savess, f92bkgd->savesp, f92bkgd->functable);
  298.  
  299.     printf("%c[K", 0x1B);
  300.     printf("XMSMove:   %7ld - %4X - %Fp / %4X - %Fp\n", f92bkgd->xmsm.msiz,
  301.         f92bkgd->xmsm.srch, f92bkgd->xmsm.srco, f92bkgd->xmsm.trgh, f92bkgd->xmsm.trgo);
  302.  
  303.     if (!_bios_keybrd(_KEYBRD_READY))
  304.         goto again;
  305.  
  306.     return(0);
  307. }
  308.  
  309. checkforsig(int boardaddress)
  310. {
  311.     int status;
  312.     int int94isthere= 0;
  313.  
  314.     _asm
  315.         {
  316.         mov al, 94h
  317.         mov ah, 35h                    ; GETDOSVECTOR
  318.         int 21h
  319.  
  320.         mov ax, es
  321.         or ax, bx
  322.         mov int94isthere, ax
  323.  
  324.         mov bx, 107h                ; offset f_sig in segment holding int 94h
  325.  
  326.         mov ax, es:[bx][0]
  327.         xor ax, 4350h                ; 'CP'
  328.         jnz nodriver
  329.  
  330.         mov ax, es:[bx][2]
  331.         xor ax, 2D4dh                ; '-M'
  332.         jnz nodriver
  333.  
  334.         mov ax, es:[bx][4]
  335.         xor ax, 4853h                ; 'HS'
  336.         jnz nodriver
  337.  
  338.         mov ax, es:[bx][6]
  339.         xor ax, 5241h                ; 'RA'
  340.         jnz nodriver
  341.  
  342.         mov ax, es:[bx][8]
  343.         xor al, 4Bh                    ; 'K'
  344.         jnz nodriver
  345.  
  346.         cbw                            ; ax= 0
  347.  
  348.         cmp boardaddress, 0        ; board specified?
  349.         jz nodriver                
  350.  
  351.         cmp int94isthere, 0        ; 
  352.         jz nodriver
  353.         
  354.         push si
  355.         mov si, 8002h
  356.         or si, boardaddress
  357.         int 94h
  358.         pop si
  359.         or ax, ax                    ; ax= 0 if not at address, !0 if is
  360.         mov ax, 0                    ; ax= 0
  361.         jnz nodriver                ; ax= 0 if driver
  362.         dec ax                        ; ax= !0 if nodriver
  363.  
  364.         nodriver:                    
  365.  
  366.         mov status, ax                ; ax= !0 if nodriver, 0 if driver
  367.         }
  368.  
  369.     return(!status);                // status= 0 if nodriver, !0 if driver
  370. }
  371.  
  372.  
  373.