... | ... |
@@ -5,6 +5,7 @@ rm -f ./bin/uxnasm |
5 | 5 |
rm -f ./bin/uxnemu |
6 | 6 |
rm -f ./bin/uxncli |
7 | 7 |
rm -f ./bin/boot.rom |
8 |
+rm -f ./bin/asma.rom |
|
8 | 9 |
|
9 | 10 |
# When clang-format is present |
10 | 11 |
|
... | ... |
@@ -60,9 +61,8 @@ then |
60 | 61 |
cp bin/uxnemu bin/uxnasm bin/uxncli $HOME/bin/ |
61 | 62 |
fi |
62 | 63 |
|
63 |
-# echo "Assembling(uxnasm).." |
|
64 |
-# ./bin/uxnasm projects/examples/demos/piano.tal bin/piano.rom |
|
65 |
- |
|
64 |
+echo "Assembling(boot).." |
|
65 |
+./bin/uxnasm projects/software/boot.tal bin/boot.rom |
|
66 | 66 |
echo "Assembling(asma).." |
67 | 67 |
./bin/uxnasm projects/software/asma.tal bin/asma.rom |
68 | 68 |
|
... | ... |
@@ -197,7 +197,7 @@ quit(void) |
197 | 197 |
} |
198 | 198 |
|
199 | 199 |
static int |
200 |
-init(char *filepath) |
|
200 |
+init(void) |
|
201 | 201 |
{ |
202 | 202 |
SDL_AudioSpec as; |
203 | 203 |
SDL_zero(as); |
... | ... |
@@ -216,7 +216,7 @@ init(char *filepath) |
216 | 216 |
if(!audio_id) |
217 | 217 |
error("sdl_audio", SDL_GetError()); |
218 | 218 |
} |
219 |
- gWindow = SDL_CreateWindow(filepath, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (WIDTH + PAD * 2) * zoom, (HEIGHT + PAD * 2) * zoom, SDL_WINDOW_SHOWN); |
|
219 |
+ gWindow = SDL_CreateWindow("Uxn", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (WIDTH + PAD * 2) * zoom, (HEIGHT + PAD * 2) * zoom, SDL_WINDOW_SHOWN); |
|
220 | 220 |
if(gWindow == NULL) |
221 | 221 |
return error("sdl_window", SDL_GetError()); |
222 | 222 |
gRenderer = SDL_CreateRenderer(gWindow, -1, 0); |
... | ... |
@@ -257,37 +257,6 @@ domouse(SDL_Event *event) |
257 | 257 |
} |
258 | 258 |
} |
259 | 259 |
|
260 |
-static void |
|
261 |
-doctrl(SDL_Event *event, int z) |
|
262 |
-{ |
|
263 |
- Uint8 flag = 0x00; |
|
264 |
- SDL_Keymod mods = SDL_GetModState(); |
|
265 |
- devctrl->dat[2] &= 0xf8; |
|
266 |
- if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01; |
|
267 |
- if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02; |
|
268 |
- if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04; |
|
269 |
- /* clang-format off */ |
|
270 |
- switch(event->key.keysym.sym) { |
|
271 |
- case SDLK_ESCAPE: flag = 0x08; break; |
|
272 |
- case SDLK_UP: flag = 0x10; break; |
|
273 |
- case SDLK_DOWN: flag = 0x20; break; |
|
274 |
- case SDLK_LEFT: flag = 0x40; break; |
|
275 |
- case SDLK_RIGHT: flag = 0x80; break; |
|
276 |
- case SDLK_F1: if(z) set_zoom(zoom > 2 ? 1 : zoom + 1); break; |
|
277 |
- case SDLK_F2: if(z) devsystem->dat[0xe] = !devsystem->dat[0xe]; break; |
|
278 |
- case SDLK_F3: if(z) capture_screen(); break; |
|
279 |
- } |
|
280 |
- /* clang-format on */ |
|
281 |
- if(z) { |
|
282 |
- devctrl->dat[2] |= flag; |
|
283 |
- if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE) |
|
284 |
- devctrl->dat[3] = event->key.keysym.sym; |
|
285 |
- else if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z) |
|
286 |
- devctrl->dat[3] = event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20; |
|
287 |
- } else |
|
288 |
- devctrl->dat[2] &= ~flag; |
|
289 |
-} |
|
290 |
- |
|
291 | 260 |
#pragma mark - Devices |
292 | 261 |
|
293 | 262 |
static Uint8 |
... | ... |
@@ -444,6 +413,89 @@ nil_deo(Device *d, Uint8 port) |
444 | 413 |
if(port == 0x1) d->vector = peek16(d->dat, 0x0); |
445 | 414 |
} |
446 | 415 |
|
416 |
+/* Boot */ |
|
417 |
+ |
|
418 |
+static int |
|
419 |
+load(Uxn *u, char *rom) |
|
420 |
+{ |
|
421 |
+ FILE *f; |
|
422 |
+ if(!(f = fopen(rom, "rb"))) return 0; |
|
423 |
+ fread(u->ram.dat + PAGE_PROGRAM, sizeof(u->ram.dat) - PAGE_PROGRAM, 1, f); |
|
424 |
+ fprintf(stderr, "Loaded %s\n", rom); |
|
425 |
+ SDL_SetWindowTitle(gWindow, rom); |
|
426 |
+ return 1; |
|
427 |
+} |
|
428 |
+ |
|
429 |
+static int |
|
430 |
+boot(Uxn *u, char *rom) |
|
431 |
+{ |
|
432 |
+ if(!uxn_boot(u)) |
|
433 |
+ return error("Boot", "Failed to start uxn."); |
|
434 |
+ if(!load(u, rom)) |
|
435 |
+ return error("Boot", "Failed to load rom."); |
|
436 |
+ |
|
437 |
+ /* system */ devsystem = uxn_port(u, 0x0, system_dei, system_deo); |
|
438 |
+ /* console */ devconsole = uxn_port(u, 0x1, nil_dei, console_deo); |
|
439 |
+ /* screen */ devscreen = uxn_port(u, 0x2, screen_dei, screen_deo); |
|
440 |
+ /* audio0 */ devaudio0 = uxn_port(u, 0x3, audio_dei, audio_deo); |
|
441 |
+ /* audio1 */ uxn_port(u, 0x4, audio_dei, audio_deo); |
|
442 |
+ /* audio2 */ uxn_port(u, 0x5, audio_dei, audio_deo); |
|
443 |
+ /* audio3 */ uxn_port(u, 0x6, audio_dei, audio_deo); |
|
444 |
+ /* unused */ uxn_port(u, 0x7, nil_dei, nil_deo); |
|
445 |
+ /* control */ devctrl = uxn_port(u, 0x8, nil_dei, nil_deo); |
|
446 |
+ /* mouse */ devmouse = uxn_port(u, 0x9, nil_dei, nil_deo); |
|
447 |
+ /* file */ uxn_port(u, 0xa, nil_dei, file_deo); |
|
448 |
+ /* datetime */ uxn_port(u, 0xb, datetime_dei, nil_deo); |
|
449 |
+ /* unused */ uxn_port(u, 0xc, nil_dei, nil_deo); |
|
450 |
+ /* unused */ uxn_port(u, 0xd, nil_dei, nil_deo); |
|
451 |
+ /* unused */ uxn_port(u, 0xe, nil_dei, nil_deo); |
|
452 |
+ /* unused */ uxn_port(u, 0xf, nil_dei, nil_deo); |
|
453 |
+ |
|
454 |
+ if(!uxn_eval(u, PAGE_PROGRAM)) |
|
455 |
+ return error("Boot", "Failed to start rom."); |
|
456 |
+ |
|
457 |
+ return 1; |
|
458 |
+} |
|
459 |
+ |
|
460 |
+void |
|
461 |
+reboot(Uxn *u) |
|
462 |
+{ |
|
463 |
+ set_size(WIDTH, HEIGHT, 1); |
|
464 |
+ boot(u, "bin/boot.rom"); |
|
465 |
+} |
|
466 |
+ |
|
467 |
+static void |
|
468 |
+doctrl(Uxn *u, SDL_Event *event, int z) |
|
469 |
+{ |
|
470 |
+ Uint8 flag = 0x00; |
|
471 |
+ SDL_Keymod mods = SDL_GetModState(); |
|
472 |
+ devctrl->dat[2] &= 0xf8; |
|
473 |
+ if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01; |
|
474 |
+ if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02; |
|
475 |
+ if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04; |
|
476 |
+ /* clang-format off */ |
|
477 |
+ switch(event->key.keysym.sym) { |
|
478 |
+ case SDLK_ESCAPE: flag = 0x08; break; |
|
479 |
+ case SDLK_UP: flag = 0x10; break; |
|
480 |
+ case SDLK_DOWN: flag = 0x20; break; |
|
481 |
+ case SDLK_LEFT: flag = 0x40; break; |
|
482 |
+ case SDLK_RIGHT: flag = 0x80; break; |
|
483 |
+ case SDLK_F1: if(z) set_zoom(zoom > 2 ? 1 : zoom + 1); break; |
|
484 |
+ case SDLK_F2: if(z) devsystem->dat[0xe] = !devsystem->dat[0xe]; break; |
|
485 |
+ case SDLK_F3: if(z) capture_screen(); break; |
|
486 |
+ case SDLK_F4: if(z) reboot(u); break; |
|
487 |
+ } |
|
488 |
+ /* clang-format on */ |
|
489 |
+ if(z) { |
|
490 |
+ devctrl->dat[2] |= flag; |
|
491 |
+ if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE) |
|
492 |
+ devctrl->dat[3] = event->key.keysym.sym; |
|
493 |
+ else if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z) |
|
494 |
+ devctrl->dat[3] = event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20; |
|
495 |
+ } else |
|
496 |
+ devctrl->dat[2] &= ~flag; |
|
497 |
+} |
|
498 |
+ |
|
447 | 499 |
static const char *errors[] = {"underflow", "overflow", "division by zero"}; |
448 | 500 |
|
449 | 501 |
int |
... | ... |
@@ -477,7 +529,7 @@ run(Uxn *u) |
477 | 529 |
devctrl->dat[3] = event.text.text[0]; /* fall-thru */ |
478 | 530 |
case SDL_KEYDOWN: |
479 | 531 |
case SDL_KEYUP: |
480 |
- doctrl(&event, event.type == SDL_KEYDOWN); |
|
532 |
+ doctrl(u, &event, event.type == SDL_KEYDOWN); |
|
481 | 533 |
uxn_eval(u, devctrl->vector); |
482 | 534 |
devctrl->dat[3] = 0; |
483 | 535 |
break; |
... | ... |
@@ -510,16 +562,6 @@ run(Uxn *u) |
510 | 562 |
return error("Run", "Ended."); |
511 | 563 |
} |
512 | 564 |
|
513 |
-static int |
|
514 |
-load(Uxn *u, char *filepath) |
|
515 |
-{ |
|
516 |
- FILE *f; |
|
517 |
- if(!(f = fopen(filepath, "rb"))) return 0; |
|
518 |
- fread(u->ram.dat + PAGE_PROGRAM, sizeof(u->ram.dat) - PAGE_PROGRAM, 1, f); |
|
519 |
- fprintf(stderr, "Loaded %s\n", filepath); |
|
520 |
- return 1; |
|
521 |
-} |
|
522 |
- |
|
523 | 565 |
int |
524 | 566 |
main(int argc, char **argv) |
525 | 567 |
{ |
... | ... |
@@ -527,25 +569,10 @@ main(int argc, char **argv) |
527 | 569 |
Uxn u; |
528 | 570 |
int i, loaded = 0; |
529 | 571 |
|
530 |
- if(!uxn_boot(&u)) |
|
531 |
- return error("Boot", "Failed to start uxn."); |
|
532 |
- |
|
533 |
- /* system */ devsystem = uxn_port(&u, 0x0, system_dei, system_deo); |
|
534 |
- /* console */ devconsole = uxn_port(&u, 0x1, nil_dei, console_deo); |
|
535 |
- /* screen */ devscreen = uxn_port(&u, 0x2, screen_dei, screen_deo); |
|
536 |
- /* audio0 */ devaudio0 = uxn_port(&u, 0x3, audio_dei, audio_deo); |
|
537 |
- /* audio1 */ uxn_port(&u, 0x4, audio_dei, audio_deo); |
|
538 |
- /* audio2 */ uxn_port(&u, 0x5, audio_dei, audio_deo); |
|
539 |
- /* audio3 */ uxn_port(&u, 0x6, audio_dei, audio_deo); |
|
540 |
- /* unused */ uxn_port(&u, 0x7, nil_dei, nil_deo); |
|
541 |
- /* control */ devctrl = uxn_port(&u, 0x8, nil_dei, nil_deo); |
|
542 |
- /* mouse */ devmouse = uxn_port(&u, 0x9, nil_dei, nil_deo); |
|
543 |
- /* file */ uxn_port(&u, 0xa, nil_dei, file_deo); |
|
544 |
- /* datetime */ uxn_port(&u, 0xb, datetime_dei, nil_deo); |
|
545 |
- /* unused */ uxn_port(&u, 0xc, nil_dei, nil_deo); |
|
546 |
- /* unused */ uxn_port(&u, 0xd, nil_dei, nil_deo); |
|
547 |
- /* unused */ uxn_port(&u, 0xe, nil_dei, nil_deo); |
|
548 |
- /* unused */ uxn_port(&u, 0xf, nil_dei, nil_deo); |
|
572 |
+ if(!init()) |
|
573 |
+ return error("Init", "Failed to initialize emulator."); |
|
574 |
+ if(!set_size(WIDTH, HEIGHT, 0)) |
|
575 |
+ return error("Window", "Failed to set window size."); |
|
549 | 576 |
|
550 | 577 |
/* set default zoom */ |
551 | 578 |
if(SDL_GetCurrentDisplayMode(0, &DM) == 0) |
... | ... |
@@ -558,14 +585,8 @@ main(int argc, char **argv) |
558 | 585 |
else |
559 | 586 |
return error("Opt", "-s No scale provided."); |
560 | 587 |
} else if(!loaded++) { |
561 |
- if(!load(&u, argv[i])) |
|
562 |
- return error("Load", "Failed to open rom."); |
|
563 |
- if(!init(argv[i])) |
|
564 |
- return error("Init", "Failed to initialize emulator."); |
|
565 |
- if(!set_size(WIDTH, HEIGHT, 0)) |
|
566 |
- return error("Window", "Failed to set window size."); |
|
567 |
- if(!uxn_eval(&u, PAGE_PROGRAM)) |
|
568 |
- return error("Init", "Failed"); |
|
588 |
+ if(!boot(&u, argv[i])) |
|
589 |
+ return error("Boot", "Failed to boot."); |
|
569 | 590 |
} else { |
570 | 591 |
char *p = argv[i]; |
571 | 592 |
while(*p) console_input(&u, *p++); |