From 31cb583329706153f067dcfd5e62fe4ddd861a3c Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Mon, 19 Aug 2002 12:40:32 +0000 Subject: [PATCH] New segment and new force duplicate file handle function. Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@163 --- src/dos/dos.cpp | 95 ++++++++++++++++++++++++++----------------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index 9827c072..33439ad1 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -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");