add sft-returning dos function (fixes file/integrity checking library of MadTV2 and Dunkle Schatten 2)
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3046
This commit is contained in:
parent
5cdc1cd683
commit
6d7dd9f3ae
3 changed files with 91 additions and 12 deletions
|
@ -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
|
||||
|
|
|
@ -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 <string.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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; i<nlen; i++)
|
||||
mem_writeb(sftptr+sftofs+0x20+i,filename[i]);
|
||||
for (Bitu i=nlen; i<8; i++)
|
||||
mem_writeb(sftptr+sftofs+0x20+i,' ');
|
||||
if (extlen>3) extlen=3;
|
||||
for (Bitu i=0; i<extlen; i++)
|
||||
mem_writeb(sftptr+sftofs+0x28+i,dotpos[i]);
|
||||
for (Bitu i=extlen; i<3; i++)
|
||||
mem_writeb(sftptr+sftofs+0x28+i,' ');
|
||||
} else {
|
||||
size_t nlen=strlen(filename);
|
||||
if (nlen>8) nlen=8;
|
||||
for (Bitu i=0; i<nlen; i++)
|
||||
mem_writeb(sftptr+sftofs+0x20+i,filename[i]);
|
||||
for (Bitu i=nlen; i<11; i++)
|
||||
mem_writeb(sftptr+sftofs+0x20+i,' ');
|
||||
}
|
||||
|
||||
SegSet16(es,RealSeg(sftrealpt));
|
||||
reg_di=RealOff(sftrealpt+sftofs);
|
||||
reg_ax=0xc000;
|
||||
|
||||
}
|
||||
return true;
|
||||
case 0x1607:
|
||||
if (reg_bx == 0x15) {
|
||||
|
|
Loading…
Add table
Reference in a new issue