Beispiel #1
0
        private Func <object> pansetz_main()
        {
            //IDE向け
            ChipDatum cd = new ChipDatum(-1, -1, -1);

            cd.addtionalData = new MmlDatum(-1, enmMMLType.Pan, pw.cmd.linePos
                                            , (int)r.al
                                            );
            pmd.WriteDummy(cd);

            pw.partWk[r.di].fmpan = r.al;
            r.dx = 0;
            r.dl = r.al;
            r.ah = 0x13;
            r.al = pw.partb;
            cd   = new ChipDatum(0x13, r.al, r.dx);
            ppz8em(cd);//.SetPan(r.al, r.dx);
            return(null);
        }
Beispiel #2
0
 private static void OPNAWrite(ChipDatum dat)
 {
     if (dat != null && dat.addtionalData != null)
     {
         MmlDatum md = (MmlDatum)dat.addtionalData;
         if (md.linePos != null)
         {
             Log.WriteLine(LogLevel.TRACE, string.Format("! r{0} c{1}"
                                                         , md.linePos.row
                                                         , md.linePos.col
                                                         ));
         }
     }
     if (dat.address == -1)
     {
         return;
     }
     //Log.WriteLine(LogLevel.TRACE, string.Format("FM P{2} Out:Adr[{0:x02}] val[{1:x02}]", (int)dat.address, (int)dat.data,dat.port));
     mds.WriteYM2608(0, (byte)dat.port, (byte)dat.address, (byte)dat.data);
 }
Beispiel #3
0
        private static void OPNAWrite(ChipDatum dat)
        {
            if (dat != null && dat.addtionalData != null)
            {
                MmlDatum md = (MmlDatum)dat.addtionalData;
                if (md.linePos != null)
                {
                    Log.WriteLine(LogLevel.TRACE, string.Format("! r{0} c{1}"
                                                                , md.linePos.row
                                                                , md.linePos.col
                                                                ));
                }
            }
            if (dat.address == -1)
            {
                return;
            }

            vw.WriteYM2608(0, (byte)dat.port, (byte)dat.address, (byte)dat.data);
        }
Beispiel #4
0
        //289-
        public void pps_load(string ppsFile)
        {
            //cld
            //r.stack.Push(r.ds);
            //r.stack.Push(r.es);
            r.stack.Push(r.bx);
            r.stack.Push(r.cx);
            r.stack.Push(r.dx);
            r.stack.Push(r.si);
            r.stack.Push(r.di);
            r.stack.Push(r.bp);

            pw.filename_ofs = ppsFile; // r.ax;
            pw.filename_seg = 0;       // r.ds;
            pw.pcmdata_ofs  = r.di;
            pw.pcmdata_seg  = 0;       // r.es;

            pmd.ppsdrv_check();
            if (r.carry)
            {
                goto not_load;
            }

            r.ah = 0x4;
            ChipDatum cd = new ChipDatum(0x04, 0, 0);

            ppsdrv(cd);//.int04();

            pps_load_main();

            not_load :;
            r.bp = r.stack.Pop();
            r.di = r.stack.Pop();
            r.si = r.stack.Pop();
            r.dx = r.stack.Pop();
            r.cx = r.stack.Pop();
            r.bx = r.stack.Pop();
            //r.es = r.stack.Pop();
            //r.ds = r.stack.Pop();
        }
Beispiel #5
0
        public void effgo()
        {
            if (pw.ppsdrv_flag == 0)
            {
                goto effgo2;
            }
            r.al             |= 0x80;
            r.zero            = pw.last_shot_data == r.al;
            pw.last_shot_data = r.al;
            if (!r.zero)
            {
                goto effgo2;
            }
            r.stack.Push(r.ax);
            r.ah = 0;
            ChipDatum cd = new ChipDatum(0x02, 0, 0);

            ppsdrv(cd);//.Stop();
            r.ax = r.stack.Pop();
            effgo2 :;
            pw.hosei_flag = 3;
            eff_main();
        }
