... | ... |
@@ -47,6 +47,7 @@ typedef struct { |
47 | 47 |
} Program; |
48 | 48 |
|
49 | 49 |
Program p; |
50 |
+static int litlast = 0; |
|
50 | 51 |
|
51 | 52 |
/* clang-format off */ |
52 | 53 |
|
... | ... |
@@ -184,6 +185,7 @@ writebyte(Uint8 b, int lit) |
184 | 185 |
if(lit) writebyte(findopcode("LIT"), 0); |
185 | 186 |
p.data[p.ptr++] = b; |
186 | 187 |
p.length = p.ptr; |
188 |
+ litlast = 0; |
|
187 | 189 |
} |
188 | 190 |
|
189 | 191 |
static void |
... | ... |
@@ -194,6 +196,22 @@ writeshort(Uint16 s, int lit) |
194 | 196 |
writebyte(s & 0xff, 0); |
195 | 197 |
} |
196 | 198 |
|
199 |
+static void |
|
200 |
+writelitbyte(Uint8 b) |
|
201 |
+{ |
|
202 |
+ if(litlast) { /* combine literals */ |
|
203 |
+ Uint8 hb = p.data[p.ptr - 1]; |
|
204 |
+ p.ptr -= 2; |
|
205 |
+ writeshort((hb << 8) + b, 1); |
|
206 |
+ litlast = 0; |
|
207 |
+ return; |
|
208 |
+ } |
|
209 |
+ p.data[p.ptr++] = findopcode("LIT"); |
|
210 |
+ p.data[p.ptr++] = b; |
|
211 |
+ p.length = p.ptr; |
|
212 |
+ litlast = 1; |
|
213 |
+} |
|
214 |
+ |
|
197 | 215 |
static char * |
198 | 216 |
sublabel(char *src, char *scope, char *name) |
199 | 217 |
{ |
... | ... |
@@ -216,11 +234,9 @@ prefill(char *scope, char *label, Uint16 addr) |
216 | 234 |
static int |
217 | 235 |
tokenize(char *w, FILE *f) |
218 | 236 |
{ |
219 |
- char word[64]; |
|
220 |
- char subw[64]; |
|
221 |
- char c; |
|
222 |
- Macro *m; |
|
223 | 237 |
int i = 0; |
238 |
+ char word[64], subw[64], c; |
|
239 |
+ Macro *m; |
|
224 | 240 |
if(slen(w) >= 63) |
225 | 241 |
return error("Invalid token", w); |
226 | 242 |
switch(w[0]) { |
... | ... |
@@ -259,14 +275,17 @@ tokenize(char *w, FILE *f) |
259 | 275 |
if(!sihx(w + 1) || (slen(w) != 3 && slen(w) != 5)) |
260 | 276 |
return error("Invalid hex literal", w); |
261 | 277 |
if(slen(w) == 3) |
262 |
- writebyte(shex(w + 1), 1); |
|
278 |
+ writelitbyte(shex(w + 1)); |
|
263 | 279 |
else if(slen(w) == 5) |
264 | 280 |
writeshort(shex(w + 1), 1); |
265 | 281 |
break; |
266 | 282 |
case '.': /* literal byte zero-page */ |
283 |
+ prefill(p.scope, w, p.ptr - litlast); |
|
284 |
+ writelitbyte(0xff); |
|
285 |
+ break; |
|
267 | 286 |
case ',': /* literal byte relative */ |
268 |
- prefill(p.scope, w, p.ptr); |
|
269 |
- writebyte(0xff, 1); |
|
287 |
+ prefill(p.scope, w, p.ptr - litlast); |
|
288 |
+ writelitbyte(0xff); |
|
270 | 289 |
break; |
271 | 290 |
case ';': /* literal short absolute */ |
272 | 291 |
prefill(p.scope, w, p.ptr); |