initial import
[picodrive.git] / platform / linux / 940ctl_ym2612.c
CommitLineData
cc68a136 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
17static YM2612 ym2612;
18
19YM2612 *ym2612_940 = &ym2612;
20int mix_buffer_[44100/50*2]; /* this is where the YM2612 samples will be mixed to */
21int *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
36int 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
43UINT8 YM2612Read_940(void)
44{
45 return YM2612Read_();
46}
47
48
49int YM2612PicoTick_940(int n)
50{
51 YM2612PicoTick_(n);
52
53 return 0;
54}
55
56
57void 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
74void YM2612Init_940(int baseclock, int rate)
75{
76 YM2612Init_(baseclock, rate);
77}
78
79
80void YM2612ResetChip_940(void)
81{
82 YM2612ResetChip_();
83}
84
85
86void 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