changeset 2955:eb29c6fbdeb3

Remove unnecessary PS1 emulation core.
author William Pitcock <nenolod@atheme.org>
date Wed, 15 Oct 2008 14:41:46 -0500
parents f1482af6384c
children f2c62b0fc3ba
files src/psf2/Makefile src/psf2/eng_psf.c src/psf2/eng_spu.c src/psf2/peops/License.txt src/psf2/peops/adsr.c src/psf2/peops/adsr.h src/psf2/peops/dma.c src/psf2/peops/dma.h src/psf2/peops/externals.h src/psf2/peops/gauss_i.h src/psf2/peops/registers.c src/psf2/peops/registers.h src/psf2/peops/regs.h src/psf2/peops/reverb.c src/psf2/peops/spu.c src/psf2/peops/spu.h src/psf2/peops/stdafx.h src/psf2/psx_hw.c
diffstat 18 files changed, 2 insertions(+), 4013 deletions(-) [+]
line wrap: on
line diff
--- a/src/psf2/Makefile	Wed Oct 15 14:31:23 2008 -0500
+++ b/src/psf2/Makefile	Wed Oct 15 14:41:46 2008 -0500
@@ -4,10 +4,7 @@
        plugin.c \
        psx.c \
        psx_hw.c \
-       eng_psf.c \
        eng_psf2.c \
-       eng_spu.c \
-       peops/spu.c \
        peops2/dma.c \
        peops2/registers.c \
        peops2/spu.c \
