OSDN Git Service

[VM][General] Merge upstream 2016-02-13. Still don't implement OSD/Gui part of joysti...
[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 UPD7752 : public DEVICE
62 {
63 private:
64         bool mute;
65         int ThreadLoopStop;
66
67         // I/O ports
68         byte io_E0H;
69         byte io_E2H;
70         byte io_E3H;
71
72         int VStat;                                      // status
73
74         // parameter buffer
75         byte ParaBuf[7];                        // parameter buffer
76         byte Pnum;                                      // parameter number
77         int Fnum;                                       // repeat frame number
78         int PReady;                                     // complete setting parameter
79
80         int FbufLength;
81         D7752_SAMPLE *Fbuf;                     // frame buffer pointer (10kHz 1frame)
82         unsigned char *voicebuf;
83         int fin;
84         int fout;
85
86         void UpConvert(void);
87         void AbortVoice(void);
88         void CancelVoice(void);
89         int VoiceOn(void);
90         void VSetMode(byte mode);
91         void VSetCommand(byte comm);
92         void VSetData(byte data);
93         int VGetStatus(void);
94         
95         // filter coefficients
96         typedef struct {
97                 D7752_FIXED     f[5];
98                 D7752_FIXED     b[5];
99                 D7752_FIXED     amp;
100                 D7752_FIXED     pitch;
101         } D7752Coef;
102         
103         // voice
104         D7752Coef Coef;
105         int Y[5][2];
106         int PitchCount;
107         int FrameSize;
108         int SOUND_RATE;
109         
110         int UPD7752_Start(int mode);
111         int GetFrameSize(void);
112         int Synth(byte *param, D7752_SAMPLE *frame);
113         
114         int volume_l, volume_r;
115         
116 public:
117         UPD7752(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
118         {
119                 volume_l = volume_r = 1024;
120         }
121         ~UPD7752() {}
122         
123         // common functions
124         void initialize();
125         void event_frame();
126         void release();
127         void reset();
128         void write_io8(uint32 addr, uint32 data);
129         uint32 read_io8(uint32 addr);
130         void mix(int32* buffer, int cnt);
131         void set_volume(int ch, int decibel_l, int decibel_r);
132         void save_state(FILEIO* state_fio);
133         bool load_state(FILEIO* state_fio);
134         
135         // unique function
136         void init(int rate)
137         {
138                 SOUND_RATE = rate;
139         }
140 };
141
142 #endif