Browse code

Progress toward boot.rom setup

Devine Lu Linvega authored on 08/11/2021 15:51:09
Showing 3 changed files
... ...
@@ -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
 
69 69
similarity index 100%
70 70
rename from projects/software/launcher.tal
71 71
rename to projects/software/boot.tal
... ...
@@ -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++);