Previous 199869 Revisions Next

r23995 Friday 28th June, 2013 at 18:40:49 UTC by hap
pcm looping fix
[src/emu/sound]ymf271.c ymf271.h

trunk/src/emu/sound/ymf271.c
r23994r23995
267267{
268268   double st;
269269
270   if (slot->waveform == 7)    // external waveform (PCM)
270   if (slot->waveform == 7)
271271   {
272      // external waveform (PCM)
272273      st = (double)(2 * (slot->fns | 2048)) * pow_table[slot->block] * fs_frequency[slot->fs];
273274      st = st * multiple_table[slot->multiple];
274275
275276      // LFO phase modulation
276277      st *= slot->lfo_phasemod;
277278
278      st /= (double)(524288/65536);       // pre-multiply with 65536
279      st /= (double)(524288/65536); // pre-multiply with 65536
279280
280281      slot->step = (UINT32)st;
281282   }
282   else                        // internal waveform (FM)
283   else
283284   {
285      // internal waveform (FM)
284286      st = (double)(2 * slot->fns) * pow_table[slot->block];
285287      st = st * multiple_table[slot->multiple] * (double)(SIN_LEN);
286288
287289      // LFO phase modulation
288290      st *= slot->lfo_phasemod;
289291
290      st /= (double)(536870912/65536);    // pre-multiply with 65536
292      st /= (double)(536870912/65536); // pre-multiply with 65536
291293
292294      slot->step = (UINT32)st;
293295   }
r23994r23995
378380   rate = GET_KEYSCALED_RATE(slot->relrate * 4, keycode, slot->keyscale);
379381   slot->env_release_step = (rate < 4) ? 0 : (int)(((double)(255-0) / m_lut_ar[rate]) * 65536.0);
380382
381   slot->volume = (255-160) << ENV_VOLUME_SHIFT;       // -60db
383   slot->volume = (255-160) << ENV_VOLUME_SHIFT; // -60db
382384   slot->env_state = ENV_ATTACK;
383385}
384386
r23994r23995
443445
444446   for (i = 0; i < length; i++)
445447   {
448      // loop
449      if ((slot->stepptr>>16) > slot->endaddr)
450      {
451         slot->stepptr = slot->stepptr - ((UINT64)slot->endaddr<<16) + ((UINT64)slot->loopaddr<<16);
452         if ((slot->stepptr>>16) > slot->endaddr)
453         {
454            // overflow
455            slot->stepptr &= 0xffff;
456            slot->stepptr |= ((UINT64)slot->loopaddr<<16);
457         }
458      }
459
446460      if (slot->bits == 8)
447461      {
448462         // 8bit
r23994r23995
472486
473487      *mixp++ += (sample * ch0_vol) >> 16;
474488      *mixp++ += (sample * ch1_vol) >> 16;
475
489     
490      // go to next step
476491      slot->stepptr += slot->step;
477      if ((slot->stepptr>>16) > slot->endaddr)
478      {
479         // kill non-frac
480         slot->stepptr &= 0xffff;
481         slot->stepptr |= (slot->loopaddr<<16);
482      }
483492   }
484493}
485494
r23994r23995
631640
632641      switch (slot_group->sync)
633642      {
634         case 0:     // 4 operator FM
643         // 4 operator FM
644         case 0:
635645         {
636646            int slot1 = j + (0*12);
637647            int slot2 = j + (1*12);
r23994r23995
817827            break;
818828         }
819829
820         case 1:     // 2x 2 operator FM
830         // 2x 2 operator FM
831         case 1:
821832         {
822833            for (op = 0; op < 2; op++)
823834            {
r23994r23995
871882            break;
872883         }
873884
874         case 2:     // 3 operator FM + PCM
885         // 3 operator FM + PCM
886         case 2:
875887         {
876888            int slot1 = j + (0*12);
877889            int slot2 = j + (1*12);
r23994r23995
967979            break;
968980         }
969981
970         case 3:     // PCM
982         // PCM
983         case 3:
971984         {
972985            update_pcm(j + (0*12), mixp, samples);
973986            update_pcm(j + (1*12), mixp, samples);
r23994r23995
9921005
9931006   switch (reg)
9941007   {
995      case 0:
1008      case 0x0:
9961009         slot->ext_en = (data & 0x80) ? 1 : 0;
9971010         slot->ext_out = (data>>3)&0xf;
9981011
r23994r23995
10191032         }
10201033         break;
10211034
1022      case 1:
1035      case 0x1:
10231036         slot->lfoFreq = data;
10241037         break;
10251038
1026      case 2:
1039      case 0x2:
10271040         slot->lfowave = data & 3;
10281041         slot->pms = (data >> 3) & 0x7;
10291042         slot->ams = (data >> 6) & 0x3;
10301043         break;
10311044
1032      case 3:
1045      case 0x3:
10331046         slot->multiple = data & 0xf;
10341047         slot->detune = (data >> 4) & 0x7;
10351048         break;
10361049
1037      case 4:
1050      case 0x4:
10381051         slot->tl = data & 0x7f;
10391052         break;
10401053
1041      case 5:
1054      case 0x5:
10421055         slot->ar = data & 0x1f;
1043         slot->keyscale = (data>>5)&0x7;
1056         slot->keyscale = (data >> 5) & 0x7;
10441057         break;
10451058
1046      case 6:
1059      case 0x6:
10471060         slot->decay1rate = data & 0x1f;
10481061         break;
10491062
1050      case 7:
1063      case 0x7:
10511064         slot->decay2rate = data & 0x1f;
10521065         break;
10531066
1054      case 8:
1067      case 0x8:
10551068         slot->relrate = data & 0xf;
10561069         slot->decay1lvl = (data >> 4) & 0xf;
10571070         break;
10581071
1059      case 9:
1060         slot->fns &= ~0xff;
1061         slot->fns |= data;
1072      case 0x9:
1073         // write frequency and block here
1074         slot->fns = (slot->fns_hi << 8 & 0x0f00) | data;
1075         slot->block = slot->fns_hi >> 4 & 0xf;
10621076         break;
10631077
1064      case 10:
1065         slot->fns &= ~0xff00;
1066         slot->fns |= (data & 0xf)<<8;
1067         slot->block = (data>>4)&0xf;
1078      case 0xa:
1079         slot->fns_hi = data;
10681080         break;
10691081
1070      case 11:
1082      case 0xb:
10711083         slot->waveform = data & 0x7;
10721084         slot->feedback = (data >> 4) & 0x7;
10731085         slot->accon = (data & 0x80) ? 1 : 0;
10741086         break;
10751087
1076      case 12:
1088      case 0xc:
10771089         slot->algorithm = data & 0xf;
10781090         break;
10791091
1080      case 13:
1092      case 0xd:
10811093         slot->ch0_level = data >> 4;
10821094         slot->ch1_level = data & 0xf;
10831095         break;
10841096
1085      case 14:
1097      case 0xe:
10861098         slot->ch2_level = data >> 4;
10871099         slot->ch3_level = data & 0xf;
10881100         break;
r23994r23995
11241136   int sync_mode = 0;
11251137   switch (m_groups[groupnum].sync)
11261138   {
1127      case 0:     // 4 slot mode
1128      {
1139      // 4 slot mode
1140      case 0:
11291141         if (bank == 0)
11301142            sync_mode = 1;
11311143         break;
1132      }
1133      case 1:     // 2x 2 slot mode
1134      {
1144
1145      // 2x 2 slot mode
1146      case 1:
11351147         if (bank == 0 || bank == 1)
11361148            sync_mode = 1;
11371149         break;
1138      }
1139      case 2:     // 3 slot + 1 slot mode
1140      {
1150
1151      // 3 slot + 1 slot mode
1152      case 2:
11411153         if (bank == 0)
11421154            sync_mode = 1;
11431155         break;
1144      }
11451156
11461157      default:
11471158         break;
11481159   }
11491160
1150   if (sync_mode && sync_reg)      // key-on slot & synced register
1161   // key-on slot & synced register
1162   if (sync_mode && sync_reg)
11511163   {
11521164      switch (m_groups[groupnum].sync)
11531165      {
1154         case 0:     // 4 slot mode
1155         {
1166         // 4 slot mode
1167         case 0:
11561168            write_register((12 * 0) + groupnum, reg, data);
11571169            write_register((12 * 1) + groupnum, reg, data);
11581170            write_register((12 * 2) + groupnum, reg, data);
11591171            write_register((12 * 3) + groupnum, reg, data);
11601172            break;
1161         }
1162         case 1:     // 2x 2 slot mode
1163         {
1164            if (bank == 0)       // Slot 1 - Slot 3
1173
1174         // 2x 2 slot mode
1175         case 1:
1176            if (bank == 0)
11651177            {
1178               // Slot 1 - Slot 3
11661179               write_register((12 * 0) + groupnum, reg, data);
11671180               write_register((12 * 2) + groupnum, reg, data);
11681181            }
1169            else                // Slot 2 - Slot 4
1182            else
11701183            {
1184               // Slot 2 - Slot 4
11711185               write_register((12 * 1) + groupnum, reg, data);
11721186               write_register((12 * 3) + groupnum, reg, data);
11731187            }
11741188            break;
1175         }
1176         case 2:     // 3 slot + 1 slot mode
1177         {
1178            // 1 slot is handled normally
1189
1190         // 3 slot + 1 slot mode (1 slot is handled normally)
1191         case 2:
11791192            write_register((12 * 0) + groupnum, reg, data);
11801193            write_register((12 * 1) + groupnum, reg, data);
11811194            write_register((12 * 2) + groupnum, reg, data);
11821195            break;
1183         }
11841196      }
11851197   }
1186   else        // write register normally
1198   else
11871199   {
1200      // write register normally
11881201      write_register((12 * bank) + groupnum, reg, data);
11891202   }
11901203}
11911204
1192void ymf271_device::ymf271_write_pcm(UINT8 data)
1205void ymf271_device::ymf271_write_pcm(UINT8 address, UINT8 data)
11931206{
1194   int slotnum = pcm_tab[m_pcmreg & 0xf];
1207   int slotnum = pcm_tab[address & 0xf];
11951208   if (slotnum == -1)
11961209   {
1197      logerror("ymf271_write_pcm invalid slot %02X %02X\n", m_pcmreg, data);
1210      logerror("ymf271_write_pcm invalid slot %02X %02X\n", address, data);
11981211      return;
11991212   }
12001213   YMF271Slot *slot = &m_slots[slotnum];
12011214
1202   switch (m_pcmreg >> 4 & 0xf)
1215   switch (address >> 4 & 0xf)
12031216   {
1204      case 0:
1217      case 0x0:
12051218         slot->startaddr &= ~0xff;
12061219         slot->startaddr |= data;
12071220         break;
12081221
1209      case 1:
1222      case 0x1:
12101223         slot->startaddr &= ~0xff00;
12111224         slot->startaddr |= data<<8;
12121225         break;
12131226
1214      case 2:
1227      case 0x2:
12151228         slot->startaddr &= ~0xff0000;
12161229         slot->startaddr |= (data & 0x7f)<<16;
12171230         slot->altloop = (data & 0x80) ? 1 : 0;
r23994r23995
12191232            popmessage("ymf271 A/L, contact MAMEdev");
12201233         break;
12211234
1222      case 3:
1235      case 0x3:
12231236         slot->endaddr &= ~0xff;
12241237         slot->endaddr |= data;
12251238         break;
12261239
1227      case 4:
1240      case 0x4:
12281241         slot->endaddr &= ~0xff00;
12291242         slot->endaddr |= data<<8;
12301243         break;
12311244
1232      case 5:
1245      case 0x5:
12331246         slot->endaddr &= ~0xff0000;
12341247         slot->endaddr |= (data & 0x7f)<<16;
12351248         break;
12361249
1237      case 6:
1250      case 0x6:
12381251         slot->loopaddr &= ~0xff;
12391252         slot->loopaddr |= data;
12401253         break;
12411254
1242      case 7:
1255      case 0x7:
12431256         slot->loopaddr &= ~0xff00;
12441257         slot->loopaddr |= data<<8;
12451258         break;
12461259
1247      case 8:
1260      case 0x8:
12481261         slot->loopaddr &= ~0xff0000;
12491262         slot->loopaddr |= (data & 0x7f)<<16;
12501263         break;
12511264
1252      case 9:
1265      case 0x9:
12531266         slot->fs = data & 0x3;
12541267         slot->bits = (data & 0x4) ? 12 : 8;
12551268         slot->srcnote = (data >> 3) & 0x3;
r23994r23995
13211334      return m_ext_read_handler(offset);
13221335}
13231336
1324void ymf271_device::ymf271_write_timer(UINT8 data)
1337void ymf271_device::ymf271_write_timer(UINT8 address, UINT8 data)
13251338{
1326   if ((m_timerreg & 0xf0) == 0)
1339   if ((address & 0xf0) == 0)
13271340   {
1328      int groupnum = fm_tab[m_timerreg & 0xf];
1341      int groupnum = fm_tab[address & 0xf];
13291342      if (groupnum == -1)
13301343      {
1331         logerror("ymf271_write_timer invalid group %02X %02X\n", m_timerreg, data);
1344         logerror("ymf271_write_timer invalid group %02X %02X\n", address, data);
13321345         return;
13331346      }
13341347      YMF271Group *group = &m_groups[groupnum];
r23994r23995
13381351   }
13391352   else
13401353   {
1341      switch (m_timerreg)
1354      switch (address)
13421355      {
13431356         case 0x10:
13441357            m_timerA = data;
r23994r23995
14301443WRITE8_MEMBER( ymf271_device::write )
14311444{
14321445   m_stream->update();
1446   
1447   m_regs_main[offset & 0xf] = data;
14331448
1434   switch (offset)
1449   switch (offset & 0xf)
14351450   {
1436      case 0:
1437         m_reg0 = data;
1451      case 0x0:
1452      case 0x2:
1453      case 0x4:
1454      case 0x6:
1455      case 0x8:
1456      case 0xc:
1457         // address regs
14381458         break;
14391459
1440      case 1:
1441         ymf271_write_fm(0, m_reg0, data);
1460      case 0x1:
1461         ymf271_write_fm(0, m_regs_main[0x0], data);
14421462         break;
14431463
1444      case 2:
1445         m_reg1 = data;
1464      case 0x3:
1465         ymf271_write_fm(1, m_regs_main[0x2], data);
14461466         break;
14471467
1448      case 3:
1449         ymf271_write_fm(1, m_reg1, data);
1468      case 0x5:
1469         ymf271_write_fm(2, m_regs_main[0x4], data);
14501470         break;
14511471
1452      case 4:
1453         m_reg2 = data;
1472      case 0x7:
1473         ymf271_write_fm(3, m_regs_main[0x6], data);
14541474         break;
14551475
1456      case 5:
1457         ymf271_write_fm(2, m_reg2, data);
1476      case 0x9:
1477         ymf271_write_pcm(m_regs_main[0x8], data);
14581478         break;
14591479
1460      case 6:
1461         m_reg3 = data;
1462         break;
1463
1464      case 7:
1465         ymf271_write_fm(3, m_reg3, data);
1466         break;
1467
1468      case 8:
1469         m_pcmreg = data;
1470         break;
1471
1472      case 9:
1473         ymf271_write_pcm(data);
1474         break;
1475
1476      case 0xc:
1477         m_timerreg = data;
1478         break;
1479
14801480      case 0xd:
1481         ymf271_write_timer(data);
1481         ymf271_write_timer(m_regs_main[0xc], data);
14821482         break;
14831483
14841484      default:
r23994r23995
14881488
14891489READ8_MEMBER( ymf271_device::read )
14901490{
1491   switch(offset)
1491   switch (offset & 0xf)
14921492   {
1493      case 0:
1493      case 0x0:
14941494         return m_status;
1495     
1496      case 0x1:
1497         // statusreg 2
1498         return 0;
14951499
1496      case 2:
1500      case 0x2:
14971501      {
14981502         if (!m_ext_rw)
14991503            return 0xff;
r23994r23995
15031507         m_ext_readlatch = ymf271_read_memory(m_ext_address);
15041508         return ret;
15051509      }
1510     
1511      default:
1512         break;
15061513   }
15071514
1508   return 0;
1515   return 0xff;
15091516}
15101517
15111518void ymf271_device::init_tables()
r23994r23995
16511658      save_item(NAME(m_slots[i].decay2rate), i);
16521659      save_item(NAME(m_slots[i].decay1lvl), i);
16531660      save_item(NAME(m_slots[i].relrate), i);
1654      save_item(NAME(m_slots[i].fns), i);
16551661      save_item(NAME(m_slots[i].block), i);
1662      save_item(NAME(m_slots[i].fns_hi), i);
1663      save_item(NAME(m_slots[i].fns), i);
16561664      save_item(NAME(m_slots[i].feedback), i);
16571665      save_item(NAME(m_slots[i].waveform), i);
16581666      save_item(NAME(m_slots[i].accon), i);
r23994r23995
16911699      save_item(NAME(m_groups[i].pfm), i);
16921700   }
16931701
1702   save_item(NAME(m_regs_main));
16941703   save_item(NAME(m_timerA));
16951704   save_item(NAME(m_timerB));
16961705   save_item(NAME(m_irqstate));
16971706   save_item(NAME(m_status));
16981707   save_item(NAME(m_enable));
1699   save_item(NAME(m_reg0));
1700   save_item(NAME(m_reg1));
1701   save_item(NAME(m_reg2));
1702   save_item(NAME(m_reg3));
1703   save_item(NAME(m_pcmreg));
1704   save_item(NAME(m_timerreg));
17051708   save_item(NAME(m_ext_address));
17061709   save_item(NAME(m_ext_rw));
17071710   save_item(NAME(m_ext_readlatch));
r23994r23995
17661769      m_irqstate(0),
17671770      m_status(0),
17681771      m_enable(0),
1769      m_reg0(0),
1770      m_reg1(0),
1771      m_reg2(0),
1772      m_reg3(0),
1773      m_pcmreg(0),
1774      m_timerreg(0),
17751772      m_ext_address(0),
17761773      m_ext_rw(0),
17771774      m_ext_readlatch(0),
r23994r23995
17811778{
17821779   memset(m_slots, 0, sizeof(m_slots));
17831780   memset(m_groups, 0, sizeof(m_groups));
1781   memset(m_regs_main, 0, sizeof(m_regs_main));
17841782}
17851783
17861784//-------------------------------------------------
trunk/src/emu/sound/ymf271.h
r23994r23995
5353      UINT8 decay1rate, decay2rate;
5454      UINT8 decay1lvl;
5555      UINT8 relrate;
56      UINT32 fns;
5756      UINT8 block;
57      UINT8 fns_hi;
58      UINT32 fns;
5859      UINT8 feedback;
5960      UINT8 waveform;
6061      UINT8 accon;
r23994r23995
6970      UINT8 srcnote, srcb;
7071
7172      UINT32 step;
72      UINT32 stepptr;
73      UINT64 stepptr;
7374
7475      UINT8 active;
7576      UINT8 bits;
r23994r23995
110111   INT64 calculate_1op_fm_1(int slotnum);
111112   void write_register(int slotnum, int reg, UINT8 data);
112113   void ymf271_write_fm(int bank, UINT8 address, UINT8 data);
113   void ymf271_write_pcm(UINT8 data);
114   void ymf271_write_pcm(UINT8 address, UINT8 data);
115   void ymf271_write_timer(UINT8 address, UINT8 data);
114116   UINT8 ymf271_read_memory(UINT32 offset);
115   void ymf271_write_timer(UINT8 data);
116117   
117118   // lookup tables
118119   INT16 *m_lut_waves[8];
r23994r23995
128129   // internal state
129130   YMF271Slot m_slots[48];
130131   YMF271Group m_groups[12];
132   
133   UINT8 m_regs_main[0x10];
131134
132135   UINT32 m_timerA;
133136   UINT32 m_timerB;
r23994r23995
135138   UINT8 m_status;
136139   UINT8 m_enable;
137140
138   UINT8 m_reg0;
139   UINT8 m_reg1;
140   UINT8 m_reg2;
141   UINT8 m_reg3;
142   UINT8 m_pcmreg;
143   UINT8 m_timerreg;
144141   UINT32 m_ext_address;
145142   UINT8 m_ext_rw;
146143   UINT8 m_ext_readlatch;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team