Beispiel #6
0
        private static void OPMWrite(int chipId, ChipDatum dat)
        {
            if (dat != null && dat.addtionalData != null)
            {
                MmlDatum md = (MmlDatum)dat.addtionalData;
                if (md.linePos != null)
                {
                    Log.WriteLine(LogLevel.TRACE, string.Format("! OPM i{0} r{1} c{2}"
                                                                , chipId
                                                                , md.linePos.row
                                                                , md.linePos.col
                                                                ));
                }
            }
            if (dat.address == -1)
            {
                return;
            }

            Log.WriteLine(LogLevel.TRACE, string.Format("Out OPM Chip:{0} Port:{1} Adr:[{2:x02}] val[{3:x02}]", chipId, dat.port, (int)dat.address, (int)dat.data));

            vw.WriteYM2151((byte)chipId, (byte)dat.address, (byte)dat.data);
        }
Beispiel #7
0
        private void OPMInitialWrite(int ChipID, ChipDatum dat)
        {
            if (!initPhase)
            {
                OPMWrite(ChipID, dat);
                return;
            }

            outDatum od = null;

            if (dat.addtionalData is musicDriverInterface.MmlDatum)
            {
                musicDriverInterface.MmlDatum md = (musicDriverInterface.MmlDatum)dat.addtionalData;
                if (md.linePos != null)
                {
                    md.linePos.srcMMLID = filename;
                }
                od = new outDatum(md.type, md.args, md.linePos, (byte)md.dat);
            }

            SoundManager.PackData p = new SoundManager.PackData(od, chipRegister.YM2151[ChipID], EnmDataType.Block, dat.address, dat.data, null);
            pd[ChipID + 4].Add(p);
        }
Beispiel #8
0
        //696-716
        //;==============================================================================
        //;	PPZ KEYON
        //;==============================================================================
        private void keyonz()
        {
            if (pw.partWk[r.di].onkai == 0xff) //-1
            {
                goto keyonz_ret;
            }

            //;;	xor dx, dx
            //;;	mov dl, fmpan[di]
            //;;	mov ah,13h
            //;;	mov al,[partb]
            //;;	call ppz8_call

            r.ah  = 1;
            r.al  = pw.partb;
            r.dl  = pw.partWk[r.di].voicenum;
            r.dh  = r.dl;
            r.dx &= 0x807f;//; dx=voicenum
            ChipDatum cd = new ChipDatum(0x01, r.al, r.dx);

            ppz8em(cd);//.PlayPCM(r.al, r.dx);//; ppz keyon
            keyonz_ret :;
            return;
        }
Beispiel #9
0
        private static void OPMWrite(int chipId, ChipDatum dat)
        {
            if (dat != null && dat.addtionalData != null)
            {
                MmlDatum md = (MmlDatum)dat.addtionalData;
                if (md.linePos != null)
                {
                    //Log.WriteLine(LogLevel.TRACE, string.Format("! OPM i{0} r{1} c{2}"
                    //    , chipId
                    //    , md.linePos.row
                    //    , md.linePos.col
                    //    ));
                }
            }

            if (dat.address == -1)
            {
                return;
            }

            //if (dat.address == 0x27)// && d <= 0x1d)
            //{
            //    Log.WriteLine(LogLevel.TRACE, string.Format("Out ChipOPM:{0} Port:{1} Adr:[{2:x02}] val[{3:x02}]", chipId, dat.port, (int)dat.address, (int)dat.data));
            //}
            switch (device)
            {
            case 0:
                mds.WriteYM2151((byte)chipId, (byte)dat.address, (byte)dat.data);
                break;

            case 1:
            case 2:
                rsc.setRegister(dat.address, dat.data);
                break;
            }
        }
Beispiel #10
0
 public override void WriteRegister(ChipDatum cd)
 {
     _Write?.Invoke(cd);
 }
Beispiel #11
0
 private static void OPNBWriteP(ChipDatum dat)
 {
     OPNBWrite(0, dat);
 }
Beispiel #12
0
 private void OPNBWriteS(ChipDatum dat)
 {
     OPNBInitialWrite(1, dat);
 }
Beispiel #13
0
 private void OPNBWriteP(ChipDatum dat)
 {
     OPNBInitialWrite(0, dat);
 }
