OSDN Git Service

[GENERAL] Merge upstream 2018-02-27.
[csp-qt/common_source_project-fm7.git] / source / src / vm / upd7752.h
1 // [OUT]
2 //  E0H : transfer voice parameter
3 //  E1H : ?
4 //  E2H : set mode : 0 0 0 0 F S1 S0
5 //    F     : frame period      0: 10ms/frame
6 //                              1: 20ms/frame
7 //    S1,S0 : synthesis speed  00: NORMAL SPEED
8 //                             01: SLOW SPEED
9 //                             10: FAST SPEED
10 //                             11: prohibit
11
12 //  E3H : set command
13 //    internal voice : 0  0 P5 P4 P3 P2 P1 P0
14 //                                 P5-P0 : select voice kind(0-63)
15 //    stop           : 1  1  1  1  1  1  1  1
16 //    external voice : 1  1  1  1  1  1  1  0
17
18 // [IN]
19 //  E0H : status register : BSY REQ ~INT/EXT ERR 0 0 0 0
20 //    BSY      : synthesizing voice 1:busy 0:stop
21 //    REQ      : voice parameter 1:input request 0:prohibit
22 //    ~INT/EXT : message data 1:external 0:internal
23 //    ERR      : error flag
24 //  E1H : ?
25 //  E2H : written PortE2 ?
26 //  E3H : written PortE3 ?
27
28 /*
29         Skelton for retropc emulator
30
31         Author : Takeo.Namiki
32         Date   : 2013.12.08-
33
34         [ uPD7752 ]
35 */
36
37 #ifndef _UPD7752_H_
38 #define _UPD7752_H_
39
40 //#include "vm.h"
41 //#include "../emu.h"
42 #include "device.h"
43
44 typedef int     D7752_SAMPLE;
45 typedef int     D7752_FIXED;
46
47 #define D7752_ERR_SUCCESS               (0)
48 #define D7752_ERR_PARAM                 (-1)
49
50 #define D7752_ERR_DEVICE_MODE   (-2)
51 #define D7752_ERR_MEMORY                (-3)
52 #define D7752_ERR_BUFFER_FULL   (-4)
53 #define D7752_ERR_BUFFER_EMPTY  (-5)
54
55 #define D7752E_BSY      (0x80)  // b7 BSY -     1 when synthesising voice
56 #define D7752E_REQ      (0x40)  // b6 REQ -     1 when there is a space in the parameter buffer
57 #define D7752E_EXT      (0x20)  // b5 INT/EXT
58 #define D7752E_ERR      (0x10)  // b4 ERR -     1 when error
59 #define D7752E_IDL      (0x00)  // waiting
60
61 class VM;
62 class EMU;
63 class UPD7752 : public DEVICE
64 {
65 private:
66         bool mute;
67         int ThreadLoopStop;
68
69         // I/O ports
70         uint8_t io_E0H;
71         uint8_t io_E2H;
72         uint8_t io_E3H;
73
74         int VStat;                                      // status
75
76         // parameter buffer
77         uint8_t ParaBuf[7];                     // parameter buffer
78         uint8_t Pnum;                                   // parameter number
79         int Fnum;                                       // repeat frame number
80         int PReady;                                     // complete setting parameter
81
82         int FbufLength;
83         D7752_SAMPLE *Fbuf;                     // frame buffer pointer (10kHz 1frame)
84         unsigned char *voicebuf;
85         int fin;
86         int fout;
87
88         void UpConvert(void);
89         void AbortVoice(void);
90         void CancelVoice(void);
91         int VoiceOn(void);
92         void VSetMode(uint8_t mode);
93         void VSetCommand(uint8_t comm);
94         void VSetData(uint8_t data);
95         int VGetStatus(void);
96         
97         // filter coefficients
98         typedef struct {
99                 D7752_FIXED     f[5];
100                 D7752_FIXED     b[5];
101                 D7752_FIXED     amp;
102                 D7752_FIXED     pitch;
103         } D7752Coef;
104         
105         // voice
106         D7752Coef Coef;
107         int Y[5][2];
108         int PitchCount;
109         int FrameSize;
110         int SOUND_RATE;
111         
112         int UPD7752_Start(int mode);
113         int GetFrameSize(void);
114         int Synth(uint8_t *param, D7752_SAMPLE *frame);
115         
116         int volume_l, volume_r;
117         
118 public:
119         UPD7752(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
120         {
121                 volume_l = volume_r = 1024;
122                 set_device_name(_T("uPD7752 Voice Synthesizer"));
123         }
124         ~UPD7752() {}
125         
126         // common functions
127         void initialize();
128         void event_frame();
129         void release();
130         void reset();
131         void write_io8(uint32_t addr, uint32_t data);
132         uint32_t read_io8(uint32_t addr);
133         void mix(int32_t* buffer, int cnt);
134         void set_volume(int ch, int decibel_l, int decibel_r);
135         void save_state(FILEIO* state_fio);
136         bool load_state(FILEIO* state_fio);
137         
138         // unique function
139         void initialize_sound(int rate)
140         {
141                 SOUND_RATE = rate;
142         }
143 };
144
145 #endif