1
0
mirror of https://github.com/ksherlock/x65.git synced 2025-01-16 08:33:28 +00:00

more testing and fixing of partial expressions

This commit is contained in:
Carl-Henrik Skårstedt 2019-10-17 00:16:55 -07:00
parent 7521d31514
commit d5080e925d

55
x65.cpp
View File

@ -5,7 +5,7 @@
// Created by Carl-Henrik Skårstedt on 9/23/15. // Created by Carl-Henrik Skårstedt on 9/23/15.
// //
// //
// A simple 6502 assembler // A "simple" 6502/65C02/65816 assembler
// //
// //
// The MIT License (MIT) // The MIT License (MIT)
@ -1347,6 +1347,7 @@ typedef struct sLateEval {
int16_t section; // which section to apply to. int16_t section; // which section to apply to.
int16_t rept; // value of rept int16_t rept; // value of rept
int file_ref; // -1 if current or xdef'd otherwise index of file for label int file_ref; // -1 if current or xdef'd otherwise index of file for label
char* expression_mem; // if a temporary string was used for the expression
strref label; // valid if this is not a target but another label strref label; // valid if this is not a target but another label
strref expression; strref expression;
strref source_file; strref source_file;
@ -1705,12 +1706,16 @@ void Asm::Cleanup() {
if (char *data = *i) if (char *data = *i)
free(data); free(data);
} }
for( std::vector<LateEval>::iterator i = lateEval.begin(); i != lateEval.end(); ++i ) {
if( i->expression_mem ) { free( i->expression_mem ); i->expression_mem = nullptr; i->expression.clear(); }
}
map.clear(); map.clear();
labelPools.clear(); labelPools.clear();
loadedData.clear(); loadedData.clear();
labels.clear(); labels.clear();
macros.clear(); macros.clear();
allSections.clear(); allSections.clear();
lateEval.clear();
for (uint32_t i = 0; i < strings.count(); ++i) { for (uint32_t i = 0; i < strings.count(); ++i) {
StringSymbol &str = strings.getValue(i); StringSymbol &str = strings.getValue(i);
if (str.string_value.cap()) if (str.string_value.cap())
@ -3177,7 +3182,7 @@ EvalOperator Asm::RPNToken_Merlin(strref &expression, const struct EvalContext &
char e0 = expression[0]; char e0 = expression[0];
int start_pos = (e0==']' || e0==':' || e0=='!' || e0=='.') ? 1 : 0; int start_pos = (e0==']' || e0==':' || e0=='!' || e0=='.') ? 1 : 0;
strref label = expression.split_range_trim(label_end_char_range_merlin, start_pos); strref label = expression.split_range_trim(label_end_char_range_merlin, start_pos);
Label *pLabel = pLabel = GetLabel(label, etx.file_ref); Label *pLabel = GetLabel(label, etx.file_ref);
if (!pLabel) { if (!pLabel) {
StatusCode ret = EvalStruct(label, value); StatusCode ret = EvalStruct(label, value);
if (ret==STATUS_OK) { return EVOP_VAL; } if (ret==STATUS_OK) { return EVOP_VAL; }
@ -3240,7 +3245,7 @@ EvalOperator Asm::RPNToken(strref &exp, const struct EvalContext &etx, EvalOpera
char e0 = exp[0]; char e0 = exp[0];
int start_pos = (e0 == ':' || e0 == '!' || e0 == '.') ? 1 : 0; int start_pos = (e0 == ':' || e0 == '!' || e0 == '.') ? 1 : 0;
strref label = exp.split_range_trim(label_end_char_range, start_pos); strref label = exp.split_range_trim(label_end_char_range, start_pos);
Label *pLabel = pLabel = GetLabel(label, etx.file_ref); Label *pLabel = GetLabel(label, etx.file_ref);
if (!pLabel) { if (!pLabel) {
StatusCode ret = EvalStruct(label, value); StatusCode ret = EvalStruct(label, value);
if (ret==STATUS_OK) { return EVOP_VAL; } if (ret==STATUS_OK) { return EVOP_VAL; }
@ -3554,7 +3559,7 @@ char* Asm::PartialEval( strref expression )
int16_t section = -1, index_section = -1; int16_t section = -1, index_section = -1;
EvalOperator op = EVOP_NONE; EvalOperator op = EVOP_NONE;
strref subexp; strref subexp;
while( expression.get_len() && strref::is_sep_ws( expression.get_first() ) ) { while( expression.get_len() && strref::is_ws( expression.get_first() ) ) {
partial.append( expression.get_first() ); partial.append( expression.get_first() );
++expression; ++expression;
} }
@ -3564,33 +3569,25 @@ char* Asm::PartialEval( strref expression )
strl_t l = expression.len_alphanumeric(); strl_t l = expression.len_alphanumeric();
partial.append( strref( expression.get(), l ) ); partial.append( strref( expression.get(), l ) );
expression += l; expression += l;
} else if( strref::is_valid_label( f ) ) { } else if( f=='.' || f == '_' || strref::is_alphabetic( f ) ) {
// if( !expression.is_prefix_word( strref( "rept" ) ) ) { strref label = expression.split_range( label_end_char_range );
strref orig_exp = expression; Label *pLabel = GetLabel( label, etx.file_ref );
if( Merlin() ) {
op = RPNToken_Merlin( expression, etx, prev_op, section, value ); if( pLabel && pLabel->evaluated && pLabel->section < 0 ) {
} partial.sprintf_append( "$%x ", pLabel->value ); // insert extra whitespace for separation
else { partial_solved = true;
op = RPNToken( expression, etx, prev_op, section, value, subexp ); } else {
} partial.append( label );
prev_op = op; }
if( op == EVOP_VAL ) {
partial.sprintf_append( "$%x ", value ); // insert extra whitespace for separation
partial_solved = true;
} else { partial.append( strref( orig_exp.get(), orig_exp.get_len() - expression.get_len() ) ); }
// }
// else {
//partial.append( expression.split( 4 ) );
// }
} else { } else {
partial.append( expression.get_first() ); partial.append( expression.get_first() );
++expression; ++expression;
} }
} }
} }
if( partial_solved ) { if( partial_solved ) {
printf( "PARTIAL EXPRESSION SOLVED:\n\t" STRREF_FMT "\n\t" STRREF_FMT "\n", STRREF_ARG( input ), STRREF_ARG( partial.get_strref() ) ); //printf( "PARTIAL EXPRESSION SOLVED:\n\t" STRREF_FMT "\n\t" STRREF_FMT "\n", STRREF_ARG( input ), STRREF_ARG( partial.get_strref() ) );
return _strdup( partial.c_str() );
} }
return nullptr; return nullptr;
} }
@ -3599,7 +3596,7 @@ char* Asm::PartialEval( strref expression )
// the action to perform if it can be evaluated later. // the action to perform if it can be evaluated later.
void Asm::AddLateEval(int target, int pc, int scope_pc, strref expression, strref source_file, LateEval::Type type) { void Asm::AddLateEval(int target, int pc, int scope_pc, strref expression, strref source_file, LateEval::Type type) {
LateEval le; LateEval le;
PartialEval( expression ); char* partial = PartialEval( expression );
le.address = pc; le.address = pc;
le.scope = scope_pc; le.scope = scope_pc;
le.scope_depth = scope_depth; le.scope_depth = scope_depth;
@ -3608,7 +3605,8 @@ void Asm::AddLateEval(int target, int pc, int scope_pc, strref expression, strre
le.rept = contextStack.curr().repeat_total - contextStack.curr().repeat; le.rept = contextStack.curr().repeat_total - contextStack.curr().repeat;
le.file_ref = -1; // current or xdef'd le.file_ref = -1; // current or xdef'd
le.label.clear(); le.label.clear();
le.expression = expression; le.expression = partial ? strref( partial ) : expression;
le.expression_mem = partial;
le.source_file = source_file; le.source_file = source_file;
le.type = type; le.type = type;
@ -3617,7 +3615,7 @@ void Asm::AddLateEval(int target, int pc, int scope_pc, strref expression, strre
void Asm::AddLateEval(strref label, int pc, int scope_pc, strref expression, LateEval::Type type) { void Asm::AddLateEval(strref label, int pc, int scope_pc, strref expression, LateEval::Type type) {
LateEval le; LateEval le;
PartialEval( expression ); char* partial = PartialEval( expression );
le.address = pc; le.address = pc;
le.scope = scope_pc; le.scope = scope_pc;
le.scope_depth = scope_depth; le.scope_depth = scope_depth;
@ -3626,7 +3624,8 @@ void Asm::AddLateEval(strref label, int pc, int scope_pc, strref expression, Lat
le.section = (int16_t)(&CurrSection() - &allSections[0]); le.section = (int16_t)(&CurrSection() - &allSections[0]);
le.rept = contextStack.curr().repeat_total - contextStack.curr().repeat; le.rept = contextStack.curr().repeat_total - contextStack.curr().repeat;
le.file_ref = -1; // current or xdef'd le.file_ref = -1; // current or xdef'd
le.expression = expression; le.expression = partial ? strref( partial ) : expression;
le.expression_mem = partial;
le.source_file.clear(); le.source_file.clear();
le.type = type; le.type = type;