Beispiel #14
0
        private void eff_main()
        {
            //r.ds = r.cs;

            if (pw.effflag == 0)
            {
                goto eg_00;
            }
            return;//; 効果音を使用しないモード

            eg_00 :;
            if (pw.ppsdrv_flag == 0)
            {
                goto eg_nonppsdrv;
            }
            r.al |= r.al;
            if ((r.al & 0x80) == 0)
            {
                goto eg_nonppsdrv;
            }

            //; ppsdrv
            if (pw.effon >= 2)
            {
                return;                    // goto effret;// ; 通常効果音発音時は発声させない
            }
            r.bx = (ushort)pw.part9;       //; PSG 3ch
            pw.partWk[r.bx].partmask |= 2; //; Part Mask
            pw.effon     = 1;              //; 優先度1(ppsdrv)
            pw.psgefcnum = r.al;           //; 音色番号設定(80H~)

            r.bx = 15;
            r.ah = pw.hosei_flag;
            r.ah = r.ror(r.ah, 1);
            if (!r.carry)
            {
                goto not_tone_hosei;
            }
            r.bx = pw.partWk[r.di].detune;
            r.bh = r.bl;//; BH = Detuneの下位 8bit
            r.bl = 15;
            not_tone_hosei :;
            r.ah = r.ror(r.ah, 1);
            if (!r.carry)
            {
                goto not_volume_hosei;
            }
            r.ah = pw.partWk[r.di].volume;
            if (r.ah >= 15)
            {
                goto fade_hosei;
            }
            r.bl = r.ah;//; BL = volume値(0~15)
            fade_hosei :;
            r.ah = pw.fadeout_volume;
            if (r.ah == 0)
            {
                goto not_volume_hosei;
            }
            r.stack.Push(r.ax);
            r.al = r.bl;
            r.ah = (byte)-r.ah;
            r.ax = (ushort)(r.al * r.ah);
            r.bl = r.ah;
            r.ax = r.stack.Pop();
            not_volume_hosei :;
            if (r.bl == 0)
            {
                goto ppsdrm_ret;
            }
            r.bl ^= 0b0000_1111; //volume
            r.ah  = 1;           //command
            r.al &= 0x7f;        //num?

            ChipDatum cd = new ChipDatum(-1, -1, -1);

            cd.addtionalData = pw.cmd;
            pmd.WriteOPNARegister(cd);
            if (pw.cmd != null && pw.cmd.args != null && pw.cmd.args.Count > 2 && pw.cmd.args[2] is MmlDatum[])
            {
                foreach (MmlDatum md in (MmlDatum[])pw.cmd.args[2])
                {
                    pmd.ExecIDESpecialCommand(md);
                }
            }

            cd = new ChipDatum(0x01, (r.al << 8) | r.bh, r.bl);
            ppsdrv(cd);//.Play(r.al, r.bh, r.bl);//; ppsdrv keyon
            ppsdrm_ret :;
            return;

            //; TimerA
            eg_nonppsdrv :;
            pw.psgefcnum = r.al;
            r.ah         = 0;
            r.bx         = r.ax;
            //r.bx += r.bx;
            //r.bx = r.ax;
            //r.bx += 0;//offset efftbl

            r.al = pw.effon;
            if (r.al > pw.efftbl[r.bx].Item1) //	cmp al,[bx]; 優先順位
            {
                return;                       // goto eg_ret;
            }
            if (pw.ppsdrv_flag == 0)
            {
                goto eok_nonppsdrv;
            }
            r.ah = 0;
            cd   = new ChipDatum(0x02, 0, 0);
            ppsdrv(cd);//.Stop();//; ppsdrv 強制keyoff
            eok_nonppsdrv :;


            cd = new ChipDatum(-1, -1, -1);
            cd.addtionalData = pw.cmd;
            pmd.WriteOPNARegister(cd);
            if (pw.cmd != null && pw.cmd.args != null && pw.cmd.args.Count > 2 && pw.cmd.args[2] is MmlDatum[])
            {
                foreach (MmlDatum md in (MmlDatum[])pw.cmd.args[2])
                {
                    pmd.ExecIDESpecialCommand(md);
                }
            }


            r.si         = 0;                     // pw.efftbl[r.bx].Item2;
            r.si        += 0;                     //offset efftbl
            pw.crtEfcDat = pw.efftbl[r.bx].Item2;
            r.al         = pw.efftbl[r.bx].Item1; //; AL = 優先順位
            r.stack.Push(r.ax);
            r.bx = (ushort)pw.part9;              //; PSG 3ch
            pw.partWk[r.bx].partmask |= 2;        //; Part Mask
            efffor();                             //;1発目を発音
            r.ax     = r.stack.Pop();
            pw.effon = r.al;                      //; 優先順位を設定(発音開始)
            eg_ret :;
            return;
        }
