/// <summary> /// dekodiert zwei Parameter (Parameter-Größe muss bereits in <see cref="DecodeStatus.p1"/> gesetzt sein) /// </summary> /// <param name="c">Zeiger auf die aktuell zu lesende Bytefolge</param> /// <param name="cerr">Zeiger auf letztes Byte, welches nicht mehr gelesen werden darf</param> /// <param name="status">aktueller Status der Dekodierung</param> /// <param name="swap">gibt an, ob beide Parameter getauscht gelesen werden müssen</param> /// <returns>Zeiger auf das nachfolgende Byte</returns> static byte *DecodeDualParam(byte *c, byte *cerr, ref DecodeStatus status, bool swap = false) { Debug.Assert(status.p1 != ParamType.None); Debug.Assert(status.p2 != ParamType.None); byte code = *c++; if (c >= cerr) { return(cerr); } if (code < 0xc0) throw new NotImplementedException("todo: " + code.ToString("x2")); }
/// <summary> /// dekodiert eine allgemeine Instruktion /// </summary> /// <param name="c">Zeiger auf die aktuell zu lesende Bytefolge</param> /// <param name="cerr">Zeiger auf letztes Byte, welches nicht mehr gelesen werden darf</param> /// <param name="status">aktueller Status der Dekodierung</param> /// <returns>Zeiger auf das nachfolgende Byte</returns> static byte *DecodeInternal(byte *c, byte *cerr, ref DecodeStatus status) { byte code = *c++; if (c >= cerr) { return(cerr); } switch (code) { case 0x00: status.S2(Instruction.Add, ParamType.Reg8); return(DecodeDualParam(c, cerr, ref status)); case 0x06: return(cerr); case 0xcc: status.S(Instruction.Int3); return(c); default: throw new NotImplementedException("todo: " + code.ToString("x2")); } }
internal DecodedDataPck(UInt32 dataPckCrc, DecodeStatus status, DataPck decodedDataPck) { this.status = status; this.decodedDataPck = decodedDataPck; this.dataPckCrc = dataPckCrc; }