Exemple #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;
 }
Exemple #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;
 }
Exemple #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();
        }
Exemple #4
0
        public void Init(
            MmlDatum[] srcBuf,
            Action <ChipDatum> opnaWrite, Action <long, int> opnaWaitSend,
            PMDDotNETOption addtionalPMDDotNETOption, string[] addtionalPMDOption,
            Func <string, Stream> appendFileReaderCallback
            , Func <ChipDatum, int> ppz8Write, Func <ChipDatum, int> ppsdrvWrite, Func <ChipDatum, int> p86Write)
        {
            if (srcBuf == null || srcBuf.Length < 1)
            {
                return;
            }

            Driver.srcBuf = srcBuf;

            WriteOPNA    = opnaWrite;
            WaitSendOPNA = opnaWaitSend;
            WritePPZ8    = ppz8Write;
            WritePPSDRV  = ppsdrvWrite;
            WriteP86     = p86Write;

            work = new PW();
            GetTags();
            addtionalPMDDotNETOption.PPCHeader = CheckPPC(appendFileReaderCallback);

            work.SetOption(addtionalPMDDotNETOption, addtionalPMDOption);
            work.timer = new OPNATimer(44100, 7987200);

            //PPZ8em ppz8em = addtionalPMDDotNETOption.ppz8em;
            //PPSDRV ppsdrv = addtionalPMDDotNETOption.ppsdrv;

            pmd = new PMD(
                srcBuf,
                WriteRegister,
                work,
                appendFileReaderCallback,
                WritePPZ8,
                WritePPSDRV,
                WriteP86
                );

            if (!string.IsNullOrEmpty(pmd.pw.ppcFile))
            {
                pmd.pcmload.pcm_all_load(pmd.pw.ppcFile);
            }
            if (!string.IsNullOrEmpty(pmd.pw.ppz1File) || !string.IsNullOrEmpty(pmd.pw.ppz2File))
            {
                pmd.pcmload.ppz_load(pmd.pw.ppz1File, pmd.pw.ppz2File);
            }
            if (!string.IsNullOrEmpty(pmd.pw.ppsFile))
            {
                pmd.pcmload.pps_load(pmd.pw.ppsFile);
            }
        }
Exemple #5
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;
 }
Exemple #6
0
 public Pc98(Action <ChipDatum> WriteOPNARegister, PW pw)
 {
     this.WriteOPNARegister = WriteOPNARegister;
     this.pw = pw;
 }
Exemple #7
0
        //_waitP      macro
        //		push    cx
        //		mov cx,[wait_clock]
        //		loop	$
        //		pop cx
        //		endm

        //_rwait      macro			;リズム連続出力用wait
        //		push    cx
        //		mov cx,[wait_clock]
        //		add cx, cx
        //		add cx, cx
        //		add cx, cx
        //		add cx, cx
        //		add cx, cx; x32
        //loop	$
        //		pop cx
        //		endm

        //rdychk      macro			;Address out時用	break:ax
        //local       loop
        //		in	al,dx		;無駄読み
        //loop:		in	al,dx
        //		test    al,al
        //		js  loop
        //		endm

        //_ppz macro
        //local exit
        //if		ppz
        //		cmp[ppz_call_seg],2
        //		jc exit
        //		call dword ptr[ppz_call_ofs]
        //exit:
        //endif
        //		endm


        public PMD()
        {
            pw = new PW();
        }
Exemple #8
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);
        }
Exemple #9
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);
            }
        }