1
0
Fork 0

Rewrote devices so they can be opened/closed/cloned. Fix Turbo pascal 7 saving bug(wd/mirek). Increase number of files to 127. Remove null device from default handles. Proper creation of the initial psp. (not hacked anymore). Quite some files= bugs should be fixed

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2025
This commit is contained in:
Peter Veenstra 2004-10-17 14:45:00 +00:00
parent 3ee0cef43d
commit 3602a06de9
9 changed files with 165 additions and 94 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_inc.h,v 1.48 2004-08-04 09:12:50 qbix79 Exp $ */
/* $Id: dos_inc.h,v 1.49 2004-10-17 14:44:59 qbix79 Exp $ */
#ifndef DOS_H_
#define DOS_H_
@ -68,13 +68,16 @@ union bootSector {
enum { MCB_FREE=0x0000,MCB_DOS=0x0008 };
enum { RETURN_EXIT=0,RETURN_CTRLC=1,RETURN_ABORT=2,RETURN_TSR=3};
#define DOS_FILES 50
#define DOS_FILES 127
#define DOS_DRIVES 26
#define DOS_DEVICES 10
/* internal Dos Tables */
extern DOS_File * Files[DOS_FILES];
extern DOS_Drive * Drives[DOS_DRIVES];
extern DOS_Device * Devices[DOS_DEVICES];
extern Bit8u dos_copybuf[0x10000];
@ -82,7 +85,7 @@ void DOS_SetError(Bit16u code);
/* File Handling Routines */
enum { STDIN=0,STDOUT=1,STDERR=2,STDAUX=3,STDNUL=4,STDPRN=5};
enum { STDIN=0,STDOUT=1,STDERR=2,STDAUX=3,STDPRN=4};
enum { HAND_NONE=0,HAND_FILE,HAND_DEVICE};
/* Routines for File Class */
@ -285,10 +288,10 @@ private:
Bit16u max_files; /* Maximum open files */
RealPt file_table; /* Pointer to File Table PSP:0x18 */
RealPt prev_psp; /* Pointer to previous PSP */
Bit8u interim_flag;
Bit8u truename_flag;
Bit16u nn_flags;
Bit16u dos_version;
Bit8u interim_flag;
Bit8u truename_flag;
Bit16u nn_flags;
Bit16u dos_version;
Bit8u fill_2[14]; /* Lot's of unused stuff i can't care aboue */
Bit8u service[3]; /* INT 0x21 Service call int 0x21;retf; */
Bit8u fill_3[9]; /* This has some blocks with FCB info */

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_system.h,v 1.24 2004-08-04 09:12:50 qbix79 Exp $ */
/* $Id: dos_system.h,v 1.25 2004-10-17 14:44:59 qbix79 Exp $ */
#ifndef DOSSYSTEM_H_
#define DOSSYSTEM_H_
@ -54,6 +54,8 @@ class DOS_DTA;
class DOS_File {
public:
DOS_File():flags(0) { name=0; refCtr = 0; };
DOS_File(const DOS_File& orig);
DOS_File & operator= (const DOS_File & orig);
virtual ~DOS_File(){if(name) delete [] name;};
virtual bool Read(Bit8u * data,Bit16u * size)=0;
virtual bool Write(Bit8u * data,Bit16u * size)=0;
@ -81,9 +83,20 @@ public:
class DOS_Device : public DOS_File {
public:
/* Some Device Specific Stuff */
char * name;
Bit8u fhandle;
DOS_Device(const DOS_Device& orig):DOS_File(orig) {devnum=orig.devnum; }
DOS_Device & operator= (const DOS_Device & orig) {
DOS_File::operator=(orig);
devnum=orig.devnum;
}
DOS_Device():DOS_File(),devnum(0){};
virtual bool Read(Bit8u * data,Bit16u * size);
virtual bool Write(Bit8u * data,Bit16u * size);
virtual bool Seek(Bit32u * pos,Bit32u type);
virtual bool Close();
virtual Bit16u GetInformation(void);
void SetDeviceNumber(Bitu num) { devnum=num;}
private:
Bitu devnum;
};
#define MAX_OPENDIRS 2048

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dev_con.h,v 1.18 2004-08-26 19:41:20 qbix79 Exp $ */
/* $Id: dev_con.h,v 1.19 2004-10-17 14:45:00 qbix79 Exp $ */
#include "dos_inc.h"
#include "../ints/int10.h"
@ -345,7 +345,7 @@ bool device_CON::Seek(Bit32u * pos,Bit32u type) {
}
bool device_CON::Close() {
return false;
return true;
}
Bit16u device_CON::GetInformation(void) {
@ -357,7 +357,7 @@ Bit16u device_CON::GetInformation(void) {
};
device_CON::device_CON() {
name="CON";
SetName("CON");
cache=0;
ansi.enabled=false;
ansi.attr=0x7;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_classes.cpp,v 1.41 2004-08-04 09:12:53 qbix79 Exp $ */
/* $Id: dos_classes.cpp,v 1.42 2004-10-17 14:45:00 qbix79 Exp $ */
#include <string.h>
#include <stdlib.h>
@ -225,7 +225,7 @@ void DOS_PSP::CopyFileTable(DOS_PSP* srcpsp,bool createchildpsp)
Bit8u handle = srcpsp->GetFileHandle(i);
if(createchildpsp)
{ //copy obeying not inherit flag.(but dont duplicate them)
bool allowCopy = (handle==0) || ((handle>0) && (FindEntryByHandle(handle)==0xff));
bool allowCopy = true;//(handle==0) || ((handle>0) && (FindEntryByHandle(handle)==0xff));
if((handle<DOS_FILES) && Files[handle] && !(Files[handle]->flags & DOS_NOT_INHERIT) && allowCopy)
{
Files[handle]->AddRef();

View file

@ -16,6 +16,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_devices.cpp,v 1.6 2004-10-17 14:45:00 qbix79 Exp $ */
#include <string.h>
#include "dosbox.h"
#include "callback.h"
@ -24,19 +26,18 @@
#include "bios.h"
#include "dos_inc.h"
#include "support.h"
#define MAX_DEVICES 10
#include "drives.h" //Wildcmp
/* Include all the devices */
#include "dev_con.h"
static DOS_Device * devices[MAX_DEVICES];
static Bit32u device_count;
DOS_Device * Devices[DOS_DEVICES];
static Bitu device_count;
class device_NUL : public DOS_Device {
public:
device_NUL() { name="NUL"; };
device_NUL() { SetName("NUL"); };
bool Read(Bit8u * data,Bit16u * size) {
for(Bitu i = 0; i < *size;i++)
data[i]=0;
@ -52,38 +53,87 @@ public:
return true;
}
bool Close() { return true; }
Bit16u GetInformation(void) { return 0x8004; }
Bit16u GetInformation(void) { return 0x8084; }
};
bool DOS_Device::Read(Bit8u * data,Bit16u * size) {
return Devices[devnum]->Read(data,size);
}
bool DOS_Device::Write(Bit8u * data,Bit16u * size) {
return Devices[devnum]->Write(data,size);
}
bool DOS_Device::Seek(Bit32u * pos,Bit32u type) {
return Devices[devnum]->Seek(pos,type);
}
bool DOS_Device::Close() {
return Devices[devnum]->Close();
}
Bit16u DOS_Device::GetInformation(void) {
return Devices[devnum]->GetInformation();
}
DOS_File::DOS_File(const DOS_File& orig) {
type=orig.type;
flags=orig.flags;
time=orig.time;
date=orig.date;
attr=orig.attr;
size=orig.size;
refCtr=orig.refCtr;
open=orig.open;
name=0;
if(orig.name) {
name=new char [strlen(orig.name)];strcpy(name,orig.name);
}
}
DOS_File & DOS_File::operator= (const DOS_File & orig) {
type=orig.type;
flags=orig.flags;
time=orig.time;
date=orig.date;
attr=orig.attr;
size=orig.size;
refCtr=orig.refCtr;
open=orig.open;
if(name) {
delete [] name; name=0;
}
if(orig.name) {
name=new char [strlen(orig.name)];strcpy(name,orig.name);
}
}
Bit8u DOS_FindDevice(char * name) {
/* should only check for the names before the dot and spacepadded */
char temp[CROSS_LEN];//TODOD
if(!(*name)) return DOS_DEVICES;
strcpy(temp,name);
char* dot= strrchr(temp,'.');
if(dot && *dot) dot=0; //no ext checking
/* loop through devices */
Bit8u index=0;
while (index<device_count) {
if (devices[index]) {
if (strcasecmp(name,devices[index]->name)==0) return index;
if (Devices[index]) {
if (WildFileCmp(temp,Devices[index]->name)) return index;
}
index++;
}
return 255;
return DOS_DEVICES;
}
void DOS_AddDevice(DOS_Device * adddev) {
//TODO Give the Device a real handler in low memory that responds to calls
if (device_count<MAX_DEVICES) {
devices[device_count]=adddev;
if (device_count<DOS_DEVICES) {
Devices[device_count]=adddev;
Devices[device_count]->SetDeviceNumber(device_count);
device_count++;
/* Add the device in the main file Table */
Bit8u handle=DOS_FILES;Bit8u i;
for (i=0;i<DOS_FILES;i++) {
if (!Files[i]) {
handle=i;
Files[i]=adddev;
break;
}
}
if (handle==DOS_FILES) E_Exit("DOS:Not enough file handles for device");
adddev->fhandle=handle;
} else {
E_Exit("DOS:Too many devices added");
}
@ -94,7 +144,7 @@ void DOS_SetupDevices(void) {
DOS_Device * newdev;
newdev=new device_CON();
DOS_AddDevice(newdev);
DOS_Device * newdev2;
DOS_Device * newdev2;
newdev2=new device_NUL();
DOS_AddDevice(newdev2);
}

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_files.cpp,v 1.57 2004-08-04 09:12:53 qbix79 Exp $ */
/* $Id: dos_files.cpp,v 1.58 2004-10-17 14:45:00 qbix79 Exp $ */
#include <string.h>
#include <stdlib.h>
@ -57,7 +57,7 @@ bool DOS_MakeName(char * name,char * fullname,Bit8u * drive) {
DOS_SetError(DOSERR_FILE_NOT_FOUND);
return false;
}
char tempdir[DOS_PATHLENGTH];
char upname[DOS_PATHLENGTH];
Bitu r,w;
@ -232,7 +232,12 @@ bool DOS_FindFirst(char * search,Bit16u attr,bool fcb_findfirst) {
*find_last=0;
strcpy(pattern,find_last+1);
strcpy(dir,fullsearch);
}
}
//check for devices. first part of filename before the dot
//can be the name of a device. like con.1
//if(findDevice(pattern) blah blah
// but leading subdirs must exist....
//
dta.SetupSearch(drive,(Bit8u)attr,pattern);
if (Drives[drive]->FindFirst(dir,dta,fcb_findfirst)) return true;
@ -315,15 +320,12 @@ bool DOS_CloseFile(Bit16u entry) {
DOS_SetError(DOSERR_INVALID_HANDLE);
return false;
};
/* Devices won't allow themselves to be closed or killed */
if (Files[handle]->Close())
{ //if close succesfull => delete file/update psp
DOS_PSP psp(dos.psp());
psp.SetFileHandle(entry,0xff);
if (Files[handle]->RemoveRef()<=0) {
delete Files[handle];
Files[handle]=0;
}
Files[handle]->Close();
DOS_PSP psp(dos.psp());
psp.SetFileHandle(entry,0xff);
if (Files[handle]->RemoveRef()<=0) {
delete Files[handle];
Files[handle]=0;
}
return true;
}
@ -331,7 +333,7 @@ bool DOS_CloseFile(Bit16u entry) {
bool DOS_CreateFile(char * name,Bit16u attributes,Bit16u * entry) {
// Creation of a device is the same as opening it
// Tc201 installer
if (DOS_FindDevice(name) != 255)
if (DOS_FindDevice(name) != DOS_DEVICES)
return DOS_OpenFile(name, 0, entry);
char fullname[DOS_PATHLENGTH];Bit8u drive;
@ -370,7 +372,7 @@ bool DOS_OpenFile(char * name,Bit8u flags,Bit16u * entry) {
if (flags>2) LOG(LOG_FILES,LOG_ERROR)("Special file open command %X file %s",flags,name);
else LOG(LOG_FILES,LOG_NORMAL)("file open command %X file %s",flags,name);
Bit16u attr;
Bit16u attr = 0;
if(DOS_GetFileAttr(name,&attr)){ //DON'T ALLOW directories to be openened
if((attr & DOS_ATTR_DIRECTORY) || (attr & DOS_ATTR_VOLUME)){
DOS_SetError(DOSERR_ACCESS_DENIED);
@ -379,40 +381,39 @@ bool DOS_OpenFile(char * name,Bit8u flags,Bit16u * entry) {
}
DOS_PSP psp(dos.psp());
Bit8u handle=DOS_FindDevice((char *)name);
bool device=false;char fullname[DOS_PATHLENGTH];Bit8u drive;Bit8u i;
if (handle!=255) {
device=true;
} else {
Bit8u devnum=DOS_DEVICES;
devnum=DOS_FindDevice((char *)name);
bool device=(devnum!=DOS_DEVICES);
char fullname[DOS_PATHLENGTH];Bit8u drive;Bit8u i;
/* First check if the name is correct */
if (!DOS_MakeName(name,fullname,&drive)) return false;
/* Check for a free file handle */
for (i=0;i<DOS_FILES;i++) {
if (!Files[i]) {
handle=i;
break;
}
}
if (handle==255) {
DOS_SetError(DOSERR_TOO_MANY_OPEN_FILES);
return false;
if (!DOS_MakeName(name,fullname,&drive)) return false;
Bit8u handle=255;
/* Check for a free file handle */
for (i=0;i<DOS_FILES;i++) {
if (!Files[i]) {
handle=i;
break;
}
}
if (handle==255) {
DOS_SetError(DOSERR_TOO_MANY_OPEN_FILES);
return false;
}
/* We have a position in the main table now find one in the psp table */
*entry = psp.FindFreeFileEntry();
if (*entry==0xff) {
DOS_SetError(DOSERR_TOO_MANY_OPEN_FILES);
return false;
}
bool exists=false;
if (!device) exists=Drives[drive]->FileOpen(&Files[handle],fullname,flags);
if (device) {
Files[handle]=new DOS_Device(*Devices[devnum]);
} else {
exists=Drives[drive]->FileOpen(&Files[handle],fullname,flags);
}
if (exists || device ) {
// devices can only be opened once
if (device && (psp.FindEntryByHandle(handle)!=0xff)) {
*entry=psp.FindEntryByHandle(handle);
return true;
}
Files[handle]->AddRef();
psp.SetFileHandle(*entry,handle);
return true;
@ -451,7 +452,12 @@ bool DOS_OpenFileExtended(char *name, Bit16u flags, Bit16u createAttr, Bit16u ac
bool DOS_UnlinkFile(char * name) {
char fullname[DOS_PATHLENGTH];Bit8u drive;
if (!DOS_MakeName(name,fullname,&drive)) return false;
return Drives[drive]->FileUnlink(fullname);
if(Drives[drive]->FileUnlink(fullname)){
return true;
} else {
DOS_SetError(DOSERR_FILE_NOT_FOUND);
return false;
}
}
bool DOS_GetFileAttr(char * name,Bit16u * attr) {
@ -503,13 +509,12 @@ bool DOS_GetFreeDiskSpace(Bit8u drive,Bit16u * bytes,Bit8u * sectors,Bit16u * cl
}
bool DOS_DuplicateEntry(Bit16u entry,Bit16u * newentry) {
// Dont duplicate console handles
if (entry<=STDPRN) {
/* if (entry<=STDPRN) {
*newentry = entry;
return true;
};
*/
Bit8u handle=RealHandle(entry);
if (handle>=DOS_FILES) {
DOS_SetError(DOSERR_INVALID_HANDLE);
@ -531,13 +536,12 @@ bool DOS_DuplicateEntry(Bit16u entry,Bit16u * newentry) {
};
bool DOS_ForceDuplicateEntry(Bit16u entry,Bit16u newentry) {
// Dont duplicate console handles
if (entry<=STDPRN) {
/* if (entry<=STDPRN) {
newentry = entry;
return true;
};
*/
Bit8u orig=RealHandle(entry);
if (orig>=DOS_FILES) {
DOS_SetError(DOSERR_INVALID_HANDLE);

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_mscdex.cpp,v 1.25 2004-10-05 19:45:27 qbix79 Exp $ */
/* $Id: dos_mscdex.cpp,v 1.26 2004-10-17 14:45:00 qbix79 Exp $ */
#include <string.h>
#include <ctype.h>
@ -1005,7 +1005,7 @@ static bool MSCDEX_Handler(void)
class device_MSCDEX : public DOS_Device {
public:
device_MSCDEX() { name="MSCD001"; }
device_MSCDEX() { SetName("MSCD001"); }
bool Read (Bit8u * data,Bit16u * size) { return false;}
bool Write(Bit8u * data,Bit16u * size) {
LOG(LOG_ALL,LOG_NORMAL)("Write to mscdex device");

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: ems.cpp,v 1.34 2004-08-04 09:12:56 qbix79 Exp $ */
/* $Id: ems.cpp,v 1.35 2004-10-17 14:45:00 qbix79 Exp $ */
#include <string.h>
#include <stdlib.h>
@ -65,7 +65,7 @@
class device_EMM : public DOS_Device {
public:
device_EMM(){name="EMMXXXX0";}
device_EMM(){SetName("EMMXXXX0");}
bool Read(Bit8u * data,Bit16u * size) { return false;}
bool Write(Bit8u * data,Bit16u * size){
LOG(LOG_IOCTL,LOG_NORMAL)("EMS:Write to device");

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: shell.cpp,v 1.49 2004-09-28 15:31:21 qbix79 Exp $ */
/* $Id: shell.cpp,v 1.50 2004-10-17 14:45:00 qbix79 Exp $ */
#include <stdlib.h>
#include <stdarg.h>
@ -373,12 +373,13 @@ void SHELL_Init() {
DOS_PSP psp(psp_seg);
psp.MakeNew(0);
psp.SetFileHandle(STDIN ,DOS_FindDevice("CON"));
psp.SetFileHandle(STDOUT,DOS_FindDevice("CON"));
psp.SetFileHandle(STDERR,DOS_FindDevice("CON"));
psp.SetFileHandle(STDAUX,DOS_FindDevice("CON"));
psp.SetFileHandle(STDNUL,DOS_FindDevice("CON"));
psp.SetFileHandle(STDPRN,DOS_FindDevice("CON"));
dos.psp(psp_seg);
Bit16u dummy=0;
DOS_OpenFile("CON",2,&dummy);/* STDIN */
DOS_OpenFile("CON",2,&dummy);/* STDOUT */
DOS_OpenFile("CON",2,&dummy);/* STDERR */
DOS_OpenFile("CON",2,&dummy);/* STDAUX */
DOS_OpenFile("CON",2,&dummy);/* STDPRN */
psp.SetParent(psp_seg);
/* Set the environment */
psp.SetEnvironment(env_seg);