31 const std::string& name);
42 const std::string& name);
44 virtual void write(
unsigned address,
byte value);
61 template<
typename Archive>
62 void serialize(Archive& ar,
unsigned version);
107 Impl(
YMF278&
self,
const std::string& name,
int ramSize,
118 template<
typename Archive>
119 void serialize(Archive& ar,
unsigned version);
123 virtual void generateChannels(
int** bufs,
unsigned num);
126 unsigned getRamAddress(
unsigned addr)
const;
133 const std::unique_ptr<DebugRegisters> debugRegisters;
134 const std::unique_ptr<DebugMemory> debugMemory;
146 const std::unique_ptr<Rom> rom;
159 static const int EG_SH = 16;
160 static const unsigned EG_TIMER_OVERFLOW = 1 << EG_SH;
163 static const int ENV_BITS = 10;
164 static const int ENV_LEN = 1 << ENV_BITS;
165 static const double ENV_STEP = 128.0 / ENV_LEN;
166 static const int MAX_ATT_INDEX = (1 << (ENV_BITS - 1)) - 1;
167 static const int MIN_ATT_INDEX = 0;
170 static const int EG_ATT = 4;
171 static const int EG_DEC = 3;
172 static const int EG_SUS = 2;
173 static const int EG_REL = 1;
174 static const int EG_OFF = 0;
176 static const int EG_REV = 5;
177 static const int EG_DMP = 6;
180 static const int pan_left[16] = {
181 0, 8, 16, 24, 32, 40, 48, 256, 256, 0, 0, 0, 0, 0, 0, 0
183 static const int pan_right[16] = {
184 0, 0, 0, 0, 0, 0, 0, 0, 256, 256, 48, 40, 32, 24, 16, 8
188 static const int mix_level[8] = {
189 8, 16, 24, 32, 40, 48, 56, 256
194 #define SC(db) unsigned(db * (2.0 / ENV_STEP))
195 static const unsigned dl_tab[16] = {
201 static const byte RATE_STEPS = 8;
202 static const byte eg_inc[15 * RATE_STEPS] = {
204 0, 1, 0, 1, 0, 1, 0, 1,
205 0, 1, 0, 1, 1, 1, 0, 1,
206 0, 1, 1, 1, 0, 1, 1, 1,
207 0, 1, 1, 1, 1, 1, 1, 1,
209 1, 1, 1, 1, 1, 1, 1, 1,
210 1, 1, 1, 2, 1, 1, 1, 2,
211 1, 2, 1, 2, 1, 2, 1, 2,
212 1, 2, 2, 2, 1, 2, 2, 2,
214 2, 2, 2, 2, 2, 2, 2, 2,
215 2, 2, 2, 4, 2, 2, 2, 4,
216 2, 4, 2, 4, 2, 4, 2, 4,
217 2, 4, 4, 4, 2, 4, 4, 4,
219 4, 4, 4, 4, 4, 4, 4, 4,
220 8, 8, 8, 8, 8, 8, 8, 8,
221 0, 0, 0, 0, 0, 0, 0, 0,
224 #define O(a) (a * RATE_STEPS)
225 static const byte eg_rate_select[64] = {
226 O( 0),
O( 1),
O( 2),
O( 3),
227 O( 0),
O( 1),
O( 2),
O( 3),
228 O( 0),
O( 1),
O( 2),
O( 3),
229 O( 0),
O( 1),
O( 2),
O( 3),
230 O( 0),
O( 1),
O( 2),
O( 3),
231 O( 0),
O( 1),
O( 2),
O( 3),
232 O( 0),
O( 1),
O( 2),
O( 3),
233 O( 0),
O( 1),
O( 2),
O( 3),
234 O( 0),
O( 1),
O( 2),
O( 3),
235 O( 0),
O( 1),
O( 2),
O( 3),
236 O( 0),
O( 1),
O( 2),
O( 3),
237 O( 0),
O( 1),
O( 2),
O( 3),
238 O( 0),
O( 1),
O( 2),
O( 3),
239 O( 4),
O( 5),
O( 6),
O( 7),
240 O( 8),
O( 9),
O(10),
O(11),
241 O(12),
O(12),
O(12),
O(12),
249 static const byte eg_rate_shift[64] = {
250 O(12),
O(12),
O(12),
O(12),
251 O(11),
O(11),
O(11),
O(11),
252 O(10),
O(10),
O(10),
O(10),
253 O( 9),
O( 9),
O( 9),
O( 9),
254 O( 8),
O( 8),
O( 8),
O( 8),
255 O( 7),
O( 7),
O( 7),
O( 7),
256 O( 6),
O( 6),
O( 6),
O( 6),
257 O( 5),
O( 5),
O( 5),
O( 5),
258 O( 4),
O( 4),
O( 4),
O( 4),
259 O( 3),
O( 3),
O( 3),
O( 3),
260 O( 2),
O( 2),
O( 2),
O( 2),
261 O( 1),
O( 1),
O( 1),
O( 1),
262 O( 0),
O( 0),
O( 0),
O( 0),
263 O( 0),
O( 0),
O( 0),
O( 0),
264 O( 0),
O( 0),
O( 0),
O( 0),
265 O( 0),
O( 0),
O( 0),
O( 0),
272 #define O(a) int((EG_TIMER_OVERFLOW / a) / 6)
273 static const int lfo_period[8] = {
274 O(0.168),
O(2.019),
O(3.196),
O(4.206),
275 O(5.215),
O(5.888),
O(6.224),
O(7.066)
280 #define O(a) int(a * 65536)
281 static const int vib_depth[8] = {
282 O(0),
O(3.378),
O(5.065),
O(6.750),
283 O(10.114),
O(20.170),
O(40.106),
O(79.307)
288 #define SC(db) int(db * (2.0 / ENV_STEP))
289 static const int am_depth[8] = {
290 SC(0),
SC(1.781),
SC(2.906),
SC(3.656),
291 SC(4.406),
SC(5.906),
SC(7.406),
SC(11.91)
303 static inline int sign_extend_4(
int x)
314 static inline unsigned calcStep(
unsigned oct,
unsigned fn,
unsigned vib = 0)
317 unsigned t = (fn + 1024 + vib) << oct;
345 }
else if (val == 15) {
351 int oct = sign_extend_4(
OCT);
352 res = (oct +
RC) * 2 + (
FN & 0x200 ? 1 : 0) + val * 4;
358 }
else if (res > 63) {
389 void YMF278::Impl::advance()
392 for (
int i = 0; i < 24; ++i) {
416 byte shift = eg_rate_shift[rate];
417 if (!(eg_cnt & ((1 << shift) -1))) {
418 byte select = eg_rate_select[rate];
419 op.
env_vol += (~op.
env_vol * eg_inc[select + ((eg_cnt >> shift) & 7)]) >> 3;
420 if (op.
env_vol <= MIN_ATT_INDEX) {
436 byte shift = eg_rate_shift[rate];
437 if (!(eg_cnt & ((1 << shift) -1))) {
438 byte select = eg_rate_select[rate];
439 op.
env_vol += eg_inc[select + ((eg_cnt >> shift) & 7)];
441 if ((
unsigned(op.
env_vol) > dl_tab[6]) && op.
PRVB) {
456 byte shift = eg_rate_shift[rate];
457 if (!(eg_cnt & ((1 << shift) -1))) {
458 byte select = eg_rate_select[rate];
459 op.
env_vol += eg_inc[select + ((eg_cnt >> shift) & 7)];
461 if ((
unsigned(op.
env_vol) > dl_tab[6]) && op.
PRVB) {
464 if (op.
env_vol >= MAX_ATT_INDEX) {
477 byte shift = eg_rate_shift[rate];
478 if (!(eg_cnt & ((1 << shift) -1))) {
479 byte select = eg_rate_select[rate];
480 op.
env_vol += eg_inc[select + ((eg_cnt >> shift) & 7)];
482 if ((
unsigned(op.
env_vol) > dl_tab[6]) && op.
PRVB) {
485 if (op.
env_vol >= MAX_ATT_INDEX) {
499 byte shift = eg_rate_shift[rate];
500 if (!(eg_cnt & ((1 << shift) - 1))) {
501 byte select = eg_rate_select[rate];
502 op.
env_vol += eg_inc[select + ((eg_cnt >> shift) & 7)];
504 if (op.
env_vol >= MAX_ATT_INDEX) {
514 byte shift = eg_rate_shift[rate];
515 if (!(eg_cnt & ((1 << shift) - 1))) {
516 byte select = eg_rate_select[rate];
517 op.
env_vol += eg_inc[select + ((eg_cnt >> shift) & 7)];
519 if (op.
env_vol >= MAX_ATT_INDEX) {
536 short YMF278::Impl::getSample(YMF278Slot& op)
545 sample =
readMem(op.startaddr + op.pos) << 8;
550 unsigned addr = op.startaddr + ((op.pos / 2) * 3);
552 sample =
readMem(addr + 2) << 8 |
553 ((
readMem(addr + 1) << 4) & 0xF0);
555 sample =
readMem(addr + 0) << 8 |
562 unsigned addr = op.startaddr + (op.pos * 2);
563 sample = (
readMem(addr + 0) << 8) |
574 bool YMF278::Impl::anyActive()
576 for (
int i = 0; i < 24; ++i) {
577 if (slots[i].active) {
584 void YMF278::Impl::generateChannels(
int** bufs,
unsigned num)
589 for (
int i = 0; i < 24; ++i) {
595 int vl = mix_level[pcm_l];
596 int vr = mix_level[pcm_r];
597 for (
unsigned j = 0; j < num; ++j) {
598 for (
int i = 0; i < 24; ++i) {
599 YMF278Slot& sl = slots[i];
606 short sample = (sl.sample1 * (0x10000 - sl.stepptr) +
607 sl.sample2 * sl.stepptr) >> 16;
608 int vol = sl.TL + (sl.env_vol >> 2) + sl.compute_am();
610 int volLeft = vol + pan_left [int(sl.pan)] + vl;
611 int volRight = vol + pan_right[int(sl.pan)] + vr;
613 volLeft = std::max(0, volLeft);
614 volRight = std::max(0, volRight);
616 bufs[i][2 * j + 0] += (sample * volume[volLeft] ) >> 14;
617 bufs[i][2 * j + 1] += (sample * volume[volRight]) >> 14;
619 unsigned step = (sl.lfo_active && sl.vib)
620 ? calcStep(sl.OCT, sl.FN, sl.compute_vib())
624 while (sl.stepptr >= 0x10000) {
625 sl.stepptr -= 0x10000;
626 sl.sample1 = sl.sample2;
628 if (sl.pos >= sl.endaddr) {
629 sl.pos = sl.loopaddr;
631 sl.sample2 = getSample(sl);
638 void YMF278::Impl::keyOnHelper(YMF278Slot& slot)
645 slot.sample1 = getSample(slot);
647 slot.sample2 = getSample(slot);
653 writeRegDirect(reg, data, time);
659 if (reg >= 0x08 && reg <= 0xF7) {
660 int snum = (reg - 8) % 24;
662 switch ((reg - 8) / 24) {
664 slot.
wave = (slot.
wave & 0x100) | data;
665 int wavetblhdr = (regs[2] >> 2) & 0x7;
666 int base = (slot.
wave < 384 || !wavetblhdr) ?
668 (wavetblhdr * 0x80000 + ((slot.
wave - 384) * 12));
670 for (
int i = 0; i < 12; ++i) {
675 slot.
bits = (buf[0] & 0xC0) >> 6;
676 slot.
startaddr = buf[2] | (buf[1] << 8) |
677 ((buf[0] & 0x3F) << 16);
678 slot.
loopaddr = buf[4] + (buf[3] << 8);
679 slot.
endaddr = (((buf[6] + (buf[5] << 8)) ^ 0xFFFF) + 1);
680 for (
int i = 7; i < 12; ++i) {
684 writeRegDirect(8 + snum + (i - 2) * 24, buf[i], time);
686 if ((regs[reg + 4] & 0x080)) {
692 slot.
wave = (slot.
wave & 0xFF) | ((data & 0x1) << 8);
693 slot.
FN = (slot.
FN & 0x380) | (data >> 1);
698 slot.
FN = (slot.
FN & 0x07F) | ((data & 0x07) << 7);
699 slot.
PRVB = ((data & 0x08) >> 3);
700 slot.
OCT = ((data & 0xF0) >> 4);
706 slot.
LD = data & 0x1;
722 slot.
pan = data & 0x0F;
743 if (!(regs[reg] & 0x080)) {
754 slot.
vib = data & 0x7;
755 slot.
set_lfo((data >> 3) & 0x7);
759 slot.
D1R = data & 0xF;
762 slot.
DL = dl_tab[data >> 4];
763 slot.
D2R = data & 0xF;
767 slot.
RR = data & 0xF;
770 slot.
AM = data & 0x7;
805 memadr = (regs[3] << 16) | (regs[4] << 8) | data;
822 fm_r = (data >> 3) & 0x7;
827 pcm_r = (data >> 3) & 0x7;
855 result = (regs[2] & 0x1F) | 0x20;
878 , motherBoard(config.getMotherBoard())
884 , ram(ramSize * 1024)
886 if (rom->getSize() != 0x200000) {
888 "Wrong ROM for MoonSound (YMF278). The ROM (usually "
889 "called yrw801.rom) should have a size of exactly 2MB.");
891 if ((ramSize != 0) &&
899 "Wrong sampleram size for MoonSound (YMF278). "
900 "Got " << ramSize <<
", but must be one of "
901 "0, 128, 256, 512, 640, 1024 or 2048.");
912 for (
int i = 0; i < 256; ++i) {
913 volume[i] = int(32768.0 * pow(2.0, (-0.375 / 6) * i));
915 for (
int i = 256; i < 256 * 4; ++i) {
927 memset(ram.data(), 0, ram.size());
936 for (
int i = 0; i < 24; ++i) {
940 for (
int i = 255; i >= 0; --i) {
941 writeRegDirect(i, 0, time);
944 fm_l = fm_r = pcm_l = pcm_r = 0;
993 unsigned YMF278::Impl::getRamAddress(
unsigned addr)
const
999 if ((0x180000 <= addr) && (addr <= 0x1FFFFF)) {
1001 switch (addr & 0x060000) {
1006 if (ram.size() == 256*1024) {
1024 addr = unsigned(-1);
1027 if (ram.size() == 640*1024) {
1032 if (addr > 0x080000) {
1042 address &= 0x3FFFFF;
1043 if (address < 0x200000) {
1045 return (*rom)[address];
1047 unsigned ramAddr = getRamAddress(address);
1048 if (ramAddr < ram.size()) {
1049 return ram[ramAddr];
1059 address &= 0x3FFFFF;
1060 if (address < 0x200000) {
1063 unsigned ramAddr = getRamAddress(address);
1064 if (ramAddr < ram.size()) {
1065 ram[ramAddr] = value;
1077 template<
typename Archive>
1081 ar.serialize(
"startaddr", startaddr);
1082 ar.serialize(
"loopaddr", loopaddr);
1083 ar.serialize(
"endaddr", endaddr);
1084 ar.serialize(
"stepptr", stepptr);
1085 ar.serialize(
"pos", pos);
1086 ar.serialize(
"sample1", sample1);
1087 ar.serialize(
"sample2", sample2);
1088 ar.serialize(
"env_vol", env_vol);
1089 ar.serialize(
"lfo_cnt", lfo_cnt);
1090 ar.serialize(
"lfo_step", lfo_step);
1091 ar.serialize(
"lfo_max", lfo_max);
1092 ar.serialize(
"DL", DL);
1093 ar.serialize(
"wave", wave);
1094 ar.serialize(
"FN", FN);
1095 if (ar.versionAtLeast(version, 2)) {
1096 ar.serialize(
"OCT", OCT);
1097 ar.serialize(
"PRVB", PRVB);
1098 ar.serialize(
"LD", LD);
1099 ar.serialize(
"TL", TL);
1100 ar.serialize(
"pan", pan);
1101 ar.serialize(
"lfo", lfo);
1102 ar.serialize(
"vib", vib);
1103 ar.serialize(
"AM", AM);
1104 ar.serialize(
"AR", AR);
1105 ar.serialize(
"D1R", D1R);
1106 ar.serialize(
"D2R", D2R);
1107 ar.serialize(
"RC", RC);
1108 ar.serialize(
"RR", RR);
1110 ar.serializeChar(
"OCT", OCT);
1111 ar.serializeChar(
"PRVB", PRVB);
1112 ar.serializeChar(
"LD", LD);
1113 ar.serializeChar(
"TL", TL);
1114 ar.serializeChar(
"pan", pan);
1115 ar.serializeChar(
"lfo", lfo);
1116 ar.serializeChar(
"vib", vib);
1117 ar.serializeChar(
"AM", AM);
1118 ar.serializeChar(
"AR", AR);
1119 ar.serializeChar(
"D1R", D1R);
1120 ar.serializeChar(
"D2R", D2R);
1121 ar.serializeChar(
"RC", RC);
1122 ar.serializeChar(
"RR", RR);
1124 ar.serialize(
"bits", bits);
1125 ar.serialize(
"active", active);
1126 ar.serialize(
"state", state);
1127 ar.serialize(
"lfo_active", lfo_active);
1130 if (ar.isLoader()) {
1131 step = calcStep(OCT, FN);
1149 template<
typename Archive>
1152 ar.serialize(
"slots", slots);
1153 ar.serialize(
"eg_cnt", eg_cnt);
1154 ar.serialize_blob(
"ram", ram.data(), ram.size());
1155 ar.serialize_blob(
"registers", regs,
sizeof(regs));
1156 if (ar.versionAtLeast(version, 3)) {
1157 ar.serialize(
"memadr", memadr);
1159 assert(ar.isLoader());
1164 memadr = (regs[3] << 16) | (regs[4] << 8) | regs[5];
1168 static const byte rewriteRegs[] = {
1172 if (ar.isLoader()) {
1174 for (
unsigned i = 0; i <
sizeof(rewriteRegs); ++i) {
1175 byte reg = rewriteRegs[i];
1176 writeRegDirect(reg, regs[reg], time);
1185 const std::string& name)
1187 "OPL4 registers", 0x100)
1194 return ymf278.
peekReg(address);
1199 ymf278.
writeReg(address, value, time);
1206 const std::string& name)
1208 "OPL4 memory (includes both ROM and RAM)", 0x400000)
1215 return ymf278.
readMem(address);
1247 pimpl->writeReg(reg, data, time);
1252 return pimpl->readReg(reg);
1257 return pimpl->peekReg(reg);
1262 return pimpl->readMem(address);
1267 pimpl->writeMem(address, value);
1270 template<
typename Archive>
1273 pimpl->serialize(ar, version);