Beispiel #15
0
 public override void WriteRegister(ChipDatum cd)
 {
     oPNAWrite(cd);
 }
Beispiel #16
0
        //568-
        //486-602
        //;==============================================================================
        //;	PPZ VOLUME SET
        //;==============================================================================
        private void volsetz()
        {
            r.al = pw.partWk[r.di].volpush;
            if (r.al != 0)
            {
                goto vsz_01;
            }
            r.al = pw.partWk[r.di].volume;
            vsz_01 :;
            r.dl = r.al;
            //;------------------------------------------------------------------------------
            //;	音量down計算
            //;------------------------------------------------------------------------------
            r.al = pw.ppz_voldown;
            if (r.al == 0)
            {
                goto ppz_fade_calc;
            }
            r.al = (byte)-r.al;
            r.ax = (ushort)(r.al * r.dl);
            r.dl = r.ah;
            //;------------------------------------------------------------------------------
            //;	Fadeout計算
            //;------------------------------------------------------------------------------
            ppz_fade_calc :;
            r.al = pw.fadeout_volume;
            if (r.al == 0)
            {
                goto ppz_env_calc;
            }
            r.al = (byte)-r.al;
            r.ax = (ushort)(r.al * r.dl);
            r.dl = r.ah;
            //;------------------------------------------------------------------------------
            //;	ENVELOPE 計算
            //;------------------------------------------------------------------------------
            ppz_env_calc :;
            r.al = r.dl;
            if (r.al == 0)//; 音量0?
            {
                goto zv_out;
            }
            if (pw.partWk[r.di].envf != 0xff)//-1
            {
                goto normal_zvset;
            }
            //; 拡張版 音量 = al * (eenv_vol + 1) / 16
            r.dl = pw.partWk[r.di].eenv_volume;
            if (r.dl == 0)
            {
                goto zv_min;
            }
            r.dl++;
            r.ax    = (ushort)(r.al * r.dl);
            r.ax  >>= 3;
            r.carry = ((r.ax & 1) != 0);
            r.ax  >>= 1;
            if (!r.carry)
            {
                goto zvset;
            }
            r.ax++;
            goto zvset;

            normal_zvset :;
            r.ah = pw.partWk[r.di].eenv_volume;//.penv;
            if ((r.ah & 0x80) == 0)
            {
                goto zvplus;
            }
            //; -
            r.ah    = (byte)-r.ah;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.carry = r.al - r.ah < 0;
            r.al   -= r.ah;
            if (!r.carry)
            {
                goto zvset;
            }
            zv_min :;
            r.al = 0;
            goto zv_out;
            //; +
            zvplus :;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.ah   += r.ah;
            r.carry = r.al + r.ah > 0xff;
            r.al   += r.ah;
            if (!r.carry)
            {
                goto zvset;
            }
            r.al = 255;
            //;------------------------------------------------------------------------------
            //;	音量LFO計算
            //;------------------------------------------------------------------------------
            zvset :;
            if ((pw.partWk[r.di].lfoswi & 0x22) == 0)
            {
                goto zv_out;
            }
            r.dx = 0;
            r.ah = r.dl;
            if ((pw.partWk[r.di].lfoswi & 0x2) == 0)
            {
                goto zv_nolfo1;
            }
            r.dx = pw.partWk[r.di].lfodat;
            zv_nolfo1 :;
            if ((pw.partWk[r.di].lfoswi & 0x20) == 0)
            {
                goto zv_nolfo2;
            }
            r.dx += pw.partWk[r.di]._lfodat;
            zv_nolfo2 :;
            if ((r.dx & 0x8000) != 0)
            {
                goto zvlfo_minus;
            }
            r.ax += r.dx;
            if (r.ah == 0)
            {
                goto zv_out;
            }
            r.al = 255;
            goto zv_out;
            zvlfo_minus :;
            r.carry = r.ax + r.dx > 0xffff;
            r.ax   += r.dx;
            if (r.carry)
            {
                goto zv_out;
            }
            r.al = 0;

            //;------------------------------------------------------------------------------
            //;	出力
            //;------------------------------------------------------------------------------
            zv_out :;
            if (r.al == 0)
            {
                goto zv_cut;
            }
            r.dh   = 0;
            r.dl   = r.al;
            r.dx >>= 1;
            r.dx >>= 1;
            r.dx >>= 1;
            r.dx >>= 1;    //; dx = volume(0~15)
            r.ah   = 0x07;
            r.al   = pw.partb;
            ChipDatum cd = new ChipDatum(0x07, r.al, r.dx);

            ppz8em(cd);//.SetVolume(r.al, r.dx);
            return;

            zv_cut :;
            r.ah             = 0x02;
            r.al             = pw.partb;
            cd               = new ChipDatum(0x02, r.al, 0);
            cd.addtionalData = pw.cmd;
            ppz8em(cd);//.StopPCM(r.al);// ; volume = 0... keyoff
            return;
        }
