spl

systems programming language
git clone http://frotz.net/git/spl.git
Log | Files | Refs | README | LICENSE

commit 25667df6698623ebc9b00eda204a0444bbb2759a
parent 902997b570dba4e719de8c989b4ecdf8b0dbb9fb
Author: Brian Swetland <swetland@frotz.net>
Date:   Mon, 30 Jun 2025 16:22:38 -0700

sr32asm: fix some li encodings, accept hash line comments

Diffstat:
Msoftrisc32/src/assemble-sr32.c | 12++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/softrisc32/src/assemble-sr32.c b/softrisc32/src/assemble-sr32.c @@ -36,6 +36,10 @@ int is_signed21(uint32_t n) { n &= 0xFFFFF800; return ((n == 0) || (n == 0xFFFFF800)); } +int fits_in_signed16(uint32_t n) { + n &= 0xFFFF8000; + return ((n == 0) || (n == 0xFFFF8000)); +} uint8_t image[1*1024*1024]; uint32_t image_base = 0; @@ -229,7 +233,7 @@ void save(const char *fn) { enum tokens { tEOF, tEOL, tIDENT, tREGISTER, tNUMBER, tSTRING, - tCOMMA, tCOLON, tOPAREN, tCPAREN, tHASH, tAT, tDOT, + tCOMMA, tCOLON, tOPAREN, tCPAREN, tAT, tDOT, tADD, tSUB, tAND, tOR, tXOR, tSLL, tSRL, tSRA, tSLT, tSLTU, tMUL, tDIV, tADDI, tSUBI, tANDI, tORI, tXORI, tSLLI, tSRLI, tSRAI, @@ -248,7 +252,7 @@ enum tokens { }; char *tnames[] = { "<EOF>", "<EOL>", "IDENT", "REGISTER", "NUMBER", "STRING", - ",", ":", "(", ")", "#", "@", ".", + ",", ":", "(", ")", "@", ".", "ADD", "SUB", "AND", "OR", "XOR", "SLL", "SRL", "SRA", "SLT", "SLTU", "MUL", "DIV", "ADDI", "SUBI", "ANDI", "ORI", "XORI", "SLLI", "SRLI", "SRAI", @@ -346,6 +350,7 @@ unsigned tokenize(State *state) { if (nextchar(state) != '/') { die("stray /"); } + case '#': for (;;) { x = nextchar(state); if ((x == '\n') || (x == 0)) break; @@ -358,7 +363,6 @@ unsigned tokenize(State *state) { case ':': return tCOLON; case '(': return tOPAREN; case ')': return tCPAREN; - case '#': return tHASH; case '@': return tAT; case '"': while ((x = nextchar(state)) != '"') { @@ -684,7 +688,7 @@ int parse_line(State *s) { parse_rel(s, TYPE_ABS_HILO, &i); } else { parse_num(s, &i); - if (is_signed16(i)) { + if (fits_in_signed16(i)) { emit(ins_i(IR_ADD, t, 0, i)); } else { uint32_t hi = i >> 16;