public EFCDRV(PMD pmd, PW pw, x86Register r, Func <ChipDatum, int> ppsdrv) { this.pmd = pmd; this.pw = pw; this.r = r; this.ppsdrv = ppsdrv; }
public PPZDRV(PMD pmd, PW pw, x86Register r, Pc98 pc98, Func <ChipDatum, int> ppz8em, byte[][] pcmData) { this.pmd = pmd; this.pw = pw; this.r = r; this.pc98 = pc98; this.ppz8em = ppz8em; this.pcmData = pcmData; }
public PCMDRV(PMD pmd, PW pw, x86Register r, Pc98 pc98, PPZDRV ppzdrv) { this.pmd = pmd; this.pw = pw; this.r = r; this.pc98 = pc98; this.ppzdrv = ppzdrv; SetupCmdtbl(); }
public PCMLOAD(PMD pmd, PW pw, x86Register r, Pc98 pc98 , Func <ChipDatum, int> ppz8em , Func <ChipDatum, int> ppsdrv , Func <ChipDatum, int> p86em , Func <string, Stream> appendFileReaderCallback) { this.pmd = pmd; this.pw = pw; this.r = r; this.pc98 = pc98; this.ppz8em = ppz8em; this.ppsdrv = ppsdrv; this.p86em = p86em; this.appendFileReaderCallback = appendFileReaderCallback; }
/// <summary> /// ドライバ固有のタグを取得 /// </summary> public List <Tuple <string, string> > GetTags() { List <Tuple <string, string> > tags = new List <Tuple <string, string> >(); x86Register lr = new x86Register(); PW lpw = new PW(); lpw.mmlbuf = 1; lpw.md = srcBuf; string str; ushort adr = get_memo(1, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("title", str)); } adr = get_memo(2, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("composer", str)); } adr = get_memo(3, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("arranger", str)); } int al = 4; str = ""; do { adr = get_memo(al, lr, lpw); if (adr != 0) { str += "\r\n" + getNRDString(ref adr); } al++; } while (adr != 0); str = str != "" ? str.Substring(2) : ""; if (!string.IsNullOrEmpty(str)) { tags.Add(new Tuple <string, string>("memo", str)); } adr = get_memo(0, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("PCMFile", str)); if (work != null) { work.ppcFile = str.Trim(); } } adr = get_memo(-1, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("PPSFile", str)); if (work != null) { work.ppsFile = str.Trim(); } } adr = get_memo(-2, lr, lpw); if (adr != 0) { str = getNRDString(ref adr); tags.Add(new Tuple <string, string>("PPZFile", str)); if (work != null) { work.ppz1File = str.Trim(); string[] p = work.ppz1File.Split(','); if (p.Length > 1) { work.ppz1File = p[0]; work.ppz2File = p[1]; } } } return(tags); }
public ushort get_memo(int al, x86Register r, PW pw) { try { r.al = (byte)al; r.si = (ushort)pw.mmlbuf; if (pw.md[r.si].dat != 0x1a) { goto getmemo_errret;//;音色がないfile=メモのアドレス取得不能 } r.si += 0x18; r.si = (ushort)(pw.md[r.si].dat + pw.md[r.si + 1].dat * 0x100); r.si += (ushort)pw.mmlbuf; r.si -= 4; r.bx = (ushort)(pw.md[r.si + 2].dat + pw.md[r.si + 3].dat * 0x100); //;bh=0feh,bl=ver if (r.bl == 0x40) //;Ver4.0 & 00Hの場合 { goto getmemo_exec; } if (r.bh != 0xfe) { goto getmemo_errret;//;Ver.4.1以降は 0feh } if (r.bl < 0x41) { goto getmemo_errret;//;MC version 4.1以前だったらError } getmemo_exec :; if (r.bl < 0x42)//;Ver.4.2以降か? { goto getmemo_oldver41; } r.al++; //; ならalを +1 (0FFHで#PPSFile) getmemo_oldver41 :; if (r.bl < 0x48) //;Ver.4.8以降か? { goto getmemo_oldver47; } r.al++;//; ならalを +1 (0FEHで#PPZFile) getmemo_oldver47 :; r.si = (ushort)(pw.md[r.si].dat + pw.md[r.si + 1].dat * 0x100); r.si += (ushort)pw.mmlbuf; r.al++; getmemo_loop :; r.dx = (ushort)(pw.md[r.si + 0].dat + pw.md[r.si + 1].dat * 0x100); if (r.dx == 0) { goto getmemo_errret; } r.si += 2; r.al--; if (r.al != 0) { goto getmemo_loop; } getmemo_exit :; r.dx += (ushort)pw.mmlbuf; pw.ds_push = 0;// r.cs; セグメントなし pw.dx_push = r.dx; return(r.dx); getmemo_errret :; pw.ds_push = 0; pw.dx_push = 0; return(0); } catch { Log.WriteLine(LogLevel.WARNING, "メモのアドレスが範囲外を指していることを検出しました。無視します。"); pw.ds_push = 0; pw.dx_push = 0; return(0); } }