#include #include #include #include "registers.h" #include "msdos.h" #include "ldt.h" #include "wine.h" #include "miscemu.h" #include "dos_fs.h" #include "stddebug.h" /* #define DEBUG_INT */ #include "debug.h" int do_int25(struct sigcontext_struct *context) { BYTE *dataptr = PTR_SEG_OFF_TO_LIN(DS, BX); DWORD begin, length; if(!DOS_ValidDrive(AL)) { SetCflag; AX = 0x0101; /* unknown unit */ /* push flags on stack */ SP -= sizeof(WORD); setword(PTR_SEG_OFF_TO_LIN(SS,SP), (WORD) EFL); return 1; } if (CX == 0xffff) { begin = getdword(dataptr); length = getword(&dataptr[4]); dataptr = (BYTE *) PTR_SEG_TO_LIN(getdword(&dataptr[6])); } else { begin = DX; length = CX; } dprintf_int(stdnimp, "int25: abs diskread, drive %d, sector %ld, " "count %ld, buffer %d\n", AL, begin, length, (int) dataptr); memset(dataptr, 0, length * 512); if (begin == 0 && length > 1) *(dataptr + 512) = 0xf8; if (begin == 1) *dataptr = 0xf8; ResetCflag; /* push flags on stack */ SP -= sizeof(WORD); setword(PTR_SEG_OFF_TO_LIN(SS,SP), (WORD) EFL); return 1; }