annotate Plugins/Input/console/Gb_Apu.cpp @ 334:0daaddb10914 trunk

[svn] Implement GYM playback.
author chainsaw
date Sun, 25 Dec 2005 13:31:46 -0800
parents 252843aac42f
children 0b9507985f0d
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 // Gb_Snd_Emu 0.1.3. http://www.slack.net/~ant/libs/
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 #include "Gb_Apu.h"
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 #include <stdio.h>
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
7 #include <string.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 /* Copyright (C) 2003-2005 Shay Green. This module is free software; you
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
10 can redistribute it and/or modify it under the terms of the GNU Lesser
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
11 General Public License as published by the Free Software Foundation; either
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
12 version 2.1 of the License, or (at your option) any later version. This
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
13 module is distributed in the hope that it will be useful, but WITHOUT ANY
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
15 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
16 more details. You should have received a copy of the GNU Lesser General
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
17 Public License along with this module; if not, write to the Free Software
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
19
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
20 #include BLARGG_SOURCE_BEGIN
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
21
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
22 Gb_Apu::Gb_Apu()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
23 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
24 square1.synth = &square_synth;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
25 square2.synth = &square_synth;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
26 square1.has_sweep = true;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
27
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
28 oscs [0] = &square1;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
29 oscs [1] = &square2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
30 oscs [2] = &wave;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
31 oscs [3] = &noise;
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 volume( 1.0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
34 reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
35 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
36
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
37 Gb_Apu::~Gb_Apu()
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
38 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
39 }
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 void Gb_Apu::treble_eq( const blip_eq_t& eq )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
42 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
43 square_synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
44 wave.synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
45 noise.synth.treble_eq( eq );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
46 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
47
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
48 void Gb_Apu::volume( double vol )
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 vol *= 0.60 / osc_count;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
51 square_synth.volume( vol );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
52 wave.synth.volume( vol );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
53 noise.synth.volume( vol );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
54 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
55
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
56 void Gb_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
57 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
58 for ( int i = 0; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
59 osc_output( i, center, left, right );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
60 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
61
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
62 void Gb_Apu::reset()
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 next_frame_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
65 last_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
66 frame_count = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
67 stereo_found = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
68
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
69 square1.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
70 square2.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
71 wave.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
72 noise.reset();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
73
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
74 memset( regs, 0, sizeof regs );
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
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
77 void Gb_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
78 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
79 require( (unsigned) index < osc_count );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
80
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
81 Gb_Osc& osc = *oscs [index];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
82 if ( center && !left && !right )
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 // mono
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
85 left = center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
86 right = center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
87 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
88 else
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
89 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
90 // must be silenced or stereo
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
91 require( (!left && !right) || (left && right) );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
92 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
93 osc.outputs [1] = right;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
94 osc.outputs [2] = left;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
95 osc.outputs [3] = center;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
96 osc.output = osc.outputs [osc.output_select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
97 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
98
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
99 void Gb_Apu::run_until( gb_time_t end_time )
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 require( end_time >= last_time ); // end_time must not be before previous time
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
102 if ( end_time == last_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
103 return;
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 while ( true )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
106 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
107 gb_time_t time = next_frame_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
108 if ( time > end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
109 time = end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
110
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
111 // run oscillators
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
112 for ( int i = 0; i < osc_count; ++i ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
113 Gb_Osc& osc = *oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
114 if ( osc.output ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
115 if ( osc.output != osc.outputs [3] )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
116 stereo_found = true;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
117 osc.run( last_time, time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
118 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
119 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
120 last_time = time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
121
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
122 if ( time == end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
123 break;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
124
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
125 next_frame_time += 4194304 / 256; // 256 Hz
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
126
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
127 // 256 Hz actions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
128 square1.clock_length();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
129 square2.clock_length();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
130 wave.clock_length();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
131 noise.clock_length();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
132
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
133 frame_count = (frame_count + 1) & 3;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
134 if ( frame_count == 0 ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
135 // 64 Hz actions
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
136 square1.clock_envelope();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
137 square2.clock_envelope();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
138 noise.clock_envelope();
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
139 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
140
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
141 if ( frame_count & 1 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
142 square1.clock_sweep(); // 128 Hz action
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
143 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
144 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
145
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
146 bool Gb_Apu::end_frame( gb_time_t end_time )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
147 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
148 run_until( end_time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
149
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
150 next_frame_time -= end_time;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
151 assert( next_frame_time >= 0 );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
152 last_time = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
153
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
154 bool result = stereo_found;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
155 stereo_found = false;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
156 return result;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
157 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
158
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
159 void Gb_Apu::write_register( gb_time_t time, gb_addr_t addr, int data )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
160 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
161 // function now takes actual address, i.e. 0xFFXX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
162 require( start_addr <= addr && addr <= end_addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
163 require( (unsigned) data <= 0xff );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
164
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
165 int reg = addr - start_addr;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
166 if ( (unsigned) reg >= register_count )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
167 return;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
168
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
169 run_until( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
170
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
171 regs [reg] = data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
172
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
173 if ( addr < 0xff24 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
174 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
175 // oscillator
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
176 int index = reg / 5;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
177 oscs [index]->write_register( reg - index * 5, data );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
178 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
179 else if ( addr == 0xff25 || addr == 0xff26 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
180 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
181 int flags = (regs [0xff26 - start_addr] & 0x80) ? regs [0xff25 - start_addr] : 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
182
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
183 // left/right assignments
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
184 for ( int i = 0; i < osc_count; i++ )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
185 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
186 Gb_Osc& osc = *oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
187 int bits = flags >> i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
188 Blip_Buffer* old_output = osc.output;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
189 osc.output_select = ((bits >> 3) & 2) | (bits & 1);
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
190 osc.output = osc.outputs [osc.output_select];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
191 if ( osc.output != old_output && osc.last_amp ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
192 if ( old_output )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
193 square_synth.offset( time, -osc.last_amp, old_output );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
194 osc.last_amp = 0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
195 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
196 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
197 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
198 else if ( addr >= 0xff30 )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
199 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
200 // separate samples now (simplifies oscillator)
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
201 int index = (addr & 0x0f) * 2;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
202 wave.wave [index] = data >> 4;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
203 wave.wave [index + 1] = data & 0x0f;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
204 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
205 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
206
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
207 int Gb_Apu::read_register( gb_time_t time, gb_addr_t addr )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
208 {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
209 // function now takes actual address, i.e. 0xFFXX
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
210 require( start_addr <= addr && addr <= end_addr );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
211
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
212 run_until( time );
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
213
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
214 int data = regs [addr - start_addr];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
215
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
216 if ( addr == 0xff26 ) { // status
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
217 data &= 0xf0;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
218 for ( int i = 0; i < osc_count; i++ ) {
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
219 const Gb_Osc& osc = *oscs [i];
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
220 if ( osc.enabled && (osc.length || !osc.length_enabled) )
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
221 data |= 1 << i;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
222 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
223 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
224
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
225 return data;
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
226 }
252843aac42f [svn] Import the initial sources for console music support.
nenolod
parents:
diff changeset
227