diff --git a/assemble.c b/assemble.c index 21dc177..9a76512 100644 --- a/assemble.c +++ b/assemble.c @@ -400,17 +400,36 @@ do_mcalled_macro: case P_RADIX: { int old_radix = radix; + EX_TREE *value; + int ok = 1; - radix = strtoul(cp, &cp, 10); - if (radix != 8 && radix != 10 && radix != 16 && radix != 2) { - radix = old_radix; - report(stack->top, "Illegal radix\n"); - return 0; + cp = skipwhite(cp); + if (EOL(*cp)) { + /* If no argument, assume 8 */ + radix = 8; + return 1; } - /* Sometimes a decimal point appears after the value */ - if (*cp == '.') - cp++; - return CHECK_EOL; + /* Parse the argument in decimal radix */ + radix = 10; + value = parse_expr(cp, 0); + cp = value->cp; + + if (value->type != EX_LIT) { + report(stack->top, "Argument to .RADIX must be constant\n"); + radix = old_radix; + ok = 0; + } else { + radix = value->data.lit; + list_value(stack->top, radix); + if (radix != 8 && radix != 10 && + radix != 2 && radix != 16) { + radix = old_radix; + report(stack->top, "Argument to .RADIX must be 2, 8, 10, or 16\n"); + ok = 0; + } + } + free_tree(value); + return ok && CHECK_EOL; } case P_FLT4: diff --git a/tests/RunTests b/tests/RunTests index 4354b2b..c8b554a 100755 --- a/tests/RunTests +++ b/tests/RunTests @@ -30,6 +30,7 @@ TESTS="test-asciz \ test-prec \ test-psect \ test-rad50 \ + test-radix \ test-reg \ test-reloc \ test-rept \ diff --git a/tests/test-radix.lst.ok b/tests/test-radix.lst.ok new file mode 100644 index 0000000..1a5bbe4 --- /dev/null +++ b/tests/test-radix.lst.ok @@ -0,0 +1,38 @@ + 1 ;;;;; + 2 ; + 3 ; Test .radix directive + 4 ; + 5 000010 .RADIX 8 + 6 000000 000010 .WORD 10 + 7 000012 .RADIX 10 + 8 000002 000012 .WORD 10 + 9 .RADIX ;Default is 8 + 10 000004 000010 .WORD 10 + 11 000002 .RADIX 2 + 12 000006 000002 .WORD 10 + 13 000020 .RADIX 16 + 14 000010 000020 .WORD 10 + 15 ; Odd but valid + 16 000010 .RADIX ^O10 ;Octal 10, i.e., 8 + 17 000012 000010 .WORD 10 + 18 000012 .RADIX 5+5 + 19 000014 000012 .WORD 10 + 20 ; Errors +test-radix.mac:21: ***ERROR Argument to .RADIX must be 2, 8, 10, or 16 + 21 000007 .RADIX 7 + 22 000016 000012 .WORD 10 ;Radix is unchanged after error +test-radix.mac:23: ***ERROR Argument to .RADIX must be constant + 23 .RADIX . + 24 000020 000012 .WORD 10 + 24 + + +Symbol table + +. 000022R 001 + + +Program sections: + +. ABS. 000000 000 (RW,I,GBL,ABS,OVR,NOSAV) + 000022 001 (RW,I,LCL,REL,CON,NOSAV) diff --git a/tests/test-radix.mac b/tests/test-radix.mac new file mode 100644 index 0000000..b50e13f --- /dev/null +++ b/tests/test-radix.mac @@ -0,0 +1,24 @@ +;;;;; +; +; Test .radix directive +; + .RADIX 8 + .WORD 10 + .RADIX 10 + .WORD 10 + .RADIX ;Default is 8 + .WORD 10 + .RADIX 2 + .WORD 10 + .RADIX 16 + .WORD 10 +; Odd but valid + .RADIX ^O10 ;Octal 10, i.e., 8 + .WORD 10 + .RADIX 5+5 + .WORD 10 +; Errors + .RADIX 7 + .WORD 10 ;Radix is unchanged after error + .RADIX . + .WORD 10