commit 7edbaa0
neauoire
·
2022-12-10 03:54:04 +0000 UTC
parent bce4438
Updated uxnasm to create symbols
1 files changed,
+52,
-11
+52,
-11
1@@ -303,22 +303,31 @@ parse(char *w, FILE *f)
2 if(!writeshort(shex(w + 1), 1)) return 0;
3 }
4 break;
5- case '.': /* literal byte zero-page */
6+ case '_': /* raw byte relative */
7 makereference(p.scope, w, p.ptr);
8- if(!writelitbyte(0xff)) return 0;
9+ if(!writebyte(0xff)) return 0;
10 break;
11 case ',': /* literal byte relative */
12 makereference(p.scope, w, p.ptr);
13 if(!writelitbyte(0xff)) return 0;
14 break;
15- case ';': /* literal short absolute */
16+ case '-': /* raw byte absolute */
17 makereference(p.scope, w, p.ptr);
18- if(!writeshort(0xffff, 1)) return 0;
19+ if(!writebyte(0xff)) return 0;
20+ break;
21+ case '.': /* literal byte zero-page */
22+ makereference(p.scope, w, p.ptr);
23+ if(!writelitbyte(0xff)) return 0;
24 break;
25 case ':': /* raw short absolute */
26+ case '=':
27 makereference(p.scope, w, p.ptr);
28 if(!writeshort(0xffff, 0)) return 0;
29 break;
30+ case ';': /* literal short absolute */
31+ makereference(p.scope, w, p.ptr);
32+ if(!writeshort(0xffff, 1)) return 0;
33+ break;
34 case '"': /* raw string */
35 i = 0;
36 while((c = w[++i]))
37@@ -360,10 +369,12 @@ resolve(void)
38 for(i = 0; i < p.rlen; i++) {
39 Reference *r = &p.refs[i];
40 switch(r->rune) {
41- case '.':
42+ case '_':
43 if(!(l = findlabel(r->name)))
44- return error("Unknown zero-page reference", r->name);
45- p.data[r->addr + 1] = l->addr & 0xff;
46+ return error("Unknown relative reference", r->name);
47+ p.data[r->addr] = (Sint8)(l->addr - r->addr - 2);
48+ if((Sint8)p.data[r->addr] != (l->addr - r->addr - 2))
49+ return error("Relative reference is too far", r->name);
50 l->refs++;
51 break;
52 case ',':
53@@ -374,20 +385,33 @@ resolve(void)
54 return error("Relative reference is too far", r->name);
55 l->refs++;
56 break;
57- case ';':
58+ case '-':
59 if(!(l = findlabel(r->name)))
60 return error("Unknown absolute reference", r->name);
61- p.data[r->addr + 1] = l->addr >> 0x8;
62- p.data[r->addr + 2] = l->addr & 0xff;
63+ p.data[r->addr] = l->addr & 0xff;
64+ l->refs++;
65+ break;
66+ case '.':
67+ if(!(l = findlabel(r->name)))
68+ return error("Unknown zero-page reference", r->name);
69+ p.data[r->addr + 1] = l->addr & 0xff;
70 l->refs++;
71 break;
72 case ':':
73+ case '=':
74 if(!(l = findlabel(r->name)))
75 return error("Unknown absolute reference", r->name);
76- p.data[r->addr + 0] = l->addr >> 0x8;
77+ p.data[r->addr] = l->addr >> 0x8;
78 p.data[r->addr + 1] = l->addr & 0xff;
79 l->refs++;
80 break;
81+ case ';':
82+ if(!(l = findlabel(r->name)))
83+ return error("Unknown absolute reference", r->name);
84+ p.data[r->addr + 1] = l->addr >> 0x8;
85+ p.data[r->addr + 2] = l->addr & 0xff;
86+ l->refs++;
87+ break;
88 default:
89 return error("Unknown reference", r->name);
90 }
91@@ -424,6 +448,22 @@ review(char *filename)
92 p.mlen);
93 }
94
95+static void
96+writesym(char *filename)
97+{
98+ char symdst[0x40];
99+ FILE *fp = fopen(scat(scpy(filename, symdst, slen(filename) + 1), ".sym"), "w");
100+ int i;
101+ if(fp != NULL) {
102+ for(i = 0; i < p.llen; i++) {
103+ fwrite(&p.labels[i].addr + 1, 1, 1, fp);
104+ fwrite(&p.labels[i].addr, 1, 1, fp);
105+ fwrite(p.labels[i].name, slen(p.labels[i].name) + 1, 1, fp);
106+ }
107+ }
108+ fclose(fp);
109+}
110+
111 int
112 main(int argc, char *argv[])
113 {
114@@ -440,5 +480,6 @@ main(int argc, char *argv[])
115 return !error("Assembly", "Output rom is empty.");
116 fwrite(p.data + TRIM, p.length - TRIM, 1, dst);
117 review(argv[2]);
118+ writesym(argv[2]);
119 return 0;
120 }