@@ -283,6 +283,83 @@ int handle_db(struct assembler_state *state, char **argv, int argc) {
283
283
return 1 ;
284
284
}
285
285
286
+ int handle_dl (struct assembler_state * state , char * * argv , int argc ) {
287
+ if (argc == 0 ) {
288
+ ERROR (ERROR_INVALID_DIRECTIVE , state -> column , "dl expects 1+ arguments" );
289
+ return 1 ;
290
+ }
291
+ uint64_t olen = 0 ;
292
+ int i ;
293
+ for (i = 0 ; i < argc ; ++ i ) {
294
+ int error ;
295
+ uint64_t result ;
296
+ char * symbol ;
297
+ tokenized_expression_t * expression = parse_expression (argv [i ]);
298
+
299
+ if (expression == NULL ) {
300
+ error = EXPRESSION_BAD_SYNTAX ;
301
+ } else {
302
+ result = evaluate_expression (expression , state -> equates , & error , & symbol );
303
+ }
304
+
305
+ if (error == EXPRESSION_BAD_SYMBOL ) {
306
+ if (scas_runtime .options .explicit_import ) {
307
+ tokenized_expression_t * changed_expression = malloc (sizeof (tokenized_expression_t ));
308
+ memcpy (changed_expression , expression , sizeof (tokenized_expression_t ));
309
+ int ignored_error ;
310
+ char * fixed_symbol ;
311
+ transform_local_labels (changed_expression , state -> last_global_label );
312
+ evaluate_expression (expression , state -> equates , & ignored_error , & fixed_symbol );
313
+ unresolved_symbol_t * unresolved_sym = malloc (sizeof (unresolved_symbol_t ));
314
+ unresolved_sym -> name = malloc (strlen (fixed_symbol ) + 1 );
315
+ strcpy (unresolved_sym -> name ,fixed_symbol );
316
+ unresolved_sym -> column = state -> column ;
317
+ unresolved_sym -> line_number = * (int * )stack_peek (state -> line_number_stack );
318
+ unresolved_sym -> line = malloc (strlen (state -> line ) + 1 );
319
+ strcpy (unresolved_sym -> line , state -> line );
320
+ const char * file_name = stack_peek (state -> file_name_stack );
321
+ unresolved_sym -> file_name = malloc (sizeof (file_name ) + 1 );
322
+ strcpy (unresolved_sym -> file_name , file_name );
323
+ list_add (state -> object -> unresolved , unresolved_sym );
324
+ }
325
+
326
+ scas_log (L_DEBUG , "Postponing evaluation of '%s' to linker" , argv [i ]);
327
+ late_immediate_t * late_imm = malloc (sizeof (late_immediate_t ));
328
+ late_imm -> address = state -> current_area -> data_length ;
329
+ late_imm -> instruction_address = state -> current_area -> data_length ;
330
+ late_imm -> base_address = state -> current_area -> data_length ;
331
+ late_imm -> width = 32 ;
332
+ late_imm -> type = IMM_TYPE_ABSOLUTE ;
333
+ late_imm -> expression = expression ;
334
+ list_add (state -> current_area -> late_immediates , late_imm );
335
+ state -> instruction_buffer [0 ] = 0 ;
336
+ state -> instruction_buffer [1 ] = 0 ;
337
+ state -> instruction_buffer [2 ] = 0 ;
338
+ state -> instruction_buffer [3 ] = 0 ;
339
+ } else if (error == EXPRESSION_BAD_SYNTAX ) {
340
+ ERROR (ERROR_INVALID_SYNTAX , state -> column );
341
+ } else {
342
+ if ((result & 0xFFFFFFFF ) != result && ~result >> 32 ) {
343
+ ERROR (ERROR_VALUE_TRUNCATED , state -> column );
344
+ } else {
345
+ state -> instruction_buffer [3 ] = (uint8_t )((result >> 24 ) & 0xFF );
346
+ state -> instruction_buffer [2 ] = (uint8_t )((result >> 16 ) & 0xFF );
347
+ state -> instruction_buffer [1 ] = (uint8_t )((result >> 8 ) & 0xFF );
348
+ state -> instruction_buffer [0 ] = (uint8_t )(result & 0xFF );
349
+ }
350
+ }
351
+ append_to_area (state -> current_area , state -> instruction_buffer , 4 );
352
+ state -> PC += 4 ;
353
+ olen += 4 ;
354
+ }
355
+ if (!state -> expanding_macro ) {
356
+ add_source_map ((source_map_t * )stack_peek (state -> source_map_stack ),
357
+ * (int * )stack_peek (state -> line_number_stack ), state -> line ,
358
+ state -> current_area -> data_length , olen );
359
+ }
360
+ return 1 ;
361
+ }
362
+
286
363
int handle_define (struct assembler_state * state , char * * argv , int argc ) {
287
364
/* Basically the same thing as handle_macro, but everything is on 1 line */
288
365
if (argc == 0 ) {
@@ -1166,6 +1243,7 @@ struct directive directives[] = {
1166
1243
{ "byte" , handle_db , DELIM_COMMAS },
1167
1244
{ "db" , handle_db , DELIM_COMMAS },
1168
1245
{ "define" , handle_define , 0 },
1246
+ { "dl" , handle_dl , DELIM_COMMAS },
1169
1247
{ "ds" , handle_block , DELIM_COMMAS },
1170
1248
{ "dw" , handle_dw , DELIM_COMMAS },
1171
1249
//{ "echo", handle_echo, DELIM_COMMAS | DELIM_WHITESPACE },
0 commit comments