| ... | ... |
@@ -40,18 +40,21 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn |
| 40 | 40 |
|
| 41 | 41 |
@loop |
| 42 | 42 |
,dev1w STR |
| 43 |
- ,iterator LDR |
|
| 44 |
- ,01 ADD |
|
| 45 |
- ,iterator STR |
|
| 46 |
- ,iterator LDR |
|
| 43 |
+ ,incr JSU ( call incr ) |
|
| 47 | 44 |
,05 NEQ ,loop ROT JSC |
| 48 | 45 |
|
| 49 | 46 |
BRK ( RESET ) |
| 50 | 47 |
|
| 48 |
+@incr |
|
| 49 |
+ ,iterator LDR |
|
| 50 |
+ ,01 ADD |
|
| 51 |
+ ,iterator STR |
|
| 52 |
+ ,iterator LDR |
|
| 53 |
+ RTS |
|
| 54 |
+ |
|
| 51 | 55 |
|c000 @FRAME BRK |
| 52 | 56 |
|d000 @ERROR BRK |
| 53 | 57 |
|FFFA .RESET .FRAME .ERROR |
| 54 |
- |
|
| 55 | 58 |
``` |
| 56 | 59 |
|
| 57 | 60 |
## Mission |
| ... | ... |
@@ -82,4 +85,4 @@ https://code.9front.org/hg/plan9front/file/a7f9946e238f/sys/src/games/nes/cpu.c |
| 82 | 85 |
http://www.w3group.de/stable_glossar.html |
| 83 | 86 |
http://www.emulator101.com/6502-addressing-modes.html |
| 84 | 87 |
http://forth.works/8f0c04f616b6c34496eb2141785b4454 |
| 85 |
-https://justinmeiners.github.io/lc3-vm/ |
|
| 86 | 88 |
\ No newline at end of file |
| 89 |
+https://justinmeiners.github.io/lc3-vm/ |
| ... | ... |
@@ -10,14 +10,18 @@ |
| 10 | 10 |
|
| 11 | 11 |
@loop |
| 12 | 12 |
,dev1w STR |
| 13 |
- ,iterator LDR |
|
| 14 |
- ,01 ADD |
|
| 15 |
- ,iterator STR |
|
| 16 |
- ,iterator LDR |
|
| 13 |
+ ,incr JSU ( call incr ) |
|
| 17 | 14 |
,05 NEQ ,loop ROT JSC |
| 18 | 15 |
|
| 19 | 16 |
BRK ( RESET ) |
| 20 | 17 |
|
| 18 |
+@incr |
|
| 19 |
+ ,iterator LDR |
|
| 20 |
+ ,01 ADD |
|
| 21 |
+ ,iterator STR |
|
| 22 |
+ ,iterator LDR |
|
| 23 |
+ RTS |
|
| 24 |
+ |
|
| 21 | 25 |
|c000 @FRAME BRK |
| 22 | 26 |
|d000 @ERROR BRK |
| 23 | 27 |
|FFFA .RESET .FRAME .ERROR |
| ... | ... |
@@ -164,7 +164,7 @@ reset(void) |
| 164 | 164 |
int |
| 165 | 165 |
error(char *name) |
| 166 | 166 |
{
|
| 167 |
- printf("Error: %s\n", name);
|
|
| 167 |
+ printf("Error: %s, at 0x%04x\n", name, cpu.counter);
|
|
| 168 | 168 |
return 0; |
| 169 | 169 |
} |
| 170 | 170 |
|
| ... | ... |
@@ -195,8 +195,7 @@ eval(void) |
| 195 | 195 |
if(instr > 0x10) |
| 196 | 196 |
setflag(FLAG_ZERO, 0); |
| 197 | 197 |
if(cpu.counter == 128) {
|
| 198 |
- printf("REACHED COUNTER\n");
|
|
| 199 |
- return 0; |
|
| 198 |
+ return error("Reached bounds");
|
|
| 200 | 199 |
} |
| 201 | 200 |
cpu.counter++; |
| 202 | 201 |
return 1; |
| ... | ... |
@@ -107,12 +107,6 @@ shex(char *s) /* string to num */ |
| 107 | 107 |
return n; |
| 108 | 108 |
} |
| 109 | 109 |
|
| 110 |
-int |
|
| 111 |
-ismarker(char *w) |
|
| 112 |
-{
|
|
| 113 |
- return w[0] == '[' || w[0] == ']' || w[0] == '{' || w[0] == '}';
|
|
| 114 |
-} |
|
| 115 |
- |
|
| 116 | 110 |
int |
| 117 | 111 |
iscomment(char *w, int *skip) |
| 118 | 112 |
{
|
| ... | ... |
@@ -173,7 +167,7 @@ findlabel(char *s) |
| 173 | 167 |
int |
| 174 | 168 |
error(char *name, char *id) |
| 175 | 169 |
{
|
| 176 |
- printf("Error: %s(%s)\n", name, id);
|
|
| 170 |
+ printf("Error: %s[%s]\n", name, id);
|
|
| 177 | 171 |
return 0; |
| 178 | 172 |
} |
| 179 | 173 |
|
| ... | ... |
@@ -241,9 +235,7 @@ pass1(FILE *f) |
| 241 | 235 |
else if(w[0] == '"') |
| 242 | 236 |
addr += slen(w + 1) + 2; |
| 243 | 237 |
else if(w[0] == ',') |
| 244 |
- addr += 4; |
|
| 245 |
- else if(ismarker(w)) |
|
| 246 |
- addr += 0; |
|
| 238 |
+ addr += 2 + (sihx(w + 1) && slen(w + 1) == 2 ? 1 : 2); |
|
| 247 | 239 |
else |
| 248 | 240 |
return error("Unknown label", w);
|
| 249 | 241 |
} |
| ... | ... |
@@ -262,7 +254,7 @@ pass2(FILE *f) |
| 262 | 254 |
if(w[0] == '@') continue; |
| 263 | 255 |
if(w[0] == ';') continue; |
| 264 | 256 |
suca(w); |
| 265 |
- if(iscomment(w, &skip) || ismarker(w)) continue; |
|
| 257 |
+ if(iscomment(w, &skip)) continue; |
|
| 266 | 258 |
if(w[0] == '|') |
| 267 | 259 |
p.ptr = shex(w + 1); |
| 268 | 260 |
else if(w[0] == ':') |