Beispiel #17
0
 private static void OPNAWriteS(ChipDatum dat)
 {
 }
Beispiel #18
0
 public void WriteRegister(ChipDatum reg)
 {
     WriteOPL4(reg);
 }
Beispiel #19
0
 private static void OPNBWriteS(ChipDatum dat)
 {
     OPNBWrite(1, dat);
 }
Beispiel #20
0
        //412-467
        //352-397
        //;==============================================================================
        //;	ポルタメント(PCM)
        //;==============================================================================
        private Func <object> portaz()
        {
            if (pw.partWk[r.di].partmask != 0)
            {
                //return pmd.porta_notset;
                r.al = (byte)pw.md[r.si++].dat;//;最初の音程を読み飛ばす(Mask時)
                return(null);
            }

            ChipDatum cd = new ChipDatum(-1, -1, -1);

            cd.addtionalData = pw.cmd;
            ppz8em(cd);

            //pop ax; commandsp
            r.al = (byte)pw.md[r.si++].dat;
            pmd.lfoinitp();
            pmd.oshift();
            fnumsetz();

            r.ax = pw.partWk[r.di].fnum;
            r.stack.Push(r.ax);
            r.ax = pw.partWk[r.di].fnum2;
            r.stack.Push(r.ax);
            r.al = pw.partWk[r.di].onkai;
            r.stack.Push(r.ax);

            r.al = (byte)pw.md[r.si++].dat;
            pmd.oshift();
            fnumsetz();
            r.dx = pw.partWk[r.di].fnum2;
            r.ax = pw.partWk[r.di].fnum;//; ax = ポルタメント先のdelta_n値

            r.bx = r.stack.Pop();
            pw.partWk[r.di].onkai = r.bl;
            r.cx = r.stack.Pop();
            pw.partWk[r.di].fnum2 = r.cx;
            r.bx = r.stack.Pop();//; bx = ポルタメント元のdelta_n値
            pw.partWk[r.di].fnum = r.bx;

            r.carry = r.ax < r.bx;
            r.ax   -= r.bx;
            r.dx   -= (ushort)(r.cx + (r.carry ? 1 : 0));//; dx:ax = delta_n差

            for (int i = 0; i < 4; i++)
            {
                r.carry = (r.dx & 1) != 0;
                r.dx  >>= 1;
                //bool c = (r.ax & 1) != 0;
                r.ax = (ushort)((r.carry ? 0x8000 : 0) | (r.ax >> 1)); //; /16
                //r.carry = c;
            }

            r.bl = (byte)pw.md[r.si++].dat;
            pw.partWk[r.di].leng = r.bl;
            pmd.calc_q();

            r.bh = 0;
            int src = (short)r.ax;

            r.dx = (ushort)(src % (short)r.bx); //; ax = delta_n差 / 音長
            r.ax = (ushort)(src / (short)r.bx);
            pw.partWk[r.di].porta_num2 = r.ax;  //;商
            pw.partWk[r.di].porta_num3 = r.dx;  //;余り
            pw.partWk[r.di].lfoswi    |= 8;     //;Porta ON
            return(porta_returnz);
        }
Beispiel #21
0
        //732-
