ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/Frodo4/Src/SID.h
Revision: 1.2
Committed: 2003-07-01T17:51:17Z (20 years, 9 months ago) by cebix
Content type: text/plain
Branch: MAIN
Changes since 1.1: +1 -1 lines
Log Message:
updated copyright date

File Contents

# User Rev Content
1 cebix 1.1 /*
2     * SID.h - 6581 emulation
3     *
4 cebix 1.2 * Frodo (C) 1994-1997,2002-2003 Christian Bauer
5 cebix 1.1 *
6     * This program is free software; you can redistribute it and/or modify
7     * it under the terms of the GNU General Public License as published by
8     * the Free Software Foundation; either version 2 of the License, or
9     * (at your option) any later version.
10     *
11     * This program is distributed in the hope that it will be useful,
12     * but WITHOUT ANY WARRANTY; without even the implied warranty of
13     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     * GNU General Public License for more details.
15     *
16     * You should have received a copy of the GNU General Public License
17     * along with this program; if not, write to the Free Software
18     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19     */
20    
21     #ifndef _SID_H
22     #define _SID_H
23    
24     #include <stdlib.h>
25    
26    
27     // Define this if you want an emulation of an 8580
28     // (affects combined waveforms)
29     #undef EMUL_MOS8580
30    
31    
32     class Prefs;
33     class C64;
34     class SIDRenderer;
35     struct MOS6581State;
36    
37     // Class for administrative functions
38     class MOS6581 {
39     public:
40     MOS6581(C64 *c64);
41     ~MOS6581();
42    
43     void Reset(void);
44     uint8 ReadRegister(uint16 adr);
45     void WriteRegister(uint16 adr, uint8 byte);
46     void NewPrefs(Prefs *prefs);
47     void PauseSound(void);
48     void ResumeSound(void);
49     void GetState(MOS6581State *ss);
50     void SetState(MOS6581State *ss);
51     void EmulateLine(void);
52    
53     private:
54     void open_close_renderer(int old_type, int new_type);
55    
56     C64 *the_c64; // Pointer to C64 object
57     SIDRenderer *the_renderer; // Pointer to current renderer
58     uint8 regs[32]; // Copies of the 25 write-only SID registers
59     uint8 last_sid_byte; // Last value written to SID
60     };
61    
62    
63     // Renderers do the actual audio data processing
64     class SIDRenderer {
65     public:
66     virtual ~SIDRenderer() {}
67     virtual void Reset(void)=0;
68     virtual void EmulateLine(void)=0;
69     virtual void WriteRegister(uint16 adr, uint8 byte)=0;
70     virtual void NewPrefs(Prefs *prefs)=0;
71     virtual void Pause(void)=0;
72     virtual void Resume(void)=0;
73     };
74    
75    
76     // SID state
77     struct MOS6581State {
78     uint8 freq_lo_1;
79     uint8 freq_hi_1;
80     uint8 pw_lo_1;
81     uint8 pw_hi_1;
82     uint8 ctrl_1;
83     uint8 AD_1;
84     uint8 SR_1;
85    
86     uint8 freq_lo_2;
87     uint8 freq_hi_2;
88     uint8 pw_lo_2;
89     uint8 pw_hi_2;
90     uint8 ctrl_2;
91     uint8 AD_2;
92     uint8 SR_2;
93    
94     uint8 freq_lo_3;
95     uint8 freq_hi_3;
96     uint8 pw_lo_3;
97     uint8 pw_hi_3;
98     uint8 ctrl_3;
99     uint8 AD_3;
100     uint8 SR_3;
101    
102     uint8 fc_lo;
103     uint8 fc_hi;
104     uint8 res_filt;
105     uint8 mode_vol;
106    
107     uint8 pot_x;
108     uint8 pot_y;
109     uint8 osc_3;
110     uint8 env_3;
111     };
112    
113    
114     /*
115     * Fill buffer (for Unix sound routines), sample volume (for sampled voice)
116     */
117    
118     inline void MOS6581::EmulateLine(void)
119     {
120     if (the_renderer != NULL)
121     the_renderer->EmulateLine();
122     }
123    
124    
125     /*
126     * Read from register
127     */
128    
129     inline uint8 MOS6581::ReadRegister(uint16 adr)
130     {
131     // A/D converters
132     if (adr == 0x19 || adr == 0x1a) {
133     last_sid_byte = 0;
134     return 0xff;
135     }
136    
137     // Voice 3 oscillator/EG readout
138     if (adr == 0x1b || adr == 0x1c) {
139     last_sid_byte = 0;
140     return rand();
141     }
142    
143     // Write-only register: Return last value written to SID
144     return last_sid_byte;
145     }
146    
147    
148     /*
149     * Write to register
150     */
151    
152     inline void MOS6581::WriteRegister(uint16 adr, uint8 byte)
153     {
154     // Keep a local copy of the register values
155     last_sid_byte = regs[adr] = byte;
156    
157     if (the_renderer != NULL)
158     the_renderer->WriteRegister(adr, byte);
159     }
160    
161     #endif