1
0
Fork 0

Updated to use new paramblock class and some endian fixes for the exe header.

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@359
This commit is contained in:
Sjoerd van der Berg 2002-10-19 17:23:38 +00:00
parent 60427e0428
commit 044a54d4b7

View file

@ -191,28 +191,24 @@ static void SetupPSP(Bit16u pspseg,Bit16u memsize,Bit16u envseg) {
dos.dta=RealMake(pspseg,0x80);
}
static void SetupCMDLine(Bit16u pspseg,ParamBlock * block)
static void SetupCMDLine(Bit16u pspseg,DOS_ParamBlock & block)
{
DOS_PSP psp(pspseg);
// if cmdtail==0 it will inited as empty in SetCommandTail
psp.SetCommandTail(block->exec.cmdtail);
psp.SetCommandTail(block.data.exec.cmdtail);
}
bool DOS_Execute(char * name,ParamBlock * _block,Bit8u flags) {
bool DOS_Execute(char * name,PhysPt block_pt,Bit8u flags) {
EXE_Header head;Bitu i;
Bit16u fhandle;Bit16u len;Bit32u pos;
Bit16u pspseg,envseg,loadseg,memsize,readsize;
HostPt loadaddress;RealPt relocpt;
Bitu headersize,imagesize;
DOS_ParamBlock block(block_pt);
block.LoadData();
if (flags!=LOADNGO && flags!=OVERLAY) {
E_Exit("DOS:Not supported execute mode %d for file %s",flags,name);
}
// Parameter block may be overwritten on load, so save these values !
ParamBlock block;
memcpy(&block,_block,sizeof(ParamBlock));
/* Check for EXE or COM File */
bool iscom=false;
if (!DOS_OpenFile(name,OPEN_READ,&fhandle)) return false;
@ -221,15 +217,22 @@ bool DOS_Execute(char * name,ParamBlock * _block,Bit8u flags) {
DOS_CloseFile(fhandle);
return false;
}
/* Convert the header to correct endian, i hope this works */
HostPt endian=(HostPt)&head;
for (i=0;i<sizeof(EXE_Header)/2;i++) {
*((Bit16u *)endian)=readw(endian);
endian+=2;
}
if (len<sizeof(EXE_Header)) iscom=true;
if ((head.signature!=MAGIC1) && (head.signature!=MAGIC2)) iscom=true;
else {
headersize=head.headersize*16;
imagesize=(head.pages-1)*512-headersize+head.extrabytes;
imagesize=(head.pages)*512-headersize;
if (head.extrabytes) imagesize-=(512-head.extrabytes);
}
if (flags!=OVERLAY) {
/* Create an environment block */
envseg=block.exec.envseg;
envseg=block.data.exec.envseg;
if (!MakeEnv(name,&envseg)) {
DOS_CloseFile(fhandle);
return false;
@ -254,8 +257,8 @@ bool DOS_Execute(char * name,ParamBlock * _block,Bit8u flags) {
loadseg=pspseg+16;
/* Setup a psp */
SetupPSP(pspseg,memsize,envseg);
SetupCMDLine(pspseg,&block);
} else loadseg=block.overlay.loadseg,0;
SetupCMDLine(pspseg,block);
} else loadseg=block.data.overlay.loadseg;
/* Load the executable */
loadaddress=HostMake(loadseg,0);
if (iscom) { /* COM Load 64k - 256 bytes max */
@ -275,7 +278,7 @@ bool DOS_Execute(char * name,ParamBlock * _block,Bit8u flags) {
}
/* Relocate the exe image */
Bit16u relocate;
if (flags==OVERLAY) relocate=block.overlay.relocation;
if (flags==OVERLAY) relocate=block.data.overlay.relocation;
else relocate=loadseg;
pos=head.reloctable;DOS_SeekFile(fhandle,&pos,0);
for (i=0;i<head.relocations;i++) {
@ -311,8 +314,8 @@ bool DOS_Execute(char * name,ParamBlock * _block,Bit8u flags) {
/* save vectors */
newpsp.SaveVectors();
/* copy fcbs */
newpsp.SetFCB1(block.exec.fcb1);
newpsp.SetFCB2(block.exec.fcb2);
newpsp.SetFCB1(block.data.exec.fcb1);
newpsp.SetFCB2(block.data.exec.fcb2);
/* Set the stack for new program */
SegSet16(ss,RealSeg(sssp));reg_sp=RealOff(sssp);
/* Add some flags and CS:IP on the stack for the IRET */