--- a/src/psf2/eng_psf.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,414 +0,0 @@
-/*
-	Audio Overload SDK - PSF file format engine
-
-	Copyright (c) 2007 R. Belmont and Richard Bannister.
-
-	All rights reserved.
-
-	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-	* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-	* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-	* Neither the names of R. Belmont and Richard Bannister nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-	A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-	CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-	EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-	LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "ao.h"
-#include "eng_protos.h"
-#include "cpuintrf.h"
-#include "psx.h"
-
-#include "peops/stdafx.h"
-#include "peops/externals.h"
-#include "peops/regs.h"
-#include "peops/registers.h"
-#include "peops/spu.h"
-
-
-#include "corlett.h"
-
-#define DEBUG_LOADER	(0)
-
-static corlett_t	*c = NULL;
-static char 		psfby[256];
-char			*spu_pOutput;
-int			psf_refresh  = -1;
-
-
-// main RAM
-extern uint32 psx_ram[((2*1024*1024)/4)+4];
-extern uint32 psx_scratch[0x400];
-extern uint32 initial_ram[((2*1024*1024)/4)+4];
-extern uint32 initial_scratch[0x400];
-static uint32 initialPC, initialGP, initialSP;
-
-extern void mips_init( void );
-extern void mips_reset( void *param );
-extern int mips_execute( int cycles );
-extern void mips_set_info(UINT32 state, union cpuinfo *info);
-extern void psx_hw_init(void);
-extern void psx_hw_slice(void);
-extern void psx_hw_frame(void);
-extern void setlength(int32 stop, int32 fade);
-
-int32 psf_start(uint8 *buffer, uint32 length)
-{
-	uint8 *file, *lib_decoded, *lib_raw_file, *alib_decoded;
-	uint32 offset, plength, PC, SP, GP, lengthMS, fadeMS;
-	uint64 file_len, lib_len, lib_raw_length, alib_len;
-	corlett_t *lib;
-	int i;
-	union cpuinfo mipsinfo;
-
-	// clear PSX work RAM before we start scribbling in it
-	memset(psx_ram, 0, 2*1024*1024);
-
-//	printf("Length = %d\n", length);
-
-	// Decode the current GSF
-	if (corlett_decode(buffer, length, &file, &file_len, &c) != AO_SUCCESS)
-	{
-		return AO_FAIL;
-	}
-
-//	printf("file_len %d reserve %d\n", file_len, c->res_size);
-
-	// check for PSX EXE signature
-	if (strncmp((char *)file, "PS-X EXE", 8))
-	{
-		return AO_FAIL;
-	}
-
-	#if DEBUG_LOADER
-	offset = file[0x18] | file[0x19]<<8 | file[0x1a]<<16 | file[0x1b]<<24;
-	printf("Text section start: %x\n", offset);
-	offset = file[0x1c] | file[0x1d]<<8 | file[0x1e]<<16 | file[0x1f]<<24;
-	printf("Text section size: %x\n", offset);
-	printf("Region: [%s]\n", &file[0x4c]);
-	printf("refresh: [%s]\n", c->inf_refresh);			
-	#endif
-
-	if (c->inf_refresh[0] == '5')
-	{
-		psf_refresh = 50;
-	}
-	if (c->inf_refresh[0] == '6')
-	{
-		psf_refresh = 60;
-	}
-
-	PC = file[0x10] | file[0x11]<<8 | file[0x12]<<16 | file[0x13]<<24;
-	GP = file[0x14] | file[0x15]<<8 | file[0x16]<<16 | file[0x17]<<24;
-	SP = file[0x30] | file[0x31]<<8 | file[0x32]<<16 | file[0x33]<<24;
-
-	#if DEBUG_LOADER
-	printf("Top level: PC %x GP %x SP %x\n", PC, GP, SP);
-	#endif
-
-	// Get the library file, if any
-	if (c->lib[0] != 0)
-	{
-		uint64 tmp_length;
-	
-		#if DEBUG_LOADER	
-		printf("Loading library: %s\n", c->lib);
-		#endif
-		if (ao_get_lib(c->lib, &lib_raw_file, &tmp_length) != AO_SUCCESS)
-		{
-			return AO_FAIL;
-		}
-		lib_raw_length = tmp_length;
-		
-		if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS)
-		{
-			free(lib_raw_file);
-			return AO_FAIL;
-		}
-				
-		// Free up raw file
-		free(lib_raw_file);
-
-		if (strncmp((char *)lib_decoded, "PS-X EXE", 8))
-		{
-			printf("Major error!  PSF was OK, but referenced library is not!\n");
-			free(lib);
-			return AO_FAIL;
-		}
-
-		#if DEBUG_LOADER	
-		offset = lib_decoded[0x18] | lib_decoded[0x19]<<8 | lib_decoded[0x1a]<<16 | lib_decoded[0x1b]<<24;
-		printf("Text section start: %x\n", offset);
-		offset = lib_decoded[0x1c] | lib_decoded[0x1d]<<8 | lib_decoded[0x1e]<<16 | lib_decoded[0x1f]<<24;
-		printf("Text section size: %x\n", offset);
-		printf("Region: [%s]\n", &lib_decoded[0x4c]);
-		printf("refresh: [%s]\n", lib->inf_refresh);			
-		#endif
-
-		// if the original file had no refresh tag, give the lib a shot
-		if (psf_refresh == -1)
-		{
-			if (lib->inf_refresh[0] == '5')
-			{
-				psf_refresh = 50;
-			}
-			if (lib->inf_refresh[0] == '6')
-			{
-				psf_refresh = 60;
-			}
-		}
-
-		PC = lib_decoded[0x10] | lib_decoded[0x11]<<8 | lib_decoded[0x12]<<16 | lib_decoded[0x13]<<24;
-		GP = lib_decoded[0x14] | lib_decoded[0x15]<<8 | lib_decoded[0x16]<<16 | lib_decoded[0x17]<<24;
-		SP = lib_decoded[0x30] | lib_decoded[0x31]<<8 | lib_decoded[0x32]<<16 | lib_decoded[0x33]<<24;
-
-		#if DEBUG_LOADER
-		printf("Library: PC %x GP %x SP %x\n", PC, GP, SP);
-		#endif
-
-		// now patch the file into RAM
-		offset = lib_decoded[0x18] | lib_decoded[0x19]<<8 | lib_decoded[0x1a]<<16 | lib_decoded[0x1b]<<24;
-		offset &= 0x3fffffff;	// kill any MIPS cache segment indicators
-		plength = lib_decoded[0x1c] | lib_decoded[0x1d]<<8 | lib_decoded[0x1e]<<16 | lib_decoded[0x1f]<<24;
-		#if DEBUG_LOADER
-		printf("library offset: %x plength: %d\n", offset, plength);
-		#endif
-		memcpy(&psx_ram[offset/4], lib_decoded+2048, plength);
-		
-		// Dispose the corlett structure for the lib - we don't use it
-		free(lib);
-	}
-
-	// now patch the main file into RAM OVER the libraries (but not the aux lib)
-	offset = file[0x18] | file[0x19]<<8 | file[0x1a]<<16 | file[0x1b]<<24;
-	offset &= 0x3fffffff;	// kill any MIPS cache segment indicators
-	plength = file[0x1c] | file[0x1d]<<8 | file[0x1e]<<16 | file[0x1f]<<24;
-
-	// Philosoma has an illegal "plength".  *sigh*
-	if (plength > (file_len-2048))
-	{
-		plength = file_len-2048;
-	}
-	memcpy(&psx_ram[offset/4], file+2048, plength);
-
-	// load any auxiliary libraries now
-	for (i = 0; i < 8; i++)
-	{
-		if (c->libaux[i][0] != 0)
-		{
-			uint64 tmp_length;
-		
-			#if DEBUG_LOADER	
-			printf("Loading aux library: %s\n", c->libaux[i]);
-			#endif
-
-			if (ao_get_lib(c->libaux[i], &lib_raw_file, &tmp_length) != AO_SUCCESS)
-			{
-				return AO_FAIL;
-			}
-			lib_raw_length = tmp_length;
-		
-			if (corlett_decode(lib_raw_file, lib_raw_length, &alib_decoded, &alib_len, &lib) != AO_SUCCESS)
-			{
-				free(lib_raw_file);
-				return AO_FAIL;
-			}
-				
-			// Free up raw file
-			free(lib_raw_file);
-
-			if (strncmp((char *)alib_decoded, "PS-X EXE", 8))
-			{
-				printf("Major error!  PSF was OK, but referenced library is not!\n");
-				free(lib);
-				return AO_FAIL;
-			}
-
-			#if DEBUG_LOADER	
-			offset = alib_decoded[0x18] | alib_decoded[0x19]<<8 | alib_decoded[0x1a]<<16 | alib_decoded[0x1b]<<24;
-			printf("Text section start: %x\n", offset);
-			offset = alib_decoded[0x1c] | alib_decoded[0x1d]<<8 | alib_decoded[0x1e]<<16 | alib_decoded[0x1f]<<24;
-			printf("Text section size: %x\n", offset);
-			printf("Region: [%s]\n", &alib_decoded[0x4c]);
-			#endif
-
-			// now patch the file into RAM
-			offset = alib_decoded[0x18] | alib_decoded[0x19]<<8 | alib_decoded[0x1a]<<16 | alib_decoded[0x1b]<<24;
-			offset &= 0x3fffffff;	// kill any MIPS cache segment indicators
-			plength = alib_decoded[0x1c] | alib_decoded[0x1d]<<8 | alib_decoded[0x1e]<<16 | alib_decoded[0x1f]<<24;
-			memcpy(&psx_ram[offset/4], alib_decoded+2048, plength);
-		
-			// Dispose the corlett structure for the lib - we don't use it
-			free(lib);
-		}
-	}
-
-	free(file);
-//	free(lib_decoded);
-	
-	// Finally, set psfby tag
-	strcpy(psfby, "n/a");
-	if (c)
-	{
-		int i;
-		for (i = 0; i < MAX_UNKNOWN_TAGS; i++)
-		{
-			if (!strcasecmp(c->tag_name[i], "psfby"))
-				strcpy(psfby, c->tag_data[i]);
-		}
-	}
-
-	mips_init();
-	mips_reset(NULL);
-
-	// set the initial PC, SP, GP
-	#if DEBUG_LOADER	
-	printf("Initial PC %x, GP %x, SP %x\n", PC, GP, SP);
-	printf("Refresh = %d\n", psf_refresh);
-	#endif
-	mipsinfo.i = PC;
-	mips_set_info(CPUINFO_INT_PC, &mipsinfo);
-
-	// set some reasonable default for the stack
-	if (SP == 0)
-	{
-		SP = 0x801fff00;
-	}
-
-	mipsinfo.i = SP;
-	mips_set_info(CPUINFO_INT_REGISTER + MIPS_R29, &mipsinfo);
-	mips_set_info(CPUINFO_INT_REGISTER + MIPS_R30, &mipsinfo);
-
-	mipsinfo.i = GP;
-	mips_set_info(CPUINFO_INT_REGISTER + MIPS_R28, &mipsinfo);
-
-	#if DEBUG_LOADER && 1
-	{
-		FILE *f;
-
-		f = fopen("psxram.bin", "wb");
-		fwrite(psx_ram, 2*1024*1024, 1, f);
-		fclose(f);
-	}
-	#endif
-
-	psx_hw_init();
-	SPUinit();
-	SPUopen();
-
-	lengthMS = psfTimeToMS(c->inf_length);
-	fadeMS = psfTimeToMS(c->inf_fade);
-
-	#if DEBUG_LOADER
-	printf("length %d fade %d\n", lengthMS, fadeMS);
-	#endif
-
-	if (lengthMS == 0) 
-	{
-		lengthMS = ~0;
-	}
-
-	setlength(lengthMS, fadeMS);
-
-//	psx_ram[0x118b8/4] = LE32(0);	// crash 2 hack
-
-	// backup the initial state for restart
-	memcpy(initial_ram, psx_ram, 2*1024*1024);
-	memcpy(initial_scratch, psx_scratch, 0x400);
-	initialPC = PC;
-	initialGP = GP;
-	initialSP = SP;
-
-	mips_execute(5000);
-	
-	return AO_SUCCESS;
-}
-
-void spu_update(unsigned char* pSound,long lBytes)
-{
-	memcpy(spu_pOutput, pSound, lBytes);
-}
-
-int32 psf_gen(int16 *buffer, uint32 samples)
-{	
-	int i;
-
-	for (i = 0; i < samples; i++)
-	{
-		psx_hw_slice();
-		SPUasync(384);
-	}
-
-	spu_pOutput = (char *)buffer;
-	SPU_flushboot();
-
-	psx_hw_frame();
-
-	return AO_SUCCESS;
-}
-
-int32 psf_stop(void)
-{
-	SPUclose();
-	free(c);
-
-	return AO_SUCCESS;
-}
-
-int32 psf_command(int32 command, int32 parameter)
-{
-	union cpuinfo mipsinfo;
-	uint32 lengthMS, fadeMS;
-
-	switch (command)
-	{
-		case COMMAND_RESTART:
-			SPUclose();
-
-			memcpy(psx_ram, initial_ram, 2*1024*1024);
-			memcpy(psx_scratch, initial_scratch, 0x400);
-
-			mips_init();
-			mips_reset(NULL);
-			psx_hw_init();
-			SPUinit();
-			SPUopen();
-
-			lengthMS = psfTimeToMS(c->inf_length);
-			fadeMS = psfTimeToMS(c->inf_fade);
-
-			if (lengthMS == 0) 
-			{
-				lengthMS = ~0;
-			}
-			setlength(lengthMS, fadeMS);
-
-			mipsinfo.i = initialPC;
-			mips_set_info(CPUINFO_INT_PC, &mipsinfo);
-			mipsinfo.i = initialSP;
-			mips_set_info(CPUINFO_INT_REGISTER + MIPS_R29, &mipsinfo);
-			mips_set_info(CPUINFO_INT_REGISTER + MIPS_R30, &mipsinfo);
-			mipsinfo.i = initialGP;
-			mips_set_info(CPUINFO_INT_REGISTER + MIPS_R28, &mipsinfo);
-
-			mips_execute(5000);
-
-			return AO_SUCCESS;
-		
-	}
-	return AO_FAIL;
-}
--- a/src/psf2/eng_spu.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,310 +0,0 @@
-/*
-	Audio Overload SDK - SPU file format engine
-
-	Copyright (c) 2007 R. Belmont and Richard Bannister.
-
-	All rights reserved.
-
-	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-	* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-	* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-	* Neither the names of R. Belmont and Richard Bannister nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-	"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-	LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-	A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-	CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-	EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-	PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-	PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-	LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-	NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-//
-// eng_spu.c
-//
-// Note: support for old-format files is not tested and may not work.  All the rips I could find
-//       are in the newer format.  Also, CDDA and XA commands do not work - I've not found a rip using them.
-//
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "ao.h"
-#include "eng_protos.h"
-#include "cpuintrf.h"
-#include "psx.h"
-
-extern int SPUinit(void);
-extern int SPUopen(void);
-extern int SPUclose(void);
-extern void SPUinjectRAMImage(unsigned short *source);
-extern void SPUwriteRegister(uint32 reg, uint16 val);
-extern uint16 SPUreadRegister(uint32 reg);
-extern void setlength(int32 stop, int32 fade);
-
-static uint8 *start_of_file, *song_ptr;
-static uint32 cur_tick, cur_event, num_events, next_tick, end_tick;
-static int old_fmt;
-static char name[128], song[128], company[128];
-
-int32 spu_start(uint8 *buffer, uint32 length)
-{
-	int i;
-	uint16 reg;
-
-	if (strncmp((char *)buffer, "SPU", 3))
-	{
-		return AO_FAIL;
-	}
-
-	start_of_file = buffer;
-
-	SPUinit();
-	SPUopen();
-	setlength(~0, 0);
-
-	// upload the SPU RAM image
-	SPUinjectRAMImage((unsigned short *)&buffer[0]);
-
-	// apply the register image	
-	for (i = 0; i < 512; i += 2)
-	{
-		reg = buffer[0x80000+i] | buffer[0x80000+i+1]<<8;
-
-		SPUwriteRegister((i/2)+0x1f801c00, reg);
-	}
-
-	old_fmt = 1;
-
-	if ((buffer[0x80200] != 0x44) || (buffer[0x80201] != 0xac) || (buffer[0x80202] != 0x00) || (buffer[0x80203] != 0x00))
-	{
-		old_fmt = 0;
-	}
-
-	if (old_fmt)
-	{
-		num_events = buffer[0x80204] | buffer[0x80205]<<8 | buffer[0x80206]<<16 | buffer[0x80207]<<24;
-
-		if (((num_events * 12) + 0x80208) > length)
-		{
-			old_fmt = 0;
-		}
-		else
-		{
-			cur_tick = 0;
-		}
-	}
-
-	if (!old_fmt)
-	{
-		end_tick = buffer[0x80200] | buffer[0x80201]<<8 | buffer[0x80202]<<16 | buffer[0x80203]<<24; 
-		cur_tick = buffer[0x80204] | buffer[0x80205]<<8 | buffer[0x80206]<<16 | buffer[0x80207]<<24; 
-		next_tick = cur_tick;
-	}
-
-	song_ptr = &buffer[0x80208];
-	cur_event = 0;
-
-	strncpy((char *)&buffer[4], name, 128);
-	strncpy((char *)&buffer[0x44], song, 128);
-	strncpy((char *)&buffer[0x84], company, 128);
-
-	return AO_SUCCESS;
-}
-
-extern int SPUasync(uint32 cycles);
-extern void SPU_flushboot(void);
-
-extern char *spu_pOutput;	// this is a bit lame, but we'll deal
-
-static void spu_tick(void)
-{
-	uint32 time, reg, size;
-	uint16 rdata;
-	uint8 opcode;
-
-	if (old_fmt)
-	{
-		time = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
-
-		while ((time == cur_tick) && (cur_event < num_events))
-		{
-			reg = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24;
-			rdata = song_ptr[8] | song_ptr[9]<<8;
-
-			SPUwriteRegister(reg, rdata);
-
-			cur_event++;
-			song_ptr += 12;
-
-			time = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
-		}
-	}
-	else
-	{
-		if (cur_tick < end_tick)
-		{
-			while (cur_tick == next_tick)
-			{
-				opcode = song_ptr[0];
-				song_ptr++;
-
-				switch (opcode)
-				{
-					case 0:	// write register
-						reg = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
-						rdata = song_ptr[4] | song_ptr[5]<<8;
-
-						SPUwriteRegister(reg, rdata);
-
-						next_tick = song_ptr[6] | song_ptr[7]<<8 | song_ptr[8]<<16 | song_ptr[9]<<24; 
-						song_ptr += 10;
-						break;
-
-					case 1:	// read register
-				 		reg = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24;
-						SPUreadRegister(reg);
-						next_tick = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24; 
-						song_ptr += 8;
-						break;
-
-					case 2: // dma write
-						size = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-						song_ptr += (4 + size);
-						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-						song_ptr += 4;
-						break;
-
-					case 3: // dma read
-						next_tick = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24; 
-						song_ptr += 8;
-						break;
-
-					case 4: // xa play
-						song_ptr += (32 + 16384);
-						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-						song_ptr += 4;
-						break;
-
-					case 5: // cdda play
-						size = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-						song_ptr += (4 + size);
-						next_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-						song_ptr += 4;
-						break;
-
-					default:
-						printf("Unknown opcode %d\n", opcode);
-						exit(-1);
-						break;
-				}
-			}
-		}
-		else
-		{
-//			ao_song_done = 1;
-		}
-	}
-
-	cur_tick++;
-}
-
-int32 spu_gen(int16 *buffer, uint32 samples)
-{
-	int i, run = 1;
-
-	if (old_fmt)
-	{
-		if (cur_event >= num_events)
-		{
-			run = 0;
-		}
-	}
-	else
-	{
-		if (cur_tick >= end_tick)
-		{
-			run = 0;
-		}
-	}
-
-	if (run)
-	{
-		for (i = 0; i < samples; i++)
-		{
-		  	spu_tick();
-			SPUasync(384);
-		}
-
-		spu_pOutput = (char *)buffer;
-		SPU_flushboot();
-	}
-	else
-	{
-		memset(buffer, 0, samples*2*sizeof(int16));
-	}
-
-	return AO_SUCCESS;
-}
-
-int32 spu_stop(void)
-{
-	return AO_SUCCESS;
-}
-
-int32 spu_command(int32 command, int32 parameter)
-{
-	switch (command)
-	{
-		case COMMAND_GET_MIN:
-		case COMMAND_GET_MAX:
-		{
-			return 0;
-		}
-		break;
-		
-		case COMMAND_HAS_PREV:
-		case COMMAND_HAS_NEXT:
-		case COMMAND_PREV:
-		case COMMAND_NEXT:
-		case COMMAND_JUMP:
-		{
-			return AO_FAIL;
-		}
-		break;
-		
-		case COMMAND_RESTART:
-		{
-			song_ptr = &start_of_file[0x80200];
-
-			if (old_fmt)
-			{
-				num_events = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24;
-			}
-			else
-			{
-				end_tick = song_ptr[0] | song_ptr[1]<<8 | song_ptr[2]<<16 | song_ptr[3]<<24; 
-				cur_tick = song_ptr[4] | song_ptr[5]<<8 | song_ptr[6]<<16 | song_ptr[7]<<24; 
-			}
-
-			song_ptr += 8;
-			cur_event = 0;
-			return AO_SUCCESS;
-		}
-		break;
-		
-#if VERBOSE
-		default:
-			printf("Unknown command executed!\n");
-			break;
-#endif		
-	}
-	
-	return AO_FAIL;
-}
--- a/src/psf2/peops/License.txt	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,282 +0,0 @@
-#########################################################################
-
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                          675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
--- a/src/psf2/peops/adsr.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,618 +0,0 @@
-/***************************************************************************
-                          adsr.c  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2003/01/06 - Pete
-// - added Neill's ADSR timings
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#define _IN_ADSR
-
-// will be included from spu.c
-#ifdef _IN_SPU
-
-////////////////////////////////////////////////////////////////////////
-// ADSR func
-////////////////////////////////////////////////////////////////////////
-
-static u32 RateTable[160];
-
-static void InitADSR(void)                                    // INIT ADSR
-{
- u32 r,rs,rd;int i;
-
- memset(RateTable,0,sizeof(u32)*160);        // build the rate table according to Neill's rules (see at bottom of file)
-
- r=3;rs=1;rd=0;
-
- for(i=32;i<160;i++)                                   // we start at pos 32 with the real values... everything before is 0
-  {
-   if(r<0x3FFFFFFF)
-    {
-     r+=rs;
-     rd++;if(rd==5) {rd=1;rs*=2;}
-    }
-   if(r>0x3FFFFFFF) r=0x3FFFFFFF;
-
-   RateTable[i]=r;
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-
-static INLINE void StartADSR(int ch)                          // MIX ADSR
-{
- s_chan[ch].ADSRX.lVolume=1;                           // and init some adsr vars
- s_chan[ch].ADSRX.State=0;
- s_chan[ch].ADSRX.EnvelopeVol=0;
-}
-
-////////////////////////////////////////////////////////////////////////
-
-static INLINE int MixADSR(int ch)                             // MIX ADSR
-{    
- static const int sexytable[8]=
-	{0,4,6,8,9,10,11,12};
-
- if(s_chan[ch].bStop)                                  // should be stopped:
-  {                                                    // do release
-   if(s_chan[ch].ADSRX.ReleaseModeExp)
-    {
-     s_chan[ch].ADSRX.EnvelopeVol-=RateTable[(4*(s_chan[ch].ADSRX.ReleaseRate^0x1F))-0x18+32+sexytable[(s_chan[ch].ADSRX.EnvelopeVol>>28)&0x7]];
-    }
-   else
-    {
-     s_chan[ch].ADSRX.EnvelopeVol-=RateTable[(4*(s_chan[ch].ADSRX.ReleaseRate^0x1F))-0x0C + 32];
-    }
-
-   if(s_chan[ch].ADSRX.EnvelopeVol<0) 
-    {
-     s_chan[ch].ADSRX.EnvelopeVol=0;
-     s_chan[ch].bOn=0;
-     s_chan[ch].bNoise=0;
-    }
-
-   s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;
-   return s_chan[ch].ADSRX.lVolume;
-  }
- else                                                  // not stopped yet?
-  {
-   if(s_chan[ch].ADSRX.State==0)                       // -> attack
-    {
-     if(s_chan[ch].ADSRX.AttackModeExp)
-      {
-       if(s_chan[ch].ADSRX.EnvelopeVol<0x60000000) 
-        s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.AttackRate^0x7F)-0x10 + 32];
-       else
-        s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.AttackRate^0x7F)-0x18 + 32];
-      }
-     else
-      {
-       s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.AttackRate^0x7F)-0x10 + 32];
-      }
-
-     if(s_chan[ch].ADSRX.EnvelopeVol<0) 
-      {
-       s_chan[ch].ADSRX.EnvelopeVol=0x7FFFFFFF;
-       s_chan[ch].ADSRX.State=1;
-      }
-
-     s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;
-     return s_chan[ch].ADSRX.lVolume;
-    }
-   //--------------------------------------------------//
-   if(s_chan[ch].ADSRX.State==1)                       // -> decay
-    {
-     s_chan[ch].ADSRX.EnvelopeVol-=RateTable[(4*(s_chan[ch].ADSRX.DecayRate^0x1F))-0x18+32+sexytable[(s_chan[ch].ADSRX.EnvelopeVol>>28)&0x7]];
-
-     if(s_chan[ch].ADSRX.EnvelopeVol<0) s_chan[ch].ADSRX.EnvelopeVol=0;
-     if(((s_chan[ch].ADSRX.EnvelopeVol>>27)&0xF) <= s_chan[ch].ADSRX.SustainLevel)
-      {
-       s_chan[ch].ADSRX.State=2;
-      }
-
-     s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;
-     return s_chan[ch].ADSRX.lVolume;
-    }
-   //--------------------------------------------------//
-   if(s_chan[ch].ADSRX.State==2)                       // -> sustain
-    {
-     if(s_chan[ch].ADSRX.SustainIncrease)
-      {
-       if(s_chan[ch].ADSRX.SustainModeExp)
-        {
-         if(s_chan[ch].ADSRX.EnvelopeVol<0x60000000) 
-          s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.SustainRate^0x7F)-0x10 + 32];
-         else
-          s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.SustainRate^0x7F)-0x18 + 32];
-        }
-       else
-        {
-         s_chan[ch].ADSRX.EnvelopeVol+=RateTable[(s_chan[ch].ADSRX.SustainRate^0x7F)-0x10 + 32];
-        }
-
-       if(s_chan[ch].ADSRX.EnvelopeVol<0) 
-        {
-         s_chan[ch].ADSRX.EnvelopeVol=0x7FFFFFFF;
-        }
-      }
-     else
-      {
-       if(s_chan[ch].ADSRX.SustainModeExp)
-        s_chan[ch].ADSRX.EnvelopeVol-=RateTable[((s_chan[ch].ADSRX.SustainRate^0x7F))-0x1B+32+sexytable[(s_chan[ch].ADSRX.EnvelopeVol>>28)&0x7]];
-       else
-        s_chan[ch].ADSRX.EnvelopeVol-=RateTable[((s_chan[ch].ADSRX.SustainRate^0x7F))-0x0F + 32];
-
-       if(s_chan[ch].ADSRX.EnvelopeVol<0) 
-        {
-         s_chan[ch].ADSRX.EnvelopeVol=0;
-        }
-      }
-     s_chan[ch].ADSRX.lVolume=s_chan[ch].ADSRX.EnvelopeVol>>21;
-     return s_chan[ch].ADSRX.lVolume;
-    }
-  }
- return 0;
-}
-
-#endif
-
-/*
-James Higgs ADSR investigations:
-
-PSX SPU Envelope Timings
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-First, here is an extract from doomed's SPU doc, which explains the basics
-of the SPU "volume envelope": 
-
-*** doomed doc extract start ***
-
---------------------------------------------------------------------------
-Voices.
---------------------------------------------------------------------------
-The SPU has 24 hardware voices. These voices can be used to reproduce sample
-data, noise or can be used as frequency modulator on the next voice.
-Each voice has it's own programmable ADSR envelope filter. The main volume
-can be programmed independently for left and right output.
-
-The ADSR envelope filter works as follows:
-Ar = Attack rate, which specifies the speed at which the volume increases
-     from zero to it's maximum value, as soon as the note on is given. The
-     slope can be set to lineair or exponential.
-Dr = Decay rate specifies the speed at which the volume decreases to the
-     sustain level. Decay is always decreasing exponentially.
-Sl = Sustain level, base level from which sustain starts.
-Sr = Sustain rate is the rate at which the volume of the sustained note
-     increases or decreases. This can be either lineair or exponential.
-Rr = Release rate is the rate at which the volume of the note decreases
-     as soon as the note off is given.
-
-     lvl |
-       ^ |     /\Dr     __
-     Sl _| _  / _ \__---  \
-         |   /       ---__ \ Rr
-         |  /Ar       Sr  \ \
-         | /                \\
-         |/___________________\________
-                                  ->time
-
-The overal volume can also be set to sweep up or down lineairly or
-exponentially from it's current value. This can be done seperately
-for left and right.
-
-Relevant SPU registers:
--------------------------------------------------------------
-$1f801xx8         Attack/Decay/Sustain level
-bit  |0f|0e 0d 0c 0b 0a 09 08|07 06 05 04|03 02 01 00|
-desc.|Am|         Ar         |Dr         |Sl         |
-
-Am       0        Attack mode Linear
-         1                    Exponential
-
-Ar       0-7f     attack rate
-Dr       0-f      decay rate
-Sl       0-f      sustain level
--------------------------------------------------------------
-$1f801xxa         Sustain rate, Release Rate.
-bit  |0f|0e|0d|0c 0b 0a 09 08 07 06|05|04 03 02 01 00|
-desc.|Sm|Sd| 0|   Sr               |Rm|Rr            |
-
-Sm       0        sustain rate mode linear
-         1                          exponential
-Sd       0        sustain rate mode increase
-         1                          decrease
-Sr       0-7f     Sustain Rate
-Rm       0        Linear decrease
-         1        Exponential decrease
-Rr       0-1f     Release Rate
-
-Note: decay mode is always Expontial decrease, and thus cannot
-be set.
--------------------------------------------------------------
-$1f801xxc         Current ADSR volume
-bit  |0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00|
-desc.|ADSRvol                                        |
-
-ADSRvol           Returns the current envelope volume when
-                  read.
--- James' Note: return range: 0 -> 32767
-
-*** doomed doc extract end *** 
-
-By using a small PSX proggie to visualise the envelope as it was played,
-the following results for envelope timing were obtained:
-
-1. Attack rate value (linear mode)
-
-   Attack value range: 0 -> 127
-
-   Value  | 48 | 52 | 56 | 60 | 64 | 68 | 72 |    | 80 |
-   -----------------------------------------------------------------
-   Frames | 11 | 21 | 42 | 84 | 169| 338| 676|    |2890|
-
-   Note: frames is no. of PAL frames to reach full volume (100%
-   amplitude)
-
-   Hmm, noticing that the time taken to reach full volume doubles
-   every time we add 4 to our attack value, we know the equation is
-   of form:
-             frames = k * 2 ^ (value / 4)
-
-   (You may ponder about envelope generator hardware at this point,
-   or maybe not... :)
-
-   By substituting some stuff and running some checks, we get:
-
-       k = 0.00257              (close enuf)
-
-   therefore,
-             frames = 0.00257 * 2 ^ (value / 4)
-   If you just happen to be writing an emulator, then you can probably
-   use an equation like:
-
-       %volume_increase_per_tick = 1 / frames
-
-
-   ------------------------------------
-   Pete:
-   ms=((1<<(value>>2))*514)/10000
-   ------------------------------------
-
-2. Decay rate value (only has log mode)
-
-   Decay value range: 0 -> 15
-
-   Value  |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
-   ------------------------------------------------
-   frames |    |    |    |    |  6 | 12 | 24 | 47 |
-
-   Note: frames here is no. of PAL frames to decay to 50% volume.
-
-   formula: frames = k * 2 ^ (value)
-
-   Substituting, we get: k = 0.00146
-
-   Further info on logarithmic nature:
-   frames to decay to sustain level 3  =  3 * frames to decay to 
-   sustain level 9
-
-   Also no. of frames to 25% volume = roughly 1.85 * no. of frames to
-   50% volume.
-
-   Frag it - just use linear approx.
-
-   ------------------------------------
-   Pete:
-   ms=((1<<value)*292)/10000
-   ------------------------------------
-
-
-3. Sustain rate value (linear mode)
-
-   Sustain rate range: 0 -> 127
-
-   Value  | 48 | 52 | 56 | 60 | 64 | 68 | 72 |
-   -------------------------------------------
-   frames |  9 | 19 | 37 | 74 | 147| 293| 587|
-
-   Here, frames = no. of PAL frames for volume amplitude to go from 100%
-   to 0% (or vice-versa).
-
-   Same formula as for attack value, just a different value for k:
-
-   k = 0.00225
-
-   ie: frames = 0.00225 * 2 ^ (value / 4)
-
-   For emulation purposes:
-
-   %volume_increase_or_decrease_per_tick = 1 / frames
-
-   ------------------------------------
-   Pete:
-   ms=((1<<(value>>2))*450)/10000
-   ------------------------------------
-
-
-4. Release rate (linear mode)
-
-   Release rate range: 0 -> 31
-
-   Value  | 13 | 14 | 15 | 16 | 17 |
-   ---------------------------------------------------------------
-   frames | 18 | 36 | 73 | 146| 292|
-
-   Here, frames = no. of PAL frames to decay from 100% vol to 0% vol
-   after "note-off" is triggered.
-
-   Formula: frames = k * 2 ^ (value)
-
-   And so: k = 0.00223
-
-   ------------------------------------
-   Pete:
-   ms=((1<<value)*446)/10000
-   ------------------------------------
-
-
-Other notes:   
-
-Log stuff not figured out. You may get some clues from the "Decay rate"
-stuff above. For emu purposes it may not be important - use linear
-approx.
-
-To get timings in millisecs, multiply frames by 20.
-
-
-
-- James Higgs 17/6/2000
-james7780@yahoo.com
-
-//---------------------------------------------------------------
-
-OLD adsr mixing according to james' rules... has to be called
-every one millisecond
-
-
- i32 v,v2,lT,l1,l2,l3;
-
- if(s_chan[ch].bStop)                                  // psx wants to stop? -> release phase
-  {
-   if(s_chan[ch].ADSR.ReleaseVal!=0)                   // -> release not 0: do release (if 0: stop right now)
-    {
-     if(!s_chan[ch].ADSR.ReleaseVol)                   // --> release just started? set up the release stuff
-      {
-       s_chan[ch].ADSR.ReleaseStartTime=s_chan[ch].ADSR.lTime;
-       s_chan[ch].ADSR.ReleaseVol=s_chan[ch].ADSR.lVolume;
-       s_chan[ch].ADSR.ReleaseTime =                   // --> calc how long does it take to reach the wanted sus level
-         (s_chan[ch].ADSR.ReleaseTime*
-          s_chan[ch].ADSR.ReleaseVol)/1024;
-      }
-                                                       // -> NO release exp mode used (yet)
-     v=s_chan[ch].ADSR.ReleaseVol;                     // -> get last volume
-     lT=s_chan[ch].ADSR.lTime-                         // -> how much time is past?
-        s_chan[ch].ADSR.ReleaseStartTime;
-     l1=s_chan[ch].ADSR.ReleaseTime;
-                                                       
-     if(lT<l1)                                         // -> we still have to release
-      {
-       v=v-((v*lT)/l1);                                // --> calc new volume
-      }
-     else                                              // -> release is over: now really stop that sample
-      {v=0;s_chan[ch].bOn=0;s_chan[ch].ADSR.ReleaseVol=0;s_chan[ch].bNoise=0;}
-    }
-   else                                                // -> release IS 0: release at once
-    {
-     v=0;s_chan[ch].bOn=0;s_chan[ch].ADSR.ReleaseVol=0;s_chan[ch].bNoise=0;
-    }
-  }
- else                                               
-  {//--------------------------------------------------// not in release phase:
-   v=1024;
-   lT=s_chan[ch].ADSR.lTime;
-   l1=s_chan[ch].ADSR.AttackTime;
-                                                       
-   if(lT<l1)                                           // attack
-    {                                                  // no exp mode used (yet)
-//     if(s_chan[ch].ADSR.AttackModeExp)
-//      {
-//       v=(v*lT)/l1;
-//      }
-//     else
-      {
-       v=(v*lT)/l1;
-      }
-     if(v==0) v=1;
-    }
-   else                                                // decay
-    {                                                  // should be exp, but who cares? ;)
-     l2=s_chan[ch].ADSR.DecayTime;
-     v2=s_chan[ch].ADSR.SustainLevel;
-
-     lT-=l1;
-     if(lT<l2)
-      {
-       v-=(((v-v2)*lT)/l2);
-      }
-     else                                              // sustain
-      {                                                // no exp mode used (yet)
-       l3=s_chan[ch].ADSR.SustainTime;
-       lT-=l2;
-       if(s_chan[ch].ADSR.SustainModeDec>0)
-        {
-         if(l3!=0) v2+=((v-v2)*lT)/l3;
-         else      v2=v;
-        }
-       else
-        {
-         if(l3!=0) v2-=(v2*lT)/l3;
-         else      v2=v;
-        }
-
-       if(v2>v)  v2=v;
-       if(v2<=0) {v2=0;s_chan[ch].bOn=0;s_chan[ch].ADSR.ReleaseVol=0;s_chan[ch].bNoise=0;}
-
-       v=v2;
-      }
-    }
-  }
-
- //----------------------------------------------------// 
- // ok, done for this channel, so increase time
-
- s_chan[ch].ADSR.lTime+=1;                             // 1 = 1.020408f ms;      
-
- if(v>1024)     v=1024;                                // adjust volume
- if(v<0)        v=0;                                  
- s_chan[ch].ADSR.lVolume=v;                            // store act volume
-
- return v;                                             // return the volume factor
-*/
-
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-
-
-/*
------------------------------------------------------------------------------
-Neill Corlett
-Playstation SPU envelope timing notes
------------------------------------------------------------------------------
-
-This is preliminary.  This may be wrong.  But the model described herein fits
-all of my experimental data, and it's just simple enough to sound right.
-
-ADSR envelope level ranges from 0x00000000 to 0x7FFFFFFF internally.
-The value returned by channel reg 0xC is (envelope_level>>16).
-
-Each sample, an increment or decrement value will be added to or
-subtracted from this envelope level.
-
-Create the rate log table.  The values double every 4 entries.
-   entry #0 = 4
-
-    4, 5, 6, 7,
-    8,10,12,14,
-   16,20,24,28, ...
-
-   entry #40 = 4096...
-   entry #44 = 8192...
-   entry #48 = 16384...
-   entry #52 = 32768...
-   entry #56 = 65536...
-
-increments and decrements are in terms of ratelogtable[n]
-n may exceed the table bounds (plan on n being between -32 and 127).
-table values are all clipped between 0x00000000 and 0x3FFFFFFF
-
-when you "voice on", the envelope is always fully reset.
-(yes, it may click. the real thing does this too.)
-
-envelope level begins at zero.
-
-each state happens for at least 1 cycle
-(transitions are not instantaneous)
-this may result in some oddness: if the decay rate is uberfast, it will cut
-the envelope from full down to half in one sample, potentially skipping over
-the sustain level
-
-ATTACK
-------
-- if the envelope level has overflowed past the max, clip to 0x7FFFFFFF and
-  proceed to DECAY.
-
-Linear attack mode:
-- line extends upward to 0x7FFFFFFF
-- increment per sample is ratelogtable[(Ar^0x7F)-0x10]
-
-Logarithmic attack mode:
-if envelope_level < 0x60000000:
-  - line extends upward to 0x60000000
-  - increment per sample is ratelogtable[(Ar^0x7F)-0x10]
-else:
-  - line extends upward to 0x7FFFFFFF
-  - increment per sample is ratelogtable[(Ar^0x7F)-0x18]
-
-DECAY
------
-- if ((envelope_level>>27)&0xF) <= Sl, proceed to SUSTAIN.
-  Do not clip to the sustain level.
-- current line ends at (envelope_level & 0x07FFFFFF)
-- decrement per sample depends on (envelope_level>>28)&0x7
-  0: ratelogtable[(4*(Dr^0x1F))-0x18+0]
-  1: ratelogtable[(4*(Dr^0x1F))-0x18+4]
-  2: ratelogtable[(4*(Dr^0x1F))-0x18+6]
-  3: ratelogtable[(4*(Dr^0x1F))-0x18+8]
-  4: ratelogtable[(4*(Dr^0x1F))-0x18+9]
-  5: ratelogtable[(4*(Dr^0x1F))-0x18+10]
-  6: ratelogtable[(4*(Dr^0x1F))-0x18+11]
-  7: ratelogtable[(4*(Dr^0x1F))-0x18+12]
-  (note that this is the same as the release rate formula, except that
-   decay rates 10-1F aren't possible... those would be slower in theory)
-
-SUSTAIN
--------
-- no terminating condition except for voice off
-- Sd=0 (increase) behavior is identical to ATTACK for both log and linear.
-- Sd=1 (decrease) behavior:
-Linear sustain decrease:
-- line extends to 0x00000000
-- decrement per sample is ratelogtable[(Sr^0x7F)-0x0F]
-Logarithmic sustain decrease:
-- current line ends at (envelope_level & 0x07FFFFFF)
-- decrement per sample depends on (envelope_level>>28)&0x7
-  0: ratelogtable[(Sr^0x7F)-0x1B+0]
-  1: ratelogtable[(Sr^0x7F)-0x1B+4]
-  2: ratelogtable[(Sr^0x7F)-0x1B+6]
-  3: ratelogtable[(Sr^0x7F)-0x1B+8]
-  4: ratelogtable[(Sr^0x7F)-0x1B+9]
-  5: ratelogtable[(Sr^0x7F)-0x1B+10]
-  6: ratelogtable[(Sr^0x7F)-0x1B+11]
-  7: ratelogtable[(Sr^0x7F)-0x1B+12]
-
-RELEASE
--------
-- if the envelope level has overflowed to negative, clip to 0 and QUIT.
-
-Linear release mode:
-- line extends to 0x00000000
-- decrement per sample is ratelogtable[(4*(Rr^0x1F))-0x0C]
-
-Logarithmic release mode:
-- line extends to (envelope_level & 0x0FFFFFFF)
-- decrement per sample depends on (envelope_level>>28)&0x7
-  0: ratelogtable[(4*(Rr^0x1F))-0x18+0]
-  1: ratelogtable[(4*(Rr^0x1F))-0x18+4]
-  2: ratelogtable[(4*(Rr^0x1F))-0x18+6]
-  3: ratelogtable[(4*(Rr^0x1F))-0x18+8]
-  4: ratelogtable[(4*(Rr^0x1F))-0x18+9]
-  5: ratelogtable[(4*(Rr^0x1F))-0x18+10]
-  6: ratelogtable[(4*(Rr^0x1F))-0x18+11]
-  7: ratelogtable[(4*(Rr^0x1F))-0x18+12]
-
------------------------------------------------------------------------------
-*/
--- a/src/psf2/peops/adsr.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/***************************************************************************
-                           adsr.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-static INLINE void StartADSR(int ch);
-static INLINE int  MixADSR(int ch);
--- a/src/psf2/peops/dma.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/***************************************************************************
-                            dma.c  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#include "../peops/stdafx.h"
-
-#define _IN_DMA
-
-extern uint32 psx_ram[(2*1024*1024)/4];
-
-//#include "externals.h"
-////////////////////////////////////////////////////////////////////////
-// READ DMA (many values)
-////////////////////////////////////////////////////////////////////////
-
-void SPUreadDMAMem(u32 usPSXMem,int iSize)
-{
- int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
-
- for(i=0;i<iSize;i++)
-  {
-   ram16[usPSXMem>>1]=spuMem[spuAddr>>1];		// spu addr got by writeregister
-   usPSXMem+=2;
-   spuAddr+=2;                                         // inc spu addr
-   if(spuAddr>0x7ffff) spuAddr=0;                      // wrap
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////
-
-// to investigate: do sound data updates by writedma affect spu
-// irqs? Will an irq be triggered, if new data is written to
-// the memory irq address?
-
-////////////////////////////////////////////////////////////////////////
-// WRITE DMA (many values)
-////////////////////////////////////////////////////////////////////////
-
-void SPUwriteDMAMem(u32 usPSXMem,int iSize)
-{
- int i;
- u16 *ram16 = (u16 *)&psx_ram[0];
-
- for(i=0;i<iSize;i++)
-  {
-//  printf("main RAM %x => SPU %x\n", usPSXMem, spuAddr);
-   spuMem[spuAddr>>1] = ram16[usPSXMem>>1];
-   usPSXMem+=2;                  			// spu addr got by writeregister
-   spuAddr+=2;                                         // inc spu addr
-   if(spuAddr>0x7ffff) spuAddr=0;                      // wrap
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-
--- a/src/psf2/peops/dma.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/***************************************************************************
-                            dma.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-
-u16 CALLBACK SPUreadDMA(void);
-void CALLBACK SPUreadDMAMem(u16 * pusPSXMem,int iSize);
-void CALLBACK SPUwriteDMA(u16 val);
-void CALLBACK SPUwriteDMAMem(u16 * pusPSXMem,int iSize);
--- a/src/psf2/peops/externals.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-/***************************************************************************
-                         externals.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-#include "ao.h"
-
-#ifndef PEOPS_EXTERNALS
-#define PEOPS_EXTERNALS
-
-typedef int8 s8;
-typedef int16 s16;
-typedef int32 s32;
-typedef int64 s64;
-
-typedef uint8 u8;
-typedef uint16 u16;
-typedef uint32 u32;
-typedef uint64 u64;
-
-#if LSB_FIRST
-static INLINE u16 BFLIP16(u16 x)
-{
- return x;
-}
-#else
-static INLINE u16 BFLIP16(u16 x)
-{
- return( ((x>>8)&0xFF)| ((x&0xFF)<<8) );
-}
-#endif
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#define max(a,b)            (((a) > (b)) ? (a) : (b))
-#define min(a,b)            (((a) < (b)) ? (a) : (b))
-
-////////////////////////////////////////////////////////////////////////
-// spu defines
-////////////////////////////////////////////////////////////////////////
-
-// num of channels
-#define MAXCHAN     24
-
-///////////////////////////////////////////////////////////
-// struct defines
-///////////////////////////////////////////////////////////
-
-// ADSR INFOS PER CHANNEL
-typedef struct
-{
- int            AttackModeExp;
- s32           AttackTime;
- s32           DecayTime;
- s32           SustainLevel;
- int            SustainModeExp;
- s32           SustainModeDec;
- s32           SustainTime;
- int            ReleaseModeExp;
- u32  ReleaseVal;
- s32           ReleaseTime;
- s32           ReleaseStartTime; 
- s32           ReleaseVol; 
- s32           lTime;
- s32           lVolume;
-} ADSRInfo;
-
-typedef struct
-{
- int            State;
- int            AttackModeExp;
- int            AttackRate;
- int            DecayRate;
- int            SustainLevel;
- int            SustainModeExp;
- int            SustainIncrease;
- int            SustainRate;
- int            ReleaseModeExp;
- int            ReleaseRate;
- int            EnvelopeVol;
- s32           lVolume;
- s32           lDummy1;
- s32           lDummy2;
-} ADSRInfoEx;
-              
-///////////////////////////////////////////////////////////
-
-// Tmp Flags
-
-// used for debug channel muting
-#define FLAG_MUTE  1
-
-///////////////////////////////////////////////////////////
-
-// MAIN CHANNEL STRUCT
-typedef struct
-{
- int               bNew;                               // start flag
-
- int               iSBPos;                             // mixing stuff
- int               spos;
- int               sinc;
- int               SB[32+1];
- int               sval;
-
- u8 *   pStart;                             // start ptr into sound mem
- u8 *   pCurr;                              // current pos in sound mem
- u8 *   pLoop;                              // loop ptr in sound mem
-
- int               bOn;                                // is channel active (sample playing?)
- int               bStop;                              // is channel stopped (sample _can_ still be playing, ADSR Release phase)
- int               iActFreq;                           // current psx pitch
- int               iUsedFreq;                          // current pc pitch
- int               iLeftVolume;                        // left volume
- int               iLeftVolRaw;                        // left psx volume value
- int               bIgnoreLoop;                        // ignore loop bit, if an external loop address is used
- int               iRightVolume;                       // right volume
- int               iRightVolRaw;                       // right psx volume value
- int               iRawPitch;                          // raw pitch (0...3fff)
- int               iIrqDone;                           // debug irq done flag
- int               s_1;                                // last decoding infos
- int               s_2;
- int               bRVBActive;                         // reverb active flag
- int               iRVBOffset;                         // reverb offset
- int               iRVBRepeat;                         // reverb repeat
- int               bNoise;                             // noise active flag
- int               bFMod;                              // freq mod (0=off, 1=sound channel, 2=freq channel)
- int               iOldNoise;                          // old noise val for this channel   
- ADSRInfo          ADSR;                               // active ADSR settings
- ADSRInfoEx        ADSRX;                              // next ADSR settings (will be moved to active on sample start)
-
-} SPUCHAN;
-
-///////////////////////////////////////////////////////////
-
-typedef struct
-{
- int StartAddr;      // reverb area start addr in samples
- int CurrAddr;       // reverb area curr addr in samples
-
- int Enabled;
- int VolLeft;
- int VolRight;
- int iLastRVBLeft;
- int iLastRVBRight;
- int iRVBLeft;
- int iRVBRight;
-
-
- int FB_SRC_A;       // (offset)
- int FB_SRC_B;       // (offset)
- int IIR_ALPHA;      // (coef.)
- int ACC_COEF_A;     // (coef.)
- int ACC_COEF_B;     // (coef.)
- int ACC_COEF_C;     // (coef.)
- int ACC_COEF_D;     // (coef.)
- int IIR_COEF;       // (coef.)
- int FB_ALPHA;       // (coef.)
- int FB_X;           // (coef.)
- int IIR_DEST_A0;    // (offset)
- int IIR_DEST_A1;    // (offset)
- int ACC_SRC_A0;     // (offset)
- int ACC_SRC_A1;     // (offset)
- int ACC_SRC_B0;     // (offset)
- int ACC_SRC_B1;     // (offset)
- int IIR_SRC_A0;     // (offset)
- int IIR_SRC_A1;     // (offset)
- int IIR_DEST_B0;    // (offset)
- int IIR_DEST_B1;    // (offset)
- int ACC_SRC_C0;     // (offset)
- int ACC_SRC_C1;     // (offset)
- int ACC_SRC_D0;     // (offset)
- int ACC_SRC_D1;     // (offset)
- int IIR_SRC_B1;     // (offset)
- int IIR_SRC_B0;     // (offset)
- int MIX_DEST_A0;    // (offset)
- int MIX_DEST_A1;    // (offset)
- int MIX_DEST_B0;    // (offset)
- int MIX_DEST_B1;    // (offset)
- int IN_COEF_L;      // (coef.)
- int IN_COEF_R;      // (coef.)
-} REVERBInfo;
-
-#endif // PEOPS_EXTERNALS
--- a/src/psf2/peops/gauss_i.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-/***************************************************************************
-                          gauss_i.h  -  description
-                           -----------------------
-    begin                : Sun Feb 08 2003
-    copyright            : (C) 2003 by Chris Moeller, eh, whatever
-    email                : chris@kode54.tk
- ***************************************************************************/
-                       
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-                           
-//*************************************************************************//
-// History of changes:
-//
-// 2003/02/08 - kode54
-// - generated by interleaving table from gauss.h from the libopenspc
-//   project; a gaussian bell curve table logged from the SPC-700,
-//   though Neill says he logged the same curve from a PSX SPU. Also
-//   says that interleaving the coefficients together runs faster. Meh.
-//
-//*************************************************************************//
-
-#ifndef GAUSS_H
-#define GAUSS_H
-
-// 1024 entries
-const int gauss[]={
-	0x172, 0x519, 0x176, 0x000, 0x16E, 0x519, 0x17A, 0x000, 
-	0x16A, 0x518, 0x17D, 0x000, 0x166, 0x518, 0x181, 0x000, 
-	0x162, 0x518, 0x185, 0x000, 0x15F, 0x518, 0x189, 0x000, 
-	0x15B, 0x518, 0x18D, 0x000, 0x157, 0x517, 0x191, 0x000, 
-	0x153, 0x517, 0x195, 0x000, 0x150, 0x517, 0x19A, 0x000, 
-	0x14C, 0x516, 0x19E, 0x000, 0x148, 0x516, 0x1A2, 0x000, 
-	0x145, 0x515, 0x1A6, 0x000, 0x141, 0x514, 0x1AA, 0x000, 
-	0x13E, 0x514, 0x1AE, 0x000, 0x13A, 0x513, 0x1B2, 0x000, 
-	0x137, 0x512, 0x1B7, 0x001, 0x133, 0x511, 0x1BB, 0x001, 
-	0x130, 0x511, 0x1BF, 0x001, 0x12C, 0x510, 0x1C3, 0x001, 
-	0x129, 0x50F, 0x1C8, 0x001, 0x125, 0x50E, 0x1CC, 0x001, 
-	0x122, 0x50D, 0x1D0, 0x001, 0x11E, 0x50C, 0x1D5, 0x001, 
-	0x11B, 0x50B, 0x1D9, 0x001, 0x118, 0x50A, 0x1DD, 0x001, 
-	0x114, 0x508, 0x1E2, 0x001, 0x111, 0x507, 0x1E6, 0x002, 
-	0x10E, 0x506, 0x1EB, 0x002, 0x10B, 0x504, 0x1EF, 0x002, 
-	0x107, 0x503, 0x1F3, 0x002, 0x104, 0x502, 0x1F8, 0x002, 
-	0x101, 0x500, 0x1FC, 0x002, 0x0FE, 0x4FF, 0x201, 0x002, 
-	0x0FB, 0x4FD, 0x205, 0x003, 0x0F8, 0x4FB, 0x20A, 0x003, 
-	0x0F5, 0x4FA, 0x20F, 0x003, 0x0F2, 0x4F8, 0x213, 0x003, 
-	0x0EF, 0x4F6, 0x218, 0x003, 0x0EC, 0x4F5, 0x21C, 0x004, 
-	0x0E9, 0x4F3, 0x221, 0x004, 0x0E6, 0x4F1, 0x226, 0x004, 
-	0x0E3, 0x4EF, 0x22A, 0x004, 0x0E0, 0x4ED, 0x22F, 0x004, 
-	0x0DD, 0x4EB, 0x233, 0x005, 0x0DA, 0x4E9, 0x238, 0x005, 
-	0x0D7, 0x4E7, 0x23D, 0x005, 0x0D4, 0x4E5, 0x241, 0x005, 
-	0x0D2, 0x4E3, 0x246, 0x006, 0x0CF, 0x4E0, 0x24B, 0x006, 
-	0x0CC, 0x4DE, 0x250, 0x006, 0x0C9, 0x4DC, 0x254, 0x006, 
-	0x0C7, 0x4D9, 0x259, 0x007, 0x0C4, 0x4D7, 0x25E, 0x007, 
-	0x0C1, 0x4D5, 0x263, 0x007, 0x0BF, 0x4D2, 0x267, 0x008, 
-	0x0BC, 0x4D0, 0x26C, 0x008, 0x0BA, 0x4CD, 0x271, 0x008, 
-	0x0B7, 0x4CB, 0x276, 0x009, 0x0B4, 0x4C8, 0x27B, 0x009, 
-	0x0B2, 0x4C5, 0x280, 0x009, 0x0AF, 0x4C3, 0x284, 0x00A, 
-	0x0AD, 0x4C0, 0x289, 0x00A, 0x0AB, 0x4BD, 0x28E, 0x00A, 
-	0x0A8, 0x4BA, 0x293, 0x00B, 0x0A6, 0x4B7, 0x298, 0x00B, 
-	0x0A3, 0x4B5, 0x29D, 0x00B, 0x0A1, 0x4B2, 0x2A2, 0x00C, 
-	0x09F, 0x4AF, 0x2A6, 0x00C, 0x09C, 0x4AC, 0x2AB, 0x00D, 
-	0x09A, 0x4A9, 0x2B0, 0x00D, 0x098, 0x4A6, 0x2B5, 0x00E, 
-	0x096, 0x4A2, 0x2BA, 0x00E, 0x093, 0x49F, 0x2BF, 0x00F, 
-	0x091, 0x49C, 0x2C4, 0x00F, 0x08F, 0x499, 0x2C9, 0x00F, 
-	0x08D, 0x496, 0x2CE, 0x010, 0x08B, 0x492, 0x2D3, 0x010, 
-	0x089, 0x48F, 0x2D8, 0x011, 0x086, 0x48C, 0x2DC, 0x011, 
-	0x084, 0x488, 0x2E1, 0x012, 0x082, 0x485, 0x2E6, 0x013, 
-	0x080, 0x481, 0x2EB, 0x013, 0x07E, 0x47E, 0x2F0, 0x014, 
-	0x07C, 0x47A, 0x2F5, 0x014, 0x07A, 0x477, 0x2FA, 0x015, 
-	0x078, 0x473, 0x2FF, 0x015, 0x076, 0x470, 0x304, 0x016, 
-	0x075, 0x46C, 0x309, 0x017, 0x073, 0x468, 0x30E, 0x017, 
-	0x071, 0x465, 0x313, 0x018, 0x06F, 0x461, 0x318, 0x018, 
-	0x06D, 0x45D, 0x31D, 0x019, 0x06B, 0x459, 0x322, 0x01A, 
-	0x06A, 0x455, 0x326, 0x01B, 0x068, 0x452, 0x32B, 0x01B, 
-	0x066, 0x44E, 0x330, 0x01C, 0x064, 0x44A, 0x335, 0x01D, 
-	0x063, 0x446, 0x33A, 0x01D, 0x061, 0x442, 0x33F, 0x01E, 
-	0x05F, 0x43E, 0x344, 0x01F, 0x05E, 0x43A, 0x349, 0x020, 
-	0x05C, 0x436, 0x34E, 0x020, 0x05A, 0x432, 0x353, 0x021, 
-	0x059, 0x42E, 0x357, 0x022, 0x057, 0x42A, 0x35C, 0x023, 
-	0x056, 0x425, 0x361, 0x024, 0x054, 0x421, 0x366, 0x024, 
-	0x053, 0x41D, 0x36B, 0x025, 0x051, 0x419, 0x370, 0x026, 
-	0x050, 0x415, 0x374, 0x027, 0x04E, 0x410, 0x379, 0x028, 
-	0x04D, 0x40C, 0x37E, 0x029, 0x04C, 0x408, 0x383, 0x02A, 
-	0x04A, 0x403, 0x388, 0x02B, 0x049, 0x3FF, 0x38C, 0x02C, 
-	0x047, 0x3FB, 0x391, 0x02D, 0x046, 0x3F6, 0x396, 0x02E, 
-	0x045, 0x3F2, 0x39B, 0x02F, 0x043, 0x3ED, 0x39F, 0x030, 
-	0x042, 0x3E9, 0x3A4, 0x031, 0x041, 0x3E5, 0x3A9, 0x032, 
-	0x040, 0x3E0, 0x3AD, 0x033, 0x03E, 0x3DC, 0x3B2, 0x034, 
-	0x03D, 0x3D7, 0x3B7, 0x035, 0x03C, 0x3D2, 0x3BB, 0x036, 
-	0x03B, 0x3CE, 0x3C0, 0x037, 0x03A, 0x3C9, 0x3C5, 0x038, 
-	0x038, 0x3C5, 0x3C9, 0x03A, 0x037, 0x3C0, 0x3CE, 0x03B, 
-	0x036, 0x3BB, 0x3D2, 0x03C, 0x035, 0x3B7, 0x3D7, 0x03D, 
-	0x034, 0x3B2, 0x3DC, 0x03E, 0x033, 0x3AD, 0x3E0, 0x040, 
-	0x032, 0x3A9, 0x3E5, 0x041, 0x031, 0x3A4, 0x3E9, 0x042, 
-	0x030, 0x39F, 0x3ED, 0x043, 0x02F, 0x39B, 0x3F2, 0x045, 
-	0x02E, 0x396, 0x3F6, 0x046, 0x02D, 0x391, 0x3FB, 0x047, 
-	0x02C, 0x38C, 0x3FF, 0x049, 0x02B, 0x388, 0x403, 0x04A, 
-	0x02A, 0x383, 0x408, 0x04C, 0x029, 0x37E, 0x40C, 0x04D, 
-	0x028, 0x379, 0x410, 0x04E, 0x027, 0x374, 0x415, 0x050, 
-	0x026, 0x370, 0x419, 0x051, 0x025, 0x36B, 0x41D, 0x053, 
-	0x024, 0x366, 0x421, 0x054, 0x024, 0x361, 0x425, 0x056, 
-	0x023, 0x35C, 0x42A, 0x057, 0x022, 0x357, 0x42E, 0x059, 
-	0x021, 0x353, 0x432, 0x05A, 0x020, 0x34E, 0x436, 0x05C, 
-	0x020, 0x349, 0x43A, 0x05E, 0x01F, 0x344, 0x43E, 0x05F, 
-	0x01E, 0x33F, 0x442, 0x061, 0x01D, 0x33A, 0x446, 0x063, 
-	0x01D, 0x335, 0x44A, 0x064, 0x01C, 0x330, 0x44E, 0x066, 
-	0x01B, 0x32B, 0x452, 0x068, 0x01B, 0x326, 0x455, 0x06A, 
-	0x01A, 0x322, 0x459, 0x06B, 0x019, 0x31D, 0x45D, 0x06D, 
-	0x018, 0x318, 0x461, 0x06F, 0x018, 0x313, 0x465, 0x071, 
-	0x017, 0x30E, 0x468, 0x073, 0x017, 0x309, 0x46C, 0x075, 
-	0x016, 0x304, 0x470, 0x076, 0x015, 0x2FF, 0x473, 0x078, 
-	0x015, 0x2FA, 0x477, 0x07A, 0x014, 0x2F5, 0x47A, 0x07C, 
-	0x014, 0x2F0, 0x47E, 0x07E, 0x013, 0x2EB, 0x481, 0x080, 
-	0x013, 0x2E6, 0x485, 0x082, 0x012, 0x2E1, 0x488, 0x084, 
-	0x011, 0x2DC, 0x48C, 0x086, 0x011, 0x2D8, 0x48F, 0x089, 
-	0x010, 0x2D3, 0x492, 0x08B, 0x010, 0x2CE, 0x496, 0x08D, 
-	0x00F, 0x2C9, 0x499, 0x08F, 0x00F, 0x2C4, 0x49C, 0x091, 
-	0x00F, 0x2BF, 0x49F, 0x093, 0x00E, 0x2BA, 0x4A2, 0x096, 
-	0x00E, 0x2B5, 0x4A6, 0x098, 0x00D, 0x2B0, 0x4A9, 0x09A, 
-	0x00D, 0x2AB, 0x4AC, 0x09C, 0x00C, 0x2A6, 0x4AF, 0x09F, 
-	0x00C, 0x2A2, 0x4B2, 0x0A1, 0x00B, 0x29D, 0x4B5, 0x0A3, 
-	0x00B, 0x298, 0x4B7, 0x0A6, 0x00B, 0x293, 0x4BA, 0x0A8, 
-	0x00A, 0x28E, 0x4BD, 0x0AB, 0x00A, 0x289, 0x4C0, 0x0AD, 
-	0x00A, 0x284, 0x4C3, 0x0AF, 0x009, 0x280, 0x4C5, 0x0B2, 
-	0x009, 0x27B, 0x4C8, 0x0B4, 0x009, 0x276, 0x4CB, 0x0B7, 
-	0x008, 0x271, 0x4CD, 0x0BA, 0x008, 0x26C, 0x4D0, 0x0BC, 
-	0x008, 0x267, 0x4D2, 0x0BF, 0x007, 0x263, 0x4D5, 0x0C1, 
-	0x007, 0x25E, 0x4D7, 0x0C4, 0x007, 0x259, 0x4D9, 0x0C7, 
-	0x006, 0x254, 0x4DC, 0x0C9, 0x006, 0x250, 0x4DE, 0x0CC, 
-	0x006, 0x24B, 0x4E0, 0x0CF, 0x006, 0x246, 0x4E3, 0x0D2, 
-	0x005, 0x241, 0x4E5, 0x0D4, 0x005, 0x23D, 0x4E7, 0x0D7, 
-	0x005, 0x238, 0x4E9, 0x0DA, 0x005, 0x233, 0x4EB, 0x0DD, 
-	0x004, 0x22F, 0x4ED, 0x0E0, 0x004, 0x22A, 0x4EF, 0x0E3, 
-	0x004, 0x226, 0x4F1, 0x0E6, 0x004, 0x221, 0x4F3, 0x0E9, 
-	0x004, 0x21C, 0x4F5, 0x0EC, 0x003, 0x218, 0x4F6, 0x0EF, 
-	0x003, 0x213, 0x4F8, 0x0F2, 0x003, 0x20F, 0x4FA, 0x0F5, 
-	0x003, 0x20A, 0x4FB, 0x0F8, 0x003, 0x205, 0x4FD, 0x0FB, 
-	0x002, 0x201, 0x4FF, 0x0FE, 0x002, 0x1FC, 0x500, 0x101, 
-	0x002, 0x1F8, 0x502, 0x104, 0x002, 0x1F3, 0x503, 0x107, 
-	0x002, 0x1EF, 0x504, 0x10B, 0x002, 0x1EB, 0x506, 0x10E, 
-	0x002, 0x1E6, 0x507, 0x111, 0x001, 0x1E2, 0x508, 0x114, 
-	0x001, 0x1DD, 0x50A, 0x118, 0x001, 0x1D9, 0x50B, 0x11B, 
-	0x001, 0x1D5, 0x50C, 0x11E, 0x001, 0x1D0, 0x50D, 0x122, 
-	0x001, 0x1CC, 0x50E, 0x125, 0x001, 0x1C8, 0x50F, 0x129, 
-	0x001, 0x1C3, 0x510, 0x12C, 0x001, 0x1BF, 0x511, 0x130, 
-	0x001, 0x1BB, 0x511, 0x133, 0x001, 0x1B7, 0x512, 0x137, 
-	0x000, 0x1B2, 0x513, 0x13A, 0x000, 0x1AE, 0x514, 0x13E, 
-	0x000, 0x1AA, 0x514, 0x141, 0x000, 0x1A6, 0x515, 0x145, 
-	0x000, 0x1A2, 0x516, 0x148, 0x000, 0x19E, 0x516, 0x14C, 
-	0x000, 0x19A, 0x517, 0x150, 0x000, 0x195, 0x517, 0x153, 
-	0x000, 0x191, 0x517, 0x157, 0x000, 0x18D, 0x518, 0x15B, 
-	0x000, 0x189, 0x518, 0x15F, 0x000, 0x185, 0x518, 0x162, 
-	0x000, 0x181, 0x518, 0x166, 0x000, 0x17D, 0x518, 0x16A, 
-	0x000, 0x17A, 0x519, 0x16E, 0x000, 0x176, 0x519, 0x172};
-#endif
--- a/src/psf2/peops/registers.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,499 +0,0 @@
-/***************************************************************************
-                         registers.c  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-/* ChangeLog 
-
- February 8, 2004	-	xodnizel
- - Fixed setting of reverb volume.  Just typecast val("u16") to s16.
-   Also adjusted the normal channel volume to be one less than what it was before when the 
-   "phase invert" bit is set.  I'm assuming it's just in two's complement.
-
- 2003/02/09 - kode54
- - removed &0x3fff from reverb volume registers, fixes a few games,
-   hopefully won't be breaking anything
-
- 2003/01/19 - Pete
- - added Neill's reverb
-
- 2003/01/06 - Pete
- - added Neill's ADSR timings
-
- 2002/05/15 - Pete
- - generic cleanup for the Peops release
-
-*/
-
-#include "stdafx.h"
-
-#define _IN_REGISTERS
-
-#include "../peops/externals.h"
-#include "../peops/registers.h"
-#include "../peops/regs.h"
-
-static void SoundOn(int start,int end,u16 val);
-static void SoundOff(int start,int end,u16 val);
-static void FModOn(int start,int end,u16 val);
-static void NoiseOn(int start,int end,u16 val);
-static void SetVolumeLR(int right, u8 ch,s16 vol);
-static void SetPitch(int ch,u16 val);
-
-////////////////////////////////////////////////////////////////////////
-// WRITE REGISTERS: called by main emu
-////////////////////////////////////////////////////////////////////////
-
-void SPUwriteRegister(u32 reg, u16 val)
-{
- const u32 r=reg&0xfff;
- regArea[(r-0xc00)>>1] = val;
-
-// printf("SPUwrite: r %x val %x\n", r, val);
-
- if(r>=0x0c00 && r<0x0d80)                             // some channel info?
-  {
-   int ch=(r>>4)-0xc0;                                 // calc channel
-
-   //if(ch==20) printf("%08x: %04x\n",reg,val);
-
-   switch(r&0x0f)
-    {
-     //------------------------------------------------// r volume
-     case 0:                                           
-       SetVolumeLR(0,(u8)ch,val);
-       break;
-     //------------------------------------------------// l volume
-     case 2:                                           
-       SetVolumeLR(1,(u8)ch,val);
-       break;
-     //------------------------------------------------// pitch
-     case 4:                                           
-       SetPitch(ch,val);
-       break;
-     //------------------------------------------------// start
-     case 6:      
-       s_chan[ch].pStart=spuMemC+((u32) val<<3);
-       break;
-     //------------------------------------------------// level with pre-calcs
-     case 8:
-       {
-        const u32 lval=val; // DEBUG CHECK
-        //---------------------------------------------//
-        s_chan[ch].ADSRX.AttackModeExp=(lval&0x8000)?1:0; 
-        s_chan[ch].ADSRX.AttackRate=(lval>>8) & 0x007f;
-        s_chan[ch].ADSRX.DecayRate=(lval>>4) & 0x000f;
-        s_chan[ch].ADSRX.SustainLevel=lval & 0x000f;
-        //---------------------------------------------//
-      }
-      break;
-     //------------------------------------------------// adsr times with pre-calcs
-     case 10:
-      {
-       const u32 lval=val; // DEBUG CHECK
-
-       //----------------------------------------------//
-       s_chan[ch].ADSRX.SustainModeExp = (lval&0x8000)?1:0;
-       s_chan[ch].ADSRX.SustainIncrease= (lval&0x4000)?0:1;
-       s_chan[ch].ADSRX.SustainRate = (lval>>6) & 0x007f;
-       s_chan[ch].ADSRX.ReleaseModeExp = (lval&0x0020)?1:0;
-       s_chan[ch].ADSRX.ReleaseRate = lval & 0x001f;
-       //----------------------------------------------//
-      }
-     break;
-     //------------------------------------------------// adsr volume... mmm have to investigate this
-     //case 0xC:
-     //  break;
-     //------------------------------------------------//
-     case 0xE:                                          // loop?
-       s_chan[ch].pLoop=spuMemC+((u32) val<<3);
-       s_chan[ch].bIgnoreLoop=1;
-       break;
-     //------------------------------------------------//
-    }
-   return;
-  }
-
- switch(r)
-   {
-    //-------------------------------------------------//
-    case H_SPUaddr:
-      spuAddr = (u32) val<<3;
-      break;
-    //-------------------------------------------------//
-    case H_SPUdata:
-      spuMem[spuAddr>>1] = BFLIP16(val);
-      spuAddr+=2;
-      if(spuAddr>0x7ffff) spuAddr=0;
-      break;
-    //-------------------------------------------------//
-    case H_SPUctrl:
-      spuCtrl=val;
-      break;
-    //-------------------------------------------------//
-    case H_SPUstat:
-      spuStat=val & 0xf800;
-      break;
-    //-------------------------------------------------//
-    case H_SPUReverbAddr:
-      if(val==0xFFFF || val<=0x200)
-       {rvb.StartAddr=rvb.CurrAddr=0;}
-      else
-       {
-        const s32 iv=(u32)val<<2;
-        if(rvb.StartAddr!=iv)
-         {
-          rvb.StartAddr=(u32)val<<2;
-          rvb.CurrAddr=rvb.StartAddr;
-         }
-       }
-      break;
-    //-------------------------------------------------//
-    case H_SPUirqAddr:
-      spuIrq = val;
-      pSpuIrq=spuMemC+((u32) val<<3);
-      break;
-    //-------------------------------------------------//
-    /* Volume settings appear to be at least 15-bit unsigned in this case.  
-       Definitely NOT 15-bit signed.  Probably 16-bit signed, so s16 type cast.
-       Check out "Chrono Cross:  Shadow's End Forest"
-    */
-    case H_SPUrvolL:
-      rvb.VolLeft=(s16)val;
-      //printf("%d\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUrvolR:
-      rvb.VolRight=(s16)val;
-      //printf("%d\n",val);
-      break;
-    //-------------------------------------------------//
-
-/*
-    case H_ExtLeft:
-     //auxprintf("EL %d\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_ExtRight:
-     //auxprintf("ER %d\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUmvolL:
-     //auxprintf("ML %d\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUmvolR:
-     //auxprintf("MR %d\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUMute1:
-     //printf("M0 %04x\n",val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUMute2:
-    // printf("M1 %04x\n",val);
-      break;
-*/
-    //-------------------------------------------------//
-    case H_SPUon1:
-      SoundOn(0,16,val);
-      break;
-    //-------------------------------------------------//
-     case H_SPUon2:
-	// printf("Boop: %08x: %04x\n",reg,val);
-      SoundOn(16,24,val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUoff1:
-      SoundOff(0,16,val);
-      break;
-    //-------------------------------------------------//
-    case H_SPUoff2:
-      SoundOff(16,24,val);
-	// printf("Boop: %08x: %04x\n",reg,val);
-      break;
-    //-------------------------------------------------//
-    case H_FMod1:
-      FModOn(0,16,val);
-      break;
-    //-------------------------------------------------//
-    case H_FMod2:
-      FModOn(16,24,val);
-      break;
-    //-------------------------------------------------//
-    case H_Noise1:
-      NoiseOn(0,16,val);
-      break;
-    //-------------------------------------------------//
-    case H_Noise2:
-      NoiseOn(16,24,val);
-      break;
-    //-------------------------------------------------//
-    case H_RVBon1:
-      rvb.Enabled&=~0xFFFF;
-      rvb.Enabled|=val;
-      break;
-
-    //-------------------------------------------------//
-    case H_RVBon2:
-      rvb.Enabled&=0xFFFF;
-      rvb.Enabled|=val<<16;
-      break;
-
-    //-------------------------------------------------//
-    case H_Reverb+0:
-      rvb.FB_SRC_A=val;
-      break;
-
-    case H_Reverb+2   : rvb.FB_SRC_B=(s16)val;       break;
-    case H_Reverb+4   : rvb.IIR_ALPHA=(s16)val;      break;
-    case H_Reverb+6   : rvb.ACC_COEF_A=(s16)val;     break;
-    case H_Reverb+8   : rvb.ACC_COEF_B=(s16)val;     break;
-    case H_Reverb+10  : rvb.ACC_COEF_C=(s16)val;     break;
-    case H_Reverb+12  : rvb.ACC_COEF_D=(s16)val;     break;
-    case H_Reverb+14  : rvb.IIR_COEF=(s16)val;       break;
-    case H_Reverb+16  : rvb.FB_ALPHA=(s16)val;       break;
-    case H_Reverb+18  : rvb.FB_X=(s16)val;           break;
-    case H_Reverb+20  : rvb.IIR_DEST_A0=(s16)val;    break;
-    case H_Reverb+22  : rvb.IIR_DEST_A1=(s16)val;    break;
-    case H_Reverb+24  : rvb.ACC_SRC_A0=(s16)val;     break;
-    case H_Reverb+26  : rvb.ACC_SRC_A1=(s16)val;     break;
-    case H_Reverb+28  : rvb.ACC_SRC_B0=(s16)val;     break;
-    case H_Reverb+30  : rvb.ACC_SRC_B1=(s16)val;     break;
-    case H_Reverb+32  : rvb.IIR_SRC_A0=(s16)val;     break;
-    case H_Reverb+34  : rvb.IIR_SRC_A1=(s16)val;     break;
-    case H_Reverb+36  : rvb.IIR_DEST_B0=(s16)val;    break;
-    case H_Reverb+38  : rvb.IIR_DEST_B1=(s16)val;    break;
-    case H_Reverb+40  : rvb.ACC_SRC_C0=(s16)val;     break;
-    case H_Reverb+42  : rvb.ACC_SRC_C1=(s16)val;     break;
-    case H_Reverb+44  : rvb.ACC_SRC_D0=(s16)val;     break;
-    case H_Reverb+46  : rvb.ACC_SRC_D1=(s16)val;     break;
-    case H_Reverb+48  : rvb.IIR_SRC_B1=(s16)val;     break;
-    case H_Reverb+50  : rvb.IIR_SRC_B0=(s16)val;     break;
-    case H_Reverb+52  : rvb.MIX_DEST_A0=(s16)val;    break;
-    case H_Reverb+54  : rvb.MIX_DEST_A1=(s16)val;    break;
-    case H_Reverb+56  : rvb.MIX_DEST_B0=(s16)val;    break;
-    case H_Reverb+58  : rvb.MIX_DEST_B1=(s16)val;    break;
-    case H_Reverb+60  : rvb.IN_COEF_L=(s16)val;      break;
-    case H_Reverb+62  : rvb.IN_COEF_R=(s16)val;      break;
-   }
-
-}
-
-////////////////////////////////////////////////////////////////////////
-// READ REGISTER: called by main emu
-////////////////////////////////////////////////////////////////////////
-
-u16 SPUreadRegister(u32 reg)
-{
- const u32 r=reg&0xfff;
-
- if(r>=0x0c00 && r<0x0d80)
-  {
-   switch(r&0x0f)
-    {
-     case 0xC:                                          // get adsr vol
-      {
-       const int ch=(r>>4)-0xc0;
-       if(s_chan[ch].bNew) return 1;                   // we are started, but not processed? return 1
-       if(s_chan[ch].ADSRX.lVolume &&                  // same here... we haven't decoded one sample yet, so no envelope yet. return 1 as well
-          !s_chan[ch].ADSRX.EnvelopeVol)                   
-        return 1;
-       return (u16)(s_chan[ch].ADSRX.EnvelopeVol>>16);
-      }
-
-     case 0xE:                                          // get loop address
-      {
-       const int ch=(r>>4)-0xc0;
-       if(s_chan[ch].pLoop==NULL) return 0;
-       return (u16)((s_chan[ch].pLoop-spuMemC)>>3);
-      }
-    }
-  }
-
- switch(r)
-  {
-    case H_SPUctrl:
-     return spuCtrl;
-
-    case H_SPUstat:
-     return spuStat;
-        
-    case H_SPUaddr:
-     return (u16)(spuAddr>>3);
-
-    case H_SPUdata:
-     {
-      u16 s=BFLIP16(spuMem[spuAddr>>1]);
-      spuAddr+=2;
-      if(spuAddr>0x7ffff) spuAddr=0;
-      return s;
-     }
-
-    case H_SPUirqAddr:
-     return spuIrq;
-
-    //case H_SPUIsOn1:
-    // return IsSoundOn(0,16);
-
-    //case H_SPUIsOn2:
-    // return IsSoundOn(16,24);
- 
-  }
-
- return regArea[(r-0xc00)>>1];
-}
- 
-////////////////////////////////////////////////////////////////////////
-// SOUND ON register write
-////////////////////////////////////////////////////////////////////////
-
-static void SoundOn(int start,int end,u16 val)     // SOUND ON PSX COMAND
-{
- int ch;
-
- for(ch=start;ch<end;ch++,val>>=1)                     // loop channels
-  {
-   if((val&1) && s_chan[ch].pStart)                    // mmm... start has to be set before key on !?!
-    {
-     s_chan[ch].bIgnoreLoop=0;
-     s_chan[ch].bNew=1;
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// SOUND OFF register write
-////////////////////////////////////////////////////////////////////////
-
-static void SoundOff(int start,int end,u16 val)    // SOUND OFF PSX COMMAND
-{
- int ch;
- for(ch=start;ch<end;ch++,val>>=1)                     // loop channels
-  {
-   if(val&1)                                           // && s_chan[i].bOn)  mmm...
-    {
-     s_chan[ch].bStop=1;
-    }                                                  
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// FMOD register write
-////////////////////////////////////////////////////////////////////////
-
-static void FModOn(int start,int end,u16 val)      // FMOD ON PSX COMMAND
-{
- int ch;
-
- for(ch=start;ch<end;ch++,val>>=1)                     // loop channels
-  {
-   if(val&1)                                           // -> fmod on/off
-    {
-     if(ch>0) 
-      {
-       s_chan[ch].bFMod=1;                             // --> sound channel
-       s_chan[ch-1].bFMod=2;                           // --> freq channel
-      }
-    }
-   else
-    {
-     s_chan[ch].bFMod=0;                               // --> turn off fmod
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// NOISE register write
-////////////////////////////////////////////////////////////////////////
-
-static void NoiseOn(int start,int end,u16 val)     // NOISE ON PSX COMMAND
-{
- int ch;
-
- for(ch=start;ch<end;ch++,val>>=1)                     // loop channels
-  {
-   if(val&1)                                           // -> noise on/off
-    {
-     s_chan[ch].bNoise=1;
-    }
-   else 
-    {
-     s_chan[ch].bNoise=0;
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// LEFT VOLUME register write
-////////////////////////////////////////////////////////////////////////
-
-// please note: sweep is wrong.
-
-static void SetVolumeLR(int right, u8 ch,s16 vol)            // LEFT VOLUME
-{
- //if(vol&0xc000)
- //printf("%d %08x\n",right,vol);
- if(right)
-  s_chan[ch].iRightVolRaw=vol;
- else
-  s_chan[ch].iLeftVolRaw=vol;
-
- if(vol&0x8000)                                        // sweep?
-  {
-   s16 sInc=1;                                       // -> sweep up?
-   if(vol&0x2000) sInc=-1;                             // -> or down?
-   if(vol&0x1000) vol^=0xffff;                         // -> mmm... phase inverted? have to investigate this
-   vol=((vol&0x7f)+1)/2;                               // -> sweep: 0..127 -> 0..64
-   vol+=vol/(2*sInc);                                  // -> HACK: we don't sweep right now, so we just raise/lower the volume by the half!
-   vol*=128;
-   vol&=0x3fff;
-   //puts("Sweep");
-  }
- else                                                  // no sweep:
-  {
-   if(vol&0x4000)
-    vol=(vol&0x3FFF)-0x4000;
-   else
-    vol&=0x3FFF;
-
-   //if(vol&0x4000)                                      // -> mmm... phase inverted? have to investigate this
-   // vol=0-(0x3fff-(vol&0x3fff));
-   //else
-   // vol&=0x3fff;
-  }
- if(right)
-  s_chan[ch].iRightVolume=vol;
- else
-  s_chan[ch].iLeftVolume=vol;                           // store volume
-}
-
-////////////////////////////////////////////////////////////////////////
-// PITCH register write
-////////////////////////////////////////////////////////////////////////
-
-static void SetPitch(int ch,u16 val)               // SET PITCH
-{
- int NP;
- if(val>0x3fff) NP=0x3fff;                             // get pitch val
- else           NP=val;
-
- s_chan[ch].iRawPitch=NP;
-
- NP=(44100L*NP)/4096L;                                 // calc frequency
- if(NP<1) NP=1;                                        // some security
- s_chan[ch].iActFreq=NP;                               // store frequency
-}
--- a/src/psf2/peops/registers.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,153 +0,0 @@
-/***************************************************************************
-                         registers.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#define H_SPUReverbAddr  0x0da2
-#define H_SPUirqAddr     0x0da4
-#define H_SPUaddr        0x0da6
-#define H_SPUdata        0x0da8
-#define H_SPUctrl        0x0daa
-#define H_SPUstat        0x0dae
-#define H_SPUmvolL       0x0d80
-#define H_SPUmvolR       0x0d82
-#define H_SPUrvolL       0x0d84
-#define H_SPUrvolR       0x0d86
-#define H_SPUon1         0x0d88
-#define H_SPUon2         0x0d8a
-#define H_SPUoff1        0x0d8c
-#define H_SPUoff2        0x0d8e
-#define H_FMod1          0x0d90
-#define H_FMod2          0x0d92
-#define H_Noise1         0x0d94
-#define H_Noise2         0x0d96
-#define H_RVBon1         0x0d98
-#define H_RVBon2         0x0d9a
-#define H_SPUMute1       0x0d9c
-#define H_SPUMute2       0x0d9e
-#define H_CDLeft         0x0db0
-#define H_CDRight        0x0db2
-#define H_ExtLeft        0x0db4
-#define H_ExtRight       0x0db6
-#define H_Reverb         0x0dc0
-#define H_SPUPitch0      0x0c04
-#define H_SPUPitch1      0x0c14
-#define H_SPUPitch2      0x0c24
-#define H_SPUPitch3      0x0c34
-#define H_SPUPitch4      0x0c44
-#define H_SPUPitch5      0x0c54
-#define H_SPUPitch6      0x0c64
-#define H_SPUPitch7      0x0c74
-#define H_SPUPitch8      0x0c84
-#define H_SPUPitch9      0x0c94
-#define H_SPUPitch10     0x0ca4
-#define H_SPUPitch11     0x0cb4
-#define H_SPUPitch12     0x0cc4
-#define H_SPUPitch13     0x0cd4
-#define H_SPUPitch14     0x0ce4
-#define H_SPUPitch15     0x0cf4
-#define H_SPUPitch16     0x0d04
-#define H_SPUPitch17     0x0d14
-#define H_SPUPitch18     0x0d24
-#define H_SPUPitch19     0x0d34
-#define H_SPUPitch20     0x0d44
-#define H_SPUPitch21     0x0d54
-#define H_SPUPitch22     0x0d64
-#define H_SPUPitch23     0x0d74
-
-#define H_SPUStartAdr0   0x0c06
-#define H_SPUStartAdr1   0x0c16
-#define H_SPUStartAdr2   0x0c26
-#define H_SPUStartAdr3   0x0c36
-#define H_SPUStartAdr4   0x0c46
-#define H_SPUStartAdr5   0x0c56
-#define H_SPUStartAdr6   0x0c66
-#define H_SPUStartAdr7   0x0c76
-#define H_SPUStartAdr8   0x0c86
-#define H_SPUStartAdr9   0x0c96
-#define H_SPUStartAdr10  0x0ca6
-#define H_SPUStartAdr11  0x0cb6
-#define H_SPUStartAdr12  0x0cc6
-#define H_SPUStartAdr13  0x0cd6
-#define H_SPUStartAdr14  0x0ce6
-#define H_SPUStartAdr15  0x0cf6
-#define H_SPUStartAdr16  0x0d06
-#define H_SPUStartAdr17  0x0d16
-#define H_SPUStartAdr18  0x0d26
-#define H_SPUStartAdr19  0x0d36
-#define H_SPUStartAdr20  0x0d46
-#define H_SPUStartAdr21  0x0d56
-#define H_SPUStartAdr22  0x0d66
-#define H_SPUStartAdr23  0x0d76
-
-#define H_SPULoopAdr0   0x0c0e
-#define H_SPULoopAdr1   0x0c1e
-#define H_SPULoopAdr2   0x0c2e
-#define H_SPULoopAdr3   0x0c3e
-#define H_SPULoopAdr4   0x0c4e
-#define H_SPULoopAdr5   0x0c5e
-#define H_SPULoopAdr6   0x0c6e
-#define H_SPULoopAdr7   0x0c7e
-#define H_SPULoopAdr8   0x0c8e
-#define H_SPULoopAdr9   0x0c9e
-#define H_SPULoopAdr10  0x0cae
-#define H_SPULoopAdr11  0x0cbe
-#define H_SPULoopAdr12  0x0cce
-#define H_SPULoopAdr13  0x0cde
-#define H_SPULoopAdr14  0x0cee
-#define H_SPULoopAdr15  0x0cfe
-#define H_SPULoopAdr16  0x0d0e
-#define H_SPULoopAdr17  0x0d1e
-#define H_SPULoopAdr18  0x0d2e
-#define H_SPULoopAdr19  0x0d3e
-#define H_SPULoopAdr20  0x0d4e
-#define H_SPULoopAdr21  0x0d5e
-#define H_SPULoopAdr22  0x0d6e
-#define H_SPULoopAdr23  0x0d7e
-
-#define H_SPU_ADSRLevel0   0x0c08
-#define H_SPU_ADSRLevel1   0x0c18
-#define H_SPU_ADSRLevel2   0x0c28
-#define H_SPU_ADSRLevel3   0x0c38
-#define H_SPU_ADSRLevel4   0x0c48
-#define H_SPU_ADSRLevel5   0x0c58
-#define H_SPU_ADSRLevel6   0x0c68
-#define H_SPU_ADSRLevel7   0x0c78
-#define H_SPU_ADSRLevel8   0x0c88
-#define H_SPU_ADSRLevel9   0x0c98
-#define H_SPU_ADSRLevel10  0x0ca8
-#define H_SPU_ADSRLevel11  0x0cb8
-#define H_SPU_ADSRLevel12  0x0cc8
-#define H_SPU_ADSRLevel13  0x0cd8
-#define H_SPU_ADSRLevel14  0x0ce8
-#define H_SPU_ADSRLevel15  0x0cf8
-#define H_SPU_ADSRLevel16  0x0d08
-#define H_SPU_ADSRLevel17  0x0d18
-#define H_SPU_ADSRLevel18  0x0d28
-#define H_SPU_ADSRLevel19  0x0d38
-#define H_SPU_ADSRLevel20  0x0d48
-#define H_SPU_ADSRLevel21  0x0d58
-#define H_SPU_ADSRLevel22  0x0d68
-#define H_SPU_ADSRLevel23  0x0d78
-
--- a/src/psf2/peops/regs.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/***************************************************************************
-                           regs.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-void SPUwriteRegister(u32 reg, u16 val);
--- a/src/psf2/peops/reverb.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,383 +0,0 @@
-/***************************************************************************
-                          reverb.c  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2003/03/17 - xodnizel
-// - Implemented Neill's 44.1Khz-22050Hz downsampling data
-//   I also need to check if the ~4 sample delay doesn't screw any sounds
-//   up by making things too out of phase.  It could be fixed easily(elsewhere).
-//
-// 2003/01/19 - Pete
-// - added Neill's reverb (see at the end of file)
-//
-// 2002/12/26 - Pete
-// - adjusted reverb handling
-//
-// 2002/08/14 - Pete
-// - added extra reverb
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#define _IN_REVERB
-
-// will be included from spu.c
-#ifdef _IN_SPU
-
-////////////////////////////////////////////////////////////////////////
-// globals
-////////////////////////////////////////////////////////////////////////
-
-// REVERB info and timing vars...
-
-////////////////////////////////////////////////////////////////////////
-
-static INLINE s64 g_buffer(int iOff)                          // get_buffer content helper: takes care about wraps
-{
- s16 * p=(s16 *)spuMem;
- iOff=(iOff*4)+rvb.CurrAddr;
- while(iOff>0x3FFFF)       iOff=rvb.StartAddr+(iOff-0x40000);
- while(iOff<rvb.StartAddr) iOff=0x3ffff-(rvb.StartAddr-iOff);
- return (int)(s16)BFLIP16(*(p+iOff));
-}
-
-////////////////////////////////////////////////////////////////////////
-
-static INLINE void s_buffer(int iOff,int iVal)                // set_buffer content helper: takes care about wraps and clipping
-{
- s16 * p=(s16 *)spuMem;
- iOff=(iOff*4)+rvb.CurrAddr;
- while(iOff>0x3FFFF) iOff=rvb.StartAddr+(iOff-0x40000);
- while(iOff<rvb.StartAddr) iOff=0x3ffff-(rvb.StartAddr-iOff);
- if(iVal<-32768L) iVal=-32768L;
- if(iVal>32767L) iVal=32767L;
- *(p+iOff)=(s16)BFLIP16((s16)iVal);
-}
-
-////////////////////////////////////////////////////////////////////////
-
-static INLINE void s_buffer1(int iOff,int iVal)                // set_buffer (+1 sample) content helper: takes care about wraps and clipping
-{
- s16 * p=(s16 *)spuMem;
- iOff=(iOff*4)+rvb.CurrAddr+1;
- while(iOff>0x3FFFF) iOff=rvb.StartAddr+(iOff-0x40000);
- while(iOff<rvb.StartAddr) iOff=0x3ffff-(rvb.StartAddr-iOff);
- if(iVal<-32768L) iVal=-32768L;if(iVal>32767L) iVal=32767L;
- *(p+iOff)=(s16)BFLIP16((s16)iVal);
-}
-
-static INLINE void MixREVERBLeftRight(s32 *oleft, s32 *oright, s32 inleft, s32 inright)
-{
-   static s32 downbuf[2][8];
-   static s32 upbuf[2][8];
-   static int dbpos=0,ubpos=0;
-   static s32 downcoeffs[8]={ /* Symmetry is sexy. */
-				1283,5344,10895,15243,
-				15243,10895,5344,1283
-			       };
-   int x;
-
-   if(!rvb.StartAddr)                                  // reverb is off
-    {
-     rvb.iRVBLeft=rvb.iRVBRight=0;
-     return;
-    }
-
-   //if(inleft<-32767 || inleft>32767) printf("%d\n",inleft);
-   //if(inright<-32767 || inright>32767) printf("%d\n",inright);
-   downbuf[0][dbpos]=inleft;
-   downbuf[1][dbpos]=inright;
-   dbpos=(dbpos+1)&7;
-
-   if(dbpos&1)                                          // we work on every second left value: downsample to 22 khz
-    {
-     if(spuCtrl&0x80)                                  // -> reverb on? oki
-      {
-       int ACC0,ACC1,FB_A0,FB_A1,FB_B0,FB_B1;
-       s32 INPUT_SAMPLE_L=0;                         
-       s32 INPUT_SAMPLE_R=0;
-
-       for(x=0;x<8;x++)
-       {
-        INPUT_SAMPLE_L+=(downbuf[0][(dbpos+x)&7]*downcoeffs[x])>>8; /* Lose insignificant
-							    digits to prevent
-							    overflow(check this) */
-        INPUT_SAMPLE_R+=(downbuf[1][(dbpos+x)&7]*downcoeffs[x])>>8;
-       }
-
-       INPUT_SAMPLE_L>>=(16-8);
-       INPUT_SAMPLE_R>>=(16-8);
-       {
-        const s64 IIR_INPUT_A0 = ((g_buffer(rvb.IIR_SRC_A0) * rvb.IIR_COEF)>>15) + ((INPUT_SAMPLE_L * rvb.IN_COEF_L)>>15);
-        const s64 IIR_INPUT_A1 = ((g_buffer(rvb.IIR_SRC_A1) * rvb.IIR_COEF)>>15) + ((INPUT_SAMPLE_R * rvb.IN_COEF_R)>>15);
-        const s64 IIR_INPUT_B0 = ((g_buffer(rvb.IIR_SRC_B0) * rvb.IIR_COEF)>>15) + ((INPUT_SAMPLE_L * rvb.IN_COEF_L)>>15);
-        const s64 IIR_INPUT_B1 = ((g_buffer(rvb.IIR_SRC_B1) * rvb.IIR_COEF)>>15) + ((INPUT_SAMPLE_R * rvb.IN_COEF_R)>>15);
-        const s64 IIR_A0 = ((IIR_INPUT_A0 * rvb.IIR_ALPHA)>>15) + ((g_buffer(rvb.IIR_DEST_A0) * (32768L - rvb.IIR_ALPHA))>>15);
-        const s64 IIR_A1 = ((IIR_INPUT_A1 * rvb.IIR_ALPHA)>>15) + ((g_buffer(rvb.IIR_DEST_A1) * (32768L - rvb.IIR_ALPHA))>>15);
-        const s64 IIR_B0 = ((IIR_INPUT_B0 * rvb.IIR_ALPHA)>>15) + ((g_buffer(rvb.IIR_DEST_B0) * (32768L - rvb.IIR_ALPHA))>>15);
-        const s64 IIR_B1 = ((IIR_INPUT_B1 * rvb.IIR_ALPHA)>>15) + ((g_buffer(rvb.IIR_DEST_B1) * (32768L - rvb.IIR_ALPHA))>>15);
-
-       s_buffer1(rvb.IIR_DEST_A0, IIR_A0);
-       s_buffer1(rvb.IIR_DEST_A1, IIR_A1);
-       s_buffer1(rvb.IIR_DEST_B0, IIR_B0);
-       s_buffer1(rvb.IIR_DEST_B1, IIR_B1);
- 
-       ACC0 = ((g_buffer(rvb.ACC_SRC_A0) * rvb.ACC_COEF_A)>>15) +
-              ((g_buffer(rvb.ACC_SRC_B0) * rvb.ACC_COEF_B)>>15) +
-              ((g_buffer(rvb.ACC_SRC_C0) * rvb.ACC_COEF_C)>>15) +
-              ((g_buffer(rvb.ACC_SRC_D0) * rvb.ACC_COEF_D)>>15);
-       ACC1 = ((g_buffer(rvb.ACC_SRC_A1) * rvb.ACC_COEF_A)>>15) +
-              ((g_buffer(rvb.ACC_SRC_B1) * rvb.ACC_COEF_B)>>15) +
-              ((g_buffer(rvb.ACC_SRC_C1) * rvb.ACC_COEF_C)>>15) +
-              ((g_buffer(rvb.ACC_SRC_D1) * rvb.ACC_COEF_D)>>15);
-
-       FB_A0 = g_buffer(rvb.MIX_DEST_A0 - rvb.FB_SRC_A);
-       FB_A1 = g_buffer(rvb.MIX_DEST_A1 - rvb.FB_SRC_A);
-       FB_B0 = g_buffer(rvb.MIX_DEST_B0 - rvb.FB_SRC_B);
-       FB_B1 = g_buffer(rvb.MIX_DEST_B1 - rvb.FB_SRC_B);
-
-       s_buffer(rvb.MIX_DEST_A0, ACC0 - ((FB_A0 * rvb.FB_ALPHA)>>15));
-       s_buffer(rvb.MIX_DEST_A1, ACC1 - ((FB_A1 * rvb.FB_ALPHA)>>15));
-       
-       s_buffer(rvb.MIX_DEST_B0, ((rvb.FB_ALPHA * ACC0)>>15) - ((FB_A0 * (int)(rvb.FB_ALPHA^0xFFFF8000))>>15) - ((FB_B0 * rvb.FB_X)>>15));
-       s_buffer(rvb.MIX_DEST_B1, ((rvb.FB_ALPHA * ACC1)>>15) - ((FB_A1 * (int)(rvb.FB_ALPHA^0xFFFF8000))>>15) - ((FB_B1 * rvb.FB_X)>>15));
- 
-       rvb.iRVBLeft  = (g_buffer(rvb.MIX_DEST_A0)+g_buffer(rvb.MIX_DEST_B0))/3;
-       rvb.iRVBRight = (g_buffer(rvb.MIX_DEST_A1)+g_buffer(rvb.MIX_DEST_B1))/3;
-
-       rvb.iRVBLeft  = ((s64)rvb.iRVBLeft * rvb.VolLeft)  >> 14;
-       rvb.iRVBRight = ((s64)rvb.iRVBRight * rvb.VolRight) >> 14;
-
-       upbuf[0][ubpos]=rvb.iRVBLeft;
-       upbuf[1][ubpos]=rvb.iRVBRight;
-       ubpos=(ubpos+1)&7;
-       } // Bracket hack(et).
-      }
-     else                                              // -> reverb off
-      {
-       rvb.iRVBLeft=rvb.iRVBRight=0;
-       return;
-      }
-     rvb.CurrAddr++;
-     if(rvb.CurrAddr>0x3ffff) rvb.CurrAddr=rvb.StartAddr;
-    }
-    else
-    {
-     upbuf[0][ubpos]=0;
-     upbuf[1][ubpos]=0;
-     ubpos=(ubpos+1)&7;
-    }
-   {
-    s32 retl=0,retr=0;
-    for(x=0;x<8;x++)
-    {
-     retl+=(upbuf[0][(ubpos+x)&7]*downcoeffs[x])>>8;
-     retr+=(upbuf[1][(ubpos+x)&7]*downcoeffs[x])>>8;
-    }
-    retl>>=(16-8-1); /* -1 To adjust for the null padding. */
-    retr>>=(16-8-1);
-
-    *oleft+=retl;
-    *oright+=retr;
-   }
-}
-
-////////////////////////////////////////////////////////////////////////
-
-#endif
-
-/*
------------------------------------------------------------------------------
-PSX reverb hardware notes
-by Neill Corlett
------------------------------------------------------------------------------
-
-Yadda yadda disclaimer yadda probably not perfect yadda well it's okay anyway
-yadda yadda.
-
------------------------------------------------------------------------------
-
-Basics
-------
-
-- The reverb buffer is 22khz 16-bit mono PCM.
-- It starts at the reverb address given by 1DA2, extends to
-  the end of sound RAM, and wraps back to the 1DA2 address.
-
-Setting the address at 1DA2 resets the current reverb work address.
-
-This work address ALWAYS increments every 1/22050 sec., regardless of
-whether reverb is enabled (bit 7 of 1DAA set).
-
-And the contents of the reverb buffer ALWAYS play, scaled by the
-"reverberation depth left/right" volumes (1D84/1D86).
-(which, by the way, appear to be scaled so 3FFF=approx. 1.0, 4000=-1.0)
-
------------------------------------------------------------------------------
-
-Register names
---------------
-
-These are probably not their real names.
-These are probably not even correct names.
-We will use them anyway, because we can.
-
-1DC0: FB_SRC_A       (offset)
-1DC2: FB_SRC_B       (offset)
-1DC4: IIR_ALPHA      (coef.)
-1DC6: ACC_COEF_A     (coef.)
-1DC8: ACC_COEF_B     (coef.)
-1DCA: ACC_COEF_C     (coef.)
-1DCC: ACC_COEF_D     (coef.)
-1DCE: IIR_COEF       (coef.)
-1DD0: FB_ALPHA       (coef.)
-1DD2: FB_X           (coef.)
-1DD4: IIR_DEST_A0    (offset)
-1DD6: IIR_DEST_A1    (offset)
-1DD8: ACC_SRC_A0     (offset)
-1DDA: ACC_SRC_A1     (offset)
-1DDC: ACC_SRC_B0     (offset)
-1DDE: ACC_SRC_B1     (offset)
-1DE0: IIR_SRC_A0     (offset)
-1DE2: IIR_SRC_A1     (offset)
-1DE4: IIR_DEST_B0    (offset)
-1DE6: IIR_DEST_B1    (offset)
-1DE8: ACC_SRC_C0     (offset)
-1DEA: ACC_SRC_C1     (offset)
-1DEC: ACC_SRC_D0     (offset)
-1DEE: ACC_SRC_D1     (offset)
-1DF0: IIR_SRC_B1     (offset)
-1DF2: IIR_SRC_B0     (offset)
-1DF4: MIX_DEST_A0    (offset)
-1DF6: MIX_DEST_A1    (offset)
-1DF8: MIX_DEST_B0    (offset)
-1DFA: MIX_DEST_B1    (offset)
-1DFC: IN_COEF_L      (coef.)
-1DFE: IN_COEF_R      (coef.)
-
-The coefficients are signed fractional values.
--32768 would be -1.0
- 32768 would be  1.0 (if it were possible... the highest is of course 32767)
-
-The offsets are (byte/8) offsets into the reverb buffer.
-i.e. you multiply them by 8, you get byte offsets.
-You can also think of them as (samples/4) offsets.
-They appear to be signed.  They can be negative.
-None of the documented presets make them negative, though.
-
-Yes, 1DF0 and 1DF2 appear to be backwards.  Not a typo.
-
------------------------------------------------------------------------------
-
-What it does
-------------
-
-We take all reverb sources:
-- regular channels that have the reverb bit on
-- cd and external sources, if their reverb bits are on
-and mix them into one stereo 44100hz signal.
-
-Lowpass/downsample that to 22050hz.  The PSX uses a proper bandlimiting
-algorithm here, but I haven't figured out the hysterically exact specifics.
-I use an 8-tap filter with these coefficients, which are nice but probably
-not the real ones:
-
-0.037828187894
-0.157538631280
-0.321159685278
-0.449322115345
-0.449322115345
-0.321159685278
-0.157538631280
-0.037828187894
-
-So we have two input samples (INPUT_SAMPLE_L, INPUT_SAMPLE_R) every 22050hz.
-
-* IN MY EMULATION, I divide these by 2 to make it clip less.
-  (and of course the L/R output coefficients are adjusted to compensate)
-  The real thing appears to not do this.
-
-At every 22050hz tick:
-- If the reverb bit is enabled (bit 7 of 1DAA), execute the reverb
-  steady-state algorithm described below
-- AFTERWARDS, retrieve the "wet out" L and R samples from the reverb buffer
-  (This part may not be exactly right and I guessed at the coefs. TODO: check later.)
-  L is: 0.333 * (buffer[MIX_DEST_A0] + buffer[MIX_DEST_B0])
-  R is: 0.333 * (buffer[MIX_DEST_A1] + buffer[MIX_DEST_B1])
-- Advance the current buffer position by 1 sample
-
-The wet out L and R are then upsampled to 44100hz and played at the
-"reverberation depth left/right" (1D84/1D86) volume, independent of the main
-volume.
-
------------------------------------------------------------------------------
-
-Reverb steady-state
--------------------
-
-The reverb steady-state algorithm is fairly clever, and of course by
-"clever" I mean "batshit insane".
-
-buffer[x] is relative to the current buffer position, not the beginning of
-the buffer.  Note that all buffer offsets must wrap around so they're
-contained within the reverb work area.
-
-Clipping is performed at the end... maybe also sooner, but definitely at
-the end.
-
-IIR_INPUT_A0 = buffer[IIR_SRC_A0] * IIR_COEF + INPUT_SAMPLE_L * IN_COEF_L;
-IIR_INPUT_A1 = buffer[IIR_SRC_A1] * IIR_COEF + INPUT_SAMPLE_R * IN_COEF_R;
-IIR_INPUT_B0 = buffer[IIR_SRC_B0] * IIR_COEF + INPUT_SAMPLE_L * IN_COEF_L;
-IIR_INPUT_B1 = buffer[IIR_SRC_B1] * IIR_COEF + INPUT_SAMPLE_R * IN_COEF_R;
-
-IIR_A0 = IIR_INPUT_A0 * IIR_ALPHA + buffer[IIR_DEST_A0] * (1.0 - IIR_ALPHA);
-IIR_A1 = IIR_INPUT_A1 * IIR_ALPHA + buffer[IIR_DEST_A1] * (1.0 - IIR_ALPHA);
-IIR_B0 = IIR_INPUT_B0 * IIR_ALPHA + buffer[IIR_DEST_B0] * (1.0 - IIR_ALPHA);
-IIR_B1 = IIR_INPUT_B1 * IIR_ALPHA + buffer[IIR_DEST_B1] * (1.0 - IIR_ALPHA);
-
-buffer[IIR_DEST_A0 + 1sample] = IIR_A0;
-buffer[IIR_DEST_A1 + 1sample] = IIR_A1;
-buffer[IIR_DEST_B0 + 1sample] = IIR_B0;
-buffer[IIR_DEST_B1 + 1sample] = IIR_B1;
-
-ACC0 = buffer[ACC_SRC_A0] * ACC_COEF_A +
-       buffer[ACC_SRC_B0] * ACC_COEF_B +
-       buffer[ACC_SRC_C0] * ACC_COEF_C +
-       buffer[ACC_SRC_D0] * ACC_COEF_D;
-ACC1 = buffer[ACC_SRC_A1] * ACC_COEF_A +
-       buffer[ACC_SRC_B1] * ACC_COEF_B +
-       buffer[ACC_SRC_C1] * ACC_COEF_C +
-       buffer[ACC_SRC_D1] * ACC_COEF_D;
-
-FB_A0 = buffer[MIX_DEST_A0 - FB_SRC_A];
-FB_A1 = buffer[MIX_DEST_A1 - FB_SRC_A];
-FB_B0 = buffer[MIX_DEST_B0 - FB_SRC_B];
-FB_B1 = buffer[MIX_DEST_B1 - FB_SRC_B];
-
-buffer[MIX_DEST_A0] = ACC0 - FB_A0 * FB_ALPHA;
-buffer[MIX_DEST_A1] = ACC1 - FB_A1 * FB_ALPHA;
-buffer[MIX_DEST_B0] = (FB_ALPHA * ACC0) - FB_A0 * (FB_ALPHA^0x8000) - FB_B0 * FB_X;
-buffer[MIX_DEST_B1] = (FB_ALPHA * ACC1) - FB_A1 * (FB_ALPHA^0x8000) - FB_B1 * FB_X;
-
------------------------------------------------------------------------------
-*/
-
--- a/src/psf2/peops/spu.c	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,643 +0,0 @@
-/***************************************************************************
-                            spu.c  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-                       
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-                           
-//*************************************************************************//
-// History of changes:
-//
-// 2003/03/01 - linuzappz
-// - libraryName changes using ALSA
-//
-// 2003/02/28 - Pete
-// - added option for type of interpolation
-// - adjusted spu irqs again (Thousant Arms, Valkyrie Profile)
-// - added MONO support for MSWindows DirectSound
-//
-// 2003/02/20 - kode54
-// - amended interpolation code, goto GOON could skip initialization of gpos and cause segfault
-//
-// 2003/02/19 - kode54
-// - moved SPU IRQ handler and changed sample flag processing
-//
-// 2003/02/18 - kode54
-// - moved ADSR calculation outside of the sample decode loop, somehow I doubt that
-//   ADSR timing is relative to the frequency at which a sample is played... I guess
-//   this remains to be seen, and I don't know whether ADSR is applied to noise channels...
-//
-// 2003/02/09 - kode54
-// - one-shot samples now process the end block before stopping
-// - in light of removing fmod hack, now processing ADSR on frequency channel as well
-//
-// 2003/02/08 - kode54
-// - replaced easy interpolation with gaussian
-// - removed fmod averaging hack
-// - changed .sinc to be updated from .iRawPitch, no idea why it wasn't done this way already (<- Pete: because I sometimes fail to see the obvious, haharhar :)
-//
-// 2003/02/08 - linuzappz
-// - small bugfix for one usleep that was 1 instead of 1000
-// - added iDisStereo for no stereo (Linux)
-//
-// 2003/01/22 - Pete
-// - added easy interpolation & small noise adjustments
-//
-// 2003/01/19 - Pete
-// - added Neill's reverb
-//
-// 2003/01/12 - Pete
-// - added recording window handlers
-//
-// 2003/01/06 - Pete
-// - added Neill's ADSR timings
-//
-// 2002/12/28 - Pete
-// - adjusted spu irq handling, fmod handling and loop handling
-//
-// 2002/08/14 - Pete
-// - added extra reverb
-//
-// 2002/06/08 - linuzappz
-// - SPUupdate changed for SPUasync
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#define _IN_SPU
-
-#include "../peops/stdafx.h"
-#include "../peops/externals.h"
-#include "../peops/regs.h"
-#include "../peops/registers.h"
-#include "../peops/spu.h"
-
-void SPUirq(void) ;
-
-void spu_update(unsigned char* pSound,long lBytes);
-
-//#include "PsxMem.h"
-//#include "driver.h"
-
-////////////////////////////////////////////////////////////////////////
-// globals
-////////////////////////////////////////////////////////////////////////
-
-// psx buffer / addresses
-
-static u16  regArea[0x200];
-static u16  spuMem[256*1024];
-static u8 * spuMemC;
-static u8 * pSpuIrq=0;
-static u8 * pSpuBuffer;
-
-// user settings          
-static int             iVolume;
-                               
-// MAIN infos struct for each channel
-
-static SPUCHAN         s_chan[MAXCHAN+1];                     // channel + 1 infos (1 is security for fmod handling)
-static REVERBInfo      rvb;
-
-static u32   dwNoiseVal=1;                          // global noise generator
-
-static u16  spuCtrl=0;                             // some vars to store psx reg infos
-static u16  spuStat=0;
-static u16  spuIrq=0;             
-static u32  spuAddr=0xffffffff;                    // address into spu mem
-static int  bSPUIsOpen=0;
-
-static const int f[5][2] = {   
-			{    0,  0  },
-                        {   60,  0  },
-                        {  115, -52 },
-                        {   98, -55 },
-                        {  122, -60 } };
-s16 * pS;
-static s32 ttemp;
-
-////////////////////////////////////////////////////////////////////////
-// CODE AREA
-////////////////////////////////////////////////////////////////////////
-
-// dirty inline func includes
-
-#include "../peops/reverb.c"        
-#include "../peops/adsr.c"
-
-// Try this to increase speed.
-#include "../peops/registers.c"
-#include "../peops/dma.c"
-
-////////////////////////////////////////////////////////////////////////
-// helpers for so-called "gauss interpolation"
-
-#define gval0 (((int *)(&s_chan[ch].SB[29]))[gpos])
-#define gval(x) (((int *)(&s_chan[ch].SB[29]))[(gpos+x)&3])
-
-#include "gauss_i.h"
-
-////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////
-// START SOUND... called by main thread to setup a new sound on a channel
-////////////////////////////////////////////////////////////////////////
-
-static INLINE void StartSound(int ch)
-{
- StartADSR(ch);
-
- s_chan[ch].pCurr=s_chan[ch].pStart;                   // set sample start
-                         
- s_chan[ch].s_1=0;                                     // init mixing vars
- s_chan[ch].s_2=0;
- s_chan[ch].iSBPos=28;
-
- s_chan[ch].bNew=0;                                    // init channel flags
- s_chan[ch].bStop=0;                                   
- s_chan[ch].bOn=1;
-
- s_chan[ch].SB[29]=0;                                  // init our interpolation helpers
- s_chan[ch].SB[30]=0;
-
- s_chan[ch].spos=0x40000L;s_chan[ch].SB[28]=0;  // -> start with more decoding
-}
-
-////////////////////////////////////////////////////////////////////////
-// MAIN SPU FUNCTION
-// here is the main job handler... thread, timer or direct func call
-// basically the whole sound processing is done in this fat func!
-////////////////////////////////////////////////////////////////////////
-
-static u32 sampcount;
-static u32 decaybegin;
-static u32 decayend;
-
-// Counting to 65536 results in full volume offage.
-void setlength(s32 stop, s32 fade)
-{
- if(stop==~0)
- {
-  decaybegin=~0;
- }
- else
- {
-  stop=(stop*441)/10;
-  fade=(fade*441)/10;
-
-  decaybegin=stop;
-  decayend=stop+fade;
- }
-}
-
-#define CLIP(_x) {if(_x>32767) _x=32767; if(_x<-32767) _x=-32767;}
-int SPUasync(u32 cycles)
-{
- int volmul=iVolume;
- static s32 dosampies;
- s32 temp;
-
- ttemp+=cycles;
- dosampies=ttemp/384;
- if(!dosampies) return(1);
- ttemp-=dosampies*384;
- temp=dosampies;
-
- while(temp)
- {
-   s32 revLeft=0, revRight=0;
-   s32 sl=0, sr=0;
-   int ch,fa;
-
-   temp--;
-   //--------------------------------------------------//
-   //- main channel loop                              -// 
-   //--------------------------------------------------//
-    {
-     for(ch=0;ch<MAXCHAN;ch++)                         // loop em all.
-      {
-       if(s_chan[ch].bNew) StartSound(ch);             // start new sound
-       if(!s_chan[ch].bOn) continue;                   // channel not playing? next
-
-
-       if(s_chan[ch].iActFreq!=s_chan[ch].iUsedFreq)   // new psx frequency?
-        {
-         s_chan[ch].iUsedFreq=s_chan[ch].iActFreq;     // -> take it and calc steps
-         s_chan[ch].sinc=s_chan[ch].iRawPitch<<4;
-         if(!s_chan[ch].sinc) s_chan[ch].sinc=1;
-        }
-
-         while(s_chan[ch].spos>=0x10000L)
-          {
-           if(s_chan[ch].iSBPos==28)                   // 28 reached?
-            {
-	     int predict_nr,shift_factor,flags,d,s;
-	     u8* start;unsigned int nSample;
-	     int s_1,s_2;
-
-             start=s_chan[ch].pCurr;                   // set up the current pos
-
-             if (start == (u8*)-1)          // special "stop" sign
-              {
-               s_chan[ch].bOn=0;                       // -> turn everything off
-               s_chan[ch].ADSRX.lVolume=0;
-               s_chan[ch].ADSRX.EnvelopeVol=0;
-               goto ENDX;                              // -> and done for this channel
-              }
-
-             s_chan[ch].iSBPos=0;	// Reset buffer play index.
-
-             //////////////////////////////////////////// spu irq handler here? mmm... do it later
-
-             s_1=s_chan[ch].s_1;
-             s_2=s_chan[ch].s_2;
-
-             predict_nr=(int)*start;start++;           
-             shift_factor=predict_nr&0xf;
-             predict_nr >>= 4;
-             flags=(int)*start;start++;
-
-             // -------------------------------------- // 
-	     // Decode new samples into s_chan[ch].SB[0 through 27]
-             for (nSample=0;nSample<28;start++)      
-              {
-               d=(int)*start;
-               s=((d&0xf)<<12);
-               if(s&0x8000) s|=0xffff0000;
-
-               fa=(s >> shift_factor);
-               fa=fa + ((s_1 * f[predict_nr][0])>>6) + ((s_2 * f[predict_nr][1])>>6);
-               s_2=s_1;s_1=fa;
-               s=((d & 0xf0) << 8);
-
-               s_chan[ch].SB[nSample++]=fa;
-
-               if(s&0x8000) s|=0xffff0000;
-               fa=(s>>shift_factor);              
-               fa=fa + ((s_1 * f[predict_nr][0])>>6) + ((s_2 * f[predict_nr][1])>>6);
-               s_2=s_1;s_1=fa;
-
-               s_chan[ch].SB[nSample++]=fa;
-              }     
-
-             //////////////////////////////////////////// irq check
-
-             if(spuCtrl&0x40)         			// irq active?
-              {
-               if((pSpuIrq >  start-16 &&              // irq address reached?
-                   pSpuIrq <= start) ||
-                  ((flags&1) &&                        // special: irq on looping addr, when stop/loop flag is set 
-                   (pSpuIrq >  s_chan[ch].pLoop-16 && 
-                    pSpuIrq <= s_chan[ch].pLoop)))
-               {
-		 //extern s32 spuirqvoodoo;
-                 s_chan[ch].iIrqDone=1;                // -> debug flag
-		 SPUirq();
-		//puts("IRQ");
-		 //if(spuirqvoodoo!=-1)
-		 //{
-		 // spuirqvoodoo=temp*384;
-		 // temp=0;
-		 //}
-                }
-              }
-      
-             //////////////////////////////////////////// flag handler
-
-             if((flags&4) && (!s_chan[ch].bIgnoreLoop))
-              s_chan[ch].pLoop=start-16;               // loop adress
-
-             if(flags&1)                               // 1: stop/loop
-              {
-               // We play this block out first...
-               //if(!(flags&2))                          // 1+2: do loop... otherwise: stop
-               if(flags!=3 || s_chan[ch].pLoop==NULL)  // PETE: if we don't check exactly for 3, loop hang ups will happen (DQ4, for example)
-                {                                      // and checking if pLoop is set avoids crashes, yeah
-                 start = (u8*)-1;
-                }
-               else
-                {
-                 start = s_chan[ch].pLoop;
-                }
-              }
-
-             s_chan[ch].pCurr=start;                   // store values for next cycle
-             s_chan[ch].s_1=s_1;
-             s_chan[ch].s_2=s_2;      
-
-             ////////////////////////////////////////////
-            }
-
-           fa=s_chan[ch].SB[s_chan[ch].iSBPos++];      // get sample data
-
-           if((spuCtrl&0x4000)==0) fa=0;               // muted?
-	   else CLIP(fa);
-
-	    {
-	     int gpos;
-             gpos = s_chan[ch].SB[28];
-             gval0 = fa;
-             gpos = (gpos+1) & 3;
-             s_chan[ch].SB[28] = gpos;
-	    }
-           s_chan[ch].spos -= 0x10000L;
-          }
-
-         ////////////////////////////////////////////////
-         // noise handler... just produces some noise data
-         // surely wrong... and no noise frequency (spuCtrl&0x3f00) will be used...
-         // and sometimes the noise will be used as fmod modulation... pfff
-
-         if(s_chan[ch].bNoise)
-          {
-	   //puts("Noise");
-           if((dwNoiseVal<<=1)&0x80000000L)
-            {
-             dwNoiseVal^=0x0040001L;
-             fa=((dwNoiseVal>>2)&0x7fff);
-             fa=-fa;
-            }
-           else fa=(dwNoiseVal>>2)&0x7fff;
-
-           // mmm... depending on the noise freq we allow bigger/smaller changes to the previous val
-           fa=s_chan[ch].iOldNoise+((fa-s_chan[ch].iOldNoise)/((0x001f-((spuCtrl&0x3f00)>>9))+1));
-           if(fa>32767L)  fa=32767L;
-           if(fa<-32767L) fa=-32767L;              
-           s_chan[ch].iOldNoise=fa;
-
-          }                                            //----------------------------------------
-         else                                         // NO NOISE (NORMAL SAMPLE DATA) HERE 
-          {
-             int vl, vr, gpos;
-             vl = (s_chan[ch].spos >> 6) & ~3;
-             gpos = s_chan[ch].SB[28];
-             vr=(gauss[vl]*gval0)>>9;
-             vr+=(gauss[vl+1]*gval(1))>>9;
-             vr+=(gauss[vl+2]*gval(2))>>9;
-             vr+=(gauss[vl+3]*gval(3))>>9;
-             fa = vr>>2;
-          }
-
-         s_chan[ch].sval = (MixADSR(ch) * fa)>>10;     // / 1023;  // add adsr
-         if(s_chan[ch].bFMod==2)                       // fmod freq channel
-         {
-           int NP=s_chan[ch+1].iRawPitch;
-           NP=((32768L+s_chan[ch].sval)*NP)>>15; ///32768L;
-
-           if(NP>0x3fff) NP=0x3fff;
-           if(NP<0x1)    NP=0x1;
-                                                        
-	   // mmmm... if I do this, all is screwed              
-	  //           s_chan[ch+1].iRawPitch=NP;
-
-           NP=(44100L*NP)/(4096L);                     // calc frequency
-
-           s_chan[ch+1].iActFreq=NP;
-           s_chan[ch+1].iUsedFreq=NP;
-           s_chan[ch+1].sinc=(((NP/10)<<16)/4410);
-           if(!s_chan[ch+1].sinc) s_chan[ch+1].sinc=1;
-
-		// mmmm... set up freq decoding positions?
-		//           s_chan[ch+1].iSBPos=28;
-		//           s_chan[ch+1].spos=0x10000L;
-          }                    
-         else
-          {                                          
-           //////////////////////////////////////////////
-           // ok, left/right sound volume (psx volume goes from 0 ... 0x3fff)
-	   int tmpl,tmpr;
-
-		if (1) //ao_channel_enable[ch+PSF_1]) {
-		{
-			tmpl=(s_chan[ch].sval*s_chan[ch].iLeftVolume)>>14;
-			tmpr=(s_chan[ch].sval*s_chan[ch].iRightVolume)>>14;
-		} else {
-			tmpl = 0;
-			tmpr = 0;
-		}
-	   sl+=tmpl;
-	   sr+=tmpr;
-
-	   if(((rvb.Enabled>>ch)&1) && (spuCtrl&0x80))
-	   {
-	    revLeft+=tmpl;
-	    revRight+=tmpr;
-	   }
-          }
-
-         s_chan[ch].spos += s_chan[ch].sinc;             
- ENDX:   ;                                                      
-      }
-    }                                                         
-
-  ///////////////////////////////////////////////////////
-  // mix all channels (including reverb) into one buffer
-  MixREVERBLeftRight(&sl,&sr,revLeft,revRight);
-//  printf("sampcount %d decaybegin %d decayend %d\n", sampcount, decaybegin, decayend);
-  if(sampcount>=decaybegin)
-  {
-   s32 dmul;
-   if(decaybegin!=~0) // Is anyone REALLY going to be playing a song
-		      // for 13 hours?
-   {
-    if(sampcount>=decayend) 
-    {
-//       	    ao_song_done = 1;
-	    return(0);
-    }
-    dmul=256-(256*(sampcount-decaybegin)/(decayend-decaybegin));
-    sl=(sl*dmul)>>8;
-    sr=(sr*dmul)>>8;
-   }
-  }
-
-  sampcount++;
-  sl=(sl*volmul)>>8;
-  sr=(sr*volmul)>>8;
-
-  //{
-  // static double asl=0;
-  // static double asr=0;
-   
-  // asl+=(sl-asl)/5;
-  // asr+=(sl-asr)/5;
-
-   //sl-=asl;
-   //sr-=asr;
-
-  // if(sl>32767 || sl < -32767) printf("Left: %d, %f\n",sl,asl);
-  // if(sr>32767 || sr < -32767) printf("Right: %d, %f\n",sl,asl);
-  //}
-
-  if(sl>32767) sl=32767; if(sl<-32767) sl=-32767;
-  if(sr>32767) sr=32767; if(sr<-32767) sr=-32767;
-
-  *pS++=sl;
-  *pS++=sr;
- }
-
- return(1);
-}
-
-void SPU_flushboot(void)
-{
-   if((u8*)pS>((u8*)pSpuBuffer+1024))
-   {
-    spu_update((u8*)pSpuBuffer,(u8*)pS-(u8*)pSpuBuffer);
-    pS=(s16 *)pSpuBuffer;
-   }
-}   
-
-#ifdef TIMEO
-static u64 begintime;
-static u64 gettime64(void)
-{
- struct timeval tv;
- u64 ret;
-
- gettimeofday(&tv,0);
- ret=tv.tv_sec;
- ret*=1000000;
- ret+=tv.tv_usec;
- return(ret);
-}
-#endif
-////////////////////////////////////////////////////////////////////////
-// INIT/EXIT STUFF
-////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////
-// SPUINIT: this func will be called first by the main emu
-////////////////////////////////////////////////////////////////////////
-              
-int SPUinit(void)
-{
- spuMemC=(u8*)spuMem;                      // just small setup
- memset((void *)s_chan,0,MAXCHAN*sizeof(SPUCHAN));
- memset((void *)&rvb,0,sizeof(REVERBInfo));
- memset(regArea,0,sizeof(regArea));
- memset(spuMem,0,sizeof(spuMem));
- InitADSR();
- sampcount=ttemp=0;
- #ifdef TIMEO
- begintime=gettime64();
- #endif
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////
-// SETUPSTREAMS: init most of the spu buffers
-////////////////////////////////////////////////////////////////////////
-
-void SetupStreams(void)
-{ 
- int i;
-
- pSpuBuffer=(u8*)malloc(32768);            // alloc mixing buffer
- pS=(s16 *)pSpuBuffer;
-
- for(i=0;i<MAXCHAN;i++)                                // loop sound channels
-  {
-   s_chan[i].ADSRX.SustainLevel = 1024;                // -> init sustain
-   s_chan[i].iIrqDone=0;
-   s_chan[i].pLoop=spuMemC;
-   s_chan[i].pStart=spuMemC;
-   s_chan[i].pCurr=spuMemC;
-  }
-}
-
-////////////////////////////////////////////////////////////////////////
-// REMOVESTREAMS: free most buffer
-////////////////////////////////////////////////////////////////////////
-
-void RemoveStreams(void)
-{ 
- free(pSpuBuffer);                                     // free mixing buffer
- pSpuBuffer=NULL;
-
- #ifdef TIMEO
- {
-  u64 tmp;
-  tmp=gettime64();
-  tmp-=begintime;
-  if(tmp)
-   tmp=(u64)sampcount*1000000/tmp;
-  printf("%lld samples per second\n",tmp);
- }
- #endif
-}
-
-
-////////////////////////////////////////////////////////////////////////
-// SPUOPEN: called by main emu after init
-////////////////////////////////////////////////////////////////////////
-   
-int SPUopen(void)
-{
- if(bSPUIsOpen) return 0;                              // security for some stupid main emus
- spuIrq=0;                       
-
- spuStat=spuCtrl=0;
- spuAddr=0xffffffff;
- dwNoiseVal=1;
-
- spuMemC=(u8*)spuMem;      
- memset((void *)s_chan,0,(MAXCHAN+1)*sizeof(SPUCHAN));
- pSpuIrq=0;
-
- iVolume=255; //85;
- SetupStreams();                                       // prepare streaming
-
- bSPUIsOpen=1;
-
- return 1;
-}
-
-////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////
-// SPUCLOSE: called before shutdown
-////////////////////////////////////////////////////////////////////////
-
-int SPUclose(void)
-{
- if(!bSPUIsOpen) return 0;                             // some security
-
- bSPUIsOpen=0;                                         // no more open
-
- RemoveStreams();                                      // no more streaming
-
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////
-// SPUSHUTDOWN: called by main emu on final exit
-////////////////////////////////////////////////////////////////////////
-
-int SPUshutdown(void)
-{
- return 0;
-}
-
-void SPUinjectRAMImage(u16 *pIncoming)
-{
-	int i;
-
-	for (i = 0; i < (256*1024); i++)
-	{
-		spuMem[i] = pIncoming[i];
-	}
-}
--- a/src/psf2/peops/spu.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/***************************************************************************
-                            spu.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-void sexyd_update(unsigned char* pSound,long lBytes);
-
-int SPUasync(u32 cycles);
-void SPU_flushboot(void);
-int SPUinit(void);
-int SPUopen(void);
-int SPUclose(void);
-int SPUshutdown(void);
-void SPUinjectRAMImage(u16 *pIncoming);
-void SPUreadDMAMem(u32 usPSXMem,int iSize);
-void SPUwriteDMAMem(u32 usPSXMem,int iSize);
-u16 SPUreadRegister(u32 reg);
-
--- a/src/psf2/peops/stdafx.h	Wed Oct 15 14:31:23 2008 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/***************************************************************************
-                           StdAfx.h  -  description
-                             -------------------
-    begin                : Wed May 15 2002
-    copyright            : (C) 2002 by Pete Bernert
-    email                : BlackDove@addcom.de
- ***************************************************************************/
-
-/***************************************************************************
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version. See also the license.txt file for *
- *   additional informations.                                              *
- *                                                                         *
- ***************************************************************************/
-
-//*************************************************************************//
-// History of changes:
-//
-// 2002/05/15 - Pete
-// - generic cleanup for the Peops release
-//
-//*************************************************************************//
-
-#include <stdlib.h>
-#include <string.h> 
-#include <math.h>  
--- a/src/psf2/psx_hw.c	Wed Oct 15 14:31:23 2008 -0500
+++ b/src/psf2/psx_hw.c	Wed Oct 15 14:41:46 2008 -0500
@@ -59,10 +59,6 @@
 extern void mips_get_info(UINT32 state, union cpuinfo *info);
 extern void mips_set_info(UINT32 state, union cpuinfo *info);
 extern int psxcpu_verbose;
-extern uint16 SPUreadRegister(uint32 reg);
-extern void SPUwriteRegister(uint32 reg, uint16 val);
-extern void SPUwriteDMAMem(uint32 usPSXMem,int iSize);
-extern void SPUreadDMAMem(uint32 usPSXMem,int iSize);
 extern void mips_shorten_frame(void);
 extern int mips_execute( int cycles );
 extern uint32 psf2_load_file(char *file, uint8 *buf, uint32 buflen);
@@ -71,8 +67,6 @@
 int mips_get_icount(void);
 void mips_set_icount(int count);
 
-extern int psf_refresh;
-
 // SPU2
 extern void SPU2write(unsigned long reg, unsigned short val);
 extern unsigned short SPU2read(unsigned long reg);
@@ -506,19 +500,6 @@
 		return gpu_stat;
 	}
 
-	if (offset >= 0x1f801c00 && offset <= 0x1f801dff)
-	{
-		if ((mem_mask == 0xffff0000) || (mem_mask == 0xffffff00))
-		{
-			return SPUreadRegister(offset) & ~mem_mask;
-		}
-		else if (mem_mask == 0x0000ffff)
-		{
-			return SPUreadRegister(offset)<<16;
-		}
-		else printf("SPU: read unknown mask %08x\n", mem_mask);
-	}
-
 	if (offset >= 0xbf900000 && offset <= 0xbf9007ff)
 	{
 		if ((mem_mask == 0xffff0000) || (mem_mask == 0xffffff00))
@@ -594,22 +575,6 @@
 	return 0;
 }
 
-static void psx_dma4(uint32 madr, uint32 bcr, uint32 chcr)
-{
-	if (chcr == 0x01000201)	// cpu to SPU
-	{
-//		printf("DMA4: RAM %08x to SPU\n", madr);
-		bcr = (bcr>>16) * (bcr & 0xffff) * 2;
-		SPUwriteDMAMem(madr&0x1fffff, bcr);
-	}
-	else
-	{
-//		printf("DMA4: SPU to RAM %08x\n", madr);
-		bcr = (bcr>>16) * (bcr & 0xffff) * 2;
-		SPUreadDMAMem(madr&0x1fffff, bcr);
-	}
-}
-
 static void ps2_dma4(uint32 madr, uint32 bcr, uint32 chcr)
 {
 	if (chcr == 0x01000201)	// cpu to SPU2
@@ -687,6 +652,7 @@
 		return;
 	}
 
+#if 0
 	if (offset >= 0x1f801c00 && offset <= 0x1f801dff)
 	{
 	  //		printf("SPU2 wrote %x to SPU1 address %x!\n", data, offset);
@@ -702,6 +668,7 @@
 		}
 		else printf("SPU: write unknown mask %08x\n", mem_mask);
 	}
+#endif
 
 	if (offset >= 0xbf900000 && offset <= 0xbf9007ff)
 	{
@@ -747,56 +714,6 @@
 		return;
 	}
 
-	// DMA4
-	if (offset == 0x1f8010c0)
-	{
-		dma4_madr = data;
-		return;
-	}
-	else if (offset == 0x1f8010c4)
-	{
-		dma4_bcr = data;
-		return;
-	}
-	else if (offset == 0x1f8010c8)
-	{
-		dma4_chcr = data;
-		psx_dma4(dma4_madr, dma4_bcr, dma4_chcr);
-
-		if (dma_icr & (1 << (16+4)))
-		{
-			dma_timer = 3;
-		}
-		return;
-	}
-	else if (offset == 0x1f8010f4)
-	{
-		dma_icr = ( dma_icr & mem_mask ) |
-			  ( ~mem_mask & 0x80000000 & dma_icr) |
-			  ( ~data & ~mem_mask & 0x7f000000 & dma_icr) |
-			  ( data & ~mem_mask & 0x00ffffff);
-
-		if ((dma_icr & 0x7f000000) != 0)
-		{
-			dma_icr &= ~0x80000000;
-		}
-
-		return;
-	}
-	else if (offset == 0x1f801070)
-	{
-		irq_data = (irq_data & mem_mask) | (irq_data & irq_mask & data);
-		psx_irq_update();
-		return;
-	}
-	else if (offset == 0x1f801074)
-	{
-		irq_mask &= mem_mask;
-		irq_mask |= data;
-		psx_irq_update();
-		return;
-	}
-
 	// PS2 DMA4
 	if (offset == 0xbf8010c0)
 	{
@@ -897,29 +814,6 @@
 	}
 }
 
-static int fcnt = 0;
-
-void psx_hw_frame(void)
-{
-	if (psf_refresh == 50)
-	{
-		fcnt++;;
-
-		if (fcnt < 6)
-		{
-			psx_irq_set(1);
-		}
-		else
-		{
-			fcnt = 0;
-		}
-	}
-	else	// NTSC
-	{
-		psx_irq_set(1);
-	}
-}
-
 void ps2_hw_frame(void)
 {
 	ps2_reschedule();