diff --git a/recipes/prboom/01_redox.patch b/recipes/prboom/01_redox.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d42dd549b4cf6b8a224bc27896a77db326a80e1e
--- /dev/null
+++ b/recipes/prboom/01_redox.patch
@@ -0,0 +1,45 @@
+diff -rupN prboom-2.5.0/autotools/config.sub prboom-2.5.0-redox/autotools/config.sub
+--- prboom-2.5.0/autotools/config.sub	2006-08-10 08:17:12.000000000 -0700
++++ prboom-2.5.0-redox/autotools/config.sub	2017-10-14 22:17:14.000000000 -0700
+@@ -1214,7 +1214,7 @@ case $os in
+ 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+ 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+-	      | -skyos* | -haiku* | -rdos* | -toppers*)
++	      | -skyos* | -haiku* | -rdos* | -toppers* | -redox*)
+ 	# Remember, each alternative MUST END IN *, to match a version number.
+ 		;;
+ 	-qnx*)
+diff -rupN prboom-2.5.0/configure.ac prboom-2.5.0-redox/configure.ac
+--- prboom-2.5.0/configure.ac	2008-11-09 11:12:37.000000000 -0800
++++ prboom-2.5.0-redox/configure.ac	2017-10-14 23:27:16.000000000 -0700
+@@ -85,8 +85,6 @@ if test "$cross_compiling" != "yes"; the
+ fi
+ 
+ dnl --- Header files, typedefs, structures
+-AC_TYPE_UID_T
+-AC_TYPE_SIZE_T
+ AC_DECL_SYS_SIGLIST
+ AC_HEADER_SYS_WAIT
+ AC_CHECK_HEADERS(unistd.h asm/byteorder.h sched.h)
+diff -rupN prboom-2.5.0/src/d_deh.c prboom-2.5.0-redox/src/d_deh.c
+--- prboom-2.5.0/src/d_deh.c	2008-10-11 05:10:38.000000000 -0700
++++ prboom-2.5.0-redox/src/d_deh.c	2017-10-14 23:29:00.000000000 -0700
+@@ -54,17 +54,6 @@
+ #define TRUE 1
+ #define FALSE 0
+ 
+-#ifndef HAVE_STRLWR
+-#include <ctype.h>
+-
+-static char* strlwr(char* str)
+-{
+-  char* p;
+-  for (p=str; *p; p++) *p = tolower(*p);
+-  return str;
+-}
+-#endif
+-
+ // killough 10/98: new functions, to allow processing DEH files in-memory
+ // (e.g. from wads)
+ 
diff --git a/recipes/prboom/recipe.sh b/recipes/prboom/recipe.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a738081f8937c8bb226e44af5ccf7b71747f5010
--- /dev/null
+++ b/recipes/prboom/recipe.sh
@@ -0,0 +1,36 @@
+VERSION=2.5.0
+TAR=https://downloads.sourceforge.net/project/prboom/prboom%20stable/$VERSION/prboom-$VERSION.tar.gz
+BUILD_DEPENDS=(sdl)
+
+function recipe_version {
+    echo "$VERSION"
+    skip=1
+}
+
+function recipe_update {
+    echo "skipping update"
+    skip=1
+}
+
+function recipe_build {
+    autoreconf -if
+    ./configure --prefix=/ --host=${HOST} --disable-sdltest --disable-gl --without-net --with-sdl-prefix="$PWD/../sysroot"
+    make 
+    skip=1
+}
+
+function recipe_test {
+    echo "skipping test"
+    skip=1
+}
+
+function recipe_clean {
+    make clean
+    skip=1
+}
+
+function recipe_stage {
+    dest="$(realpath $1)"
+    make DESTDIR="$dest" install
+    skip=1
+}
diff --git a/recipes/sdl/01_orbital.patch b/recipes/sdl/01_orbital.patch
new file mode 100644
index 0000000000000000000000000000000000000000..c4636deca0968de2edbe14b65815490c3b38818b
--- /dev/null
+++ b/recipes/sdl/01_orbital.patch
@@ -0,0 +1,735 @@
+diff -rupN sdl/build-scripts/config.sub sdl-redox/build-scripts/config.sub
+--- sdl/build-scripts/config.sub	2012-01-18 22:30:05.000000000 -0800
++++ sdl-redox/build-scripts/config.sub	2016-07-27 18:17:26.683907466 -0700
+@@ -1276,7 +1276,7 @@ case $os in
+ 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ 	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+-	      | -kopensolaris* \
++	      | -kopensolaris* | -redox* \
+ 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ 	      | -aos* | -aros* \
+ 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+diff -rupN sdl/configure.in sdl-redox/configure.in
+--- sdl/configure.in	2012-01-18 22:30:05.000000000 -0800
++++ sdl-redox/configure.in	2016-07-27 18:17:26.683907466 -0700
+@@ -1646,6 +1646,19 @@ AC_HELP_STRING([--enable-video-dummy], [
+     fi
+ }
+ 
++dnl Set up the Orbital video driver.
++CheckOrbitalVideo()
++{
++    AC_ARG_ENABLE(video-orbital,
++AC_HELP_STRING([--enable-video-orbital], [use orbital video driver [[default=yes]]]),
++                  , enable_video_orbital=yes)
++    if test x$enable_video_orbital = xyes; then
++        AC_DEFINE(SDL_VIDEO_DRIVER_ORBITAL)
++        SOURCES="$SOURCES $srcdir/src/video/orbital/*.c"
++        have_video=yes
++    fi
++}
++
+ dnl Check to see if OpenGL support is desired
+ AC_ARG_ENABLE(video-opengl,
+ AC_HELP_STRING([--enable-video-opengl], [include OpenGL context creation [[default=yes]]]),
+@@ -2325,10 +2338,11 @@ case "$host" in
+             have_timers=yes
+         fi
+         ;;
+-    *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
++    *-*-linux*|*-*-uclinux*|*-*-redox*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
+         case "$host" in
+             *-*-linux*)         ARCH=linux ;;
+             *-*-uclinux*)       ARCH=linux ;;
++            *-*-redox*)         ARCH=redox ;;
+             *-*-kfreebsd*-gnu)  ARCH=kfreebsd-gnu ;;
+             *-*-knetbsd*-gnu)   ARCH=knetbsd-gnu ;;
+             *-*-kopenbsd*-gnu)  ARCH=kopenbsd-gnu ;;
+@@ -2347,6 +2361,7 @@ case "$host" in
+         esac
+         CheckVisibilityHidden
+         CheckDummyVideo
++        CheckOrbitalVideo
+         CheckDiskAudio
+         CheckDummyAudio
+         CheckDLOPEN
+diff -rupN sdl/include/SDL_config.h.in sdl-redox/include/SDL_config.h.in
+--- sdl/include/SDL_config.h.in	2012-01-18 22:30:05.000000000 -0800
++++ sdl-redox/include/SDL_config.h.in	2016-07-27 18:17:26.683907466 -0700
+@@ -268,6 +268,7 @@
+ #undef SDL_VIDEO_DRIVER_GGI
+ #undef SDL_VIDEO_DRIVER_IPOD
+ #undef SDL_VIDEO_DRIVER_NANOX
++#undef SDL_VIDEO_DRIVER_ORBITAL
+ #undef SDL_VIDEO_DRIVER_OS2FS
+ #undef SDL_VIDEO_DRIVER_PHOTON
+ #undef SDL_VIDEO_DRIVER_PICOGUI
+diff -rupN sdl/src/video/orbital/SDL_orbitalevents.c sdl-redox/src/video/orbital/SDL_orbitalevents.c
+--- sdl/src/video/orbital/SDL_orbitalevents.c	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalevents.c	2016-07-27 18:17:26.683907466 -0700
+@@ -0,0 +1,159 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++#include "SDL.h"
++#include "../../events/SDL_sysevents.h"
++#include "../../events/SDL_events_c.h"
++
++#include "SDL_orbitalvideo.h"
++#include "SDL_orbitalevents_c.h"
++#include "SDL_orbitalscancode.h"
++
++#include <unistd.h>
++
++static SDLKey keymap[128];
++
++#define EVENT_NONE 0
++#define EVENT_MOUSE 1
++#define EVENT_KEY 2
++#define EVENT_QUIT 3
++
++struct Event {
++    int64_t code;
++    int64_t a;
++    int64_t b;
++    int64_t c;
++} __attribute__((packed));
++
++void ORBITAL_PumpEvents(_THIS)
++{
++    struct Event event;
++    while(read(this->hidden->fd, &event, sizeof(event)) > 0){
++        if ( event.code == EVENT_KEY ) {
++            SDL_keysym keysym;
++        	keysym.unicode = event.a;
++        	keysym.scancode = event.b;
++        	keysym.sym = keymap[event.b];
++        	keysym.mod = KMOD_NONE;
++            if ( event.c > 0 ) {
++                SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
++            } else {
++                SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
++            }
++        } else if( event.code == EVENT_MOUSE ) {
++            SDL_PrivateMouseMotion(event.c, 0, event.a, event.b);
++            //SDL_PrivateMouseButton(Uint8 state, Uint8 button, Sint16 x, Sint16 y);
++        } else if ( event.code == EVENT_QUIT ) {
++            SDL_PrivateQuit();
++        }
++    }
++}
++
++void ORBITAL_InitOSKeymap(_THIS)
++{
++    int i;
++    for ( i = 0; i < SDL_arraysize(keymap); ++i )
++        keymap[i] = SDLK_UNKNOWN;
++
++    keymap[SCANCODE_ESCAPE] = SDLK_ESCAPE;
++    keymap[SCANCODE_1] = SDLK_1;
++    keymap[SCANCODE_2] = SDLK_2;
++    keymap[SCANCODE_3] = SDLK_3;
++    keymap[SCANCODE_4] = SDLK_4;
++    keymap[SCANCODE_5] = SDLK_5;
++    keymap[SCANCODE_6] = SDLK_6;
++    keymap[SCANCODE_7] = SDLK_7;
++    keymap[SCANCODE_8] = SDLK_8;
++    keymap[SCANCODE_9] = SDLK_9;
++    keymap[SCANCODE_0] = SDLK_0;
++    keymap[SCANCODE_MINUS] = SDLK_MINUS;
++    keymap[SCANCODE_EQUAL] = SDLK_EQUALS;
++    keymap[SCANCODE_BACKSPACE] = SDLK_BACKSPACE;
++    keymap[SCANCODE_TAB] = SDLK_TAB;
++    keymap[SCANCODE_Q] = SDLK_q;
++    keymap[SCANCODE_W] = SDLK_w;
++    keymap[SCANCODE_E] = SDLK_e;
++    keymap[SCANCODE_R] = SDLK_r;
++    keymap[SCANCODE_T] = SDLK_t;
++    keymap[SCANCODE_Y] = SDLK_y;
++    keymap[SCANCODE_U] = SDLK_u;
++    keymap[SCANCODE_I] = SDLK_i;
++    keymap[SCANCODE_O] = SDLK_o;
++    keymap[SCANCODE_P] = SDLK_p;
++    keymap[SCANCODE_BRACKET_LEFT] = SDLK_LEFTBRACKET;
++    keymap[SCANCODE_BRACKET_RIGHT] = SDLK_RIGHTBRACKET;
++    keymap[SCANCODE_ENTER] = SDLK_RETURN;
++    keymap[SCANCODE_LEFTCONTROL] = SDLK_LCTRL;
++    keymap[SCANCODE_A] = SDLK_a;
++    keymap[SCANCODE_S] = SDLK_s;
++    keymap[SCANCODE_D] = SDLK_d;
++    keymap[SCANCODE_F] = SDLK_f;
++    keymap[SCANCODE_G] = SDLK_g;
++    keymap[SCANCODE_H] = SDLK_h;
++    keymap[SCANCODE_J] = SDLK_j;
++    keymap[SCANCODE_K] = SDLK_k;
++    keymap[SCANCODE_L] = SDLK_l;
++    keymap[SCANCODE_SEMICOLON] = SDLK_SEMICOLON;
++    keymap[SCANCODE_APOSTROPHE] = SDLK_QUOTE;
++    keymap[SCANCODE_TICK] = SDLK_BACKQUOTE;
++    keymap[SCANCODE_LEFTSHIFT] = SDLK_LSHIFT;
++    keymap[SCANCODE_RIGHTSHIFT] = SDLK_RSHIFT;
++    keymap[SCANCODE_BACKSLASH] = SDLK_BACKSLASH;
++    keymap[SCANCODE_Z] = SDLK_z;
++    keymap[SCANCODE_X] = SDLK_x;
++    keymap[SCANCODE_C] = SDLK_c;
++    keymap[SCANCODE_V] = SDLK_v;
++    keymap[SCANCODE_B] = SDLK_b;
++    keymap[SCANCODE_N] = SDLK_n;
++    keymap[SCANCODE_M] = SDLK_m;
++    keymap[SCANCODE_COMMA] = SDLK_COMMA;
++    keymap[SCANCODE_PERIOD] = SDLK_PERIOD;
++    keymap[SCANCODE_SLASH] = SDLK_SLASH;
++    keymap[SCANCODE_LEFTALT] = SDLK_LALT;
++    keymap[SCANCODE_SPACE] = SDLK_SPACE;
++    keymap[SCANCODE_CAPSLOCK] = SDLK_CAPSLOCK;
++    keymap[SCANCODE_F1] = SDLK_F1;
++    keymap[SCANCODE_F2] = SDLK_F2;
++    keymap[SCANCODE_F3] = SDLK_F3;
++    keymap[SCANCODE_F4] = SDLK_F4;
++    keymap[SCANCODE_F5] = SDLK_F5;
++    keymap[SCANCODE_F6] = SDLK_F6;
++    keymap[SCANCODE_F7] = SDLK_F7;
++    keymap[SCANCODE_F8] = SDLK_F8;
++    keymap[SCANCODE_F9] = SDLK_F9;
++    keymap[SCANCODE_F10] = SDLK_F10;
++    keymap[SCANCODE_F11] = SDLK_F11;
++    keymap[SCANCODE_F12] = SDLK_F12;
++    keymap[SCANCODE_HOME] = SDLK_HOME;
++    keymap[SCANCODE_CURSORBLOCKUP] = SDLK_UP;
++    keymap[SCANCODE_PAGEUP] = SDLK_PAGEUP;
++    keymap[SCANCODE_CURSORBLOCKLEFT] = SDLK_LEFT;
++    keymap[SCANCODE_CURSORBLOCKRIGHT] = SDLK_RIGHT;
++    keymap[SCANCODE_END] = SDLK_END;
++    keymap[SCANCODE_CURSORBLOCKDOWN] = SDLK_DOWN;
++    keymap[SCANCODE_PAGEDOWN] = SDLK_PAGEDOWN;
++    keymap[SCANCODE_INSERT] = SDLK_INSERT;
++    keymap[SCANCODE_DELETE] = SDLK_DELETE;
++}
++
++/* end of SDL_orbitalevents.c ... */
+diff -rupN sdl/src/video/orbital/SDL_orbitalevents_c.h sdl-redox/src/video/orbital/SDL_orbitalevents_c.h
+--- sdl/src/video/orbital/SDL_orbitalevents_c.h	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalevents_c.h	2016-07-27 18:17:26.683907466 -0700
+@@ -0,0 +1,32 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++#include "SDL_orbitalvideo.h"
++
++/* Variables and functions exported by SDL_sysevents.c to other parts
++   of the native video subsystem (SDL_sysvideo.c)
++*/
++extern void ORBITAL_InitOSKeymap(_THIS);
++extern void ORBITAL_PumpEvents(_THIS);
++
++/* end of SDL_orbitalevents_c.h ... */
+diff -rupN sdl/src/video/orbital/SDL_orbitalmouse.c sdl-redox/src/video/orbital/SDL_orbitalmouse.c
+--- sdl/src/video/orbital/SDL_orbitalmouse.c	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalmouse.c	2016-07-27 18:17:26.683907466 -0700
+@@ -0,0 +1,33 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++#include "SDL_mouse.h"
++#include "../../events/SDL_events_c.h"
++
++#include "SDL_orbitalmouse_c.h"
++
++
++/* The implementation dependent data for the window manager cursor */
++struct WMcursor {
++	int unused;
++};
+diff -rupN sdl/src/video/orbital/SDL_orbitalmouse_c.h sdl-redox/src/video/orbital/SDL_orbitalmouse_c.h
+--- sdl/src/video/orbital/SDL_orbitalmouse_c.h	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalmouse_c.h	2016-07-27 18:17:26.683907466 -0700
+@@ -0,0 +1,26 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++#include "SDL_orbitalvideo.h"
++
++/* Functions to be exported */
+diff -rupN sdl/src/video/orbital/SDL_orbitalscancode.h sdl-redox/src/video/orbital/SDL_orbitalscancode.h
+--- sdl/src/video/orbital/SDL_orbitalscancode.h	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalscancode.h	2016-07-27 18:17:26.687240818 -0700
+@@ -0,0 +1,80 @@
++#define SCANCODE_A	0x1E
++#define SCANCODE_B	0x30
++#define SCANCODE_C	0x2E
++#define SCANCODE_D	0x20
++#define SCANCODE_E	0x12
++#define SCANCODE_F	0x21
++#define SCANCODE_G	0x22
++#define SCANCODE_H	0x23
++#define SCANCODE_I	0x17
++#define SCANCODE_J	0x24
++#define SCANCODE_K	0x25
++#define SCANCODE_L	0x26
++#define SCANCODE_M	0x32
++#define SCANCODE_N	0x31
++#define SCANCODE_O	0x18
++#define SCANCODE_P	0x19
++#define SCANCODE_Q	0x10
++#define SCANCODE_R	0x13
++#define SCANCODE_S	0x1F
++#define SCANCODE_T	0x14
++#define SCANCODE_U	0x16
++#define SCANCODE_V	0x2F
++#define SCANCODE_W	0x11
++#define SCANCODE_X	0x2D
++#define SCANCODE_Y	0x15
++#define SCANCODE_Z	0x2C
++#define SCANCODE_0	0x0B
++#define SCANCODE_1	0x2
++#define SCANCODE_2	0x3
++#define SCANCODE_3	0x4
++#define SCANCODE_4	0x5
++#define SCANCODE_5	0x6
++#define SCANCODE_6	0x7
++#define SCANCODE_7	0x8
++#define SCANCODE_8	0x9
++#define SCANCODE_9	0x0A
++#define SCANCODE_TICK	0x29
++#define SCANCODE_MINUS	0x0C
++#define SCANCODE_EQUAL	0x0D
++#define SCANCODE_BACKSLASH	0x2B
++#define SCANCODE_BACKSPACE	0x0E
++#define SCANCODE_SPACE	0x39
++#define SCANCODE_TAB	0x0F
++#define SCANCODE_CAPSLOCK	0x3A
++#define SCANCODE_LEFTSHIFT	0x2A
++#define SCANCODE_LEFTCONTROL	0x1D
++#define SCANCODE_LEFTALT	0x38
++#define SCANCODE_RIGHTSHIFT	0x36
++#define SCANCODE_ENTER	0x1C
++#define SCANCODE_ESCAPE	0x1
++#define SCANCODE_F1	0x3B
++#define SCANCODE_F2	0x3C
++#define SCANCODE_F3	0x3D
++#define SCANCODE_F4	0x3E
++#define SCANCODE_F5	0x3F
++#define SCANCODE_F6	0x40
++#define SCANCODE_F7	0x41
++#define SCANCODE_F8	0x42
++#define SCANCODE_F9	0x43
++#define SCANCODE_F10	0x44
++#define SCANCODE_F11	0x57
++#define SCANCODE_F12	0x58
++#define SCANCODE_SCROLL	0x46
++#define SCANCODE_BRACKET_LEFT	0x1A
++#define SCANCODE_BRACKET_RIGHT	0x1B
++#define SCANCODE_INSERT	0x52
++#define SCANCODE_HOME	0x47
++#define SCANCODE_PAGEUP	0x49
++#define SCANCODE_DELETE	0x53
++#define SCANCODE_END	0x4F
++#define SCANCODE_PAGEDOWN	0x51
++#define SCANCODE_CURSORBLOCKUP	0x48
++#define SCANCODE_CURSORBLOCKLEFT	0x4B
++#define SCANCODE_CURSORBLOCKDOWN	0x50
++#define SCANCODE_CURSORBLOCKRIGHT	0x4D
++#define SCANCODE_SEMICOLON	0x27
++#define SCANCODE_APOSTROPHE	0x28
++#define SCANCODE_COMMA	0x33
++#define SCANCODE_PERIOD	0x34
++#define SCANCODE_SLASH	0x35
+diff -rupN sdl/src/video/orbital/SDL_orbitalvideo.c sdl-redox/src/video/orbital/SDL_orbitalvideo.c
+--- sdl/src/video/orbital/SDL_orbitalvideo.c	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalvideo.c	2016-07-27 18:17:26.687240818 -0700
+@@ -0,0 +1,243 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++/* Orbital SDL video driver implementation
++ *
++ * Initial work by Ryan C. Gordon (icculus@icculus.org). A good portion
++ *  of this was cut-and-pasted from Stephane Peter's work in the AAlib
++ *  SDL video driver.  Renamed to "DUMMY" by Sam Lantinga.
++ *  Repurposed to ORBITAL by Jeremy Soller.
++ */
++
++#include "SDL_video.h"
++#include "SDL_mouse.h"
++#include "../SDL_sysvideo.h"
++#include "../SDL_pixels_c.h"
++#include "../../events/SDL_events_c.h"
++
++#include "SDL_orbitalvideo.h"
++#include "SDL_orbitalevents_c.h"
++#include "SDL_orbitalmouse_c.h"
++
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/fcntl.h>
++
++#define ORBITALVID_DRIVER_NAME "orbital"
++
++/* Initialization/Query functions */
++static int ORBITAL_VideoInit(_THIS, SDL_PixelFormat *vformat);
++static SDL_Rect **ORBITAL_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
++static SDL_Surface *ORBITAL_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
++static int ORBITAL_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
++static void ORBITAL_VideoQuit(_THIS);
++
++/* Hardware surface functions */
++static int ORBITAL_AllocHWSurface(_THIS, SDL_Surface *surface);
++static int ORBITAL_LockHWSurface(_THIS, SDL_Surface *surface);
++static void ORBITAL_UnlockHWSurface(_THIS, SDL_Surface *surface);
++static void ORBITAL_FreeHWSurface(_THIS, SDL_Surface *surface);
++
++/* etc. */
++static void ORBITAL_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
++
++/* ORBITAL driver bootstrap functions */
++
++static int ORBITAL_Available(void)
++{
++	return(1);
++}
++
++static void ORBITAL_DeleteDevice(SDL_VideoDevice *device)
++{
++	SDL_free(device->hidden);
++	SDL_free(device);
++}
++
++static SDL_VideoDevice *ORBITAL_CreateDevice(int devindex)
++{
++	SDL_VideoDevice *device;
++
++	/* Initialize all variables that we clean on shutdown */
++	device = (SDL_VideoDevice *)SDL_malloc(sizeof(SDL_VideoDevice));
++	if ( device ) {
++		SDL_memset(device, 0, (sizeof *device));
++		device->hidden = (struct SDL_PrivateVideoData *)
++				SDL_malloc((sizeof *device->hidden));
++	}
++	if ( (device == NULL) || (device->hidden == NULL) ) {
++		SDL_OutOfMemory();
++		if ( device ) {
++			SDL_free(device);
++		}
++		return(0);
++	}
++	SDL_memset(device->hidden, 0, (sizeof *device->hidden));
++
++	/* Set the function pointers */
++	device->VideoInit = ORBITAL_VideoInit;
++	device->ListModes = ORBITAL_ListModes;
++	device->SetVideoMode = ORBITAL_SetVideoMode;
++	device->CreateYUVOverlay = NULL;
++	device->SetColors = ORBITAL_SetColors;
++	device->UpdateRects = ORBITAL_UpdateRects;
++	device->VideoQuit = ORBITAL_VideoQuit;
++	device->AllocHWSurface = ORBITAL_AllocHWSurface;
++	device->CheckHWBlit = NULL;
++	device->FillHWRect = NULL;
++	device->SetHWColorKey = NULL;
++	device->SetHWAlpha = NULL;
++	device->LockHWSurface = ORBITAL_LockHWSurface;
++	device->UnlockHWSurface = ORBITAL_UnlockHWSurface;
++	device->FlipHWSurface = NULL;
++	device->FreeHWSurface = ORBITAL_FreeHWSurface;
++	device->SetCaption = NULL;
++	device->SetIcon = NULL;
++	device->IconifyWindow = NULL;
++	device->GrabInput = NULL;
++	device->GetWMInfo = NULL;
++	device->InitOSKeymap = ORBITAL_InitOSKeymap;
++	device->PumpEvents = ORBITAL_PumpEvents;
++
++	device->free = ORBITAL_DeleteDevice;
++
++	return device;
++}
++
++VideoBootStrap ORBITAL_bootstrap = {
++	ORBITALVID_DRIVER_NAME, "SDL orbital video driver",
++	ORBITAL_Available, ORBITAL_CreateDevice
++};
++
++
++int ORBITAL_VideoInit(_THIS, SDL_PixelFormat *vformat)
++{
++	fprintf(stderr, "WARNING: You are using the SDL orbital video driver!\n");
++
++	/* Determine the screen depth (use default 32-bit depth) */
++	/* we change this during the SDL_SetVideoMode implementation... */
++	vformat->BitsPerPixel = 32;
++	vformat->BytesPerPixel = 4;
++
++	/* We're done! */
++	return(0);
++}
++
++SDL_Rect **ORBITAL_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
++{
++   	 return (SDL_Rect **) -1;
++}
++
++SDL_Surface *ORBITAL_SetVideoMode(_THIS, SDL_Surface *current,
++				int width, int height, int bpp, Uint32 flags)
++{
++	if ( this->hidden->fd ) {
++		close( this->hidden->fd );
++	}
++
++	if ( this->hidden->buffer ) {
++		SDL_free( this->hidden->buffer );
++	}
++
++	char path[4096];
++	snprintf(path, 4096, "orbital:/-1/-1/%d/%d/SDL", width, height);
++	this->hidden->fd = open(path, O_RDONLY);
++	printf("%s at %d\n", path, this->hidden->fd);
++
++	this->hidden->buffer = SDL_malloc(width * height * (bpp / 8));
++	if ( ! this->hidden->buffer ) {
++		SDL_SetError("Couldn't allocate buffer for requested mode");
++		return(NULL);
++	}
++
++ 	printf("Setting mode %dx%d@%d\n", width, height, bpp);
++
++	SDL_memset(this->hidden->buffer, 0, width * height * (bpp / 8));
++
++	/* Allocate the new pixel format for the screen */
++	if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) {
++		SDL_free(this->hidden->buffer);
++		this->hidden->buffer = NULL;
++		SDL_SetError("Couldn't allocate new pixel format for requested mode");
++		return(NULL);
++	}
++
++	/* Set up the new mode framebuffer */
++	current->flags = flags & SDL_FULLSCREEN;
++	this->hidden->w = current->w = width;
++	this->hidden->h = current->h = height;
++	current->pitch = current->w * (bpp / 8);
++	current->pixels = this->hidden->buffer;
++
++	/* We're done */
++	return(current);
++}
++
++/* We don't actually allow hardware surfaces other than the main one */
++static int ORBITAL_AllocHWSurface(_THIS, SDL_Surface *surface)
++{
++	return(-1);
++}
++static void ORBITAL_FreeHWSurface(_THIS, SDL_Surface *surface)
++{
++	return;
++}
++
++/* We need to wait for vertical retrace on page flipped displays */
++static int ORBITAL_LockHWSurface(_THIS, SDL_Surface *surface)
++{
++	return(0);
++}
++
++static void ORBITAL_UnlockHWSurface(_THIS, SDL_Surface *surface)
++{
++	return;
++}
++
++static void ORBITAL_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
++{
++	write(this->hidden->fd, this->hidden->buffer, this->hidden->w * this->hidden->h * 4);
++}
++
++int ORBITAL_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
++{
++	/* do nothing of note. */
++	return(1);
++}
++
++/* Note:  If we are terminated, this could be called in the middle of
++   another SDL video routine -- notably UpdateRects.
++*/
++void ORBITAL_VideoQuit(_THIS)
++{
++	if ( this->hidden->fd ) {
++		close( this->hidden->fd );
++                this->hidden->fd = 0;
++	}
++
++	if (this->screen->pixels != NULL)
++	{
++		SDL_free(this->screen->pixels);
++		this->screen->pixels = NULL;
++	}
++}
+diff -rupN sdl/src/video/orbital/SDL_orbitalvideo.h sdl-redox/src/video/orbital/SDL_orbitalvideo.h
+--- sdl/src/video/orbital/SDL_orbitalvideo.h	1969-12-31 16:00:00.000000000 -0800
++++ sdl-redox/src/video/orbital/SDL_orbitalvideo.h	2016-07-27 18:17:26.687240818 -0700
+@@ -0,0 +1,41 @@
++/*
++    SDL - Simple DirectMedia Layer
++    Copyright (C) 1997-2012 Sam Lantinga
++
++    This library is free software; you can redistribute it and/or
++    modify it under the terms of the GNU Lesser General Public
++    License as published by the Free Software Foundation; either
++    version 2.1 of the License, or (at your option) any later version.
++
++    This library is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++    Lesser General Public License for more details.
++
++    You should have received a copy of the GNU Lesser General Public
++    License along with this library; if not, write to the Free Software
++    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
++
++    Sam Lantinga
++    slouken@libsdl.org
++*/
++#include "SDL_config.h"
++
++#ifndef _SDL_orbitalvideo_h
++#define _SDL_orbitalvideo_h
++
++#include "../SDL_sysvideo.h"
++
++/* Hidden "this" pointer for the video functions */
++#define _THIS	SDL_VideoDevice *this
++
++
++/* Private display data */
++
++struct SDL_PrivateVideoData {
++    int w, h;
++    int fd;
++    void *buffer;
++};
++
++#endif /* _SDL_orbitalvideo_h */
+diff -rupN sdl/src/video/SDL_sysvideo.h sdl-redox/src/video/SDL_sysvideo.h
+--- sdl/src/video/SDL_sysvideo.h	2012-01-18 22:30:06.000000000 -0800
++++ sdl-redox/src/video/SDL_sysvideo.h	2016-07-27 18:17:26.683907466 -0700
+@@ -410,6 +410,9 @@ extern VideoBootStrap AALIB_bootstrap;
+ #if SDL_VIDEO_DRIVER_CACA
+ extern VideoBootStrap CACA_bootstrap;
+ #endif
++#if SDL_VIDEO_DRIVER_ORBITAL
++extern VideoBootStrap ORBITAL_bootstrap;
++#endif
+ #if SDL_VIDEO_DRIVER_DUMMY
+ extern VideoBootStrap DUMMY_bootstrap;
+ #endif
+diff -rupN sdl/src/video/SDL_video.c sdl-redox/src/video/SDL_video.c
+--- sdl/src/video/SDL_video.c	2012-01-18 22:30:06.000000000 -0800
++++ sdl-redox/src/video/SDL_video.c	2016-07-27 18:17:26.683907466 -0700
+@@ -126,6 +126,9 @@ static VideoBootStrap *bootstrap[] = {
+ #if SDL_VIDEO_DRIVER_CACA
+ 	&CACA_bootstrap,
+ #endif
++#if SDL_VIDEO_DRIVER_ORBITAL
++	&ORBITAL_bootstrap,
++#endif
+ #if SDL_VIDEO_DRIVER_DUMMY
+ 	&DUMMY_bootstrap,
+ #endif
diff --git a/recipes/sdl/recipe.sh b/recipes/sdl/recipe.sh
new file mode 100644
index 0000000000000000000000000000000000000000..045d4dfba5a8c89ee5bce35ca5c96b353176efb5
--- /dev/null
+++ b/recipes/sdl/recipe.sh
@@ -0,0 +1,35 @@
+VERSION=1.2.15
+TAR=https://www.libsdl.org/release/SDL-$VERSION.tar.gz
+
+function recipe_version {
+    echo "$VERSION"
+    skip=1
+}
+
+function recipe_update {
+    echo "skipping update"
+    skip=1
+}
+
+function recipe_build {
+    ./autogen.sh
+    ./configure --prefix=/ --host=${HOST} --disable-shared --disable-pulseaudio --disable-video-x11 --disable-cdrom --disable-loadso --disable-threads --disable-timers --enable-audio --enable-dummyaudio --enable-video-orbital
+    make 
+    skip=1
+}
+
+function recipe_test {
+    echo "skipping test"
+    skip=1
+}
+
+function recipe_clean {
+    make clean
+    skip=1
+}
+
+function recipe_stage {
+    dest="$(realpath $1)"
+    make DESTDIR="$dest" install
+    skip=1
+}