diff --git a/src/dos/dos_execute.cpp b/src/dos/dos_execute.cpp index e5bbe898..e5149fb3 100644 --- a/src/dos/dos_execute.cpp +++ b/src/dos/dos_execute.cpp @@ -95,11 +95,12 @@ bool DOS_Terminate(bool tsr) { dos.return_mode=RETURN_EXIT; Bit16u mempsp = dos.psp; + DOS_PSP curpsp(dos.psp); if (dos.psp==curpsp.GetParent()) return true; - /* Free Files owned by process */ - if (!tsr) curpsp.CloseFiles(); + if (!tsr) curpsp.CloseFiles(); + /* Get the termination address */ RealPt old22 = curpsp.GetInt22(); /* Restore vector 22,23,24 */ @@ -173,10 +174,18 @@ bool DOS_NewPSP(Bit16u segment, Bit16u size) DOS_PSP psp(segment); psp.MakeNew(size); DOS_PSP psp_parent(psp.GetParent()); - psp.CopyFileTable(&psp_parent); + psp.CopyFileTable(&psp_parent,false); return true; }; +bool DOS_ChildPSP(Bit16u segment, Bit16u size) +{ + DOS_PSP psp(segment); + psp.MakeNew(size); + DOS_PSP psp_parent(psp.GetParent()); + psp.CopyFileTable(&psp_parent,true); + return true; +}; static void SetupPSP(Bit16u pspseg,Bit16u memsize,Bit16u envseg) { /* Fix the PSP for psp and environment MCB's */ @@ -188,11 +197,11 @@ static void SetupPSP(Bit16u pspseg,Bit16u memsize,Bit16u envseg) { DOS_PSP psp(pspseg); psp.MakeNew(memsize); psp.SetEnvironment(envseg); - /* Copy file handles */ - if (DOS_PSP::rootpsp!=dos.psp) { + /* Copy file handles //QBIX::ALWAYS COPY BUT LEFT ORIGINAL INCASE OF MISTAKES +/* if (DOS_PSP::rootpsp!=dos.psp) { */ // TODO: Improve this // If prog wasnt started from commandline copy file table (California Games 2) - DOS_PSP oldpsp(dos.psp); +/* DOS_PSP oldpsp(dos.psp); psp.CopyFileTable(&oldpsp); } else { psp.SetFileHandle(STDIN ,DOS_FindDevice("CON")); @@ -201,8 +210,11 @@ static void SetupPSP(Bit16u pspseg,Bit16u memsize,Bit16u envseg) { psp.SetFileHandle(STDAUX,DOS_FindDevice("CON")); psp.SetFileHandle(STDNUL,DOS_FindDevice("CON")); psp.SetFileHandle(STDPRN,DOS_FindDevice("CON")); - } + } */ /* Save old DTA in psp */ + DOS_PSP oldpsp(dos.psp); + psp.CopyFileTable(&oldpsp,true); + psp.SetDTA(dos.dta); /* Setup the DTA */ dos.dta=RealMake(pspseg,0x80); diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index 956e4a64..f0d7f086 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -287,13 +287,11 @@ bool DOS_CloseFile(Bit16u entry) { DOS_SetError(DOSERR_INVALID_HANDLE); return false; }; -//TODO Figure this out with devices :) - - DOS_PSP psp(dos.psp); - if (entry>STDPRN) psp.SetFileHandle(entry,0xff); - /* Devices won't allow themselves to be closed or killed */ - if (Files[handle]->Close()) { + if (Files[handle]->Close()) + { //if close succesfull => delete file/update psp + DOS_PSP psp(dos.psp); + psp.SetFileHandle(entry,0xff); delete Files[handle]; Files[handle]=0; } @@ -335,7 +333,7 @@ bool DOS_OpenFile(char * name,Bit8u flags,Bit16u * entry) { /* First check for devices */ if (flags>2) LOG(LOG_FILES|LOG_ERROR,"Special file open command %X file %s",flags,name); else LOG(LOG_FILES,"file open command %X file %s",flags,name); - flags&=3; + DOS_PSP psp(dos.psp); Bit8u handle=DOS_FindDevice((char *)name); bool device=false;char fullname[DOS_PATHLENGTH];Bit8u drive;Bit8u i; diff --git a/src/dos/drive_local.cpp b/src/dos/drive_local.cpp index a20c3168..907d6ecf 100644 --- a/src/dos/drive_local.cpp +++ b/src/dos/drive_local.cpp @@ -55,12 +55,13 @@ bool localDrive::FileCreate(DOS_File * * file,char * name,Bit16u attributes) { dirCache.AddEntry(newname, true); /* Make the 16 bit device information */ *file=new localFile(name,hand,0x202); + return true; }; bool localDrive::FileOpen(DOS_File * * file,char * name,Bit32u flags) { char * type; - switch (flags) { + switch (flags &3) { case OPEN_READ:type="rb"; break; case OPEN_WRITE:type="rb+"; break; case OPEN_READWRITE:type="rb+"; break; @@ -80,6 +81,7 @@ bool localDrive::FileOpen(DOS_File * * file,char * name,Bit32u flags) { // Bit32u err=errno; if (!hand) return false; *file=new localFile(name,hand,0x202); + (*file)->flags=flags; //for the inheritance flag and maybe check for others. // (*file)->SetFileName(newname); return true; }; diff --git a/src/dos/drive_virtual.cpp b/src/dos/drive_virtual.cpp index 5243d477..dd080048 100644 --- a/src/dos/drive_virtual.cpp +++ b/src/dos/drive_virtual.cpp @@ -132,6 +132,7 @@ bool Virtual_Drive::FileOpen(DOS_File * * file,char * name,Bit32u flags) { if (strcasecmp(name,cur_file->name)==0) { /* We have a match */ *file=new Virtual_File(cur_file->data,cur_file->size); + (*file)->flags=flags; return true; } cur_file=cur_file->next;