diff options
Diffstat (limited to 'src/libxineadec/nosefart/nes_apu.h')
-rw-r--r-- | src/libxineadec/nosefart/nes_apu.h | 335 |
1 files changed, 0 insertions, 335 deletions
diff --git a/src/libxineadec/nosefart/nes_apu.h b/src/libxineadec/nosefart/nes_apu.h deleted file mode 100644 index 9efbb560e..000000000 --- a/src/libxineadec/nosefart/nes_apu.h +++ /dev/null @@ -1,335 +0,0 @@ -/* -** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com) -** -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of version 2 of the GNU Library General -** Public License as published by the Free Software Foundation. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Library General Public License for more details. To obtain a -** copy of the GNU Library General Public License, write to the Free -** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -** -** Any permitted reproduction of these routines, in whole or in part, -** must bear this legend. -** -** -** nes_apu.h -** -** NES APU emulation header file -** $Id: nes_apu.h,v 1.2 2003/01/09 19:50:03 jkeil Exp $ -*/ - -#ifndef _NES_APU_H_ -#define _NES_APU_H_ - -#ifdef __GNUC__ -#define INLINE static inline -#elif defined(WIN32) -#define INLINE static __inline -#else -#define INLINE static -#endif - -/* define this for realtime generated noise */ -#define REALTIME_NOISE - -#define APU_WRA0 0x4000 -#define APU_WRA1 0x4001 -#define APU_WRA2 0x4002 -#define APU_WRA3 0x4003 -#define APU_WRB0 0x4004 -#define APU_WRB1 0x4005 -#define APU_WRB2 0x4006 -#define APU_WRB3 0x4007 -#define APU_WRC0 0x4008 -#define APU_WRC2 0x400A -#define APU_WRC3 0x400B -#define APU_WRD0 0x400C -#define APU_WRD2 0x400E -#define APU_WRD3 0x400F -#define APU_WRE0 0x4010 -#define APU_WRE1 0x4011 -#define APU_WRE2 0x4012 -#define APU_WRE3 0x4013 - -#define APU_OAMDMA 0x4014 -#define APU_SMASK 0x4015 -#define APU_JOY0 0x4016 -#define APU_JOY1 0x4017 - -/* length of generated noise */ -#define APU_NOISE_32K 0x7FFF -#define APU_NOISE_93 93 - -#define APU_BASEFREQ (NES_MASTER_CLOCK / 12) - -/* to/from 16.16 fixed point */ -#define APU_TO_FIXED(x) ((x) << 16) -#define APU_FROM_FIXED(x) ((x) >> 16) - - -/* channel structures */ -/* As much data as possible is precalculated, -** to keep the sample processing as lean as possible -*/ - -typedef struct rectangle_s -{ - uint8 regs[4]; - - boolean enabled; - - int32 phaseacc; - int32 freq; - int32 output_vol; - boolean fixed_envelope; - boolean holdnote; - uint8 volume; - - int32 sweep_phase; - int32 sweep_delay; - boolean sweep_on; - uint8 sweep_shifts; - uint8 sweep_length; - boolean sweep_inc; - int32 freq_limit; - - int32 env_phase; - int32 env_delay; - uint8 env_vol; - - int vbl_length; - uint8 adder; - int duty_flip; -} rectangle_t; - -/* -enum -{ - COUNTMODE_LOAD, - COUNTMODE_COUNT -}; -*/ - -typedef struct triangle_s -{ - uint8 regs[3]; - - boolean enabled; - - int32 freq; - int32 phaseacc; - int32 output_vol; - - uint8 adder; - - boolean holdnote; - boolean counter_started; - /* quasi-hack */ - int write_latency; - -// boolean countmode; - - int vbl_length; - int linear_length; - -} triangle_t; - - -typedef struct noise_s -{ - uint8 regs[3]; - - boolean enabled; - - int32 freq; - int32 phaseacc; - int32 output_vol; - - int32 env_phase; - int32 env_delay; - uint8 env_vol; - boolean fixed_envelope; - boolean holdnote; - - uint8 volume; - - int vbl_length; - -#ifdef REALTIME_NOISE - uint8 xor_tap; -#else - boolean short_sample; - int cur_pos; -#endif /* REALTIME_NOISE */ -} noise_t; - -typedef struct dmc_s -{ - uint8 regs[4]; - - /* bodge for timestamp queue */ - boolean enabled; - - int32 freq; - int32 phaseacc; - int32 output_vol; - - uint32 address; - uint32 cached_addr; - int dma_length; - int cached_dmalength; - uint8 cur_byte; - - boolean looping; - boolean irq_gen; - boolean irq_occurred; - -} dmc_t; - -enum -{ - APU_FILTER_NONE, - APU_FILTER_LOWPASS, - APU_FILTER_WEIGHTED -}; - -typedef struct -{ - uint32 min_range, max_range; - uint8 (*read_func)(uint32 address); -} apu_memread; - -typedef struct -{ - uint32 min_range, max_range; - void (*write_func)(uint32 address, uint8 value); -} apu_memwrite; - -/* external sound chip stuff */ -typedef struct apuext_s -{ - void (*init)(void); - void (*shutdown)(void); - void (*reset)(void); - int32 (*process)(void); - apu_memread *mem_read; - apu_memwrite *mem_write; -} apuext_t; - - -/* APU queue structure */ -#define APUQUEUE_SIZE 4096 -#define APUQUEUE_MASK (APUQUEUE_SIZE - 1) - -/* apu ring buffer member */ -typedef struct apudata_s -{ - uint32 timestamp, address; - uint8 value; -} apudata_t; - - -typedef struct apu_s -{ - rectangle_t rectangle[2]; - triangle_t triangle; - noise_t noise; - dmc_t dmc; - uint8 enable_reg; - - apudata_t queue[APUQUEUE_SIZE]; - int q_head, q_tail; - uint32 elapsed_cycles; - - void *buffer; /* pointer to output buffer */ - int num_samples; - - int mix_enable; /* $$$ben : should improve emulation */ - int filter_type; - - int32 cycle_rate; - - int sample_rate; - int sample_bits; - int refresh_rate; - - void (*process)(void *buffer, int num_samples); - - /* $$$ ben : last error string */ - const char * errstr; - - /* external sound chip */ - apuext_t *ext; -} apu_t; - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Function prototypes */ -extern apu_t *apu_create(int sample_rate, int refresh_rate, int sample_bits, boolean stereo); -extern void apu_destroy(apu_t *apu); -extern int apu_setext(apu_t *apu, apuext_t *ext); -extern int apu_setfilter(int filter_type); -extern void apu_process(void *buffer, int num_samples); -extern void apu_reset(void); -extern int apu_setchan(int chan, boolean enabled); -extern int32 apu_getcyclerate(void); -extern apu_t *apu_getcontext(void); - -extern uint8 apu_read(uint32 address); -extern void apu_write(uint32 address, uint8 value); - -/* for visualization */ -extern void apu_getpcmdata(void **data, int *num_samples, int *sample_bits); - -extern void apu_setcontext(apu_t *src_apu); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _NES_APU_H_ */ - -/* -** $Log: nes_apu.h,v $ -** Revision 1.2 2003/01/09 19:50:03 jkeil -** NSF audio files were crashing on SPARC. -** -** - Define the correct HOST_ENDIAN for SPARC -** - remove unaligned memory accesses -** -** Revision 1.1 2003/01/08 07:04:35 tmmm -** initial import of Nosefart sources -** -** Revision 1.12 2000/07/04 04:54:48 matt -** minor changes that helped with MAME -** -** Revision 1.11 2000/07/03 02:18:53 matt -** much better external module exporting -** -** Revision 1.10 2000/06/26 05:00:37 matt -** cleanups -** -** Revision 1.9 2000/06/23 03:29:28 matt -** cleaned up external sound inteface -** -** Revision 1.8 2000/06/20 04:06:16 matt -** migrated external sound definition to apu module -** -** Revision 1.7 2000/06/20 00:07:35 matt -** added convenience members to apu_t struct -** -** Revision 1.6 2000/06/09 16:49:02 matt -** removed all floating point from sound generation -** -** Revision 1.5 2000/06/09 15:12:28 matt -** initial revision -** -*/ |