0
0
Fork 0
mirror of https://git.sr.ht/~rabbits/uxn synced 2024-11-30 01:33:01 +00:00
This commit is contained in:
neauoire 2021-03-01 09:16:40 -08:00
parent 0027296839
commit e162b4f083
7 changed files with 27 additions and 26 deletions

View file

@ -118,7 +118,6 @@ A device that works like a NES controller, each button is a bit from a single by
- Includes - Includes
- Defines - Defines
- Print unused labels
## Refs ## Refs

View file

@ -17,17 +17,17 @@ typedef unsigned short Uint16;
typedef signed short Sint16; typedef signed short Sint16;
typedef struct { typedef struct {
int ptr; Uint8 data[256 * 256];
Uint8 data[65536]; Uint16 ptr;
} Program; } Program;
typedef struct { typedef struct {
Uint8 len, length[16], size, refs;
char name[64], params[16][64]; char name[64], params[16][64];
Uint8 len, length[16], size;
} Macro; } Macro;
typedef struct { typedef struct {
Uint8 len, offset; Uint8 len, offset, refs;
Uint16 addr; Uint16 addr;
char name[64]; char name[64];
Macro *macro; Macro *macro;
@ -222,6 +222,7 @@ makelabel(char *name, Uint16 addr, Uint8 len, Macro *m)
l = &labels[labelslen++]; l = &labels[labelslen++];
l->addr = addr; l->addr = addr;
l->len = len; l->len = len;
l->refs = 0;
scpy(name, l->name, 64); scpy(name, l->name, 64);
if(m) if(m)
l->macro = m; l->macro = m;
@ -246,9 +247,10 @@ makevariable(char *id, Uint16 *addr, FILE *f)
Macro *m = NULL; Macro *m = NULL;
fscanf(f, "%s", wv); fscanf(f, "%s", wv);
origin = *addr; origin = *addr;
if((m = findmacro(wv))) if((m = findmacro(wv))) {
len = m->size; len = m->size;
else m->refs++;
} else
len = shex(wv); len = shex(wv);
*addr += len; *addr += len;
return makelabel(id, origin, len, m); return makelabel(id, origin, len, m);
@ -349,17 +351,29 @@ pass2(FILE *f)
else if(w[0] == '+' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)shex(w + 1), 1); else if(w[0] == '+' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)shex(w + 1), 1);
else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 2) pushbyte((Sint8)(shex(w + 1) * -1), 1); else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 2) pushbyte((Sint8)(shex(w + 1) * -1), 1);
else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)(shex(w + 1) * -1), 1); else if(w[0] == '-' && sihx(w + 1) && slen(w + 1) == 4) pushshort((Sint16)(shex(w + 1) * -1), 1);
else if(w[0] == '=' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2 ? "STR2" : "STR"), 0); } else if(w[0] == '=' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2 ? "STR2" : "STR"), 0); l->refs++;}
else if(w[0] == '~' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2 ? "LDR2" : "LDR"), 0); } else if(w[0] == '~' && (l = findlabel(w + 1)) && l->len){ pushshort(findlabeladdr(w+1), 1); pushbyte(findopcode(findlabellen(w+1) == 2 ? "LDR2" : "LDR"), 0); l->refs++;}
else if(w[0] == '=' && sihx(w + 1)) { pushshort(shex(w + 1), 1); pushbyte(findopcode("STR2"), 0); } else if(w[0] == '=' && sihx(w + 1)) { pushshort(shex(w + 1), 1); pushbyte(findopcode("STR2"), 0); }
else if(w[0] == '~' && sihx(w + 1)) { pushshort(shex(w + 1), 1); pushbyte(findopcode("LDR2"), 0); } else if(w[0] == '~' && sihx(w + 1)) { pushshort(shex(w + 1), 1); pushbyte(findopcode("LDR2"), 0); }
else if((l = findlabel(w + 1))) pushshort(findlabeladdr(w+1), w[0] == ','); else if((l = findlabel(w + 1))) { pushshort(findlabeladdr(w+1), w[0] == ','); l->refs++; }
else return error("Unknown label in second pass", w); else return error("Unknown label in second pass", w);
/* clang-format on */ /* clang-format on */
} }
return 1; return 1;
} }
void
cleanup(void)
{
int i;
for(i = 0; i < labelslen; ++i)
if(!labels[i].refs)
printf("--- Unused label: %s\n", labels[i].name);
for(i = 0; i < macroslen; ++i)
if(!macros[i].refs)
printf("--- Unused macro: %s\n", macros[i].name);
}
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@ -373,5 +387,6 @@ main(int argc, char *argv[])
fwrite(p.data, sizeof(p.data), 1, fopen(argv[2], "wb")); fwrite(p.data, sizeof(p.data), 1, fopen(argv[2], "wb"));
fclose(f); fclose(f);
printf("Assembled %s.\n\n", argv[2]); printf("Assembled %s.\n\n", argv[2]);
cleanup();
return 0; return 0;
} }

View file

@ -20,5 +20,5 @@ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werr
# cc uxn.c emulator.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator # cc uxn.c emulator.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -L/usr/local/lib -lSDL2 -o bin/emulator
# run # run
./bin/assembler examples/gui.hover.usm bin/boot.rom ./bin/assembler examples/dev.mouse.usm bin/boot.rom
./bin/emulator bin/boot.rom ./bin/emulator bin/boot.rom

View file

