New segment and new force duplicate file handle function.
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@163
This commit is contained in:
parent
59b55b0576
commit
31cb583329
1 changed files with 51 additions and 44 deletions
|
@ -105,7 +105,7 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x09: /* Write string to STDOUT */
|
||||
{
|
||||
Bit8u c;Bit16u n=1;
|
||||
PhysPt buf=real_phys(Segs[ds].value,reg_dx);
|
||||
PhysPt buf=SegPhys(ds)+reg_dx;
|
||||
while ((c=mem_readb(buf++))!='$') {
|
||||
DOS_WriteFile(STDOUT,&c,&n);
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x0a: /* Buffered Input */
|
||||
{
|
||||
//TODO ADD Break checkin in STDIN but can't care that much for it
|
||||
PhysPt data=real_phys(Segs[ds].value,reg_dx);
|
||||
PhysPt data=SegPhys(ds)+reg_dx;
|
||||
Bit8u free=mem_readb(data);
|
||||
Bit8u read=0;Bit8u c;Bit16u n=1;
|
||||
if (!free) break;
|
||||
|
@ -164,7 +164,7 @@ static Bitu DOS_21Handler(void) {
|
|||
reg_al=26;
|
||||
break;
|
||||
case 0x0f: /* Open File using FCB */
|
||||
if(DOS_FCBOpen(Segs[ds].value,reg_dx)){
|
||||
if(DOS_FCBOpen(SegValue(ds),reg_dx)){
|
||||
reg_al=0;
|
||||
}else{
|
||||
reg_al=0xff;
|
||||
|
@ -173,7 +173,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
|
||||
case 0x10: /* Close File using FCB */
|
||||
if(DOS_FCBClose(Segs[ds].value,reg_dx)){
|
||||
if(DOS_FCBClose(SegValue(ds),reg_dx)){
|
||||
reg_al=0;
|
||||
}else{
|
||||
reg_al=0xff;
|
||||
|
@ -182,7 +182,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
|
||||
case 0x11: /* Find First Matching File using FCB */
|
||||
if(DOS_FCBFindFirst(Segs[ds].value,reg_dx)){
|
||||
if(DOS_FCBFindFirst(SegValue(ds),reg_dx)){
|
||||
reg_al=0;
|
||||
}else{
|
||||
reg_al=0xff;
|
||||
|
@ -191,7 +191,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
|
||||
case 0x12: /* Find Next Matching File using FCB */
|
||||
if(DOS_FCBFindNext(Segs[ds].value,reg_dx)){
|
||||
if(DOS_FCBFindNext(SegValue(ds),reg_dx)){
|
||||
reg_al=0;
|
||||
}else{
|
||||
reg_al=0xff;
|
||||
|
@ -218,8 +218,8 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x29: /* Parse filename into FCB */
|
||||
{ Bit8u difference;
|
||||
char string[1024];
|
||||
MEM_StrCopy(Real2Phys(RealMake(Segs[ds].value,reg_si)) ,string,1024);
|
||||
reg_al=FCB_Parsename(Segs[es].value,reg_di,reg_al ,string, &difference);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_si,string,1024);
|
||||
reg_al=FCB_Parsename(SegValue(es),reg_di,reg_al ,string, &difference);
|
||||
reg_di+=difference;
|
||||
}
|
||||
LOG_DEBUG("DOS:29:FCB Parse Filename, result:al=%d",reg_al);
|
||||
|
@ -237,12 +237,12 @@ static Bitu DOS_21Handler(void) {
|
|||
reg_al=DOS_GetDefaultDrive();
|
||||
break;
|
||||
case 0x1a: /* Set Disk Transfer Area Address */
|
||||
dos.dta=RealMake(Segs[ds].value,reg_dx);
|
||||
dos.dta=RealMakeSeg(ds,reg_dx);
|
||||
break;
|
||||
|
||||
case 0x1c: /* Get allocation info for specific drive */
|
||||
LOG_DEBUG("DOS: Allocation Info call not supported correctly");
|
||||
SetSegment_16(ds,0xf000);
|
||||
SegSet16(ds,0xf000);
|
||||
reg_bx=0;
|
||||
real_writeb(0xf000,0,0);
|
||||
reg_al=0x7f;
|
||||
|
@ -251,7 +251,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break; /* TODO maybe but hardly think a game needs this */
|
||||
case 0x1b: /* Get allocation info for default drive */
|
||||
LOG_DEBUG("DOS: Allocation Info call not supported correctly");
|
||||
SetSegment_16(ds,0xf000);
|
||||
SegSet16(ds,0xf000);
|
||||
reg_bx=0;
|
||||
real_writeb(0xf000,0,0);
|
||||
reg_al=0x7f;
|
||||
|
@ -263,7 +263,7 @@ static Bitu DOS_21Handler(void) {
|
|||
E_Exit("DOS:Unhandled call %02X",reg_ah);
|
||||
break; /* TODO maybe but hardly think a game needs this */
|
||||
case 0x25: /* Set Interrupt Vector */
|
||||
RealSetVec(reg_al,RealMake(Segs[ds].value,reg_dx));
|
||||
RealSetVec(reg_al,RealMakeSeg(ds,reg_dx));
|
||||
break;
|
||||
case 0x26: /* Create new PSP */
|
||||
DOS_NewPSP(reg_dx);
|
||||
|
@ -303,7 +303,7 @@ static Bitu DOS_21Handler(void) {
|
|||
dos.verify=(reg_al==1);
|
||||
break;
|
||||
case 0x2f: /* Get Disk Transfer Area */
|
||||
SetSegment_16(es,RealSeg(dos.dta));
|
||||
SegSet16(es,RealSeg(dos.dta));
|
||||
reg_bx=RealOff(dos.dta);
|
||||
break;
|
||||
case 0x30: /* Get DOS Version */
|
||||
|
@ -341,12 +341,12 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x34: /* Get INDos Flag */
|
||||
SetSegment_16(es,RealSeg(dos.tables.indosflag));
|
||||
SegSet16(es,RealSeg(dos.tables.indosflag));
|
||||
reg_bx=RealOff(dos.tables.indosflag);
|
||||
break;
|
||||
case 0x35: /* Get interrupt vector */
|
||||
reg_bx=real_readw(0,((Bit16u)reg_al)*4);
|
||||
SetSegment_16(es,real_readw(0,((Bit16u)reg_al)*4+2));
|
||||
SegSet16(es,real_readw(0,((Bit16u)reg_al)*4+2));
|
||||
break;
|
||||
case 0x36: /* Get Free Disk Space */
|
||||
{
|
||||
|
@ -387,7 +387,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x39: /* MKDIR Create directory */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_MakeDir(name1)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -396,7 +396,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x3a: /* RMDIR Remove directory */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_RemoveDir(name1)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -405,7 +405,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x3b: /* CHDIR Set current directory */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_ChangeDir(name1)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -414,7 +414,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x3c: /* CREATE Create of truncate file */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_CreateFile(name1,reg_cx,®_ax)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -423,7 +423,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x3d: /* OPEN Open existing file */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_OpenFile(name1,reg_al,®_ax)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -443,7 +443,7 @@ static Bitu DOS_21Handler(void) {
|
|||
{
|
||||
Bit16u toread=reg_cx;
|
||||
if (DOS_ReadFile(reg_bx,dos_copybuf,&toread)) {
|
||||
MEM_BlockWrite(real_phys(Segs[ds].value,reg_dx),dos_copybuf,toread);
|
||||
MEM_BlockWrite(SegPhys(ds)+reg_dx,dos_copybuf,toread);
|
||||
reg_ax=toread;
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -455,7 +455,7 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x40: /* WRITE Write to file or device */
|
||||
{
|
||||
Bit16u towrite=reg_cx;
|
||||
MEM_BlockRead(real_phys(Segs[ds].value,reg_dx),dos_copybuf,towrite);
|
||||
MEM_BlockRead(SegPhys(ds)+reg_dx,dos_copybuf,towrite);
|
||||
if (DOS_WriteFile(reg_bx,dos_copybuf,&towrite)) {
|
||||
reg_ax=towrite;
|
||||
CALLBACK_SCF(false);
|
||||
|
@ -466,7 +466,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
};
|
||||
case 0x41: /* UNLINK Delete file */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_UnlinkFile(name1)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -489,7 +489,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
case 0x43: /* Get/Set file attributes */
|
||||
//TODO FIX THIS HACK
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
switch (reg_al)
|
||||
case 0x00: /* Get */
|
||||
{
|
||||
|
@ -525,11 +525,18 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
break;
|
||||
case 0x46: /* DUP2,FORCEDUP Force duplicate file handle */
|
||||
E_Exit("Unhandled Dos 21 call %02X",reg_ah);
|
||||
if (DOS_ForceDuplicateEntry(reg_bx,reg_ax)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
CALLBACK_SCF(true);
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case 0x47: /* CWD Get current directory */
|
||||
//TODO Memory
|
||||
if (DOS_GetCurrentDir(reg_dl,real_off(Segs[ds].value,reg_si))) {
|
||||
if (DOS_GetCurrentDir(reg_dl,name1)) {
|
||||
MEM_BlockWrite(SegPhys(ds)+reg_si,name1,strlen(name1)+1);
|
||||
reg_ax=0x0100;
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -551,7 +558,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
}
|
||||
case 0x49: /* Free memory */
|
||||
if (DOS_FreeMemory(Segs[es].value)) {
|
||||
if (DOS_FreeMemory(SegValue(es))) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
|
@ -561,7 +568,7 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x4a: /* Resize memory block */
|
||||
{
|
||||
Bit16u size=reg_bx;
|
||||
if (DOS_ResizeMemory(Segs[es].value,&size)) {
|
||||
if (DOS_ResizeMemory(SegValue(es),&size)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
|
@ -572,8 +579,8 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
case 0x4b: /* EXEC Load and/or execute program */
|
||||
{
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
if (DOS_Execute(name1,(ParamBlock *)real_off(Segs[es].value,reg_bx),reg_al)) {
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_Execute(name1,(ParamBlock *)Phys2Host(SegPhys(es)+reg_bx),reg_al)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
|
@ -599,7 +606,7 @@ static Bitu DOS_21Handler(void) {
|
|||
reg_ah=dos.return_mode;
|
||||
break;
|
||||
case 0x4e: /* FINDFIRST Find first matching file */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_FindFirst(name1,reg_cx)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -622,7 +629,7 @@ static Bitu DOS_21Handler(void) {
|
|||
reg_bx=dos.psp;
|
||||
break;
|
||||
case 0x52: /* Get list of lists */
|
||||
SetSegment_16(es,0);
|
||||
SegSet16(es,0);
|
||||
reg_bx=0;
|
||||
LOG_ERROR("Call is made for list of lists not supported let's hope for the best");
|
||||
break;
|
||||
|
@ -635,8 +642,8 @@ static Bitu DOS_21Handler(void) {
|
|||
E_Exit("Unhandled Dos 21 call %02X",reg_ah);
|
||||
break;
|
||||
case 0x56: /* RENAME Rename file */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(real_phys(Segs[es].value,reg_di),name2,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(es)+reg_di,name2,DOSNAMEBUF);
|
||||
if (DOS_Rename(name1,name2)) {
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
|
@ -658,7 +665,7 @@ static Bitu DOS_21Handler(void) {
|
|||
case 0x5a: /* Create temporary file */
|
||||
{
|
||||
Bit16u handle;
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_CreateTempFile(name1,&handle)) {
|
||||
reg_ax=handle;
|
||||
CALLBACK_SCF(false);
|
||||
|
@ -670,7 +677,7 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
case 0x5b: /* Create new file */
|
||||
{
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
Bit16u handle;
|
||||
if (DOS_OpenFile(name1,0,&handle)) {
|
||||
DOS_CloseFile(handle);
|
||||
|
@ -695,8 +702,9 @@ static Bitu DOS_21Handler(void) {
|
|||
E_Exit("DOS:Unhandled call %02X",reg_ah);
|
||||
break;
|
||||
case 0x60: /* Canonicalize filename or path */
|
||||
MEM_StrCopy(real_phys(Segs[ds].value,reg_dx),name1,DOSNAMEBUF);
|
||||
if (DOS_Canonicalize(name1,real_off(Segs[es].value,reg_di))) {
|
||||
MEM_StrCopy(SegPhys(ds)+reg_dx,name1,DOSNAMEBUF);
|
||||
if (DOS_Canonicalize(name1,name2)) {
|
||||
MEM_BlockWrite(SegPhys(es)+reg_di,name2,strlen(name2)+1);
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
|
@ -717,13 +725,13 @@ static Bitu DOS_21Handler(void) {
|
|||
/* Todo maybe fully support this for now we set it standard for USA */
|
||||
{
|
||||
LOG_DEBUG("DOS:65:Extended country information call");
|
||||
Bit8u * data=real_off(Segs[es].value,reg_di);
|
||||
PhysPt data=SegPhys(es)+reg_di;
|
||||
switch (reg_al) {
|
||||
case 1:
|
||||
real_writeb(Segs[es].value,reg_di,reg_al);
|
||||
real_writew(Segs[es].value,reg_di+1,4);
|
||||
real_writew(Segs[es].value,reg_di+3,1);
|
||||
real_writew(Segs[es].value,reg_di+5,37);
|
||||
mem_writeb(data,reg_al);
|
||||
mem_writew(data+1,4);
|
||||
mem_writew(data+3,1);
|
||||
mem_writew(data+5,37);
|
||||
reg_cx=4;
|
||||
CALLBACK_SCF(false);
|
||||
break;
|
||||
|
@ -751,7 +759,6 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
case 0x69: /* Get/Set disk serial number */
|
||||
{
|
||||
Bit8u * temp=real_off(Segs[ds].value,reg_dx);
|
||||
switch(reg_al) {
|
||||
case 0x00: /* Get */
|
||||
LOG_DEBUG("DOS:Get Disk serial number");
|
||||
|
|
Loading…
Add table
Reference in a new issue