| ... | ... |
@@ -45,6 +45,7 @@ typedef struct {
|
| 45 | 45 |
|
| 46 | 46 |
Program p; |
| 47 | 47 |
static int litlast = 0; |
| 48 |
+static int jsrlast = 0; |
|
| 48 | 49 |
|
| 49 | 50 |
/* clang-format off */ |
| 50 | 51 |
|
| ... | ... |
@@ -199,9 +200,25 @@ writebyte(Uint8 b) |
| 199 | 200 |
p.data[p.ptr++] = b; |
| 200 | 201 |
p.length = p.ptr; |
| 201 | 202 |
litlast = 0; |
| 203 |
+ jsrlast = 0; |
|
| 202 | 204 |
return 1; |
| 203 | 205 |
} |
| 204 | 206 |
|
| 207 |
+static int |
|
| 208 |
+writeopcode(char *w) |
|
| 209 |
+{
|
|
| 210 |
+ Uint8 res; |
|
| 211 |
+ if(jsrlast && scmp(w, "JMP2r", 5)) { /* combine JSR2 JMP2r */
|
|
| 212 |
+ p.data[p.ptr - 1] = findopcode("JMP2");
|
|
| 213 |
+ jsrlast = 0; |
|
| 214 |
+ return 1; |
|
| 215 |
+ } |
|
| 216 |
+ res = writebyte(findopcode(w)); |
|
| 217 |
+ if(scmp(w, "JSR2", 4)) |
|
| 218 |
+ jsrlast = 1; |
|
| 219 |
+ return res; |
|
| 220 |
+} |
|
| 221 |
+ |
|
| 205 | 222 |
static int |
| 206 | 223 |
writeshort(Uint16 s, int lit) |
| 207 | 224 |
{
|
| ... | ... |
@@ -329,7 +346,7 @@ parse(char *w, FILE *f) |
| 329 | 346 |
default: |
| 330 | 347 |
/* opcode */ |
| 331 | 348 |
if(findopcode(w) || scmp(w, "BRK", 4)) {
|
| 332 |
- if(!writebyte(findopcode(w))) return 0; |
|
| 349 |
+ if(!writeopcode(w)) return 0; |
|
| 333 | 350 |
} |
| 334 | 351 |
/* raw byte */ |
| 335 | 352 |
else if(sihx(w) && slen(w) == 2) {
|