From fafc4e1734f16bde0b15407b65b164b567f0a405 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Tue, 26 Mar 2024 13:11:07 -0700 Subject: [PATCH] (uxnasm) single-line handlers --- src/uxnasm.c | 63 +++++++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 40 deletions(-) diff --git a/src/uxnasm.c b/src/uxnasm.c index e459be7..9af9356 100644 --- a/src/uxnasm.c +++ b/src/uxnasm.c @@ -326,13 +326,8 @@ parse(char *w, FILE *f) break; } break; - case '~': /* include */ - return !doinclude(w + 1) ? error_asm("Invalid include") : 1; - case '%': /* macro */ - return !makemacro(w + 1, f) ? error_asm("Invalid macro") : 1; - case '$': /* pad relative */ - case '|': /* pad absolute */ - return !makepad(w) ? error_asm("Invalid padding") : 1; + case '~': return !doinclude(w + 1) ? error_asm("Invalid include") : 1; + case '%': return !makemacro(w + 1, f) ? error_asm("Invalid macro") : 1; case '@': /* label */ if(!makelabel(w + 1)) return error_asm("Invalid label"); @@ -341,44 +336,32 @@ parse(char *w, FILE *f) i++; scope[i] = '\0'; break; - case '&': /* sublabel */ - return !makelabel(w) ? error_asm("Invalid sublabel") : 1; - case '#': /* literals hex */ - return !sihx(w + 1) || !writehex(w) ? error_asm("Invalid hexadecimal") : 1; - case '_': /* raw byte relative */ - return addref(w + 1, w[0], p.ptr) && writebyte(0xff); - case ',': /* literal byte relative */ - return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT")) && writebyte(0xff); - case '-': /* raw byte absolute */ - return addref(w + 1, w[0], p.ptr) && writebyte(0xff); - case '.': /* literal byte zero-page */ - return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT")) && writebyte(0xff); - case ':': fprintf(stderr, "Deprecated rune %s, use =%s\n", w, w + 1); - case '=': /* raw short absolute */ - return addref(w + 1, w[0], p.ptr) && writeshort(0xffff); - case ';': /* literal short absolute */ - return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT2")) && writeshort(0xffff); - case '?': /* JCI */ - return addref(w + 1, w[0], p.ptr + 1) && writebyte(0x20) && writeshort(0xffff); - case '!': /* JMI */ - return addref(w + 1, w[0], p.ptr + 1) && writebyte(0x40) && writeshort(0xffff); - case '"': /* raw string */ - i = 0; - while((c = w[++i])) - if(!writebyte(c)) return 0; - break; - case '}': /* lambda end */ - return !makelabel(makelambda(p.lambda_stack[--p.lambda_ptr])) ? error_asm("Invalid label") : 1; + case '&': return !makelabel(w) ? error_asm("Invalid sublabel") : 1; + case '#': return !sihx(w + 1) || !writehex(w) ? error_asm("Invalid hexadecimal") : 1; + case '_': return addref(w + 1, w[0], p.ptr) && writebyte(0xff); + case ',': return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT")) && writebyte(0xff); + case '-': return addref(w + 1, w[0], p.ptr) && writebyte(0xff); + case '.': return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT")) && writebyte(0xff); + case ':': fprintf(stderr, "Deprecated rune %s, use =%s\n", w, w + 1); /* fall-through */ + case '=': return addref(w + 1, w[0], p.ptr) && writeshort(0xffff); + case ';': return addref(w + 1, w[0], p.ptr + 1) && writebyte(findopcode("LIT2")) && writeshort(0xffff); + case '?': return addref(w + 1, w[0], p.ptr + 1) && writebyte(0x20) && writeshort(0xffff); + case '!': return addref(w + 1, w[0], p.ptr + 1) && writebyte(0x40) && writeshort(0xffff); + case '}': return !makelabel(makelambda(p.lambda_stack[--p.lambda_ptr])) ? error_asm("Invalid label") : 1; + case '$': + case '|': return !makepad(w) ? error_asm("Invalid padding") : 1; case '[': case ']': if(slen(w) == 1) break; /* else fallthrough */ + case '"': /* raw string */ + while((c = *(++w))) + if(!writebyte(c)) return 0; + break; default: - /* opcode */ - if(isopcode(w)) return writebyte(findopcode(w)); - /* raw byte */ - else if(sihx(w)) + if(sihx(w)) return writehex(w); - /* macro */ + else if(isopcode(w)) + return writebyte(findopcode(w)); else if((m = findmacro(w))) { for(i = 0; i < m->len; i++) if(!parse(m->items[i], f))