ports: native version of DosBox

DosBox is DOS-Emulator which is mainly used for playing old
DOS games on POSIX systems and newer Windows versions.

This port of DosBox runs natively on Genode by using its
SDL backend. It is currently only works on x86_*.

Fixes #937.
This commit is contained in:
Josef Söntgen 2013-10-21 22:39:38 +02:00 committed by Norman Feske
parent 1ed4b9fef9
commit 9bc42ecd87
10 changed files with 633 additions and 0 deletions

4
ports/ports/dosbox.inc Normal file
View File

@ -0,0 +1,4 @@
DOSBOX_REV := 3837
DOSBOX_VERSION := svn-$(DOSBOX_REV)
DOSBOX := dosbox-$(DOSBOX_VERSION)

19
ports/ports/dosbox.mk Normal file
View File

@ -0,0 +1,19 @@
include ports/dosbox.inc
DOSBOX_SVN_URL = http://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk
#
# Interface to top-level prepare Makefile
#
PORTS += $(DOSBOX)
prepare:: $(CONTRIB_DIR)/$(DOSBOX)
#
# Port-specific local rules
#
$(CONTRIB_DIR)/$(DOSBOX):
$(ECHO) "checking out 'dosbox rev. $(DOSBOX_REV)' to '$@'"
$(VERBOSE)svn export $(DOSBOX_SVN_URL)@$(DOSBOX_REV) $@
$(VERBOSE)for i in src/app/dosbox/patches/*.patch; do \
patch -N -p0 < $$i; done || true

158
ports/run/dosbox.run Normal file
View File

@ -0,0 +1,158 @@
#
# Build
#
set build_components {
core init
drivers/timer
drivers/audio_out
server/tar_fs
drivers/framebuffer drivers/pci drivers/input
app/dosbox
}
lappend_if [have_spec acpi] build_components drivers/acpi
build $build_components
create_boot_directory
#
# Generate config
#
append config {
<config>
<parent-provides>
<service name="ROM"/>
<service name="RAM"/>
<service name="IRQ"/>
<service name="IO_MEM"/>
<service name="IO_PORT"/>
<service name="CAP"/>
<service name="PD"/>
<service name="RM"/>
<service name="CPU"/>
<service name="LOG"/>
<service name="SIGNAL"/>
</parent-provides>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>}
append_if [have_spec sdl] config {
<start name="fb_sdl">
<resource name="RAM" quantum="4M"/>
<provides>
<service name="Input"/>
<service name="Framebuffer"/>
</provides>
</start>}
append_if [have_spec acpi] config {
<start name="acpi">
<resource name="RAM" quantum="8M"/>
<binary name="acpi_drv"/>
<provides>
<service name="PCI"/>
<service name="IRQ" />
</provides>
</start>}
append_if [have_spec vesa] config {
<start name="fb_drv">
<resource name="RAM" quantum="4M"/>
<provides><service name="Framebuffer"/></provides>
<config buffered="yes"> </config>
<route>
<service name="PCI"><child name="acpi" /></service>
<any-service> <parent /> <any-child /></any-service>
</route>
</start>}
append_if [have_spec pl11x] config {
<start name="fb_drv">
<resource name="RAM" quantum="2M"/>
<provides><service name="Framebuffer"/></provides>
</start>}
append_if [have_spec ps2] config {
<start name="ps2_drv">
<resource name="RAM" quantum="1M"/>
<provides><service name="Input"/></provides>
</start>}
append config {
<start name="audio_out_drv">
<resource name="RAM" quantum="6M"/>}
append_if [have_spec acpi] config {
<route>
<service name="IRQ"><child name="acpi" /></service>
<service name="PCI"><child name="acpi" /></service>
<any-service> <parent /> <any-child /></any-service>
</route>}
append config {
<provides><service name="Audio_out"/></provides>
</start>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
</start>
<start name="tar_fs">
<resource name="RAM" quantum="4M"/>
<provides> <service name="File_system"/> </provides>
<config>
<archive name="dosbox.tar" />
<policy label="" root="/" />
</config>
</start>
<start name="dosbox">
<resource name="RAM" quantum="128M"/>
<config>
<sdl_audio_volume value="100"/>
</config>
</start>
</config>}
install_config $config
if {![file exists bin/dosbox.tar]} {
puts ""
puts "You need to provide 'bin/dosbox.tar' that contains the DOS game you want to"
puts "play. Mount the directory from within DosBox by entering 'mount C: <dir>',"
puts "change CWD to C: and play the game!"
puts ""
puts "(Note: for all games, which need a R/W filesystem, you cannot use 'tar_fs'.)"
puts ""
exit 1
}
#
# Boot modules
#
# generic modules
set boot_modules {
core init timer audio_out_drv
tar_fs ld.lib.so
libc_fs.lib.so libc.lib.so libc_log.lib.so
libm.lib.so lwip.lib.so libpng.lib.so
stdcxx.lib.so sdl.lib.so sdl_net.lib.so pthread.lib.so zlib.lib.so
dosbox dosbox.tar
}
# platform-specific modules
lappend_if [have_spec nova] boot_modules pci_device_pd
lappend_if [have_spec acpi] boot_modules acpi_drv
lappend_if [have_spec linux] boot_modules fb_sdl
lappend_if [have_spec pci] boot_modules pci_drv
lappend_if [have_spec vesa] boot_modules fb_drv
lappend_if [have_spec ps2] boot_modules ps2_drv
lappend_if [have_spec pl11x] boot_modules fb_drv
build_boot_image $boot_modules
append qemu_args " -m 256 -soundhw ac97 "
run_genode_until forever

View File

@ -0,0 +1,294 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/*
* Copyright (C) 2002-2013 The DOSBox Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* Define if building universal (internal helper macro) */
/* #undef AC_APPLE_UNIVERSAL_BUILD */
/* Compiling on BSD */
/* Genode's libc is based on FreeBSD 8.2 */
#define BSD 1
/* Determines if the compilers supports always_inline attribute. */
/* #undef C_ATTRIBUTE_ALWAYS_INLINE */
/* Determines if the compilers supports fastcall attribute. */
/* #undef C_ATTRIBUTE_FASTCALL */
/* Define to 1 to use inlined memory functions in cpu core */
/* #undef C_CORE_INLINE */
/* Define to 1 to enable internal debugger, requires libcurses */
/* #undef C_DEBUG */
/* Define to 1 if you want serial passthrough support (Win32, Posix and OS/2).
*/
/* #undef C_DIRECTSERIAL */
/* Define to 1 to use x86 dynamic cpu core */
/* #undef C_DYNAMIC_X86 */
/* Define to 1 to use recompiling cpu core. Can not be used together with the
dynamic-x86 core */
#define C_DYNREC 1
/* Define to 1 to enable floating point emulation */
#define C_FPU 1
/* Define to 1 to use a x86 assembly fpu core */
/* #undef C_FPU_X86 */
/* Determines if the compilers supports attributes for structures. */
#define C_HAS_ATTRIBUTE 1
/* Determines if the compilers supports __builtin_expect for branch
prediction. */
#define C_HAS_BUILTIN_EXPECT 1
/* Define to 1 if you have the mprotect function */
#define C_HAVE_MPROTECT 1
/* Define to 1 to enable heavy debugging, also have to enable C_DEBUG */
/* #undef C_HEAVY_DEBUG */
/* Define to 1 to enable IPX over Internet networking, requires SDL_net */
#define C_IPX 1
/* Define to 1 to enable internal modem support, requires SDL_net */
#define C_MODEM 1
/* Define to 1 to use opengl display output support */
/* #undef C_OPENGL */
/* Define to 1 to enable SDL_sound support */
/* #undef C_SDL_SOUND */
/* Define to 1 if you have setpriority support */
#define C_SET_PRIORITY 1
/* Define to 1 to enable screenshots, requires libpng */
#define C_SSHOT 1
/* The type of cpu this target has */
/* we define it ourself */
/* #undef C_TARGETCPU */
/* Define to 1 to use a unaligned memory access */
#define C_UNALIGNED_MEMORY 1
/* define to 1 if you have XKBlib.h and X11 lib */
/* #undef C_X11_XKB */
/* libm doesn't include powf */
/* #undef DB_HAVE_NO_POWF */
/* struct dirent has d_type */
#define DIRENT_HAS_D_TYPE 1
/* environ can be included */
/* #undef ENVIRON_INCLUDED */
/* environ can be linked */
/* #undef ENVIRON_LINKED */
/* Define to 1 to use ALSA for MIDI */
/* #undef HAVE_ALSA */
/* Define to 1 if you have the <ddraw.h> header file. */
/* #undef HAVE_DDRAW_H */
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `asound' library (-lasound). */
/* #undef HAVE_LIBASOUND */
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the <netinet/in.h> header file. */
#define HAVE_NETINET_IN_H 1
/* Define to 1 if you have the <pwd.h> header file. */
#define HAVE_PWD_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/socket.h> header file. */
#define HAVE_SYS_SOCKET_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Compiling on GNU/Linux */
/* #undef LINUX */
/* Compiling on Mac OS X */
/* #undef MACOSX */
/* Compiling on OS/2 EMX */
/* #undef OS2 */
/* Name of package */
#define PACKAGE "dosbox"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT ""
/* Define to the full name of this package. */
#define PACKAGE_NAME "dosbox"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "dosbox SVN"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "dosbox"
/* Define to the home page for this package. */
#define PACKAGE_URL ""
/* Define to the version of this package. */
#define PACKAGE_VERSION "SVN"
#include <size_defs.h>
/* Define to 1 if your <sys/time.h> declares `struct tm'. */
/* #undef TM_IN_SYS_TIME */
/* Version number of package */
#define VERSION "SVN"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
#if defined AC_APPLE_UNIVERSAL_BUILD
# if defined __BIG_ENDIAN__
# define WORDS_BIGENDIAN 1
# endif
#else
# ifndef WORDS_BIGENDIAN
/* # undef WORDS_BIGENDIAN */
# endif
#endif
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */
/* Define to `int` if you don't have socklen_t */
/* #undef socklen_t */
#if C_ATTRIBUTE_ALWAYS_INLINE
#define INLINE inline __attribute__((always_inline))
#else
#define INLINE inline
#endif
#if C_ATTRIBUTE_FASTCALL
#define DB_FASTCALL __attribute__((fastcall))
#else
#define DB_FASTCALL
#endif
#if C_HAS_ATTRIBUTE
#define GCC_ATTRIBUTE(x) __attribute__ ((x))
#else
#define GCC_ATTRIBUTE(x) /* attribute not supported */
#endif
#if C_HAS_BUILTIN_EXPECT
#define GCC_UNLIKELY(x) __builtin_expect((x),0)
#define GCC_LIKELY(x) __builtin_expect((x),1)
#else
#define GCC_UNLIKELY(x) (x)
#define GCC_LIKELY(x) (x)
#endif
typedef double Real64;
#if SIZEOF_UNSIGNED_CHAR != 1
# error "sizeof (unsigned char) != 1"
#else
typedef unsigned char Bit8u;
typedef signed char Bit8s;
#endif
#if SIZEOF_UNSIGNED_SHORT != 2
# error "sizeof (unsigned short) != 2"
#else
typedef unsigned short Bit16u;
typedef signed short Bit16s;
#endif
#if SIZEOF_UNSIGNED_INT == 4
typedef unsigned int Bit32u;
typedef signed int Bit32s;
#elif SIZEOF_UNSIGNED_LONG == 4
typedef unsigned long Bit32u;
typedef signed long Bit32s;
#else
# error "can't find sizeof(type) of 4 bytes!"
#endif
#if SIZEOF_UNSIGNED_LONG == 8
typedef unsigned long Bit64u;
typedef signed long Bit64s;
#elif SIZEOF_UNSIGNED_LONG_LONG == 8
typedef unsigned long long Bit64u;
typedef signed long long Bit64s;
#else
# error "can't find data type of 8 bytes"
#endif
#if SIZEOF_INT_P == 4
typedef Bit32u Bitu;
typedef Bit32s Bits;
#else
typedef Bit64u Bitu;
typedef Bit64s Bits;
#endif

