1 //////////////////////////////////////////////////
2 //                                              //
3 // Emu64                                        //
4 // von Thorsten Kattanek                        //
5 //                                              //
6 // #file: mos6581_8085_class.h                  //
7 //                                              //
8 // Dieser Sourcecode ist Copyright geschützt!   //
9 // Geistiges Eigentum von Th.Kattanek           //
10 //                                              //
11 // Letzte Änderung am 21.08.2019                //
12 // www.emu64.de                                 //
13 //                                              //
14 //////////////////////////////////////////////////
15 
16 #ifndef MOS6581_8085_CLASS_H
17 #define MOS6581_8085_CLASS_H
18 
19 #include "siddump.h"
20 #include "mos6581_8085_voice.h"
21 
22 //// Sid Typen ////
23 #define MOS_6581 0
24 #define MOS_8580 1
25 
26 #define	ATTACK		0
27 #define	DECAY_SUSTAIN   1
28 #define RELEASE		2
29 
30 #define	PUFFER_TIME	1
31 
32 //// Zyklen die vergehen müssen bis der letzte geschriebene Wert auf Null gesetzt wird
33 //// Beim lesen eines NoneRead Registers wird immer der zuletzt in den SID geschriebene Wert gelesen.
34 //// Nach ReSID ca. 2000- 4000 Zyklen
35 #define LAST_WRITE_COUNTER_START 3000
36 
37 typedef int fc_point[2];
38 
39 class MOS6581_8085
40 {
41   public:
42     /* Variable */
43     short               *SoundBuffer;
44     short               *SoundBufferV0;
45     short               *SoundBufferV1;
46     short               *SoundBufferV2;
47     int                 SoundBufferPos;
48     int                 SoundBufferSize;
49     bool                CycleExact;
50     bool                FilterOn;
51     bool                SoundOutputEnable;
52     bool                *RESET;
53 
54     unsigned char	WriteReg;
55 
56     SIDDumpClass	*IoDump;
57 
58     /// Recording ///
59     bool            Recording;
60     int             RecSampleCounter;
61     short           RecSampleBuffer[19656];
62 
63     /* Funktionen */
64     MOS6581_8085(int nummer, int samplerate,int puffersize,int *error);
65     virtual ~MOS6581_8085(void);
66     void ChangeSampleRate(int samplerate,int puffersize);
67     void Reset(void);
68     void SetChipType(int type);
69     void SetC64Zyklen(float ZyklenSek);
70     void SetVoiceEnable(int nr, bool enable);
71     void SetPotXY(unsigned char pot_x, unsigned char pot_y);
72     void ZeroSoundBufferPos();
73     bool OneZyklus(void);
74 
75     bool SaveFreez(FILE* File);
76     bool LoadFreez(FILE *File,unsigned short Version);
77 
78     void WriteIO(unsigned short adresse,unsigned char wert);
79     unsigned char ReadIO(unsigned short adresse);
80     void SetIODelayEnable(bool enable);
81 
82   private:
83     /* Variable */
84     int                 Zyklencounter;
85     bool                ret;
86 
87     double              Samplerate;
88     VOICEClass          *Voice[3];
89     unsigned char       IO[32];
90 
91     unsigned char       LastWriteValue;
92     unsigned short      LastWriteCounter;
93 
94     bool                IODelayEnable;
95     unsigned char       IODelayPuffer[1048576][2];
96     int                 IODelayRPos;
97     int                 IODelayWPos;
98 
99     VOICEClass          *v;     // Für Temporären zugriff auf die Voices
100     VOICEClass          *vs;    // Für Temporären zugriff auf die Voices (Source Voice)
101     VOICEClass          *vd;    // Für Temporären zugriff auf die Voices (Destination Voice)
102 
103     int	SidNummer;
104     int SidModel;
105 
106     int                 C64ZyklenSek;
107     double              FreqConvCounter;	// interner Counter für Fast Fast Fast Resampling ;-)
108     double              FreqConvAddWert;
109 
110     unsigned char   PotX;
111     unsigned char   PotY;
112 
113     /// Zeiger auf Sonder Wellen (Mischformen) ///
114     unsigned int	*Wave0;
115     unsigned int	*Wave1;
116     unsigned int	*Wave2;
117     unsigned int	*Wave3;
118 
119     unsigned int	VoiceDC;
120     unsigned int	WaveZero;
121 
122     /// Filter Register ///
123     unsigned int	FilterKey;
124     unsigned int	FilterFrequenz;
125     unsigned int	FilterResonanz;
126     unsigned int	Voice3Off;
127     unsigned int	HpBpLp;
128     unsigned int	Volume;
129 
130     /// Filter interne Register
131     int                 MixerDC;
132     int                 Vhp;
133     int                 Vbp;
134     int                 Vlp;
135     int                 Vnf;
136     int                 w0,w0_ceil_1,w0_ceil_dt;
137     int                 _1024_div_Q;
138     int                 f0_6581[2048];
139     int                 f0_8580[2048];
140     int*		f0;
141     fc_point*           f0_points;
142     int			f0_count;
143 
144     /* Funktionen */
145     int VoiceOutput(int voice);
146     void OscZyklus(void);
147     void OscZyklus(int zyklen);
148     unsigned int OscOutput(int voice);
149     unsigned int WaveDreieck(VOICEClass *v,VOICEClass *vs);
150     unsigned int WaveSaegezahn(VOICEClass *v);
151     unsigned int WaveRechteck(VOICEClass *v);
152     unsigned int WaveRauschen(VOICEClass *v);
153     void OscReset(void);
154     void EnvZyklus(void);
155     void EnvZyklus(int zyklen);
156     void EnvReset(void);
157     unsigned int EnvOutput(int voice);
158     void FilterZyklus(int voice1,int voice2,int voice3,int ext_in);
159     void FilterZyklus(int zyklen,int voice1,int voice2,int voice3,int ext_in);
160     int FilterOutput(void);
161     void FilterReset(void);
162     void SetW0(void);
163     void SetQ(void);
164 };
165 #endif // MOS6581_8085CLASS_H
166