mirror of
https://github.com/joncampbell123/dosbox-x.git
synced 2025-05-09 03:41:10 +08:00
Alternate A20 disable hack for EXEPACK error, as an alternative to LOADFIX
This commit is contained in:
parent
d9a5632434
commit
59d71ab72d
@ -1707,6 +1707,7 @@ timeout = 0
|
|||||||
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
||||||
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
||||||
# Possible values: true, false, 1, 0, auto, autostart.
|
# Possible values: true, false, 1, 0, auto, autostart.
|
||||||
|
# autoa20fix: If set (default), DOSBox-X will automatically re-run the executable with the A20 gate disabled if it failed with the "Packed file is corrupt" error.
|
||||||
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
||||||
# automount: Enable automatic drive mounting in Windows.
|
# automount: Enable automatic drive mounting in Windows.
|
||||||
# automountall: Automatically mount all available Windows drives at start.
|
# automountall: Automatically mount all available Windows drives at start.
|
||||||
@ -1801,6 +1802,7 @@ umb = true
|
|||||||
quick reboot = false
|
quick reboot = false
|
||||||
ver =
|
ver =
|
||||||
lfn = auto
|
lfn = auto
|
||||||
|
autoa20fix = true
|
||||||
autoloadfix = true
|
autoloadfix = true
|
||||||
automount = true
|
automount = true
|
||||||
automountall = false
|
automountall = false
|
||||||
|
@ -624,6 +624,7 @@ timeout = 0
|
|||||||
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
||||||
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
||||||
# Possible values: true, false, 1, 0, auto, autostart.
|
# Possible values: true, false, 1, 0, auto, autostart.
|
||||||
|
# autoa20fix: If set (default), DOSBox-X will automatically re-run the executable with the A20 gate disabled if it failed with the "Packed file is corrupt" error.
|
||||||
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
||||||
# automount: Enable automatic drive mounting in Windows.
|
# automount: Enable automatic drive mounting in Windows.
|
||||||
# automountall: Automatically mount all available Windows drives at start.
|
# automountall: Automatically mount all available Windows drives at start.
|
||||||
@ -651,6 +652,7 @@ umb = true
|
|||||||
quick reboot = false
|
quick reboot = false
|
||||||
ver =
|
ver =
|
||||||
lfn = auto
|
lfn = auto
|
||||||
|
autoa20fix = true
|
||||||
autoloadfix = true
|
autoloadfix = true
|
||||||
automount = true
|
automount = true
|
||||||
automountall = false
|
automountall = false
|
||||||
|
@ -1707,6 +1707,7 @@ timeout = 0
|
|||||||
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
# lfn: Enable long filename support. If set to auto (default), it is enabled if the reported DOS version is at least 7.0.
|
||||||
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
# If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.
|
||||||
# Possible values: true, false, 1, 0, auto, autostart.
|
# Possible values: true, false, 1, 0, auto, autostart.
|
||||||
|
# autoa20fix: If set (default), DOSBox-X will automatically re-run the executable with the A20 gate disabled if it failed with the "Packed file is corrupt" error.
|
||||||
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
# autoloadfix: If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the "Packed file is corrupt" error.
|
||||||
# automount: Enable automatic drive mounting in Windows.
|
# automount: Enable automatic drive mounting in Windows.
|
||||||
# automountall: Automatically mount all available Windows drives at start.
|
# automountall: Automatically mount all available Windows drives at start.
|
||||||
@ -1801,6 +1802,7 @@ private area in umb = true
|
|||||||
quick reboot = false
|
quick reboot = false
|
||||||
ver =
|
ver =
|
||||||
lfn = auto
|
lfn = auto
|
||||||
|
autoa20fix = true
|
||||||
autoloadfix = true
|
autoloadfix = true
|
||||||
automount = true
|
automount = true
|
||||||
automountall = false
|
automountall = false
|
||||||
|
@ -379,8 +379,10 @@ static inline void overhead() {
|
|||||||
#define BCD2BIN(x) ((((unsigned int)(x) >> 4u) * 10u) + ((x) & 0x0fu))
|
#define BCD2BIN(x) ((((unsigned int)(x) >> 4u) * 10u) + ((x) & 0x0fu))
|
||||||
#define BIN2BCD(x) ((((x) / 10u) << 4u) + (x) % 10u)
|
#define BIN2BCD(x) ((((x) / 10u) << 4u) + (x) % 10u)
|
||||||
extern bool date_host_forced;
|
extern bool date_host_forced;
|
||||||
|
extern bool dos_a20_disable_on_exec;
|
||||||
|
|
||||||
static Bitu DOS_21Handler(void);
|
static Bitu DOS_21Handler(void);
|
||||||
|
void XMS_DOS_LocalA20DisableIfNotEnabled(void);
|
||||||
void DOS_Int21_7139(char *name1, const char *name2);
|
void DOS_Int21_7139(char *name1, const char *name2);
|
||||||
void DOS_Int21_713a(char *name1, const char *name2);
|
void DOS_Int21_713a(char *name1, const char *name2);
|
||||||
void DOS_Int21_713b(char *name1, const char *name2);
|
void DOS_Int21_713b(char *name1, const char *name2);
|
||||||
@ -1610,6 +1612,13 @@ static Bitu DOS_21Handler(void) {
|
|||||||
case 0x4b: /* EXEC Load and/or execute program */
|
case 0x4b: /* EXEC Load and/or execute program */
|
||||||
{
|
{
|
||||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||||
|
|
||||||
|
/* A20 hack for EXEPACK'd executables */
|
||||||
|
if (dos_a20_disable_on_exec) {
|
||||||
|
XMS_DOS_LocalA20DisableIfNotEnabled();
|
||||||
|
dos_a20_disable_on_exec=false;
|
||||||
|
}
|
||||||
|
|
||||||
LOG(LOG_EXEC,LOG_NORMAL)("Execute %s %d",name1,reg_al);
|
LOG(LOG_EXEC,LOG_NORMAL)("Execute %s %d",name1,reg_al);
|
||||||
if (!DOS_Execute(name1,SegPhys(es)+reg_bx,reg_al)) {
|
if (!DOS_Execute(name1,SegPhys(es)+reg_bx,reg_al)) {
|
||||||
reg_ax=dos.errorcode;
|
reg_ax=dos.errorcode;
|
||||||
|
@ -3660,6 +3660,10 @@ void DOSBOX_SetupConfigSections(void) {
|
|||||||
"If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.");
|
"If set to autostart, the builtin VER command won't activate/disactivate LFN support according to the reported DOS version.");
|
||||||
Pstring->SetBasic(true);
|
Pstring->SetBasic(true);
|
||||||
|
|
||||||
|
Pbool = secprop->Add_bool("autoa20fix",Property::Changeable::WhenIdle,true);
|
||||||
|
Pbool->Set_help("If set (default), DOSBox-X will automatically re-run the executable with the A20 gate disabled if it failed with the \"Packed file is corrupt\" error.");
|
||||||
|
Pbool->SetBasic(true);
|
||||||
|
|
||||||
Pbool = secprop->Add_bool("autoloadfix",Property::Changeable::WhenIdle,true);
|
Pbool = secprop->Add_bool("autoloadfix",Property::Changeable::WhenIdle,true);
|
||||||
Pbool->Set_help("If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the \"Packed file is corrupt\" error.");
|
Pbool->Set_help("If set (default), DOSBox-X will automatically re-run the executable with LOADFIX if it failed with the \"Packed file is corrupt\" error.");
|
||||||
Pbool->SetBasic(true);
|
Pbool->SetBasic(true);
|
||||||
|
@ -398,6 +398,15 @@ Bitu XMS_LocalDisableA20(void) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XMS_DOS_LocalA20DisableIfNotEnabled(void) {
|
||||||
|
/* This is one of two hacks to deal with EXEPACK'd executables loaded too low */
|
||||||
|
if (XMS_GetEnabledA20()) {
|
||||||
|
LOG(LOG_DOSMISC,LOG_DEBUG)("Temporarily disabling A20 gate. As a hack this will FORCE local A20 enable to zero (from count=%d)",xms_local_enable_count);
|
||||||
|
xms_local_enable_count = 1;
|
||||||
|
XMS_LocalDisableA20();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void XMS_DOS_LocalA20EnableIfNotEnabled(void) {
|
void XMS_DOS_LocalA20EnableIfNotEnabled(void) {
|
||||||
/* Confirmed MS-DOS behavior if DOS=HIGH */
|
/* Confirmed MS-DOS behavior if DOS=HIGH */
|
||||||
if (!XMS_GetEnabledA20()) {
|
if (!XMS_GetEnabledA20()) {
|
||||||
|
@ -747,6 +747,7 @@ void DOS_Shell::InputCommand(char * line) {
|
|||||||
ProcessCmdLineEnvVarStitution(line);
|
ProcessCmdLineEnvVarStitution(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void XMS_DOS_LocalA20DisableIfNotEnabled(void);
|
||||||
|
|
||||||
/* WARNING: Substitution is carried out in-place!
|
/* WARNING: Substitution is carried out in-place!
|
||||||
* Buffer pointed to by "line" must be at least CMD_MAXLINE+1 bytes long! */
|
* Buffer pointed to by "line" must be at least CMD_MAXLINE+1 bytes long! */
|
||||||
@ -885,6 +886,7 @@ overflow:
|
|||||||
|
|
||||||
std::string full_arguments = "";
|
std::string full_arguments = "";
|
||||||
intptr_t hret=0;
|
intptr_t hret=0;
|
||||||
|
bool dos_a20_disable_on_exec=false;
|
||||||
bool infix=false, winautorun=false;
|
bool infix=false, winautorun=false;
|
||||||
extern bool packerr, reqwin, startwait, startquiet, ctrlbrk, mountwarning;
|
extern bool packerr, reqwin, startwait, startquiet, ctrlbrk, mountwarning;
|
||||||
#if defined (WIN32) && !defined(HX_DOS)
|
#if defined (WIN32) && !defined(HX_DOS)
|
||||||
@ -1145,7 +1147,15 @@ continue_1:
|
|||||||
reg_eip=oldeip;
|
reg_eip=oldeip;
|
||||||
SegSet16(cs,oldcs);
|
SegSet16(cs,oldcs);
|
||||||
#endif
|
#endif
|
||||||
if (packerr&&!infix&&sec->Get_bool("autoloadfix")) {
|
if (packerr&&!infix&&sec->Get_bool("autoa20fix")) {
|
||||||
|
WriteOut("\r\n\033[41;1m\033[1;37;1mDOSBox-X\033[0m Failed to load the executable\r\n\033[41;1m\033[37;1mDOSBox-X\033[0m Now try again with A20 disable...\r\n");
|
||||||
|
infix=true;
|
||||||
|
dos_a20_disable_on_exec=true;
|
||||||
|
Execute(name, args);
|
||||||
|
dos_a20_disable_on_exec=false;
|
||||||
|
infix=false;
|
||||||
|
}
|
||||||
|
else if (packerr&&!infix&&sec->Get_bool("autoloadfix")) {
|
||||||
uint16_t segment;
|
uint16_t segment;
|
||||||
uint16_t blocks = (uint16_t)(64*1024/16);
|
uint16_t blocks = (uint16_t)(64*1024/16);
|
||||||
if (DOS_AllocateMemory(&segment,&blocks)) {
|
if (DOS_AllocateMemory(&segment,&blocks)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user