View File

@ -0,0 +1,35 @@
--- contrib/dosbox-svn-3837/src/ints/bios.cpp.orig 2013-10-21 21:45:59.350897646 +0200
+++ contrib/dosbox-svn-3837/src/ints/bios.cpp 2013-10-21 22:02:03.526912653 +0200
@@ -32,7 +32,7 @@
#include "setup.h"
#include "serialport.h"
#include <time.h>
-#include <sys/timeb.h>
+//#include <sys/timeb.h>
/* if mem_systems 0 then size_extended is reported as the real size else
@@ -490,11 +490,11 @@
static void BIOS_HostTimeSync() {
/* Setup time and date */
- struct timeb timebuffer;
- ftime(&timebuffer);
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
struct tm *loctime;
- loctime = localtime (&timebuffer.time);
+ loctime = localtime (&tv.tv_sec);
/*
loctime->tm_hour = 23;
@@ -513,7 +513,7 @@
loctime->tm_hour*3600*1000+
loctime->tm_min*60*1000+
loctime->tm_sec*1000+
- timebuffer.millitm))*(((double)PIT_TICK_RATE/65536.0)/1000.0));
+ (tv.tv_usec * 1000)))*(((double)PIT_TICK_RATE/65536.0)/1000.0));
mem_writed(BIOS_TIMER,ticks);
}

View File

@ -0,0 +1,11 @@
--- contrib/dosbox-svn-3837/src/ints/int10_vesa.cpp.orig 2013-10-21 16:57:31.889803364 +0200
+++ contrib/dosbox-svn-3837/src/ints/int10_vesa.cpp 2013-10-21 16:57:36.777803442 +0200
@@ -45,7 +45,7 @@
static char string_oem[]="S3 Incorporated. Trio64";
static char string_vendorname[]="DOSBox Development Team";
static char string_productname[]="DOSBox - The DOS Emulator";
-static char string_productrev[]="DOSBox "VERSION;
+static char string_productrev[]="DOSBox " VERSION;
#ifdef _MSC_VER
#pragma pack (1)

View File

@ -0,0 +1,20 @@
--- contrib/dosbox-svn-3837/src/gui/sdl_mapper.cpp.orig 2013-10-30 13:57:07.000000000 +0100
+++ contrib/dosbox-svn-3837/src/gui/sdl_mapper.cpp 2013-10-30 15:35:50.563742200 +0100
@@ -416,7 +416,7 @@
}
#if !defined (WIN32) && !defined (MACOSX) && !defined(OS2)
/* Linux adds 8 to all scancodes */
- else key-=8;
+ //else key-=8;
#endif
#if defined (WIN32)
switch (key) {
@@ -2449,6 +2449,8 @@
}
}
#endif
+ /* Genode's input keycodes match these of evdev */
+ evdev_input = true;
if (evdev_input) {
sdlkey_map[0x67]=SDLK_UP;
sdlkey_map[0x6c]=SDLK_DOWN;

View File

@ -0,0 +1,58 @@
TARGET = dosbox
include $(REP_DIR)/ports/dosbox.inc
DOSBOX_DIR = $(REP_DIR)/contrib/$(DOSBOX)
SRC_CC_cpu = $(notdir $(wildcard $(DOSBOX_DIR)/src/cpu/*.cpp))
SRC_CC_debug = $(notdir $(wildcard $(DOSBOX_DIR)/src/debug/*.cpp))
FILTER_OUT_dos = cdrom_aspi_win32.cpp cdrom_ioctl_linux.cpp cdrom_ioctl_os2.cpp \
cdrom_ioctl_win32.cpp
SRC_CC_dos = $(filter-out $(FILTER_OUT_dos),$(notdir $(wildcard $(DOSBOX_DIR)/src/dos/*.cpp)))
SRC_CC_fpu = $(notdir $(DOSBOX_DIR)/src/fpu/fpu.cpp)
SRC_CC_gui = $(notdir $(wildcard $(DOSBOX_DIR)/src/gui/*.cpp))
FILTER_OUT_hw = opl.cpp
SRC_CC_hw = $(filter-out $(FILTER_OUT_hw),$(notdir $(wildcard $(DOSBOX_DIR)/src/hardware/*.cpp)))
SRC_CC_hw_ser = $(notdir $(wildcard $(DOSBOX_DIR)/src/hardware/serialport/*.cpp))
SRC_CC_ints = $(notdir $(wildcard $(DOSBOX_DIR)/src/ints/*.cpp))
SRC_CC_misc = $(notdir $(wildcard $(DOSBOX_DIR)/src/misc/*.cpp))
SRC_CC_shell = $(notdir $(wildcard $(DOSBOX_DIR)/src/shell/*.cpp))
SRC_CC = $(notdir $(DOSBOX_DIR)/src/dosbox.cpp)
SRC_CC += $(SRC_CC_cpu) $(SRC_CC_debug) $(SRC_CC_dos) $(SRC_CC_fpu) $(SRC_CC_gui) \
$(SRC_CC_hw) $(SRC_CC_hw_ser) $(SRC_CC_ints) $(SRC_CC_ints) $(SRC_CC_misc) \
$(SRC_CC_shell)
vpath %.cpp $(DOSBOX_DIR)/src
vpath %.cpp $(DOSBOX_DIR)/src/cpu
vpath %.cpp $(DOSBOX_DIR)/src/debug
vpath %.cpp $(DOSBOX_DIR)/src/dos
vpath %.cpp $(DOSBOX_DIR)/src/fpu
vpath %.cpp $(DOSBOX_DIR)/src/gui
vpath %.cpp $(DOSBOX_DIR)/src/hardware
vpath %.cpp $(DOSBOX_DIR)/src/hardware/serialport
vpath %.cpp $(DOSBOX_DIR)/src/ints
vpath %.cpp $(DOSBOX_DIR)/src/misc
vpath %.cpp $(DOSBOX_DIR)/src/shell
INC_DIR += $(PRG_DIR)
INC_DIR += $(DOSBOX_DIR)/include
INC_DIR += $(addprefix $(DOSBOX_DIR)/src, cpu debug dos fpu gui hardware hardware/serialport \
ints misc shell)
CC_OPT = -DHAVE_CONFIG_H -D_GNU_SOURCE=1 -D_REENTRANT
ifeq ($(filter-out $(SPECS),x86_32),)
INC_DIR += $(PRG_DIR)/x86_32
CC_OPT += -DC_TARGETCPU=X86
else ifeq ($(filter-out $(SPECS),x86_64),)
INC_DIR += $(PRG_DIR)/x86_64
CC_OPT += -DC_TARGETCPU=X86_64
endif
CC_WARN = -Wall
CC_WARN += -Wno-unused-variable -Wno-unused-function -Wno-switch -Wno-unused-value \
-Wno-unused-but-set-variable -Wno-format -Wno-maybe-uninitialized \
-Wno-sign-compare -Wno-narrowing -Wno-missing-braces -Wno-array-bounds \
-Wno-parentheses
LIBS += libc libm libpng sdl sdl_net stdcxx zlib
LIBS += libc_log libc_fs libc_lwip_nic_dhcp config_args

View File

@ -0,0 +1,17 @@
/* The size of `int *', as computed by sizeof. */
#define SIZEOF_INT_P 4
/* The size of `unsigned char', as computed by sizeof. */
#define SIZEOF_UNSIGNED_CHAR 1
/* The size of `unsigned int', as computed by sizeof. */
#define SIZEOF_UNSIGNED_INT 4
/* The size of `unsigned long', as computed by sizeof. */
#define SIZEOF_UNSIGNED_LONG 4
/* The size of `unsigned long long', as computed by sizeof. */
#define SIZEOF_UNSIGNED_LONG_LONG 8
/* The size of `unsigned short', as computed by sizeof. */
#define SIZEOF_UNSIGNED_SHORT 2

View File

@ -0,0 +1,17 @@
/* The size of `int *', as computed by sizeof. */
#define SIZEOF_INT_P 8
/* The size of `unsigned char', as computed by sizeof. */
#define SIZEOF_UNSIGNED_CHAR 1
/* The size of `unsigned int', as computed by sizeof. */
#define SIZEOF_UNSIGNED_INT 4
/* The size of `unsigned long', as computed by sizeof. */
#define SIZEOF_UNSIGNED_LONG 8
/* The size of `unsigned long long', as computed by sizeof. */
#define SIZEOF_UNSIGNED_LONG_LONG 8
/* The size of `unsigned short', as computed by sizeof. */
#define SIZEOF_UNSIGNED_SHORT 2