void Emit1 (unsigned char OPC, ExprNode* Value) /* Emit an instruction with an one byte argument */ { long V; Fragment* F; if (IsEasyConst (Value, &V)) { /* Must be in byte range */ if (!IsByteRange (V)) { Error ("Range error (%ld not in [0..255])", V); } /* Create a literal fragment */ F = GenFragment (FRAG_LITERAL, 2); F->V.Data[0] = OPC; F->V.Data[1] = (unsigned char) V; FreeExpr (Value); } else { /* Emit the opcode */ Emit0 (OPC); /* Emit the argument as an expression */ F = GenFragment (FRAG_EXPR, 1); F->V.Expr = Value; } }
void EmitData (const void* D, unsigned Size) /* Emit data into the current segment */ { /* Make a useful pointer from Data */ const unsigned char* Data = D; /* Create lots of fragments for the data */ while (Size) { Fragment* F; /* Determine the length of the next fragment */ unsigned Len = Size; if (Len > sizeof (F->V.Data)) { Len = sizeof (F->V.Data); } /* Create a new fragment */ F = GenFragment (FRAG_LITERAL, Len); /* Copy the data */ memcpy (F->V.Data, Data, Len); /* Next chunk */ Data += Len; Size -= Len; } }
void EmitDWord (ExprNode* Expr) /* Emit one dword */ { /* Create a new fragment */ Fragment* F = GenFragment (FRAG_EXPR, 4); /* Set the data */ F->V.Expr = Expr; }
void EmitFarAddr (ExprNode* Expr) /* Emit a 24 bit expression */ { /* Create a new fragment */ Fragment* F = GenFragment (FRAG_EXPR, 3); /* Set the data */ F->V.Expr = Expr; }
void EmitByte (ExprNode* Expr) /* Emit one byte */ { /* Create a new fragment */ Fragment* F = GenFragment (FRAG_EXPR, 1); /* Set the data */ F->V.Expr = Expr; }
void EmitFill (unsigned long Count) /* Emit Count fill bytes */ { while (Count) { /* Calculate the size of the next chunk */ unsigned Chunk = (Count > 0xFFFF)? 0xFFFF : (unsigned) Count; Count -= Chunk; /* Emit one chunk */ GenFragment (FRAG_FILL, Chunk); } }
void Emit2 (unsigned char OPC, ExprNode* Value) /* Emit an instruction with a two byte argument */ { long V; Fragment* F; if (IsEasyConst (Value, &V)) { /* Must be in byte range */ if (!IsWordRange (V)) { Error ("Range error (%ld not in [0..65535])", V); } /* Create a literal fragment */ F = GenFragment (FRAG_LITERAL, 3); F->V.Data[0] = OPC; F->V.Data[1] = (unsigned char) V; F->V.Data[2] = (unsigned char) (V >> 8); FreeExpr (Value); } else {
void EmitSigned (ExprNode* Expr, unsigned Size) /* Emit a signed expression with the given size */ { Fragment* F = GenFragment (FRAG_SEXPR, Size); F->V.Expr = Expr; }
void Emit0 (unsigned char OPC) /* Emit an instruction with a zero sized operand */ { Fragment* F = GenFragment (FRAG_LITERAL, 1); F->V.Data [0] = OPC; }
} /* Create a literal fragment */ F = GenFragment (FRAG_LITERAL, 3); F->V.Data[0] = OPC; F->V.Data[1] = (unsigned char) V; F->V.Data[2] = (unsigned char) (V >> 8); FreeExpr (Value); } else { /* Emit the opcode */ Emit0 (OPC); /* Emit the argument as an expression */ F = GenFragment (FRAG_EXPR, 2); F->V.Expr = Value; } } void Emit3 (unsigned char OPC, ExprNode* Expr) /* Emit an instruction with a three byte argument */ { Emit0 (OPC); EmitFarAddr (Expr); }