예제 #1
0
 public DasmUtils(Z80CPU cpu, OnRDBUS reader)
 {
     Object = cpu;
     memReader = reader;
 }
예제 #2
0
        public static string GetMnemonic(OnRDBUS MemReader, int Addr, bool Hex, out int MnemLength)
        {
            string sbuf;
            int pos;

            int CurPtr = 0x0000;

            byte selcode = MemReader((ushort)(Addr + CurPtr));
            string Mnem;
            MnemLength = 1;
            string PrefixReg = "*prefix*";

            int PlusMinusOffsetIndex = 0;

            if (selcode == 0xCB)
            {
                CurPtr++;
                MnemLength++;
                Mnem = CBhZ80Code[MemReader((ushort)(Addr + CurPtr))];
            }
            else if (selcode == 0xED)
            {
                CurPtr++;
                MnemLength++;
                Mnem = EDhZ80Code[MemReader((ushort)(Addr + CurPtr))];
                if (Mnem.Length == 0) Mnem = "*NOP";
            }
            else if ((selcode == 0xDD) || (selcode == 0xFD))
            {
            REPREFIX_DDFD:
                selcode = MemReader((ushort)(Addr + CurPtr));
                if (selcode == 0xDD) PrefixReg = "IX";
                else PrefixReg = "IY";
                CurPtr++;
                PlusMinusOffsetIndex = 1;
                MnemLength++;
                if (MemReader((ushort)(Addr + CurPtr)) == 0xCB)
                {
                    CurPtr++;
                    MnemLength++;
                    PlusMinusOffsetIndex = 0;
                    Mnem = DDFDCBhZ80Code[MemReader((ushort)(Addr + CurPtr + 1))];

                    if (Mnem.Length == 0) MnemLength++;  // ??? for CBh
                }
                else if (MemReader((ushort)(Addr + CurPtr)) == 0xED)
                {
                    CurPtr++;
                    MnemLength++;
                    Mnem = EDhZ80Code[MemReader((ushort)(Addr + CurPtr))];
                    if (Mnem.Length == 0) Mnem = "*NOP";
                    if (Mnem[0] != '*') Mnem = "*" + Mnem; // mark undocumented as "*"...
                }
                else if ((MemReader((ushort)(Addr + CurPtr)) == 0xDD) || (MemReader((ushort)(Addr + CurPtr)) == 0xFD))     // DD/FD, DD/FD
                {
                    goto REPREFIX_DDFD;
                }
                else Mnem = DDFDhZ80Code[MemReader((ushort)(Addr + CurPtr))];

                if (Mnem.Length == 0) Mnem = "*" + DirectZ80Code[MemReader((ushort)(Addr + CurPtr))];
            }
            else Mnem = DirectZ80Code[MemReader((ushort)(Addr + CurPtr))];

            if (Mnem.IndexOf("$") < 0) return Mnem;

            do
            {
                if (Mnem.IndexOf("$R") >= 0)  // Prefix register
                {
                    pos = Mnem.IndexOf("$R");
                    if (Mnem.Length <= (pos + 1 + 1))               // ixl/ixh -> xl/xh  !!!!!
                    {
                        Mnem = Mnem.Remove(pos, 2);
                        Mnem = Mnem.Insert(pos, PrefixReg);
                    }
                    else if ((Mnem[pos + 2] == 'L') || (Mnem[pos + 2] == 'H'))
                    {
                        Mnem = Mnem.Remove(pos, 2);
                        Mnem = Mnem.Insert(pos, "" + PrefixReg[1]);
                    }
                    else
                    {
                        Mnem = Mnem.Remove(pos, 2);
                        Mnem = Mnem.Insert(pos, PrefixReg);
                    }
                }
                if (Mnem.IndexOf("$PLUS") >= 0)  // PrefixReg+-offset
                {
                    sbyte val = (sbyte)MemReader((ushort)(Addr + (CurPtr + PlusMinusOffsetIndex)));
                    int uval = val;
                    if (val < 0) uval = -uval;

                    if (val < 0)
                    {
                        if (Hex) sbuf = "-#" + uval.ToString("X2"); //sprintf(buf, "-"Z80ASMHEX"%02X", int(uval));
                        else sbuf = "-" + uval.ToString();          //sprintf(buf, "-%i", int(uval));
                    }
                    else
                    {
                        if (Hex) sbuf = "+#" + uval.ToString("X2");  //sprintf(buf, "+"Z80ASMHEX"%02X", int(uval));
                        else sbuf = "+" + uval.ToString();          //sprintf(buf, "+%i", int(uval));
                    }
                    pos = Mnem.IndexOf("$PLUS");
                    Mnem = Mnem.Remove(pos, 5);
                    Mnem = Mnem.Insert(pos, sbuf);
                    MnemLength++;
                    CurPtr++;
                }

                if (Mnem.IndexOf("$S") >= 0)  // Internal bits value
                {
                    byte code = MemReader((ushort)(Addr + CurPtr));
                    int bitadr = (code & 0x38) >> 3;

                    sbuf = bitadr.ToString();                    //sprintf(buf, "%i", int(bitadr));

                    pos = Mnem.IndexOf("$S");
                    Mnem = Mnem.Remove(pos, 2);
                    Mnem = Mnem.Insert(pos, sbuf);
                }

                if (Mnem.IndexOf("$W") >= 0)  // 2byte value
                {
                    ushort val = (ushort)(MemReader((ushort)(Addr + CurPtr + 1)) + 256 * MemReader((ushort)(Addr + CurPtr + 2)));
                    if (Hex) sbuf = "#" + val.ToString("X4");       // sprintf(buf, Z80ASMHEX"%04X", int(val));
                    else sbuf = val.ToString();                  // sprintf(buf, "%i", int(val));

                    pos = Mnem.IndexOf("$W");
                    Mnem = Mnem.Remove(pos, 2);
                    Mnem = Mnem.Insert(pos, sbuf);
                    MnemLength += 2;
                }

                if (Mnem.IndexOf("$N") >= 0)  // 1byte value
                {
                    byte val = MemReader((ushort)(Addr + CurPtr + 1));
                    if (Hex) sbuf = "#" + val.ToString("X2");       //sprintf(buf, Z80ASMHEX"%02X", int(val));
                    else sbuf = val.ToString();                  //sprintf(buf, "%i", int(val));

                    pos = Mnem.IndexOf("$N");
                    Mnem = Mnem.Remove(pos, 2);
                    Mnem = Mnem.Insert(pos, sbuf);
                    MnemLength++;
                }

                if (Mnem.IndexOf("$T") >= 0)  // Internal bits value ($S)*8
                {
                    byte code = MemReader((ushort)(Addr + CurPtr));
                    int rstadr = ((code & 0x38) >> 3) * 8;

                    if (Hex) sbuf = "#" + rstadr.ToString("X2");    //sprintf(buf, Z80ASMHEX"%02X", int(rstadr));
                    else sbuf = rstadr.ToString();               //sprintf(buf, "%i", int(rstadr));

                    pos = Mnem.IndexOf("$T");
                    Mnem = Mnem.Remove(pos, 2);
                    Mnem = Mnem.Insert(pos, sbuf);
                }

                if (Mnem.IndexOf("$DIS") >= 0)  // 1byte offset value
                {
                    sbyte val = (sbyte)MemReader((ushort)(Addr + CurPtr + 1));
                    //         int adr = (Addr + 2) + val;
                    int adr = (Addr + 2 + CurPtr) + val;
                    adr = (ushort)adr;

                    if (Hex) sbuf = "#" + adr.ToString("X4");       //sprintf(buf, Z80ASMHEX"%04X", int(adr));
                    else sbuf = adr.ToString();                  //sprintf(buf, "%i", int(adr));

                    pos = Mnem.IndexOf("$DIS");
                    Mnem = Mnem.Remove(pos, 4);
                    Mnem = Mnem.Insert(pos, sbuf);
                    MnemLength++;
                }

            } while (Mnem.IndexOf("$") >= 0);

            return Mnem;
        }