initial import
[picodrive.git] / platform / linux / 940ctl_ym2612.c
1 /* faked 940 code just uses local copy of ym2612 */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <unistd.h>
6 #include <sys/mman.h>
7 #include <sys/ioctl.h>
8 #include <fcntl.h>
9 #include <errno.h>
10
11 #include "../../Pico/sound/ym2612.h"
12 #include "../gp2x/gp2x.h"
13 #include "../gp2x/emu.h"
14 #include "../gp2x/menu.h"
15
16
17 static YM2612 ym2612;
18
19 YM2612 *ym2612_940 = &ym2612;
20 int  mix_buffer_[44100/50*2];   /* this is where the YM2612 samples will be mixed to */
21 int *mix_buffer = mix_buffer_;
22
23
24 /***********************************************************/
25
26 #define MAXOUT          (+32767)
27 #define MINOUT          (-32768)
28
29 /* limitter */
30 #define Limit(val, max,min) { \
31         if ( val > max )      val = max; \
32         else if ( val < min ) val = min; \
33 }
34
35
36 int YM2612Write_940(unsigned int a, unsigned int v)
37 {
38         YM2612Write_(a, v);
39
40         return 0; // cause the engine to do updates once per frame only
41 }
42
43 UINT8 YM2612Read_940(void)
44 {
45         return YM2612Read_();
46 }
47
48
49 int YM2612PicoTick_940(int n)
50 {
51         YM2612PicoTick_(n);
52
53         return 0;
54 }
55
56
57 void YM2612PicoStateLoad_940(void)
58 {
59         int i;
60
61         YM2612PicoStateLoad_();
62
63         for(i = 0; i < 0x100; i++) {
64                 YM2612Write_(0, i);
65                 YM2612Write_(1, ym2612.REGS[i]);
66         }
67         for(i = 0; i < 0x100; i++) {
68                 YM2612Write_(2, i);
69                 YM2612Write_(3, ym2612.REGS[i|0x100]);
70         }
71 }
72
73
74 void YM2612Init_940(int baseclock, int rate)
75 {
76         YM2612Init_(baseclock, rate);
77 }
78
79
80 void YM2612ResetChip_940(void)
81 {
82         YM2612ResetChip_();
83 }
84
85
86 void YM2612UpdateOne_940(short *buffer, int length, int stereo)
87 {
88         int i;
89
90         YM2612UpdateOne_(buffer, length, stereo);
91
92         /* mix data */
93         if (stereo) {
94                 int *mb = mix_buffer;
95                 for (i = length; i > 0; i--) {
96                         int l, r;
97                         l = r = *buffer;
98                         l += *mb++, r += *mb++;
99                         Limit( l, MAXOUT, MINOUT );
100                         Limit( r, MAXOUT, MINOUT );
101                         *buffer++ = l; *buffer++ = r;
102                 }
103         } else {
104                 for (i = 0; i < length; i++) {
105                         int l = mix_buffer[i];
106                         l += buffer[i];
107                         Limit( l, MAXOUT, MINOUT );
108                         buffer[i] = l;
109                 }
110         }
111 }
112