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