public DasmUtils(Z80CPU cpu, OnRDBUS reader) { Object = cpu; memReader = reader; }
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; }