diff --git a/include/dos_inc.h b/include/dos_inc.h index 9f38dbe3..e4a93da9 100644 --- a/include/dos_inc.h +++ b/include/dos_inc.h @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_inc.h,v 1.70 2007-07-20 18:53:52 qbix79 Exp $ */ +/* $Id: dos_inc.h,v 1.71 2007-11-07 22:08:03 c2woody Exp $ */ #ifndef DOSBOX_DOS_INC_H #define DOSBOX_DOS_INC_H @@ -78,12 +78,12 @@ enum { RETURN_EXIT=0,RETURN_CTRLC=1,RETURN_ABORT=2,RETURN_TSR=3}; #define DOS_INFOBLOCK_SEG 0x80 -#define DOS_CDS_SEG 0x90 -#define DOS_CONSTRING_SEG 0xa0 -#define DOS_CONDRV_SEG 0xa4 -#define DOS_SDA_SEG 0xb2 +#define DOS_CDS_SEG 0xa8 +#define DOS_CONSTRING_SEG 0xb8 +#define DOS_CONDRV_SEG 0xbc +#define DOS_SDA_SEG 0xca #define DOS_SDA_OFS 0 -#define DOS_MEM_START 0x102 //First Segment that DOS can use +#define DOS_MEM_START 0x11a //First Segment that DOS can use #define DOS_PRIVATE_SEGMENT 0xc800 #define DOS_PRIVATE_SEGMENT_END 0xd000 diff --git a/src/dos/dos_classes.cpp b/src/dos/dos_classes.cpp index 5ac6d4e7..fa648bc2 100644 --- a/src/dos/dos_classes.cpp +++ b/src/dos/dos_classes.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_classes.cpp,v 1.52 2007-06-13 07:25:14 qbix79 Exp $ */ +/* $Id: dos_classes.cpp,v 1.53 2007-11-07 22:08:03 c2woody Exp $ */ #include #include @@ -117,10 +117,10 @@ void DOS_InfoBlock::SetLocation(Bit16u segment) { /* Create a fake SFT, so programs think there are 100 file handles */ Bit16u sftOffset=offsetof(sDIB,firstFileTable)+0xa2; sSave(sDIB,firstFileTable,RealMake(segment,sftOffset)); - real_writed(segment,sftOffset+0x00,RealMake(segment+0x11,0)); //Next File Table + real_writed(segment,sftOffset+0x00,RealMake(segment+0x26,0)); //Next File Table real_writew(segment,sftOffset+0x04,100); //File Table supports 100 files - real_writed(segment+0x11,0x00,0xffffffff); //Last File Table - real_writew(segment+0x11,0x04,100); //File Table supports 100 files + real_writed(segment+0x26,0x00,0xffffffff); //Last File Table + real_writew(segment+0x26,0x04,100); //File Table supports 100 files } void DOS_InfoBlock::SetFirstMCB(Bit16u _firstmcb) { diff --git a/src/dos/dos_misc.cpp b/src/dos/dos_misc.cpp index 36c48122..ddf68a22 100644 --- a/src/dos/dos_misc.cpp +++ b/src/dos/dos_misc.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_misc.cpp,v 1.17 2007-01-08 19:45:39 qbix79 Exp $ */ +/* $Id: dos_misc.cpp,v 1.18 2007-11-07 22:08:03 c2woody Exp $ */ #include "dosbox.h" #include "callback.h" @@ -61,10 +61,89 @@ static Bitu INT2A_Handler(void) { static bool DOS_MultiplexFunctions(void) { switch (reg_ax) { case 0x1216: /* GET ADDRESS OF SYSTEM FILE TABLE ENTRY */ - /* Should do a lot more. Let's see if we can get away with it */ + // reg_bx is a system file table entry, should coincide with + // the file handle so just use that LOG(LOG_DOSMISC,LOG_ERROR)("Some BAD filetable call used bx=%X",reg_bx); if(reg_bx <= DOS_FILES) CALLBACK_SCF(false); else CALLBACK_SCF(true); + if (reg_bx<16) { + RealPt sftrealpt=mem_readd(Real2Phys(dos_infoblock.GetPointer())+4); + PhysPt sftptr=Real2Phys(sftrealpt); + Bitu sftofs=0x06+reg_bx*0x3b; + + if (Files[reg_bx]) mem_writeb(sftptr+sftofs,Files[reg_bx]->refCtr); + else mem_writeb(sftptr+sftofs,0); + + if (!Files[reg_bx]) return true; + + Bit32u handle=RealHandle(reg_bx); + if (handle>=DOS_FILES) { + mem_writew(sftptr+sftofs+0x02,0x02); // file open mode + mem_writeb(sftptr+sftofs+0x04,0x00); // file attribute + mem_writew(sftptr+sftofs+0x05,Files[reg_bx]->GetInformation()); // device info word + mem_writed(sftptr+sftofs+0x07,0); // device driver header + mem_writew(sftptr+sftofs+0x0d,0); // packed time + mem_writew(sftptr+sftofs+0x0f,0); // packed date + mem_writew(sftptr+sftofs+0x11,0); // size + mem_writew(sftptr+sftofs+0x15,0); // current position + } else { + Bit8u drive=Files[reg_bx]->GetDrive(); + + mem_writew(sftptr+sftofs+0x02,Files[reg_bx]->flags&3); // file open mode + mem_writeb(sftptr+sftofs+0x04,(Bit8u)(Files[reg_bx]->attr)); // file attribute + mem_writew(sftptr+sftofs+0x05,0x40|drive); // device info word + mem_writed(sftptr+sftofs+0x07,RealMake(dos.tables.dpb,drive)); // dpb of the drive + mem_writew(sftptr+sftofs+0x0d,Files[reg_bx]->time); // packed file time + mem_writew(sftptr+sftofs+0x0f,Files[reg_bx]->date); // packed file date + Bit32u curpos=0; + Files[reg_bx]->Seek(&curpos,DOS_SEEK_CUR); + Bit32u endpos=0; + Files[reg_bx]->Seek(&endpos,DOS_SEEK_END); + mem_writed(sftptr+sftofs+0x11,endpos); // size + mem_writed(sftptr+sftofs+0x15,curpos); // current position + Files[reg_bx]->Seek(&curpos,DOS_SEEK_SET); + } + + // fill in filename in fcb style + // (space-padded name (8 chars)+space-padded extension (3 chars)) + const char* filename=(const char*)Files[reg_bx]->GetName(); + if (strrchr(filename,'\\')) filename=strrchr(filename,'\\')+1; + if (strrchr(filename,'/')) filename=strrchr(filename,'/')+1; + if (!filename) return true; + const char* dotpos=strrchr(filename,'.'); + if (dotpos) { + dotpos++; + size_t nlen=strlen(filename); + size_t extlen=strlen(dotpos); + Bits nmelen=(Bits)nlen-(Bits)extlen; + nmelen--; + if (nmelen<0) return true; + nlen-=(extlen+1); + + if (nlen>8) nlen=8; + for (Bitu i=0; i3) extlen=3; + for (Bitu i=0; i8) nlen=8; + for (Bitu i=0; i