mirror of
https://github.com/open-simh/simtools.git
synced 2026-04-28 20:57:22 +00:00
Make operand parsing error messages more helpful
and add a test that is supposed to exercise them all.
This commit is contained in:
54
assemble.c
54
assemble.c
@@ -1331,6 +1331,12 @@ static int assemble(
|
||||
report(stack->top, "Instruction requires simple literal operand\n");
|
||||
word = op->value;
|
||||
} else {
|
||||
unsigned int max = (op->value == I_MARK)? 077 : 0377;
|
||||
|
||||
if (value->data.lit > max) {
|
||||
report(stack->top, "Literal operand too large (%d. > %d.)\n", value->data.lit, max);
|
||||
value->data.lit = max;
|
||||
}
|
||||
word = op->value | value->data.lit;
|
||||
}
|
||||
|
||||
@@ -1345,7 +1351,7 @@ static int assemble(
|
||||
unsigned word;
|
||||
|
||||
if (!get_mode(cp, &cp, &mode)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1368,19 +1374,19 @@ static int assemble(
|
||||
unsigned word;
|
||||
|
||||
if (!get_mode(cp, &cp, &left)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (1st operand)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal syntax\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
free_addr_mode(&left);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!get_mode(cp, &cp, &right)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (2nd operand)\n");
|
||||
free_addr_mode(&left);
|
||||
return 0;
|
||||
}
|
||||
@@ -1465,13 +1471,13 @@ static int assemble(
|
||||
reg = get_register(value);
|
||||
free_tree(value);
|
||||
if (reg == NO_REG) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (register expected)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal syntax\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1525,13 +1531,13 @@ static int assemble(
|
||||
unsigned word;
|
||||
|
||||
if (!get_mode(cp, &cp, &mode)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (1st operand)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
free_addr_mode(&mode);
|
||||
return 0;
|
||||
}
|
||||
@@ -1540,7 +1546,7 @@ static int assemble(
|
||||
|
||||
reg = get_register(value);
|
||||
if (reg == NO_REG) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (2nd operand: register expected)\n");
|
||||
free_tree(value);
|
||||
free_addr_mode(&mode);
|
||||
return 0;
|
||||
@@ -1566,19 +1572,19 @@ static int assemble(
|
||||
|
||||
reg = get_register(value);
|
||||
if (reg == NO_REG) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (1st operand: register exected)\n");
|
||||
free_tree(value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!get_mode(cp, &cp, &mode)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (2nd operand)\n");
|
||||
free_tree(value);
|
||||
return 0;
|
||||
}
|
||||
@@ -1604,7 +1610,7 @@ static int assemble(
|
||||
cp = value->cp;
|
||||
reg = get_register(value);
|
||||
if (reg == NO_REG) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (register expected)\n");
|
||||
reg = 0;
|
||||
}
|
||||
|
||||
@@ -1646,13 +1652,13 @@ static int assemble(
|
||||
unsigned word;
|
||||
|
||||
if (!get_fp_src_mode(cp, &cp, &mode)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (1st operand)\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
free_addr_mode(&mode);
|
||||
return 0;
|
||||
}
|
||||
@@ -1690,19 +1696,19 @@ static int assemble(
|
||||
|
||||
reg = get_register(value);
|
||||
if (reg == NO_REG || reg > 3) {
|
||||
report(stack->top, "Illegal source fp register\n");
|
||||
report(stack->top, "Invalid source fp register\n");
|
||||
reg = 0;
|
||||
}
|
||||
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid syntax (comma expected)\n");
|
||||
free_tree(value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!get_mode(cp, &cp, &mode)) {
|
||||
report(stack->top, "Illegal addressing mode\n");
|
||||
report(stack->top, "Invalid addressing mode (2nd operand)\n");
|
||||
free_tree(value);
|
||||
return 0;
|
||||
}
|
||||
@@ -1741,9 +1747,17 @@ static int assemble(
|
||||
cis_common:
|
||||
if (!EOL(*cp)) {
|
||||
for (int i = 0; i < nwords; i++) {
|
||||
if (i > 0)
|
||||
cp = skipdelim(cp);
|
||||
if (i > 0) {
|
||||
cp = skipwhite(cp);
|
||||
if (*cp++ != ',') {
|
||||
report(stack->top, "Invalid syntax (operand %d: comma expected)\n", i+1);
|
||||
cp--;
|
||||
}
|
||||
}
|
||||
EX_TREE *ex = parse_expr(cp, 0);
|
||||
if (!expr_ok(ex)) {
|
||||
report(stack->top, "Invalid expression (operand %d)\n", i+1);
|
||||
}
|
||||
cp = ex->cp;
|
||||
expr[i] = ex;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user