annotate Plugins/Input/console/Snes_Spc.h @ 145:8794a4781a15 trunk

[svn] looping stuff
author nenolod
date Thu, 10 Nov 2005 17:51:04 -0800
parents 252843aac42f
children 7c5e886205ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
1
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
2 // Super Nintendo (SNES) SPC-700 APU Emulator
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
3
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
4 // Game_Music_Emu 0.2.4. Copyright (C) 2004-2005 Shay Green. GNU LGPL license.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
5
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
6 #ifndef SNES_SPC_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7 #define SNES_SPC_H
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
8
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
9 #include "blargg_common.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 #include "Spc_Cpu.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 #include "Spc_Dsp.h"
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 class Snes_Spc {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 public:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 Snes_Spc();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 // Load copy of SPC data into emulator. Clear echo buffer if 'clear_echo' is true.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 enum { spc_file_size = 0x10180 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19 blargg_err_t load_spc( const void* spc, long spc_size, int clear_echo = 1 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21 // Load copy of state into emulator.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 typedef Spc_Cpu::registers_t registers_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 blargg_err_t load_state( const registers_t& cpu_state, const void* ram_64k,
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 const void* dsp_regs_128 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 // Clear echo buffer
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27 void clear_echo();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 // Mute voice n if bit n (1 << n) of mask is set
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 enum { voice_count = Spc_Dsp::voice_count };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 void mute_voices( int mask );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
32
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
33 // Generate 'count' samples and optionally write to 'buf'. Count must be even.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 // Sample output is 16-bit 32kHz, signed stereo pairs with the left channel first.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 typedef short sample_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36 blargg_err_t play( long count, sample_t* buf = NULL );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 // Skip forward by the specified number of samples (64000 samples = 1 second)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 blargg_err_t skip( long count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
40
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
41 // Set gain, where 1.0 is normal. When greater than 1.0, output is clamped the
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 // 16-bit sample range.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 void set_gain( double );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 // End of public interface
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47 private:
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 typedef BOOST::uint8_t uint8_t;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
49
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
50 // timers
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 struct Timer {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 spc_time_t next_tick;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 int period;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 int count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55 int shift;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 int counter;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 int enabled;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 void run_until_( spc_time_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 void run_until( spc_time_t time ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61 if ( time >= next_tick )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 run_until_( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
63 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
64 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 enum { timer_count = 3 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 Timer timer [timer_count];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68 // hardware
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 Spc_Cpu cpu;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 int extra_cycles;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 spc_time_t time() const;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 int read( spc_addr_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73 void write( spc_addr_t, int );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 friend class Spc_Cpu;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
75
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
76 // boot rom
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 enum { rom_size = 64 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 enum { rom_addr = 0xffc0 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 int rom_enabled;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80 uint8_t extra_ram [rom_size];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 static const uint8_t boot_rom [rom_size];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 void enable_rom( int );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
83
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
84 // dsp
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 sample_t* sample_buf;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 sample_t* buf_end; // to do: remove this once possible bug resolved
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 spc_time_t next_dsp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 Spc_Dsp dsp;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 int keys_pressed;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 int keys_released;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 sample_t skip_sentinel [1]; // special value for play() passed by skip()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 void run_dsp( spc_time_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 void run_dsp_( spc_time_t );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 bool echo_accessed;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 void check_for_echo_access( spc_addr_t addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 // 64KB RAM + padding filled with STOP instruction to catch PC overflow.
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98 enum { ram_size = 0x10000 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 uint8_t ram [ram_size + 0x100];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
100 };
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
101
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 inline void Snes_Spc::mute_voices( int mask ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 dsp.mute_voices( mask );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
104 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
105
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 inline void Snes_Spc::set_gain( double v ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 dsp.set_gain( v );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110 #endif
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111