From d4542c336a6cbfb43497055f19a85e7713f2eed7 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sun, 25 Jun 2023 16:38:32 +0200 Subject: ports: reimplement the ports system from scratch side stuff: * removed sltar since it wasn't working anyways * made signal() no longer panic, as that broke certain ports (oops) * doom now ships with the FreeDOOM WADs * /usr/ was aliased to /init/usr/, more directories were added to /bin/ to improve compat with ports --- ports/doom | 151 -------------------------------- ports/doom/files/doomgeneric_camellia.c | 128 +++++++++++++++++++++++++++ ports/doom/patches/0-wad-dir.patch | 8 ++ ports/doom/port | 32 +++++++ ports/doom/sha256sums | 2 + 5 files changed, 170 insertions(+), 151 deletions(-) delete mode 100644 ports/doom create mode 100644 ports/doom/files/doomgeneric_camellia.c create mode 100644 ports/doom/patches/0-wad-dir.patch create mode 100755 ports/doom/port create mode 100644 ports/doom/sha256sums (limited to 'ports/doom') diff --git a/ports/doom b/ports/doom deleted file mode 100644 index 7ef03dd..0000000 --- a/ports/doom +++ /dev/null @@ -1,151 +0,0 @@ -set -eu -camellia_path_check - -fetch() { - git clone https://github.com/ozkl/doomgeneric - cd doomgeneric - # TODO use a newer commit - git -c advice.detachedHead=false checkout ee3ee581912dacd38af06e81da2374c1267453e8 - - cd doomgeneric - rm doomgeneric # a leftover OS X binary - sed s/xlib/camellia/ -i Makefile - sed s/-lX11// -i Makefile - echo note: you need to supply your own WADs - - cat <<\EOF > doomgeneric_camellia.c -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "doomgeneric.h" -#include "doomkeys.h" - -static struct framebuf fb; -static hid_t kb; - -static const char keymap_lower[] = { - '\0', '\0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', '\t', - 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\r', '\0', 'a', 's', - 'd', 'f', 'g', 'h', 'j', 'k', 'l', '\0', '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', - 'b', 'n', 'm', ',', '.', '/', '\0', '*', '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '8', '9', '-', '4', '5', '6', '+', '1', - '2', '3', '0', '.', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', -}; - -static char kb_backbuf[256]; -static ring_t kb_backlog = {kb_backbuf, sizeof kb_backbuf, 0, 0}; - -static void kb_thread(void *arg) { - (void)arg; - char buf[sizeof kb_backbuf]; - for (;;) { - int ret = _sys_read(kb, buf, sizeof buf, 0); - if (ret <= 0) break; - ring_put(&kb_backlog, buf, ret); - } -} - -void DG_Init(void) { - if (fb_setup(&fb, "/kdev/video/") < 0) { - puts("DG_Init: fb_setup error"); - abort(); - } - kb = _sys_open("/kdev/ps2/kb", 12, 0); - if (kb < 0) { - puts("DG_Init: can't open keyboard"); - abort(); - } - thread_create(0, kb_thread, NULL); -} - -void DG_DrawFrame(void) { - size_t doomw = DOOMGENERIC_RESX; - size_t doomh = DOOMGENERIC_RESY; - size_t doompitch = doomw * 4; - for (int y = 0; y < DOOMGENERIC_RESY; y++) { - memcpy(fb.b + fb.pitch * y, ((char*)DG_ScreenBuffer) + doompitch * y, doompitch); - } - - struct rect d; - dirty_mark(&d, 0, 0); - dirty_mark(&d, doomw, doomh); - dirty_flush(&d, &fb); -} - -static uint32_t timer = 0; -void DG_SleepMs(uint32_t ms) { - timer += ms; - _sys_sleep(ms); -} - -uint32_t DG_GetTicksMs(void) { - /* if it's stupid and it works... */ - return timer; -} - -int DG_GetKey(int *pressed, unsigned char *key) { - uint8_t c; - int read = ring_get(&kb_backlog, (char*)&c, 1); - bool extended = c == 0xe0;; - if (read == 0) return 0; - if (extended) ring_get(&kb_backlog, (char*)&c, 1); - bool down = !(c & 0x80); - - c &= 0x7f; - if (!extended) { - switch (c) { - case 0x01: - c = KEY_ESCAPE; - break; - case 0x2a: case 0x36: - c = KEY_RSHIFT; - break; - case 0x1d: - c = KEY_FIRE; - break; - default: - c = keymap_lower[c & 0x7f]; - switch (c) { - case ' ': c = KEY_USE; break; - } - } - } else { - switch (c) { - case 0x48: c = KEY_UPARROW; break; - case 0x50: c = KEY_DOWNARROW; break; - case 0x4B: c = KEY_LEFTARROW; break; - case 0x4D: c = KEY_RIGHTARROW; break; - default: c = '\0'; break; - } - } - *pressed = down; - *key = c; - return 1; -} - -void DG_SetWindowTitle(const char *title) { - (void)title; -} -EOF -} - -prep() { - [ -d doomgeneric ] || (fetch) - cd doomgeneric/doomgeneric -} - -case $1 in - install) (prep; make "CC=x86_64-camellia-gcc" && cp doomgeneric $PREFIX/bin/doom && cp *.WAD $PREFIX/) ;; - clean) (prep; make clean) ;; - deepclean) (rm -rf doomgeneric) ;; - *) echo "usage: $0 install|clean"; false ;; -esac diff --git a/ports/doom/files/doomgeneric_camellia.c b/ports/doom/files/doomgeneric_camellia.c new file mode 100644 index 0000000..3fe6032 --- /dev/null +++ b/ports/doom/files/doomgeneric_camellia.c @@ -0,0 +1,128 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "doomgeneric.h" +#include "doomkeys.h" + +static struct framebuf fb; +static hid_t kb; + +static const char keymap_lower[] = { + '\0', '\0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b', '\t', + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\r', '\0', 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', '\0', '\'', '`', '\0', '\\', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', '\0', '*', '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '8', '9', '-', '4', '5', '6', '+', '1', + '2', '3', '0', '.', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', +}; + +static char kb_backbuf[256]; +static ring_t kb_backlog = {kb_backbuf, sizeof kb_backbuf, 0, 0}; + +static void kb_thread(void *arg) { + (void)arg; + char buf[sizeof kb_backbuf]; + for (;;) { + int ret = _sys_read(kb, buf, sizeof buf, 0); + if (ret <= 0) break; + ring_put(&kb_backlog, buf, ret); + } +} + +void DG_Init(void) { + if (fb_setup(&fb, "/kdev/video/") < 0) { + puts("DG_Init: fb_setup error"); + abort(); + } + kb = _sys_open("/kdev/ps2/kb", 12, 0); + if (kb < 0) { + puts("DG_Init: can't open keyboard"); + abort(); + } + thread_create(0, kb_thread, NULL); +} + +void DG_DrawFrame(void) { + size_t doomw = DOOMGENERIC_RESX; + size_t doomh = DOOMGENERIC_RESY; + size_t doompitch = doomw * 4; + for (int y = 0; y < DOOMGENERIC_RESY; y++) { + memcpy(fb.b + fb.pitch * y, ((char*)DG_ScreenBuffer) + doompitch * y, doompitch); + } + + struct rect d; + dirty_mark(&d, 0, 0); + dirty_mark(&d, doomw, doomh); + dirty_flush(&d, &fb); +} + +static uint32_t timer = 0; +void DG_SleepMs(uint32_t ms) { + timer += ms; + _sys_sleep(ms); +} + +uint32_t DG_GetTicksMs(void) { + /* if it's stupid and it works... */ + return timer; +} + +int DG_GetKey(int *pressed, unsigned char *key) { + uint8_t c; + int read = ring_get(&kb_backlog, (char*)&c, 1); + bool extended = c == 0xe0;; + if (read == 0) return 0; + if (extended) ring_get(&kb_backlog, (char*)&c, 1); + bool down = !(c & 0x80); + + c &= 0x7f; + if (!extended) { + switch (c) { + case 0x01: + c = KEY_ESCAPE; + break; + case 0x2a: case 0x36: + c = KEY_RSHIFT; + break; + case 0x1d: + c = KEY_FIRE; + break; + default: + c = keymap_lower[c & 0x7f]; + switch (c) { + case ' ': c = KEY_USE; break; + } + } + } else { + switch (c) { + case 0x48: c = KEY_UPARROW; break; + case 0x50: c = KEY_DOWNARROW; break; + case 0x4B: c = KEY_LEFTARROW; break; + case 0x4D: c = KEY_RIGHTARROW; break; + default: c = '\0'; break; + } + } + *pressed = down; + *key = c; + return 1; +} + +void DG_SetWindowTitle(const char *title) { + (void)title; +} + +int main(int argc, char **argv) { + doomgeneric_Create(argc, argv); + for (;;) { + doomgeneric_Tick(); + } +} diff --git a/ports/doom/patches/0-wad-dir.patch b/ports/doom/patches/0-wad-dir.patch new file mode 100644 index 0000000..85db2e6 --- /dev/null +++ b/ports/doom/patches/0-wad-dir.patch @@ -0,0 +1,8 @@ +--- config.h.orig 2023-06-24 22:10:06.945656877 +0200 ++++ config.h 2023-06-24 22:11:54.456841542 +0200 +@@ -97,4 +97,4 @@ + #undef ORIGCODE + + /* Define to the directory where all game files are located */ +-#define FILES_DIR "." ++#define FILES_DIR "/usr/share/games/doom/" diff --git a/ports/doom/port b/ports/doom/port new file mode 100755 index 0000000..c747b77 --- /dev/null +++ b/ports/doom/port @@ -0,0 +1,32 @@ +#!/bin/sh +. ports/pre + +pkg=doom +tarball=ozkl-doomgeneric-613f870.tar.gz +tarball_dir=ozkl-doomgeneric-613f870/doomgeneric +url=https://github.com/ozkl/doomgeneric/tarball/613f870b6fa83ede448a247de5a2571092fa729d + +extra_files=https://github.com/freedoom/freedoom/releases/download/v0.12.1/freedoom-0.12.1.zip + +post_patch() { + sed s/xlib/camellia/ -i $tarball_dir/Makefile + sed s/-lX11// -i $tarball_dir/Makefile +} + +post_unpack() { + unzip $downdir/freedoom-0.12.1.zip +} + +install() { + # no make install target + build + mkdir -p $DESTDIR/usr/bin/ $DESTDIR/usr/share/games/doom/ + cp $tarball_dir/doomgeneric $DESTDIR/usr/bin/doom + cp freedoom-0.12.1/freedoom1.wad $DESTDIR/usr/share/games/doom/ +} + +relink() { + rm $tarball_dir/doomgeneric +} + +. ports/post diff --git a/ports/doom/sha256sums b/ports/doom/sha256sums new file mode 100644 index 0000000..fc1594e --- /dev/null +++ b/ports/doom/sha256sums @@ -0,0 +1,2 @@ +07bd8aaf2f3c8b5cb9642de60689834524651fe50d87cf00eed1cd7c716e4dd7 ozkl-doomgeneric-613f870.tar.gz +f42c6810fc89b0282de1466c2c9c7c9818031a8d556256a6db1b69f6a77b5806 freedoom-0.12.1.zip -- cgit v1.2.3