@@ -283,6 +283,83 @@ int handle_db(struct assembler_state *state, char **argv, int argc) {
283283 return 1 ;
284284}
285285
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+
286363int handle_define (struct assembler_state * state , char * * argv , int argc ) {
287364 /* Basically the same thing as handle_macro, but everything is on 1 line */
288365 if (argc == 0 ) {
@@ -1166,6 +1243,7 @@ struct directive directives[] = {
11661243 { "byte" , handle_db , DELIM_COMMAS },
11671244 { "db" , handle_db , DELIM_COMMAS },
11681245 { "define" , handle_define , 0 },
1246+ { "dl" , handle_dl , DELIM_COMMAS },
11691247 { "ds" , handle_block , DELIM_COMMAS },
11701248 { "dw" , handle_dw , DELIM_COMMAS },
11711249 //{ "echo", handle_echo, DELIM_COMMAS | DELIM_WHITESPACE },
0 commit comments