ChangeLog: * dlls/winedos/int21.c * msdos/int21.c - Move some more simple functions of int21 to winedos. - Some cleanups. nog.
--- msdos/int21.c.a6 2002-11-09 11:33:53.000000000 +0200 +++ msdos/int21.c 2002-11-09 11:38:39.000000000 +0200 @@ -629,56 +629,6 @@ return 1; } - -static void DeleteFileFCB( CONTEXT86 *context ) -{ - FIXME("(%p): stub\n", context); -} - -static void RenameFileFCB( CONTEXT86 *context ) -{ - FIXME("(%p): stub\n", context); -} - - - -static void fLock( CONTEXT86 * context ) -{ - - switch ( AX_reg(context) & 0xff ) - { - case 0x00: /* LOCK */ - TRACE("lock handle %d offset %ld length %ld\n", - BX_reg(context), - MAKELONG(DX_reg(context),CX_reg(context)), - MAKELONG(DI_reg(context),SI_reg(context))) ; - if (!LockFile(DosFileHandleToWin32Handle(BX_reg(context)), - MAKELONG(DX_reg(context),CX_reg(context)), 0, - MAKELONG(DI_reg(context),SI_reg(context)), 0)) { - SET_AX( context, GetLastError() ); - SET_CFLAG(context); - } - break; - - case 0x01: /* UNLOCK */ - TRACE("unlock handle %d offset %ld length %ld\n", - BX_reg(context), - MAKELONG(DX_reg(context),CX_reg(context)), - MAKELONG(DI_reg(context),SI_reg(context))) ; - if (!UnlockFile(DosFileHandleToWin32Handle(BX_reg(context)), - MAKELONG(DX_reg(context),CX_reg(context)), 0, - MAKELONG(DI_reg(context),SI_reg(context)), 0)) { - SET_AX( context, GetLastError() ); - SET_CFLAG(context); - } - return; - default: - SET_AX( context, 0x0001 ); - SET_CFLAG(context); - return; - } -} - static BOOL INT21_networkfunc (CONTEXT86 *context) { @@ -776,21 +726,6 @@ ExitThread( 0 ); break; - case 0x09: /* WRITE STRING TO STANDARD OUTPUT */ - TRACE("WRITE '$'-terminated string from %04lX:%04X to stdout\n", - context->SegDs,DX_reg(context) ); - { - LPSTR data = CTX_SEG_OFF_TO_LIN(context,context->SegDs,context->Edx); - LPSTR p = data; - /* do NOT use strchr() to calculate the string length, - as '\0' is valid string content, too ! - Maybe we should check for non-'$' strings, but DOS doesn't. */ - while (*p != '$') p++; - _hwrite16( 1, data, (int)p - (int)data); - SET_AL( context, '$' ); /* yes, '$' (0x24) gets returned in AL */ - } - break; - case 0x0a: /* BUFFERED INPUT */ { char *buffer = ((char *)CTX_SEG_OFF_TO_LIN(context, context->SegDs, @@ -807,10 +742,6 @@ break; } - case 0x5c: /* "FLOCK" - RECORD LOCKING */ - fLock(context); - break; - case 0x0e: /* SELECT DEFAULT DRIVE */ TRACE("SELECT DEFAULT DRIVE %d\n", DL_reg(context)); DRIVE_SetCurrentDrive( DL_reg(context) ); @@ -831,26 +762,6 @@ SET_AL( context, INT21_FindNextFCB(context) ? 0x00 : 0xff ); break; - case 0x13: /* DELETE FILE USING FCB */ - DeleteFileFCB(context); - break; - - case 0x17: /* RENAME FILE USING FCB */ - RenameFileFCB(context); - break; - - case 0x19: /* GET CURRENT DEFAULT DRIVE */ - SET_AL( context, DRIVE_GetCurrentDrive() ); - break; - - case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */ - { - TDB *pTask = TASK_GetCurrent(); - pTask->dta = MAKESEGPTR(context->SegDs,DX_reg(context)); - TRACE("Set DTA: %08lx\n", pTask->dta); - } - break; - case 0x25: /* SET INTERRUPT VECTOR */ INT_SetPMHandler( AL_reg(context), (FARPROC16)MAKESEGPTR( context->SegDs, DX_reg(context))); break; @@ -859,28 +770,6 @@ INT21_ParseFileNameIntoFCB(context); break; - case 0x2f: /* GET DISK TRANSFER AREA ADDRESS */ - TRACE("GET DISK TRANSFER AREA ADDRESS\n"); - { - TDB *pTask = TASK_GetCurrent(); - context->SegEs = SELECTOROF( pTask->dta ); - SET_BX( context, OFFSETOF( pTask->dta ) ); - } - break; - - case 0x30: /* GET DOS VERSION */ - TRACE("GET DOS VERSION %s requested\n", - (AL_reg(context) == 0x00)?"OEM number":"version flag"); - SET_AX( context, (HIWORD(GetVersion16()) >> 8) | (HIWORD(GetVersion16()) << 8) ); -#if 0 - SET_AH( context, 0x7 ); - SET_AL( context, 0xA ); -#endif - - SET_BX( context, 0x00FF ); /* 0x123456 is Wine's serial # */ - SET_CX( context, 0x0000 ); - break; - case 0x35: /* GET INTERRUPT VECTOR */ TRACE("GET INTERRUPT VECTOR 0x%02x\n",AL_reg(context)); { @@ -912,13 +801,6 @@ break; } - case 0x38: /* GET COUNTRY-SPECIFIC INFORMATION */ - TRACE("GET COUNTRY-SPECIFIC INFORMATION for country 0x%02x\n", - AL_reg(context)); - SET_AX( context, 0x02 ); /* no country support available */ - SET_CFLAG(context); - break; - case 0x39: /* "MKDIR" - CREATE SUBDIRECTORY */ TRACE("MKDIR %s\n", (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); @@ -1003,13 +885,6 @@ } break; - case 0x41: /* "UNLINK" - DELETE FILE */ - TRACE("UNLINK %s\n", - (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); - bSetDOSExtendedError = (!DeleteFileA( CTX_SEG_OFF_TO_LIN(context, context->SegDs, - context->Edx ))); - break; - case 0x42: /* "LSEEK" - SET CURRENT FILE POSITION */ TRACE("LSEEK handle %d offset %ld from %s\n", BX_reg(context), MAKELONG(DX_reg(context),CX_reg(context)), @@ -1534,15 +1409,6 @@ } break; - case 0x70: /* MS-DOS 7 (Windows95) - ??? (country-specific?)*/ - case 0x72: /* MS-DOS 7 (Windows95) - ??? */ - TRACE("windows95 function AX %04x\n", - AX_reg(context)); - WARN(" returning unimplemented\n"); - SET_CFLAG(context); - SET_AL( context, 0 ); - break; - default: INT_BARF( context, 0x21 ); break; --- dlls/winedos/int21.c.a6 2002-11-09 11:33:53.000000000 +0200 +++ dlls/winedos/int21.c 2002-11-09 11:44:51.000000000 +0200 @@ -570,6 +570,23 @@ SET_AL( context, ascii ); break; + case 0x09: /* WRITE STRING TO STANDARD OUTPUT */ + TRACE("WRITE '$'-terminated string from %04lX:%04X to stdout\n", + context->SegDs, DX_reg(context) ); + { + LPSTR data = CTX_SEG_OFF_TO_LIN(context, context->SegDs, + context->Edx); + /* do NOT use strchr() to calculate the string length, + as '\0' is valid string content, too ! + Maybe we should check for non-'$' strings, but DOS doesn't. */ + while(*data != '$') { + DOSVM_PutChar(*data); + data++; + } + SET_AL(context, '$'); /* yes, '$' (0x24) gets returned in AL */ + } + break; + case 0x0b: /* GET STDIN STATUS */ { BIOSDATA *data = BIOS_DATA; @@ -602,10 +619,30 @@ RESET_CFLAG(context); /* dos 6+ only */ break; + case 0x13: /* DELETE FILE USING FCB */ + FIXME("Delete file using FCB: stub\n"); + break; + + case 0x17: /* RENAME FILE USING FCB */ + FIXME("Rename file using FCB: stub\n");; + break; + case 0x18: /* NULL FUNCTION FOR CP/M COMPATIBILITY */ SET_AL( context, 0 ); break; + case 0x19: /* GET CURRENT DEFAULT DRIVE */ + SET_AL(context, GetDosDrive(0)); + break; + + case 0x1a: /* SET DISK TRANSFER AREA ADDRESS */ + { + TDB *pTask = GlobalLock16(GetCurrentTask()); + pTask->dta = MAKESEGPTR(context->SegDs, DX_reg(context)); + TRACE("Set DTA: %08lx\n", pTask->dta); + } + break; + case 0x1b: /* GET ALLOCATION INFORMATION FOR DEFAULT DRIVE */ SET_DL( context, 0 ); if (!INT21_GetDriveAllocInfo(context)) SET_AX( context, 0xffff ); @@ -674,6 +711,26 @@ /* we cannot change the behaviour anyway, so just ignore it */ break; + case 0x2f: /* GET DISK TRANSFER AREA ADDRESS */ + TRACE("GET DISK TRANSFER AREA ADDRESS\n"); + context->SegEs = SELECTOROF(GetCurrentDTA(context)); + SET_BX(context, OFFSETOF(GetCurrentDTA(context))); + break; + + case 0x30: /* GET DOS VERSION */ + TRACE("GET DOS VERSION %s requested\n", + (AL_reg(context) == 0x00)?"OEM number":"version flag"); + SET_AX(context, (HIWORD(GetVersion16()) >> 8) | + (HIWORD(GetVersion16()) << 8)); +#if 0 + SET_AH( context, 0x7 ); + SET_AL( context, 0xA ); +#endif + + SET_BX(context, 0x00FF); /* 0x123456 is Wine's serial # */ + SET_CX(context, 0x0000); + break; + case 0x31: /* TERMINATE AND STAY RESIDENT */ FIXME("TERMINATE AND STAY RESIDENT stub\n"); break; @@ -775,6 +832,14 @@ DOS3Call( context ); break; + case 0x41: /* "UNLINK" - DELETE FILE */ + TRACE("UNLINK %s\n", + (LPCSTR)CTX_SEG_OFF_TO_LIN(context, context->SegDs, context->Edx)); + bSetDOSExtendedError = (!DeleteFileA(CTX_SEG_OFF_TO_LIN(context, + context->SegDs, + context->Edx))); + break; + case 0x43: /* FILE ATTRIBUTES */ switch (AL_reg(context)) { @@ -968,6 +1033,35 @@ INT21_GetExtendedError(context); break; + case 0x5c: /* "FLOCK" - RECORD LOCKING */ + switch (AL_reg(context)) { + case 0x00: /* LOCK */ + TRACE("lock handle %d offset %ld length %ld\n", BX_reg(context), + MAKELONG(DX_reg(context), CX_reg(context)), + MAKELONG(DI_reg(context), SI_reg(context))); + + bSetDOSExtendedError = + LockFile(DosFileHandleToWin32Handle( BX_reg(context)), + MAKELONG(DX_reg(context), CX_reg(context)), 0, + MAKELONG(DI_reg(context), SI_reg(context)), 0); + break; + + case 0x01: /* UNLOCK */ + TRACE("unlock handle %d offset %ld length %ld\n", BX_reg(context), + MAKELONG(DX_reg(context), CX_reg(context)), + MAKELONG(DI_reg(context), SI_reg(context))); + + bSetDOSExtendedError = + UnlockFile(DosFileHandleToWin32Handle(BX_reg(context)), + MAKELONG(DX_reg(context),CX_reg(context)), 0, + MAKELONG(DI_reg(context),SI_reg(context)), 0); + + default: + SET_AX(context, 0x0001); + SET_CFLAG(context); + return; + } + case 0x5d: /* NETWORK */ FIXME("Function 0x%04x not implemented.\n", AX_reg (context)); /* Fix the following while you're at it. */