cleanup concerning pc assignments

git-svn-id: https://svn.code.sf.net/p/acme-crossass/code-0/trunk@142 4df02467-bbd4-4a76-a152-e7ce94205b78
This commit is contained in:
marcobaye 2020-05-08 09:43:52 +00:00
parent 7d4200faa4
commit 38952534f4
2 changed files with 19 additions and 22 deletions

View File

@ -147,21 +147,6 @@ void *safe_malloc(size_t size)
// Parser stuff // Parser stuff
// Parse (re-)definitions of program counter
static void parse_pc_def(void) // Now GotByte = "*"
{
NEXTANDSKIPSPACE(); // proceed with next char
// re-definitions of program counter change segment
if (GotByte == '=') {
GetByte(); // proceed with next char
notreallypo_setpc();
Input_ensure_EOS();
} else {
Throw_error(exception_syntax);
Input_skip_remainder();
}
}
// Check and return whether first label of statement. Complain if not. // Check and return whether first label of statement. Complain if not.
static int first_label_of_statement(int *statement_flags) static int first_label_of_statement(int *statement_flags)
@ -284,7 +269,7 @@ void Parse_until_eob_or_eof(void)
parse_forward_anon_def(&statement_flags); parse_forward_anon_def(&statement_flags);
break; break;
case '*': case '*':
parse_pc_def(); notreallypo_setpc(); // define program counter (fn is in pseudoopcodes.c)
break; break;
case LOCAL_PREFIX: case LOCAL_PREFIX:
parse_local_symbol_def(&statement_flags, section_now->local_scope); parse_local_symbol_def(&statement_flags, section_now->local_scope);

View File

@ -43,20 +43,27 @@ static const char exception_unknown_pseudo_opcode[] = "Unknown pseudo opcode.";
static struct ronode *pseudo_opcode_tree = NULL; // tree to hold pseudo opcodes static struct ronode *pseudo_opcode_tree = NULL; // tree to hold pseudo opcodes
// not really a pseudo opcode, but close enough to be put here: // this is not really a pseudo opcode, but similar enough to be put here:
// called when "* = EXPRESSION" is parsed // called when "* = EXPRESSION" is parsed, to set the program counter
// setting program counter via "* = VALUE" void notreallypo_setpc(void) // GotByte is '*'
void notreallypo_setpc(void)
{ {
int segment_flags = 0; int segment_flags = 0;
struct number intresult; struct number intresult;
// next non-space must be '='
NEXTANDSKIPSPACE();
if (GotByte != '=') {
Throw_error(exception_syntax);
goto fail;
}
GetByte();
ALU_defined_int(&intresult); // read new address ALU_defined_int(&intresult); // read new address
// check for modifiers // check for modifiers
while (Input_accept_comma()) { while (Input_accept_comma()) {
// parse modifier. if no keyword given, give up // parse modifier. if no keyword given, give up
if (Input_read_and_lower_keyword() == 0) if (Input_read_and_lower_keyword() == 0)
return; goto fail;
if (strcmp(GlobalDynaBuf->buffer, "overlay") == 0) { if (strcmp(GlobalDynaBuf->buffer, "overlay") == 0) {
segment_flags |= SEGMENT_FLAG_OVERLAY; segment_flags |= SEGMENT_FLAG_OVERLAY;
@ -70,11 +77,16 @@ void notreallypo_setpc(void)
read segment name (quoted string!) */ read segment name (quoted string!) */
} else { } else {
Throw_error("Unknown \"* =\" segment modifier."); Throw_error("Unknown \"* =\" segment modifier.");
return; goto fail;
} }
} }
vcpu_set_pc(intresult.val.intval, segment_flags); vcpu_set_pc(intresult.val.intval, segment_flags);
// TODO - allow block syntax, so it is possible to put data "somewhere else" and then return to old position // TODO - allow block syntax, so it is possible to put data "somewhere else" and then return to old position
Input_ensure_EOS();
return;
fail:
Input_skip_remainder();
} }