4 #define last( s) ( s + strlen( s) - 1)
9 block_assemble( instr, nr, first, Last)
17 if( strncmp( instr[0], "pop", 3) == 0) {
25 if ( Last && strncmp( instr[nr-1], "push", 4) == 0) {
27 *( instr[nr-1]+1) = 'U';
28 *( instr[nr-1]+2) = 'S';
29 *( instr[nr-1]+3) = 'H';
49 process_operand( str, op)
53 /* expr -> IS_DATA en IS_LABEL
54 * reg -> IS_REG en IS_ACCU
59 char *ptr, *strindex();
62 if ( *last( str) == RIGHT) {
63 ptr = strindex( str, LEFT);
66 if ( is_reg( ptr+1, op)) {
68 op->expr = ( *str == '\0' ? "0" : str);
71 set_label( ptr+1, op);
76 if ( is_reg( str, op))
79 if ( contains_label( str))
88 static struct regnam {
114 struct t_operand *op;
116 register struct regnam *p = regnam;
119 if (! strcmp(p->regstr, str)) {
129 #define isletter( c) ( isalpha( c) || c == '_')
131 int contains_label( str)
134 while( !isletter( *str) && *str != '\0')
136 if ( arg_type( str) == STRING)
143 return( isletter( *str));
148 struct t_operand *op;
150 char *ptr, *strindex(), *sprint();
151 static char buf[256];
153 ptr = strindex( str, '+');
162 if ( isdigit( *str) && ( *(str+1) == 'b' || *(str+1) == 'f') &&
164 *(str+1) = '\0'; /* remove b or f! */
170 if ( strindex( str, DOLLAR) != 0)
173 op->lab = sprint( buf, "\"%s\"", str);
178 /******************************************************************************/
184 struct t_operand *op;
187 R233( 0x3, reg, op->reg);
188 else if ( ADDR( op)) {
189 R233( 0x0, reg, 0x5);
190 @reloc4( %$(op->lab), %$(op->off), ABSOLUTE);
192 else if ( strcmp( op->expr, "0") == 0)
199 case SI: R233( 0x0, reg, op->reg);
202 case BP : R233( 0x1, reg, 0x6); /* Exception! */
206 default : fprint( STDERR, "Wrong index register %d\n",
210 if (isdigit(op->expr[0])) {
214 if ( l <= 127 && l >= -128) {
222 case SI : R233( 0x1, reg, op->reg);
225 default : fprint( STDERR, "Wrong index register %d\n",
228 @text1( %$(op->expr));
237 case SI : R233( 0x2, reg, op->reg);
240 default : fprint( STDERR, "Wrong index register %d\n",
243 @text4( %$(op->expr));
246 @if ( fit_byte( %$(op->expr)))
254 case SI : R233( 0x1, reg, op->reg);
257 default : fprint( STDERR, "Wrong index register %d\n",
260 @text1( %$(op->expr));
269 case SI : R233( 0x2, reg, op->reg);
272 default : fprint( STDERR, "Wrong index register %d\n",
275 @text4( %$(op->expr));
281 mv_RG_EADDR( dst, src)
282 struct t_operand *dst, *src;
284 if ( REG(src) && dst->reg == src->reg)
285 ; /* Nothing!! result of push/pop optimization */
288 mod_RM( dst->reg, src);
296 @text1( %d( (a << 6) | ( b << 3) | c));
303 @text1( %d( (a << 3) | b));
306 small_const(opc, src)
307 struct t_operand *src;
309 if (isdigit(src->expr[0])) {
313 if (l >= -128 && l <= 127) {
315 @text1(%$(src->expr));
319 @text4(%$(src->expr));
323 @if (fit_byte(%$(src->expr)))
325 @text1(%$(src->expr));
328 @text4(%$(src->expr));
333 small_RMconst(opc, reg, dst, src)
334 struct t_operand *dst, *src;
336 if (isdigit(src->expr[0])) {
340 if (l >= -128 && l <= 127) {
343 @text1(%$(src->expr));
348 @text4(%$(src->expr));
352 @if (fit_byte(%$(src->expr)))
355 @text1(%$(src->expr));
359 @text4(%$(src->expr));