Interrupts / Move int25 and int26 to winedos

Jukka Heinonen jhei at iki.fi
Tue Nov 26 14:08:49 CST 2002


This patch moves int25 and int26 to winedos and creates functions
DOSVM_RawRead and DOSVM_RawWrite. The plan is to make int21 use these
functions instead of DRIVE_RawRead and DRIVE_RawWrite. These two
DRIVE_ functions are used only by int25, int26 and int21 handlers.



Changelog:
  Moved handlers for int25 and int26 to winedos.


Files msdos/int25.c and msdos/int26.c can be removed after this patch.



Index: dlls/winedos/interrupts.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/interrupts.c,v
retrieving revision 1.10
diff -u -r1.10 interrupts.c
--- dlls/winedos/interrupts.c	24 Nov 2002 22:34:04 -0000	1.10
+++ dlls/winedos/interrupts.c	26 Nov 2002 19:40:04 -0000
@@ -24,17 +24,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(int);
 
-/***********************************************************************
- *		DOSVM_Int25Handler (WINEDOS16.137)
- *		DOSVM_Int26Handler (WINEDOS16.138)
- *
- * FIXME: Interrupt handlers for interrupts implemented in other DLLs.
- *        These functions should be removed when the interrupt handlers have
- *        been moved to winedos.
- */
-void WINAPI DOSVM_Int25Handler( CONTEXT86 *context ) { INT_Int25Handler(context); }
-void WINAPI DOSVM_Int26Handler( CONTEXT86 *context ) { INT_Int26Handler(context); }
-
 static FARPROC16     DOSVM_Vectors16[256];
 static FARPROC48     DOSVM_Vectors48[256];
 static const INTPROC DOSVM_VectorsBuiltin[] =




Index: dlls/winedos/dosexe.h
===================================================================
RCS file: /home/wine/wine/dlls/winedos/dosexe.h,v
retrieving revision 1.17
diff -u -r1.17 dosexe.h
--- dlls/winedos/dosexe.h	24 Nov 2002 22:34:04 -0000	1.17
+++ dlls/winedos/dosexe.h	26 Nov 2002 19:40:26 -0000
@@ -148,6 +148,14 @@
 /* int21.c */
 extern void WINAPI DOSVM_Int21Handler(CONTEXT86*);
 
+/* int25.c */
+BOOL DOSVM_RawRead( BYTE, DWORD, DWORD, BYTE *, BOOL );
+void WINAPI DOSVM_Int25Handler( CONTEXT86 * );
+
+/* int26.c */
+BOOL DOSVM_RawWrite( BYTE, DWORD, DWORD, BYTE *, BOOL );
+void WINAPI DOSVM_Int26Handler( CONTEXT86 * );
+
 /* int29.c */
 extern void WINAPI DOSVM_Int29Handler(CONTEXT86*);
 




Index: dlls/winedos/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/winedos/Makefile.in,v
retrieving revision 1.19
diff -u -r1.19 Makefile.in
--- dlls/winedos/Makefile.in	24 Nov 2002 22:34:04 -0000	1.19
+++ dlls/winedos/Makefile.in	26 Nov 2002 19:40:38 -0000
@@ -28,6 +28,8 @@
 	int1a.c \
 	int20.c \
 	int21.c \
+	int25.c \
+	int26.c \
 	int29.c \
 	int2a.c \
 	int2f.c \




Index: include/miscemu.h
===================================================================
RCS file: /home/wine/wine/include/miscemu.h,v
retrieving revision 1.60
diff -u -r1.60 miscemu.h
--- include/miscemu.h	24 Nov 2002 22:34:04 -0000	1.60
+++ include/miscemu.h	26 Nov 2002 19:40:48 -0000
@@ -175,6 +175,7 @@
     WORD int48_sel;
 };
 
+/* msdos/dosmem.c */
 extern struct DPMI_segments DOSMEM_dpmi_segments;
 extern const struct DPMI_segments *DOSMEM_GetDPMISegments(void);
 
@@ -196,17 +197,10 @@
 extern DWORD IO_inport( int port, int count );
 extern void IO_outport( int port, int count, DWORD value );
 
