| ... | ... |
@@ -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++); |