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:
parent
7521d31514
commit
d5080e925d
55
x65.cpp
55
x65.cpp
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user