2 // MYFM.CPP - interface to YM2612Update
8 extern int sound_is_okay
;
10 // md.h also has include fm.h
12 // REMEMBER NOT TO USE ANY STATIC variables, because they
13 // will exist thoughout ALL megadrives!
15 int md::flush_fm_to_mame()
18 // If we reset mame's ym2612 code, we need to pass all the values
20 for (sid
=0;sid
<2;sid
++)
26 if (fm_reg
[sid
][r
]!=-1)
28 YM2612Write(0,sid
*2+0,r
); // select reg r
29 YM2612Write(0,sid
*2+1,fm_reg
[sid
][r
]); // Write data
38 int md::myfm_write(int a
,int v
,int md
)
41 int mame_can_have_it
=1;
49 if ((a
&1)==0) fm_sel
[sid
]=v
;
53 fm_reg
[sid
] [fm_sel
[sid
]&0xff] = v
;
55 if (fm_sel
[sid
]==0x2a) { dac_submit(v
); mame_can_have_it
=0; }
56 if (fm_sel
[sid
]==0x2b) { dac_enable(v
); mame_can_have_it
=0; }
58 if ((fm_sel
[sid
]&0xfc)==0x24) { mame_can_have_it
=0; }
60 if (fm_sel
[sid
]==0x27)
62 if (v
&0x10) fm_tover
[0]&=~1;
63 if (v
&0x20) fm_tover
[0]&=~2;
69 if (sound_is_okay
&& mame_can_have_it
)
75 int md::myfm_read(int a
)
81 if (sound_is_okay
) YM2612Read(0,a
&3);
86 int md::mysn_write(int d
)
88 if (sound_is_okay
) SN76496Write(0,d
);
92 // This called once per raster
93 int md::fm_timer_callback()
97 // Our raster lasts 63.61323 microseconds
98 for (i
=0;i
<4;i
++) ras_fm_ticker
[i
]+=64;
100 // if (sound_is_okay) ret=YM2612Read(0,a&3);
102 // period of timer a is
103 // 18 * (1024 - ((fm_reg[0][0x24]<<2)+(fm_reg[0][0x25])&3))) microsecs
105 amax
=18 * (1024 - ((fm_reg
[0][0x24]<<2)+(fm_reg
[0][0x25]&3)) );
106 bmax
=288*(256-fm_reg
[0][0x26]);
111 if (ras_fm_ticker
[0]>=amax
)
113 fm_tover
[0]|=1; ras_fm_ticker
[0]-=amax
;
116 if (ras_fm_ticker
[1]>=bmax
)
118 fm_tover
[0]|=2; ras_fm_ticker
[1]-=bmax
;