commit 553e559e4ed895f74d2ba9b6b769549d9f7ef945
parent e6325792435db5b2762483235eb41c7593ef0fdb
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date: Tue, 26 Mar 2024 10:45:25 -0700
(uxnasm) Abstracted tokenizer
Diffstat:
M | src/uxnasm.c | | | 49 | +++++++++++++++++++++++++++---------------------- |
1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/src/uxnasm.c b/src/uxnasm.c
@@ -218,11 +218,10 @@ makepad(char *w)
int rel = w[0] == '$' ? p.ptr : 0;
if(sihx(w + 1))
p.ptr = shex(w + 1) + rel;
- else {
- if(!(l = findlabel(w + 1)))
- return error_asm("Invalid label");
+ else if((l = findlabel(w + 1)))
p.ptr = l->addr + rel;
- }
+ else
+ return error_asm("Invalid padding");
return 1;
}
@@ -275,6 +274,29 @@ writeshort(Uint16 s, int lit)
}
static int
+tokenize(FILE *f)
+{
+ unsigned int buf;
+ char *cptr = token;
+ while(fread(&buf, 1, 1, f)) {
+ char c = (char)buf;
+ if(c < 0x21) {
+ *cptr++ = 0x00;
+ if(c == 0x0a)
+ p.line++;
+ if(token[0])
+ if(!parse(token, f))
+ return 0;
+ cptr = token;
+ } else if(cptr - token < 0x3f)
+ *cptr++ = c;
+ else
+ return error_asm("Token too long");
+ }
+ return 1;
+}
+
+static int
doinclude(char *filename)
{
FILE *f;
@@ -443,26 +465,9 @@ resolve(void)
static int
assemble(FILE *f)
{
- unsigned int buf;
- char *cptr = token;
p.ptr = 0x100;
scpy("on-reset", p.scope, 0x40);
- while(fread(&buf, 1, 1, f)) {
- char c = (char)buf;
- if(c < 0x21) {
- *cptr++ = 0x00;
- if(c == 0x0a)
- p.line++;
- if(token[0])
- if(!parse(token, f))
- return 0;
- cptr = token;
- } else if(cptr - token < 0x3f)
- *cptr++ = c;
- else
- return error_asm("Token too long");
- }
- return resolve();
+ return tokenize(f) && resolve();
}
static void