1
- From a9634a899b60b3d783c9aabc4d667435bdeb4270 Mon Sep 17 00:00:00 2001
1
+ From 0005041b6e5c82519820a22e8d34f827a5abf11d Mon Sep 17 00:00:00 2001
2
2
From: Andy-Python-Programmer <
[email protected] >
3
3
Date: Sat, 15 Jan 2022 18:07:32 +1100
4
4
Subject: [PATCH] add aero doom
5
5
6
6
Signed-off-by: Andy-Python-Programmer <
[email protected] >
7
7
---
8
- .gitignore | 8 ++
9
- doomgeneric/Makefile.aero | 80 +++++++++++
10
- doomgeneric/aero/framebuffer.h | 243 +++++++++++++++++++++++++++++++
8
+ .gitignore | 9 ++
9
+ doomgeneric/Makefile.aero | 80 ++++++++++
10
+ doomgeneric/aero/framebuffer.h | 243 ++++++++++++++++++++++++++++++
11
11
doomgeneric/d_main.c | 4 +
12
- doomgeneric/doomgeneric_aero.c | 255 +++++++++++++++++++++++++++++++++
13
- 5 files changed, 590 insertions(+)
12
+ doomgeneric/doomgeneric_aero.c | 266 +++++++++++++++++++++++++++++++++
13
+ 5 files changed, 602 insertions(+)
14
14
create mode 100644 .gitignore
15
15
create mode 100644 doomgeneric/Makefile.aero
16
16
create mode 100644 doomgeneric/aero/framebuffer.h
17
17
create mode 100644 doomgeneric/doomgeneric_aero.c
18
18
19
19
diff --git a/.gitignore b/.gitignore
20
20
new file mode 100644
21
- index 0000000..6ac1485
21
+ index 0000000..e610a33
22
22
--- /dev/null
23
23
+++ b/.gitignore
24
- @@ -0,0 +1,8 @@
24
+ @@ -0,0 +1,9 @@
25
25
+ build
26
26
+
27
27
+ doomgeneric/doomgeneric
@@ -30,7 +30,7 @@ index 0000000..6ac1485
30
30
+ doom1.wad
31
31
+
32
32
+ .vscode
33
- \ No newline at end of file
33
+ + .clang-format
34
34
diff --git a/doomgeneric/Makefile.aero b/doomgeneric/Makefile.aero
35
35
new file mode 100644
36
36
index 0000000..3cde87c
@@ -389,10 +389,10 @@ index c7cf977..435e76a 100644
389
389
if (iwadfile == NULL)
390
390
diff --git a/doomgeneric/doomgeneric_aero.c b/doomgeneric/doomgeneric_aero.c
391
391
new file mode 100644
392
- index 0000000..6dd20b0
392
+ index 0000000..a5adc60
393
393
--- /dev/null
394
394
+++ b/doomgeneric/doomgeneric_aero.c
395
- @@ -0,0 +1,255 @@
395
+ @@ -0,0 +1,266 @@
396
396
+ /*
397
397
+ * Copyright (C) 2021-2022 The Aero Project Developers.
398
398
+ *
@@ -417,23 +417,26 @@ index 0000000..6dd20b0
417
417
+
418
418
+ #include "aero/framebuffer.h"
419
419
+
420
- + #include <stdint.h>
421
420
+ #include <fcntl.h>
422
- + #include <stdlib.h>
423
- + #include <stdio.h>
424
421
+ #include <stdarg.h>
422
+ + #include <stdbool.h>
423
+ + #include <stdint.h>
424
+ + #include <stdio.h>
425
+ + #include <stdlib.h>
426
+ + #include <string.h>
425
427
+ #include <termios.h>
426
428
+ #include <unistd.h>
427
- + #include <stdbool.h>
428
429
+
430
+ + #include <sys/mman.h>
429
431
+ #include <sys/time.h>
430
432
+
431
- + #define LOG_INFO 0
432
- + #define KEYBOARD_QUEUE_SIZE 16
433
+ + #define LOG_INFO 0
434
+ + #define KEYBOARD_QUEUE_SIZE 16
433
435
+
434
- + FILE *framebuffer = NULL;
435
436
+ FILE *keyboard = NULL;
436
437
+
438
+ + static uint32_t *framebuffer_ptr = NULL;
439
+ +
437
440
+ static uint32_t s_screen_width = 0;
438
441
+ static uint32_t s_screen_height = 0;
439
442
+
@@ -485,49 +488,49 @@ index 0000000..6dd20b0
485
488
+ uint8_t key = 0;
486
489
+
487
490
+ switch (scancode) {
488
- + case 28: // enter
489
- + key = KEY_ENTER;
490
- + break;
491
- +
492
- + case 1: // escape
493
- + key = KEY_ESCAPE;
494
- + break;
495
- +
496
- + case 105: // left
497
- + key = KEY_LEFTARROW;
498
- + break;
499
- +
500
- + case 106: // right
501
- + key = KEY_RIGHTARROW;
502
- + break;
503
- +
504
- + case 103: // up
505
- + key = KEY_UPARROW;
506
- + break;
507
- +
508
- + case 108: // down
509
- + key = KEY_DOWNARROW;
510
- + break;
511
- +
512
- + case 29: // left control
513
- + case 97: // right control
514
- + key = KEY_FIRE;
515
- + break;
516
- +
517
- + case 57: // spacebar
518
- + key = KEY_USE;
519
- + break;
520
- +
521
- + case 54: // rightshift
522
- + key = KEY_RSHIFT;
523
- + break;
524
- +
525
- + case 21: // y
526
- + key = 'y';
527
- + break;
528
- +
529
- + default:
530
- + break;
491
+ + case 28: // enter
492
+ + key = KEY_ENTER;
493
+ + break;
494
+ +
495
+ + case 1: // escape
496
+ + key = KEY_ESCAPE;
497
+ + break;
498
+ +
499
+ + case 105: // left
500
+ + key = KEY_LEFTARROW;
501
+ + break;
502
+ +
503
+ + case 106: // right
504
+ + key = KEY_RIGHTARROW;
505
+ + break;
506
+ +
507
+ + case 103: // up
508
+ + key = KEY_UPARROW;
509
+ + break;
510
+ +
511
+ + case 108: // down
512
+ + key = KEY_DOWNARROW;
513
+ + break;
514
+ +
515
+ + case 29: // left control
516
+ + case 97: // right control
517
+ + key = KEY_FIRE;
518
+ + break;
519
+ +
520
+ + case 57: // spacebar
521
+ + key = KEY_USE;
522
+ + break;
523
+ +
524
+ + case 54: // rightshift
525
+ + key = KEY_RSHIFT;
526
+ + break;
527
+ +
528
+ + case 21: // y
529
+ + key = 'y';
530
+ + break;
531
+ +
532
+ + default:
533
+ + break;
531
534
+ }
532
535
+
533
536
+ return key;
@@ -561,13 +564,13 @@ index 0000000..6dd20b0
561
564
+ }
562
565
+ }
563
566
+
564
- + /// Initialize doomgeneric. This includes setting up the framebuffer and keyboard
565
- + /// devices.
567
+ + /// Initialize doomgeneric. This includes setting up the framebuffer and
568
+ + /// keyboard devices.
566
569
+ void DG_Init() {
567
570
+ log_info("initializing framebuffer");
568
571
+
569
572
+ // Open up the framebuffer device.
570
- + framebuffer = fopen("/dev/fb", "r+");
573
+ + size_t framebuffer = fopen("/dev/fb", "r+");
571
574
+
572
575
+ // Make sure the there were no errors.
573
576
+ if (framebuffer == NULL) {
@@ -588,11 +591,16 @@ index 0000000..6dd20b0
588
591
+ s_screen_width = vinfo.xres;
589
592
+ s_screen_height = vinfo.yres;
590
593
+
591
- + log_info("framebuffer: (width=%lu, height=%lu)", (uint64_t)s_screen_width, (uint64_t)s_screen_height);
594
+ + log_info("framebuffer: (width=%lu, height=%lu)", (uint64_t)s_screen_width,
595
+ + (uint64_t)s_screen_height);
592
596
+
593
597
+ s_position_x = (s_screen_width - DOOMGENERIC_RESX) / 2;
594
598
+ s_position_y = (s_screen_height - DOOMGENERIC_RESY) / 2;
595
599
+
600
+ + uint32_t size = s_screen_width * s_screen_height * vinfo.bits_per_pixel / 8;
601
+ + framebuffer_ptr = (uint32_t *)mmap(NULL, size, PROT_READ | PROT_WRITE,
602
+ + MAP_PRIVATE, fileno(framebuffer), 0);
603
+ +
596
604
+ enable_raw_tty();
597
605
+ atexit(disable_raw_tty);
598
606
+
@@ -610,16 +618,19 @@ index 0000000..6dd20b0
610
618
+
611
619
+ void DG_DrawFrame() {
612
620
+ for (int i = 0; i < DOOMGENERIC_RESY; i++) {
613
- + fseek(framebuffer, s_position_x + (i + s_position_y) * s_screen_width, SEEK_SET);
614
- + fwrite(DG_ScreenBuffer + i * DOOMGENERIC_RESX, 1, DOOMGENERIC_RESX * 4, framebuffer);
621
+ + size_t index = s_position_x + (i + s_position_y) * s_screen_width;
622
+ + size_t count = DOOMGENERIC_RESX * 4;
623
+ +
624
+ + uint32_t *dest_ptr = &framebuffer_ptr[index];
625
+ + uint32_t *src_ptr = DG_ScreenBuffer + i * DOOMGENERIC_RESX;
626
+ +
627
+ + memcpy(dest_ptr, src_ptr, count);
615
628
+ }
616
629
+
617
630
+ handle_keyboard_input();
618
631
+ }
619
632
+
620
- + void DG_SleepMs(uint32_t ms) {
621
- + usleep(ms * 1000000);
622
- + }
633
+ + void DG_SleepMs(uint32_t ms) { usleep(ms * 1000000); }
623
634
+
624
635
+ uint32_t DG_GetTicksMs() {
625
636
+ struct timeval tp;
@@ -646,7 +657,7 @@ index 0000000..6dd20b0
646
657
+ return 1;
647
658
+ }
648
659
+
649
- + // We dont need to set the window title :)
660
+ + // NOTE: We dont need to set the window title :)
650
661
+ void DG_SetWindowTitle(const char *title) {}
651
662
- -
652
663
2.25.1
0 commit comments