uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit d96902b2d75a861cd95251f535a23d7542c37de6
parent 0673cbed98bd1a58005f6cb82da817bb41ffb9b4
Author: Devine Lu Linvega <aliceffekt@gmail.com>
Date:   Mon, 25 Mar 2024 20:30:55 -0700

(uxnasm) Abstracted padding logic

Diffstat:
Msrc/uxnasm.c | 48+++++++++++++++++++++++-------------------------
1 file changed, 23 insertions(+), 25 deletions(-)

diff --git a/src/uxnasm.c b/src/uxnasm.c @@ -216,6 +216,26 @@ makesublabel(char *src, char *scope, char *name) } static int +makepad(char *w) +{ + char subw[0x40]; + Label *l; + int rel = w[0] == '$' ? p.ptr : 0; + if(sihx(w + 1)) + p.ptr = shex(w + 1) + rel; + else if(w[1] == '&') { + if(!makesublabel(subw, p.scope, w + 2) || !(l = findlabel(subw))) + return error_asm("Invalid sublabel"); + p.ptr = l->addr + rel; + } else { + if(!(l = findlabel(w + 1))) + return error_asm("Invalid label"); + p.ptr = l->addr + rel; + } + return 1; +} + +static int addref(char *scope, char *label, char rune, Uint16 addr) { char subw[0x40], parent[0x40]; @@ -283,7 +303,6 @@ parse(char *w, FILE *f) { int i; char word[0x40], subw[0x40], c; - Label *l; Macro *m; switch(w[0]) { case '(': /* comment */ @@ -306,31 +325,10 @@ parse(char *w, FILE *f) if(!makemacro(w + 1, f)) return error_asm("Invalid macro"); break; - case '|': /* pad-absolute */ - if(sihx(w + 1)) - p.ptr = shex(w + 1); - else if(w[1] == '&') { - if(!makesublabel(subw, p.scope, w + 2) || !(l = findlabel(subw))) - return error_asm("Invalid sublabel"); - p.ptr = l->addr; - } else { - if(!(l = findlabel(w + 1))) - return error_asm("Invalid label"); - p.ptr = l->addr; - } - break; case '$': /* pad-relative */ - if(sihx(w + 1)) - p.ptr += shex(w + 1); - else if(w[1] == '&') { - if(!makesublabel(subw, p.scope, w + 2) || !(l = findlabel(subw))) - return error_asm("Invalid sublabel"); - p.ptr += l->addr; - } else { - if(!(l = findlabel(w + 1))) - return error_asm("Invalid label"); - p.ptr += l->addr; - } + case '|': /* pad-absolute */ + if(!makepad(w)) + return error_asm("Invalid padding"); break; case '@': /* label */ if(!makelabel(w + 1))