-/* msdos/int25.c */
-extern void WINAPI INT_Int25Handler(CONTEXT86*);
-
-/* msdos/int26.c */
-extern void WINAPI INT_Int26Handler(CONTEXT86*);
-
 /* msdos/dpmi.c */
 extern BOOL DPMI_LoadDosSystem(void);
 
 /* misc/ppdev.c */
-
 extern BOOL IO_pp_outp(int port, DWORD* res);
 extern int IO_pp_inp(int port, DWORD* res);
 extern char IO_pp_init(void);




Index: dlls/ntdll/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/Makefile.in,v
retrieving revision 1.47
diff -u -r1.47 Makefile.in
--- dlls/ntdll/Makefile.in	24 Nov 2002 22:34:04 -0000	1.47
+++ dlls/ntdll/Makefile.in	26 Nov 2002 19:40:56 -0000
@@ -51,8 +51,6 @@
 	$(TOPOBJDIR)/msdos/dosmem.c \
 	$(TOPOBJDIR)/msdos/dpmi.c \
 	$(TOPOBJDIR)/msdos/int21.c \
-	$(TOPOBJDIR)/msdos/int25.c \
-	$(TOPOBJDIR)/msdos/int26.c \
 	$(TOPOBJDIR)/msdos/ioports.c \
 	$(TOPOBJDIR)/msdos/ppdev.c \
 	$(TOPOBJDIR)/msdos/vxd.c \




Index: dlls/kernel/kernel32.spec
===================================================================
RCS file: /home/wine/wine/dlls/kernel/kernel32.spec,v
retrieving revision 1.77
diff -u -r1.77 kernel32.spec
--- dlls/kernel/kernel32.spec	25 Nov 2002 20:51:31 -0000	1.77
+++ dlls/kernel/kernel32.spec	26 Nov 2002 19:41:06 -0000
@@ -1053,8 +1053,7 @@
 @ cdecl DOSMEM_GetBlock(long ptr) DOSMEM_GetBlock
 @ cdecl DOSMEM_GetDPMISegments() DOSMEM_GetDPMISegments
 @ cdecl DOSMEM_Init(long) DOSMEM_Init
-@ stdcall INT_Int25Handler(ptr) INT_Int25Handler
-@ stdcall INT_Int26Handler(ptr) INT_Int26Handler  
+@ cdecl DRIVE_OpenDevice(long long) DRIVE_OpenDevice
 @ cdecl LOCAL_Alloc(long long long) LOCAL_Alloc
 @ cdecl LOCAL_Compact(long long long) LOCAL_Compact
 @ cdecl LOCAL_CountFree(long) LOCAL_CountFree




--- /dev/null	Thu Jan  1 02:00:00 1970
+++ dlls/winedos/int25.c	Tue Nov 26 21:34:39 2002
@@ -0,0 +1,112 @@
+/*
+ * DOS interrupt 25h handler
+ *
+ * Copyright 1997 Andreas Mohr
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "msdos.h"
+#include "miscemu.h"
+#include "drive.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(int);
+
+
+/***********************************************************************
+ *           DOSVM_RawRead
+ *
+ * Read raw sectors from a device.
+ */
+BOOL DOSVM_RawRead(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success)
+{    
+    int fd;
+
+    if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1)
+    {
+        lseek( fd, begin * 512, SEEK_SET );
+        /* FIXME: check errors */
+        read( fd, dataptr, nr_sect * 512 );
+        close( fd );
+    }
+    else
+    {
+        memset( dataptr, 0, nr_sect * 512 );
+        if (fake_success)
+        {
+            /* FIXME: explain what happens here */
+            if (begin == 0 && nr_sect > 1) *(dataptr + 512) = 0xf8;
+            if (begin == 1) *dataptr = 0xf8;
+        }
+        else
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	    DOSVM_Int25Handler (WINEDOS16.137)
+ *
+ * Handler for int 25h (absolute disk read).
+ */
+void WINAPI DOSVM_Int25Handler( CONTEXT86 *context )
+{
+    WCHAR drivespec[4] = {'A', ':', '\\', 0};
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
+    DWORD begin;
+    DWORD length;
+
+    drivespec[0] += AL_reg( context );
+
+    if (GetDriveTypeW( drivespec ) == DRIVE_NO_ROOT_DIR || 
+        GetDriveTypeW( drivespec ) == DRIVE_UNKNOWN)
+    {
+        SET_CFLAG( context );
+        SET_AX( context, 0x0201 ); /* unknown unit */
+        return;
+    }
+
+    if (CX_reg( context ) == 0xffff)
+    {
+        begin   = *(DWORD *)dataptr;
+        length  = *(WORD *)(dataptr + 4);
+        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
+                                              *(WORD *)(dataptr + 8), 
+                                              *(DWORD *)(dataptr + 6) );
+    }
+    else
+    {
+        begin  = DX_reg( context );
+        length = CX_reg( context );
+    }
+
+    TRACE( "abs diskread, drive %d, sector %ld, "
+           "count %ld, buffer %p\n",
+           AL_reg( context ), begin, length, dataptr );
+
+    DOSVM_RawRead( AL_reg( context ), begin, length, dataptr, TRUE );
+    RESET_CFLAG( context );
+}




