home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio 4.94 - Over 11,000 Files
/
audio-11000.iso
/
msdos
/
sndbords
/
proaudio
/
funsrc
/
wpcmcom.c
< prev
Wrap
C/C++ Source or Header
|
1993-04-01
|
9KB
|
373 lines
#include <stdio.h>
#include <bios.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define F92STATE 0
#define F92BKGD 1
#define I10TIMER 2
#define I08STATE 3
struct f92buf
{
int snum;
uint xmsh;
long xmso;
long xmss;
long rate;
uint chan;
uint comp;
uint dsiz;
char name[16];
};
struct f92state
{
uint pasdmaoff;
uint pasdmaseg;
uint pasdmasize;
uint pasdmadivs;
uint pasdivsize;
uint sbdmaoff;
uint sbdmaseg;
uint sbdmasize;
uint sbdmadivs;
uint sbdivsize;
uint ourdmaoff;
uint ourdmaseg;
uint ourdmasize;
uint ourdmadivs;
uint ourdivsize;
struct f92buf recbuf;
struct f92buf playbuf[256];
};
struct xmsmove
{
long msiz;
uint srch;
long srco;
uint trgh;
long trgo;
};
struct f92bkgd
{
struct xmsmove xmsm;
uint f92buf;
long byteleft;
uint xmsh;
long xmso;
uint blocks;
uint statflag;
uint pasf92buf;
long pasbyteleft;
uint pasxmsh;
long pasxmso;
uint pasblocks;
uint passtatflag;
uint sbf92buf;
long sbbyteleft;
uint sbxmsh;
long sbxmso;
uint sbblocks;
uint sbstatflag;
uint sem;
uint savess;
uint savesp;
uint functable;
uint cardmask;
uint pasfunctable[8];
uint sbfunctable[8];
char stackdata[];
};
struct i10timer
{
uint control;
uint noacttime;
uint noactnokey;
uint noactkeys;
uint randomtime;
uint randomval;
uint randomsnd;
uint randommin;
uint randommax;
char timercontrol[64/ 8];
long timertime[64];
long timerval[64];
void (far *timerfunc[64])();
long timerreset[64];
};
struct i08state
{
uint keys;
uint nokey;
uint keytime;
uint saving;
};
char *syntax= "Syntax: wpcmcom [-bXXX]\n";
char *pcmcom= "Requires that \"pcm.com\" or \"pcmfun.com\" be loaded.\n";
char *pcmnot= "error: no pcm driver is loaded.\n";
char *copyright= "wpcmcom - v(1.0) - Copyright Media Vision, Inc. 1992\n";
char *programmer= "Bart Crane";
main(int argc, char **argv)
{
unsigned int boardaddress= 0;
unsigned int pcmstatus;
struct f92bkgd far *f92bkgd;
struct f92state far *f92state;
struct i10timer far *i10timer;
struct i08state far *i08state;
if (argv[1][0] == '-' && argv[1][1] == 'b')
{
char *b= &argv[1][2];
while (isxdigit(*b))
{
boardaddress*= 16;
if (*b >= '0' && *b <= '9') boardaddress+= *b- '0';
else
if (*b >= 'A' && *b <= 'F') boardaddress+= *b- 'A'+ 10;
else
if (*b >= 'a' && *b <= 'f') boardaddress+= *b- 'a'+ 10;
b++;
}
{
int i= 1;
while (i < argc- 1)
{
argv[i]= argv[i+ 1];
i++;
}
argv[i]= NULL;
}
boardaddress<<= 4;
}
if (!checkforsig(boardaddress))
{
fprintf(stderr, pcmnot);
return(2);
}
{
_asm
{
push si
mov al, 0
mov si, 8018h
int 94h
mov word ptr f92state[0], ax
mov word ptr f92state[2], dx
mov al, 1
mov si, 8018h
int 94h
mov word ptr f92bkgd[0], ax
mov word ptr f92bkgd[2], dx
mov al, 2
mov si, 8018h
int 94h
mov word ptr i10timer[0], ax
mov word ptr i10timer[2], dx
mov al, 3
mov si, 8018h
int 94h
mov word ptr i08state[0], ax
mov word ptr i08state[2], dx
pop si
}
}
printf("%c[2J", 0x1B);
again:
printf("%c[H", 0x1B);
if (f92state->recbuf.snum)
{
printf("%c[K", 0x1B);
printf("%4d REC %4X - %7ld - %7ld - %6ld/%1d/%1d/%1d - %16s\n", f92state->recbuf.snum,
f92state->recbuf.xmsh, f92state->recbuf.xmso, f92state->recbuf.xmss,
f92state->recbuf.rate, f92state->recbuf.chan, f92state->recbuf.comp, f92state->recbuf.dsiz,
f92state->recbuf.name);
}
{
int i;
for (i= 0; i < 64; i++)
{
if (f92state->playbuf[i].snum)
{
printf("%c[K", 0x1B);
printf("%4d %3s %4X - %7ld - %7ld - %6ld/%1d/%1d/%1d - %16s\n", i, f92state->playbuf[i].snum& 0x4000 ? "SB" : "PAS",
f92state->playbuf[i].xmsh, f92state->playbuf[i].xmso, f92state->playbuf[i].xmss,
f92state->playbuf[i].rate, f92state->playbuf[i].chan, f92state->playbuf[i].comp, f92state->playbuf[i].dsiz,
f92state->playbuf[i].name);
}
}
}
printf("%c[K", 0x1B);
printf("Background Operations: %4X\n", i10timer->control);
printf("%c[K", 0x1B);
printf("Control-G intercept: ");
printf("%3s\n", i10timer->control& 0x01 ? "On" : "Off");
printf("%c[K", 0x1B);
printf("Double-Shift Key Detect: ");
printf("%3s\n", i10timer->control& 0x02 ? "On" : "Off");
printf("%c[K", 0x1B);
printf("Random Sounds: ");
printf("%3s %5u/%5u/%5u/%5u/%5u\n", i10timer->control& 0x04 ? "On" : "Off",
i10timer->randomtime, i10timer->randomval, i10timer->randomsnd, i10timer->randommin, i10timer->randommax);
printf("%c[K", 0x1B);
printf("No-Activity Detections: ");
printf("%3s %5u/%5u/%5u\n", i10timer->control& 0x08 ? "On" : "Off",
i10timer->noacttime, i10timer->noactnokey, i10timer->noactkeys);
printf("%c[K", 0x1B);
printf("Timer Controls:\n");
{
int i;
int timer;
for (i= 0, timer= 0; i < 8 && timer < 64; i++)
{
int mask;
for (mask= 0x01; mask& 0xFF; mask<<= 1, timer++)
if (i10timer->timercontrol[i]& mask || i10timer->timerval[timer] || i10timer->timertime[timer])
{
printf("%c[K", 0x1B);
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]);
}
}
}
printf("%c[K", 0x1B);
printf("Background Status:\n");
printf("%c[K", 0x1B);
printf("PAS DMA: %4X:%04X - %4u*16B / %2u : %u\n",
f92state->pasdmaseg, f92state->pasdmaoff, f92state->pasdmasize, f92state->pasdmadivs, f92state->pasdivsize);
printf("%c[K", 0x1B);
printf("SB DMA: %4X:%04X - %4u*16B / %2u : %u\n",
f92state->sbdmaseg, f92state->sbdmaoff, f92state->sbdmasize, f92state->sbdmadivs, f92state->sbdivsize);
printf("%c[K", 0x1B);
printf("CUR DMA: %4X:%04X - %4u*16B / %2u : %u\n",
f92state->ourdmaseg, f92state->ourdmaoff, f92state->ourdmasize, f92state->ourdmadivs, f92state->ourdivsize);
printf("%c[K", 0x1B);
printf("Current F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->f92buf,
f92bkgd->byteleft, f92bkgd->xmsh, f92bkgd->xmso, f92bkgd->blocks, f92bkgd->statflag);
printf("%c[K", 0x1B);
printf("Current PAS F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->pasf92buf,
f92bkgd->pasbyteleft, f92bkgd->pasxmsh, f92bkgd->pasxmso, f92bkgd->pasblocks, f92bkgd->passtatflag);
printf("%c[K", 0x1B);
printf("Current SB F92Buf: %4X - %7ld - %4X - %7ld - %4u - %3u\n", f92bkgd->sbf92buf,
f92bkgd->sbbyteleft, f92bkgd->sbxmsh, f92bkgd->sbxmso, f92bkgd->sbblocks, f92bkgd->sbstatflag);
printf("%c[K", 0x1B);
printf("Status Flags - PAS: %4u SB: %4u CUR: %4u\n", f92bkgd->passtatflag, f92bkgd->sbstatflag, f92bkgd->statflag);
printf("%c[K", 0x1B);
printf("Semaphore: %4X Saved Stack Pointer: %4X:%04X Function Table: %4X\n", f92bkgd->sem, f92bkgd->savess, f92bkgd->savesp, f92bkgd->functable);
printf("%c[K", 0x1B);
printf("XMSMove: %7ld - %4X - %Fp / %4X - %Fp\n", f92bkgd->xmsm.msiz,
f92bkgd->xmsm.srch, f92bkgd->xmsm.srco, f92bkgd->xmsm.trgh, f92bkgd->xmsm.trgo);
if (!_bios_keybrd(_KEYBRD_READY))
goto again;
return(0);
}
checkforsig(int boardaddress)
{
int status;
int int94isthere= 0;
_asm
{
mov al, 94h
mov ah, 35h ; GETDOSVECTOR
int 21h
mov ax, es
or ax, bx
mov int94isthere, ax
mov bx, 107h ; offset f_sig in segment holding int 94h
mov ax, es:[bx][0]
xor ax, 4350h ; 'CP'
jnz nodriver
mov ax, es:[bx][2]
xor ax, 2D4dh ; '-M'
jnz nodriver
mov ax, es:[bx][4]
xor ax, 4853h ; 'HS'
jnz nodriver
mov ax, es:[bx][6]
xor ax, 5241h ; 'RA'
jnz nodriver
mov ax, es:[bx][8]
xor al, 4Bh ; 'K'
jnz nodriver
cbw ; ax= 0
cmp boardaddress, 0 ; board specified?
jz nodriver
cmp int94isthere, 0 ;
jz nodriver
push si
mov si, 8002h
or si, boardaddress
int 94h
pop si
or ax, ax ; ax= 0 if not at address, !0 if is
mov ax, 0 ; ax= 0
jnz nodriver ; ax= 0 if driver
dec ax ; ax= !0 if nodriver
nodriver:
mov status, ax ; ax= !0 if nodriver, 0 if driver
}
return(!status); // status= 0 if nodriver, !0 if driver
}