... | ... |
@@ -14,5 +14,5 @@ cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werr |
14 | 14 |
cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxn.c -o uxn |
15 | 15 |
|
16 | 16 |
# run |
17 |
-./uxnasm examples/condjump.usm boot.rom |
|
17 |
+./uxnasm examples/test.usm boot.rom |
|
18 | 18 |
./uxn boot.rom |
... | ... |
@@ -1,30 +1,10 @@ |
1 |
-( blank project ) |
|
1 |
+( blank ) |
|
2 | 2 |
|
3 |
-;variable1 |
|
4 |
-:constant1 9abc |
|
3 |
+;iterator |
|
4 |
+:dev1r FFF0 |
|
5 |
+:dev1w FFF1 |
|
5 | 6 |
|
6 |
-|0100 ( -------------------------------- ) |
|
7 |
- |
|
8 |
-@RESET |
|
9 |
- |
|
10 |
-,abcd |
|
11 |
- |
|
12 |
-BRK ( RESET-END ) |
|
13 |
- |
|
14 |
-|c000 ( -------------------------------- ) |
|
15 |
- |
|
16 |
-@FRAME ( FRAME-START ) |
|
17 |
- |
|
18 |
-,abcd |
|
19 |
- |
|
20 |
-BRK ( FRAME-END ) |
|
21 |
- |
|
22 |
-|d000 ( -------------------------------- ) |
|
23 |
- |
|
24 |
-@ERROR BRK |
|
25 |
- |
|
26 |
-|FFFA ( -------------------------------- ) |
|
27 |
- |
|
28 |
-.RESET |
|
29 |
-.FRAME |
|
30 |
-.ERROR |
|
7 |
+|0100 @RESET BRK |
|
8 |
+|c000 @FRAME BRK |
|
9 |
+|d000 @ERROR BRK |
|
10 |
+|FFFA .RESET .FRAME .ERROR |
... | ... |
@@ -1,8 +1,24 @@ |
1 |
-< loop > |
|
1 |
+( loop ) |
|
2 | 2 |
|
3 |
-01 .loop JSI ffff BRK |
|
3 |
+|0100 @RESET |
|
4 | 4 |
|
5 |
-:loop |
|
6 |
- 01 ADD |
|
7 |
- 0f NEQ .loop JMC |
|
8 |
- RTS |
|
5 |
+( increment value on stack ) |
|
6 |
+ |
|
7 |
+,00 |
|
8 |
+ |
|
9 |
+@loop1 |
|
10 |
+ ,01 ADD DUP |
|
11 |
+ ,ff NEQ ,loop1 ROT JMP? POP^ |
|
12 |
+ |
|
13 |
+( increment value in memory ) |
|
14 |
+ |
|
15 |
+@loop2 |
|
16 |
+ #00 LDR ,01 ADD #00 STR |
|
17 |
+ #00 LDR |
|
18 |
+ ,ff NEQ ,loop2 ROT JMP? POP^ |
|
19 |
+ |
|
20 |
+BRK |
|
21 |
+ |
|
22 |
+|c000 @FRAME BRK |
|
23 |
+|d000 @ERROR BRK |
|
24 |
+|FFFA .RESET .FRAME .ERROR |
11 | 1 |
similarity index 74% |
12 | 2 |
rename from examples/core.usm |
13 | 3 |
rename to examples/test.usm |
... | ... |
@@ -1,4 +1,4 @@ |
1 |
-( hello world ) |
|
1 |
+( my default test file ) |
|
2 | 2 |
|
3 | 3 |
;iterator |
4 | 4 |
:dev1r FFF0 |
... | ... |
@@ -6,6 +6,8 @@ |
6 | 6 |
|
7 | 7 |
|0100 @RESET |
8 | 8 |
|
9 |
+,01 ,02 ADD |
|
10 |
+ |
|
9 | 11 |
|c000 @FRAME BRK |
10 | 12 |
|d000 @ERROR BRK |
11 | 13 |
|FFFA .RESET .FRAME .ERROR |
... | ... |
@@ -158,13 +158,13 @@ void (*ops[])() = { |
158 | 158 |
op_add16, op_sub16, op_mul16, op_div16, op_equ16, op_neq16, op_gth16, op_lth16 |
159 | 159 |
}; |
160 | 160 |
|
161 |
-Uint8 opr[][2] = { /* TODO */ |
|
162 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
163 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
164 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
165 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
166 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
167 |
- {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} |
|
161 |
+Uint8 opr[][2] = { |
|
162 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {2,1}, {3,0}, |
|
163 |
+ {2,0}, {2,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, |
|
164 |
+ {1,0}, {1,2}, {2,2}, {3,3}, {3,3}, {2,1}, {2,1}, {2,1}, |
|
165 |
+ {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, |
|
166 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, /* TODO */ |
|
167 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} /* TODO */ |
|
168 | 168 |
}; |
169 | 169 |
|
170 | 170 |
/* clang-format on */ |
... | ... |
@@ -177,54 +177,52 @@ error(char *name, int id) |
177 | 177 |
} |
178 | 178 |
|
179 | 179 |
int |
180 |
-device1(Uint8 *read, Uint8 *write) |
|
180 |
+doliteral(Uint8 instr) |
|
181 | 181 |
{ |
182 |
- printf("%c", *write); |
|
183 |
- *write = 0; |
|
184 |
- (void)read; |
|
185 |
- return 0; |
|
182 |
+ if(cpu.wst.ptr >= 255) |
|
183 |
+ return error("Stack overflow", instr); |
|
184 |
+ wspush8(instr); |
|
185 |
+ cpu.literal--; |
|
186 |
+ return 1; |
|
186 | 187 |
} |
187 | 188 |
|
188 |
-void |
|
189 |
-opc(Uint8 src, Uint8 *op) |
|
189 |
+int |
|
190 |
+dodevices(void) /* experimental */ |
|
190 | 191 |
{ |
191 |
- *op = src; |
|
192 |
- *op &= ~(1 << 5); |
|
193 |
- *op &= ~(1 << 6); |
|
194 |
- *op &= ~(1 << 7); |
|
192 |
+ if(cpu.ram.dat[0xfff1]) { |
|
193 |
+ printf("%c", cpu.ram.dat[0xfff1]); |
|
194 |
+ cpu.ram.dat[0xfff1] = 0x00; |
|
195 |
+ } |
|
196 |
+ return 1; |
|
195 | 197 |
} |
196 | 198 |
|
197 | 199 |
int |
198 |
-eval(void) |
|
200 |
+doopcode(Uint8 instr) |
|
199 | 201 |
{ |
200 |
- Uint8 op, instr = cpu.ram.dat[cpu.ram.ptr++]; |
|
201 |
- /* when literal */ |
|
202 |
- if(cpu.literal > 0) { |
|
203 |
- wspush8(instr); |
|
204 |
- cpu.literal--; |
|
205 |
- return 1; |
|
206 |
- } |
|
207 |
- /* when opcode */ |
|
208 |
- opc(instr, &op); |
|
202 |
+ Uint8 op = instr & 0x1f; |
|
209 | 203 |
setflag(FLAG_SHORT, (instr >> 5) & 1); |
210 |
- setflag(FLAG_SIGN, (instr >> 6) & 1); /* TODO: Implement */ |
|
204 |
+ setflag(FLAG_SIGN, (instr >> 6) & 1); /* usused */ |
|
211 | 205 |
setflag(FLAG_COND, (instr >> 7) & 1); |
212 |
- /* TODO: overflow */ |
|
213 |
- if(cpu.wst.ptr < opr[op][0]) |
|
214 |
- return error("Stack underflow", op); |
|
215 |
- /* short mode */ |
|
216 | 206 |
if(getflag(FLAG_SHORT)) |
217 | 207 |
op += 16; |
218 |
- /* cond mode */ |
|
219 |
- if(getflag(FLAG_COND)) { |
|
220 |
- if(wspop8()) |
|
221 |
- (*ops[op])(); |
|
222 |
- } else |
|
208 |
+ if(cpu.wst.ptr < opr[op][0]) |
|
209 |
+ return error("Stack underflow", op); |
|
210 |
+ if(cpu.wst.ptr + opr[op][1] - opr[op][0] >= 255) |
|
211 |
+ return error("Stack overflow", instr); |
|
212 |
+ if(!getflag(FLAG_COND) || (getflag(FLAG_COND) && wspop8())) |
|
223 | 213 |
(*ops[op])(); |
224 |
- /* devices: experimental */ |
|
225 |
- if(cpu.ram.dat[0xfff1]) |
|
226 |
- device1(&cpu.ram.dat[0xfff0], &cpu.ram.dat[0xfff1]); |
|
227 |
- cpu.counter++; |
|
214 |
+ dodevices(); |
|
215 |
+ return 1; |
|
216 |
+} |
|
217 |
+ |
|
218 |
+int |
|
219 |
+eval(void) |
|
220 |
+{ |
|
221 |
+ Uint8 instr = cpu.ram.dat[cpu.ram.ptr++]; |
|
222 |
+ if(cpu.literal > 0) |
|
223 |
+ return doliteral(instr); |
|
224 |
+ else |
|
225 |
+ return doopcode(instr); |
|
228 | 226 |
return 1; |
229 | 227 |
} |
230 | 228 |
|
... | ... |
@@ -236,9 +234,9 @@ load(FILE *f) |
236 | 234 |
} |
237 | 235 |
|
238 | 236 |
void |
239 |
-debug(void) |
|
237 |
+echof(void) |
|
240 | 238 |
{ |
241 |
- printf("ended @ %d steps | hf: %x sf: %x cf: %x tf: %x\n", |
|
239 |
+ printf("ended @ %d steps | hf: %x sf: %x sf: %x cf: %x\n", |
|
242 | 240 |
cpu.counter, |
243 | 241 |
getflag(FLAG_HALT) != 0, |
244 | 242 |
getflag(FLAG_SHORT) != 0, |
... | ... |
@@ -256,12 +254,12 @@ boot(void) |
256 | 254 |
cpu.ram.ptr = cpu.vreset; |
257 | 255 |
setflag(FLAG_HALT, 0); |
258 | 256 |
while(!(cpu.status & FLAG_HALT) && eval()) |
259 |
- ; |
|
257 |
+ cpu.counter++; |
|
260 | 258 |
/*eval frame */ |
261 | 259 |
cpu.ram.ptr = cpu.vframe; |
262 | 260 |
setflag(FLAG_HALT, 0); |
263 | 261 |
while(!(cpu.status & FLAG_HALT) && eval()) |
264 |
- ; |
|
262 |
+ cpu.counter++; |
|
265 | 263 |
return 1; |
266 | 264 |
} |
267 | 265 |
|
... | ... |
@@ -280,6 +278,6 @@ main(int argc, char *argv[]) |
280 | 278 |
/* print result */ |
281 | 279 |
echos(&cpu.wst, 0x40, "stack"); |
282 | 280 |
echom(&cpu.ram, 0x40, "ram"); |
283 |
- debug(); |
|
281 |
+ echof(); |
|
284 | 282 |
return 0; |
285 | 283 |
} |