//;==============================================================================
//;	PPZ OTODASI
//;==============================================================================
        private void otodasiz()
        {
            r.cx = pw.partWk[r.di].fnum;
            r.bx = pw.partWk[r.di].fnum2;//bx:cx=fnum
            r.ax = (ushort)(r.cx | r.bx);
            if (r.ax != 0)
            {
                goto odz_00;
            }
            return;

            odz_00 :;
            //;
            //; Portament/LFO/Detune SET
            //;
            r.ax = pw.partWk[r.di].porta_num;
            if (r.ax == 0)
            {
                goto odz_not_porta;
            }
            int a = (short)r.ax;

            a      += a;
            a      += a;
            a      += a;
            a      += a;//;x16
            r.carry = (r.cx + (ushort)a) > 0xffff;
            r.cx   += (ushort)a;
            r.bx   += (ushort)((a >> 16) + (r.carry ? 1 : 0));
            odz_not_porta :;
            r.ax = 0;
            if ((pw.partWk[r.di].lfoswi & 0x11) == 0)
            {
                goto odz_not_lfo;
            }
            if ((pw.partWk[r.di].lfoswi & 0x1) == 0)
            {
                goto odz_not_lfo1;
            }
            r.ax += pw.partWk[r.di].lfodat;
            odz_not_lfo1 :;
            if ((pw.partWk[r.di].lfoswi & 0x10) == 0)
            {
                goto odz_not_lfo;
            }
            r.ax += pw.partWk[r.di]._lfodat;
            odz_not_lfo :;
            r.ax += pw.partWk[r.di].detune;
            r.dl  = r.ch;
            r.dh  = r.bl;
            a     = (short)r.ax * (short)r.dx;
            r.dx  = (ushort)(a >> 16);
            r.ax  = (ushort)a;
            if ((r.dx & 0x8000) != 0)
            {
                goto odz_minus;
            }

            bool c = r.cx + r.ax > 0xffff;

            r.cx   += r.ax;
            r.carry = (r.bx + r.dx + (c ? 1 : 0)) > 0xffff;
            r.bx   += (ushort)(r.dx + (c ? 1 : 0));
            if (!r.carry)
            {
                goto odz_main;
            }
            r.cx = 0xffff;//-1
            r.bx = 0xffff;
            goto odz_main;
            odz_minus :;
            r.carry = !((r.bx * 0x10000 + r.cx + a) < 0);
            a       = (r.bx * 0x10000 + r.cx) + a;
            r.bx    = (ushort)(a >> 16);
            r.cx    = (ushort)a;
            if (r.carry)
            {
                goto odz_main;
            }
            r.cx = 0;
            r.bx = 0;
            //;
            //; TONE SET
            //;
            odz_main :;
            r.ah = 0x0b;
            r.al = pw.partb;
            r.dx = r.bx;
            ChipDatum cd = new ChipDatum(0x0b, r.al, (r.dx << 16) | r.cx);

            ppz8em(cd);//.SetFrequency(r.al, r.dx, r.cx);
        }
Beispiel #22
0
        private Func <object> mp1z()//; DATA READ
        {
            do
            {
                pw.cmd = pw.md[r.si];

                //if (r.si == pw.jumpIndex)
                //pw.jumpIndex = -1;//KUMA:Added

                r.al = (byte)pw.md[r.si++].dat;
                if (r.al < 0x80)
                {
                    goto mp2z;
                }
                if (r.al == 0x80)
                {
                    goto mp15z;
                }

                //; ELSE COMMANDS
                object o = commandsz();
                while (o != null && (Func <object>)o != mp1z)
                {
                    o = ((Func <object>)o)();
                    if ((Func <object>)o == pmd.mnp_ret)
                    {
                        return(pmd.mnp_ret);
                    }
                    if ((Func <object>)o == porta_returnz)
                    {
                        return(porta_returnz);
                    }
                }
            } while (true);

            //; END OF MUSIC['L' ガ アッタトキハ ソコヘ モドル]
            mp15z :;

            pmd.FlashMacroList();

            r.si--;
            pw.partWk[r.di].address   = r.si; //mov[di],si
            pw.partWk[r.di].loopcheck = 3;
            pw.partWk[r.di].onkai     = 0xff; //-1
            r.bx = pw.partWk[r.di].partloop;
            if (r.bx == 0)
            {
                return(mpexitz);
            }

            //; 'L' ガ アッタトキ
            r.si = r.bx;
            pw.partWk[r.di].loopcheck = 1;
            pw.partWk[r.di].loopCounter++;
            return(mp1z);

            mp2z :;//; F - NUMBER SET
            pmd.FlashMacroList();
            pmd.lfoinitp();
            pmd.oshift();
            fnumsetz();

            ChipDatum cd = new ChipDatum(-1, -1, -1);

            cd.addtionalData = pw.cmd;
            ppz8em(cd);

            r.al = (byte)pw.md[r.si++].dat;
            pw.partWk[r.di].leng = r.al;
            pmd.calc_q();
            return(porta_returnz);
        }
