parent
0b36921ae7
commit
880590de02
@ -0,0 +1,51 @@
|
||||
# Copyright 1999-2016 Gentoo Foundation
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
# $Id$
|
||||
|
||||
EAPI=5
|
||||
inherit eutils games
|
||||
|
||||
DESCRIPTION="DOS emulator"
|
||||
HOMEPAGE="http://dosbox.sourceforge.net/"
|
||||
SRC_URI="mirror://sourceforge/dosbox/${P}.tar.gz"
|
||||
|
||||
LICENSE="GPL-2"
|
||||
SLOT="0"
|
||||
KEYWORDS="~amd64 ~arm ~ppc ~ppc64 ~sparc ~x86"
|
||||
IUSE="alsa debug hardened opengl"
|
||||
|
||||
DEPEND="alsa? ( media-libs/alsa-lib )
|
||||
debug? ( sys-libs/ncurses:0 )
|
||||
opengl? ( virtual/glu virtual/opengl )
|
||||
media-libs/libpng:0
|
||||
media-libs/libsdl[joystick,video,X]
|
||||
media-libs/sdl-net
|
||||
media-libs/sdl-sound"
|
||||
RDEPEND=${DEPEND}
|
||||
|
||||
PATCHES=(
|
||||
"${FILESDIR}"/${P}-clang.patch
|
||||
"${FILESDIR}"/${P}-gcc46.patch
|
||||
"${FILESDIR}"/${P}-wine-drive-z.patch
|
||||
"${FILESDIR}"/${P}-wine-filenames.patch
|
||||
)
|
||||
|
||||
src_prepare() {
|
||||
epatch -p1 "${PATCHES[@]}"
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
egamesconf \
|
||||
$(use_enable alsa alsa-midi) \
|
||||
$(use_enable !hardened dynamic-core) \
|
||||
$(use_enable !hardened dynamic-x86) \
|
||||
$(use_enable debug) \
|
||||
$(use_enable opengl)
|
||||
}
|
||||
|
||||
src_install() {
|
||||
default
|
||||
make_desktop_entry dosbox DOSBox /usr/share/pixmaps/dosbox.ico
|
||||
doicon src/dosbox.ico
|
||||
prepgamesdirs
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
Gentoo-Bug: https://bugs.gentoo.org/show_bug.cgi?id=449060
|
||||
|
||||
Two backports from Dosbox SVN needed for clang support:
|
||||
src/fpu/fpu_instructions_x86.h changes are revision 3841
|
||||
src/cpu/core_dynrec/risc_x64.h changes are revision 3894
|
||||
|
||||
Index: src/fpu/fpu_instructions_x86.h
|
||||
===================================================================
|
||||
--- a/src/fpu/fpu_instructions_x86.h (revision 3840)
|
||||
+++ b/src/fpu/fpu_instructions_x86.h (revision 3841)
|
||||
@@ -1161,12 +1161,12 @@
|
||||
|
||||
static void FPU_FLD_I16(PhysPt addr,Bitu store_to) {
|
||||
fpu.p_regs[8].m1 = (Bit32u)mem_readw(addr);
|
||||
- FPUD_LOAD(fild,WORD,)
|
||||
+ FPUD_LOAD(fild,WORD,s)
|
||||
}
|
||||
|
||||
static void FPU_FLD_I16_EA(PhysPt addr) {
|
||||
fpu.p_regs[8].m1 = (Bit32u)mem_readw(addr);
|
||||
- FPUD_LOAD_EA(fild,WORD,)
|
||||
+ FPUD_LOAD_EA(fild,WORD,s)
|
||||
}
|
||||
|
||||
static void FPU_FLD_I32(PhysPt addr,Bitu store_to) {
|
||||
@@ -1211,7 +1211,7 @@
|
||||
}
|
||||
|
||||
static void FPU_FST_I16(PhysPt addr) {
|
||||
- FPUD_STORE(fistp,WORD,)
|
||||
+ FPUD_STORE(fistp,WORD,s)
|
||||
mem_writew(addr,(Bit16u)fpu.p_regs[8].m1);
|
||||
}
|
||||
|
||||
Index: src/cpu/core_dynrec/risc_x64.h
|
||||
===================================================================
|
||||
--- a/src/cpu/core_dynrec/risc_x64.h (revision 3893)
|
||||
+++ b/src/cpu/core_dynrec/risc_x64.h (revision 3894)
|
||||
@@ -85,7 +85,8 @@
|
||||
|
||||
static INLINE void gen_reg_memaddr(HostReg reg,void* data) {
|
||||
Bit64s diff = (Bit64s)data-((Bit64s)cache.pos+5);
|
||||
- if ((diff<0x80000000LL) && (diff>-0x80000000LL)) {
|
||||
+// if ((diff<0x80000000LL) && (diff>-0x80000000LL)) { //clang messes itself up on this...
|
||||
+ if ( (diff>>63) == (diff>>31) ) { //signed bit extend, test to see if value fits in a Bit32s
|
||||
cache_addb(0x05+(reg<<3));
|
||||
// RIP-relative addressing is offset after the instruction
|
||||
cache_addd((Bit32u)(((Bit64u)diff)&0xffffffffLL));
|
@ -0,0 +1,151 @@
|
||||
From Debian (which backported the patch):
|
||||
https://packages.debian.org/sid/dosbox
|
||||
|
||||
Description: Rewrite mount without arguments to display volume label as well.
|
||||
Some refactoring of the code.
|
||||
Add mount -z X, where X is the new virtual drive for the Wine Team.
|
||||
Origin: upstream, http://sourceforge.net/p/dosbox/code-0/3736/
|
||||
Author: Peter Veenstra <qbix79@users.sourceforge.net>
|
||||
Last-Update: 2011-07-23
|
||||
--- a/src/dos/dos_programs.cpp
|
||||
+++ b/src/dos/dos_programs.cpp
|
||||
@@ -49,27 +49,55 @@
|
||||
#endif
|
||||
|
||||
void MSCDEX_SetCDInterface(int intNr, int forceCD);
|
||||
-
|
||||
+static Bitu ZDRIVE_NUM = 25;
|
||||
|
||||
class MOUNT : public Program {
|
||||
public:
|
||||
- void Run(void)
|
||||
- {
|
||||
+ void ListMounts(void) {
|
||||
+ char name[DOS_NAMELENGTH_ASCII];Bit32u size;Bit16u date;Bit16u time;Bit8u attr;
|
||||
+ /* Command uses dta so set it to our internal dta */
|
||||
+ RealPt save_dta = dos.dta();
|
||||
+ dos.dta(dos.tables.tempdta);
|
||||
+ DOS_DTA dta(dos.dta());
|
||||
+
|
||||
+ WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_1"));
|
||||
+ WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_FORMAT"),"Drive","Type","Label");
|
||||
+ for(int p = 0;p < 8;p++) WriteOut("----------");
|
||||
+
|
||||
+ for (int d = 0;d < DOS_DRIVES;d++) {
|
||||
+ if (!Drives[d]) continue;
|
||||
+
|
||||
+ char root[4] = {'A'+d,':','\\',0};
|
||||
+ bool ret = DOS_FindFirst(root,DOS_ATTR_VOLUME);
|
||||
+ if (ret) {
|
||||
+ dta.GetResult(name,size,date,time,attr);
|
||||
+ DOS_FindNext(); //Mark entry as invalid
|
||||
+ } else name[0] = 0;
|
||||
+
|
||||
+ /* Change 8.3 to 11.0 */
|
||||
+ char* dot = strchr(name,'.');
|
||||
+ if(dot && (dot - name == 8) ) {
|
||||
+ name[8] = name[9];name[9] = name[10];name[10] = name[11];name[11] = 0;
|
||||
+ }
|
||||
+
|
||||
+ root[1] = 0; //This way, the format string can be reused.
|
||||
+ WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_FORMAT"),root, Drives[d]->GetInfo(),name);
|
||||
+ }
|
||||
+ dos.dta(save_dta);
|
||||
+ }
|
||||
+
|
||||
+ void Run(void) {
|
||||
DOS_Drive * newdrive;char drive;
|
||||
std::string label;
|
||||
std::string umount;
|
||||
+ std::string newz;
|
||||
|
||||
//Hack To allow long commandlines
|
||||
ChangeToLongCmd();
|
||||
/* Parse the command line */
|
||||
/* if the command line is empty show current mounts */
|
||||
if (!cmd->GetCount()) {
|
||||
- WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_1"));
|
||||
- for (int d=0;d<DOS_DRIVES;d++) {
|
||||
- if (Drives[d]) {
|
||||
- WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_2"),d+'A',Drives[d]->GetInfo());
|
||||
- }
|
||||
- }
|
||||
+ ListMounts();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -84,12 +112,12 @@
|
||||
if (cmd->FindString("-u",umount,false)) {
|
||||
umount[0] = toupper(umount[0]);
|
||||
int i_drive = umount[0]-'A';
|
||||
- if(i_drive < DOS_DRIVES && i_drive >= 0 && Drives[i_drive]) {
|
||||
+ if (i_drive < DOS_DRIVES && i_drive >= 0 && Drives[i_drive]) {
|
||||
switch (DriveManager::UnmountDrive(i_drive)) {
|
||||
case 0:
|
||||
Drives[i_drive] = 0;
|
||||
if(i_drive == DOS_GetDefaultDrive())
|
||||
- DOS_SetDrive(toupper('Z') - 'A');
|
||||
+ DOS_SetDrive(ZDRIVE_NUM);
|
||||
WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_SUCCESS"),umount[0]);
|
||||
break;
|
||||
case 1:
|
||||
@@ -104,8 +132,46 @@
|
||||
}
|
||||
return;
|
||||
}
|
||||
-
|
||||
- // Show list of cdroms
|
||||
+
|
||||
+ /* Check for moving Z: */
|
||||
+ /* Only allowing moving it once. It is merely a convenience added for the wine team */
|
||||
+ if (ZDRIVE_NUM == 25 && cmd->FindString("-z", newz,false)) {
|
||||
+ newz[0] = toupper(newz[0]);
|
||||
+ int i_newz = newz[0] - 'A';
|
||||
+ if (i_newz >= 0 && i_newz < DOS_DRIVES-1 && !Drives[i_newz]) {
|
||||
+ ZDRIVE_NUM = i_newz;
|
||||
+ /* remap drives */
|
||||
+ Drives[i_newz] = Drives[25];
|
||||
+ Drives[25] = 0;
|
||||
+ DOS_Shell *fs = static_cast<DOS_Shell *>(first_shell); //dynamic ?
|
||||
+ /* Update environment */
|
||||
+ std::string line = "";
|
||||
+ char ppp[2] = {newz[0],0};
|
||||
+ std::string tempenv = ppp; tempenv += ":\\";
|
||||
+ if (fs->GetEnvStr("PATH",line)){
|
||||
+ std::string::size_type idx = line.find('=');
|
||||
+ std::string value = line.substr(idx +1 , std::string::npos);
|
||||
+ while ( (idx = value.find("Z:\\")) != std::string::npos ||
|
||||
+ (idx = value.find("z:\\")) != std::string::npos )
|
||||
+ value.replace(idx,3,tempenv);
|
||||
+ line = value;
|
||||
+ }
|
||||
+ if (!line.size()) line = tempenv;
|
||||
+ fs->SetEnv("PATH",line.c_str());
|
||||
+ tempenv += "COMMAND.COM";
|
||||
+ fs->SetEnv("COMSPEC",tempenv.c_str());
|
||||
+
|
||||
+ /* Update batch file if running from Z: (very likely: autoexec) */
|
||||
+ if(fs->bf) {
|
||||
+ std::string &name = fs->bf->filename;
|
||||
+ if(name.length() >2 && name[0] == 'Z' && name[1] == ':') name[0] = newz[0];
|
||||
+ }
|
||||
+ /* Change the active drive */
|
||||
+ if (DOS_GetDefaultDrive() == 25) DOS_SetDrive(i_newz);
|
||||
+ }
|
||||
+ return;
|
||||
+ }
|
||||
+ /* Show list of cdroms */
|
||||
if (cmd->FindExist("-cd",false)) {
|
||||
int num = SDL_CDNumDrives();
|
||||
WriteOut(MSG_Get("PROGRAM_MOUNT_CDROMS_FOUND"),num);
|
||||
@@ -1347,8 +1413,9 @@
|
||||
/*Add Messages */
|
||||
|
||||
MSG_Add("PROGRAM_MOUNT_CDROMS_FOUND","CDROMs found: %d\n");
|
||||
+ MSG_Add("PROGRAM_MOUNT_STATUS_FORMAT","%-5s %-58s %-12s\n");
|
||||
MSG_Add("PROGRAM_MOUNT_STATUS_2","Drive %c is mounted as %s\n");
|
||||
- MSG_Add("PROGRAM_MOUNT_STATUS_1","Current mounted drives are:\n");
|
||||
+ MSG_Add("PROGRAM_MOUNT_STATUS_1","The currently mounted drives are:\n");
|
||||
MSG_Add("PROGRAM_MOUNT_ERROR_1","Directory %s doesn't exist.\n");
|
||||
MSG_Add("PROGRAM_MOUNT_ERROR_2","%s isn't a directory\n");
|
||||
MSG_Add("PROGRAM_MOUNT_ILL_TYPE","Illegal type %s\n");
|
@ -0,0 +1,89 @@
|
||||
Description: Be friendly for other open source projects: work with WINE style namemangling.
|
||||
Patch 3382938 from Andre_H (modified).
|
||||
Origin: upstream, http://sourceforge.net/p/dosbox/code-0/3743/
|
||||
Author: Peter Veenstra <qbix79@users.sourceforge.net>
|
||||
Last-Update: 2011-08-30
|
||||
--- a/src/dos/drive_cache.cpp
|
||||
+++ b/src/dos/drive_cache.cpp
|
||||
@@ -370,6 +370,60 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
+#define WINE_DRIVE_SUPPORT 1
|
||||
+#if WINE_DRIVE_SUPPORT
|
||||
+//Changes to interact with WINE by supporting their namemangling.
|
||||
+//The code is rather slow, because orglist is unordered, so it needs to be avoided if possible.
|
||||
+//Hence the tests in GetLongFileName
|
||||
+
|
||||
+
|
||||
+// From the Wine project
|
||||
+static Bits wine_hash_short_file_name( char* name, char* buffer )
|
||||
+{
|
||||
+ static const char hash_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345";
|
||||
+ static const char invalid_chars[] = { '*','?','<','>','|','"','+','=',',',';','[',']',' ','\345','~','.',0 };
|
||||
+ char* p;
|
||||
+ char* ext;
|
||||
+ char* end = name + strlen(name);
|
||||
+ char* dst;
|
||||
+ unsigned short hash;
|
||||
+ int i;
|
||||
+
|
||||
+ // Compute the hash code of the file name
|
||||
+ for (p = name, hash = 0xbeef; p < end - 1; p++)
|
||||
+ hash = (hash<<3) ^ (hash>>5) ^ tolower(*p) ^ (tolower(p[1]) << 8);
|
||||
+ hash = (hash<<3) ^ (hash>>5) ^ tolower(*p); // Last character
|
||||
+
|
||||
+
|
||||
+ // Find last dot for start of the extension
|
||||
+ for (p = name + 1, ext = NULL; p < end - 1; p++) if (*p == '.') ext = p;
|
||||
+
|
||||
+ // Copy first 4 chars, replacing invalid chars with '_'
|
||||
+ for (i = 4, p = name, dst = buffer; i > 0; i--, p++)
|
||||
+ {
|
||||
+ if (p == end || p == ext) break;
|
||||
+ *dst++ = (*p < 0 || strchr( invalid_chars, *p ) != NULL) ? '_' : toupper(*p);
|
||||
+ }
|
||||
+ // Pad to 5 chars with '~'
|
||||
+ while (i-- >= 0) *dst++ = '~';
|
||||
+
|
||||
+ // Insert hash code converted to 3 ASCII chars
|
||||
+ *dst++ = hash_chars[(hash >> 10) & 0x1f];
|
||||
+ *dst++ = hash_chars[(hash >> 5) & 0x1f];
|
||||
+ *dst++ = hash_chars[hash & 0x1f];
|
||||
+
|
||||
+ // Copy the first 3 chars of the extension (if any)
|
||||
+ if (ext)
|
||||
+ {
|
||||
+ *dst++ = '.';
|
||||
+ for (i = 3, ext++; (i > 0) && ext < end; i--, ext++)
|
||||
+ *dst++ = (*ext < 0 || strchr( invalid_chars, *ext ) != NULL) ? '_' : toupper(*ext);
|
||||
+ }
|
||||
+
|
||||
+ return dst - buffer;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
Bits DOS_Drive_Cache::GetLongName(CFileInfo* curDir, char* shortName) {
|
||||
std::vector<CFileInfo*>::size_type filelist_size = curDir->fileList.size();
|
||||
if (GCC_UNLIKELY(filelist_size<=0)) return -1;
|
||||
@@ -390,6 +444,20 @@
|
||||
return mid;
|
||||
};
|
||||
}
|
||||
+#ifdef WINE_DRIVE_SUPPORT
|
||||
+ if (strlen(shortName) < 8 || shortName[4] != '~' || shortName[5] == '.' || shortName[6] == '.' || shortName[7] == '.') return -1; // not available
|
||||
+ // else it's most likely a Wine style short name ABCD~###, # = not dot (length at least 8)
|
||||
+ // The above test is rather strict as the following loop can be really slow if filelist_size is large.
|
||||
+ char buff[CROSS_LEN];
|
||||
+ for (Bits i = 0; i < filelist_size; i++) {
|
||||
+ res = wine_hash_short_file_name(curDir->fileList[i]->orgname,buff);
|
||||
+ if (!strncmp(shortName,buff,res))
|
||||
+ { // Found
|
||||
+ strcpy(shortName,curDir->fileList[i]->orgname);
|
||||
+ return i;
|
||||
+ };
|
||||
+ }
|
||||
+#endif
|
||||
// not available
|
||||
return -1;
|
||||
}
|
@ -1 +1 @@
|
||||
Tue, 28 Jun 2016 06:40:49 +0000
|
||||
Tue, 28 Jun 2016 08:40:49 +0000
|
||||
|
@ -1 +1 @@
|
||||
Tue, 28 Jun 2016 06:40:49 +0000
|
||||
Tue, 28 Jun 2016 08:40:49 +0000
|
||||
|
@ -0,0 +1,13 @@
|
||||
DEFINED_PHASES=compile configure install postinst preinst prepare setup unpack
|
||||
DEPEND=alsa? ( media-libs/alsa-lib ) debug? ( sys-libs/ncurses:0 ) opengl? ( virtual/glu virtual/opengl ) media-libs/libpng:0 media-libs/libsdl[joystick,video,X] media-libs/sdl-net media-libs/sdl-sound
|
||||
DESCRIPTION=DOS emulator
|
||||
EAPI=5
|
||||
HOMEPAGE=http://dosbox.sourceforge.net/
|
||||
IUSE=alsa debug hardened opengl
|
||||
KEYWORDS=~amd64 ~arm ~ppc ~ppc64 ~sparc ~x86
|
||||
LICENSE=GPL-2
|
||||
RDEPEND=alsa? ( media-libs/alsa-lib ) debug? ( sys-libs/ncurses:0 ) opengl? ( virtual/glu virtual/opengl ) media-libs/libpng:0 media-libs/libsdl[joystick,video,X] media-libs/sdl-net media-libs/sdl-sound games-misc/games-envd
|
||||
SLOT=0
|
||||
SRC_URI=mirror://sourceforge/dosbox/dosbox-0.74.tar.gz
|
||||
_eclasses_=base 3fe4f8980633fd7bc69e9887209ba2fe eutils 792f83d5ec9536cb5ccef375469d8bde games 2cf0d67d765e6358b435ccda30c13ad8 multilib d062ae4ba2fc40a19c11de2ad89b6616 toolchain-funcs e886935aae2b45a545665444ab0667cf user 906f3c8eb3a2350a4f1191a89baa3e46
|
||||
_md5_=7ada824e7ca81cfa335940734e6452a6
|
@ -1 +1 @@
|
||||
Tue, 28 Jun 2016 06:40:49 +0000
|
||||
Tue, 28 Jun 2016 08:40:50 +0000
|
||||
|
@ -1 +1 @@
|
||||
Tue Jun 28 06:39:53 UTC 2016
|
||||
Tue Jun 28 08:39:54 UTC 2016
|
||||
|
@ -1 +1 @@
|
||||
Tue, 28 Jun 2016 07:00:01 +0000
|
||||
Tue, 28 Jun 2016 09:00:01 +0000
|
||||
|
@ -1 +1 @@
|
||||
1467096001 Tue 28 Jun 2016 06:40:01 AM UTC
|
||||
1467103201 Tue 28 Jun 2016 08:40:01 AM UTC
|
||||
|
@ -1 +1 @@
|
||||
Tue, 28 Jun 2016 06:40:49 +0000
|
||||
Tue, 28 Jun 2016 08:40:49 +0000
|
||||
|
Loading…
Reference in new issue