aboutsummaryrefslogtreecommitdiffstats
path: root/src/gba/gba.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2024-01-08 15:32:13 +0100
committerBad Diode <bd@badd10de.dev>2024-01-08 15:32:13 +0100
commitbe37f274be067e92f9240112b7a047b8ef9e09b0 (patch)
treefb5a45cd6f605e607c5bd8e7e5a4127b95230976 /src/gba/gba.h
parent2eb3cfba2bdd569ffeaf94e6e29faac9a83b5b77 (diff)
downloadstepper-be37f274be067e92f9240112b7a047b8ef9e09b0.tar.gz
stepper-be37f274be067e92f9240112b7a047b8ef9e09b0.zip
Add input retriggering with configurable rate and offset
Diffstat (limited to 'src/gba/gba.h')
-rw-r--r--src/gba/gba.h111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/gba/gba.h b/src/gba/gba.h
index 8ba3de5..b5868f0 100644
--- a/src/gba/gba.h
+++ b/src/gba/gba.h
@@ -327,6 +327,117 @@ key_hold(u32 key) {
327 return key_curr & key_prev & key; 327 return key_curr & key_prev & key;
328} 328}
329 329
330// Stores number of frames since a keay was pressed.
331typedef struct Controller {
332 int key_up;
333 int key_down;
334 int key_left;
335 int key_right;
336 int key_select;
337 int key_start;
338 int key_b;
339 int key_a;
340 int key_l;
341 int key_r;
342} Controller;
343
344static Controller ctrl = {0};
345
346#define RETRIG_OFFSET 16
347#define RETRIG_FRAMES 3
348
349static inline
350bool
351_key_retrig(int key, int offset, int frames) {
352 if (key_tap(key)) {
353 return true;
354 }
355 switch (key) {
356 case KEY_L: {
357 if (key_hold(key)) {
358 if (ctrl.key_l < offset) { return false; }
359 if (ctrl.key_l % frames == 0) { return true; }
360 }
361 } break;
362 case KEY_R: {
363 if (key_hold(key)) {
364 if (ctrl.key_r < offset) { return false; }
365 if (ctrl.key_r % frames == 0) { return true; }
366 }
367 } break;
368 case KEY_A: {
369 if (key_hold(key)) {
370 if (ctrl.key_a < offset) { return false; }
371 if (ctrl.key_a % frames == 0) { return true; }
372 }
373 } break;
374 case KEY_B: {
375 if (key_hold(key)) {
376 if (ctrl.key_b < offset) { return false; }
377 if (ctrl.key_b % frames == 0) { return true; }
378 }
379 } break;
380 case KEY_SELECT: {
381 if (key_hold(key)) {
382 if (ctrl.key_select < offset) { return false; }
383 if (ctrl.key_select % frames == 0) { return true; }
384 }
385 } break;
386 case KEY_START: {
387 if (key_hold(key)) {
388 if (ctrl.key_start < offset) { return false; }
389 if (ctrl.key_start % frames == 0) { return true; }
390 }
391 } break;
392 case KEY_UP: {
393 if (key_hold(key)) {
394 if (ctrl.key_up < offset) { return false; }
395 if (ctrl.key_up % frames == 0) { return true; }
396 }
397 } break;
398 case KEY_DOWN: {
399 if (key_hold(key)) {
400 if (ctrl.key_down < offset) { return false; }
401 if (ctrl.key_down % frames == 0) { return true; }
402 }
403 } break;
404 case KEY_LEFT: {
405 if (key_hold(key)) {
406 if (ctrl.key_left < offset) { return false; }
407 if (ctrl.key_left % frames == 0) { return true; }
408 }
409 } break;
410 case KEY_RIGHT: {
411 if (key_hold(key)) {
412 if (ctrl.key_right < offset) { return false; }
413 if (ctrl.key_right % frames == 0) { return true; }
414 }
415 } break;
416 }
417 return false;
418}
419
420static inline
421bool
422key_retrig(int key) {
423 return _key_retrig(key, RETRIG_OFFSET, RETRIG_FRAMES);
424}
425
426static inline
427void
428update_controller(void) {
429 if (key_pressed(KEY_UP)) { ctrl.key_up++; } else if (key_released(KEY_UP)) { ctrl.key_up = 0; }
430 if (key_pressed(KEY_DOWN)) { ctrl.key_down++; } else if (key_released(KEY_DOWN)) { ctrl.key_down = 0; }
431 if (key_pressed(KEY_LEFT)) { ctrl.key_left++; } else if (key_released(KEY_LEFT)) { ctrl.key_left = 0; }
432 if (key_pressed(KEY_RIGHT)) { ctrl.key_right++; } else if (key_released(KEY_RIGHT)) { ctrl.key_right = 0; }
433 if (key_pressed(KEY_L)) { ctrl.key_l++; } else if (key_released(KEY_L)) { ctrl.key_l = 0; }
434 if (key_pressed(KEY_R)) { ctrl.key_r++; } else if (key_released(KEY_R)) { ctrl.key_r = 0; }
435 if (key_pressed(KEY_A)) { ctrl.key_a++; } else if (key_released(KEY_A)) { ctrl.key_a = 0; }
436 if (key_pressed(KEY_B)) { ctrl.key_b++; } else if (key_released(KEY_B)) { ctrl.key_b = 0; }
437 if (key_pressed(KEY_SELECT)) { ctrl.key_select++; } else if (key_released(KEY_SELECT)) { ctrl.key_select = 0; }
438 if (key_pressed(KEY_START)) { ctrl.key_start++; } else if (key_released(KEY_START)) { ctrl.key_start = 0; }
439}
440
330// 441//
331// Direct Memory Access (DMA) 442// Direct Memory Access (DMA)
332// 443//