home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Audio 4.94 - Over 11,000 Files
/
audio-11000.iso
/
msdos
/
sndbords
/
proaudio
/
pcmtlsrc
/
tpcm.arj
/
TPCM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-09
|
23KB
|
1,179 lines
; /*\
; |*| $Author: BCRANE $
; |*|
; |*| $Date: 09 Sep 1992 14:01:44 $
; |*|
; |*| $Header: X:/sccs/sdkapp/tpcm.c_v 1.5 09 Sep 1992 14:01:44 BCRANE $
; |*|
; |*| $Log: X:/sccs/sdkapp/tpcm.c_v $
*
* Rev 1.5 09 Sep 1992 14:01:44 BCRANE
* added "animation" to DOVIDEO=2
*
* Rev 1.4 31 Aug 1992 19:09:06 BCRANE
* added proper support for 16 bit
*
* Rev 1.3 31 Aug 1992 16:39:08 BCRANE
* added U,D donothing() keys
*
* Rev 1.2 31 Aug 1992 10:51:40 BCRANE
* changed c,C and added r in donothing()
* added check for escape to break out early
*
* Rev 1.1 31 Aug 1992 09:34:54 BCRANE
* added support for 16-bit
*
* Rev 1.0 29 Jul 1992 16:58:14 BCRANE
* Initial revision.
; |*|
; |*| $Logfile: X:/sccs/sdkapp/tpcm.c_v $
; |*|
; |*| $Modtimes$
; |*|
; |*| $Revision: 1.5 $
; |*|
; |*| $Workfile: tpcm.c $
; |*|
; \*/
/* Copyright (c) 1992. Media Vision, Inc. All Rights Reserved. */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <string.h>
#include <process.h>
#include <conio.h>
#include <dos.h>
#include <malloc.h>
#include <bios.h>
#include <graph.h>
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#include "pcmio.h"
#include "sndfile.h"
#define ERROR -1
#define OKAY 0
#define YES 1
#define NO 0
#define BADARGORDER 7
#define BADINPFILE 8
#define BADOUTFILE 9
#define BADOPTION 10
#define BADHARDWARE 11
#define BADPCMBUFFER 12
#define BADPCMBUFDIVS 13
int DEBUG;
int BEQUIET;
int USEMONO;
int LOOPING;
int STEREO;
int CYCLESPEED;
int USEPALETTE;
int DOVIDEO;
int USERFUNC;
int DORESIDENT;
int INPFILE;
int SPECIALCASE;
long SAMPLERATE;
uint SBSIZE;
uint PCMBUFKAYS;
uint PCMBUFSIZE;
uint PCMBUFDIVS;
uint BLOCKSREAD;
int PCMPAUSED;
int volatile OURSTATFLAG;
char far *OURDMABUF;
char huge *HUGEDMABUF;
static char *inpname;
static char *outname;
int fhinp;
#define V2X 145
#define V2Y 74
#define V2W 12
#define V2H 4
#define V2D 4
char v2fun[V2H+ V2D][V2W];
int v2funlevel[2];
#include "protos.h"
//char far *doInitMVSound(void);
//int doInitPCM(void);
//int doPCMInfo(long, int);
//char far *doDMABuffer(char far *, uint, uint);
//void far *doUserFunc(void far *);
//int doPCMPlay(void);
//int doPCMRecord(void);
//int doPausePCM(void);
//int doResumePCM(void);
//int doStopPCM(void);
//int doRemovePCM(void);
char far *doFindDMABuffer(char huge *, uint);
char *syntax=
"Syntax: tpcm [-dqmls] [-iinpname] [-B#][-D#][-R#][-F[#]][-V[#]] [wavfiles ...]\n"
"Options:\n"
"-d\tdebug mode, output status\n"
"-q\tquiet mode (no sound)\n"
"-m\tuse Monochrome Screen Buffer for DMA\n"
"-l\tLoop sound continuously\n"
"-s\ttreat as stereo\n"
"-i inpname\tinpname= name of input PCM file (use -R and -s)\n"
"-B#\t#= size of DMA Buffer in kilobytes, default: 2 or 4K if video, else 32K\n"
"-D#\t#= number of DMA Divisions, default: 2 if video, else 8\n"
"-R#\t#= default samplerate (decimal) default: 11025\n"
"-F[#]\t#= User Function # (see ref) default: PCM.COM User Function 0\n"
"-V[#]\t#= Video Function # (see ref) default: dspmonowav() or dspstereowav()\n"
"wavfiles ...\tfilenames to play (overrides -R and -s)\n"
"Note: -iinpname and wavfiles... are mutually exclusive\n"
;
char vidbuf[320];
char *copyright= "Copyright (c) 1992. Media Vision, Inc. All Rights Reserved.";
char *programmer= "Bart Crane";
/***************** MAIN *****************************/
/* main - */
main(int argc, char **argv)
{
int status;
BT bt;
unsigned int br;
if (status= checkforsig())
{
fprintf(stderr, "error: driver not installed.\n");
return(status);
}
if (status= parse(argc, argv))
return(status);
if (DOVIDEO)
initvideo(argv[0], DOVIDEO);
nextfile:
BLOCKSREAD= 0;
OURSTATFLAG= 0;
if (INPFILE)
{
if ((fhinp= open(inpname= argv[INPFILE], O_BINARY| O_RDONLY)) == ERROR)
{
if (++INPFILE < argc)
goto nextfile;
if (DOVIDEO)
_setvideomode(_DEFAULTMODE);
if (!DOVIDEO)
fprintf(stderr, "%s: input file not found.\n", argv[INPFILE- 1]);
return(BADINPFILE);
}
if (getsndfile(fhinp, inpname, &bt, SAMPLERATE, (STEREO ? 2 : 1)) == ERROR)
goto skipit;
}
else
{
if ((fhinp= open(inpname, O_BINARY| O_RDONLY)) == ERROR)
{
if (DOVIDEO)
_setvideomode(_DEFAULTMODE);
if (!DOVIDEO)
fprintf(stderr, "%s: input file not found.\n", inpname);
return(BADINPFILE);
}
bt.fhidx= fhinp;
bt.foffset= lseek(fhinp, 0L, SEEK_CUR);
bt.offset= 0;
bt.size= lseek(fhinp, 0L, SEEK_END);
lseek(fhinp, bt.foffset, SEEK_SET);
bt.wf.fmttag= 1;
bt.wf.channels= STEREO ? 2 : 1;
bt.wf.samplerate= SAMPLERATE;
bt.wf.bytespersec= bt.wf.channels* bt.wf.samplerate;
bt.wf.blockalign= bt.wf.channels;
bt.wf.datasize= 8;
}
if (DEBUG)
{
printf("%2d %5ld %5ld %6ld %1d %1d %5ld %5ld %2d %2d\n",
bt.fhidx, bt.foffset, bt.offset, bt.size,
bt.wf.fmttag, bt.wf.channels, bt.wf.samplerate,
bt.wf.bytespersec, bt.wf.blockalign, bt.wf.datasize);
}
if (bt.wf.datasize != 8 && bt.wf.datasize != 16)
{
if (!DOVIDEO)
fprintf(stderr, "error: 8- or 16-bit PCM only.\n");
goto skipit;
}
/* if showing video, override PCMBUFKAYS and PCMBUFDIVS */
/* hopefully, the DMA buffer allocated was at least 4K */
if (!SPECIALCASE)
if (DOVIDEO)
{
PCMBUFDIVS= 2;
PCMBUFKAYS= PCMBUFDIVS* bt.wf.channels* (bt.wf.datasize/ 8);
if (!PCMBUFKAYS) PCMBUFKAYS= 2;
SBSIZE= (PCMBUFKAYS/ PCMBUFDIVS)* 1024;
}
if (!BEQUIET)
if (status= setupsound(&bt))
{
if (DOVIDEO)
_setvideomode(_DEFAULTMODE);
if (!DOVIDEO)
fprintf(stderr, "error: failure initializing pcm.com via i94f91.\n");
return(status);
}
again:
while (OURSTATFLAG < PCMBUFDIVS)
{
char far *buf= OURDMABUF+ ((BLOCKSREAD% PCMBUFDIVS)* SBSIZE);
if (DEBUG)
{
ulong curoffset= lseek(fhinp, 0, SEEK_CUR);
printf("%Fp %3u %3u %7lu ", buf, BLOCKSREAD, OURSTATFLAG, curoffset);
}
if (!(br= read(fhinp, buf, SBSIZE))) break;
if (DEBUG)
printf("%5u\n", br);
if (DOVIDEO == 2)
v2funlevel[BLOCKSREAD& 0x01]= calcenergylevel(buf, SBSIZE, &bt);
BLOCKSREAD++;
OURSTATFLAG++;
if (br != SBSIZE)
{
if (bt.wf.datasize == 8)
fillchar(&buf[br], 0x80, SBSIZE- br);
else
if (bt.wf.datasize == 16)
fillword((int *) &buf[br], 0x00, (SBSIZE- br)/ 2);
break;
}
}
if (PCMPAUSED)
{
if (!BEQUIET)
_asm
{
push si
mov si, 5 ; PlayPCM()
int 94h
pop si
}
PCMPAUSED= NO;
}
while (OURSTATFLAG)
if (OURSTATFLAG < PCMBUFDIVS)
{
char far *buf= OURDMABUF+ ((BLOCKSREAD% PCMBUFDIVS)* SBSIZE);
if (DEBUG)
{
ulong curoffset= lseek(fhinp, 0, SEEK_CUR);
printf("%Fp %3u %3u %7lu ", buf, BLOCKSREAD, OURSTATFLAG, curoffset);
}
br= read(fhinp, buf, SBSIZE);
if (DEBUG)
printf("%5u\n", br);
if (!br)
break;
if (DOVIDEO == 2)
{
dspv2fun(v2funlevel[(BLOCKSREAD)& 0x01]);
v2funlevel[BLOCKSREAD& 0x01]= calcenergylevel(buf, SBSIZE, &bt);
}
BLOCKSREAD++;
OURSTATFLAG++;
if (br != SBSIZE)
{
if (bt.wf.datasize == 8)
fillchar(&buf[br], 0x80, SBSIZE- br);
else
if (bt.wf.datasize == 16)
fillword((int *) &buf[br], 0x00, (SBSIZE- br)/ 2);
break;
}
}
else
if ((status= donothing()) == 0x1B)
goto skipit;
if (LOOPING)
{
lseek(fhinp, bt.foffset, SEEK_SET);
goto again;
}
while (OURSTATFLAG)
{
if (DEBUG)
{
printf("%Fp %3u %3u %1d\n", (void far *) 0, BLOCKSREAD, OURSTATFLAG, PCMPAUSED);
}
if ((status= donothing()) == 0x1B)
goto skipit;
}
skipit:
if (!BEQUIET)
{
_asm
{
push si
mov si, 9 ; StopPCM
int 94h
pop si
}
PCMPAUSED= YES;
}
close(fhinp);
if (_bios_keybrd(_KEYBRD_READY))
if ((char) (_bios_keybrd(_KEYBRD_READ)) == 0x1B)
goto weredone;
if (INPFILE)
if (++INPFILE < argc)
{
int i;
char *buf= OURDMABUF;
for (i= 0; i < PCMBUFDIVS; i++, buf+= SBSIZE)
{
if (bt.wf.datasize == 8)
fillchar(buf, 0x80, SBSIZE);
else
if (bt.wf.datasize == 16)
fillword((int *) buf, 0x00, SBSIZE/ 2);
}
goto nextfile;
}
weredone:
if (DOVIDEO)
_setvideomode(_DEFAULTMODE);
if (!BEQUIET)
{
_asm
{
push si
mov si, 10
int 94h
pop si
}
}
if (HUGEDMABUF)
hfree(HUGEDMABUF);
if (DEBUG) putchar('\n');
return(OKAY);
}
parse(int c, char **v)
{
int o= 1;
int i= 0;
if (c == 1 || !strcmp(v[o], "--") || !strcmpi(v[o], "-h") || !strcmp(v[o], "/h"))
{
printf("%s", syntax);
return(1);
}
while (o < c)
{
if (v[o][0] == '-')
{
if (INPFILE)
{
fprintf(stderr, "Error: argument order: options must come before filenames.\n");
return(BADARGORDER);
}
switch (v[o][++i])
{
case '\0': if (i == 1) inpname= "stdin"; o+= (i= 0)+ 1; break;
case 'd': DEBUG= YES; break;
case 'q': BEQUIET= YES; break;
case 'm': if (USEMONO) USEMONO= NO; else USEMONO= YES; break;
case 'l': if (LOOPING) LOOPING= NO; else LOOPING= YES; break;
case 's': if (STEREO) STEREO= NO; else STEREO= YES; break;
case 'c':
if (!isdigit(v[o][++i]))
CYCLESPEED= 1;
else
{
CYCLESPEED= 0;
while (isdigit(v[o][i]))
{
CYCLESPEED*= 10;
CYCLESPEED+= v[o][i++]- '0';
}
}
i--;
break;
case 'C':
if (!isdigit(v[o][++i]))
CYCLESPEED= 1;
else
{
CYCLESPEED= 0;
while (isdigit(v[o][i]))
{
CYCLESPEED*= 10;
CYCLESPEED+= v[o][i++]- '0';
}
}
i--;
CYCLESPEED*= -1;
break;
case 'p':
if (!isdigit(v[o][++i]))
USEPALETTE= 1;
else
{
USEPALETTE= 0;
while (isdigit(v[o][i]))
{
USEPALETTE*= 10;
USEPALETTE+= v[o][i++]- '0';
}
}
i--;
break;
case '-': inpname= "stdin"; break;
case 'i': if (!v[o][++i]) o+= (i= 0)+ 1; inpname= &v[o][i]; o+= (i= 0)+ 1; break;
case 'o': if (!v[o][++i]) o+= (i= 0)+ 1; outname= &v[o][i]; o+= (i= 0)+ 1; break;
case 'b':
case 'B':
SPECIALCASE= 1;
PCMBUFKAYS= 0;
i++;
while (isdigit(v[o][i])) {PCMBUFKAYS*= 10; PCMBUFKAYS+= v[o][i++]- '0'; }
i--;
break;
case 'D':
SPECIALCASE= 1;
PCMBUFDIVS= 0;
i++;
while (isdigit(v[o][i])) {PCMBUFDIVS*= 10; PCMBUFDIVS+= v[o][i++]- '0'; }
i--;
if (PCMBUFDIVS <= 1)
return(BADPCMBUFDIVS);
break;
case 'r':
case 'R':
SAMPLERATE= 0;
i++;
while (isdigit(v[o][i])) {SAMPLERATE*= 10; SAMPLERATE+= v[o][i++]- '0'; }
i--;
break;
case 'S':
FP_SEG(OURDMABUF)= 0;
i++;
while (isxdigit(v[o][i]))
{
FP_SEG(OURDMABUF)*= 16;
if (v[o][i] >= '0' && v[o][i] <= '9')
FP_SEG(OURDMABUF)+= v[o][i++]- '0';
else if (v[o][i] >= 'a' && v[o][i] <= 'f')
FP_SEG(OURDMABUF)+= v[o][i++]- 'a'+ 10;
else if (v[o][i] >= 'A' && v[o][i] <= 'F')
FP_SEG(OURDMABUF)+= v[o][i++]- 'A'+ 10;
}
i--;
break;
case 'O':
FP_OFF(OURDMABUF)= 0;
i++;
while (isxdigit(v[o][i]))
{
FP_OFF(OURDMABUF)*= 16;
if (v[o][i] >= '0' && v[o][i] <= '9')
FP_OFF(OURDMABUF)+= v[o][i++]- '0';
else if (v[o][i] >= 'a' && v[o][i] <= 'f')
FP_OFF(OURDMABUF)+= v[o][i++]- 'a'+ 10;
else if (v[o][i] >= 'A' && v[o][i] <= 'F')
FP_OFF(OURDMABUF)+= v[o][i++]- 'A'+ 10;
}
i--;
break;
case 'v':
case 'V':
PCMBUFKAYS= 4;
PCMBUFDIVS= 4;
i++;
if (isdigit(v[o][i]))
while (isdigit(v[o][i])) {DOVIDEO*= 10; DOVIDEO+= v[o][i++]- '0'; }
else
DOVIDEO= 1;
i--;
break;
case 'f':
case 'F':
i++;
if (isdigit(v[o][i]))
while (isdigit(v[o][i])) {USERFUNC*= 10; USERFUNC+= v[o][i++]- '0'; }
else
USERFUNC= 1;
i--;
break;
default:
fprintf(stderr, "%c in %s: invalid option.\n", v[o][i], v[o]);
return(BADOPTION);
}
}
else
{
if (!INPFILE && !inpname)
{
INPFILE= o;
inpname= v[o];
}
o+= (i= 0)+ 1;
}
}
if (!inpname)
return(BADINPFILE);
if (!SAMPLERATE)
SAMPLERATE= 11025;
if (PCMBUFKAYS < 4)
if (DOVIDEO)
PCMBUFKAYS= 4;
else
if (USEMONO)
PCMBUFKAYS= 32;
else
PCMBUFKAYS= 16;
if (PCMBUFDIVS < 2)
if (DOVIDEO)
PCMBUFDIVS= 2;
else
PCMBUFDIVS= 8;
PCMBUFSIZE= PCMBUFKAYS > 64 ? PCMBUFKAYS : PCMBUFKAYS* 1024;
SBSIZE= PCMBUFKAYS > 64 ? PCMBUFKAYS/ PCMBUFDIVS : (PCMBUFKAYS/ PCMBUFDIVS)* 1024;
if (!SBSIZE)
{
fprintf(stderr, "error: kays: %2d, divs: %2d, size: %5d.\n");
return(BADOPTION);
}
if (!OURDMABUF)
{
if (USEMONO)
{
FP_SEG(OURDMABUF)= 0xB000;
FP_OFF(OURDMABUF)= 0x0000;
}
else
{
if (PCMBUFKAYS > 64)
HUGEDMABUF= halloc(2* (long) PCMBUFKAYS, 1);
else
HUGEDMABUF= halloc(2* (long) ((long) ((long) SBSIZE* (long) PCMBUFDIVS)), 1);
if (!HUGEDMABUF)
{
fprintf(stderr, "error: can not get huge memory.\n");
return(BADPCMBUFFER);
}
if (DEBUG) printf("HugeDMABuf - %04X:%04X\n", FP_SEG(HUGEDMABUF), FP_OFF(HUGEDMABUF));
if (!(OURDMABUF= doFindDMABuffer(HUGEDMABUF, PCMBUFKAYS)))
{
if (HUGEDMABUF)
hfree(HUGEDMABUF);
fprintf(stderr, "error: can not get pcm buffer.\n");
return(BADPCMBUFFER);
}
}
}
return(OKAY);
}
checkforsig()
{
int status;
_asm
{
mov al, 94h
; mov ah, GETDOSVECTOR
mov ah, 35h
int 21h
xor ax, ax
dec ax
cmp es:[bx][-9], 'P'
jnz nodriver
cmp es:[bx][-8], 'C'
jnz nodriver
cmp es:[bx][-7], 'M'
jnz nodriver
cmp es:[bx][-6], 'D'
jnz nodriver
cmp es:[bx][-5], 'R'
jnz nodriver
cmp es:[bx][-4], 'I'
jnz nodriver
cmp es:[bx][-3], 'V'
jnz nodriver
cmp es:[bx][-2], 'E'
jnz nodriver
cmp es:[bx][-1], 'R'
jnz nodriver
xor ax, ax
nodriver:
mov status, ax
}
return(status);
}
/* initialize sound, return fail, otherwise set PCMPAUSED */
struct pcmstate
{
char far *f00r;
int f01r;
long f02c1;
int f02c2;
int f02r;
void (far *f04c)();
void (far *f04r)();
char huge *f11c1;
int f11c2;
char far *f11r;
char far *f03c1;
int f03c2;
int f03c3;
char far *f03r;
int f10r;
int f05r;
int f07r;
int volatile far *stat;
int fh;
int sbsize;
int f02c3;
int f02c4;
};
struct pcmstate ps;
setupsound(BT *bt)
{
int i;
int lib;
char far *hwt;
void (far *cfp)();
char far *dma;
void (far *f) ();
void far dspfilter();
void far dspmonowav();
void far dspstereowav();
void far dsp16monowav();
void far dsp16stereowav();
if (DOVIDEO)
if (bt->wf.channels == 1)
if (bt->wf.datasize == 8)
USERFUNC= 1;
else
if (bt->wf.datasize == 16)
USERFUNC= 3;
else
USERFUNC= 0;
else
if (bt->wf.channels == 2)
if (bt->wf.datasize == 8)
USERFUNC= 2;
else
if (bt->wf.datasize == 16)
USERFUNC= 4;
else
USERFUNC= 0;
else
USERFUNC= 0;
/* else
USERFUNC= USERFUNC;
*/
switch (USERFUNC)
{
case 0: f= (void far *) 0; break;
case 1: f= dspmonowav; break;
case 2: f= dspstereowav; break;
case 3: f= dsp16monowav; break;
case 4: f= dsp16stereowav; break;
default: f= (void far *) 0;
}
ps.f02c1= bt->wf.samplerate;
ps.f02c2= bt->wf.channels == 2 ? 1 : 0;
ps.f02c3= 0;
ps.f02c4= bt->wf.datasize;
ps.f03c1= OURDMABUF;
ps.f03c2= PCMBUFKAYS > 64 ? PCMBUFKAYS: PCMBUFKAYS* 1024;
ps.f03c3= PCMBUFDIVS;
ps.f04c= f;
ps.stat= &OURSTATFLAG;
ps.fh= bt->fhidx;
_asm
{
mov ax, seg ps;
mov es, ax
mov bx, offset ps;
mov si, 08011h
int 94h
}
hwt= ps.f00r;
lib= ps.f01r;
i= ps.f02r;
dma= ps.f03r;
cfp= ps.f04r;
if (!(hwt && lib && i != -1 && dma && cfp))
{
return(BADPCMBUFFER);
}
if (DEBUG)
{
printf("%Fp %5u %3u %5u\n", ps.f03c1, ps.f03c2, ps.f03c3, ps.sbsize);
}
PCMPAUSED= YES;
return(OKAY);
}
static int counter;
donothing()
{
int c;
if (BEQUIET)
OURSTATFLAG--;
if ((_bios_keybrd(_KEYBRD_READY)))
{
if (DOVIDEO)
{
switch ((c= _bios_keybrd(_KEYBRD_READ))& 0xFF)
{
case 0x00:
{
switch ((c& 0xFF00)>> 8)
{
default:
;
}
}
break;
case '\n': rstpal(); break;
case 'P':
{
_asm
{
push si
mov si, 7 ; PausePCM
int 94h
pop si
}
switch ((char) _bios_keybrd(_KEYBRD_READ))
{
case '0': usepal(0); setpal(); break;
case '1': usepal(1); setpal(); break;
case '2': usepal(2); setpal(); break;
case '3': usepal(3); setpal(); break;
case '4': usepal(4); setpal(); break;
case '5': usepal(5); setpal(); break;
case '6': usepal(6); setpal(); break;
case '7': usepal(7); setpal(); break;
case '8': usepal(8); setpal(); break;
}
_asm
{
push si
mov si, 8 ; ResumePCM
int 94h
pop si
}
}
break;
case 'u': uflppal(); setpal(); break;
case 'd': dflppal(); setpal(); break;
case 'U':
{
int i;
for (i= 0; i < 10; i++)
uflppal();
}
setpal(); break;
case 'D':
{
int i;
for (i= 0; i < 10; i++)
dflppal();
}
setpal(); break;
case 'F': f16cycpal(); setpal(); break;
case 'f': fcycpal(); setpal(); break;
case 'B': b16cycpal(); setpal(); break;
case 'b': bcycpal(); setpal(); break;
case 'c': CYCLESPEED++; break;
case 'C': CYCLESPEED+= 10; break;
case 'r': CYCLESPEED*= -1; break;
case ' ': CYCLESPEED= 0; break;
case 0x1B: return(0x1B);
}
}
else
switch ((c= _bios_keybrd(_KEYBRD_READ))& 0xFF)
{
case 0x00:
{
switch ((c& 0xFF00)>> 8)
{
default:
;
}
}
break;
case 0x1B: return(0x1B);
}
}
if (DOVIDEO)
{
counter++;
if (CYCLESPEED)
{
int c= CYCLESPEED < 0 ? -CYCLESPEED : CYCLESPEED;
if (!(counter% c))
{
if (CYCLESPEED < 0)
bcycpal();
else
fcycpal();
setpal();
}
}
}
return(OKAY);
}
/* set mcga mode, display picture */
#define MAXPICTURES 3
char *pictures[]=
{
"tpcm.scr",
"tpcm2.scr",
"tpcm3.scr"
};
initvideo(char *path, int picture)
{
int i;
unsigned int idx= 0;
int inp;
_setvideomode(_MRES256COLOR);
if (picture < 1 || picture > MAXPICTURES)
picture= 1;
{
char filename[_MAX_PATH];
char *f;
strcpy(filename, path);
for (f= filename; *f; f++) ;
for (--f; *f != '\\' && f > filename; f--) ;
if (*f == '\\') f++;
strcpy(f, pictures[picture- 1]);
inp= open(filename, O_BINARY| O_RDONLY);
}
setpal();
if (USEPALETTE)
usepal(USEPALETTE);
else
if (DOVIDEO == 2)
usepal(6);
else
usepal(2);
setpal();
if (inp == ERROR)
return(OKAY);
for (i= 0; i < 200; i++)
{
read(inp, vidbuf, 320);
if (DOVIDEO == 2)
if (i >= V2Y && i < V2Y+ V2H+ V2D)
{
int j;
for (j= 0; j < V2W; j++)
{
v2fun[i- V2Y][j]= vidbuf[V2X+ j];
// vidbuf[V2X+ j]= 0;
}
}
_asm
{
push di
push si
push ds
push es
mov di, 0A000h
mov es, di
mov di, idx
mov ax, seg vidbuf
mov ds, ax
mov si, offset vidbuf
mov cx, 320
rep movsb
pop es
pop ds
pop si
pop di
}
idx+= 320;
}
close(inp);
return(OKAY);
}
dspv2fun(unsigned int level)
{
unsigned int i;
unsigned int j;
if (level > V2D)
level= V2D;
for (i= 0; i < V2H+ V2D; i++)
{
unsigned int idx= ((V2Y+ i)* 320)+ V2X;
char far *v= &v2fun[i][0];
_asm
{
push si
push di
push ds
mov ax, 0A000h
mov es, ax
mov di, idx
mov ax, word ptr v[2]
mov ds, ax
mov si, word ptr v[0]
mov cx, V2W
cld
rep movsb
pop ds
pop di
pop si
}
}
for (i= 0; i < level; i++)
{
unsigned int idx= ((V2Y+ i)* 320)+ V2X+ (2* i);
unsigned int j= V2W- (2* i)- i;
_asm
{
push di
mov ax, 0A000h
mov es, ax
mov di, idx
mov cx, j
xor al, al
cld
rep stosb
pop di
}
}
for (i= 0; i < V2H- (level/ 2); i++)
{
unsigned int idx= ((V2Y+ i+ level)* 320)+ V2X+ (2* i);
unsigned int j= V2W- (2* i)- i;
char far *v= &v2fun[i][(2* i)];
_asm
{
push si
push di
push ds
mov ax, 0A000h
mov es, ax
mov di, idx
mov ax, word ptr v[2]
mov ds, ax
mov si, word ptr v[0]
mov cx, j
cld
rep movsb
pop ds
pop di
pop si
}
}
}
calcenergylevel(char far *buf, unsigned int size, BT *bt)
{
int retval;
if (bt->wf.datasize == 8)
{
char far *b= buf;
unsigned int s= size;
unsigned int level= 0;
for (s= 0; s < size; s++, b++)
{
char c= *b^ 0x80;
int x= c;
level+= x* x;
}
retval= level& 0x7FFF;
}
else
if (bt->wf.datasize == 16)
{
int far *b= (int far *) buf;
unsigned int s= size;
unsigned long level= 0;
for (s= 0; s < size; s++, b++)
{
int x= *b;
level+= x* x;
}
retval= level>> 8;
retval&= 0x7FFF;
}
return(retval/ (1<< (16- V2D)));
}
char buf[20];
char far *bufptr= buf;
char far *doFindDMABuffer(char huge *hbuf, uint pcmbufsize)
{
char far *retval;
uint bufoff= FP_OFF(bufptr);
uint bufseg= FP_SEG(bufptr);
char huge **chb= (char huge *) buf;
*chb= hbuf;
buf[4]= (uint) pcmbufsize;
_asm
{
push si
mov ax, bufseg
mov es, ax
mov bx, bufoff
mov si, 11
int 94h
pop si
mov word ptr retval[0], ax
mov word ptr retval[2], dx
}
return(retval);
}