Beispiel #1
0
 public EFCDRV(PMD pmd, PW pw, x86Register r, Func <ChipDatum, int> ppsdrv)
 {
     this.pmd    = pmd;
     this.pw     = pw;
     this.r      = r;
     this.ppsdrv = ppsdrv;
 }
Beispiel #2
0
 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;
 }
Beispiel #3
0
        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();
        }
Beispiel #4
0
 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;
 }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        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);
            }
        }