Beispiel #23
0
 public void WriteRegister(ChipDatum reg)
 {
     throw new NotImplementedException();
 }
Beispiel #24
0
        //511-567
        //;==============================================================================
        //;	COMMAND '@' [NEIRO Change]
        //;==============================================================================
        private Func <object> comAtz()
        {
            Func <object> ret = null;
            ChipDatum     cd;

            r.al = (byte)pw.md[r.si++].dat;
            if (pw.ademu != 0)
            {
                if (pw.adpcm_emulate != 1)
                {
                    goto cAtz_adchk_exit;
                }
                if ((r.al & 0x80) == 0)
                {
                    goto cAtz_partchk;
                }
                r.al = 127;//; ADPCMEmulate中は @128~なら @127に強制変更
                cAtz_partchk :;
                if (pw.partb != 7)
                {
                    goto cAtz_adchk_exit;
                }
                r.bx = (ushort)pw.part10;         //; PPZADEmuPart
                pw.partWk[r.bx].partmask |= 0x10; //;Mask
                pw.partWk[r.bx].partmask &= 0xef; //;Mask off
                if (pw.partWk[r.bx].partmask != 0)
                {
                    goto cAtz_emuoff;
                }
                //r.bx = r.stack.Pop();
                ret = mp1z;//; Part復活準備
                //r.stack.Push(r.bx);
                cAtz_emuoff :;
                r.stack.Push(r.ax);
                r.ax             = 0x1800;
                pw.adpcm_emulate = r.al;
                cd = new ChipDatum(0x18, r.al, 0);
                ppz8em(cd);//.SetAdpcmEmu(r.al);//; ADPCMEmulate OFF
                r.ax = r.stack.Pop();
                cAtz_adchk_exit :;
            }
            pw.partWk[r.di].voicenum = r.al;

            //IDE向け
            cd = new ChipDatum(-1, -1, -1);
            cd.addtionalData = new MmlDatum(-1, enmMMLType.Instrument, pw.cmd.linePos
                                            , (int)0xff
                                            , (int)pw.partWk[r.di].voicenum
                                            );
            pmd.WriteDummy(cd);

            ppz_neiro_reset :;
            //    push es
            r.stack.Push(r.si);
            r.stack.Push(r.di);
            ppz_voicetable_calc();
            if (pcmData[bank] != null)
            {
                r.dx = (ushort)(pcmData[bank][ptr + 0xa] + pcmData[bank][ptr + 0xb] * 0x100);
                r.cx = (ushort)(pcmData[bank][ptr + 0x8] + pcmData[bank][ptr + 0x9] * 0x100); // dx: cx = Loop Start
                r.di = (ushort)(pcmData[bank][ptr + 0xe] + pcmData[bank][ptr + 0xf] * 0x100);
                r.si = (ushort)(pcmData[bank][ptr + 0xc] + pcmData[bank][ptr + 0xd] * 0x100); // dx: cx = Loop End
                r.ah = 0xe;
                r.al = pw.partb;
                //push es
                r.stack.Push(r.bx);
                cd = new ChipDatum((r.al << 8) | 0x0e, ((r.dx << 16) | r.cx), ((r.di << 16) | r.si));
                ppz8em(cd);//.SetLoopPoint(r.al, r.dx, r.cx, r.di, r.si);
                r.bx = r.stack.Pop();
                //pop es
                r.dx = (ushort)(pcmData[bank][ptr + 0x10] + pcmData[bank][ptr + 0x11] * 0x100);//;dx = Frequency
                r.ah = 0x15;
                r.al = pw.partb;
                cd   = new ChipDatum(0x15, r.al, r.dx);
                ppz8em(cd);//.SetSrcFrequency(r.al, r.dx);
            }
            r.di = r.stack.Pop();
            r.si = r.stack.Pop();
            //    pop es
            cAtz_exit :;
            return(ret);
        }