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); }
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); }
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); }
//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(); }
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(); }
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); }
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); }
//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; }
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; } }
public override void WriteRegister(ChipDatum cd) { _Write?.Invoke(cd); }
private static void OPNBWriteP(ChipDatum dat) { OPNBWrite(0, dat); }
private void OPNBWriteS(ChipDatum dat) { OPNBInitialWrite(1, dat); }
private void OPNBWriteP(ChipDatum dat) { OPNBInitialWrite(0, dat); }
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; }
public override void WriteRegister(ChipDatum cd) { oPNAWrite(cd); }
//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; }
private static void OPNAWriteS(ChipDatum dat) { }
public void WriteRegister(ChipDatum reg) { WriteOPL4(reg); }
private static void OPNBWriteS(ChipDatum dat) { OPNBWrite(1, dat); }
//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); }
//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); }
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); }
public void WriteRegister(ChipDatum reg) { throw new NotImplementedException(); }
//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); }