--- /dev/null	Thu Jan  1 02:00:00 1970
+++ dlls/winedos/int26.c	Tue Nov 26 21:33:10 2002
@@ -0,0 +1,101 @@
+/*
+ * DOS interrupt 26h handler
+ *
+ * Copyright 1997 Andreas Mohr
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <fcntl.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "msdos.h"
+#include "miscemu.h"
+#include "drive.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(int);
+
+
+/***********************************************************************
+ *           DOSVM_RawWrite
+ *
+ * Write raw sectors to a device.
+ */
+BOOL DOSVM_RawWrite(BYTE drive, DWORD begin, DWORD nr_sect, BYTE *dataptr, BOOL fake_success)
+{
+    int fd;
+
+    if ((fd = DRIVE_OpenDevice( drive, O_RDONLY )) != -1)
+    {
+        lseek( fd, begin * 512, SEEK_SET );
+        /* FIXME: check errors */
+        write( fd, dataptr, nr_sect * 512 );
+        close( fd );
+    }
+    else if (!fake_success)
+        return FALSE;
+
+    return TRUE;
+}
+
+
+/**********************************************************************
+ *	    DOSVM_Int26Handler (WINEDOS16.138)
+ *
+ * Handler for int 26h (absolute disk read).
+ */
+void WINAPI DOSVM_Int26Handler( CONTEXT86 *context )
+{
+    WCHAR drivespec[4] = {'A', ':', '\\', 0};
+    BYTE *dataptr = CTX_SEG_OFF_TO_LIN( context, context->SegDs, context->Ebx );
+    DWORD begin;
+    DWORD length;
+
+    drivespec[0] += AL_reg( context );
+
+    if (GetDriveTypeW( drivespec ) == DRIVE_NO_ROOT_DIR || 
+        GetDriveTypeW( drivespec ) == DRIVE_UNKNOWN)
+    {
+        SET_CFLAG( context );
+        SET_AX( context, 0x0201 ); /* unknown unit */
+        return;
+    }
+
+    if (CX_reg( context ) == 0xffff)
+    {
+        begin   = *(DWORD *)dataptr;
+        length  = *(WORD *)(dataptr + 4);
+        dataptr = (BYTE *)CTX_SEG_OFF_TO_LIN( context,
+                                              *(WORD *)(dataptr + 8), 
+                                              *(DWORD *)(dataptr + 6) );
+    }
+    else
+    {
+        begin  = DX_reg( context );
+        length = CX_reg( context );
+    }
+
+    TRACE( "abs diskwrite, drive %d, sector %ld, "
+           "count %ld, buffer %p\n",
+           AL_reg( context ), begin, length, dataptr );
+
+    DOSVM_RawWrite( AL_reg( context ), begin, length, dataptr, TRUE );
+    RESET_CFLAG( context );
+}




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list