Alexandre Julliard | 9ea19e5 | 1997-01-01 17:29:55 +0000 | [diff] [blame] | 1 | /* |
| 2 | * DOS interrupt 26h handler |
| 3 | */ |
| 4 | |
Alexandre Julliard | 5819953 | 1994-04-21 01:20:00 +0000 | [diff] [blame] | 5 | #include <stdlib.h> |
Alexandre Julliard | 60ce85c | 1998-02-01 18:33:27 +0000 | [diff] [blame] | 6 | #include <fcntl.h> |
| 7 | #include <unistd.h> |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 8 | #include "msdos.h" |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 9 | #include "ldt.h" |
Alexandre Julliard | 234bc24 | 1994-12-10 13:02:28 +0000 | [diff] [blame] | 10 | #include "miscemu.h" |
Alexandre Julliard | 4f8c37b | 1996-01-14 18:12:01 +0000 | [diff] [blame] | 11 | #include "drive.h" |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 12 | #include "debugtools.h" |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 13 | |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 14 | DEFAULT_DEBUG_CHANNEL(int) |
| 15 | |
Alexandre Julliard | e2991ea | 1995-07-29 13:09:43 +0000 | [diff] [blame] | 16 | /********************************************************************** |
| 17 | * INT_Int26Handler |
| 18 | * |
| 19 | * Handler for int 26h (absolute disk read). |
| 20 | */ |
Alexandre Julliard | 617955d | 1999-06-26 18:40:24 +0000 | [diff] [blame] | 21 | void WINAPI INT_Int26Handler( CONTEXT86 *context ) |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 22 | { |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 23 | BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx ); |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 24 | DWORD begin, length; |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 25 | |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 26 | if (!DRIVE_IsValid(LOBYTE(context->Eax))) |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 27 | { |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 28 | SET_CFLAG(context); |
Andreas Mohr | aa4aca2 | 1999-03-27 16:13:18 +0000 | [diff] [blame] | 29 | AX_reg(context) = 0x0201; /* unknown unit */ |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 30 | return; |
| 31 | } |
Alexandre Julliard | 594997c | 1995-04-30 10:05:20 +0000 | [diff] [blame] | 32 | |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 33 | if (LOWORD(context->Ecx) == 0xffff) |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 34 | { |
Alexandre Julliard | 4f8c37b | 1996-01-14 18:12:01 +0000 | [diff] [blame] | 35 | begin = *(DWORD *)dataptr; |
| 36 | length = *(WORD *)(dataptr + 4); |
Ulrich Weigand | 7129d9f | 1998-11-25 10:29:22 +0000 | [diff] [blame] | 37 | dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context, |
| 38 | *(WORD *)(dataptr + 8), *(DWORD *)(dataptr + 6) ); |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 39 | } |
| 40 | else |
| 41 | { |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 42 | begin = LOWORD(context->Edx); |
| 43 | length = LOWORD(context->Ecx); |
Alexandre Julliard | 808cb04 | 1995-08-17 17:11:36 +0000 | [diff] [blame] | 44 | } |
Alexandre Julliard | 5819953 | 1994-04-21 01:20:00 +0000 | [diff] [blame] | 45 | |
Alexandre Julliard | 61fece0 | 1999-06-26 19:09:08 +0000 | [diff] [blame] | 46 | TRACE("int26: abs diskwrite, drive %d, sector %ld, " |
Andreas Mohr | cc0248e | 1999-01-03 12:31:51 +0000 | [diff] [blame] | 47 | "count %ld, buffer %p\n", |
| 48 | AL_reg(context), begin, length, dataptr ); |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 49 | |
Alexandre Julliard | d8fab2e | 2000-09-25 23:53:07 +0000 | [diff] [blame] | 50 | DRIVE_RawWrite(LOBYTE(context->Eax), begin, length, dataptr, TRUE); |
Alexandre Julliard | ca22b33 | 1996-07-12 19:02:39 +0000 | [diff] [blame] | 51 | RESET_CFLAG(context); |
Alexandre Julliard | 8d24ae6 | 1994-04-05 21:42:43 +0000 | [diff] [blame] | 52 | } |