Subversion Repositories pentevo

Rev

Rev 979 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. #include "../std.h"
  2.  
  3. #include "../emul.h"
  4. #include "../vars.h"
  5. #include "emul_2203.h"
  6. /*
  7.    YM-2149F emulator for Unreal Speccy project
  8.    created under public domain license by SMT, jan.2006
  9. */
  10.  
  11. #include "sndchip.h"
  12. /* [vv]
  13. unsigned SNDCHIP::render(AYOUT *src, unsigned srclen, unsigned clk_ticks, bufptr_t dst)
  14. {
  15.    start_frame(dst);
  16.    for (unsigned index = 0; index < srclen; index++) {
  17.       // if (src[index].timestamp > clk_ticks) continue; // wrong input data leads to crash
  18.       select(src[index].reg_num);
  19.       write(src[index].timestamp, src[index].reg_value);
  20.    }
  21.    return end_frame(clk_ticks);
  22. }
  23. */
  24.  
  25. const unsigned MULT_C_1 = 14; // fixed point precision for 'system tick -> ay tick'
  26. // b = 1+ln2(max_ay_tick/8) = 1+ln2(max_ay_fq/8 / min_intfq) = 1+ln2(10000000/(10*8)) = 17.9
  27. // assert(b+MULT_C_1 <= 32)
  28.  
  29. void SNDCHIP::start_frame(bufptr_t dst)
  30. {
  31.    r13_reloaded = 0;
  32.    SNDRENDER::start_frame(dst);
  33. }
  34.  
  35. unsigned SNDCHIP::end_frame(unsigned clk_ticks)
  36. {
  37.    // adjusting 't' with whole history will fix accumulation of rounding errors
  38.  
  39.    uint64_t end_chip_tick = ((passed_clk_ticks + clk_ticks) * chip_clock_rate) / system_clock_rate;
  40.  
  41.    flush( (unsigned) (end_chip_tick - passed_chip_ticks) );
  42.    unsigned res = SNDRENDER::end_frame(t);
  43.  
  44.    passed_clk_ticks += clk_ticks;
  45.    passed_chip_ticks += t; t = 0;
  46.    nextfmtickfloat = 0.; //Alone Coder
  47.    nextfmtick = 0; //Alone Coder
  48.  
  49.    return res;
  50. }
  51.  
  52. void SNDCHIP::flush(unsigned chiptick) // todo: noaction at (temp.sndblock || !conf.sound.ay)
  53. {
  54.     while(t < chiptick)
  55.     {
  56.         t++;
  57.         if(++ta >= fa)
  58.         {
  59.             ta = 0;
  60.             bitA ^= -1U;
  61.         }
  62.         if(++tb >= fb)
  63.         {
  64.             tb = 0;
  65.             bitB ^= -1U;
  66.         }
  67.         if(++tc >= fc)
  68.         {
  69.             tc = 0;
  70.             bitC ^= -1U;
  71.         }
  72.         if(++tn >= fn)
  73.         {
  74.             tn = 0;
  75.             ns = (ns * 2 + 1) ^ (((ns >> 16) ^ (ns >> 13)) & 1);
  76.             bitN = 0 - ((ns >> 16) & 1);
  77.         }
  78.         if(++te >= fe)
  79.         {
  80.             te = 0;
  81.             env = unsigned(int(env) + denv);
  82.             if(env & ~31U)
  83.             {
  84.                 unsigned mask = (1 << r.env);
  85.                 if(mask & ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 9) | (1 << 15)))
  86.                     env = denv = 0;
  87.                 else if(mask & ((1 << 8) | (1 << 12)))
  88.                     env &= 31;
  89.                 else if(mask & ((1 << 10) | (1 << 14)))
  90.                 {
  91.                     denv = -denv;
  92.                     env = unsigned(int(env) + denv);
  93.                 }
  94.                 else
  95.                 {
  96.                     env = 31; denv = 0;
  97.                 } //11,13
  98.             }
  99.         }
  100.  
  101.         unsigned en, mix_l, mix_r;
  102.  
  103.         en = ((ea & env) | va) & ((bitA | bit0) & (bitN | bit3));
  104.         mix_l = vols[0][en]; mix_r = vols[1][en];
  105.  
  106.         en = ((eb & env) | vb) & ((bitB | bit1) & (bitN | bit4));
  107.         mix_l += vols[2][en]; mix_r += vols[3][en];
  108.  
  109.         en = ((ec & env) | vc) & ((bitC | bit2) & (bitN | bit5));
  110.         mix_l += vols[4][en]; mix_r += vols[5][en];
  111.         //YM2203 here
  112.         if(/*temp.sndblock ||*/ conf.sound.ay_chip == CHIP_YM2203)
  113.         {
  114.             if(t >= nextfmtick)
  115.             {
  116.                 nextfmtickfloat += ayticks_per_fmtick;
  117.                 nextfmtick = unsigned(nextfmtickfloat);
  118.                 if(++FMbufN == FMBUFSIZE)
  119.                 {
  120.                     YM2203UpdateOne(Chip2203, FMbufs/*&FMbuf*/, FMBUFSIZE/*1*/);
  121.                     FMbufN = 0;
  122.                 };
  123.                 if(fmsoundon0 == 0)
  124.                 {
  125.                     //FMbufOUT=(int)(FMbuf*conf.sound.ay/8192*0.7f);
  126.                     FMbufOUT = ((((INT16)FMbufs[FMbufN])*FMbufMUL) >> 16);
  127.                 }
  128.                 else FMbufOUT = 0;
  129.             }
  130.             mix_l = unsigned(int(mix_l) + FMbufOUT);
  131.             mix_r = unsigned(int(mix_r) + FMbufOUT);
  132.         }; //Alone Coder
  133.   //
  134.         if((mix_l ^ SNDRENDER::mix_l) | (mix_r ^ SNDRENDER::mix_r)) // similar check inside update()
  135.             update(t, mix_l, mix_r);
  136.     }
  137. }
  138.  
  139. void SNDCHIP::select(unsigned char nreg)
  140. {
  141.    if (chiptype == CHIP_AY) nreg &= 0x0F;
  142.    activereg = nreg;
  143. }
  144.  
  145. void SNDCHIP::write(unsigned timestamp, unsigned char val)
  146. {
  147.    if (activereg >= 0x20 && conf.sound.ay_chip == CHIP_YM2203)
  148.    {
  149.       if (timestamp) flush((timestamp * mult_const) >> MULT_C_1); // cputick * ( (chip_clock_rate/8) / system_clock_rate );
  150.       if (activereg >= 0x2d && activereg <= 0x2f) {
  151.          int oldayfq=Chip2203->OPN.ST.SSGclock /*ayfq*/;
  152.          YM2203Write(Chip2203,0,activereg);
  153.          YM2203Write(Chip2203,1,val);
  154.          if (oldayfq!=Chip2203->OPN.ST.SSGclock) {
  155.             //if (!conf.sound.ay_samples) flush(cpu.t);
  156.             //ayfq=Chip2203->OPN.ST.SSGclock;
  157.             //t=(unsigned)((__int64)t*ayfq/oldayfq);
  158.             //mult_const2 = ((ayfq/conf.intfq) << (MULT_C_1-3))/conf.frame;
  159.             //mult_const3 = TICK_F/2+(unsigned)((__int64)temp.snd_frame_ticks*conf.intfq*(1<<(MULT_C+3))/ayfq);
  160.             //ay_div = ((unsigned)((double)ayfq*0x10*(double)SAMPLE_T/(double)conf.sound.fq));
  161.             //ay_div2 = (ayfq*0x100)/(conf.sound.fq/32);
  162.                         set_timings(system_clock_rate,unsigned(Chip2203->OPN.ST.SSGclock),SNDRENDER::sample_rate);
  163.          }
  164.       }
  165.       else
  166.       {
  167.          YM2203Write(Chip2203,0,activereg);
  168.          YM2203Write(Chip2203,1,val);
  169.       }
  170.       return;
  171.    } //Dexus
  172.  
  173.    if (activereg >= 0x10) return;
  174.  
  175.    if ((1 << activereg) & ((1<<1)|(1<<3)|(1<<5)|(1<<13))) val &= 0x0F;
  176.    if ((1 << activereg) & ((1<<6)|(1<<8)|(1<<9)|(1<<10))) val &= 0x1F;
  177.  
  178.    if (activereg != 13 && reg[activereg] == val) return;
  179.  
  180.    reg[activereg] = val;
  181.  
  182.  
  183.    if (timestamp) flush((timestamp * mult_const) >> MULT_C_1); // cputick * ( (chip_clock_rate/8) / system_clock_rate );
  184.  
  185.    switch (activereg) {
  186.       case 0:
  187.       case 1:
  188.          fa = r.fA;
  189.          break;
  190.       case 2:
  191.       case 3:
  192.          fb = r.fB;
  193.          break;
  194.       case 4:
  195.       case 5:
  196.          fc = r.fC;
  197.          break;
  198.       case 6:
  199.          if (val==0) val++; //fixed noise 0/ 2021.11.24 /Dexus
  200.          fn = val*2;
  201.          break;
  202.       case 7:
  203.          bit0 = 0 - ((val>>0) & 1);
  204.          bit1 = 0 - ((val>>1) & 1);
  205.          bit2 = 0 - ((val>>2) & 1);
  206.          bit3 = 0 - ((val>>3) & 1);
  207.          bit4 = 0 - ((val>>4) & 1);
  208.          bit5 = 0 - ((val>>5) & 1);
  209.          break;
  210.       case 8:
  211.          ea = unsigned((val & 0x10)? -1 : 0);
  212.          va = ((val & 0x0F)*2+1) & ~ea;
  213.          break;
  214.       case 9:
  215.          eb = unsigned((val & 0x10)? -1 : 0);
  216.          vb = ((val & 0x0F)*2+1) & ~eb;
  217.          break;
  218.       case 10:
  219.          ec = unsigned((val & 0x10) ? -1 : 0);
  220.          vc = ((val & 0x0F)*2+1) & ~ec;
  221.          break;
  222.       case 11:
  223.       case 12:
  224.          fe = r.envT;
  225.          break;
  226.       case 13:
  227.          r13_reloaded = 1;
  228.          te = 0;
  229.          if(r.env & 4)
  230.          {
  231.              env = 0; denv = 1;
  232.          } // attack
  233.          else
  234.          {
  235.              env = 31; denv = -1;
  236.          } // decay
  237.          break;
  238.    }
  239. }
  240.  
  241. unsigned char SNDCHIP::read()
  242. {
  243.    if (activereg >= 0x10) return 0xFF;
  244.    return reg[activereg & 0x0F];
  245. }
  246.  
  247. void SNDCHIP::set_timings(unsigned system_clock_rate, unsigned chip_clock_rate, unsigned sample_rate)
  248. {
  249.    if (conf.sound.ay_chip == CHIP_YM2203) { //install YM2203 frequencies
  250.          Chip2203->OPN.ST.clock = int(conf.sound.ayfq*2);
  251.          Chip2203->OPN.ST.rate = int(conf.sound.fq) /*44100*/;
  252.          OPNPrescaler_w(&Chip2203->OPN, 1 , 1 );
  253.          //ayfq=Chip2203->OPN.ST.SSGclock;
  254.                  //┬юЄ ЄєЄ ъръ Ёрч ayfq фрхЄ єцх "єьэюцхээє■" ўрёЄюЄє, ъюЄюЁє■ ш эєцэю тч Є№ чр юёэютє.
  255.          chip_clock_rate = unsigned(Chip2203->OPN.ST.SSGclock);
  256.    } //Dexus
  257.    
  258.    chip_clock_rate /= 8;
  259.  
  260.    SNDCHIP::system_clock_rate = system_clock_rate;
  261.    SNDCHIP::chip_clock_rate = chip_clock_rate;
  262.  
  263.    mult_const = (unsigned) (((uint64_t)chip_clock_rate << MULT_C_1) / system_clock_rate);
  264.    SNDRENDER::set_timings(chip_clock_rate, sample_rate);
  265.    passed_chip_ticks = passed_clk_ticks = 0;
  266.    t = 0; ns = 0xFFFF;
  267.  
  268.    nextfmtickfloat = 0.; //Alone Coder
  269.    nextfmtick = 0; //Alone Coder
  270.    ayticks_per_fmtick = (float)chip_clock_rate/conf.sound.fq /*44100*/; //Alone Coder
  271.    FMbufMUL=(UINT16)(((float)conf.sound.ay_vol/8192 /* =0..1 */)*0.1f*65536); //Alone Coder 0.36.4
  272.  
  273.    apply_regs();
  274. }
  275.  
  276. void SNDCHIP::set_volumes(unsigned global_vol, const SNDCHIP_VOLTAB *voltab, const SNDCHIP_PANTAB *stereo)
  277. {
  278.    for (int j = 0; j < 6; j++)
  279.       for (int i = 0; i < 32; i++)
  280.          vols[j][i] = (unsigned) (((uint64_t)global_vol * voltab->v[i] * stereo->raw[j])/(65535*100*3));
  281. }
  282.  
  283. void SNDCHIP::reset(unsigned timestamp)
  284. {
  285.    activereg = 0;
  286.    for (int i = 0; i < 14; i++)
  287.        reg[i] = 0;
  288.  
  289.    if (Chip2203) YM2203ResetChip((void*)Chip2203); //Dexus
  290. /*
  291.    ayfq=Chip2203->OPN.ST.SSGclock; //Dexus
  292.    mult_const2 = ((ayfq/conf.intfq) << (MULT_C_1-3))/conf.frame; //Dexus
  293.    mult_const3 = TICK_F/2+(unsigned)((__int64)temp.snd_frame_ticks*conf.intfq*(1<<(MULT_C+3))/ayfq); //Dexus
  294.    ay_div = ((unsigned)((double)ayfq*0x10*(double)SAMPLE_T/(double)conf.sound.fq)); //Dexus
  295.    ay_div2 = (ayfq*0x100)/(conf.sound.fq/32); //Dexus
  296. */
  297.    apply_regs(timestamp);
  298. }
  299.  
  300. void SNDCHIP::apply_regs(unsigned timestamp)
  301. {
  302.    unsigned char ar = activereg;
  303.    for (unsigned char r = 0; r < 16; r++)
  304.    {
  305.       select(r);
  306.       unsigned char p = reg[r];
  307.  
  308.       /* clr cached values */
  309.       write(timestamp, p ^ 1);
  310.       write(timestamp, p);
  311.    }
  312.    activereg = ar;
  313. }
  314.  
  315. SNDCHIP::SNDCHIP()
  316. {
  317.    bitA = bitB = bitC = 0;
  318.    nextfmtick = 0; //Alone Coder
  319.    set_timings(SNDR_DEFAULT_SYSTICK_RATE, SNDR_DEFAULT_AY_RATE, SNDR_DEFAULT_SAMPLE_RATE);
  320.    Chip2203 = (YM2203 *) YM2203Init(nullptr, 0, int(conf.sound.ayfq*2), int(conf.sound.fq) /*44100*/); //Dexus
  321.    set_chip(CHIP_YM);
  322.    set_volumes(0x7FFF, SNDR_VOL_YM, SNDR_PAN_ABC);
  323.    reset();
  324. }
  325.  
  326. // corresponds enum CHIP_TYPE
  327. const char * const ay_chips[] = { "AY-3-8910", "YM2149F", "YM2203" }; //Dexus
  328.  
  329.  
  330. const SNDCHIP_VOLTAB SNDR_VOL_AY_S =
  331. { { 0x0000,0x0000,0x0340,0x0340,0x04C0,0x04C0,0x06F2,0x06F2,0x0A44,0x0A44,0x0F13,0x0F13,0x1510,0x1510,0x227E,0x227E,
  332.     0x289F,0x289F,0x414E,0x414E,0x5B21,0x5B21,0x7258,0x7258,0x905E,0x905E,0xB550,0xB550,0xD7A0,0xD7A0,0xFFFF,0xFFFF } };
  333.  
  334. const SNDCHIP_VOLTAB SNDR_VOL_YM_S =
  335. { { 0x0000,0x0000,0x00EF,0x01D0,0x0290,0x032A,0x03EE,0x04D2,0x0611,0x0782,0x0912,0x0A36,0x0C31,0x0EB6,0x1130,0x13A0,
  336.     0x1751,0x1BF5,0x20E2,0x2594,0x2CA1,0x357F,0x3E45,0x475E,0x5502,0x6620,0x7730,0x8844,0xA1D2,0xC102,0xE0A2,0xFFFF } };
  337.  
  338. const SNDCHIP_PANTAB SNDR_PAN_MONO_S =
  339. { 100,100, 100,100, 100,100 };
  340.  
  341. const SNDCHIP_PANTAB SNDR_PAN_ABC_S =
  342. { 100,10,  66,66,   10,100 };
  343.  
  344. const SNDCHIP_PANTAB SNDR_PAN_ACB_S =
  345. { 100,10,  10,100,  66,66 };
  346.  
  347. const SNDCHIP_PANTAB SNDR_PAN_BAC_S =
  348. { 66,66,   100,10,  10,100 };
  349.  
  350. const SNDCHIP_PANTAB SNDR_PAN_BCA_S =
  351. { 10,100,  100,10,  66,66 };
  352.  
  353. const SNDCHIP_PANTAB SNDR_PAN_CAB_S =
  354. { 66,66,   10,100,  100,10 };
  355.  
  356. const SNDCHIP_PANTAB SNDR_PAN_CBA_S =
  357. { 10,100,  66,66,   100,10 };
  358.