@ -10,7 +10,6 @@
;label Label2d ;label Label2d
;cat Point2d ;cat Point2d
;mouse Point2d ;mouse Point2d
;pos Point2d
;color 1 ;color 1
;timer 1 ;timer 1
@ -106,9 +105,7 @@ RTS
@animate-polycat-tail-next2 @animate-polycat-tail-next2
( look-at ) ( look-at )
~mouse.x ~cat.x #0008 ADD2 GTH2 ,animate-polycat-right ROT JMP? POP2 ~mouse.x ~cat.x #0008 ADD2 GTH2 ,animate-polycat-right ROT JMP? POP2
@animate-polycat-left
~mouse.y ~cat.y #0008 ADD2 GTH2 ,animate-polycat-left-down ROT JMP? POP2 ~mouse.y ~cat.y #0008 ADD2 GTH2 ,animate-polycat-left-down ROT JMP? POP2
@animate-polycat-left-up
,polycat #0040 ADD2 ~cat.x ~cat.y #0008 ADD2 ,draw-sprite-chr JSR ,polycat #0040 ADD2 ~cat.x ~cat.y #0008 ADD2 ,draw-sprite-chr JSR
,polycat #0050 ADD2 ~cat.x #0008 ADD2 ~cat.y #0008 ADD2 ,draw-sprite-chr JSR ,polycat #0050 ADD2 ~cat.x #0008 ADD2 ~cat.y #0008 ADD2 ,draw-sprite-chr JSR
RTS RTS
@ -118,7 +115,6 @@ RTS
RTS RTS
@animate-polycat-right @animate-polycat-right
~mouse.y ~cat.y #0008 ADD2 GTH2 ,animate-polycat-right-down ROT JMP? POP2 ~mouse.y ~cat.y #0008 ADD2 GTH2 ,animate-polycat-right-down ROT JMP? POP2
@animate-polycat-right-up
,polycat #0060 ADD2 ~cat.x ~cat.y #0008 ADD2 ,draw-sprite-chr JSR ,polycat #0060 ADD2 ~cat.x ~cat.y #0008 ADD2 ,draw-sprite-chr JSR
,polycat #0070 ADD2 ~cat.x #0008 ADD2 ~cat.y #0008 ADD2 ,draw-sprite-chr JSR ,polycat #0070 ADD2 ~cat.x #0008 ADD2 ~cat.y #0008 ADD2 ,draw-sprite-chr JSR
RTS RTS
@ -217,9 +213,6 @@ RTS
0008 0808 0808 0800 0030 1008 0810 3000 0000 0032 4c00 0000 3c42 99a1 a199 423c 0008 0808 0808 0800 0030 1008 0810 3000 0000 0032 4c00 0000 3c42 99a1 a199 423c
] ]
@chord0_text [ no chord ] <1 .00
@chord1_text [ chord 1_ ] <1 .00
@chord2_text [ chord _2 ] <1 .00
@mouse0_text [ no click ] <1 .00 @mouse0_text [ no click ] <1 .00
@mouse1_text [ mouse 1_ ] <1 .00 @mouse1_text [ mouse 1_ ] <1 .00
@mouse2_text [ mouse _2 ] <1 .00 @mouse2_text [ mouse _2 ] <1 .00

View file

@ -4,8 +4,6 @@
&Sprite { pad 8 x 2 y 2 addr 2 color 1 } &Sprite { pad 8 x 2 y 2 addr 2 color 1 }
&Mouse { x 2 y 2 state 1 chord 1 } &Mouse { x 2 y 2 state 1 chord 1 }
&Label2d { x 2 y 2 color 1 addr 2 }
&Picture2d { x 2 y 2 width 2 height 2 color 1 addr 2 }
&Rect2d { x1 2 y1 2 x2 2 y2 2 } &Rect2d { x1 2 y1 2 x2 2 y2 2 }
&Point2d { x 2 y 2 } &Point2d { x 2 y 2 }
@ -95,11 +93,9 @@ RTS
RTS RTS
@clear_icn [ 0000 0000 0000 0000 ] @clear_icn [ 0000 0000 0000 0000 ]
@pointer_icn [ 80c0 e0f0 f8e0 1000 ] @pointer_icn [ 80c0 e0f0 f8e0 1000 ]
@hand_icn [ 4040 4070 f8f8 f870 ] @hand_icn [ 4040 4070 f8f8 f870 ]
@text [ Label Text ] <1 .00 ( add characters to memory )
|d000 @ERROR BRK |d000 @ERROR BRK
|FF10 ;dev/screen Screen |FF10 ;dev/screen Screen

View file

@ -4,7 +4,6 @@
&Sprite { pad 8 x 2 y 2 addr 2 color 1 } &Sprite { pad 8 x 2 y 2 addr 2 color 1 }
&Picture2d { x 2 y 2 width 2 height 2 color 1 addr 2 } &Picture2d { x 2 y 2 width 2 height 2 color 1 addr 2 }
&Point2d { x 2 y 2 }
;pict Picture2d ;pict Picture2d

View file

@ -6,13 +6,12 @@
&Label2d { x 2 y 2 color 1 addr 2 } &Label2d { x 2 y 2 color 1 addr 2 }
&Picture2d { x 2 y 2 width 2 height 2 color 1 addr 2 } &Picture2d { x 2 y 2 width 2 height 2 color 1 addr 2 }
&Rect2d { x1 2 y1 2 x2 2 y2 2 } &Rect2d { x1 2 y1 2 x2 2 y2 2 }
&Point2d { x 2 y 2 }
;label Label2d ;label Label2d
;pict Picture2d ;pict Picture2d
;rect Rect2d ;rect Rect2d
;color 1 ;x1 2 ;x2 2 ;y1 2 ;y2 2 ;color 1
|0100 @RESET |0100 @RESET