Browse code

Started extracting the controller device

neauoire authored on 27/12/2021 05:33:23
Showing 1 changed files
... ...
@@ -393,22 +393,42 @@ restart(Uxn *u)
393 393
 	start(u, "boot.rom");
394 394
 }
395 395
 
396
+Uint8
397
+get_button(SDL_Event event)
398
+{
399
+	switch(event.key.keysym.sym) {
400
+	case SDLK_LCTRL: return 0x01;
401
+	case SDLK_LALT: return 0x02;
402
+	case SDLK_LSHIFT: return 0x04;
403
+	case SDLK_ESCAPE: return 0x08;
404
+	case SDLK_UP: return 0x10;
405
+	case SDLK_DOWN: return 0x20;
406
+	case SDLK_LEFT: return 0x40;
407
+	case SDLK_RIGHT: return 0x80;
408
+	}
409
+	return 0x00;
410
+}
411
+
412
+void
413
+controller_down(Device *d, Uint8 mask)
414
+{
415
+	d->dat[2] |= mask;
416
+	uxn_eval(d->u, d->vector);
417
+}
418
+
419
+void
420
+controller_up(Device *d, Uint8 mask)
421
+{
422
+	d->dat[2] &= (~mask);
423
+	uxn_eval(d->u, d->vector);
424
+}
425
+
396 426
 static void
397 427
 doctrl(Uxn *u, SDL_Event *event, int z)
398 428
 {
399
-	Uint8 flag = 0x00;
400 429
 	SDL_Keymod mods = SDL_GetModState();
401
-	devctrl->dat[2] &= 0xf8;
402
-	if(mods & KMOD_CTRL) devctrl->dat[2] |= 0x01;
403
-	if(mods & KMOD_ALT) devctrl->dat[2] |= 0x02;
404
-	if(mods & KMOD_SHIFT) devctrl->dat[2] |= 0x04;
405 430
 	/* clang-format off */
406 431
 	switch(event->key.keysym.sym) {
407
-	case SDLK_ESCAPE: flag = 0x08; break;
408
-	case SDLK_UP: flag = 0x10; break;
409
-	case SDLK_DOWN: flag = 0x20; break;
410
-	case SDLK_LEFT: flag = 0x40; break;
411
-	case SDLK_RIGHT: flag = 0x80; break;
412 432
 	case SDLK_F1: if(z) set_zoom(zoom > 2 ? 1 : zoom + 1); break;
413 433
 	case SDLK_F2: if(z) devsystem->dat[0xe] = !devsystem->dat[0xe]; ppu_clear(&ppu, &ppu.fg); break;
414 434
 	case SDLK_F3: if(z) capture_screen(); break;
... ...
@@ -417,13 +437,11 @@ doctrl(Uxn *u, SDL_Event *event, int z)
417 437
 	}
418 438
 	/* clang-format on */
419 439
 	if(z) {
420
-		devctrl->dat[2] |= flag;
421 440
 		if(event->key.keysym.sym < 0x20 || event->key.keysym.sym == SDLK_DELETE)
422 441
 			devctrl->dat[3] = event->key.keysym.sym;
423 442
 		else if((mods & KMOD_CTRL) && event->key.keysym.sym >= SDLK_a && event->key.keysym.sym <= SDLK_z)
424 443
 			devctrl->dat[3] = event->key.keysym.sym - (mods & KMOD_SHIFT) * 0x20;
425
-	} else
426
-		devctrl->dat[2] &= ~flag;
444
+	}
427 445
 }
428 446
 
429 447
 static const char *errors[] = {"underflow", "overflow", "division by zero"};
... ...
@@ -453,6 +471,22 @@ run(Uxn *u)
453 471
 		if(!BENCH)
454 472
 			begin = SDL_GetPerformanceCounter();
455 473
 		while(SDL_PollEvent(&event) != 0) {
474
+			/* new handlers */
475
+			if(event.type == SDL_MOUSEWHEEL)
476
+				mouse_z(devmouse, event.wheel.y);
477
+			else if(event.type == SDL_MOUSEBUTTONUP)
478
+				mouse_up(devmouse, 0x1 << (event.button.button - 1));
479
+			else if(event.type == SDL_MOUSEBUTTONDOWN)
480
+				mouse_down(devmouse, 0x1 << (event.button.button - 1));
481
+			else if(event.type == SDL_MOUSEMOTION)
482
+				mouse_xy(devmouse,
483
+					clamp(event.motion.x - PAD, 0, ppu.width - 1),
484
+					clamp(event.motion.y - PAD, 0, ppu.height - 1));
485
+			else if(event.type == SDL_KEYDOWN)
486
+				controller_down(devctrl, get_button(event));
487
+			else if(event.type == SDL_KEYUP)
488
+				controller_up(devctrl, get_button(event));
489
+			/* continue */
456 490
 			switch(event.type) {
457 491
 			case SDL_DROPFILE:
458 492
 				set_size(WIDTH, HEIGHT, 0);
... ...
@@ -474,20 +508,6 @@ run(Uxn *u)
474 508
 						goto breakout;
475 509
 				}
476 510
 				break;
477
-			case SDL_MOUSEWHEEL:
478
-				mouse_z(devmouse, event.wheel.y);
479
-				break;
480
-			case SDL_MOUSEBUTTONUP:
481
-				mouse_up(devmouse, 0x1 << (event.button.button - 1));
482
-				break;
483
-			case SDL_MOUSEBUTTONDOWN:
484
-				mouse_down(devmouse, 0x1 << (event.button.button - 1));
485
-				break;
486
-			case SDL_MOUSEMOTION:
487
-				mouse_xy(devmouse,
488
-					clamp(event.motion.x - PAD, 0, ppu.width - 1),
489
-					clamp(event.motion.y - PAD, 0, ppu.height - 1));
490
-				break;
491 511
 			case SDL_WINDOWEVENT:
492 512
 				if(event.window.event == SDL_WINDOWEVENT_EXPOSED)
493 513
 					redraw(u);