Previous 199869 Revisions Next

r23979 Friday 28th June, 2013 at 01:41:52 UTC by hap
some cleanup
[src/emu/sound]ymf271.c

trunk/src/emu/sound/ymf271.c
r23978r23979
1717    - Src B and Src NOTE bits
1818    - statusreg Busy and End bits
1919    - timer register 0x11
20    - ch2/ch3 (4 speakers)
21    - PFM (FM using external PCM waveform)
22    - detune
23    - Acc On bit
2024    - Is memory handling 100% correct? At the moment, seibuspi.c is the only
2125      hardware currently emulated that uses external handlers.
22    - oh, and a lot more...
2326*/
2427
2528#include "emu.h"
2629#include "ymf271.h"
2730
28#define VERBOSE     (1)
31#define MAXOUT          (+32767)
32#define MINOUT          (-32768)
2933
30#define MAXOUT      (+32767)
31#define MINOUT      (-32768)
32
3334#define SIN_BITS        10
3435#define SIN_LEN         (1<<SIN_BITS)
3536#define SIN_MASK        (SIN_LEN-1)
r23978r23979
4142#define ALFO_MAX        (+65536)
4243#define ALFO_MIN        (0)
4344
44//#define log2(n) (log((float) n)/log((float) 2))
45
4645// slot mapping assists
47static const int fm_tab[] = { 0, 1, 2, -1, 3, 4, 5, -1, 6, 7, 8, -1, 9, 10, 11, -1 };
48static const int pcm_tab[] = { 0, 4, 8, -1, 12, 16, 20, -1, 24, 28, 32, -1, 36, 40, 44, -1 };
46static const int fm_tab[16] = { 0, 1, 2, -1, 3, 4, 5, -1, 6, 7, 8, -1, 9, 10, 11, -1 };
47static const int pcm_tab[16] = { 0, 4, 8, -1, 12, 16, 20, -1, 24, 28, 32, -1, 36, 40, 44, -1 };
4948
5049static INT16 *wavetable[8];
5150static double plfo_table[4][8][LFO_LENGTH];
r23978r23979
241240
242241INLINE int GET_EXTERNAL_KEYCODE(int block, int fns)
243242{
244   /* TODO: SrcB and SrcNote !? */
245243   int n43;
246244   if (fns < 0x100)
247245   {
r23978r23979
320318         int decay_level = 255 - (slot->decay1lvl << 4);
321319         slot->volume -= slot->env_decay1_step;
322320
323         if ((slot->volume >> (ENV_VOLUME_SHIFT)) <= decay_level)
321         if ((slot->volume >> ENV_VOLUME_SHIFT) <= decay_level)
324322         {
325323            slot->env_state = ENV_DECAY2;
326324         }
r23978r23979
331329      {
332330         slot->volume -= slot->env_decay2_step;
333331
334         if (slot->volume < 0)
332         if (slot->volume <= 0)
335333         {
334            slot->active = 0;
336335            slot->volume = 0;
337336         }
338337         break;
r23978r23979
342341      {
343342         slot->volume -= slot->env_release_step;
344343
345         if (slot->volume <= (0 << ENV_VOLUME_SHIFT))
344         if (slot->volume <= 0)
346345         {
347346            slot->active = 0;
348347            slot->volume = 0;
r23978r23979
366365   }
367366   else
368367   {
369      keycode = GET_EXTERNAL_KEYCODE(slot->block, slot->fns);
368      keycode = GET_EXTERNAL_KEYCODE(slot->block, slot->fns & 0x7ff);
369      /* keycode = (keycode + slot->srcb * 4 + slot->srcnote) / 2; */ // not sure
370370   }
371371
372372   // init attack state
r23978r23979
994994            update_pcm(j + (3*12), mixp, samples);
995995            break;
996996         }
997
998         default: break;
999997      }
1000998   }
1001999
r23978r23979
10141012   switch (reg)
10151013   {
10161014      case 0:
1017      {
10181015         slot->ext_en = (data & 0x80) ? 1 : 0;
10191016         slot->ext_out = (data>>3)&0xf;
10201017
r23978r23979
10401037            }
10411038         }
10421039         break;
1043      }
10441040
10451041      case 1:
1046      {
10471042         slot->lfoFreq = data;
10481043         break;
1049      }
10501044
10511045      case 2:
1052      {
10531046         slot->lfowave = data & 3;
10541047         slot->pms = (data >> 3) & 0x7;
10551048         slot->ams = (data >> 6) & 0x3;
10561049         break;
1057      }
10581050
10591051      case 3:
1060      {
10611052         slot->multiple = data & 0xf;
10621053         slot->detune = (data >> 4) & 0x7;
10631054         break;
1064      }
10651055
10661056      case 4:
1067      {
10681057         slot->tl = data & 0x7f;
10691058         break;
1070      }
10711059
10721060      case 5:
1073      {
10741061         slot->ar = data & 0x1f;
10751062         slot->keyscale = (data>>5)&0x7;
10761063         break;
1077      }
10781064
10791065      case 6:
1080      {
10811066         slot->decay1rate = data & 0x1f;
10821067         break;
1083      }
10841068
10851069      case 7:
1086      {
10871070         slot->decay2rate = data & 0x1f;
10881071         break;
1089      }
10901072
10911073      case 8:
1092      {
10931074         slot->relrate = data & 0xf;
10941075         slot->decay1lvl = (data >> 4) & 0xf;
10951076         break;
1096      }
10971077
10981078      case 9:
1099      {
11001079         slot->fns &= ~0xff;
11011080         slot->fns |= data;
11021081         break;
1103      }
11041082
11051083      case 10:
1106      {
11071084         slot->fns &= ~0xff00;
11081085         slot->fns |= (data & 0xf)<<8;
11091086         slot->block = (data>>4)&0xf;
11101087         break;
1111      }
11121088
11131089      case 11:
1114      {
11151090         slot->waveform = data & 0x7;
11161091         slot->feedback = (data >> 4) & 0x7;
11171092         slot->accon = (data & 0x80) ? 1 : 0;
11181093         break;
1119      }
11201094
11211095      case 12:
1122      {
11231096         slot->algorithm = data & 0xf;
11241097         break;
1125      }
11261098
11271099      case 13:
1128      {
11291100         slot->ch0_level = data >> 4;
11301101         slot->ch1_level = data & 0xf;
11311102         break;
1132      }
11331103
11341104      case 14:
1135      {
11361105         slot->ch2_level = data >> 4;
11371106         slot->ch3_level = data & 0xf;
11381107         break;
1139      }
11401108
11411109      default:
11421110         break;
11431111   }
11441112}
11451113
1146void ymf271_device::ymf271_write_fm(int grp, int adr, int data)
1114void ymf271_device::ymf271_write_fm(int bank, int address, int data)
11471115{
1148   int reg;
1149   //int slotnum;
1150   int slot_group;
1151   int sync_mode, sync_reg;
1152   //YMF271Slot *slot;
1116   int groupnum = fm_tab[address & 0xf];
1117   if (groupnum == -1)
1118   {
1119      logerror("ymf271_write_fm invalid group %02X\n", data);
1120      return;
1121   }
11531122
1154   //slotnum = 12*grp;
1155   //slotnum += fm_tab[adr & 0xf];
1156   //slot = &m_slots[slotnum];
1157   slot_group = fm_tab[adr & 0xf];
1123   int reg = (address >> 4) & 0xf;
11581124
1159   reg = (adr >> 4) & 0xf;
1160
11611125   // check if the register is a synchronized register
1162   sync_reg = 0;
1126   int sync_reg = 0;
11631127   switch (reg)
11641128   {
11651129      case 0:
r23978r23979
11761140   }
11771141
11781142   // check if the slot is key on slot for synchronizing
1179   sync_mode = 0;
1180   switch (m_groups[slot_group].sync)
1143   int sync_mode = 0;
1144   switch (m_groups[groupnum].sync)
11811145   {
11821146      case 0:     // 4 slot mode
11831147      {
1184         if (grp == 0)
1148         if (bank == 0)
11851149            sync_mode = 1;
11861150         break;
11871151      }
11881152      case 1:     // 2x 2 slot mode
11891153      {
1190         if (grp == 0 || grp == 1)
1154         if (bank == 0 || bank == 1)
11911155            sync_mode = 1;
11921156         break;
11931157      }
11941158      case 2:     // 3 slot + 1 slot mode
11951159      {
1196         if (grp == 0)
1160         if (bank == 0)
11971161            sync_mode = 1;
11981162         break;
11991163      }
r23978r23979
12041168
12051169   if (sync_mode && sync_reg)      // key-on slot & synced register
12061170   {
1207      switch (m_groups[slot_group].sync)
1171      switch (m_groups[groupnum].sync)
12081172      {
12091173         case 0:     // 4 slot mode
12101174         {
1211            write_register((12 * 0) + slot_group, reg, data);
1212            write_register((12 * 1) + slot_group, reg, data);
1213            write_register((12 * 2) + slot_group, reg, data);
1214            write_register((12 * 3) + slot_group, reg, data);
1175            write_register((12 * 0) + groupnum, reg, data);
1176            write_register((12 * 1) + groupnum, reg, data);
1177            write_register((12 * 2) + groupnum, reg, data);
1178            write_register((12 * 3) + groupnum, reg, data);
12151179            break;
12161180         }
12171181         case 1:     // 2x 2 slot mode
12181182         {
1219            if (grp == 0)       // Slot 1 - Slot 3
1183            if (bank == 0)       // Slot 1 - Slot 3
12201184            {
1221               write_register((12 * 0) + slot_group, reg, data);
1222               write_register((12 * 2) + slot_group, reg, data);
1185               write_register((12 * 0) + groupnum, reg, data);
1186               write_register((12 * 2) + groupnum, reg, data);
12231187            }
12241188            else                // Slot 2 - Slot 4
12251189            {
1226               write_register((12 * 1) + slot_group, reg, data);
1227               write_register((12 * 3) + slot_group, reg, data);
1190               write_register((12 * 1) + groupnum, reg, data);
1191               write_register((12 * 3) + groupnum, reg, data);
12281192            }
12291193            break;
12301194         }
12311195         case 2:     // 3 slot + 1 slot mode
12321196         {
12331197            // 1 slot is handled normally
1234            write_register((12 * 0) + slot_group, reg, data);
1235            write_register((12 * 1) + slot_group, reg, data);
1236            write_register((12 * 2) + slot_group, reg, data);
1198            write_register((12 * 0) + groupnum, reg, data);
1199            write_register((12 * 1) + groupnum, reg, data);
1200            write_register((12 * 2) + groupnum, reg, data);
12371201            break;
12381202         }
1239         default:
1240            break;
12411203      }
12421204   }
12431205   else        // write register normally
12441206   {
1245      write_register((12 * grp) + slot_group, reg, data);
1207      write_register((12 * bank) + groupnum, reg, data);
12461208   }
12471209}
12481210
12491211void ymf271_device::ymf271_write_pcm(int data)
12501212{
1251   int slotnum;
1252   YMF271Slot *slot;
1213   int slotnum = pcm_tab[m_pcmreg & 0xf];
1214   if (slotnum == -1)
1215   {
1216      logerror("ymf271_write_pcm invalid slot %02X\n", data);
1217      return;
1218   }
1219   YMF271Slot *slot = &m_slots[slotnum];
12531220
1254   slotnum = pcm_tab[m_pcmreg&0xf];
1255   slot = &m_slots[slotnum];
1256
1257   switch ((m_pcmreg>>4)&0xf)
1221   switch (m_pcmreg >> 4 & 0xf)
12581222   {
12591223      case 0:
12601224         slot->startaddr &= ~0xff;
12611225         slot->startaddr |= data;
12621226         break;
1227
12631228      case 1:
12641229         slot->startaddr &= ~0xff00;
12651230         slot->startaddr |= data<<8;
12661231         break;
1232
12671233      case 2:
12681234         slot->startaddr &= ~0xff0000;
12691235         slot->startaddr |= (data & 0x7f)<<16;
12701236         slot->altloop = (data & 0x80) ? 1 : 0;
12711237         break;
1238
12721239      case 3:
12731240         slot->endaddr &= ~0xff;
12741241         slot->endaddr |= data;
12751242         break;
1243
12761244      case 4:
12771245         slot->endaddr &= ~0xff00;
12781246         slot->endaddr |= data<<8;
12791247         break;
1248
12801249      case 5:
12811250         slot->endaddr &= ~0xff0000;
12821251         slot->endaddr |= (data & 0x7f)<<16;
12831252         break;
1253
12841254      case 6:
12851255         slot->loopaddr &= ~0xff;
12861256         slot->loopaddr |= data;
12871257         break;
1258
12881259      case 7:
12891260         slot->loopaddr &= ~0xff00;
12901261         slot->loopaddr |= data<<8;
12911262         break;
1263
12921264      case 8:
12931265         slot->loopaddr &= ~0xff0000;
12941266         slot->loopaddr |= (data & 0x7f)<<16;
12951267         break;
1268
12961269      case 9:
12971270         slot->fs = data & 0x3;
12981271         slot->bits = (data & 0x4) ? 12 : 8;
12991272         slot->srcnote = (data >> 3) & 0x3;
13001273         slot->srcb = (data >> 5) & 0x7;
13011274         break;
1275
13021276      default:
13031277         break;
13041278   }
r23978r23979
13081282{
13091283   switch(id)
13101284   {
1311   case 0:
1312      m_status |= 1;
1285      case 0:
1286         m_status |= 1;
13131287
1314      // assert IRQ
1315      if (m_enable & 4)
1316      {
1317         m_irqstate |= 1;
1288         // assert IRQ
1289         if (m_enable & 4)
1290         {
1291            m_irqstate |= 1;
13181292
1319         if (!m_irq_handler.isnull())
1320            m_irq_handler(1);
1321      }
1293            if (!m_irq_handler.isnull())
1294               m_irq_handler(1);
1295         }
13221296
1323      // reload timer
1324      m_timA->adjust(attotime::from_hz(m_clock) * (384 * 4 * (256 - m_timerA)), 0);
1325      break;
1297         // reload timer
1298         m_timA->adjust(attotime::from_hz(m_clock) * (384 * 4 * (256 - m_timerA)), 0);
1299         break;
13261300
1327   case 1:
1328      m_status |= 2;
1301      case 1:
1302         m_status |= 2;
13291303
1330      // assert IRQ
1331      if (m_enable & 8)
1332      {
1333         m_irqstate |= 2;
1304         // assert IRQ
1305         if (m_enable & 8)
1306         {
1307            m_irqstate |= 2;
13341308
1335         if (!m_irq_handler.isnull())
1336            m_irq_handler(1);
1337      }
1309            if (!m_irq_handler.isnull())
1310               m_irq_handler(1);
1311         }
13381312
1339      // reload timer
1340      m_timB->adjust(attotime::from_hz(m_clock) * (384 * 16 * (256 - m_timerB)), 0);
1341      break;
1313         // reload timer
1314         m_timB->adjust(attotime::from_hz(m_clock) * (384 * 16 * (256 - m_timerB)), 0);
1315         break;
1316     
1317      default:
1318         assert_always(FALSE, "Unknown id in ymf271_device::device_timer");
1319         break;
13421320   }
13431321}
13441322
r23978r23979
13621340
13631341void ymf271_device::ymf271_write_timer(int data)
13641342{
1365   int slotnum;
1366   YMF271Group *group;
1367
1368   slotnum = fm_tab[m_timerreg & 0xf];
1369   group = &m_groups[slotnum];
1370
13711343   if ((m_timerreg & 0xf0) == 0)
13721344   {
1345      int groupnum = fm_tab[m_timerreg & 0xf];
1346      if (groupnum == -1)
1347      {
1348         logerror("ymf271_write_timer invalid group %02X\n", data);
1349         return;
1350      }
1351      YMF271Group *group = &m_groups[groupnum];
1352
13731353      group->sync = data & 0x3;
13741354      group->pfm = data >> 7;
13751355   }
r23978r23979
14341414            m_ext_address &= ~0xff;
14351415            m_ext_address |= data;
14361416            break;
1417
14371418         case 0x15:
14381419            m_ext_address &= ~0xff00;
14391420            m_ext_address |= data << 8;
14401421            break;
1422
14411423         case 0x16:
14421424            m_ext_address &= ~0xff0000;
14431425            m_ext_address |= (data & 0x7f) << 16;
14441426            m_ext_rw = (data & 0x80) ? 1 : 0;
14451427            break;
1428
14461429         case 0x17:
14471430            m_ext_address = (m_ext_address + 1) & 0x7fffff;
14481431            if (!m_ext_rw && !m_ext_write_handler.isnull())
14491432               m_ext_write_handler(m_ext_address, data);
14501433            break;
1434         
1435         case 0x20:
1436         case 0x21:
1437         case 0x22:
1438            // test
1439            break;
14511440
14521441         default:
14531442            break;
r23978r23979
14641453      case 0:
14651454         m_reg0 = data;
14661455         break;
1456
14671457      case 1:
14681458         ymf271_write_fm(0, m_reg0, data);
14691459         break;
1460
14701461      case 2:
14711462         m_reg1 = data;
14721463         break;
1464
14731465      case 3:
14741466         ymf271_write_fm(1, m_reg1, data);
14751467         break;
1468
14761469      case 4:
14771470         m_reg2 = data;
14781471         break;
1472
14791473      case 5:
14801474         ymf271_write_fm(2, m_reg2, data);
14811475         break;
1476
14821477      case 6:
14831478         m_reg3 = data;
14841479         break;
1480
14851481      case 7:
14861482         ymf271_write_fm(3, m_reg3, data);
14871483         break;
1484
14881485      case 8:
14891486         m_pcmreg = data;
14901487         break;
1488
14911489      case 9:
14921490         ymf271_write_pcm(data);
14931491         break;
1492
14941493      case 0xc:
14951494         m_timerreg = data;
14961495         break;
1496
14971497      case 0xd:
14981498         ymf271_write_timer(data);
14991499         break;
1500
15001501      default:
15011502         break;
15021503   }
r23978r23979
16641665      save_item(NAME(m_slots[i].lfo_amplitude), i);
16651666   }
16661667
1667   for (i = 0; i < sizeof(m_groups) / sizeof(m_groups[0]); i++)
1668   for (i = 0; i < ARRAY_LENGTH(m_groups); i++)
16681669   {
16691670      save_item(NAME(m_groups[i].sync), i);
16701671      save_item(NAME(m_groups[i].pfm), i);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team