Skip to content

Commit 03b6fe6

Browse files
author
Noam Preil
committed
Implement .dl for 32-bit values
1 parent d985549 commit 03b6fe6

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

assembler/directives.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
286363
int 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

Comments
 (0)