4 static struct t_operand dummy = { IS_REG, AX, 0, 0, 0};
5 struct t_operand saved_op, *AX_oper = &dummy;
10 saved_op.type = op->type;
11 saved_op.reg = op->reg;
12 saved_op.expr = op->expr;
13 saved_op.lab = op->lab;
14 saved_op.off = op->off;
17 #define last( s) ( s + strlen( s) - 1)
22 block_assemble( instr, nr, first, Last)
29 if( strncmp( instr[0], "pop", 3) == 0) {
37 if ( Last && strncmp( instr[nr-1], "push", 4) == 0) {
39 *( instr[nr-1]+1) = 'U';
40 *( instr[nr-1]+2) = 'S';
41 *( instr[nr-1]+3) = 'H';
61 process_operand( str, op)
65 /* expr -> IS_DATA en IS_LABEL
66 * reg -> IS_REG en IS_ACCU
71 char *ptr, *strindex();
74 if ( *last( str) == RIGHT) {
75 ptr = strindex( str, LEFT);
78 if ( is_reg( ptr+1, op)) {
80 op->expr = ( *str == '\0' ? "0" : str);
83 set_label( ptr+1, op);
88 if ( is_reg( str, op))
91 if ( contains_label( str))
102 struct t_operand *op;
104 if ( strlen( str) != 2)
109 case 'l' : switch( *str) {
110 case 'a' : op->reg = 0;
113 case 'c' : op->reg = 1;
116 case 'd' : op->reg = 2;
119 case 'b' : op->reg = 3;
122 default : return( FALSE);
125 case 'h' : switch( *str) {
126 case 'a' : op->reg = 4;
129 case 'c' : op->reg = 5;
132 case 'd' : op->reg = 6;
135 case 'b' : op->reg = 7;
138 default : return( FALSE);
141 case 'p' : switch ( *str) {
142 case 's' : op->reg = 4;
145 case 'b' : op->reg = 5;
148 default : return( FALSE);
151 case 'i' : switch ( *str) {
152 case 's' : op->reg = 6;
155 case 'd' : op->reg = 7;
158 default : return( FALSE);
161 default : return( FALSE);
166 #define isletter( c) ( isalpha( c) || c == '_')
168 int contains_label( str)
171 while( !isletter( *str) && *str != '\0')
173 if ( arg_type( str) == STRING)
180 return( isletter( *str));
185 struct t_operand *op;
187 char *ptr, *strindex(), *sprint();
188 static char buf[256];
190 ptr = strindex( str, '+');
199 if ( isdigit( *str) && ( *(str+1) == 'b' || *(str+1) == 'f') &&
201 *(str+1) = '\0'; /* b of f verwijderen! */
207 if ( strindex( str, DOLLAR) != 0)
211 op->lab = sprint( buf, "\"%s\"", str);
216 /******************************************************************************/
222 struct t_operand *op;
225 R233( 0x3, reg, op->reg);
226 else if ( ADDR( op)) {
227 R233( 0x0, reg, 0x6);
228 @reloc2( %$(op->lab), %$(op->off), ABSOLUTE);
230 else if ( strcmp( op->expr, "0") == 0)
232 case SI : R233( 0x0, reg, 0x4);
235 case DI : R233( 0x0, reg, 0x5);
238 case BP : R233( 0x1, reg, 0x6); /* Uitzondering! */
242 case BX : R233( 0x0, reg, 0x7);
245 default : fprint( STDERR, "Wrong index register %d\n",
249 @if ( fit_byte( %$(op->expr)))
251 case SI : R233( 0x1, reg, 0x4);
254 case DI : R233( 0x1, reg, 0x5);
257 case BP : R233( 0x1, reg, 0x6);
260 case BX : R233( 0x1, reg, 0x7);
263 default : fprint( STDERR, "Wrong index register %d\n",
266 @text1( %$(op->expr));
269 case SI : R233( 0x2, reg, 0x4);
272 case DI : R233( 0x2, reg, 0x5);
275 case BP : R233( 0x2, reg, 0x6);
278 case BX : R233( 0x2, reg, 0x7);
281 default : fprint( STDERR, "Wrong index register %d\n",
284 @text2( %$(op->expr));
289 mov_REG_EADDR( dst, src)
290 struct t_operand *dst, *src;
292 if ( REG(src) && dst->reg == src->reg)
293 ; /* Nothing!! result of push/pop optimization */
296 mod_RM( dst->reg, src);
304 @text1( %d( (a << 6) | ( b << 3) | c));
311 @text1( %d( (a << 3) | b));