14 for ( ; *m != '\0'; m++)
20 process_operand( str, op)
22 register struct t_operand *op;
24 char *glob_lbl(), *strindex();
29 case '#' : op->type = IS_IMMEDIATE;
32 if ( *(op->expr) != '$') { /* #1 */
33 op->val = atoi( str+1);
34 if ( 1 <= op->val && op->val <= 8 ) {
40 if ( arg_type( str+1) == STRING) { /* #$1+$2 */
49 case '(' : if ( strindex( str+1, ',') == NULL)
50 if ( is_reg( str+1)) {
51 op->reg = reg_val( str+1);
53 if ( *(str+4) == '+') /* (sp)+ */
56 op->type = IS_IND_REG;
59 op->type = IS_IND_MEM;
61 for ( str++; *++str != ')';)
65 if ( *(op->expr) == '$')
66 if ( arg_type( op->expr) == STRING) {
69 if ( strlen( op->lbl) == 2)
78 else if ( isdigit( *(op->expr))) /* (1) */
81 op->lbl = glob_lbl( op->expr);
86 if ( *(str+1) == '[') {
87 op->type = IS_IND_IND;
89 for ( str += 2; *++str != ',';)
92 for ( ; *str == ' '; str++)
94 op->reg = reg_val( str);
96 for ( ; *str++ != ']';)
98 if ( *str == ')') /* ([$1, a6]) */
100 else { /* ([8,a6],8) */
101 for ( ; *str++ != ',';)
103 for ( ; *str == ' '; str++)
105 op->expr2 = atoi( str);
110 for ( str++; *++str != ',';)
113 for ( ; *str == ' '; str++)
115 op->reg = reg_val( str);
116 if ( *(str+2) == ')') /* (4, a0) */
117 op->type = IS_IND_REG_DISPL;
118 else { /* (0, sp, d0.l*1) */
120 for ( str++; *++str != ',';)
122 for ( ; *str == ' '; str++)
124 op->reg2 = reg_val( str);
126 for ( ; *str++ != '*';)
128 op->scale = atoi( str);
133 case '-' : op->type = IS_DECR; /* -(sp) */
134 op->reg = reg_val( str+2);
137 case '$' : op->type = IS_GLOB_LBL; /* $1 */
142 default : if ( is_reg( str)) {
143 op->reg = reg_val( str);
144 if ( *(str+2) == ':') { /* d2:d1 */
145 op->type = IS_REG_PAIR;
146 op->reg2 = reg_val( str+3);
149 op->type = ( *str == 'd' ? IS_D_REG : IS_A_REG);
151 else if ( isdigit( *str)) { /* 1f */
152 op->type = IS_LOC_LBL;
158 op->type = IS_GLOB_LBL;
159 op->lbl = glob_lbl( str);
170 return( *reg == 's' ? 7 : atoi( reg+1));
178 case 'd' : return( isdigit( *(str+1)));
180 case 's' : return( *(str+1) == 'p');
182 default : return( 0);
192 gl = Malloc( strlen( lbl) + 3);
193 sprintf( gl, "\"%s\"", lbl);
198 /******************************************************************************/
202 register struct t_operand *eaddr;
204 switch ( eaddr->type) {
205 case IS_A_REG : return( 0x08 | eaddr->reg);
207 case IS_D_REG : return( 0x00 | eaddr->reg);
209 case IS_IND_REG : return( 0x10 | eaddr->reg);
211 case IS_INCR : return( 0x18 | eaddr->reg);
213 case IS_DECR : return( 0x20 | eaddr->reg);
215 case IS_IND_MEM : return( 0x39);
217 case IS_IND_IND : return( 0x30 | eaddr->reg);
219 case IS_IND_REG_DISPL : return( 0x28 | eaddr->reg);
221 case IS_GLOB_LBL : return( 0x39);
223 case IS_3_OPS : if ( isdigit( *(eaddr->expr)) &&
224 atoi( eaddr->expr) < 128)
225 return( 0x30 | eaddr->reg);
227 fprintf( stderr, "FOUT in IS_3_OPS\n");
231 case IS_IMMEDIATE : return( 0x3c);
233 default : fprintf( stderr,
234 "mode_reg(), verkeerde operand %d\n",
242 code_extension( eaddr)
243 register struct t_operand *eaddr;
246 switch ( eaddr->type) {
247 case IS_IND_MEM : if ( eaddr->lbl == NULL)
248 @text4( %$( eaddr->expr));
250 @reloc4( %$( eaddr->lbl),
255 case IS_IND_IND : if ( eaddr->expr2 == 0) {
257 @text2( %$(eaddr->expr));
261 @text2( %$(eaddr->expr));
262 @text2( %d(eaddr->expr2));
266 case IS_IND_REG_DISPL : @text2( %$( eaddr->expr));
269 case IS_GLOB_LBL : @reloc4( %$(eaddr->lbl),
274 case IS_3_OPS : if ( isdigit( *(eaddr->expr)) &&
275 atoi( eaddr->expr) < 128) {
278 ( eaddr->reg2 << 12) |
279 ( two_log( eaddr->scale)<<9) |
280 atoi( eaddr->expr)));
283 fprintf( stderr, "FOUT in IS_3_OPS\n");
287 case IS_IMMEDIATE : if ( eaddr->lbl != NULL)
288 @reloc4( %$(eaddr->lbl),
292 @text4( %$(eaddr->expr));
298 struct t_operand *eaddr;
302 mr = mode_reg( eaddr);
303 return( ((mr & 0x7) << 3) | ((mr & 0x38) >> 3));
307 code_opcode( opcode, field1, field2, eaddr)
308 int opcode, field1, field2;
309 struct t_operand *eaddr;
311 @text2( %d(((opcode & 0xf) << 12) | ((field1 & 0x7) << 9) |
312 ((field2 & 0x7) << 6) | (mode_reg(eaddr) & 0x3f)));
316 code_instr( opcode, field1, field2, eaddr)
317 int opcode, field1, field2;
318 struct t_operand *eaddr;
320 if (eaddr->type == IS_IND_REG_DISPL) {
321 @__instr_code(%d(((opcode & 0xf) << 12) | ((field1 & 0x7) << 9) |
322 ((field2 & 0x7) << 6)),
323 %d(eaddr->reg), %$(eaddr->expr));
326 code_opcode( opcode, field1, field2, eaddr);
327 code_extension( eaddr);
332 code_move( size, src, dst)
334 struct t_operand *src, *dst;
336 if (src->type == IS_IND_REG_DISPL) {
337 if (dst->type == IS_IND_REG_DISPL) {
338 @__moveXX(%d( ((size & 0x3) << 12)),
339 %d(dst->reg), %$(dst->expr),
340 %d(src->reg), %$(src->expr));
343 @__instr_code(%d( ((size & 0x3) << 12)|((reg_mode( dst) & 0x3f) << 6)),
344 %d(src->reg), %$(src->expr));
347 else if (dst->type == IS_IND_REG_DISPL) {
348 @__move_X(%d( ((size & 0x3) << 12) | (mode_reg( src) & 0x3f)),
349 %d(dst->reg), %$(dst->expr));
352 @text2( %d( ((size & 0x3) << 12) | ((reg_mode( dst) & 0x3f) << 6) |
353 (mode_reg( src) & 0x3f)));
354 code_extension( src);
355 code_extension( dst);
361 struct t_operand *dst;
363 @reloc4( %$(dst->lbl), %$(dst->expr) + 4, PC_REL);
372 for ( log = 0; nr >= 2; nr >>= 1)